@ai-sdk/gateway 4.0.0-beta.4 → 4.0.0-beta.41
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 +252 -4
- package/dist/index.d.mts +143 -21
- package/dist/index.d.ts +143 -21
- package/dist/index.js +454 -144
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +518 -186
- package/dist/index.mjs.map +1 -1
- package/docs/00-ai-gateway.mdx +292 -44
- package/package.json +4 -6
- package/src/gateway-embedding-model-settings.ts +1 -0
- package/src/gateway-embedding-model.ts +8 -8
- package/src/gateway-fetch-metadata.ts +1 -1
- package/src/gateway-generation-info.ts +147 -0
- package/src/gateway-image-model-settings.ts +6 -0
- package/src/gateway-image-model.ts +10 -10
- package/src/gateway-language-model-settings.ts +21 -10
- package/src/gateway-language-model.ts +19 -19
- package/src/gateway-model-entry.ts +2 -2
- package/src/gateway-provider-options.ts +27 -8
- package/src/gateway-provider.ts +99 -17
- package/src/gateway-reranking-model-settings.ts +1 -0
- package/src/gateway-reranking-model.ts +114 -0
- package/src/gateway-spend-report.ts +191 -0
- package/src/gateway-video-model.ts +15 -15
- package/src/index.ts +13 -3
package/src/gateway-provider.ts
CHANGED
|
@@ -13,38 +13,51 @@ import {
|
|
|
13
13
|
type GatewayFetchMetadataResponse,
|
|
14
14
|
type GatewayCreditsResponse,
|
|
15
15
|
} from './gateway-fetch-metadata';
|
|
16
|
+
import {
|
|
17
|
+
GatewaySpendReport,
|
|
18
|
+
type GatewaySpendReportParams,
|
|
19
|
+
type GatewaySpendReportResponse,
|
|
20
|
+
} from './gateway-spend-report';
|
|
21
|
+
import {
|
|
22
|
+
GatewayGenerationInfoFetcher,
|
|
23
|
+
type GatewayGenerationInfoParams,
|
|
24
|
+
type GatewayGenerationInfo,
|
|
25
|
+
} from './gateway-generation-info';
|
|
16
26
|
import { GatewayLanguageModel } from './gateway-language-model';
|
|
17
27
|
import { GatewayEmbeddingModel } from './gateway-embedding-model';
|
|
18
28
|
import { GatewayImageModel } from './gateway-image-model';
|
|
19
29
|
import { GatewayVideoModel } from './gateway-video-model';
|
|
30
|
+
import { GatewayRerankingModel } from './gateway-reranking-model';
|
|
20
31
|
import type { GatewayEmbeddingModelId } from './gateway-embedding-model-settings';
|
|
21
32
|
import type { GatewayImageModelId } from './gateway-image-model-settings';
|
|
33
|
+
import type { GatewayRerankingModelId } from './gateway-reranking-model-settings';
|
|
22
34
|
import type { GatewayVideoModelId } from './gateway-video-model-settings';
|
|
23
35
|
import { gatewayTools } from './gateway-tools';
|
|
24
36
|
import { getVercelOidcToken, getVercelRequestId } from './vercel-environment';
|
|
25
37
|
import type { GatewayModelId } from './gateway-language-model-settings';
|
|
26
38
|
import type {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
39
|
+
LanguageModelV4,
|
|
40
|
+
EmbeddingModelV4,
|
|
41
|
+
ImageModelV4,
|
|
42
|
+
RerankingModelV4,
|
|
43
|
+
Experimental_VideoModelV4,
|
|
44
|
+
ProviderV4,
|
|
32
45
|
} from '@ai-sdk/provider';
|
|
33
46
|
import { withUserAgentSuffix } from '@ai-sdk/provider-utils';
|
|
34
47
|
import { VERSION } from './version';
|
|
35
48
|
|
|
36
|
-
export interface GatewayProvider extends
|
|
37
|
-
(modelId: GatewayModelId):
|
|
49
|
+
export interface GatewayProvider extends ProviderV4 {
|
|
50
|
+
(modelId: GatewayModelId): LanguageModelV4;
|
|
38
51
|
|
|
39
52
|
/**
|
|
40
53
|
* Creates a model for text generation.
|
|
41
54
|
*/
|
|
42
|
-
chat(modelId: GatewayModelId):
|
|
55
|
+
chat(modelId: GatewayModelId): LanguageModelV4;
|
|
43
56
|
|
|
44
57
|
/**
|
|
45
58
|
* Creates a model for text generation.
|
|
46
59
|
*/
|
|
47
|
-
languageModel(modelId: GatewayModelId):
|
|
60
|
+
languageModel(modelId: GatewayModelId): LanguageModelV4;
|
|
48
61
|
|
|
49
62
|
/**
|
|
50
63
|
* Returns available providers and models for use with the remote provider.
|
|
@@ -56,40 +69,66 @@ export interface GatewayProvider extends ProviderV3 {
|
|
|
56
69
|
*/
|
|
57
70
|
getCredits(): Promise<GatewayCreditsResponse>;
|
|
58
71
|
|
|
72
|
+
/**
|
|
73
|
+
* Returns a spend report with cost, token, and request count data,
|
|
74
|
+
* aggregated by the specified dimension.
|
|
75
|
+
*/
|
|
76
|
+
getSpendReport(
|
|
77
|
+
params: GatewaySpendReportParams,
|
|
78
|
+
): Promise<GatewaySpendReportResponse>;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Returns detailed information about a specific generation by its ID,
|
|
82
|
+
* including cost, token usage, latency, and provider details.
|
|
83
|
+
*/
|
|
84
|
+
getGenerationInfo(
|
|
85
|
+
params: GatewayGenerationInfoParams,
|
|
86
|
+
): Promise<GatewayGenerationInfo>;
|
|
87
|
+
|
|
59
88
|
/**
|
|
60
89
|
* Creates a model for generating text embeddings.
|
|
61
90
|
*/
|
|
62
|
-
embedding(modelId: GatewayEmbeddingModelId):
|
|
91
|
+
embedding(modelId: GatewayEmbeddingModelId): EmbeddingModelV4;
|
|
63
92
|
|
|
64
93
|
/**
|
|
65
94
|
* Creates a model for generating text embeddings.
|
|
66
95
|
*/
|
|
67
|
-
embeddingModel(modelId: GatewayEmbeddingModelId):
|
|
96
|
+
embeddingModel(modelId: GatewayEmbeddingModelId): EmbeddingModelV4;
|
|
68
97
|
|
|
69
98
|
/**
|
|
70
99
|
* @deprecated Use `embeddingModel` instead.
|
|
71
100
|
*/
|
|
72
|
-
textEmbeddingModel(modelId: GatewayEmbeddingModelId):
|
|
101
|
+
textEmbeddingModel(modelId: GatewayEmbeddingModelId): EmbeddingModelV4;
|
|
73
102
|
|
|
74
103
|
/**
|
|
75
104
|
* Creates a model for generating images.
|
|
76
105
|
*/
|
|
77
|
-
image(modelId: GatewayImageModelId):
|
|
106
|
+
image(modelId: GatewayImageModelId): ImageModelV4;
|
|
78
107
|
|
|
79
108
|
/**
|
|
80
109
|
* Creates a model for generating images.
|
|
81
110
|
*/
|
|
82
|
-
imageModel(modelId: GatewayImageModelId):
|
|
111
|
+
imageModel(modelId: GatewayImageModelId): ImageModelV4;
|
|
83
112
|
|
|
84
113
|
/**
|
|
85
114
|
* Creates a model for generating videos.
|
|
86
115
|
*/
|
|
87
|
-
video(modelId: GatewayVideoModelId):
|
|
116
|
+
video(modelId: GatewayVideoModelId): Experimental_VideoModelV4;
|
|
88
117
|
|
|
89
118
|
/**
|
|
90
119
|
* Creates a model for generating videos.
|
|
91
120
|
*/
|
|
92
|
-
videoModel(modelId: GatewayVideoModelId):
|
|
121
|
+
videoModel(modelId: GatewayVideoModelId): Experimental_VideoModelV4;
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Creates a model for reranking documents.
|
|
125
|
+
*/
|
|
126
|
+
reranking(modelId: GatewayRerankingModelId): RerankingModelV4;
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Creates a model for reranking documents.
|
|
130
|
+
*/
|
|
131
|
+
rerankingModel(modelId: GatewayRerankingModelId): RerankingModelV4;
|
|
93
132
|
|
|
94
133
|
/**
|
|
95
134
|
* Gateway-specific tools executed server-side.
|
|
@@ -253,6 +292,36 @@ export function createGatewayProvider(
|
|
|
253
292
|
});
|
|
254
293
|
};
|
|
255
294
|
|
|
295
|
+
const getSpendReport = async (params: GatewaySpendReportParams) => {
|
|
296
|
+
return new GatewaySpendReport({
|
|
297
|
+
baseURL,
|
|
298
|
+
headers: getHeaders,
|
|
299
|
+
fetch: options.fetch,
|
|
300
|
+
})
|
|
301
|
+
.getSpendReport(params)
|
|
302
|
+
.catch(async (error: unknown) => {
|
|
303
|
+
throw await asGatewayError(
|
|
304
|
+
error,
|
|
305
|
+
await parseAuthMethod(await getHeaders()),
|
|
306
|
+
);
|
|
307
|
+
});
|
|
308
|
+
};
|
|
309
|
+
|
|
310
|
+
const getGenerationInfo = async (params: GatewayGenerationInfoParams) => {
|
|
311
|
+
return new GatewayGenerationInfoFetcher({
|
|
312
|
+
baseURL,
|
|
313
|
+
headers: getHeaders,
|
|
314
|
+
fetch: options.fetch,
|
|
315
|
+
})
|
|
316
|
+
.getGenerationInfo(params)
|
|
317
|
+
.catch(async (error: unknown) => {
|
|
318
|
+
throw await asGatewayError(
|
|
319
|
+
error,
|
|
320
|
+
await parseAuthMethod(await getHeaders()),
|
|
321
|
+
);
|
|
322
|
+
});
|
|
323
|
+
};
|
|
324
|
+
|
|
256
325
|
const provider = function (modelId: GatewayModelId) {
|
|
257
326
|
if (new.target) {
|
|
258
327
|
throw new Error(
|
|
@@ -263,9 +332,11 @@ export function createGatewayProvider(
|
|
|
263
332
|
return createLanguageModel(modelId);
|
|
264
333
|
};
|
|
265
334
|
|
|
266
|
-
provider.specificationVersion = '
|
|
335
|
+
provider.specificationVersion = 'v4' as const;
|
|
267
336
|
provider.getAvailableModels = getAvailableModels;
|
|
268
337
|
provider.getCredits = getCredits;
|
|
338
|
+
provider.getSpendReport = getSpendReport;
|
|
339
|
+
provider.getGenerationInfo = getGenerationInfo;
|
|
269
340
|
provider.imageModel = (modelId: GatewayImageModelId) => {
|
|
270
341
|
return new GatewayImageModel(modelId, {
|
|
271
342
|
provider: 'gateway',
|
|
@@ -296,6 +367,17 @@ export function createGatewayProvider(
|
|
|
296
367
|
o11yHeaders: createO11yHeaders(),
|
|
297
368
|
});
|
|
298
369
|
};
|
|
370
|
+
const createRerankingModel = (modelId: GatewayRerankingModelId) => {
|
|
371
|
+
return new GatewayRerankingModel(modelId, {
|
|
372
|
+
provider: 'gateway',
|
|
373
|
+
baseURL,
|
|
374
|
+
headers: getHeaders,
|
|
375
|
+
fetch: options.fetch,
|
|
376
|
+
o11yHeaders: createO11yHeaders(),
|
|
377
|
+
});
|
|
378
|
+
};
|
|
379
|
+
provider.rerankingModel = createRerankingModel;
|
|
380
|
+
provider.reranking = createRerankingModel;
|
|
299
381
|
provider.chat = provider.languageModel;
|
|
300
382
|
provider.embedding = provider.embeddingModel;
|
|
301
383
|
provider.image = provider.imageModel;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type GatewayRerankingModelId = 'cohere/rerank-v3.5' | (string & {});
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
RerankingModelV4,
|
|
3
|
+
SharedV4ProviderMetadata,
|
|
4
|
+
} from '@ai-sdk/provider';
|
|
5
|
+
import {
|
|
6
|
+
combineHeaders,
|
|
7
|
+
createJsonErrorResponseHandler,
|
|
8
|
+
createJsonResponseHandler,
|
|
9
|
+
lazySchema,
|
|
10
|
+
postJsonToApi,
|
|
11
|
+
resolve,
|
|
12
|
+
zodSchema,
|
|
13
|
+
type Resolvable,
|
|
14
|
+
} from '@ai-sdk/provider-utils';
|
|
15
|
+
import { z } from 'zod/v4';
|
|
16
|
+
import { asGatewayError } from './errors';
|
|
17
|
+
import { parseAuthMethod } from './errors/parse-auth-method';
|
|
18
|
+
import type { GatewayConfig } from './gateway-config';
|
|
19
|
+
|
|
20
|
+
export class GatewayRerankingModel implements RerankingModelV4 {
|
|
21
|
+
readonly specificationVersion = 'v4';
|
|
22
|
+
|
|
23
|
+
constructor(
|
|
24
|
+
readonly modelId: string,
|
|
25
|
+
private readonly config: GatewayConfig & {
|
|
26
|
+
provider: string;
|
|
27
|
+
o11yHeaders: Resolvable<Record<string, string>>;
|
|
28
|
+
},
|
|
29
|
+
) {}
|
|
30
|
+
|
|
31
|
+
get provider(): string {
|
|
32
|
+
return this.config.provider;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async doRerank({
|
|
36
|
+
documents,
|
|
37
|
+
query,
|
|
38
|
+
topN,
|
|
39
|
+
headers,
|
|
40
|
+
abortSignal,
|
|
41
|
+
providerOptions,
|
|
42
|
+
}: Parameters<RerankingModelV4['doRerank']>[0]): Promise<
|
|
43
|
+
Awaited<ReturnType<RerankingModelV4['doRerank']>>
|
|
44
|
+
> {
|
|
45
|
+
const resolvedHeaders = await resolve(this.config.headers());
|
|
46
|
+
try {
|
|
47
|
+
const {
|
|
48
|
+
responseHeaders,
|
|
49
|
+
value: responseBody,
|
|
50
|
+
rawValue,
|
|
51
|
+
} = await postJsonToApi({
|
|
52
|
+
url: this.getUrl(),
|
|
53
|
+
headers: combineHeaders(
|
|
54
|
+
resolvedHeaders,
|
|
55
|
+
headers ?? {},
|
|
56
|
+
this.getModelConfigHeaders(),
|
|
57
|
+
await resolve(this.config.o11yHeaders),
|
|
58
|
+
),
|
|
59
|
+
body: {
|
|
60
|
+
documents,
|
|
61
|
+
query,
|
|
62
|
+
...(topN != null ? { topN } : {}),
|
|
63
|
+
...(providerOptions ? { providerOptions } : {}),
|
|
64
|
+
},
|
|
65
|
+
successfulResponseHandler: createJsonResponseHandler(
|
|
66
|
+
gatewayRerankingResponseSchema,
|
|
67
|
+
),
|
|
68
|
+
failedResponseHandler: createJsonErrorResponseHandler({
|
|
69
|
+
errorSchema: z.any(),
|
|
70
|
+
errorToMessage: data => data,
|
|
71
|
+
}),
|
|
72
|
+
...(abortSignal && { abortSignal }),
|
|
73
|
+
fetch: this.config.fetch,
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
return {
|
|
77
|
+
ranking: responseBody.ranking,
|
|
78
|
+
providerMetadata:
|
|
79
|
+
responseBody.providerMetadata as unknown as SharedV4ProviderMetadata,
|
|
80
|
+
response: { headers: responseHeaders, body: rawValue },
|
|
81
|
+
warnings: [],
|
|
82
|
+
};
|
|
83
|
+
} catch (error) {
|
|
84
|
+
throw await asGatewayError(error, await parseAuthMethod(resolvedHeaders));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
private getUrl() {
|
|
89
|
+
return `${this.config.baseURL}/reranking-model`;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
private getModelConfigHeaders() {
|
|
93
|
+
return {
|
|
94
|
+
'ai-reranking-model-specification-version': '4',
|
|
95
|
+
'ai-model-id': this.modelId,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const gatewayRerankingResponseSchema = lazySchema(() =>
|
|
101
|
+
zodSchema(
|
|
102
|
+
z.object({
|
|
103
|
+
ranking: z.array(
|
|
104
|
+
z.object({
|
|
105
|
+
index: z.number(),
|
|
106
|
+
relevanceScore: z.number(),
|
|
107
|
+
}),
|
|
108
|
+
),
|
|
109
|
+
providerMetadata: z
|
|
110
|
+
.record(z.string(), z.record(z.string(), z.unknown()))
|
|
111
|
+
.optional(),
|
|
112
|
+
}),
|
|
113
|
+
),
|
|
114
|
+
);
|
|
@@ -0,0 +1,191 @@
|
|
|
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 GatewaySpendReportParams {
|
|
14
|
+
/** Start date in YYYY-MM-DD format (inclusive) */
|
|
15
|
+
startDate: string;
|
|
16
|
+
/** End date in YYYY-MM-DD format (inclusive) */
|
|
17
|
+
endDate: string;
|
|
18
|
+
/** Primary aggregation dimension. Defaults to 'day'. */
|
|
19
|
+
groupBy?: 'day' | 'user' | 'model' | 'tag' | 'provider' | 'credential_type';
|
|
20
|
+
/** Time granularity when groupBy is 'day'. */
|
|
21
|
+
datePart?: 'day' | 'hour';
|
|
22
|
+
/** Filter to a specific user's spend. */
|
|
23
|
+
userId?: string;
|
|
24
|
+
/** Filter to a specific model (e.g. 'anthropic/claude-sonnet-4.5'). */
|
|
25
|
+
model?: string;
|
|
26
|
+
/** Filter to a specific provider (e.g. 'anthropic'). */
|
|
27
|
+
provider?: string;
|
|
28
|
+
/** Filter to BYOK or system credentials. */
|
|
29
|
+
credentialType?: 'byok' | 'system';
|
|
30
|
+
/** Filter to requests with these tags. */
|
|
31
|
+
tags?: string[];
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface GatewaySpendReportRow {
|
|
35
|
+
/** Date string (present when groupBy is 'day') */
|
|
36
|
+
day?: string;
|
|
37
|
+
/** Hour timestamp (present when groupBy is 'day' and datePart is 'hour') */
|
|
38
|
+
hour?: string;
|
|
39
|
+
/** User identifier (present when groupBy is 'user') */
|
|
40
|
+
user?: string;
|
|
41
|
+
/** Model identifier (present when groupBy is 'model') */
|
|
42
|
+
model?: string;
|
|
43
|
+
/** Tag value (present when groupBy is 'tag') */
|
|
44
|
+
tag?: string;
|
|
45
|
+
/** Provider name (present when groupBy is 'provider') */
|
|
46
|
+
provider?: string;
|
|
47
|
+
/** Credential type (present when groupBy is 'credential_type') */
|
|
48
|
+
credentialType?: 'byok' | 'system';
|
|
49
|
+
|
|
50
|
+
/** Total cost in USD */
|
|
51
|
+
totalCost: number;
|
|
52
|
+
/** Market cost in USD */
|
|
53
|
+
marketCost?: number;
|
|
54
|
+
/** Number of input tokens */
|
|
55
|
+
inputTokens?: number;
|
|
56
|
+
/** Number of output tokens */
|
|
57
|
+
outputTokens?: number;
|
|
58
|
+
/** Number of cached input tokens */
|
|
59
|
+
cachedInputTokens?: number;
|
|
60
|
+
/** Number of cache creation input tokens */
|
|
61
|
+
cacheCreationInputTokens?: number;
|
|
62
|
+
/** Number of reasoning tokens */
|
|
63
|
+
reasoningTokens?: number;
|
|
64
|
+
/** Number of requests */
|
|
65
|
+
requestCount?: number;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export interface GatewaySpendReportResponse {
|
|
69
|
+
results: GatewaySpendReportRow[];
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export class GatewaySpendReport {
|
|
73
|
+
constructor(private readonly config: GatewayConfig) {}
|
|
74
|
+
|
|
75
|
+
async getSpendReport(
|
|
76
|
+
params: GatewaySpendReportParams,
|
|
77
|
+
): Promise<GatewaySpendReportResponse> {
|
|
78
|
+
try {
|
|
79
|
+
const baseUrl = new URL(this.config.baseURL);
|
|
80
|
+
|
|
81
|
+
const searchParams = new URLSearchParams();
|
|
82
|
+
searchParams.set('start_date', params.startDate);
|
|
83
|
+
searchParams.set('end_date', params.endDate);
|
|
84
|
+
|
|
85
|
+
if (params.groupBy) {
|
|
86
|
+
searchParams.set('group_by', params.groupBy);
|
|
87
|
+
}
|
|
88
|
+
if (params.datePart) {
|
|
89
|
+
searchParams.set('date_part', params.datePart);
|
|
90
|
+
}
|
|
91
|
+
if (params.userId) {
|
|
92
|
+
searchParams.set('user_id', params.userId);
|
|
93
|
+
}
|
|
94
|
+
if (params.model) {
|
|
95
|
+
searchParams.set('model', params.model);
|
|
96
|
+
}
|
|
97
|
+
if (params.provider) {
|
|
98
|
+
searchParams.set('provider', params.provider);
|
|
99
|
+
}
|
|
100
|
+
if (params.credentialType) {
|
|
101
|
+
searchParams.set('credential_type', params.credentialType);
|
|
102
|
+
}
|
|
103
|
+
if (params.tags && params.tags.length > 0) {
|
|
104
|
+
searchParams.set('tags', params.tags.join(','));
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const { value } = await getFromApi({
|
|
108
|
+
url: `${baseUrl.origin}/v1/report?${searchParams.toString()}`,
|
|
109
|
+
headers: await resolve(this.config.headers()),
|
|
110
|
+
successfulResponseHandler: createJsonResponseHandler(
|
|
111
|
+
gatewaySpendReportResponseSchema,
|
|
112
|
+
),
|
|
113
|
+
failedResponseHandler: createJsonErrorResponseHandler({
|
|
114
|
+
errorSchema: z.any(),
|
|
115
|
+
errorToMessage: data => data,
|
|
116
|
+
}),
|
|
117
|
+
fetch: this.config.fetch,
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
return value;
|
|
121
|
+
} catch (error) {
|
|
122
|
+
throw await asGatewayError(error);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const gatewaySpendReportResponseSchema = lazySchema(() =>
|
|
128
|
+
zodSchema(
|
|
129
|
+
z.object({
|
|
130
|
+
results: z.array(
|
|
131
|
+
z
|
|
132
|
+
.object({
|
|
133
|
+
day: z.string().optional(),
|
|
134
|
+
hour: z.string().optional(),
|
|
135
|
+
user: z.string().optional(),
|
|
136
|
+
model: z.string().optional(),
|
|
137
|
+
tag: z.string().optional(),
|
|
138
|
+
provider: z.string().optional(),
|
|
139
|
+
credential_type: z.enum(['byok', 'system']).optional(),
|
|
140
|
+
total_cost: z.number(),
|
|
141
|
+
market_cost: z.number().optional(),
|
|
142
|
+
input_tokens: z.number().optional(),
|
|
143
|
+
output_tokens: z.number().optional(),
|
|
144
|
+
cached_input_tokens: z.number().optional(),
|
|
145
|
+
cache_creation_input_tokens: z.number().optional(),
|
|
146
|
+
reasoning_tokens: z.number().optional(),
|
|
147
|
+
request_count: z.number().optional(),
|
|
148
|
+
})
|
|
149
|
+
.transform(
|
|
150
|
+
({
|
|
151
|
+
credential_type,
|
|
152
|
+
total_cost,
|
|
153
|
+
market_cost,
|
|
154
|
+
input_tokens,
|
|
155
|
+
output_tokens,
|
|
156
|
+
cached_input_tokens,
|
|
157
|
+
cache_creation_input_tokens,
|
|
158
|
+
reasoning_tokens,
|
|
159
|
+
request_count,
|
|
160
|
+
...rest
|
|
161
|
+
}) => ({
|
|
162
|
+
...rest,
|
|
163
|
+
...(credential_type !== undefined
|
|
164
|
+
? { credentialType: credential_type }
|
|
165
|
+
: {}),
|
|
166
|
+
totalCost: total_cost,
|
|
167
|
+
...(market_cost !== undefined ? { marketCost: market_cost } : {}),
|
|
168
|
+
...(input_tokens !== undefined
|
|
169
|
+
? { inputTokens: input_tokens }
|
|
170
|
+
: {}),
|
|
171
|
+
...(output_tokens !== undefined
|
|
172
|
+
? { outputTokens: output_tokens }
|
|
173
|
+
: {}),
|
|
174
|
+
...(cached_input_tokens !== undefined
|
|
175
|
+
? { cachedInputTokens: cached_input_tokens }
|
|
176
|
+
: {}),
|
|
177
|
+
...(cache_creation_input_tokens !== undefined
|
|
178
|
+
? { cacheCreationInputTokens: cache_creation_input_tokens }
|
|
179
|
+
: {}),
|
|
180
|
+
...(reasoning_tokens !== undefined
|
|
181
|
+
? { reasoningTokens: reasoning_tokens }
|
|
182
|
+
: {}),
|
|
183
|
+
...(request_count !== undefined
|
|
184
|
+
? { requestCount: request_count }
|
|
185
|
+
: {}),
|
|
186
|
+
}),
|
|
187
|
+
),
|
|
188
|
+
),
|
|
189
|
+
}),
|
|
190
|
+
),
|
|
191
|
+
);
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
Experimental_VideoModelV4,
|
|
3
|
+
Experimental_VideoModelV4CallOptions,
|
|
4
|
+
Experimental_VideoModelV4File,
|
|
5
|
+
Experimental_VideoModelV4VideoData,
|
|
6
|
+
SharedV4ProviderMetadata,
|
|
7
|
+
SharedV4Warning,
|
|
8
8
|
} from '@ai-sdk/provider';
|
|
9
9
|
import { APICallError } from '@ai-sdk/provider';
|
|
10
10
|
import {
|
|
@@ -21,8 +21,8 @@ import type { GatewayConfig } from './gateway-config';
|
|
|
21
21
|
import { asGatewayError } from './errors';
|
|
22
22
|
import { parseAuthMethod } from './errors/parse-auth-method';
|
|
23
23
|
|
|
24
|
-
export class GatewayVideoModel implements
|
|
25
|
-
readonly specificationVersion = '
|
|
24
|
+
export class GatewayVideoModel implements Experimental_VideoModelV4 {
|
|
25
|
+
readonly specificationVersion = 'v4' as const;
|
|
26
26
|
// Set a very large number to prevent client-side splitting of requests
|
|
27
27
|
readonly maxVideosPerCall = Number.MAX_SAFE_INTEGER;
|
|
28
28
|
|
|
@@ -50,10 +50,10 @@ export class GatewayVideoModel implements Experimental_VideoModelV3 {
|
|
|
50
50
|
providerOptions,
|
|
51
51
|
headers,
|
|
52
52
|
abortSignal,
|
|
53
|
-
}:
|
|
54
|
-
videos: Array<
|
|
55
|
-
warnings: Array<
|
|
56
|
-
providerMetadata?:
|
|
53
|
+
}: Experimental_VideoModelV4CallOptions): Promise<{
|
|
54
|
+
videos: Array<Experimental_VideoModelV4VideoData>;
|
|
55
|
+
warnings: Array<SharedV4Warning>;
|
|
56
|
+
providerMetadata?: SharedV4ProviderMetadata;
|
|
57
57
|
response: {
|
|
58
58
|
timestamp: Date;
|
|
59
59
|
modelId: string;
|
|
@@ -170,7 +170,7 @@ export class GatewayVideoModel implements Experimental_VideoModelV3 {
|
|
|
170
170
|
videos: responseBody.videos,
|
|
171
171
|
warnings: responseBody.warnings ?? [],
|
|
172
172
|
providerMetadata:
|
|
173
|
-
responseBody.providerMetadata as
|
|
173
|
+
responseBody.providerMetadata as SharedV4ProviderMetadata,
|
|
174
174
|
response: {
|
|
175
175
|
timestamp: new Date(),
|
|
176
176
|
modelId: this.modelId,
|
|
@@ -188,13 +188,13 @@ export class GatewayVideoModel implements Experimental_VideoModelV3 {
|
|
|
188
188
|
|
|
189
189
|
private getModelConfigHeaders() {
|
|
190
190
|
return {
|
|
191
|
-
'ai-video-model-specification-version': '
|
|
191
|
+
'ai-video-model-specification-version': '4',
|
|
192
192
|
'ai-model-id': this.modelId,
|
|
193
193
|
};
|
|
194
194
|
}
|
|
195
195
|
}
|
|
196
196
|
|
|
197
|
-
function maybeEncodeVideoFile(file:
|
|
197
|
+
function maybeEncodeVideoFile(file: Experimental_VideoModelV4File) {
|
|
198
198
|
if (file.type === 'file' && file.data instanceof Uint8Array) {
|
|
199
199
|
return {
|
|
200
200
|
...file,
|
package/src/index.ts
CHANGED
|
@@ -1,10 +1,20 @@
|
|
|
1
1
|
export type { GatewayModelId } from './gateway-language-model-settings';
|
|
2
|
+
export type { GatewayRerankingModelId } from './gateway-reranking-model-settings';
|
|
2
3
|
export type { GatewayVideoModelId } from './gateway-video-model-settings';
|
|
3
4
|
export type {
|
|
4
5
|
GatewayLanguageModelEntry,
|
|
5
6
|
GatewayLanguageModelSpecification,
|
|
6
7
|
} from './gateway-model-entry';
|
|
7
8
|
export type { GatewayCreditsResponse } from './gateway-fetch-metadata';
|
|
9
|
+
export type {
|
|
10
|
+
GatewaySpendReportParams,
|
|
11
|
+
GatewaySpendReportRow,
|
|
12
|
+
GatewaySpendReportResponse,
|
|
13
|
+
} from './gateway-spend-report';
|
|
14
|
+
export type {
|
|
15
|
+
GatewayGenerationInfoParams,
|
|
16
|
+
GatewayGenerationInfo,
|
|
17
|
+
} from './gateway-generation-info';
|
|
8
18
|
export type { GatewayLanguageModelEntry as GatewayModelEntry } from './gateway-model-entry';
|
|
9
19
|
export {
|
|
10
20
|
createGatewayProvider,
|
|
@@ -16,9 +26,9 @@ export type {
|
|
|
16
26
|
GatewayProviderSettings,
|
|
17
27
|
} from './gateway-provider';
|
|
18
28
|
export type {
|
|
19
|
-
|
|
20
|
-
/** @deprecated Use `
|
|
21
|
-
|
|
29
|
+
GatewayProviderOptions,
|
|
30
|
+
/** @deprecated Use `GatewayProviderOptions` instead. */
|
|
31
|
+
GatewayProviderOptions as GatewayLanguageModelOptions,
|
|
22
32
|
} from './gateway-provider-options';
|
|
23
33
|
export {
|
|
24
34
|
GatewayError,
|