@ai-sdk/gateway 4.0.19 → 4.0.21
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 +15 -0
- package/dist/index.d.ts +33 -2
- package/dist/index.js +26 -6
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/gateway-language-model-settings.ts +2 -9
- package/src/gateway-provider.ts +80 -11
- package/src/gateway-transcription-model-settings.ts +0 -1
- package/src/gateway-transcription-model.ts +4 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# @ai-sdk/gateway
|
|
2
2
|
|
|
3
|
+
## 4.0.21
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 7069785: chore(provider/gateway): update gateway model settings files
|
|
8
|
+
- 4bf9ac2: feat (provider/gateway): add `gateway.experimental_transcription.getToken` for minting transcription-bound client secrets
|
|
9
|
+
|
|
10
|
+
## 4.0.20
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- 4d096f6: chore(provider/gateway): update gateway model settings files
|
|
15
|
+
- Updated dependencies [31c7be8]
|
|
16
|
+
- @ai-sdk/provider-utils@5.0.10
|
|
17
|
+
|
|
3
18
|
## 4.0.19
|
|
4
19
|
|
|
5
20
|
### Patch Changes
|
package/dist/index.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { LanguageModelV4, ProviderV4, EmbeddingModelV4, ImageModelV4, Experiment
|
|
|
2
2
|
import * as _ai_sdk_provider_utils from '@ai-sdk/provider-utils';
|
|
3
3
|
import { FetchFunction, WebSocketConstructor, InferSchema } from '@ai-sdk/provider-utils';
|
|
4
4
|
|
|
5
|
-
type GatewayModelId = 'alibaba/qwen-3-14b' | 'alibaba/qwen-3-235b' | 'alibaba/qwen-3-30b' | 'alibaba/qwen-3-32b' | 'alibaba/qwen-3.6-max-preview' | 'alibaba/qwen3-235b-a22b-thinking' | 'alibaba/qwen3-coder' | 'alibaba/qwen3-coder-30b-a3b' | 'alibaba/qwen3-coder-next' | 'alibaba/qwen3-coder-plus' | 'alibaba/qwen3-max' | 'alibaba/qwen3-max-preview' | 'alibaba/qwen3-max-thinking' | 'alibaba/qwen3-next-80b-a3b-instruct' | 'alibaba/qwen3-next-80b-a3b-thinking' | 'alibaba/qwen3-vl-235b-a22b-instruct' | 'alibaba/qwen3-vl-instruct' | 'alibaba/qwen3-vl-thinking' | 'alibaba/qwen3.5-flash' | 'alibaba/qwen3.5-plus' | 'alibaba/qwen3.6-27b' | 'alibaba/qwen3.6-plus' | 'alibaba/qwen3.7-max' | 'alibaba/qwen3.7-plus' | 'amazon/nova-2-lite' | 'amazon/nova-lite' | 'amazon/nova-micro' | 'amazon/nova-pro' | 'anthropic/claude-3-haiku' | 'anthropic/claude-
|
|
5
|
+
type GatewayModelId = 'alibaba/qwen-3-14b' | 'alibaba/qwen-3-235b' | 'alibaba/qwen-3-30b' | 'alibaba/qwen-3-32b' | 'alibaba/qwen-3.6-max-preview' | 'alibaba/qwen3-235b-a22b-thinking' | 'alibaba/qwen3-coder' | 'alibaba/qwen3-coder-30b-a3b' | 'alibaba/qwen3-coder-next' | 'alibaba/qwen3-coder-plus' | 'alibaba/qwen3-max' | 'alibaba/qwen3-max-preview' | 'alibaba/qwen3-max-thinking' | 'alibaba/qwen3-next-80b-a3b-instruct' | 'alibaba/qwen3-next-80b-a3b-thinking' | 'alibaba/qwen3-vl-235b-a22b-instruct' | 'alibaba/qwen3-vl-instruct' | 'alibaba/qwen3-vl-thinking' | 'alibaba/qwen3.5-flash' | 'alibaba/qwen3.5-plus' | 'alibaba/qwen3.6-27b' | 'alibaba/qwen3.6-plus' | 'alibaba/qwen3.7-max' | 'alibaba/qwen3.7-plus' | 'amazon/nova-2-lite' | 'amazon/nova-lite' | 'amazon/nova-micro' | 'amazon/nova-pro' | 'anthropic/claude-3-haiku' | 'anthropic/claude-fable-5' | 'anthropic/claude-haiku-4.5' | 'anthropic/claude-opus-4' | 'anthropic/claude-opus-4.1' | 'anthropic/claude-opus-4.5' | 'anthropic/claude-opus-4.6' | 'anthropic/claude-opus-4.7' | 'anthropic/claude-opus-4.7-fast' | 'anthropic/claude-opus-4.8' | 'anthropic/claude-opus-4.8-fast' | 'anthropic/claude-sonnet-4' | 'anthropic/claude-sonnet-4.5' | 'anthropic/claude-sonnet-4.6' | 'anthropic/claude-sonnet-5' | 'arcee-ai/trinity-large-thinking' | 'arcee-ai/trinity-mini' | 'bytedance/seed-1.6' | 'bytedance/seed-1.8' | 'cohere/command-a' | 'deepseek/deepseek-r1' | 'deepseek/deepseek-v3' | 'deepseek/deepseek-v3.1' | 'deepseek/deepseek-v3.1-terminus' | 'deepseek/deepseek-v3.2' | 'deepseek/deepseek-v3.2-thinking' | 'deepseek/deepseek-v4-flash' | 'deepseek/deepseek-v4-pro' | 'google/gemini-2.5-flash' | 'google/gemini-2.5-flash-image' | 'google/gemini-2.5-flash-lite' | 'google/gemini-2.5-pro' | 'google/gemini-3-flash' | 'google/gemini-3-pro-image' | 'google/gemini-3-pro-preview' | 'google/gemini-3.1-flash-image' | 'google/gemini-3.1-flash-image-preview' | 'google/gemini-3.1-flash-lite' | 'google/gemini-3.1-flash-lite-image' | 'google/gemini-3.1-flash-lite-preview' | 'google/gemini-3.1-pro-preview' | 'google/gemini-3.5-flash' | 'google/gemini-omni-flash-preview' | 'google/gemma-4-26b-a4b-it' | 'google/gemma-4-31b-it' | 'inception/mercury-2' | 'inception/mercury-coder-small' | 'interfaze/interfaze-beta' | 'kwaipilot/kat-coder-air-v2.5' | 'kwaipilot/kat-coder-pro-v1' | 'kwaipilot/kat-coder-pro-v2' | 'kwaipilot/kat-coder-pro-v2.5' | 'meta/llama-3.1-70b' | 'meta/llama-3.1-8b' | 'meta/llama-3.2-11b' | 'meta/llama-3.2-1b' | 'meta/llama-3.2-3b' | 'meta/llama-3.2-90b' | 'meta/llama-3.3-70b' | 'meta/llama-4-maverick' | 'meta/llama-4-scout' | 'meta/muse-spark-1.1' | 'minimax/minimax-m2' | 'minimax/minimax-m2.1' | 'minimax/minimax-m2.1-lightning' | 'minimax/minimax-m2.5' | 'minimax/minimax-m2.5-highspeed' | 'minimax/minimax-m2.7' | 'minimax/minimax-m2.7-highspeed' | 'minimax/minimax-m3' | 'mistral/codestral' | 'mistral/devstral-2' | 'mistral/devstral-small-2' | 'mistral/magistral-medium' | 'mistral/magistral-small' | 'mistral/ministral-14b' | 'mistral/ministral-3b' | 'mistral/ministral-8b' | 'mistral/mistral-large-3' | 'mistral/mistral-medium' | 'mistral/mistral-medium-3.5' | 'mistral/mistral-nemo' | 'mistral/mistral-small' | 'mistral/pixtral-12b' | 'moonshotai/kimi-k2' | 'moonshotai/kimi-k2-thinking' | 'moonshotai/kimi-k2.5' | 'moonshotai/kimi-k2.6' | 'moonshotai/kimi-k2.7-code' | 'moonshotai/kimi-k2.7-code-highspeed' | 'morph/morph-v3-fast' | 'morph/morph-v3-large' | 'nvidia/nemotron-3-nano-30b-a3b' | 'nvidia/nemotron-3-super-120b-a12b' | 'nvidia/nemotron-3-ultra-550b-a55b' | 'nvidia/nemotron-nano-12b-v2-vl' | 'nvidia/nemotron-nano-9b-v2' | 'openai/gpt-3.5-turbo' | '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/gpt-4o-mini-search-preview' | 'openai/gpt-5' | 'openai/gpt-5-chat' | 'openai/gpt-5-codex' | 'openai/gpt-5-mini' | 'openai/gpt-5-nano' | 'openai/gpt-5-pro' | 'openai/gpt-5.1-codex' | 'openai/gpt-5.1-codex-max' | 'openai/gpt-5.1-codex-mini' | 'openai/gpt-5.1-instant' | 'openai/gpt-5.1-thinking' | 'openai/gpt-5.2' | 'openai/gpt-5.2-chat' | 'openai/gpt-5.2-codex' | 'openai/gpt-5.2-pro' | 'openai/gpt-5.3-chat' | 'openai/gpt-5.3-codex' | 'openai/gpt-5.4' | 'openai/gpt-5.4-mini' | 'openai/gpt-5.4-nano' | 'openai/gpt-5.4-pro' | 'openai/gpt-5.5' | 'openai/gpt-5.5-pro' | 'openai/gpt-5.6-luna' | 'openai/gpt-5.6-sol' | 'openai/gpt-5.6-terra' | 'openai/gpt-oss-120b' | 'openai/gpt-oss-20b' | 'openai/gpt-oss-safeguard-20b' | 'openai/o1' | 'openai/o3' | 'openai/o3-deep-research' | 'openai/o3-mini' | 'openai/o3-pro' | 'openai/o4-mini' | 'perplexity/sonar' | 'perplexity/sonar-pro' | 'perplexity/sonar-reasoning-pro' | 'sakana/fugu-ultra' | 'stepfun/step-3.5-flash' | 'stepfun/step-3.7-flash' | 'xai/grok-4.1-fast-non-reasoning' | 'xai/grok-4.1-fast-reasoning' | 'xai/grok-4.20-multi-agent' | 'xai/grok-4.20-multi-agent-beta' | 'xai/grok-4.20-non-reasoning' | 'xai/grok-4.20-non-reasoning-beta' | 'xai/grok-4.20-reasoning' | 'xai/grok-4.20-reasoning-beta' | 'xai/grok-4.3' | 'xai/grok-4.5' | 'xai/grok-build-0.1' | 'xiaomi/mimo-v2.5' | 'xiaomi/mimo-v2.5-pro' | 'zai/glm-4.5' | 'zai/glm-4.5-air' | 'zai/glm-4.5v' | 'zai/glm-4.6' | 'zai/glm-4.6v' | 'zai/glm-4.6v-flash' | 'zai/glm-4.7' | 'zai/glm-4.7-flash' | 'zai/glm-4.7-flashx' | 'zai/glm-5' | 'zai/glm-5-turbo' | 'zai/glm-5.1' | 'zai/glm-5.2' | 'zai/glm-5.2-fast' | 'zai/glm-5v-turbo' | (string & {});
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Shared WebSocket subprotocol contract for AI Gateway realtime and streaming
|
|
@@ -77,7 +77,7 @@ type GatewayRerankingModelId = 'cohere/rerank-v3.5' | 'cohere/rerank-v4-fast' |
|
|
|
77
77
|
|
|
78
78
|
type GatewaySpeechModelId = 'openai/tts-1' | 'openai/tts-1-hd' | 'xai/grok-tts' | (string & {});
|
|
79
79
|
|
|
80
|
-
type GatewayTranscriptionModelId = 'openai/gpt-4o-mini-transcribe' | 'openai/gpt-4o-transcribe' | 'openai/
|
|
80
|
+
type GatewayTranscriptionModelId = 'openai/gpt-4o-mini-transcribe' | 'openai/gpt-4o-transcribe' | 'openai/whisper-1' | 'xai/grok-stt' | (string & {});
|
|
81
81
|
|
|
82
82
|
type GatewayVideoModelId = 'alibaba/wan-v2.5-t2v-preview' | 'alibaba/wan-v2.6-i2v' | 'alibaba/wan-v2.6-i2v-flash' | 'alibaba/wan-v2.6-r2v' | 'alibaba/wan-v2.6-r2v-flash' | 'alibaba/wan-v2.6-t2v' | 'alibaba/wan-v2.7-r2v' | 'alibaba/wan-v2.7-t2v' | 'bytedance/seedance-2.0' | 'bytedance/seedance-2.0-fast' | 'bytedance/seedance-v1.0-pro' | 'bytedance/seedance-v1.0-pro-fast' | 'bytedance/seedance-v1.5-pro' | 'google/veo-3.0-fast-generate-001' | 'google/veo-3.0-generate-001' | 'google/veo-3.1-fast-generate-001' | 'google/veo-3.1-generate-001' | 'klingai/kling-v2.5-turbo-i2v' | 'klingai/kling-v2.5-turbo-t2v' | 'klingai/kling-v2.6-i2v' | 'klingai/kling-v2.6-motion-control' | 'klingai/kling-v2.6-t2v' | 'klingai/kling-v3.0-i2v' | 'klingai/kling-v3.0-motion-control' | 'klingai/kling-v3.0-t2v' | 'xai/grok-imagine-video' | 'xai/grok-imagine-video-1.5' | 'xai/grok-imagine-video-1.5-preview' | (string & {});
|
|
83
83
|
|
|
@@ -748,11 +748,42 @@ interface GatewayProvider extends ProviderV4 {
|
|
|
748
748
|
* communication over WebSocket, normalized through the AI Gateway.
|
|
749
749
|
*/
|
|
750
750
|
experimental_realtime: Experimental_RealtimeFactoryV4;
|
|
751
|
+
/**
|
|
752
|
+
* Experimental streaming-transcription entry point. Callable like
|
|
753
|
+
* `transcription(modelId)`, plus `getToken` for minting a short-lived
|
|
754
|
+
* client secret (`vcst_`) a browser can use to open the streaming
|
|
755
|
+
* transcription WebSocket without holding the Gateway credential.
|
|
756
|
+
*/
|
|
757
|
+
experimental_transcription: GatewayTranscriptionFactory;
|
|
751
758
|
/**
|
|
752
759
|
* Gateway-specific tools executed server-side.
|
|
753
760
|
*/
|
|
754
761
|
tools: typeof gatewayTools;
|
|
755
762
|
}
|
|
763
|
+
type GatewayTranscriptionFactoryGetTokenOptions = {
|
|
764
|
+
model: GatewayTranscriptionModelId;
|
|
765
|
+
/** Token lifetime in seconds. Gateway default is 60s (max 300s). */
|
|
766
|
+
expiresAfterSeconds?: number;
|
|
767
|
+
};
|
|
768
|
+
type GatewayTranscriptionFactoryGetTokenResult = {
|
|
769
|
+
/** The minted `vcst_` client secret. */
|
|
770
|
+
token: string;
|
|
771
|
+
/** WebSocket URL of the streaming transcription surface for this model. */
|
|
772
|
+
url: string;
|
|
773
|
+
/** Token expiry, epoch seconds. */
|
|
774
|
+
expiresAt?: number;
|
|
775
|
+
};
|
|
776
|
+
/**
|
|
777
|
+
* Streaming-transcription factory: callable like `transcription(modelId)`,
|
|
778
|
+
* plus a server-side `getToken` that mints a transcription-bound short-lived
|
|
779
|
+
* client secret (`vcst_`). The browser connects with
|
|
780
|
+
* `createGateway({ apiKey: token }).transcription(modelId)` — the token rides
|
|
781
|
+
* the same auth subprotocol an API key does, without exposing the credential.
|
|
782
|
+
*/
|
|
783
|
+
interface GatewayTranscriptionFactory {
|
|
784
|
+
(modelId: GatewayTranscriptionModelId): TranscriptionModelV4;
|
|
785
|
+
getToken(options: GatewayTranscriptionFactoryGetTokenOptions): Promise<GatewayTranscriptionFactoryGetTokenResult>;
|
|
786
|
+
}
|
|
756
787
|
interface GatewayProviderSettings {
|
|
757
788
|
/**
|
|
758
789
|
* The base URL prefix for API calls. Defaults to `https://ai-gateway.vercel.sh/v4/ai`.
|
package/dist/index.js
CHANGED
|
@@ -2631,7 +2631,7 @@ async function getVercelRequestId() {
|
|
|
2631
2631
|
}
|
|
2632
2632
|
|
|
2633
2633
|
// src/version.ts
|
|
2634
|
-
var VERSION = true ? "4.0.
|
|
2634
|
+
var VERSION = true ? "4.0.21" : "0.0.0-test";
|
|
2635
2635
|
|
|
2636
2636
|
// src/gateway-provider.ts
|
|
2637
2637
|
var AI_GATEWAY_PROTOCOL_VERSION = "0.0.1";
|
|
@@ -2680,8 +2680,8 @@ function createGateway(options = {}) {
|
|
|
2680
2680
|
});
|
|
2681
2681
|
}
|
|
2682
2682
|
};
|
|
2683
|
-
const
|
|
2684
|
-
|
|
2683
|
+
const mintClientSecret = async (params) => {
|
|
2684
|
+
assertGatewayClientSecretServerEnvironment();
|
|
2685
2685
|
const auth = await getRealtimeAuthToken();
|
|
2686
2686
|
const headers = createAuthHeaders(auth);
|
|
2687
2687
|
const url = new URL("/v1/realtime/client-secrets", baseURL).toString();
|
|
@@ -2691,6 +2691,7 @@ function createGateway(options = {}) {
|
|
|
2691
2691
|
headers,
|
|
2692
2692
|
body: {
|
|
2693
2693
|
model: params.modelId,
|
|
2694
|
+
...params.routeKind != null && { routeKind: params.routeKind },
|
|
2694
2695
|
...params.expiresAfterSeconds != null && {
|
|
2695
2696
|
expiresIn: params.expiresAfterSeconds
|
|
2696
2697
|
}
|
|
@@ -2883,11 +2884,30 @@ function createGateway(options = {}) {
|
|
|
2883
2884
|
};
|
|
2884
2885
|
provider.transcriptionModel = createTranscriptionModel;
|
|
2885
2886
|
provider.transcription = createTranscriptionModel;
|
|
2887
|
+
provider.experimental_transcription = Object.assign(
|
|
2888
|
+
(modelId) => createTranscriptionModel(modelId),
|
|
2889
|
+
{
|
|
2890
|
+
getToken: async (tokenOptions) => {
|
|
2891
|
+
const secret = await mintClientSecret({
|
|
2892
|
+
modelId: tokenOptions.model,
|
|
2893
|
+
routeKind: "transcription",
|
|
2894
|
+
...tokenOptions.expiresAfterSeconds != null && {
|
|
2895
|
+
expiresAfterSeconds: tokenOptions.expiresAfterSeconds
|
|
2896
|
+
}
|
|
2897
|
+
});
|
|
2898
|
+
return {
|
|
2899
|
+
token: secret.token,
|
|
2900
|
+
url: toGatewayTranscriptionUrl(baseURL, tokenOptions.model),
|
|
2901
|
+
...secret.expiresAt != null && { expiresAt: secret.expiresAt }
|
|
2902
|
+
};
|
|
2903
|
+
}
|
|
2904
|
+
}
|
|
2905
|
+
);
|
|
2886
2906
|
const createRealtimeModel = (modelId) => new GatewayRealtimeModel(modelId, {
|
|
2887
2907
|
provider: "gateway.realtime",
|
|
2888
2908
|
baseURL,
|
|
2889
2909
|
teamIdOrSlug: options.teamIdOrSlug,
|
|
2890
|
-
createClientSecret:
|
|
2910
|
+
createClientSecret: mintClientSecret
|
|
2891
2911
|
});
|
|
2892
2912
|
provider.experimental_realtime = Object.assign(
|
|
2893
2913
|
(modelId) => createRealtimeModel(modelId),
|
|
@@ -2929,10 +2949,10 @@ async function getGatewayAuthToken(options) {
|
|
|
2929
2949
|
authMethod: "oidc"
|
|
2930
2950
|
};
|
|
2931
2951
|
}
|
|
2932
|
-
function
|
|
2952
|
+
function assertGatewayClientSecretServerEnvironment() {
|
|
2933
2953
|
if (typeof globalThis.window !== "undefined") {
|
|
2934
2954
|
throw new Error(
|
|
2935
|
-
"AI Gateway
|
|
2955
|
+
"AI Gateway client secrets must be minted server-side: minting needs your Gateway credential, which must never reach the browser. Call gateway.experimental_realtime.getToken() or gateway.experimental_transcription.getToken() from your server and pass the returned token to the client."
|
|
2936
2956
|
);
|
|
2937
2957
|
}
|
|
2938
2958
|
}
|