@ai-sdk/gateway 1.0.0-alpha.6
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 +10 -0
- package/LICENSE +13 -0
- package/README.md +36 -0
- package/dist/index.d.mts +67 -0
- package/dist/index.d.ts +67 -0
- package/dist/index.js +310 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +296 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +66 -0
package/CHANGELOG.md
ADDED
package/LICENSE
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Copyright 2023 Vercel, Inc.
|
|
2
|
+
|
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
you may not use this file except in compliance with the License.
|
|
5
|
+
You may obtain a copy of the License at
|
|
6
|
+
|
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
|
|
9
|
+
Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
See the License for the specific language governing permissions and
|
|
13
|
+
limitations under the License.
|
package/README.md
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# AI SDK - Gateway Provider
|
|
2
|
+
|
|
3
|
+
The Gateway provider for the [AI SDK](https://ai-sdk.dev/docs) allows the use of a wide variety of AI models and providers.
|
|
4
|
+
|
|
5
|
+
## Setup
|
|
6
|
+
|
|
7
|
+
The Gateway provider is available in the `@ai-sdk/gateway` module. You can install it with
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm i @ai-sdk/gateway
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Provider Instance
|
|
14
|
+
|
|
15
|
+
You can import the default provider instance `gateway` from `@ai-sdk/gateway`:
|
|
16
|
+
|
|
17
|
+
```ts
|
|
18
|
+
import { gateway } from '@ai-sdk/gateway';
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Example
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
import { gateway } from '@ai-sdk/gateway';
|
|
25
|
+
import { generateText } from 'ai';
|
|
26
|
+
|
|
27
|
+
const { text } = await generateText({
|
|
28
|
+
model: gateway('xai/grok-3-beta'),
|
|
29
|
+
prompt:
|
|
30
|
+
'Tell me about the history of the San Francisco Mission-style burrito.',
|
|
31
|
+
});
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Documentation
|
|
35
|
+
|
|
36
|
+
Please check out the [AI SDK documentation](https://ai-sdk.dev/docs) for more information.
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { LanguageModelV2, ProviderV2 } from '@ai-sdk/provider';
|
|
2
|
+
import { FetchFunction } from '@ai-sdk/provider-utils';
|
|
3
|
+
|
|
4
|
+
type GatewayModelId = 'anthropic/claude-3.5-haiku' | 'anthropic/claude-3.7-sonnet' | 'anthropic/claude-3.7-sonnet-reasoning' | 'anthropic/claude-4-opus-20250514' | 'anthropic/claude-4-sonnet-20250514' | 'anthropic/claude-v3-haiku' | 'anthropic/claude-v3-opus' | 'anthropic/claude-v3.5-sonnet' | 'bedrock/amazon.nova-lite-v1:0' | 'bedrock/amazon.nova-micro-v1:0' | 'bedrock/amazon.nova-pro-v1:0' | 'bedrock/claude-3-5-haiku-20241022' | 'bedrock/claude-3-5-sonnet-20240620-v1' | 'bedrock/claude-3-5-sonnet-20241022-v2' | 'bedrock/claude-3-7-sonnet-20250219' | 'bedrock/claude-3-haiku-20240307-v1' | 'bedrock/claude-4-opus-20250514-v1' | 'bedrock/claude-4-sonnet-20250514-v1' | 'bedrock/deepseek.r1-v1' | 'bedrock/meta.llama3-1-70b-instruct-v1' | 'bedrock/meta.llama3-1-8b-instruct-v1' | 'bedrock/meta.llama3-2-11b-instruct-v1' | 'bedrock/meta.llama3-2-1b-instruct-v1' | 'bedrock/meta.llama3-2-3b-instruct-v1' | 'bedrock/meta.llama3-2-90b-instruct-v1' | 'bedrock/meta.llama3-3-70b-instruct-v1' | 'bedrock/meta.llama4-maverick-17b-instruct-v1' | 'bedrock/meta.llama4-scout-17b-instruct-v1' | 'cerebras/deepseek-r1-distill-llama-70b' | 'cerebras/llama-3.3-70b' | 'cerebras/llama-4-scout-17b-16e-instruct' | 'cerebras/llama3.1-8b' | 'cerebras/qwen-3-32b' | 'cohere/command-a' | 'cohere/command-r' | 'cohere/command-r-plus' | 'deepinfra/llama-4-maverick-17b-128e-instruct-fp8' | 'deepinfra/llama-4-scout-17b-16e-instruct' | 'deepinfra/qwen3-14b' | 'deepinfra/qwen3-235b-a22b' | 'deepinfra/qwen3-30b-a3b' | 'deepinfra/qwen3-32b' | 'deepseek/chat' | 'deepseek/deepseek-r1' | 'fireworks/firefunction-v1' | 'fireworks/mixtral-8x22b-instruct' | 'fireworks/mixtral-8x7b-instruct' | 'fireworks/qwen3-235b-a22b' | 'fireworks/qwq-32b' | 'groq/deepseek-r1-distill-llama-70b' | 'groq/gemma2-9b-it' | 'groq/llama-3-70b-instruct' | 'groq/llama-3-8b-instruct' | 'groq/llama-3.1-8b' | 'groq/llama-3.2-1b' | 'groq/llama-3.3-70b-versatile' | 'groq/llama-4-scout-17b-16e-instruct' | 'groq/mistral-saba-24b' | 'groq/qwen-qwq-32b' | 'inception/mercury-coder-small' | 'mistral/codestral-2501' | 'mistral/ministral-3b-latest' | 'mistral/ministral-8b-latest' | 'mistral/mistral-large' | 'mistral/mistral-small' | 'mistral/mistral-small-2503' | 'mistral/pixtral-12b-2409' | 'mistral/pixtral-large-latest' | 'openai/gpt-3.5-turbo' | 'openai/gpt-3.5-turbo-instruct' | 'openai/gpt-4-turbo' | 'openai/gpt-4.1' | 'openai/gpt-4.1-mini' | 'openai/gpt-4.1-nano' | 'openai/gpt-4o' | 'openai/gpt-4o-mini' | 'openai/o3' | 'openai/o3-mini' | 'openai/o4-mini' | 'perplexity/sonar' | 'perplexity/sonar-pro' | 'perplexity/sonar-reasoning' | 'perplexity/sonar-reasoning-pro' | 'vertex/claude-3-5-haiku-20241022' | 'vertex/claude-3-5-sonnet-20240620' | 'vertex/claude-3-5-sonnet-v2-20241022' | 'vertex/claude-3-7-sonnet-20250219' | 'vertex/claude-3-haiku-20240307' | 'vertex/claude-3-opus-20240229' | 'vertex/claude-4-opus-20250514' | 'vertex/claude-4-sonnet-20250514' | 'vertex/gemini-2.0-flash-001' | 'vertex/gemini-2.0-flash-lite-001' | 'vertex/llama-4-maverick-17b-128e-instruct-maas' | 'vertex/llama-4-scout-17b-16e-instruct-maas' | 'xai/grok-2-1212' | 'xai/grok-2-vision-1212' | 'xai/grok-3-beta' | 'xai/grok-3-fast-beta' | 'xai/grok-3-mini-beta' | 'xai/grok-3-mini-fast-beta' | (string & {});
|
|
5
|
+
|
|
6
|
+
interface GatewayLanguageModelEntry {
|
|
7
|
+
/**
|
|
8
|
+
* The model id used by the remote provider in model settings and for specifying the
|
|
9
|
+
* intended model for text generation.
|
|
10
|
+
*/
|
|
11
|
+
id: string;
|
|
12
|
+
/**
|
|
13
|
+
* The display name of the model for presentation in user-facing contexts.
|
|
14
|
+
*/
|
|
15
|
+
name: string;
|
|
16
|
+
/**
|
|
17
|
+
* Additional AI SDK language model specifications for the model.
|
|
18
|
+
*/
|
|
19
|
+
specification: GatewayLanguageModelSpecification;
|
|
20
|
+
}
|
|
21
|
+
type GatewayLanguageModelSpecification = Pick<LanguageModelV2, 'specificationVersion' | 'provider' | 'modelId'>;
|
|
22
|
+
|
|
23
|
+
interface GatewayFetchMetadataResponse {
|
|
24
|
+
models: GatewayLanguageModelEntry[];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
interface GatewayProvider extends ProviderV2 {
|
|
28
|
+
(modelId: GatewayModelId): LanguageModelV2;
|
|
29
|
+
/**
|
|
30
|
+
Creates a model for text generation.
|
|
31
|
+
*/
|
|
32
|
+
languageModel(modelId: GatewayModelId): LanguageModelV2;
|
|
33
|
+
/**
|
|
34
|
+
Returns available providers and models for use with the remote provider.
|
|
35
|
+
*/
|
|
36
|
+
getAvailableModels(): Promise<GatewayFetchMetadataResponse>;
|
|
37
|
+
}
|
|
38
|
+
interface GatewayProviderSettings {
|
|
39
|
+
/**
|
|
40
|
+
The base URL prefix for API calls. Defaults to `https://ai-gateway.vercel.sh/v1/ai`.
|
|
41
|
+
*/
|
|
42
|
+
baseURL?: string;
|
|
43
|
+
/**
|
|
44
|
+
API key that is being sent using the `Authorization` header.
|
|
45
|
+
*/
|
|
46
|
+
apiKey?: string;
|
|
47
|
+
/**
|
|
48
|
+
Custom headers to include in the requests.
|
|
49
|
+
*/
|
|
50
|
+
headers?: Record<string, string>;
|
|
51
|
+
/**
|
|
52
|
+
Custom fetch implementation. You can use it as a middleware to intercept requests,
|
|
53
|
+
or to provide a custom fetch implementation for e.g. testing.
|
|
54
|
+
*/
|
|
55
|
+
fetch?: FetchFunction;
|
|
56
|
+
/**
|
|
57
|
+
How frequently to refresh the metadata cache in milliseconds.
|
|
58
|
+
*/
|
|
59
|
+
metadataCacheRefreshMillis?: number;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
Create a remote provider instance.
|
|
63
|
+
*/
|
|
64
|
+
declare function createGatewayProvider(options?: GatewayProviderSettings): GatewayProvider;
|
|
65
|
+
declare const gateway: GatewayProvider;
|
|
66
|
+
|
|
67
|
+
export { type GatewayLanguageModelEntry, type GatewayLanguageModelSpecification, type GatewayModelId, type GatewayProvider, type GatewayProviderSettings, createGatewayProvider, gateway };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { LanguageModelV2, ProviderV2 } from '@ai-sdk/provider';
|
|
2
|
+
import { FetchFunction } from '@ai-sdk/provider-utils';
|
|
3
|
+
|
|
4
|
+
type GatewayModelId = 'anthropic/claude-3.5-haiku' | 'anthropic/claude-3.7-sonnet' | 'anthropic/claude-3.7-sonnet-reasoning' | 'anthropic/claude-4-opus-20250514' | 'anthropic/claude-4-sonnet-20250514' | 'anthropic/claude-v3-haiku' | 'anthropic/claude-v3-opus' | 'anthropic/claude-v3.5-sonnet' | 'bedrock/amazon.nova-lite-v1:0' | 'bedrock/amazon.nova-micro-v1:0' | 'bedrock/amazon.nova-pro-v1:0' | 'bedrock/claude-3-5-haiku-20241022' | 'bedrock/claude-3-5-sonnet-20240620-v1' | 'bedrock/claude-3-5-sonnet-20241022-v2' | 'bedrock/claude-3-7-sonnet-20250219' | 'bedrock/claude-3-haiku-20240307-v1' | 'bedrock/claude-4-opus-20250514-v1' | 'bedrock/claude-4-sonnet-20250514-v1' | 'bedrock/deepseek.r1-v1' | 'bedrock/meta.llama3-1-70b-instruct-v1' | 'bedrock/meta.llama3-1-8b-instruct-v1' | 'bedrock/meta.llama3-2-11b-instruct-v1' | 'bedrock/meta.llama3-2-1b-instruct-v1' | 'bedrock/meta.llama3-2-3b-instruct-v1' | 'bedrock/meta.llama3-2-90b-instruct-v1' | 'bedrock/meta.llama3-3-70b-instruct-v1' | 'bedrock/meta.llama4-maverick-17b-instruct-v1' | 'bedrock/meta.llama4-scout-17b-instruct-v1' | 'cerebras/deepseek-r1-distill-llama-70b' | 'cerebras/llama-3.3-70b' | 'cerebras/llama-4-scout-17b-16e-instruct' | 'cerebras/llama3.1-8b' | 'cerebras/qwen-3-32b' | 'cohere/command-a' | 'cohere/command-r' | 'cohere/command-r-plus' | 'deepinfra/llama-4-maverick-17b-128e-instruct-fp8' | 'deepinfra/llama-4-scout-17b-16e-instruct' | 'deepinfra/qwen3-14b' | 'deepinfra/qwen3-235b-a22b' | 'deepinfra/qwen3-30b-a3b' | 'deepinfra/qwen3-32b' | 'deepseek/chat' | 'deepseek/deepseek-r1' | 'fireworks/firefunction-v1' | 'fireworks/mixtral-8x22b-instruct' | 'fireworks/mixtral-8x7b-instruct' | 'fireworks/qwen3-235b-a22b' | 'fireworks/qwq-32b' | 'groq/deepseek-r1-distill-llama-70b' | 'groq/gemma2-9b-it' | 'groq/llama-3-70b-instruct' | 'groq/llama-3-8b-instruct' | 'groq/llama-3.1-8b' | 'groq/llama-3.2-1b' | 'groq/llama-3.3-70b-versatile' | 'groq/llama-4-scout-17b-16e-instruct' | 'groq/mistral-saba-24b' | 'groq/qwen-qwq-32b' | 'inception/mercury-coder-small' | 'mistral/codestral-2501' | 'mistral/ministral-3b-latest' | 'mistral/ministral-8b-latest' | 'mistral/mistral-large' | 'mistral/mistral-small' | 'mistral/mistral-small-2503' | 'mistral/pixtral-12b-2409' | 'mistral/pixtral-large-latest' | 'openai/gpt-3.5-turbo' | 'openai/gpt-3.5-turbo-instruct' | 'openai/gpt-4-turbo' | 'openai/gpt-4.1' | 'openai/gpt-4.1-mini' | 'openai/gpt-4.1-nano' | 'openai/gpt-4o' | 'openai/gpt-4o-mini' | 'openai/o3' | 'openai/o3-mini' | 'openai/o4-mini' | 'perplexity/sonar' | 'perplexity/sonar-pro' | 'perplexity/sonar-reasoning' | 'perplexity/sonar-reasoning-pro' | 'vertex/claude-3-5-haiku-20241022' | 'vertex/claude-3-5-sonnet-20240620' | 'vertex/claude-3-5-sonnet-v2-20241022' | 'vertex/claude-3-7-sonnet-20250219' | 'vertex/claude-3-haiku-20240307' | 'vertex/claude-3-opus-20240229' | 'vertex/claude-4-opus-20250514' | 'vertex/claude-4-sonnet-20250514' | 'vertex/gemini-2.0-flash-001' | 'vertex/gemini-2.0-flash-lite-001' | 'vertex/llama-4-maverick-17b-128e-instruct-maas' | 'vertex/llama-4-scout-17b-16e-instruct-maas' | 'xai/grok-2-1212' | 'xai/grok-2-vision-1212' | 'xai/grok-3-beta' | 'xai/grok-3-fast-beta' | 'xai/grok-3-mini-beta' | 'xai/grok-3-mini-fast-beta' | (string & {});
|
|
5
|
+
|
|
6
|
+
interface GatewayLanguageModelEntry {
|
|
7
|
+
/**
|
|
8
|
+
* The model id used by the remote provider in model settings and for specifying the
|
|
9
|
+
* intended model for text generation.
|
|
10
|
+
*/
|
|
11
|
+
id: string;
|
|
12
|
+
/**
|
|
13
|
+
* The display name of the model for presentation in user-facing contexts.
|
|
14
|
+
*/
|
|
15
|
+
name: string;
|
|
16
|
+
/**
|
|
17
|
+
* Additional AI SDK language model specifications for the model.
|
|
18
|
+
*/
|
|
19
|
+
specification: GatewayLanguageModelSpecification;
|
|
20
|
+
}
|
|
21
|
+
type GatewayLanguageModelSpecification = Pick<LanguageModelV2, 'specificationVersion' | 'provider' | 'modelId'>;
|
|
22
|
+
|
|
23
|
+
interface GatewayFetchMetadataResponse {
|
|
24
|
+
models: GatewayLanguageModelEntry[];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
interface GatewayProvider extends ProviderV2 {
|
|
28
|
+
(modelId: GatewayModelId): LanguageModelV2;
|
|
29
|
+
/**
|
|
30
|
+
Creates a model for text generation.
|
|
31
|
+
*/
|
|
32
|
+
languageModel(modelId: GatewayModelId): LanguageModelV2;
|
|
33
|
+
/**
|
|
34
|
+
Returns available providers and models for use with the remote provider.
|
|
35
|
+
*/
|
|
36
|
+
getAvailableModels(): Promise<GatewayFetchMetadataResponse>;
|
|
37
|
+
}
|
|
38
|
+
interface GatewayProviderSettings {
|
|
39
|
+
/**
|
|
40
|
+
The base URL prefix for API calls. Defaults to `https://ai-gateway.vercel.sh/v1/ai`.
|
|
41
|
+
*/
|
|
42
|
+
baseURL?: string;
|
|
43
|
+
/**
|
|
44
|
+
API key that is being sent using the `Authorization` header.
|
|
45
|
+
*/
|
|
46
|
+
apiKey?: string;
|
|
47
|
+
/**
|
|
48
|
+
Custom headers to include in the requests.
|
|
49
|
+
*/
|
|
50
|
+
headers?: Record<string, string>;
|
|
51
|
+
/**
|
|
52
|
+
Custom fetch implementation. You can use it as a middleware to intercept requests,
|
|
53
|
+
or to provide a custom fetch implementation for e.g. testing.
|
|
54
|
+
*/
|
|
55
|
+
fetch?: FetchFunction;
|
|
56
|
+
/**
|
|
57
|
+
How frequently to refresh the metadata cache in milliseconds.
|
|
58
|
+
*/
|
|
59
|
+
metadataCacheRefreshMillis?: number;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
Create a remote provider instance.
|
|
63
|
+
*/
|
|
64
|
+
declare function createGatewayProvider(options?: GatewayProviderSettings): GatewayProvider;
|
|
65
|
+
declare const gateway: GatewayProvider;
|
|
66
|
+
|
|
67
|
+
export { type GatewayLanguageModelEntry, type GatewayLanguageModelSpecification, type GatewayModelId, type GatewayProvider, type GatewayProviderSettings, createGatewayProvider, gateway };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var src_exports = {};
|
|
22
|
+
__export(src_exports, {
|
|
23
|
+
createGatewayProvider: () => createGatewayProvider,
|
|
24
|
+
gateway: () => gateway
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(src_exports);
|
|
27
|
+
|
|
28
|
+
// src/gateway-provider.ts
|
|
29
|
+
var import_provider = require("@ai-sdk/provider");
|
|
30
|
+
var import_provider_utils3 = require("@ai-sdk/provider-utils");
|
|
31
|
+
var import_provider_utils4 = require("@ai-sdk/provider-utils");
|
|
32
|
+
|
|
33
|
+
// src/gateway-language-model.ts
|
|
34
|
+
var import_provider_utils = require("@ai-sdk/provider-utils");
|
|
35
|
+
var import_zod = require("zod");
|
|
36
|
+
var GatewayLanguageModel = class {
|
|
37
|
+
constructor(modelId, config) {
|
|
38
|
+
this.modelId = modelId;
|
|
39
|
+
this.config = config;
|
|
40
|
+
this.specificationVersion = "v2";
|
|
41
|
+
this.supportedUrls = { "*/*": [/.*/] };
|
|
42
|
+
}
|
|
43
|
+
get provider() {
|
|
44
|
+
return this.config.provider;
|
|
45
|
+
}
|
|
46
|
+
async doGenerate(options) {
|
|
47
|
+
const { abortSignal, ...body } = options;
|
|
48
|
+
const {
|
|
49
|
+
responseHeaders,
|
|
50
|
+
value: responseBody,
|
|
51
|
+
rawValue: rawResponse
|
|
52
|
+
} = await (0, import_provider_utils.postJsonToApi)({
|
|
53
|
+
url: this.getUrl(),
|
|
54
|
+
headers: (0, import_provider_utils.combineHeaders)(
|
|
55
|
+
await (0, import_provider_utils.resolve)(this.config.headers()),
|
|
56
|
+
options.headers,
|
|
57
|
+
this.getModelConfigHeaders(this.modelId, false),
|
|
58
|
+
this.config.o11yHeaders
|
|
59
|
+
),
|
|
60
|
+
body: this.maybeEncodeFileParts(body),
|
|
61
|
+
successfulResponseHandler: (0, import_provider_utils.createJsonResponseHandler)(import_zod.z.any()),
|
|
62
|
+
failedResponseHandler: (0, import_provider_utils.createJsonErrorResponseHandler)({
|
|
63
|
+
errorSchema: import_zod.z.any(),
|
|
64
|
+
errorToMessage: (data) => data
|
|
65
|
+
}),
|
|
66
|
+
...abortSignal && { abortSignal },
|
|
67
|
+
fetch: this.config.fetch
|
|
68
|
+
});
|
|
69
|
+
return {
|
|
70
|
+
...responseBody,
|
|
71
|
+
request: { body },
|
|
72
|
+
response: { headers: responseHeaders, body: rawResponse },
|
|
73
|
+
warnings: []
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
async doStream(options) {
|
|
77
|
+
const { abortSignal, ...body } = options;
|
|
78
|
+
const { value: response, responseHeaders } = await (0, import_provider_utils.postJsonToApi)({
|
|
79
|
+
url: this.getUrl(),
|
|
80
|
+
headers: (0, import_provider_utils.combineHeaders)(
|
|
81
|
+
await (0, import_provider_utils.resolve)(this.config.headers()),
|
|
82
|
+
options.headers,
|
|
83
|
+
this.getModelConfigHeaders(this.modelId, true),
|
|
84
|
+
this.config.o11yHeaders
|
|
85
|
+
),
|
|
86
|
+
body: this.maybeEncodeFileParts(body),
|
|
87
|
+
successfulResponseHandler: (0, import_provider_utils.createEventSourceResponseHandler)(import_zod.z.any()),
|
|
88
|
+
failedResponseHandler: (0, import_provider_utils.createJsonErrorResponseHandler)({
|
|
89
|
+
errorSchema: import_zod.z.any(),
|
|
90
|
+
errorToMessage: (data) => data
|
|
91
|
+
}),
|
|
92
|
+
...abortSignal && { abortSignal },
|
|
93
|
+
fetch: this.config.fetch
|
|
94
|
+
});
|
|
95
|
+
return {
|
|
96
|
+
stream: response.pipeThrough(
|
|
97
|
+
new TransformStream({
|
|
98
|
+
transform(chunk, controller) {
|
|
99
|
+
if (chunk.success) {
|
|
100
|
+
controller.enqueue(chunk.value);
|
|
101
|
+
} else {
|
|
102
|
+
controller.error(
|
|
103
|
+
chunk.error
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
})
|
|
108
|
+
),
|
|
109
|
+
request: { body },
|
|
110
|
+
response: { headers: responseHeaders }
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
isFilePart(part) {
|
|
114
|
+
return part && typeof part === "object" && "type" in part && part.type === "file";
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Encodes image parts in the prompt to base64. Mutates the passed options
|
|
118
|
+
* instance directly to avoid copying the image data.
|
|
119
|
+
* @param options - The options to encode.
|
|
120
|
+
* @returns The options with the image parts encoded.
|
|
121
|
+
*/
|
|
122
|
+
maybeEncodeFileParts(options) {
|
|
123
|
+
for (const message of options.prompt) {
|
|
124
|
+
for (const part of message.content) {
|
|
125
|
+
if (this.isFilePart(part)) {
|
|
126
|
+
const filePart = part;
|
|
127
|
+
if (filePart.data instanceof Uint8Array) {
|
|
128
|
+
const buffer = Uint8Array.from(filePart.data);
|
|
129
|
+
const base64Data = Buffer.from(buffer).toString("base64");
|
|
130
|
+
filePart.data = new URL(
|
|
131
|
+
`data:${filePart.mediaType || "application/octet-stream"};base64,${base64Data}`
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return options;
|
|
138
|
+
}
|
|
139
|
+
getUrl() {
|
|
140
|
+
return `${this.config.baseURL}/language-model`;
|
|
141
|
+
}
|
|
142
|
+
getModelConfigHeaders(modelId, streaming) {
|
|
143
|
+
return {
|
|
144
|
+
"ai-language-model-specification-version": "2",
|
|
145
|
+
"ai-language-model-id": modelId,
|
|
146
|
+
"ai-language-model-streaming": String(streaming)
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
// src/get-vercel-oidc-token.ts
|
|
152
|
+
async function getVercelOidcToken() {
|
|
153
|
+
var _a, _b;
|
|
154
|
+
const token = (_b = (_a = getContext().headers) == null ? void 0 : _a["x-vercel-oidc-token"]) != null ? _b : process.env.VERCEL_OIDC_TOKEN;
|
|
155
|
+
if (!token) {
|
|
156
|
+
throw new Error(
|
|
157
|
+
`The 'x-vercel-oidc-token' header is missing from the request. Do you have the OIDC option enabled in the Vercel project settings?`
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
return token;
|
|
161
|
+
}
|
|
162
|
+
var SYMBOL_FOR_REQ_CONTEXT = Symbol.for("@vercel/request-context");
|
|
163
|
+
function getContext() {
|
|
164
|
+
var _a, _b, _c;
|
|
165
|
+
const fromSymbol = globalThis;
|
|
166
|
+
return (_c = (_b = (_a = fromSymbol[SYMBOL_FOR_REQ_CONTEXT]) == null ? void 0 : _a.get) == null ? void 0 : _b.call(_a)) != null ? _c : {};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// src/gateway-fetch-metadata.ts
|
|
170
|
+
var import_provider_utils2 = require("@ai-sdk/provider-utils");
|
|
171
|
+
var import_zod2 = require("zod");
|
|
172
|
+
var GatewayFetchMetadata = class {
|
|
173
|
+
constructor(config) {
|
|
174
|
+
this.config = config;
|
|
175
|
+
}
|
|
176
|
+
async getAvailableModels() {
|
|
177
|
+
const { value } = await (0, import_provider_utils2.getFromApi)({
|
|
178
|
+
url: `${this.config.baseURL}/config`,
|
|
179
|
+
headers: await (0, import_provider_utils2.resolve)(this.config.headers()),
|
|
180
|
+
successfulResponseHandler: (0, import_provider_utils2.createJsonResponseHandler)(
|
|
181
|
+
gatewayFetchMetadataSchema
|
|
182
|
+
),
|
|
183
|
+
failedResponseHandler: (0, import_provider_utils2.createJsonErrorResponseHandler)({
|
|
184
|
+
errorSchema: import_zod2.z.any(),
|
|
185
|
+
errorToMessage: (data) => data
|
|
186
|
+
}),
|
|
187
|
+
fetch: this.config.fetch
|
|
188
|
+
});
|
|
189
|
+
return value;
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
var gatewayLanguageModelSpecificationSchema = import_zod2.z.object({
|
|
193
|
+
specificationVersion: import_zod2.z.literal("v2"),
|
|
194
|
+
provider: import_zod2.z.string(),
|
|
195
|
+
modelId: import_zod2.z.string()
|
|
196
|
+
});
|
|
197
|
+
var gatewayLanguageModelEntrySchema = import_zod2.z.object({
|
|
198
|
+
id: import_zod2.z.string(),
|
|
199
|
+
name: import_zod2.z.string(),
|
|
200
|
+
specification: gatewayLanguageModelSpecificationSchema
|
|
201
|
+
});
|
|
202
|
+
var gatewayFetchMetadataSchema = import_zod2.z.object({
|
|
203
|
+
models: import_zod2.z.array(gatewayLanguageModelEntrySchema)
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
// src/gateway-provider.ts
|
|
207
|
+
var AI_GATEWAY_PROTOCOL_VERSION = "0.0.1";
|
|
208
|
+
async function getGatewayAuthToken(options) {
|
|
209
|
+
var _a;
|
|
210
|
+
try {
|
|
211
|
+
return (_a = (0, import_provider_utils3.loadOptionalSetting)({
|
|
212
|
+
settingValue: options.apiKey,
|
|
213
|
+
environmentVariableName: "AI_GATEWAY_API_KEY"
|
|
214
|
+
})) != null ? _a : await getVercelOidcToken();
|
|
215
|
+
} catch (error) {
|
|
216
|
+
if (error instanceof Error && error.message.includes("'x-vercel-oidc-token' header is missing")) {
|
|
217
|
+
const enhancedError = new Error(
|
|
218
|
+
`Failed to get Vercel OIDC token for AI Gateway access.
|
|
219
|
+
The token is expected to be provided via the 'VERCEL_OIDC_TOKEN' environment variable. It expires every 12 hours.
|
|
220
|
+
- make sure your Vercel project settings have OIDC enabled
|
|
221
|
+
- if you're running locally with 'vercel dev' the token is automatically obtained and refreshed for you
|
|
222
|
+
- if you're running locally with your own dev server script you can fetch/update the token by running 'vercel env pull'
|
|
223
|
+
- in production or preview the token is automatically obtained and refreshed for you`
|
|
224
|
+
);
|
|
225
|
+
enhancedError.cause = error;
|
|
226
|
+
throw enhancedError;
|
|
227
|
+
}
|
|
228
|
+
throw error;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
function createGatewayProvider(options = {}) {
|
|
232
|
+
var _a, _b;
|
|
233
|
+
let pendingMetadata = null;
|
|
234
|
+
let metadataCache = null;
|
|
235
|
+
const cacheRefreshMillis = (_a = options.metadataCacheRefreshMillis) != null ? _a : 1e3 * 60 * 5;
|
|
236
|
+
let lastFetchTime = 0;
|
|
237
|
+
const baseURL = (_b = (0, import_provider_utils4.withoutTrailingSlash)(options.baseURL)) != null ? _b : "https://ai-gateway.vercel.sh/v1/ai";
|
|
238
|
+
const getHeaders = async () => {
|
|
239
|
+
return {
|
|
240
|
+
Authorization: `Bearer ${await getGatewayAuthToken(options)}`,
|
|
241
|
+
"ai-gateway-protocol-version": AI_GATEWAY_PROTOCOL_VERSION,
|
|
242
|
+
...options.headers
|
|
243
|
+
};
|
|
244
|
+
};
|
|
245
|
+
const createLanguageModel = (modelId) => {
|
|
246
|
+
const deploymentId = (0, import_provider_utils3.loadOptionalSetting)({
|
|
247
|
+
settingValue: void 0,
|
|
248
|
+
environmentVariableName: "DEPLOYMENT_ID"
|
|
249
|
+
});
|
|
250
|
+
const environment = (0, import_provider_utils3.loadOptionalSetting)({
|
|
251
|
+
settingValue: void 0,
|
|
252
|
+
environmentVariableName: "VERCEL_ENV"
|
|
253
|
+
});
|
|
254
|
+
const region = (0, import_provider_utils3.loadOptionalSetting)({
|
|
255
|
+
settingValue: void 0,
|
|
256
|
+
environmentVariableName: "VERCEL_REGION"
|
|
257
|
+
});
|
|
258
|
+
return new GatewayLanguageModel(modelId, {
|
|
259
|
+
provider: "gateway",
|
|
260
|
+
baseURL,
|
|
261
|
+
headers: getHeaders,
|
|
262
|
+
fetch: options.fetch,
|
|
263
|
+
o11yHeaders: {
|
|
264
|
+
...deploymentId && { "ai-o11y-deployment-id": deploymentId },
|
|
265
|
+
...environment && { "ai-o11y-environment": environment },
|
|
266
|
+
...region && { "ai-o11y-region": region }
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
};
|
|
270
|
+
const getAvailableModels = async () => {
|
|
271
|
+
var _a2, _b2, _c;
|
|
272
|
+
const now = (_c = (_b2 = (_a2 = options._internal) == null ? void 0 : _a2.currentDate) == null ? void 0 : _b2.call(_a2).getTime()) != null ? _c : Date.now();
|
|
273
|
+
if (!pendingMetadata || now - lastFetchTime > cacheRefreshMillis) {
|
|
274
|
+
lastFetchTime = now;
|
|
275
|
+
pendingMetadata = new GatewayFetchMetadata({
|
|
276
|
+
baseURL,
|
|
277
|
+
headers: getHeaders,
|
|
278
|
+
fetch: options.fetch
|
|
279
|
+
}).getAvailableModels().then((metadata) => {
|
|
280
|
+
metadataCache = metadata;
|
|
281
|
+
return metadata;
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
return metadataCache ? Promise.resolve(metadataCache) : pendingMetadata;
|
|
285
|
+
};
|
|
286
|
+
const provider = function(modelId) {
|
|
287
|
+
if (new.target) {
|
|
288
|
+
throw new Error(
|
|
289
|
+
"The Gateway Provider model function cannot be called with the new keyword."
|
|
290
|
+
);
|
|
291
|
+
}
|
|
292
|
+
return createLanguageModel(modelId);
|
|
293
|
+
};
|
|
294
|
+
provider.getAvailableModels = getAvailableModels;
|
|
295
|
+
provider.imageModel = (modelId) => {
|
|
296
|
+
throw new import_provider.NoSuchModelError({ modelId, modelType: "imageModel" });
|
|
297
|
+
};
|
|
298
|
+
provider.languageModel = createLanguageModel;
|
|
299
|
+
provider.textEmbeddingModel = (modelId) => {
|
|
300
|
+
throw new import_provider.NoSuchModelError({ modelId, modelType: "textEmbeddingModel" });
|
|
301
|
+
};
|
|
302
|
+
return provider;
|
|
303
|
+
}
|
|
304
|
+
var gateway = createGatewayProvider();
|
|
305
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
306
|
+
0 && (module.exports = {
|
|
307
|
+
createGatewayProvider,
|
|
308
|
+
gateway
|
|
309
|
+
});
|
|
310
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/gateway-provider.ts","../src/gateway-language-model.ts","../src/get-vercel-oidc-token.ts","../src/gateway-fetch-metadata.ts"],"sourcesContent":["export type { GatewayModelId } from './gateway-language-model-settings';\nexport type {\n GatewayLanguageModelEntry,\n GatewayLanguageModelSpecification,\n} from './gateway-model-entry';\nexport { createGatewayProvider, gateway } from './gateway-provider';\nexport type {\n GatewayProvider,\n GatewayProviderSettings,\n} from './gateway-provider';\n","import type { LanguageModelV2, ProviderV2 } from '@ai-sdk/provider';\nimport { NoSuchModelError } from '@ai-sdk/provider';\nimport { loadOptionalSetting } from '@ai-sdk/provider-utils';\nimport {\n type FetchFunction,\n withoutTrailingSlash,\n} from '@ai-sdk/provider-utils';\nimport { GatewayLanguageModel } from './gateway-language-model';\nimport type { GatewayModelId } from './gateway-language-model-settings';\nimport { getVercelOidcToken } from './get-vercel-oidc-token';\nimport {\n GatewayFetchMetadata,\n type GatewayFetchMetadataResponse,\n} from './gateway-fetch-metadata';\n\nexport interface GatewayProvider extends ProviderV2 {\n (modelId: GatewayModelId): LanguageModelV2;\n\n /**\nCreates a model for text generation.\n*/\n languageModel(modelId: GatewayModelId): LanguageModelV2;\n\n /**\nReturns available providers and models for use with the remote provider.\n */\n getAvailableModels(): Promise<GatewayFetchMetadataResponse>;\n}\n\nexport interface GatewayProviderSettings {\n /**\nThe base URL prefix for API calls. Defaults to `https://ai-gateway.vercel.sh/v1/ai`.\n */\n baseURL?: string;\n\n /**\nAPI key that is being sent using the `Authorization` header.\n */\n apiKey?: string;\n\n /**\nCustom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\nCustom fetch implementation. You can use it as a middleware to intercept requests,\nor to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n\n /**\nHow frequently to refresh the metadata cache in milliseconds.\n */\n metadataCacheRefreshMillis?: number;\n\n /**\n * @internal For testing purposes only\n */\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nconst AI_GATEWAY_PROTOCOL_VERSION = '0.0.1';\n\nexport async function getGatewayAuthToken(options: GatewayProviderSettings) {\n try {\n return (\n loadOptionalSetting({\n settingValue: options.apiKey,\n environmentVariableName: 'AI_GATEWAY_API_KEY',\n }) ?? (await getVercelOidcToken())\n );\n } catch (error: unknown) {\n if (\n error instanceof Error &&\n error.message.includes(\"'x-vercel-oidc-token' header is missing\")\n ) {\n // The missing vercel oidc token error has an obtuse message that doesn't\n // provide much context about what to do for an AI Gateway user, so we\n // intervene to provide more guidance and then rethrow.\n const enhancedError = new Error(\n `Failed to get Vercel OIDC token for AI Gateway access.\nThe token is expected to be provided via the 'VERCEL_OIDC_TOKEN' environment variable. It expires every 12 hours.\n- make sure your Vercel project settings have OIDC enabled\n- if you're running locally with 'vercel dev' the token is automatically obtained and refreshed for you\n- if you're running locally with your own dev server script you can fetch/update the token by running 'vercel env pull'\n- in production or preview the token is automatically obtained and refreshed for you`,\n );\n (enhancedError as Error & { cause: unknown }).cause = error;\n throw enhancedError;\n }\n throw error;\n }\n}\n\n/**\nCreate a remote provider instance.\n */\nexport function createGatewayProvider(\n options: GatewayProviderSettings = {},\n): GatewayProvider {\n let pendingMetadata: Promise<GatewayFetchMetadataResponse> | null = null;\n let metadataCache: GatewayFetchMetadataResponse | null = null;\n const cacheRefreshMillis =\n options.metadataCacheRefreshMillis ?? 1000 * 60 * 5;\n let lastFetchTime = 0;\n\n const baseURL =\n withoutTrailingSlash(options.baseURL) ??\n 'https://ai-gateway.vercel.sh/v1/ai';\n\n const getHeaders = async () => {\n return {\n Authorization: `Bearer ${await getGatewayAuthToken(options)}`,\n 'ai-gateway-protocol-version': AI_GATEWAY_PROTOCOL_VERSION,\n ...options.headers,\n };\n };\n\n const createLanguageModel = (modelId: GatewayModelId) => {\n const deploymentId = loadOptionalSetting({\n settingValue: undefined,\n environmentVariableName: 'DEPLOYMENT_ID',\n });\n const environment = loadOptionalSetting({\n settingValue: undefined,\n environmentVariableName: 'VERCEL_ENV',\n });\n const region = loadOptionalSetting({\n settingValue: undefined,\n environmentVariableName: 'VERCEL_REGION',\n });\n return new GatewayLanguageModel(modelId, {\n provider: 'gateway',\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n o11yHeaders: {\n ...(deploymentId && { 'ai-o11y-deployment-id': deploymentId }),\n ...(environment && { 'ai-o11y-environment': environment }),\n ...(region && { 'ai-o11y-region': region }),\n },\n });\n };\n\n const getAvailableModels = async () => {\n const now = options._internal?.currentDate?.().getTime() ?? Date.now();\n if (!pendingMetadata || now - lastFetchTime > cacheRefreshMillis) {\n lastFetchTime = now;\n pendingMetadata = new GatewayFetchMetadata({\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n })\n .getAvailableModels()\n .then(metadata => {\n metadataCache = metadata;\n return metadata;\n });\n }\n\n return metadataCache ? Promise.resolve(metadataCache) : pendingMetadata;\n };\n\n const provider = function (modelId: GatewayModelId) {\n if (new.target) {\n throw new Error(\n 'The Gateway Provider model function cannot be called with the new keyword.',\n );\n }\n\n return createLanguageModel(modelId);\n };\n\n provider.getAvailableModels = getAvailableModels;\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n provider.languageModel = createLanguageModel;\n provider.textEmbeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'textEmbeddingModel' });\n };\n\n return provider;\n}\n\nexport const gateway = createGatewayProvider();\n","import type {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n LanguageModelV2FilePart,\n LanguageModelV2StreamPart,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n postJsonToApi,\n resolve,\n type ParseResult,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\nimport type { GatewayConfig } from './gateway-config';\nimport type { GatewayModelId } from './gateway-language-model-settings';\nimport type { GatewayLanguageModelSpecification } from './gateway-model-entry';\n\ntype GatewayChatConfig = GatewayConfig & {\n provider: string;\n o11yHeaders: Record<string, string>;\n};\n\nexport class GatewayLanguageModel implements LanguageModelV2 {\n readonly specificationVersion = 'v2';\n readonly supportedUrls = { '*/*': [/.*/] };\n\n constructor(\n readonly modelId: GatewayModelId,\n private readonly config: GatewayChatConfig,\n ) {}\n\n get provider(): string {\n return this.config.provider;\n }\n\n async doGenerate(\n options: Parameters<LanguageModelV2['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<LanguageModelV2['doGenerate']>>> {\n const { abortSignal, ...body } = options;\n const {\n responseHeaders,\n value: responseBody,\n rawValue: rawResponse,\n } = await postJsonToApi({\n url: this.getUrl(),\n headers: combineHeaders(\n await resolve(this.config.headers()),\n options.headers,\n this.getModelConfigHeaders(this.modelId, false),\n this.config.o11yHeaders,\n ),\n body: this.maybeEncodeFileParts(body),\n successfulResponseHandler: createJsonResponseHandler(z.any()),\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: z.any(),\n errorToMessage: data => data,\n }),\n ...(abortSignal && { abortSignal }),\n fetch: this.config.fetch,\n });\n\n return {\n ...responseBody,\n request: { body },\n response: { headers: responseHeaders, body: rawResponse },\n warnings: [],\n };\n }\n\n async doStream(\n options: Parameters<LanguageModelV2['doStream']>[0],\n ): Promise<Awaited<ReturnType<LanguageModelV2['doStream']>>> {\n const { abortSignal, ...body } = options;\n\n const { value: response, responseHeaders } = await postJsonToApi({\n url: this.getUrl(),\n headers: combineHeaders(\n await resolve(this.config.headers()),\n options.headers,\n this.getModelConfigHeaders(this.modelId, true),\n this.config.o11yHeaders,\n ),\n body: this.maybeEncodeFileParts(body),\n successfulResponseHandler: createEventSourceResponseHandler(z.any()),\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: z.any(),\n errorToMessage: data => data,\n }),\n ...(abortSignal && { abortSignal }),\n fetch: this.config.fetch,\n });\n\n return {\n stream: response.pipeThrough(\n new TransformStream<\n ParseResult<LanguageModelV2StreamPart>,\n LanguageModelV2StreamPart\n >({\n transform(chunk, controller) {\n if (chunk.success) {\n controller.enqueue(chunk.value);\n } else {\n controller.error(\n (chunk as { success: false; error: unknown }).error,\n );\n }\n },\n }),\n ),\n request: { body },\n response: { headers: responseHeaders },\n };\n }\n\n private isFilePart(part: unknown) {\n return (\n part && typeof part === 'object' && 'type' in part && part.type === 'file'\n );\n }\n\n /**\n * Encodes image parts in the prompt to base64. Mutates the passed options\n * instance directly to avoid copying the image data.\n * @param options - The options to encode.\n * @returns The options with the image parts encoded.\n */\n private maybeEncodeFileParts(options: LanguageModelV2CallOptions) {\n for (const message of options.prompt) {\n for (const part of message.content) {\n if (this.isFilePart(part)) {\n const filePart = part as LanguageModelV2FilePart;\n // If the image part is a URL it will get cleanly converted to a string.\n // If it's a binary image attachment we convert it to a data url.\n // In either case, server-side we should only ever see URLs as strings.\n if (filePart.data instanceof Uint8Array) {\n const buffer = Uint8Array.from(filePart.data);\n const base64Data = Buffer.from(buffer).toString('base64');\n filePart.data = new URL(\n `data:${filePart.mediaType || 'application/octet-stream'};base64,${base64Data}`,\n );\n }\n }\n }\n }\n return options;\n }\n\n private getUrl() {\n return `${this.config.baseURL}/language-model`;\n }\n\n private getModelConfigHeaders(modelId: string, streaming: boolean) {\n return {\n 'ai-language-model-specification-version': '2',\n 'ai-language-model-id': modelId,\n 'ai-language-model-streaming': String(streaming),\n };\n }\n}\n","export async function getVercelOidcToken(): Promise<string> {\n const token =\n getContext().headers?.['x-vercel-oidc-token'] ??\n process.env.VERCEL_OIDC_TOKEN;\n\n if (!token) {\n throw new Error(\n `The 'x-vercel-oidc-token' header is missing from the request. Do you have the OIDC option enabled in the Vercel project settings?`,\n );\n }\n\n return token;\n}\n\ntype Context = {\n headers?: Record<string, string>;\n};\n\nconst SYMBOL_FOR_REQ_CONTEXT = Symbol.for('@vercel/request-context');\n\nfunction getContext(): Context {\n const fromSymbol: typeof globalThis & {\n [SYMBOL_FOR_REQ_CONTEXT]?: { get?: () => Context };\n } = globalThis;\n return fromSymbol[SYMBOL_FOR_REQ_CONTEXT]?.get?.() ?? {};\n}\n","import {\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n getFromApi,\n resolve,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\nimport type { GatewayConfig } from './gateway-config';\nimport type { GatewayLanguageModelEntry } from './gateway-model-entry';\n\ntype GatewayFetchMetadataConfig = GatewayConfig;\n\nexport interface GatewayFetchMetadataResponse {\n models: GatewayLanguageModelEntry[];\n}\n\nexport class GatewayFetchMetadata {\n constructor(private readonly config: GatewayFetchMetadataConfig) {}\n\n async getAvailableModels(): Promise<GatewayFetchMetadataResponse> {\n const { value } = await getFromApi({\n url: `${this.config.baseURL}/config`,\n headers: await resolve(this.config.headers()),\n successfulResponseHandler: createJsonResponseHandler(\n gatewayFetchMetadataSchema,\n ),\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: z.any(),\n errorToMessage: data => data,\n }),\n fetch: this.config.fetch,\n });\n\n return value as GatewayFetchMetadataResponse;\n }\n}\n\nconst gatewayLanguageModelSpecificationSchema = z.object({\n specificationVersion: z.literal('v2'),\n provider: z.string(),\n modelId: z.string(),\n});\n\nconst gatewayLanguageModelEntrySchema = z.object({\n id: z.string(),\n name: z.string(),\n specification: gatewayLanguageModelSpecificationSchema,\n});\n\nconst gatewayFetchMetadataSchema = z.object({\n models: z.array(gatewayLanguageModelEntrySchema),\n});\n"],"mappings":"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","names":["import_provider_utils","import_provider_utils","import_zod","_a","_b"]}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
// src/gateway-provider.ts
|
|
2
|
+
import { NoSuchModelError } from "@ai-sdk/provider";
|
|
3
|
+
import { loadOptionalSetting } from "@ai-sdk/provider-utils";
|
|
4
|
+
import {
|
|
5
|
+
withoutTrailingSlash
|
|
6
|
+
} from "@ai-sdk/provider-utils";
|
|
7
|
+
|
|
8
|
+
// src/gateway-language-model.ts
|
|
9
|
+
import {
|
|
10
|
+
combineHeaders,
|
|
11
|
+
createEventSourceResponseHandler,
|
|
12
|
+
createJsonErrorResponseHandler,
|
|
13
|
+
createJsonResponseHandler,
|
|
14
|
+
postJsonToApi,
|
|
15
|
+
resolve
|
|
16
|
+
} from "@ai-sdk/provider-utils";
|
|
17
|
+
import { z } from "zod";
|
|
18
|
+
var GatewayLanguageModel = class {
|
|
19
|
+
constructor(modelId, config) {
|
|
20
|
+
this.modelId = modelId;
|
|
21
|
+
this.config = config;
|
|
22
|
+
this.specificationVersion = "v2";
|
|
23
|
+
this.supportedUrls = { "*/*": [/.*/] };
|
|
24
|
+
}
|
|
25
|
+
get provider() {
|
|
26
|
+
return this.config.provider;
|
|
27
|
+
}
|
|
28
|
+
async doGenerate(options) {
|
|
29
|
+
const { abortSignal, ...body } = options;
|
|
30
|
+
const {
|
|
31
|
+
responseHeaders,
|
|
32
|
+
value: responseBody,
|
|
33
|
+
rawValue: rawResponse
|
|
34
|
+
} = await postJsonToApi({
|
|
35
|
+
url: this.getUrl(),
|
|
36
|
+
headers: combineHeaders(
|
|
37
|
+
await resolve(this.config.headers()),
|
|
38
|
+
options.headers,
|
|
39
|
+
this.getModelConfigHeaders(this.modelId, false),
|
|
40
|
+
this.config.o11yHeaders
|
|
41
|
+
),
|
|
42
|
+
body: this.maybeEncodeFileParts(body),
|
|
43
|
+
successfulResponseHandler: createJsonResponseHandler(z.any()),
|
|
44
|
+
failedResponseHandler: createJsonErrorResponseHandler({
|
|
45
|
+
errorSchema: z.any(),
|
|
46
|
+
errorToMessage: (data) => data
|
|
47
|
+
}),
|
|
48
|
+
...abortSignal && { abortSignal },
|
|
49
|
+
fetch: this.config.fetch
|
|
50
|
+
});
|
|
51
|
+
return {
|
|
52
|
+
...responseBody,
|
|
53
|
+
request: { body },
|
|
54
|
+
response: { headers: responseHeaders, body: rawResponse },
|
|
55
|
+
warnings: []
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
async doStream(options) {
|
|
59
|
+
const { abortSignal, ...body } = options;
|
|
60
|
+
const { value: response, responseHeaders } = await postJsonToApi({
|
|
61
|
+
url: this.getUrl(),
|
|
62
|
+
headers: combineHeaders(
|
|
63
|
+
await resolve(this.config.headers()),
|
|
64
|
+
options.headers,
|
|
65
|
+
this.getModelConfigHeaders(this.modelId, true),
|
|
66
|
+
this.config.o11yHeaders
|
|
67
|
+
),
|
|
68
|
+
body: this.maybeEncodeFileParts(body),
|
|
69
|
+
successfulResponseHandler: createEventSourceResponseHandler(z.any()),
|
|
70
|
+
failedResponseHandler: createJsonErrorResponseHandler({
|
|
71
|
+
errorSchema: z.any(),
|
|
72
|
+
errorToMessage: (data) => data
|
|
73
|
+
}),
|
|
74
|
+
...abortSignal && { abortSignal },
|
|
75
|
+
fetch: this.config.fetch
|
|
76
|
+
});
|
|
77
|
+
return {
|
|
78
|
+
stream: response.pipeThrough(
|
|
79
|
+
new TransformStream({
|
|
80
|
+
transform(chunk, controller) {
|
|
81
|
+
if (chunk.success) {
|
|
82
|
+
controller.enqueue(chunk.value);
|
|
83
|
+
} else {
|
|
84
|
+
controller.error(
|
|
85
|
+
chunk.error
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
})
|
|
90
|
+
),
|
|
91
|
+
request: { body },
|
|
92
|
+
response: { headers: responseHeaders }
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
isFilePart(part) {
|
|
96
|
+
return part && typeof part === "object" && "type" in part && part.type === "file";
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Encodes image parts in the prompt to base64. Mutates the passed options
|
|
100
|
+
* instance directly to avoid copying the image data.
|
|
101
|
+
* @param options - The options to encode.
|
|
102
|
+
* @returns The options with the image parts encoded.
|
|
103
|
+
*/
|
|
104
|
+
maybeEncodeFileParts(options) {
|
|
105
|
+
for (const message of options.prompt) {
|
|
106
|
+
for (const part of message.content) {
|
|
107
|
+
if (this.isFilePart(part)) {
|
|
108
|
+
const filePart = part;
|
|
109
|
+
if (filePart.data instanceof Uint8Array) {
|
|
110
|
+
const buffer = Uint8Array.from(filePart.data);
|
|
111
|
+
const base64Data = Buffer.from(buffer).toString("base64");
|
|
112
|
+
filePart.data = new URL(
|
|
113
|
+
`data:${filePart.mediaType || "application/octet-stream"};base64,${base64Data}`
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return options;
|
|
120
|
+
}
|
|
121
|
+
getUrl() {
|
|
122
|
+
return `${this.config.baseURL}/language-model`;
|
|
123
|
+
}
|
|
124
|
+
getModelConfigHeaders(modelId, streaming) {
|
|
125
|
+
return {
|
|
126
|
+
"ai-language-model-specification-version": "2",
|
|
127
|
+
"ai-language-model-id": modelId,
|
|
128
|
+
"ai-language-model-streaming": String(streaming)
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
// src/get-vercel-oidc-token.ts
|
|
134
|
+
async function getVercelOidcToken() {
|
|
135
|
+
var _a, _b;
|
|
136
|
+
const token = (_b = (_a = getContext().headers) == null ? void 0 : _a["x-vercel-oidc-token"]) != null ? _b : process.env.VERCEL_OIDC_TOKEN;
|
|
137
|
+
if (!token) {
|
|
138
|
+
throw new Error(
|
|
139
|
+
`The 'x-vercel-oidc-token' header is missing from the request. Do you have the OIDC option enabled in the Vercel project settings?`
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
return token;
|
|
143
|
+
}
|
|
144
|
+
var SYMBOL_FOR_REQ_CONTEXT = Symbol.for("@vercel/request-context");
|
|
145
|
+
function getContext() {
|
|
146
|
+
var _a, _b, _c;
|
|
147
|
+
const fromSymbol = globalThis;
|
|
148
|
+
return (_c = (_b = (_a = fromSymbol[SYMBOL_FOR_REQ_CONTEXT]) == null ? void 0 : _a.get) == null ? void 0 : _b.call(_a)) != null ? _c : {};
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// src/gateway-fetch-metadata.ts
|
|
152
|
+
import {
|
|
153
|
+
createJsonErrorResponseHandler as createJsonErrorResponseHandler2,
|
|
154
|
+
createJsonResponseHandler as createJsonResponseHandler2,
|
|
155
|
+
getFromApi,
|
|
156
|
+
resolve as resolve2
|
|
157
|
+
} from "@ai-sdk/provider-utils";
|
|
158
|
+
import { z as z2 } from "zod";
|
|
159
|
+
var GatewayFetchMetadata = class {
|
|
160
|
+
constructor(config) {
|
|
161
|
+
this.config = config;
|
|
162
|
+
}
|
|
163
|
+
async getAvailableModels() {
|
|
164
|
+
const { value } = await getFromApi({
|
|
165
|
+
url: `${this.config.baseURL}/config`,
|
|
166
|
+
headers: await resolve2(this.config.headers()),
|
|
167
|
+
successfulResponseHandler: createJsonResponseHandler2(
|
|
168
|
+
gatewayFetchMetadataSchema
|
|
169
|
+
),
|
|
170
|
+
failedResponseHandler: createJsonErrorResponseHandler2({
|
|
171
|
+
errorSchema: z2.any(),
|
|
172
|
+
errorToMessage: (data) => data
|
|
173
|
+
}),
|
|
174
|
+
fetch: this.config.fetch
|
|
175
|
+
});
|
|
176
|
+
return value;
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
var gatewayLanguageModelSpecificationSchema = z2.object({
|
|
180
|
+
specificationVersion: z2.literal("v2"),
|
|
181
|
+
provider: z2.string(),
|
|
182
|
+
modelId: z2.string()
|
|
183
|
+
});
|
|
184
|
+
var gatewayLanguageModelEntrySchema = z2.object({
|
|
185
|
+
id: z2.string(),
|
|
186
|
+
name: z2.string(),
|
|
187
|
+
specification: gatewayLanguageModelSpecificationSchema
|
|
188
|
+
});
|
|
189
|
+
var gatewayFetchMetadataSchema = z2.object({
|
|
190
|
+
models: z2.array(gatewayLanguageModelEntrySchema)
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
// src/gateway-provider.ts
|
|
194
|
+
var AI_GATEWAY_PROTOCOL_VERSION = "0.0.1";
|
|
195
|
+
async function getGatewayAuthToken(options) {
|
|
196
|
+
var _a;
|
|
197
|
+
try {
|
|
198
|
+
return (_a = loadOptionalSetting({
|
|
199
|
+
settingValue: options.apiKey,
|
|
200
|
+
environmentVariableName: "AI_GATEWAY_API_KEY"
|
|
201
|
+
})) != null ? _a : await getVercelOidcToken();
|
|
202
|
+
} catch (error) {
|
|
203
|
+
if (error instanceof Error && error.message.includes("'x-vercel-oidc-token' header is missing")) {
|
|
204
|
+
const enhancedError = new Error(
|
|
205
|
+
`Failed to get Vercel OIDC token for AI Gateway access.
|
|
206
|
+
The token is expected to be provided via the 'VERCEL_OIDC_TOKEN' environment variable. It expires every 12 hours.
|
|
207
|
+
- make sure your Vercel project settings have OIDC enabled
|
|
208
|
+
- if you're running locally with 'vercel dev' the token is automatically obtained and refreshed for you
|
|
209
|
+
- if you're running locally with your own dev server script you can fetch/update the token by running 'vercel env pull'
|
|
210
|
+
- in production or preview the token is automatically obtained and refreshed for you`
|
|
211
|
+
);
|
|
212
|
+
enhancedError.cause = error;
|
|
213
|
+
throw enhancedError;
|
|
214
|
+
}
|
|
215
|
+
throw error;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
function createGatewayProvider(options = {}) {
|
|
219
|
+
var _a, _b;
|
|
220
|
+
let pendingMetadata = null;
|
|
221
|
+
let metadataCache = null;
|
|
222
|
+
const cacheRefreshMillis = (_a = options.metadataCacheRefreshMillis) != null ? _a : 1e3 * 60 * 5;
|
|
223
|
+
let lastFetchTime = 0;
|
|
224
|
+
const baseURL = (_b = withoutTrailingSlash(options.baseURL)) != null ? _b : "https://ai-gateway.vercel.sh/v1/ai";
|
|
225
|
+
const getHeaders = async () => {
|
|
226
|
+
return {
|
|
227
|
+
Authorization: `Bearer ${await getGatewayAuthToken(options)}`,
|
|
228
|
+
"ai-gateway-protocol-version": AI_GATEWAY_PROTOCOL_VERSION,
|
|
229
|
+
...options.headers
|
|
230
|
+
};
|
|
231
|
+
};
|
|
232
|
+
const createLanguageModel = (modelId) => {
|
|
233
|
+
const deploymentId = loadOptionalSetting({
|
|
234
|
+
settingValue: void 0,
|
|
235
|
+
environmentVariableName: "DEPLOYMENT_ID"
|
|
236
|
+
});
|
|
237
|
+
const environment = loadOptionalSetting({
|
|
238
|
+
settingValue: void 0,
|
|
239
|
+
environmentVariableName: "VERCEL_ENV"
|
|
240
|
+
});
|
|
241
|
+
const region = loadOptionalSetting({
|
|
242
|
+
settingValue: void 0,
|
|
243
|
+
environmentVariableName: "VERCEL_REGION"
|
|
244
|
+
});
|
|
245
|
+
return new GatewayLanguageModel(modelId, {
|
|
246
|
+
provider: "gateway",
|
|
247
|
+
baseURL,
|
|
248
|
+
headers: getHeaders,
|
|
249
|
+
fetch: options.fetch,
|
|
250
|
+
o11yHeaders: {
|
|
251
|
+
...deploymentId && { "ai-o11y-deployment-id": deploymentId },
|
|
252
|
+
...environment && { "ai-o11y-environment": environment },
|
|
253
|
+
...region && { "ai-o11y-region": region }
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
};
|
|
257
|
+
const getAvailableModels = async () => {
|
|
258
|
+
var _a2, _b2, _c;
|
|
259
|
+
const now = (_c = (_b2 = (_a2 = options._internal) == null ? void 0 : _a2.currentDate) == null ? void 0 : _b2.call(_a2).getTime()) != null ? _c : Date.now();
|
|
260
|
+
if (!pendingMetadata || now - lastFetchTime > cacheRefreshMillis) {
|
|
261
|
+
lastFetchTime = now;
|
|
262
|
+
pendingMetadata = new GatewayFetchMetadata({
|
|
263
|
+
baseURL,
|
|
264
|
+
headers: getHeaders,
|
|
265
|
+
fetch: options.fetch
|
|
266
|
+
}).getAvailableModels().then((metadata) => {
|
|
267
|
+
metadataCache = metadata;
|
|
268
|
+
return metadata;
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
return metadataCache ? Promise.resolve(metadataCache) : pendingMetadata;
|
|
272
|
+
};
|
|
273
|
+
const provider = function(modelId) {
|
|
274
|
+
if (new.target) {
|
|
275
|
+
throw new Error(
|
|
276
|
+
"The Gateway Provider model function cannot be called with the new keyword."
|
|
277
|
+
);
|
|
278
|
+
}
|
|
279
|
+
return createLanguageModel(modelId);
|
|
280
|
+
};
|
|
281
|
+
provider.getAvailableModels = getAvailableModels;
|
|
282
|
+
provider.imageModel = (modelId) => {
|
|
283
|
+
throw new NoSuchModelError({ modelId, modelType: "imageModel" });
|
|
284
|
+
};
|
|
285
|
+
provider.languageModel = createLanguageModel;
|
|
286
|
+
provider.textEmbeddingModel = (modelId) => {
|
|
287
|
+
throw new NoSuchModelError({ modelId, modelType: "textEmbeddingModel" });
|
|
288
|
+
};
|
|
289
|
+
return provider;
|
|
290
|
+
}
|
|
291
|
+
var gateway = createGatewayProvider();
|
|
292
|
+
export {
|
|
293
|
+
createGatewayProvider,
|
|
294
|
+
gateway
|
|
295
|
+
};
|
|
296
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/gateway-provider.ts","../src/gateway-language-model.ts","../src/get-vercel-oidc-token.ts","../src/gateway-fetch-metadata.ts"],"sourcesContent":["import type { LanguageModelV2, ProviderV2 } from '@ai-sdk/provider';\nimport { NoSuchModelError } from '@ai-sdk/provider';\nimport { loadOptionalSetting } from '@ai-sdk/provider-utils';\nimport {\n type FetchFunction,\n withoutTrailingSlash,\n} from '@ai-sdk/provider-utils';\nimport { GatewayLanguageModel } from './gateway-language-model';\nimport type { GatewayModelId } from './gateway-language-model-settings';\nimport { getVercelOidcToken } from './get-vercel-oidc-token';\nimport {\n GatewayFetchMetadata,\n type GatewayFetchMetadataResponse,\n} from './gateway-fetch-metadata';\n\nexport interface GatewayProvider extends ProviderV2 {\n (modelId: GatewayModelId): LanguageModelV2;\n\n /**\nCreates a model for text generation.\n*/\n languageModel(modelId: GatewayModelId): LanguageModelV2;\n\n /**\nReturns available providers and models for use with the remote provider.\n */\n getAvailableModels(): Promise<GatewayFetchMetadataResponse>;\n}\n\nexport interface GatewayProviderSettings {\n /**\nThe base URL prefix for API calls. Defaults to `https://ai-gateway.vercel.sh/v1/ai`.\n */\n baseURL?: string;\n\n /**\nAPI key that is being sent using the `Authorization` header.\n */\n apiKey?: string;\n\n /**\nCustom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\nCustom fetch implementation. You can use it as a middleware to intercept requests,\nor to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n\n /**\nHow frequently to refresh the metadata cache in milliseconds.\n */\n metadataCacheRefreshMillis?: number;\n\n /**\n * @internal For testing purposes only\n */\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nconst AI_GATEWAY_PROTOCOL_VERSION = '0.0.1';\n\nexport async function getGatewayAuthToken(options: GatewayProviderSettings) {\n try {\n return (\n loadOptionalSetting({\n settingValue: options.apiKey,\n environmentVariableName: 'AI_GATEWAY_API_KEY',\n }) ?? (await getVercelOidcToken())\n );\n } catch (error: unknown) {\n if (\n error instanceof Error &&\n error.message.includes(\"'x-vercel-oidc-token' header is missing\")\n ) {\n // The missing vercel oidc token error has an obtuse message that doesn't\n // provide much context about what to do for an AI Gateway user, so we\n // intervene to provide more guidance and then rethrow.\n const enhancedError = new Error(\n `Failed to get Vercel OIDC token for AI Gateway access.\nThe token is expected to be provided via the 'VERCEL_OIDC_TOKEN' environment variable. It expires every 12 hours.\n- make sure your Vercel project settings have OIDC enabled\n- if you're running locally with 'vercel dev' the token is automatically obtained and refreshed for you\n- if you're running locally with your own dev server script you can fetch/update the token by running 'vercel env pull'\n- in production or preview the token is automatically obtained and refreshed for you`,\n );\n (enhancedError as Error & { cause: unknown }).cause = error;\n throw enhancedError;\n }\n throw error;\n }\n}\n\n/**\nCreate a remote provider instance.\n */\nexport function createGatewayProvider(\n options: GatewayProviderSettings = {},\n): GatewayProvider {\n let pendingMetadata: Promise<GatewayFetchMetadataResponse> | null = null;\n let metadataCache: GatewayFetchMetadataResponse | null = null;\n const cacheRefreshMillis =\n options.metadataCacheRefreshMillis ?? 1000 * 60 * 5;\n let lastFetchTime = 0;\n\n const baseURL =\n withoutTrailingSlash(options.baseURL) ??\n 'https://ai-gateway.vercel.sh/v1/ai';\n\n const getHeaders = async () => {\n return {\n Authorization: `Bearer ${await getGatewayAuthToken(options)}`,\n 'ai-gateway-protocol-version': AI_GATEWAY_PROTOCOL_VERSION,\n ...options.headers,\n };\n };\n\n const createLanguageModel = (modelId: GatewayModelId) => {\n const deploymentId = loadOptionalSetting({\n settingValue: undefined,\n environmentVariableName: 'DEPLOYMENT_ID',\n });\n const environment = loadOptionalSetting({\n settingValue: undefined,\n environmentVariableName: 'VERCEL_ENV',\n });\n const region = loadOptionalSetting({\n settingValue: undefined,\n environmentVariableName: 'VERCEL_REGION',\n });\n return new GatewayLanguageModel(modelId, {\n provider: 'gateway',\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n o11yHeaders: {\n ...(deploymentId && { 'ai-o11y-deployment-id': deploymentId }),\n ...(environment && { 'ai-o11y-environment': environment }),\n ...(region && { 'ai-o11y-region': region }),\n },\n });\n };\n\n const getAvailableModels = async () => {\n const now = options._internal?.currentDate?.().getTime() ?? Date.now();\n if (!pendingMetadata || now - lastFetchTime > cacheRefreshMillis) {\n lastFetchTime = now;\n pendingMetadata = new GatewayFetchMetadata({\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n })\n .getAvailableModels()\n .then(metadata => {\n metadataCache = metadata;\n return metadata;\n });\n }\n\n return metadataCache ? Promise.resolve(metadataCache) : pendingMetadata;\n };\n\n const provider = function (modelId: GatewayModelId) {\n if (new.target) {\n throw new Error(\n 'The Gateway Provider model function cannot be called with the new keyword.',\n );\n }\n\n return createLanguageModel(modelId);\n };\n\n provider.getAvailableModels = getAvailableModels;\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n provider.languageModel = createLanguageModel;\n provider.textEmbeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'textEmbeddingModel' });\n };\n\n return provider;\n}\n\nexport const gateway = createGatewayProvider();\n","import type {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n LanguageModelV2FilePart,\n LanguageModelV2StreamPart,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n postJsonToApi,\n resolve,\n type ParseResult,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\nimport type { GatewayConfig } from './gateway-config';\nimport type { GatewayModelId } from './gateway-language-model-settings';\nimport type { GatewayLanguageModelSpecification } from './gateway-model-entry';\n\ntype GatewayChatConfig = GatewayConfig & {\n provider: string;\n o11yHeaders: Record<string, string>;\n};\n\nexport class GatewayLanguageModel implements LanguageModelV2 {\n readonly specificationVersion = 'v2';\n readonly supportedUrls = { '*/*': [/.*/] };\n\n constructor(\n readonly modelId: GatewayModelId,\n private readonly config: GatewayChatConfig,\n ) {}\n\n get provider(): string {\n return this.config.provider;\n }\n\n async doGenerate(\n options: Parameters<LanguageModelV2['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<LanguageModelV2['doGenerate']>>> {\n const { abortSignal, ...body } = options;\n const {\n responseHeaders,\n value: responseBody,\n rawValue: rawResponse,\n } = await postJsonToApi({\n url: this.getUrl(),\n headers: combineHeaders(\n await resolve(this.config.headers()),\n options.headers,\n this.getModelConfigHeaders(this.modelId, false),\n this.config.o11yHeaders,\n ),\n body: this.maybeEncodeFileParts(body),\n successfulResponseHandler: createJsonResponseHandler(z.any()),\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: z.any(),\n errorToMessage: data => data,\n }),\n ...(abortSignal && { abortSignal }),\n fetch: this.config.fetch,\n });\n\n return {\n ...responseBody,\n request: { body },\n response: { headers: responseHeaders, body: rawResponse },\n warnings: [],\n };\n }\n\n async doStream(\n options: Parameters<LanguageModelV2['doStream']>[0],\n ): Promise<Awaited<ReturnType<LanguageModelV2['doStream']>>> {\n const { abortSignal, ...body } = options;\n\n const { value: response, responseHeaders } = await postJsonToApi({\n url: this.getUrl(),\n headers: combineHeaders(\n await resolve(this.config.headers()),\n options.headers,\n this.getModelConfigHeaders(this.modelId, true),\n this.config.o11yHeaders,\n ),\n body: this.maybeEncodeFileParts(body),\n successfulResponseHandler: createEventSourceResponseHandler(z.any()),\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: z.any(),\n errorToMessage: data => data,\n }),\n ...(abortSignal && { abortSignal }),\n fetch: this.config.fetch,\n });\n\n return {\n stream: response.pipeThrough(\n new TransformStream<\n ParseResult<LanguageModelV2StreamPart>,\n LanguageModelV2StreamPart\n >({\n transform(chunk, controller) {\n if (chunk.success) {\n controller.enqueue(chunk.value);\n } else {\n controller.error(\n (chunk as { success: false; error: unknown }).error,\n );\n }\n },\n }),\n ),\n request: { body },\n response: { headers: responseHeaders },\n };\n }\n\n private isFilePart(part: unknown) {\n return (\n part && typeof part === 'object' && 'type' in part && part.type === 'file'\n );\n }\n\n /**\n * Encodes image parts in the prompt to base64. Mutates the passed options\n * instance directly to avoid copying the image data.\n * @param options - The options to encode.\n * @returns The options with the image parts encoded.\n */\n private maybeEncodeFileParts(options: LanguageModelV2CallOptions) {\n for (const message of options.prompt) {\n for (const part of message.content) {\n if (this.isFilePart(part)) {\n const filePart = part as LanguageModelV2FilePart;\n // If the image part is a URL it will get cleanly converted to a string.\n // If it's a binary image attachment we convert it to a data url.\n // In either case, server-side we should only ever see URLs as strings.\n if (filePart.data instanceof Uint8Array) {\n const buffer = Uint8Array.from(filePart.data);\n const base64Data = Buffer.from(buffer).toString('base64');\n filePart.data = new URL(\n `data:${filePart.mediaType || 'application/octet-stream'};base64,${base64Data}`,\n );\n }\n }\n }\n }\n return options;\n }\n\n private getUrl() {\n return `${this.config.baseURL}/language-model`;\n }\n\n private getModelConfigHeaders(modelId: string, streaming: boolean) {\n return {\n 'ai-language-model-specification-version': '2',\n 'ai-language-model-id': modelId,\n 'ai-language-model-streaming': String(streaming),\n };\n }\n}\n","export async function getVercelOidcToken(): Promise<string> {\n const token =\n getContext().headers?.['x-vercel-oidc-token'] ??\n process.env.VERCEL_OIDC_TOKEN;\n\n if (!token) {\n throw new Error(\n `The 'x-vercel-oidc-token' header is missing from the request. Do you have the OIDC option enabled in the Vercel project settings?`,\n );\n }\n\n return token;\n}\n\ntype Context = {\n headers?: Record<string, string>;\n};\n\nconst SYMBOL_FOR_REQ_CONTEXT = Symbol.for('@vercel/request-context');\n\nfunction getContext(): Context {\n const fromSymbol: typeof globalThis & {\n [SYMBOL_FOR_REQ_CONTEXT]?: { get?: () => Context };\n } = globalThis;\n return fromSymbol[SYMBOL_FOR_REQ_CONTEXT]?.get?.() ?? {};\n}\n","import {\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n getFromApi,\n resolve,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\nimport type { GatewayConfig } from './gateway-config';\nimport type { GatewayLanguageModelEntry } from './gateway-model-entry';\n\ntype GatewayFetchMetadataConfig = GatewayConfig;\n\nexport interface GatewayFetchMetadataResponse {\n models: GatewayLanguageModelEntry[];\n}\n\nexport class GatewayFetchMetadata {\n constructor(private readonly config: GatewayFetchMetadataConfig) {}\n\n async getAvailableModels(): Promise<GatewayFetchMetadataResponse> {\n const { value } = await getFromApi({\n url: `${this.config.baseURL}/config`,\n headers: await resolve(this.config.headers()),\n successfulResponseHandler: createJsonResponseHandler(\n gatewayFetchMetadataSchema,\n ),\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: z.any(),\n errorToMessage: data => data,\n }),\n fetch: this.config.fetch,\n });\n\n return value as GatewayFetchMetadataResponse;\n }\n}\n\nconst gatewayLanguageModelSpecificationSchema = z.object({\n specificationVersion: z.literal('v2'),\n provider: z.string(),\n modelId: z.string(),\n});\n\nconst gatewayLanguageModelEntrySchema = z.object({\n id: z.string(),\n name: z.string(),\n specification: gatewayLanguageModelSpecificationSchema,\n});\n\nconst gatewayFetchMetadataSchema = z.object({\n models: z.array(gatewayLanguageModelEntrySchema),\n});\n"],"mappings":"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","names":["createJsonErrorResponseHandler","createJsonResponseHandler","resolve","z","_a","_b"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ai-sdk/gateway",
|
|
3
|
+
"private": false,
|
|
4
|
+
"version": "1.0.0-alpha.6",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"sideEffects": false,
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"module": "./dist/index.mjs",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"files": [
|
|
11
|
+
"dist/**/*",
|
|
12
|
+
"CHANGELOG.md"
|
|
13
|
+
],
|
|
14
|
+
"exports": {
|
|
15
|
+
"./package.json": "./package.json",
|
|
16
|
+
".": {
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"import": "./dist/index.mjs",
|
|
19
|
+
"require": "./dist/index.js"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"@ai-sdk/provider": "2.0.0-alpha.6",
|
|
24
|
+
"@ai-sdk/provider-utils": "3.0.0-alpha.6"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@types/node": "18.15.11",
|
|
28
|
+
"tsup": "^8",
|
|
29
|
+
"typescript": "5.8.3",
|
|
30
|
+
"zod": "3.24.4",
|
|
31
|
+
"@vercel/ai-tsconfig": "0.0.0"
|
|
32
|
+
},
|
|
33
|
+
"peerDependencies": {
|
|
34
|
+
"zod": "^3.24.0"
|
|
35
|
+
},
|
|
36
|
+
"engines": {
|
|
37
|
+
"node": ">=18"
|
|
38
|
+
},
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"access": "public"
|
|
41
|
+
},
|
|
42
|
+
"homepage": "https://ai-sdk.dev/docs",
|
|
43
|
+
"repository": {
|
|
44
|
+
"type": "git",
|
|
45
|
+
"url": "git+https://github.com/vercel/ai.git"
|
|
46
|
+
},
|
|
47
|
+
"bugs": {
|
|
48
|
+
"url": "https://github.com/vercel/ai/issues"
|
|
49
|
+
},
|
|
50
|
+
"keywords": [
|
|
51
|
+
"ai"
|
|
52
|
+
],
|
|
53
|
+
"scripts": {
|
|
54
|
+
"build": "pnpm clean && tsup --tsconfig tsconfig.build.json",
|
|
55
|
+
"build:watch": "pnpm clean && tsup --watch",
|
|
56
|
+
"clean": "rm -rf dist *.tsbuildinfo",
|
|
57
|
+
"lint": "eslint \"./**/*.ts*\"",
|
|
58
|
+
"type-check": "tsc --build",
|
|
59
|
+
"prettier-check": "prettier --check \"./**/*.ts*\"",
|
|
60
|
+
"test": "pnpm test:node && pnpm test:edge",
|
|
61
|
+
"test:update": "pnpm test:node -u",
|
|
62
|
+
"test:watch": "vitest --config vitest.node.config.js",
|
|
63
|
+
"test:edge": "vitest --config vitest.edge.config.js --run",
|
|
64
|
+
"test:node": "vitest --config vitest.node.config.js --run"
|
|
65
|
+
}
|
|
66
|
+
}
|