FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

fix(gateway): preserve structured AI Gateway failure details in neste… · vercel/ai@ea75787 · GitHub

/ ai Public

Commit ea75787

Browse files
authored
fix(gateway): preserve structured AI Gateway failure details in nested API call errors (#18760)
## Summary - serialize structured AI Gateway failed-response payloads before constructing nested API call errors - cover all Gateway request paths on main, including realtime client-secret and async video handlers - add a regression assertion that the nested APICallError preserves Gateway failure details ## Testing - pnpm --filter @ai-sdk/gateway test - pnpm --filter @ai-sdk/gateway type-check - pnpm check - pnpm type-check:full ## Related Issues Related to #15872. Forward-port of #18737.
1 parent a7f0d72 commit ea75787

13 files changed

Lines changed: 39 additions & 19 deletions

‎.changeset/fuzzy-dragons-smile.md‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@ai-sdk/gateway': patch
3+
---
4+
5+
Serialize structured Gateway error responses in nested API call error messages.

‎packages/gateway/src/gateway-embedding-model.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
combineHeaders,
77
createJsonErrorResponseHandler,
88
createJsonResponseHandler,
9+
getErrorMessage,
910
lazySchema,
1011
postJsonToApi,
1112
resolve,
@@ -86,7 +87,7 @@ export class GatewayEmbeddingModel implements EmbeddingModelV4 {
8687
),
8788
failedResponseHandler: createJsonErrorResponseHandler({
8889
errorSchema: z.any(),
89-
errorToMessage: data => data,
90+
errorToMessage: data => getErrorMessage(data) ?? 'unknown error',
9091
}),
9192
...(abortSignal && { abortSignal }),
9293
fetch: this.config.fetch,

‎packages/gateway/src/gateway-fetch-metadata.ts‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {
22
createJsonErrorResponseHandler,
33
createJsonResponseHandler,
4+
getErrorMessage,
45
getFromApi,
56
lazySchema,
67
resolve,
@@ -43,7 +44,7 @@ export class GatewayFetchMetadata {
4344
),
4445
failedResponseHandler: createJsonErrorResponseHandler({
4546
errorSchema: z.any(),
46-
errorToMessage: data => data,
47+
errorToMessage: data => getErrorMessage(data) ?? 'unknown error',
4748
}),
4849
fetch: this.config.fetch,
4950
});
@@ -69,7 +70,7 @@ export class GatewayFetchMetadata {
6970
),
7071
failedResponseHandler: createJsonErrorResponseHandler({
7172
errorSchema: z.any(),
72-
errorToMessage: data => data,
73+
errorToMessage: data => getErrorMessage(data) ?? 'unknown error',
7374
}),
7475
fetch: this.config.fetch,
7576
});

‎packages/gateway/src/gateway-generation-info.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {
22
createJsonErrorResponseHandler,
33
createJsonResponseHandler,
4+
getErrorMessage,
45
getFromApi,
56
lazySchema,
67
resolve,
@@ -74,7 +75,7 @@ export class GatewayGenerationInfoFetcher {
7475
),
7576
failedResponseHandler: createJsonErrorResponseHandler({
7677
errorSchema: z.any(),
77-
errorToMessage: data => data,
78+
errorToMessage: data => getErrorMessage(data) ?? 'unknown error',
7879
}),
7980
fetch: this.config.fetch,
8081
});

‎packages/gateway/src/gateway-image-model.ts‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ import type {
66
import {
77
combineHeaders,
88
convertUint8ArrayToBase64,
9-
createJsonResponseHandler,
109
createJsonErrorResponseHandler,
10+
createJsonResponseHandler,
11+
getErrorMessage,
1112
postJsonToApi,
1213
resolve,
1314
serializeModelOptions,
@@ -96,7 +97,7 @@ export class GatewayImageModel implements ImageModelV4 {
9697
),
9798
failedResponseHandler: createJsonErrorResponseHandler({
9899
errorSchema: z.any(),
99-
errorToMessage: data => data,
100+
errorToMessage: data => getErrorMessage(data) ?? 'unknown error',
100101
}),
101102
...(abortSignal && { abortSignal }),
102103
fetch: this.config.fetch,

‎packages/gateway/src/gateway-language-model.test.ts‎

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import type {
2-
LanguageModelV4Prompt,
3-
LanguageModelV4FilePart,
1+
import {
2+
APICallError,
3+
type LanguageModelV4FilePart,
4+
type LanguageModelV4Prompt,
45
} from '@ai-sdk/provider';
56
import { createTestServer } from '@ai-sdk/test-server/with-vitest';
67
import { convertReadableStreamToArray } from '@ai-sdk/provider-utils/test';
@@ -524,6 +525,10 @@ describe('GatewayLanguageModel', () => {
524525
expect(serverError.message).toBe('Database connection failed');
525526
expect(serverError.statusCode).toBe(500);
526527
expect(serverError.type).toBe('internal_server_error');
528+
expect(APICallError.isInstance(serverError.cause)).toBe(true);
529+
expect((serverError.cause as APICallError).message).toContain(
530+
'Database connection failed',
531+
);
527532
}
528533
});
529534

‎packages/gateway/src/gateway-language-model.ts‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
createEventSourceResponseHandler,
1111
createJsonErrorResponseHandler,
1212
createJsonResponseHandler,
13+
getErrorMessage,
1314
postJsonToApi,
1415
resolve,
1516
serializeModelOptions,
@@ -92,7 +93,7 @@ export class GatewayLanguageModel implements LanguageModelV4 {
9293
successfulResponseHandler: createJsonResponseHandler(z.any()),
9394
failedResponseHandler: createJsonErrorResponseHandler({
9495
errorSchema: z.any(),
95-
errorToMessage: data => data,
96+
errorToMessage: data => getErrorMessage(data) ?? 'unknown error',
9697
}),
9798
...(abortSignal && { abortSignal }),
9899
fetch: this.config.fetch,
@@ -135,7 +136,7 @@ export class GatewayLanguageModel implements LanguageModelV4 {
135136
successfulResponseHandler: createEventSourceResponseHandler(z.any()),
136137
failedResponseHandler: createJsonErrorResponseHandler({
137138
errorSchema: z.any(),
138-
errorToMessage: data => data,
139+
errorToMessage: data => getErrorMessage(data) ?? 'unknown error',
139140
}),
140141
...(abortSignal && { abortSignal }),
141142
fetch: this.config.fetch,

‎packages/gateway/src/gateway-provider.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {
22
createJsonErrorResponseHandler,
33
createJsonResponseHandler,
4+
getErrorMessage,
45
loadOptionalSetting,
56
postJsonToApi,
67
withoutTrailingSlash,
@@ -372,7 +373,7 @@ export function createGateway(
372373
),
373374
failedResponseHandler: createJsonErrorResponseHandler({
374375
errorSchema: z.any(),
375-
errorToMessage: data => data,
376+
errorToMessage: data => getErrorMessage(data) ?? 'unknown error',
376377
}),
377378
fetch: options.fetch,
378379
});

‎packages/gateway/src/gateway-reranking-model.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
combineHeaders,
77
createJsonErrorResponseHandler,
88
createJsonResponseHandler,
9+
getErrorMessage,
910
lazySchema,
1011
postJsonToApi,
1112
resolve,
@@ -69,7 +70,7 @@ export class GatewayRerankingModel implements RerankingModelV4 {
6970
),
7071
failedResponseHandler: createJsonErrorResponseHandler({
7172
errorSchema: z.any(),
72-
errorToMessage: data => data,
73+
errorToMessage: data => getErrorMessage(data) ?? 'unknown error',
7374
}),
7475
...(abortSignal && { abortSignal }),
7576
fetch: this.config.fetch,

‎packages/gateway/src/gateway-speech-model.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
combineHeaders,
88
createJsonErrorResponseHandler,
99
createJsonResponseHandler,
10+
getErrorMessage,
1011
postJsonToApi,
1112
resolve,
1213
type Resolvable,
@@ -74,7 +75,7 @@ export class GatewaySpeechModel implements SpeechModelV4 {
7475
),
7576
failedResponseHandler: createJsonErrorResponseHandler({
7677
errorSchema: z.any(),
77-
errorToMessage: data => data,
78+
errorToMessage: data => getErrorMessage(data) ?? 'unknown error',
7879
}),
7980
...(abortSignal && { abortSignal }),
8081
fetch: this.config.fetch,

0 commit comments

Comments
 (0)

Back | FazBrowse Home | New Git URL