@ai-sdk/gateway
Advanced tools
+6
-0
| # @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 |
+85
-16
@@ -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
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
494508
3.17%6170
3.56%