@ai-sdk/gateway 4.0.0-beta.5 → 4.0.0-beta.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +331 -4
- package/dist/index.d.ts +145 -22
- package/dist/index.js +720 -320
- package/dist/index.js.map +1 -1
- package/docs/00-ai-gateway.mdx +311 -44
- package/package.json +8 -10
- package/src/errors/create-gateway-error.ts +0 -1
- package/src/errors/gateway-authentication-error.ts +0 -1
- package/src/gateway-config.ts +1 -1
- package/src/gateway-embedding-model-settings.ts +1 -0
- package/src/gateway-embedding-model.ts +38 -14
- package/src/gateway-fetch-metadata.ts +7 -3
- package/src/gateway-generation-info.ts +149 -0
- package/src/gateway-image-model-settings.ts +9 -0
- package/src/gateway-image-model.ts +41 -21
- package/src/gateway-language-model-settings.ts +21 -10
- package/src/gateway-language-model.ts +49 -23
- package/src/gateway-model-entry.ts +2 -2
- package/src/gateway-provider-options.ts +35 -8
- package/src/gateway-provider.ts +99 -17
- package/src/gateway-reranking-model-settings.ts +7 -0
- package/src/gateway-reranking-model.ts +119 -0
- package/src/gateway-spend-report.ts +193 -0
- package/src/gateway-video-model.ts +22 -17
- package/src/index.ts +13 -3
- package/dist/index.d.mts +0 -602
- package/dist/index.mjs +0 -1539
- package/dist/index.mjs.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type {
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
EmbeddingModelV4,
|
|
3
|
+
SharedV4ProviderMetadata,
|
|
4
4
|
} from '@ai-sdk/provider';
|
|
5
5
|
import {
|
|
6
6
|
combineHeaders,
|
|
@@ -9,6 +9,9 @@ import {
|
|
|
9
9
|
lazySchema,
|
|
10
10
|
postJsonToApi,
|
|
11
11
|
resolve,
|
|
12
|
+
serializeModelOptions,
|
|
13
|
+
WORKFLOW_SERIALIZE,
|
|
14
|
+
WORKFLOW_DESERIALIZE,
|
|
12
15
|
zodSchema,
|
|
13
16
|
type Resolvable,
|
|
14
17
|
} from '@ai-sdk/provider-utils';
|
|
@@ -17,17 +20,33 @@ import { asGatewayError } from './errors';
|
|
|
17
20
|
import { parseAuthMethod } from './errors/parse-auth-method';
|
|
18
21
|
import type { GatewayConfig } from './gateway-config';
|
|
19
22
|
|
|
20
|
-
|
|
21
|
-
|
|
23
|
+
type GatewayEmbeddingConfig = GatewayConfig & {
|
|
24
|
+
provider: string;
|
|
25
|
+
o11yHeaders: Resolvable<Record<string, string>>;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export class GatewayEmbeddingModel implements EmbeddingModelV4 {
|
|
29
|
+
readonly specificationVersion = 'v4';
|
|
22
30
|
readonly maxEmbeddingsPerCall = 2048;
|
|
23
31
|
readonly supportsParallelCalls = true;
|
|
24
32
|
|
|
33
|
+
static [WORKFLOW_SERIALIZE](model: GatewayEmbeddingModel) {
|
|
34
|
+
return serializeModelOptions({
|
|
35
|
+
modelId: model.modelId,
|
|
36
|
+
config: model.config,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
static [WORKFLOW_DESERIALIZE](options: {
|
|
41
|
+
modelId: string;
|
|
42
|
+
config: GatewayEmbeddingConfig;
|
|
43
|
+
}) {
|
|
44
|
+
return new GatewayEmbeddingModel(options.modelId, options.config);
|
|
45
|
+
}
|
|
46
|
+
|
|
25
47
|
constructor(
|
|
26
48
|
readonly modelId: string,
|
|
27
|
-
private readonly config:
|
|
28
|
-
provider: string;
|
|
29
|
-
o11yHeaders: Resolvable<Record<string, string>>;
|
|
30
|
-
},
|
|
49
|
+
private readonly config: GatewayEmbeddingConfig,
|
|
31
50
|
) {}
|
|
32
51
|
|
|
33
52
|
get provider(): string {
|
|
@@ -39,10 +58,12 @@ export class GatewayEmbeddingModel implements EmbeddingModelV3 {
|
|
|
39
58
|
headers,
|
|
40
59
|
abortSignal,
|
|
41
60
|
providerOptions,
|
|
42
|
-
}: Parameters<
|
|
43
|
-
Awaited<ReturnType<
|
|
61
|
+
}: Parameters<EmbeddingModelV4['doEmbed']>[0]): Promise<
|
|
62
|
+
Awaited<ReturnType<EmbeddingModelV4['doEmbed']>>
|
|
44
63
|
> {
|
|
45
|
-
const resolvedHeaders =
|
|
64
|
+
const resolvedHeaders = this.config.headers
|
|
65
|
+
? await resolve(this.config.headers)
|
|
66
|
+
: undefined;
|
|
46
67
|
try {
|
|
47
68
|
const {
|
|
48
69
|
responseHeaders,
|
|
@@ -75,12 +96,15 @@ export class GatewayEmbeddingModel implements EmbeddingModelV3 {
|
|
|
75
96
|
embeddings: responseBody.embeddings,
|
|
76
97
|
usage: responseBody.usage ?? undefined,
|
|
77
98
|
providerMetadata:
|
|
78
|
-
responseBody.providerMetadata as unknown as
|
|
99
|
+
responseBody.providerMetadata as unknown as SharedV4ProviderMetadata,
|
|
79
100
|
response: { headers: responseHeaders, body: rawValue },
|
|
80
101
|
warnings: [],
|
|
81
102
|
};
|
|
82
103
|
} catch (error) {
|
|
83
|
-
throw await asGatewayError(
|
|
104
|
+
throw await asGatewayError(
|
|
105
|
+
error,
|
|
106
|
+
await parseAuthMethod(resolvedHeaders ?? {}),
|
|
107
|
+
);
|
|
84
108
|
}
|
|
85
109
|
}
|
|
86
110
|
|
|
@@ -90,7 +114,7 @@ export class GatewayEmbeddingModel implements EmbeddingModelV3 {
|
|
|
90
114
|
|
|
91
115
|
private getModelConfigHeaders() {
|
|
92
116
|
return {
|
|
93
|
-
'ai-embedding-model-specification-version': '
|
|
117
|
+
'ai-embedding-model-specification-version': '4',
|
|
94
118
|
'ai-model-id': this.modelId,
|
|
95
119
|
};
|
|
96
120
|
}
|
|
@@ -31,7 +31,9 @@ export class GatewayFetchMetadata {
|
|
|
31
31
|
try {
|
|
32
32
|
const { value } = await getFromApi({
|
|
33
33
|
url: `${this.config.baseURL}/config`,
|
|
34
|
-
headers:
|
|
34
|
+
headers: this.config.headers
|
|
35
|
+
? await resolve(this.config.headers)
|
|
36
|
+
: undefined,
|
|
35
37
|
successfulResponseHandler: createJsonResponseHandler(
|
|
36
38
|
gatewayAvailableModelsResponseSchema,
|
|
37
39
|
),
|
|
@@ -54,7 +56,9 @@ export class GatewayFetchMetadata {
|
|
|
54
56
|
|
|
55
57
|
const { value } = await getFromApi({
|
|
56
58
|
url: `${baseUrl.origin}/v1/credits`,
|
|
57
|
-
headers:
|
|
59
|
+
headers: this.config.headers
|
|
60
|
+
? await resolve(this.config.headers)
|
|
61
|
+
: undefined,
|
|
58
62
|
successfulResponseHandler: createJsonResponseHandler(
|
|
59
63
|
gatewayCreditsResponseSchema,
|
|
60
64
|
),
|
|
@@ -101,7 +105,7 @@ const gatewayAvailableModelsResponseSchema = lazySchema(() =>
|
|
|
101
105
|
)
|
|
102
106
|
.nullish(),
|
|
103
107
|
specification: z.object({
|
|
104
|
-
specificationVersion: z.literal('
|
|
108
|
+
specificationVersion: z.literal('v4'),
|
|
105
109
|
provider: z.string(),
|
|
106
110
|
modelId: z.string(),
|
|
107
111
|
}),
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createJsonErrorResponseHandler,
|
|
3
|
+
createJsonResponseHandler,
|
|
4
|
+
getFromApi,
|
|
5
|
+
lazySchema,
|
|
6
|
+
resolve,
|
|
7
|
+
zodSchema,
|
|
8
|
+
} from '@ai-sdk/provider-utils';
|
|
9
|
+
import { z } from 'zod/v4';
|
|
10
|
+
import { asGatewayError } from './errors';
|
|
11
|
+
import type { GatewayConfig } from './gateway-config';
|
|
12
|
+
|
|
13
|
+
export interface GatewayGenerationInfoParams {
|
|
14
|
+
/** The generation ID to look up (format: gen_<ulid>) */
|
|
15
|
+
id: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface GatewayGenerationInfo {
|
|
19
|
+
/** The generation ID */
|
|
20
|
+
id: string;
|
|
21
|
+
/** Total cost in USD */
|
|
22
|
+
totalCost: number;
|
|
23
|
+
/** Upstream inference cost in USD (BYOK only) */
|
|
24
|
+
upstreamInferenceCost: number;
|
|
25
|
+
/** Usage cost in USD (same as totalCost) */
|
|
26
|
+
usage: number;
|
|
27
|
+
/** ISO 8601 timestamp when the generation was created */
|
|
28
|
+
createdAt: string;
|
|
29
|
+
/** Model identifier */
|
|
30
|
+
model: string;
|
|
31
|
+
/** Whether BYOK credentials were used */
|
|
32
|
+
isByok: boolean;
|
|
33
|
+
/** Provider that served this generation */
|
|
34
|
+
providerName: string;
|
|
35
|
+
/** Whether streaming was used */
|
|
36
|
+
streamed: boolean;
|
|
37
|
+
/** Finish reason (e.g. 'stop') */
|
|
38
|
+
finishReason: string;
|
|
39
|
+
/** Time to first token in milliseconds */
|
|
40
|
+
latency: number;
|
|
41
|
+
/** Total generation time in milliseconds */
|
|
42
|
+
generationTime: number;
|
|
43
|
+
/** Number of prompt tokens */
|
|
44
|
+
promptTokens: number;
|
|
45
|
+
/** Number of completion tokens */
|
|
46
|
+
completionTokens: number;
|
|
47
|
+
/** Reasoning tokens used */
|
|
48
|
+
reasoningTokens: number;
|
|
49
|
+
/** Cached tokens used */
|
|
50
|
+
cachedTokens: number;
|
|
51
|
+
/** Cache creation input tokens */
|
|
52
|
+
cacheCreationTokens: number;
|
|
53
|
+
/** Billable web search calls */
|
|
54
|
+
billableWebSearchCalls: number;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export class GatewayGenerationInfoFetcher {
|
|
58
|
+
constructor(private readonly config: GatewayConfig) {}
|
|
59
|
+
|
|
60
|
+
async getGenerationInfo(
|
|
61
|
+
params: GatewayGenerationInfoParams,
|
|
62
|
+
): Promise<GatewayGenerationInfo> {
|
|
63
|
+
try {
|
|
64
|
+
const baseUrl = new URL(this.config.baseURL);
|
|
65
|
+
|
|
66
|
+
const { value } = await getFromApi({
|
|
67
|
+
url: `${baseUrl.origin}/v1/generation?id=${encodeURIComponent(params.id)}`,
|
|
68
|
+
headers: this.config.headers
|
|
69
|
+
? await resolve(this.config.headers)
|
|
70
|
+
: undefined,
|
|
71
|
+
successfulResponseHandler: createJsonResponseHandler(
|
|
72
|
+
gatewayGenerationInfoResponseSchema,
|
|
73
|
+
),
|
|
74
|
+
failedResponseHandler: createJsonErrorResponseHandler({
|
|
75
|
+
errorSchema: z.any(),
|
|
76
|
+
errorToMessage: data => data,
|
|
77
|
+
}),
|
|
78
|
+
fetch: this.config.fetch,
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
return value;
|
|
82
|
+
} catch (error) {
|
|
83
|
+
throw await asGatewayError(error);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const gatewayGenerationInfoResponseSchema = lazySchema(() =>
|
|
89
|
+
zodSchema(
|
|
90
|
+
z
|
|
91
|
+
.object({
|
|
92
|
+
data: z
|
|
93
|
+
.object({
|
|
94
|
+
id: z.string(),
|
|
95
|
+
total_cost: z.number(),
|
|
96
|
+
upstream_inference_cost: z.number(),
|
|
97
|
+
usage: z.number(),
|
|
98
|
+
created_at: z.string(),
|
|
99
|
+
model: z.string(),
|
|
100
|
+
is_byok: z.boolean(),
|
|
101
|
+
provider_name: z.string(),
|
|
102
|
+
streamed: z.boolean(),
|
|
103
|
+
finish_reason: z.string(),
|
|
104
|
+
latency: z.number(),
|
|
105
|
+
generation_time: z.number(),
|
|
106
|
+
native_tokens_prompt: z.number(),
|
|
107
|
+
native_tokens_completion: z.number(),
|
|
108
|
+
native_tokens_reasoning: z.number(),
|
|
109
|
+
native_tokens_cached: z.number(),
|
|
110
|
+
native_tokens_cache_creation: z.number(),
|
|
111
|
+
billable_web_search_calls: z.number(),
|
|
112
|
+
})
|
|
113
|
+
.transform(
|
|
114
|
+
({
|
|
115
|
+
total_cost,
|
|
116
|
+
upstream_inference_cost,
|
|
117
|
+
created_at,
|
|
118
|
+
is_byok,
|
|
119
|
+
provider_name,
|
|
120
|
+
finish_reason,
|
|
121
|
+
generation_time,
|
|
122
|
+
native_tokens_prompt,
|
|
123
|
+
native_tokens_completion,
|
|
124
|
+
native_tokens_reasoning,
|
|
125
|
+
native_tokens_cached,
|
|
126
|
+
native_tokens_cache_creation,
|
|
127
|
+
billable_web_search_calls,
|
|
128
|
+
...rest
|
|
129
|
+
}) => ({
|
|
130
|
+
...rest,
|
|
131
|
+
totalCost: total_cost,
|
|
132
|
+
upstreamInferenceCost: upstream_inference_cost,
|
|
133
|
+
createdAt: created_at,
|
|
134
|
+
isByok: is_byok,
|
|
135
|
+
providerName: provider_name,
|
|
136
|
+
finishReason: finish_reason,
|
|
137
|
+
generationTime: generation_time,
|
|
138
|
+
promptTokens: native_tokens_prompt,
|
|
139
|
+
completionTokens: native_tokens_completion,
|
|
140
|
+
reasoningTokens: native_tokens_reasoning,
|
|
141
|
+
cachedTokens: native_tokens_cached,
|
|
142
|
+
cacheCreationTokens: native_tokens_cache_creation,
|
|
143
|
+
billableWebSearchCalls: billable_web_search_calls,
|
|
144
|
+
}),
|
|
145
|
+
),
|
|
146
|
+
})
|
|
147
|
+
.transform(({ data }) => data),
|
|
148
|
+
),
|
|
149
|
+
);
|
|
@@ -1,15 +1,24 @@
|
|
|
1
1
|
export type GatewayImageModelId =
|
|
2
|
+
| 'bfl/flux-2-flex'
|
|
3
|
+
| 'bfl/flux-2-klein-4b'
|
|
4
|
+
| 'bfl/flux-2-klein-9b'
|
|
5
|
+
| 'bfl/flux-2-max'
|
|
6
|
+
| 'bfl/flux-2-pro'
|
|
2
7
|
| 'bfl/flux-kontext-max'
|
|
3
8
|
| 'bfl/flux-kontext-pro'
|
|
4
9
|
| 'bfl/flux-pro-1.0-fill'
|
|
5
10
|
| 'bfl/flux-pro-1.1'
|
|
6
11
|
| 'bfl/flux-pro-1.1-ultra'
|
|
12
|
+
| 'bytedance/seedream-4.0'
|
|
13
|
+
| 'bytedance/seedream-4.5'
|
|
14
|
+
| 'bytedance/seedream-5.0-lite'
|
|
7
15
|
| 'google/imagen-4.0-fast-generate-001'
|
|
8
16
|
| 'google/imagen-4.0-generate-001'
|
|
9
17
|
| 'google/imagen-4.0-ultra-generate-001'
|
|
10
18
|
| 'openai/gpt-image-1'
|
|
11
19
|
| 'openai/gpt-image-1-mini'
|
|
12
20
|
| 'openai/gpt-image-1.5'
|
|
21
|
+
| 'prodia/flux-fast-schnell'
|
|
13
22
|
| 'recraft/recraft-v2'
|
|
14
23
|
| 'recraft/recraft-v3'
|
|
15
24
|
| 'recraft/recraft-v4'
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
ImageModelV4,
|
|
3
|
+
ImageModelV4File,
|
|
4
|
+
ImageModelV4ProviderMetadata,
|
|
5
5
|
} from '@ai-sdk/provider';
|
|
6
6
|
import {
|
|
7
7
|
combineHeaders,
|
|
@@ -10,6 +10,9 @@ import {
|
|
|
10
10
|
createJsonErrorResponseHandler,
|
|
11
11
|
postJsonToApi,
|
|
12
12
|
resolve,
|
|
13
|
+
serializeModelOptions,
|
|
14
|
+
WORKFLOW_SERIALIZE,
|
|
15
|
+
WORKFLOW_DESERIALIZE,
|
|
13
16
|
type Resolvable,
|
|
14
17
|
} from '@ai-sdk/provider-utils';
|
|
15
18
|
import { z } from 'zod/v4';
|
|
@@ -17,17 +20,33 @@ import type { GatewayConfig } from './gateway-config';
|
|
|
17
20
|
import { asGatewayError } from './errors';
|
|
18
21
|
import { parseAuthMethod } from './errors/parse-auth-method';
|
|
19
22
|
|
|
20
|
-
|
|
21
|
-
|
|
23
|
+
type GatewayImageConfig = GatewayConfig & {
|
|
24
|
+
provider: string;
|
|
25
|
+
o11yHeaders: Resolvable<Record<string, string>>;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export class GatewayImageModel implements ImageModelV4 {
|
|
29
|
+
readonly specificationVersion = 'v4' as const;
|
|
22
30
|
// Set a very large number to prevent client-side splitting of requests
|
|
23
31
|
readonly maxImagesPerCall = Number.MAX_SAFE_INTEGER;
|
|
24
32
|
|
|
33
|
+
static [WORKFLOW_SERIALIZE](model: GatewayImageModel) {
|
|
34
|
+
return serializeModelOptions({
|
|
35
|
+
modelId: model.modelId,
|
|
36
|
+
config: model.config,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
static [WORKFLOW_DESERIALIZE](options: {
|
|
41
|
+
modelId: string;
|
|
42
|
+
config: GatewayImageConfig;
|
|
43
|
+
}) {
|
|
44
|
+
return new GatewayImageModel(options.modelId, options.config);
|
|
45
|
+
}
|
|
46
|
+
|
|
25
47
|
constructor(
|
|
26
48
|
readonly modelId: string,
|
|
27
|
-
private readonly config:
|
|
28
|
-
provider: string;
|
|
29
|
-
o11yHeaders: Resolvable<Record<string, string>>;
|
|
30
|
-
},
|
|
49
|
+
private readonly config: GatewayImageConfig,
|
|
31
50
|
) {}
|
|
32
51
|
|
|
33
52
|
get provider(): string {
|
|
@@ -45,16 +64,14 @@ export class GatewayImageModel implements ImageModelV3 {
|
|
|
45
64
|
providerOptions,
|
|
46
65
|
headers,
|
|
47
66
|
abortSignal,
|
|
48
|
-
}: Parameters<
|
|
49
|
-
Awaited<ReturnType<
|
|
67
|
+
}: Parameters<ImageModelV4['doGenerate']>[0]): Promise<
|
|
68
|
+
Awaited<ReturnType<ImageModelV4['doGenerate']>>
|
|
50
69
|
> {
|
|
51
|
-
const resolvedHeaders =
|
|
70
|
+
const resolvedHeaders = this.config.headers
|
|
71
|
+
? await resolve(this.config.headers)
|
|
72
|
+
: undefined;
|
|
52
73
|
try {
|
|
53
|
-
const {
|
|
54
|
-
responseHeaders,
|
|
55
|
-
value: responseBody,
|
|
56
|
-
rawValue,
|
|
57
|
-
} = await postJsonToApi({
|
|
74
|
+
const { responseHeaders, value: responseBody } = await postJsonToApi({
|
|
58
75
|
url: this.getUrl(),
|
|
59
76
|
headers: combineHeaders(
|
|
60
77
|
resolvedHeaders,
|
|
@@ -89,7 +106,7 @@ export class GatewayImageModel implements ImageModelV3 {
|
|
|
89
106
|
images: responseBody.images, // Always base64 strings from server
|
|
90
107
|
warnings: responseBody.warnings ?? [],
|
|
91
108
|
providerMetadata:
|
|
92
|
-
responseBody.providerMetadata as
|
|
109
|
+
responseBody.providerMetadata as ImageModelV4ProviderMetadata,
|
|
93
110
|
response: {
|
|
94
111
|
timestamp: new Date(),
|
|
95
112
|
modelId: this.modelId,
|
|
@@ -104,7 +121,10 @@ export class GatewayImageModel implements ImageModelV3 {
|
|
|
104
121
|
}),
|
|
105
122
|
};
|
|
106
123
|
} catch (error) {
|
|
107
|
-
throw await asGatewayError(
|
|
124
|
+
throw await asGatewayError(
|
|
125
|
+
error,
|
|
126
|
+
await parseAuthMethod(resolvedHeaders ?? {}),
|
|
127
|
+
);
|
|
108
128
|
}
|
|
109
129
|
}
|
|
110
130
|
|
|
@@ -114,13 +134,13 @@ export class GatewayImageModel implements ImageModelV3 {
|
|
|
114
134
|
|
|
115
135
|
private getModelConfigHeaders() {
|
|
116
136
|
return {
|
|
117
|
-
'ai-image-model-specification-version': '
|
|
137
|
+
'ai-image-model-specification-version': '4',
|
|
118
138
|
'ai-model-id': this.modelId,
|
|
119
139
|
};
|
|
120
140
|
}
|
|
121
141
|
}
|
|
122
142
|
|
|
123
|
-
function maybeEncodeImageFile(file:
|
|
143
|
+
function maybeEncodeImageFile(file: ImageModelV4File) {
|
|
124
144
|
if (file.type === 'file' && file.data instanceof Uint8Array) {
|
|
125
145
|
return {
|
|
126
146
|
...file,
|
|
@@ -17,15 +17,13 @@ export type GatewayModelId =
|
|
|
17
17
|
| 'alibaba/qwen3-vl-thinking'
|
|
18
18
|
| 'alibaba/qwen3.5-flash'
|
|
19
19
|
| 'alibaba/qwen3.5-plus'
|
|
20
|
+
| 'alibaba/qwen3.6-plus'
|
|
20
21
|
| 'amazon/nova-2-lite'
|
|
21
22
|
| 'amazon/nova-lite'
|
|
22
23
|
| 'amazon/nova-micro'
|
|
23
24
|
| 'amazon/nova-pro'
|
|
24
25
|
| 'anthropic/claude-3-haiku'
|
|
25
|
-
| 'anthropic/claude-3-opus'
|
|
26
26
|
| 'anthropic/claude-3.5-haiku'
|
|
27
|
-
| 'anthropic/claude-3.5-sonnet'
|
|
28
|
-
| 'anthropic/claude-3.5-sonnet-20240620'
|
|
29
27
|
| 'anthropic/claude-3.7-sonnet'
|
|
30
28
|
| 'anthropic/claude-haiku-4.5'
|
|
31
29
|
| 'anthropic/claude-opus-4'
|
|
@@ -36,6 +34,7 @@ export type GatewayModelId =
|
|
|
36
34
|
| 'anthropic/claude-sonnet-4.5'
|
|
37
35
|
| 'anthropic/claude-sonnet-4.6'
|
|
38
36
|
| 'arcee-ai/trinity-large-preview'
|
|
37
|
+
| 'arcee-ai/trinity-large-thinking'
|
|
39
38
|
| 'arcee-ai/trinity-mini'
|
|
40
39
|
| 'bytedance/seed-1.6'
|
|
41
40
|
| 'bytedance/seed-1.8'
|
|
@@ -51,8 +50,6 @@ export type GatewayModelId =
|
|
|
51
50
|
| 'google/gemini-2.5-flash'
|
|
52
51
|
| 'google/gemini-2.5-flash-image'
|
|
53
52
|
| 'google/gemini-2.5-flash-lite'
|
|
54
|
-
| 'google/gemini-2.5-flash-lite-preview-09-2025'
|
|
55
|
-
| 'google/gemini-2.5-flash-preview-09-2025'
|
|
56
53
|
| 'google/gemini-2.5-pro'
|
|
57
54
|
| 'google/gemini-3-flash'
|
|
58
55
|
| 'google/gemini-3-pro-image'
|
|
@@ -60,11 +57,14 @@ export type GatewayModelId =
|
|
|
60
57
|
| 'google/gemini-3.1-flash-image-preview'
|
|
61
58
|
| 'google/gemini-3.1-flash-lite-preview'
|
|
62
59
|
| 'google/gemini-3.1-pro-preview'
|
|
60
|
+
| 'google/gemma-4-26b-a4b-it'
|
|
61
|
+
| 'google/gemma-4-31b-it'
|
|
63
62
|
| 'inception/mercury-2'
|
|
64
63
|
| 'inception/mercury-coder-small'
|
|
65
64
|
| 'kwaipilot/kat-coder-pro-v1'
|
|
65
|
+
| 'kwaipilot/kat-coder-pro-v2'
|
|
66
66
|
| 'meituan/longcat-flash-chat'
|
|
67
|
-
| 'meituan/longcat-flash-thinking'
|
|
67
|
+
| 'meituan/longcat-flash-thinking-2601'
|
|
68
68
|
| 'meta/llama-3.1-70b'
|
|
69
69
|
| 'meta/llama-3.1-8b'
|
|
70
70
|
| 'meta/llama-3.2-11b'
|
|
@@ -79,6 +79,8 @@ export type GatewayModelId =
|
|
|
79
79
|
| 'minimax/minimax-m2.1-lightning'
|
|
80
80
|
| 'minimax/minimax-m2.5'
|
|
81
81
|
| 'minimax/minimax-m2.5-highspeed'
|
|
82
|
+
| 'minimax/minimax-m2.7'
|
|
83
|
+
| 'minimax/minimax-m2.7-highspeed'
|
|
82
84
|
| 'mistral/codestral'
|
|
83
85
|
| 'mistral/devstral-2'
|
|
84
86
|
| 'mistral/devstral-small'
|
|
@@ -104,9 +106,9 @@ export type GatewayModelId =
|
|
|
104
106
|
| 'morph/morph-v3-fast'
|
|
105
107
|
| 'morph/morph-v3-large'
|
|
106
108
|
| 'nvidia/nemotron-3-nano-30b-a3b'
|
|
109
|
+
| 'nvidia/nemotron-3-super-120b-a12b'
|
|
107
110
|
| 'nvidia/nemotron-nano-12b-v2-vl'
|
|
108
111
|
| 'nvidia/nemotron-nano-9b-v2'
|
|
109
|
-
| 'openai/codex-mini'
|
|
110
112
|
| 'openai/gpt-3.5-turbo'
|
|
111
113
|
| 'openai/gpt-3.5-turbo-instruct'
|
|
112
114
|
| 'openai/gpt-4-turbo'
|
|
@@ -134,6 +136,8 @@ export type GatewayModelId =
|
|
|
134
136
|
| 'openai/gpt-5.3-chat'
|
|
135
137
|
| 'openai/gpt-5.3-codex'
|
|
136
138
|
| 'openai/gpt-5.4'
|
|
139
|
+
| 'openai/gpt-5.4-mini'
|
|
140
|
+
| 'openai/gpt-5.4-nano'
|
|
137
141
|
| 'openai/gpt-5.4-pro'
|
|
138
142
|
| 'openai/gpt-oss-120b'
|
|
139
143
|
| 'openai/gpt-oss-20b'
|
|
@@ -146,11 +150,8 @@ export type GatewayModelId =
|
|
|
146
150
|
| 'openai/o4-mini'
|
|
147
151
|
| 'perplexity/sonar'
|
|
148
152
|
| 'perplexity/sonar-pro'
|
|
149
|
-
| 'perplexity/sonar-reasoning'
|
|
150
153
|
| 'perplexity/sonar-reasoning-pro'
|
|
151
154
|
| 'prime-intellect/intellect-3'
|
|
152
|
-
| 'vercel/v0-1.0-md'
|
|
153
|
-
| 'vercel/v0-1.5-md'
|
|
154
155
|
| 'xai/grok-3'
|
|
155
156
|
| 'xai/grok-3-fast'
|
|
156
157
|
| 'xai/grok-3-mini'
|
|
@@ -160,8 +161,15 @@ export type GatewayModelId =
|
|
|
160
161
|
| 'xai/grok-4-fast-reasoning'
|
|
161
162
|
| 'xai/grok-4.1-fast-non-reasoning'
|
|
162
163
|
| 'xai/grok-4.1-fast-reasoning'
|
|
164
|
+
| 'xai/grok-4.20-multi-agent'
|
|
165
|
+
| 'xai/grok-4.20-multi-agent-beta'
|
|
166
|
+
| 'xai/grok-4.20-non-reasoning'
|
|
167
|
+
| 'xai/grok-4.20-non-reasoning-beta'
|
|
168
|
+
| 'xai/grok-4.20-reasoning'
|
|
169
|
+
| 'xai/grok-4.20-reasoning-beta'
|
|
163
170
|
| 'xai/grok-code-fast-1'
|
|
164
171
|
| 'xiaomi/mimo-v2-flash'
|
|
172
|
+
| 'xiaomi/mimo-v2-pro'
|
|
165
173
|
| 'zai/glm-4.5'
|
|
166
174
|
| 'zai/glm-4.5-air'
|
|
167
175
|
| 'zai/glm-4.5v'
|
|
@@ -172,4 +180,7 @@ export type GatewayModelId =
|
|
|
172
180
|
| 'zai/glm-4.7-flash'
|
|
173
181
|
| 'zai/glm-4.7-flashx'
|
|
174
182
|
| 'zai/glm-5'
|
|
183
|
+
| 'zai/glm-5-turbo'
|
|
184
|
+
| 'zai/glm-5.1'
|
|
185
|
+
| 'zai/glm-5v-turbo'
|
|
175
186
|
| (string & {});
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
LanguageModelV3StreamResult,
|
|
2
|
+
LanguageModelV4,
|
|
3
|
+
LanguageModelV4CallOptions,
|
|
4
|
+
LanguageModelV4FilePart,
|
|
5
|
+
LanguageModelV4StreamPart,
|
|
6
|
+
LanguageModelV4GenerateResult,
|
|
7
|
+
LanguageModelV4StreamResult,
|
|
9
8
|
} from '@ai-sdk/provider';
|
|
10
9
|
import {
|
|
11
10
|
combineHeaders,
|
|
@@ -14,6 +13,9 @@ import {
|
|
|
14
13
|
createJsonResponseHandler,
|
|
15
14
|
postJsonToApi,
|
|
16
15
|
resolve,
|
|
16
|
+
serializeModelOptions,
|
|
17
|
+
WORKFLOW_SERIALIZE,
|
|
18
|
+
WORKFLOW_DESERIALIZE,
|
|
17
19
|
type ParseResult,
|
|
18
20
|
type Resolvable,
|
|
19
21
|
} from '@ai-sdk/provider-utils';
|
|
@@ -28,10 +30,24 @@ type GatewayChatConfig = GatewayConfig & {
|
|
|
28
30
|
o11yHeaders: Resolvable<Record<string, string>>;
|
|
29
31
|
};
|
|
30
32
|
|
|
31
|
-
export class GatewayLanguageModel implements
|
|
32
|
-
readonly specificationVersion = '
|
|
33
|
+
export class GatewayLanguageModel implements LanguageModelV4 {
|
|
34
|
+
readonly specificationVersion = 'v4';
|
|
33
35
|
readonly supportedUrls = { '*/*': [/.*/] };
|
|
34
36
|
|
|
37
|
+
static [WORKFLOW_SERIALIZE](model: GatewayLanguageModel) {
|
|
38
|
+
return serializeModelOptions({
|
|
39
|
+
modelId: model.modelId,
|
|
40
|
+
config: model.config,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
static [WORKFLOW_DESERIALIZE](options: {
|
|
45
|
+
modelId: GatewayModelId;
|
|
46
|
+
config: GatewayChatConfig;
|
|
47
|
+
}) {
|
|
48
|
+
return new GatewayLanguageModel(options.modelId, options.config);
|
|
49
|
+
}
|
|
50
|
+
|
|
35
51
|
constructor(
|
|
36
52
|
readonly modelId: GatewayModelId,
|
|
37
53
|
private readonly config: GatewayChatConfig,
|
|
@@ -41,7 +57,7 @@ export class GatewayLanguageModel implements LanguageModelV3 {
|
|
|
41
57
|
return this.config.provider;
|
|
42
58
|
}
|
|
43
59
|
|
|
44
|
-
private async getArgs(options:
|
|
60
|
+
private async getArgs(options: LanguageModelV4CallOptions) {
|
|
45
61
|
const { abortSignal: _abortSignal, ...optionsWithoutSignal } = options;
|
|
46
62
|
|
|
47
63
|
return {
|
|
@@ -51,12 +67,14 @@ export class GatewayLanguageModel implements LanguageModelV3 {
|
|
|
51
67
|
}
|
|
52
68
|
|
|
53
69
|
async doGenerate(
|
|
54
|
-
options:
|
|
55
|
-
): Promise<
|
|
70
|
+
options: LanguageModelV4CallOptions,
|
|
71
|
+
): Promise<LanguageModelV4GenerateResult> {
|
|
56
72
|
const { args, warnings } = await this.getArgs(options);
|
|
57
73
|
const { abortSignal } = options;
|
|
58
74
|
|
|
59
|
-
const resolvedHeaders =
|
|
75
|
+
const resolvedHeaders = this.config.headers
|
|
76
|
+
? await resolve(this.config.headers)
|
|
77
|
+
: undefined;
|
|
60
78
|
|
|
61
79
|
try {
|
|
62
80
|
const {
|
|
@@ -88,17 +106,22 @@ export class GatewayLanguageModel implements LanguageModelV3 {
|
|
|
88
106
|
warnings,
|
|
89
107
|
};
|
|
90
108
|
} catch (error) {
|
|
91
|
-
throw await asGatewayError(
|
|
109
|
+
throw await asGatewayError(
|
|
110
|
+
error,
|
|
111
|
+
await parseAuthMethod(resolvedHeaders ?? {}),
|
|
112
|
+
);
|
|
92
113
|
}
|
|
93
114
|
}
|
|
94
115
|
|
|
95
116
|
async doStream(
|
|
96
|
-
options:
|
|
97
|
-
): Promise<
|
|
117
|
+
options: LanguageModelV4CallOptions,
|
|
118
|
+
): Promise<LanguageModelV4StreamResult> {
|
|
98
119
|
const { args, warnings } = await this.getArgs(options);
|
|
99
120
|
const { abortSignal } = options;
|
|
100
121
|
|
|
101
|
-
const resolvedHeaders =
|
|
122
|
+
const resolvedHeaders = this.config.headers
|
|
123
|
+
? await resolve(this.config.headers)
|
|
124
|
+
: undefined;
|
|
102
125
|
|
|
103
126
|
try {
|
|
104
127
|
const { value: response, responseHeaders } = await postJsonToApi({
|
|
@@ -122,8 +145,8 @@ export class GatewayLanguageModel implements LanguageModelV3 {
|
|
|
122
145
|
return {
|
|
123
146
|
stream: response.pipeThrough(
|
|
124
147
|
new TransformStream<
|
|
125
|
-
ParseResult<
|
|
126
|
-
|
|
148
|
+
ParseResult<LanguageModelV4StreamPart>,
|
|
149
|
+
LanguageModelV4StreamPart
|
|
127
150
|
>({
|
|
128
151
|
start(controller) {
|
|
129
152
|
if (warnings.length > 0) {
|
|
@@ -161,7 +184,10 @@ export class GatewayLanguageModel implements LanguageModelV3 {
|
|
|
161
184
|
response: { headers: responseHeaders },
|
|
162
185
|
};
|
|
163
186
|
} catch (error) {
|
|
164
|
-
throw await asGatewayError(
|
|
187
|
+
throw await asGatewayError(
|
|
188
|
+
error,
|
|
189
|
+
await parseAuthMethod(resolvedHeaders ?? {}),
|
|
190
|
+
);
|
|
165
191
|
}
|
|
166
192
|
}
|
|
167
193
|
|
|
@@ -177,11 +203,11 @@ export class GatewayLanguageModel implements LanguageModelV3 {
|
|
|
177
203
|
* @param options - The options to encode.
|
|
178
204
|
* @returns The options with the file parts encoded.
|
|
179
205
|
*/
|
|
180
|
-
private maybeEncodeFileParts(options:
|
|
206
|
+
private maybeEncodeFileParts(options: LanguageModelV4CallOptions) {
|
|
181
207
|
for (const message of options.prompt) {
|
|
182
208
|
for (const part of message.content) {
|
|
183
209
|
if (this.isFilePart(part)) {
|
|
184
|
-
const filePart = part as
|
|
210
|
+
const filePart = part as LanguageModelV4FilePart;
|
|
185
211
|
// If the file part is a URL it will get cleanly converted to a string.
|
|
186
212
|
// If it's a binary file attachment we convert it to a data url.
|
|
187
213
|
// In either case, server-side we should only ever see URLs as strings.
|
|
@@ -204,7 +230,7 @@ export class GatewayLanguageModel implements LanguageModelV3 {
|
|
|
204
230
|
|
|
205
231
|
private getModelConfigHeaders(modelId: string, streaming: boolean) {
|
|
206
232
|
return {
|
|
207
|
-
'ai-language-model-specification-version': '
|
|
233
|
+
'ai-language-model-specification-version': '4',
|
|
208
234
|
'ai-language-model-id': modelId,
|
|
209
235
|
'ai-language-model-streaming': String(streaming),
|
|
210
236
|
};
|