You're Invited:Meet the Socket Team at RSAC and BSidesSF 2026, March 23–26.RSVP
Socket
Book a DemoSign in
Socket

@ai-sdk/gateway

Package Overview
Dependencies
Maintainers
3
Versions
302
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@ai-sdk/gateway - npm Package Compare versions

Comparing version
3.0.52
to
3.0.53
+6
-0
CHANGELOG.md
# @ai-sdk/gateway
## 3.0.53
### Patch Changes
- 73b7e09: feat (provider/gateway): add SSE support for video generation with heartbeat keep-alive
## 3.0.52

@@ -4,0 +10,0 @@

+84
-15

@@ -944,2 +944,3 @@ "use strict";

// src/gateway-video-model.ts
var import_provider2 = require("@ai-sdk/provider");
var import_provider_utils8 = require("@ai-sdk/provider-utils");

@@ -974,7 +975,3 @@ var import_v48 = require("zod/v4");

try {
const {
responseHeaders,
value: responseBody,
rawValue
} = await (0, import_provider_utils8.postJsonToApi)({
const { responseHeaders, value: responseBody } = await (0, import_provider_utils8.postJsonToApi)({
url: this.getUrl(),

@@ -985,3 +982,4 @@ headers: (0, import_provider_utils8.combineHeaders)(

this.getModelConfigHeaders(),
await (0, import_provider_utils8.resolve)(this.config.o11yHeaders)
await (0, import_provider_utils8.resolve)(this.config.o11yHeaders),
{ accept: "text/event-stream" }
),

@@ -999,5 +997,66 @@ body: {

},
successfulResponseHandler: (0, import_provider_utils8.createJsonResponseHandler)(
gatewayVideoResponseSchema
),
successfulResponseHandler: async ({
response,
url,
requestBodyValues
}) => {
if (response.body == null) {
throw new import_provider2.APICallError({
message: "SSE response body is empty",
url,
requestBodyValues,
statusCode: response.status
});
}
const eventStream = (0, import_provider_utils8.parseJsonEventStream)({
stream: response.body,
schema: gatewayVideoEventSchema
});
const reader = eventStream.getReader();
const { done, value: parseResult } = await reader.read();
reader.releaseLock();
if (done || !parseResult) {
throw new import_provider2.APICallError({
message: "SSE stream ended without a data event",
url,
requestBodyValues,
statusCode: response.status
});
}
if (!parseResult.success) {
throw new import_provider2.APICallError({
message: "Failed to parse video SSE event",
cause: parseResult.error,
url,
requestBodyValues,
statusCode: response.status
});
}
const event = parseResult.value;
if (event.type === "error") {
throw new import_provider2.APICallError({
message: event.message,
statusCode: event.statusCode,
url,
requestBodyValues,
responseHeaders: Object.fromEntries([...response.headers]),
responseBody: JSON.stringify(event),
data: {
error: {
message: event.message,
type: event.errorType,
param: event.param
}
}
});
}
return {
value: {
videos: event.videos,
warnings: event.warnings,
providerMetadata: event.providerMetadata
},
responseHeaders: Object.fromEntries([...response.headers])
};
},
failedResponseHandler: (0, import_provider_utils8.createJsonErrorResponseHandler)({

@@ -1074,7 +1133,17 @@ errorSchema: import_v48.z.any(),

]);
var gatewayVideoResponseSchema = import_v48.z.object({
videos: import_v48.z.array(gatewayVideoDataSchema),
warnings: import_v48.z.array(gatewayVideoWarningSchema).optional(),
providerMetadata: import_v48.z.record(import_v48.z.string(), providerMetadataEntrySchema2).optional()
});
var gatewayVideoEventSchema = import_v48.z.discriminatedUnion("type", [
import_v48.z.object({
type: import_v48.z.literal("result"),
videos: import_v48.z.array(gatewayVideoDataSchema),
warnings: import_v48.z.array(gatewayVideoWarningSchema).optional(),
providerMetadata: import_v48.z.record(import_v48.z.string(), providerMetadataEntrySchema2).optional()
}),
import_v48.z.object({
type: import_v48.z.literal("error"),
message: import_v48.z.string(),
errorType: import_v48.z.string(),
statusCode: import_v48.z.number(),
param: import_v48.z.unknown().nullable()
})
]);

@@ -1275,3 +1344,3 @@ // src/tool/parallel-search.ts

// src/version.ts
var VERSION = true ? "3.0.52" : "0.0.0-test";
var VERSION = true ? "3.0.53" : "0.0.0-test";

@@ -1278,0 +1347,0 @@ // src/gateway-provider.ts

@@ -949,7 +949,8 @@ // src/gateway-provider.ts

// src/gateway-video-model.ts
import { APICallError as APICallError2 } from "@ai-sdk/provider";
import {
combineHeaders as combineHeaders4,
convertUint8ArrayToBase64 as convertUint8ArrayToBase642,
createJsonResponseHandler as createJsonResponseHandler5,
createJsonErrorResponseHandler as createJsonErrorResponseHandler5,
parseJsonEventStream,
postJsonToApi as postJsonToApi4,

@@ -986,7 +987,3 @@ resolve as resolve5

try {
const {
responseHeaders,
value: responseBody,
rawValue
} = await postJsonToApi4({
const { responseHeaders, value: responseBody } = await postJsonToApi4({
url: this.getUrl(),

@@ -997,3 +994,4 @@ headers: combineHeaders4(

this.getModelConfigHeaders(),
await resolve5(this.config.o11yHeaders)
await resolve5(this.config.o11yHeaders),
{ accept: "text/event-stream" }
),

@@ -1011,5 +1009,66 @@ body: {

},
successfulResponseHandler: createJsonResponseHandler5(
gatewayVideoResponseSchema
),
successfulResponseHandler: async ({
response,
url,
requestBodyValues
}) => {
if (response.body == null) {
throw new APICallError2({
message: "SSE response body is empty",
url,
requestBodyValues,
statusCode: response.status
});
}
const eventStream = parseJsonEventStream({
stream: response.body,
schema: gatewayVideoEventSchema
});
const reader = eventStream.getReader();
const { done, value: parseResult } = await reader.read();
reader.releaseLock();
if (done || !parseResult) {
throw new APICallError2({
message: "SSE stream ended without a data event",
url,
requestBodyValues,
statusCode: response.status
});
}
if (!parseResult.success) {
throw new APICallError2({
message: "Failed to parse video SSE event",
cause: parseResult.error,
url,
requestBodyValues,
statusCode: response.status
});
}
const event = parseResult.value;
if (event.type === "error") {
throw new APICallError2({
message: event.message,
statusCode: event.statusCode,
url,
requestBodyValues,
responseHeaders: Object.fromEntries([...response.headers]),
responseBody: JSON.stringify(event),
data: {
error: {
message: event.message,
type: event.errorType,
param: event.param
}
}
});
}
return {
value: {
videos: event.videos,
warnings: event.warnings,
providerMetadata: event.providerMetadata
},
responseHeaders: Object.fromEntries([...response.headers])
};
},
failedResponseHandler: createJsonErrorResponseHandler5({

@@ -1086,7 +1145,17 @@ errorSchema: z8.any(),

]);
var gatewayVideoResponseSchema = z8.object({
videos: z8.array(gatewayVideoDataSchema),
warnings: z8.array(gatewayVideoWarningSchema).optional(),
providerMetadata: z8.record(z8.string(), providerMetadataEntrySchema2).optional()
});
var gatewayVideoEventSchema = z8.discriminatedUnion("type", [
z8.object({
type: z8.literal("result"),
videos: z8.array(gatewayVideoDataSchema),
warnings: z8.array(gatewayVideoWarningSchema).optional(),
providerMetadata: z8.record(z8.string(), providerMetadataEntrySchema2).optional()
}),
z8.object({
type: z8.literal("error"),
message: z8.string(),
errorType: z8.string(),
statusCode: z8.number(),
param: z8.unknown().nullable()
})
]);

@@ -1295,3 +1364,3 @@ // src/tool/parallel-search.ts

// src/version.ts
var VERSION = true ? "3.0.52" : "0.0.0-test";
var VERSION = true ? "3.0.53" : "0.0.0-test";

@@ -1298,0 +1367,0 @@ // src/gateway-provider.ts

+1
-1
{
"name": "@ai-sdk/gateway",
"private": false,
"version": "3.0.52",
"version": "3.0.53",
"license": "Apache-2.0",

@@ -6,0 +6,0 @@ "sideEffects": false,

@@ -9,7 +9,8 @@ import type {

} from '@ai-sdk/provider';
import { APICallError } from '@ai-sdk/provider';
import {
combineHeaders,
convertUint8ArrayToBase64,
createJsonResponseHandler,
createJsonErrorResponseHandler,
parseJsonEventStream,
postJsonToApi,

@@ -65,7 +66,3 @@ resolve,

try {
const {
responseHeaders,
value: responseBody,
rawValue,
} = await postJsonToApi({
const { responseHeaders, value: responseBody } = await postJsonToApi({
url: this.getUrl(),

@@ -77,2 +74,3 @@ headers: combineHeaders(

await resolve(this.config.o11yHeaders),
{ accept: 'text/event-stream' },
),

@@ -90,5 +88,78 @@ body: {

},
successfulResponseHandler: createJsonResponseHandler(
gatewayVideoResponseSchema,
),
successfulResponseHandler: async ({
response,
url,
requestBodyValues,
}: {
url: string;
requestBodyValues: unknown;
response: Response;
}) => {
if (response.body == null) {
throw new APICallError({
message: 'SSE response body is empty',
url,
requestBodyValues,
statusCode: response.status,
});
}
const eventStream = parseJsonEventStream({
stream: response.body,
schema: gatewayVideoEventSchema,
});
const reader = eventStream.getReader();
const { done, value: parseResult } = await reader.read();
reader.releaseLock();
if (done || !parseResult) {
throw new APICallError({
message: 'SSE stream ended without a data event',
url,
requestBodyValues,
statusCode: response.status,
});
}
if (!parseResult.success) {
throw new APICallError({
message: 'Failed to parse video SSE event',
cause: parseResult.error,
url,
requestBodyValues,
statusCode: response.status,
});
}
const event = parseResult.value;
if (event.type === 'error') {
throw new APICallError({
message: event.message,
statusCode: event.statusCode,
url,
requestBodyValues,
responseHeaders: Object.fromEntries([...response.headers]),
responseBody: JSON.stringify(event),
data: {
error: {
message: event.message,
type: event.errorType,
param: event.param,
},
},
});
}
// event.type === 'result'
return {
value: {
videos: event.videos,
warnings: event.warnings,
providerMetadata: event.providerMetadata,
},
responseHeaders: Object.fromEntries([...response.headers]),
};
},
failedResponseHandler: createJsonErrorResponseHandler({

@@ -176,8 +247,18 @@ errorSchema: z.any(),

const gatewayVideoResponseSchema = z.object({
videos: z.array(gatewayVideoDataSchema),
warnings: z.array(gatewayVideoWarningSchema).optional(),
providerMetadata: z
.record(z.string(), providerMetadataEntrySchema)
.optional(),
});
const gatewayVideoEventSchema = z.discriminatedUnion('type', [
z.object({
type: z.literal('result'),
videos: z.array(gatewayVideoDataSchema),
warnings: z.array(gatewayVideoWarningSchema).optional(),
providerMetadata: z
.record(z.string(), providerMetadataEntrySchema)
.optional(),
}),
z.object({
type: z.literal('error'),
message: z.string(),
errorType: z.string(),
statusCode: z.number(),
param: z.unknown().nullable(),
}),
]);

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display