@ai-sdk/google-vertex 5.0.97 → 5.0.99

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.
Files changed (37) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/anthropic/edge/index.d.ts +84 -80
  3. package/dist/anthropic/edge/index.d.ts.map +1 -0
  4. package/dist/anthropic/edge/index.js +232 -272
  5. package/dist/anthropic/edge/index.js.map +1 -1
  6. package/dist/anthropic/index.d.ts +69 -66
  7. package/dist/anthropic/index.d.ts.map +1 -0
  8. package/dist/anthropic/index.js +166 -177
  9. package/dist/anthropic/index.js.map +1 -1
  10. package/dist/edge/index.d.ts +206 -194
  11. package/dist/edge/index.d.ts.map +1 -0
  12. package/dist/edge/index.js +1408 -1846
  13. package/dist/edge/index.js.map +1 -1
  14. package/dist/index.d.ts +265 -252
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +1349 -1761
  17. package/dist/index.js.map +1 -1
  18. package/dist/maas/edge/index.d.ts +62 -59
  19. package/dist/maas/edge/index.d.ts.map +1 -0
  20. package/dist/maas/edge/index.js +166 -196
  21. package/dist/maas/edge/index.js.map +1 -1
  22. package/dist/maas/index.d.ts +47 -45
  23. package/dist/maas/index.d.ts.map +1 -0
  24. package/dist/maas/index.js +101 -102
  25. package/dist/maas/index.js.map +1 -1
  26. package/dist/xai/edge/index.d.ts +77 -73
  27. package/dist/xai/edge/index.d.ts.map +1 -0
  28. package/dist/xai/edge/index.js +203 -235
  29. package/dist/xai/edge/index.js.map +1 -1
  30. package/dist/xai/index.d.ts +62 -59
  31. package/dist/xai/index.d.ts.map +1 -0
  32. package/dist/xai/index.js +138 -141
  33. package/dist/xai/index.js.map +1 -1
  34. package/docs/16-google-vertex.mdx +3 -3
  35. package/package.json +11 -11
  36. package/src/edge/google-vertex-auth-edge.ts +1 -1
  37. package/src/google-vertex-provider-base.ts +1 -1
@@ -1,249 +1,217 @@
1
- // src/xai/edge/google-vertex-xai-provider-edge.ts
2
- import { resolve } from "@ai-sdk/provider-utils";
3
-
4
- // src/edge/google-vertex-auth-edge.ts
5
- import {
6
- loadOptionalSetting,
7
- loadSetting,
8
- withUserAgentSuffix,
9
- getRuntimeEnvironmentUserAgent
10
- } from "@ai-sdk/provider-utils";
11
-
12
- // src/version.ts
13
- var VERSION = true ? "5.0.97" : "0.0.0-test";
14
-
15
- // src/edge/google-vertex-auth-edge.ts
16
- var loadCredentials = async () => {
17
- try {
18
- return {
19
- clientEmail: loadSetting({
20
- settingValue: void 0,
21
- settingName: "clientEmail",
22
- environmentVariableName: "GOOGLE_CLIENT_EMAIL",
23
- description: "Google client email"
24
- }),
25
- privateKey: loadSetting({
26
- settingValue: void 0,
27
- settingName: "privateKey",
28
- environmentVariableName: "GOOGLE_PRIVATE_KEY",
29
- description: "Google private key"
30
- }),
31
- privateKeyId: loadOptionalSetting({
32
- settingValue: void 0,
33
- environmentVariableName: "GOOGLE_PRIVATE_KEY_ID"
34
- })
35
- };
36
- } catch (error) {
37
- throw new Error(`Failed to load Google credentials: ${error.message}`);
38
- }
1
+ import { getRuntimeEnvironmentUserAgent, loadOptionalSetting, loadSetting, resolve, withUserAgentSuffix, withoutTrailingSlash } from "@ai-sdk/provider-utils";
2
+ import { NoSuchModelError } from "@ai-sdk/provider";
3
+ import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
4
+ //#region src/version.ts
5
+ const VERSION = "5.0.99";
6
+ //#endregion
7
+ //#region src/edge/google-vertex-auth-edge.ts
8
+ const loadCredentials = async () => {
9
+ try {
10
+ return {
11
+ clientEmail: loadSetting({
12
+ settingValue: void 0,
13
+ settingName: "clientEmail",
14
+ environmentVariableName: "GOOGLE_CLIENT_EMAIL",
15
+ description: "Google client email"
16
+ }),
17
+ privateKey: loadSetting({
18
+ settingValue: void 0,
19
+ settingName: "privateKey",
20
+ environmentVariableName: "GOOGLE_PRIVATE_KEY",
21
+ description: "Google private key"
22
+ }),
23
+ privateKeyId: loadOptionalSetting({
24
+ settingValue: void 0,
25
+ environmentVariableName: "GOOGLE_PRIVATE_KEY_ID"
26
+ })
27
+ };
28
+ } catch (error) {
29
+ throw new Error(`Failed to load Google credentials: ${error.message}`);
30
+ }
39
31
  };
40
- var base64url = (str) => {
41
- return btoa(str).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
32
+ const base64url = (str) => {
33
+ return btoa(str).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
42
34
  };
43
- var importPrivateKey = async (pemKey) => {
44
- const pemHeader = "-----BEGIN PRIVATE KEY-----";
45
- const pemFooter = "-----END PRIVATE KEY-----";
46
- const pemContents = pemKey.replace(pemHeader, "").replace(pemFooter, "").replace(/\s/g, "");
47
- const binaryString = atob(pemContents);
48
- const binaryData = new Uint8Array(binaryString.length);
49
- for (let i = 0; i < binaryString.length; i++) {
50
- binaryData[i] = binaryString.charCodeAt(i);
51
- }
52
- return await crypto.subtle.importKey(
53
- "pkcs8",
54
- binaryData,
55
- { name: "RSASSA-PKCS1-v1_5", hash: "SHA-256" },
56
- true,
57
- ["sign"]
58
- );
35
+ const importPrivateKey = async (pemKey) => {
36
+ const pemContents = pemKey.replace("-----BEGIN PRIVATE KEY-----", "").replace("-----END PRIVATE KEY-----", "").replace(/\s/g, "");
37
+ const binaryString = atob(pemContents);
38
+ const binaryData = new Uint8Array(binaryString.length);
39
+ for (let i = 0; i < binaryString.length; i++) binaryData[i] = binaryString.charCodeAt(i);
40
+ return await crypto.subtle.importKey("pkcs8", binaryData, {
41
+ name: "RSASSA-PKCS1-v1_5",
42
+ hash: "SHA-256"
43
+ }, true, ["sign"]);
59
44
  };
60
- var buildJwt = async (credentials) => {
61
- const now = Math.floor(Date.now() / 1e3);
62
- const header = {
63
- alg: "RS256",
64
- typ: "JWT"
65
- };
66
- if (credentials.privateKeyId) {
67
- header.kid = credentials.privateKeyId;
68
- }
69
- const payload = {
70
- iss: credentials.clientEmail,
71
- scope: "https://www.googleapis.com/auth/cloud-platform",
72
- aud: "https://oauth2.googleapis.com/token",
73
- exp: now + 3600,
74
- iat: now
75
- };
76
- const privateKey = await importPrivateKey(credentials.privateKey);
77
- const signingInput = `${base64url(JSON.stringify(header))}.${base64url(
78
- JSON.stringify(payload)
79
- )}`;
80
- const encoder = new TextEncoder();
81
- const data = encoder.encode(signingInput);
82
- const signature = await crypto.subtle.sign(
83
- "RSASSA-PKCS1-v1_5",
84
- privateKey,
85
- data
86
- );
87
- const signatureBase64 = base64url(
88
- String.fromCharCode(...new Uint8Array(signature))
89
- );
90
- return `${base64url(JSON.stringify(header))}.${base64url(
91
- JSON.stringify(payload)
92
- )}.${signatureBase64}`;
45
+ const buildJwt = async (credentials) => {
46
+ const now = Math.floor(Date.now() / 1e3);
47
+ const header = {
48
+ alg: "RS256",
49
+ typ: "JWT"
50
+ };
51
+ if (credentials.privateKeyId) header.kid = credentials.privateKeyId;
52
+ const payload = {
53
+ iss: credentials.clientEmail,
54
+ scope: "https://www.googleapis.com/auth/cloud-platform",
55
+ aud: "https://oauth2.googleapis.com/token",
56
+ exp: now + 3600,
57
+ iat: now
58
+ };
59
+ const privateKey = await importPrivateKey(credentials.privateKey);
60
+ const signingInput = `${base64url(JSON.stringify(header))}.${base64url(JSON.stringify(payload))}`;
61
+ const data = new TextEncoder().encode(signingInput);
62
+ const signature = await crypto.subtle.sign("RSASSA-PKCS1-v1_5", privateKey, data);
63
+ const signatureBase64 = base64url(String.fromCharCode(...new Uint8Array(signature)));
64
+ return `${base64url(JSON.stringify(header))}.${base64url(JSON.stringify(payload))}.${signatureBase64}`;
93
65
  };
66
+ /**
67
+ * Generate an authentication token for Google Vertex AI in a manner compatible
68
+ * with the Edge runtime.
69
+ */
94
70
  async function generateAuthToken(credentials) {
95
- const creds = credentials || await loadCredentials();
96
- const jwt = await buildJwt(creds);
97
- const response = await fetch("https://oauth2.googleapis.com/token", {
98
- method: "POST",
99
- headers: withUserAgentSuffix(
100
- { "Content-Type": "application/x-www-form-urlencoded" },
101
- `ai-sdk/google-vertex/${VERSION}`,
102
- getRuntimeEnvironmentUserAgent()
103
- ),
104
- body: new URLSearchParams({
105
- grant_type: "urn:ietf:params:oauth:grant-type:jwt-bearer",
106
- assertion: jwt
107
- })
108
- });
109
- if (!response.ok) {
110
- throw new Error(`Token request failed: ${response.statusText}`);
111
- }
112
- const data = await response.json();
113
- return data.access_token;
71
+ const creds = credentials || await loadCredentials();
72
+ const jwt = await buildJwt(creds);
73
+ const response = await fetch("https://oauth2.googleapis.com/token", {
74
+ method: "POST",
75
+ headers: withUserAgentSuffix({ "Content-Type": "application/x-www-form-urlencoded" }, `ai-sdk-google-vertex/${VERSION}`, getRuntimeEnvironmentUserAgent()),
76
+ body: new URLSearchParams({
77
+ grant_type: "urn:ietf:params:oauth:grant-type:jwt-bearer",
78
+ assertion: jwt
79
+ })
80
+ });
81
+ if (!response.ok) throw new Error(`Token request failed: ${response.statusText}`);
82
+ return (await response.json()).access_token;
114
83
  }
115
-
116
- // src/xai/google-vertex-xai-provider.ts
117
- import {
118
- NoSuchModelError
119
- } from "@ai-sdk/provider";
120
- import {
121
- createOpenAICompatible
122
- } from "@ai-sdk/openai-compatible";
123
- import {
124
- loadOptionalSetting as loadOptionalSetting2,
125
- loadSetting as loadSetting2,
126
- withoutTrailingSlash
127
- } from "@ai-sdk/provider-utils";
84
+ //#endregion
85
+ //#region src/xai/google-vertex-xai-provider.ts
128
86
  function convertGoogleVertexXaiUsage(usage) {
129
- if (usage == null) {
130
- return {
131
- inputTokens: {
132
- total: void 0,
133
- noCache: void 0,
134
- cacheRead: void 0,
135
- cacheWrite: void 0
136
- },
137
- outputTokens: {
138
- total: void 0,
139
- text: void 0,
140
- reasoning: void 0
141
- },
142
- raw: void 0
143
- };
144
- }
145
- const promptTokens = usage.prompt_tokens ?? 0;
146
- const completionTokens = usage.completion_tokens ?? 0;
147
- const cacheReadTokens = usage.prompt_tokens_details?.cached_tokens ?? 0;
148
- const reasoningTokens = usage.completion_tokens_details?.reasoning_tokens ?? 0;
149
- return {
150
- inputTokens: {
151
- total: promptTokens,
152
- noCache: promptTokens - cacheReadTokens,
153
- cacheRead: cacheReadTokens,
154
- cacheWrite: void 0
155
- },
156
- outputTokens: {
157
- total: completionTokens + reasoningTokens,
158
- text: completionTokens,
159
- reasoning: reasoningTokens
160
- },
161
- raw: usage
162
- };
87
+ if (usage == null) return {
88
+ inputTokens: {
89
+ total: void 0,
90
+ noCache: void 0,
91
+ cacheRead: void 0,
92
+ cacheWrite: void 0
93
+ },
94
+ outputTokens: {
95
+ total: void 0,
96
+ text: void 0,
97
+ reasoning: void 0
98
+ },
99
+ raw: void 0
100
+ };
101
+ const promptTokens = usage.prompt_tokens ?? 0;
102
+ const completionTokens = usage.completion_tokens ?? 0;
103
+ const cacheReadTokens = usage.prompt_tokens_details?.cached_tokens ?? 0;
104
+ const reasoningTokens = usage.completion_tokens_details?.reasoning_tokens ?? 0;
105
+ return {
106
+ inputTokens: {
107
+ total: promptTokens,
108
+ noCache: promptTokens - cacheReadTokens,
109
+ cacheRead: cacheReadTokens,
110
+ cacheWrite: void 0
111
+ },
112
+ outputTokens: {
113
+ total: completionTokens + reasoningTokens,
114
+ text: completionTokens,
115
+ reasoning: reasoningTokens
116
+ },
117
+ raw: usage
118
+ };
163
119
  }
164
120
  function transformGoogleVertexXaiRequestBody(args) {
165
- const { reasoning_effort: _reasoningEffort, ...rest } = args;
166
- return rest;
121
+ const { reasoning_effort: _reasoningEffort, ...rest } = args;
122
+ return rest;
167
123
  }
124
+ /**
125
+ * Create a Google Vertex AI xAI provider instance.
126
+ * Uses the OpenAI-compatible Chat Completions API for Grok partner models.
127
+ *
128
+ * @see https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/grok
129
+ */
130
+ function createGoogleVertexXai$1(options = {}) {
131
+ const loadLocation = () => loadOptionalSetting({
132
+ settingValue: options.location,
133
+ environmentVariableName: "GOOGLE_VERTEX_LOCATION"
134
+ });
135
+ const loadProject = () => loadSetting({
136
+ settingValue: options.project,
137
+ settingName: "project",
138
+ environmentVariableName: "GOOGLE_VERTEX_PROJECT",
139
+ description: "Google Vertex project"
140
+ });
141
+ const constructBaseURL = () => {
142
+ return `https://aiplatform.googleapis.com/v1/projects/${loadProject()}/locations/${loadLocation() ?? "global"}/endpoints/openapi`;
143
+ };
144
+ const loadBaseURL = () => withoutTrailingSlash(options.baseURL ?? "") || constructBaseURL();
145
+ let cachedProvider;
146
+ const getProvider = () => cachedProvider ??= createOpenAICompatible({
147
+ name: "googleVertex.xai",
148
+ baseURL: loadBaseURL(),
149
+ fetch: options.fetch,
150
+ includeUsage: true,
151
+ supportsStructuredOutputs: true,
152
+ supportedUrls: () => ({ "image/*": [/^https?:\/\/.*$/] }),
153
+ transformRequestBody: transformGoogleVertexXaiRequestBody,
154
+ convertUsage: convertGoogleVertexXaiUsage
155
+ });
156
+ const createChatModel = (modelId) => getProvider().languageModel(modelId);
157
+ const provider = function(modelId) {
158
+ if (new.target) throw new Error("The Google Vertex xAI model function cannot be called with the new keyword.");
159
+ return createChatModel(modelId);
160
+ };
161
+ provider.specificationVersion = "v4";
162
+ provider.languageModel = createChatModel;
163
+ provider.chatModel = (modelId) => getProvider().chatModel(modelId);
164
+ provider.embeddingModel = (modelId) => {
165
+ throw new NoSuchModelError({
166
+ modelId,
167
+ modelType: "embeddingModel"
168
+ });
169
+ };
170
+ provider.textEmbeddingModel = provider.embeddingModel;
171
+ provider.imageModel = (modelId) => {
172
+ throw new NoSuchModelError({
173
+ modelId,
174
+ modelType: "imageModel"
175
+ });
176
+ };
177
+ return provider;
178
+ }
179
+ //#endregion
180
+ //#region src/xai/edge/google-vertex-xai-provider-edge.ts
181
+ /**
182
+ * Create a Google Vertex AI xAI provider instance for Edge runtimes.
183
+ * Uses the OpenAI-compatible Chat Completions API for Grok partner models.
184
+ * Automatically handles Google Cloud authentication.
185
+ *
186
+ * @see https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/grok
187
+ */
168
188
  function createGoogleVertexXai(options = {}) {
169
- const loadLocation = () => loadOptionalSetting2({
170
- settingValue: options.location,
171
- environmentVariableName: "GOOGLE_VERTEX_LOCATION"
172
- });
173
- const loadProject = () => loadSetting2({
174
- settingValue: options.project,
175
- settingName: "project",
176
- environmentVariableName: "GOOGLE_VERTEX_PROJECT",
177
- description: "Google Vertex project"
178
- });
179
- const constructBaseURL = () => {
180
- const projectId = loadProject();
181
- const location = loadLocation() ?? "global";
182
- return `https://aiplatform.googleapis.com/v1/projects/${projectId}/locations/${location}/endpoints/openapi`;
183
- };
184
- const loadBaseURL = () => withoutTrailingSlash(options.baseURL ?? "") || constructBaseURL();
185
- let cachedProvider;
186
- const getProvider = () => cachedProvider ??= createOpenAICompatible({
187
- name: "googleVertex.xai",
188
- baseURL: loadBaseURL(),
189
- fetch: options.fetch,
190
- includeUsage: true,
191
- supportsStructuredOutputs: true,
192
- supportedUrls: () => ({
193
- "image/*": [/^https?:\/\/.*$/]
194
- }),
195
- transformRequestBody: transformGoogleVertexXaiRequestBody,
196
- convertUsage: convertGoogleVertexXaiUsage
197
- });
198
- const createChatModel = (modelId) => getProvider().languageModel(modelId);
199
- const provider = function(modelId) {
200
- if (new.target) {
201
- throw new Error(
202
- "The Google Vertex xAI model function cannot be called with the new keyword."
203
- );
204
- }
205
- return createChatModel(modelId);
206
- };
207
- provider.specificationVersion = "v4";
208
- provider.languageModel = createChatModel;
209
- provider.chatModel = (modelId) => getProvider().chatModel(modelId);
210
- provider.embeddingModel = (modelId) => {
211
- throw new NoSuchModelError({ modelId, modelType: "embeddingModel" });
212
- };
213
- provider.textEmbeddingModel = provider.embeddingModel;
214
- provider.imageModel = (modelId) => {
215
- throw new NoSuchModelError({ modelId, modelType: "imageModel" });
216
- };
217
- return provider;
189
+ const customFetch = async (url, init) => {
190
+ const token = await generateAuthToken(options.googleCredentials);
191
+ const authHeaders = {
192
+ ...await resolve(options.headers),
193
+ Authorization: `Bearer ${token}`
194
+ };
195
+ const fetchInit = {
196
+ ...init,
197
+ headers: {
198
+ ...init?.headers,
199
+ ...authHeaders
200
+ }
201
+ };
202
+ return (options.fetch ?? fetch)(url, fetchInit);
203
+ };
204
+ return createGoogleVertexXai$1({
205
+ ...options,
206
+ fetch: customFetch,
207
+ headers: void 0
208
+ });
218
209
  }
210
+ /**
211
+ * Default Google Vertex AI xAI provider instance for Edge runtimes.
212
+ */
213
+ const googleVertexXai = createGoogleVertexXai();
214
+ //#endregion
215
+ export { createGoogleVertexXai, googleVertexXai };
219
216
 
220
- // src/xai/edge/google-vertex-xai-provider-edge.ts
221
- function createGoogleVertexXai2(options = {}) {
222
- const customFetch = async (url, init) => {
223
- const token = await generateAuthToken(options.googleCredentials);
224
- const resolvedHeaders = await resolve(options.headers);
225
- const authHeaders = {
226
- ...resolvedHeaders,
227
- Authorization: `Bearer ${token}`
228
- };
229
- const fetchInit = {
230
- ...init,
231
- headers: {
232
- ...init?.headers,
233
- ...authHeaders
234
- }
235
- };
236
- return (options.fetch ?? fetch)(url, fetchInit);
237
- };
238
- return createGoogleVertexXai({
239
- ...options,
240
- fetch: customFetch,
241
- headers: void 0
242
- });
243
- }
244
- var googleVertexXai = createGoogleVertexXai2();
245
- export {
246
- createGoogleVertexXai2 as createGoogleVertexXai,
247
- googleVertexXai
248
- };
249
217
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/xai/edge/google-vertex-xai-provider-edge.ts","../../../src/edge/google-vertex-auth-edge.ts","../../../src/version.ts","../../../src/xai/google-vertex-xai-provider.ts"],"sourcesContent":["import { resolve, type FetchFunction } from '@ai-sdk/provider-utils';\nimport {\n generateAuthToken,\n type GoogleCredentials,\n} from '../../edge/google-vertex-auth-edge';\nimport {\n createGoogleVertexXai as createGoogleVertexXaiOriginal,\n type GoogleVertexXaiProvider,\n type GoogleVertexXaiProviderSettings as GoogleVertexXaiProviderSettingsOriginal,\n} from '../google-vertex-xai-provider';\nexport type { GoogleVertexXaiProvider };\n\nexport interface GoogleVertexXaiProviderSettings extends GoogleVertexXaiProviderSettingsOriginal {\n /**\n * Optional. The Google credentials for the Google Cloud service account. If\n * not provided, the Google Vertex provider will use environment variables to\n * load the credentials.\n */\n googleCredentials?: GoogleCredentials;\n}\n\n/**\n * Create a Google Vertex AI xAI provider instance for Edge runtimes.\n * Uses the OpenAI-compatible Chat Completions API for Grok partner models.\n * Automatically handles Google Cloud authentication.\n *\n * @see https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/grok\n */\nexport function createGoogleVertexXai(\n options: GoogleVertexXaiProviderSettings = {},\n): GoogleVertexXaiProvider {\n const customFetch: FetchFunction = async (url, init) => {\n const token = await generateAuthToken(options.googleCredentials);\n const resolvedHeaders = await resolve(options.headers);\n const authHeaders = {\n ...resolvedHeaders,\n Authorization: `Bearer ${token}`,\n };\n\n const fetchInit = {\n ...init,\n headers: {\n ...init?.headers,\n ...authHeaders,\n },\n };\n\n return (options.fetch ?? fetch)(url, fetchInit);\n };\n\n return createGoogleVertexXaiOriginal({\n ...options,\n fetch: customFetch,\n headers: undefined,\n });\n}\n\n/**\n * Default Google Vertex AI xAI provider instance for Edge runtimes.\n */\nexport const googleVertexXai = createGoogleVertexXai();\n","import {\n loadOptionalSetting,\n loadSetting,\n withUserAgentSuffix,\n getRuntimeEnvironmentUserAgent,\n} from '@ai-sdk/provider-utils';\nimport { VERSION } from '../version';\n\nexport interface GoogleCredentials {\n /**\n * The client email for the Google Cloud service account. Defaults to the\n * value of the `GOOGLE_CLIENT_EMAIL` environment variable.\n */\n clientEmail: string;\n\n /**\n * The private key for the Google Cloud service account. Defaults to the\n * value of the `GOOGLE_PRIVATE_KEY` environment variable.\n */\n privateKey: string;\n\n /**\n * Optional. The private key ID for the Google Cloud service account. Defaults\n * to the value of the `GOOGLE_PRIVATE_KEY_ID` environment variable.\n */\n privateKeyId?: string;\n}\n\nconst loadCredentials = async (): Promise<GoogleCredentials> => {\n try {\n return {\n clientEmail: loadSetting({\n settingValue: undefined,\n settingName: 'clientEmail',\n environmentVariableName: 'GOOGLE_CLIENT_EMAIL',\n description: 'Google client email',\n }),\n privateKey: loadSetting({\n settingValue: undefined,\n settingName: 'privateKey',\n environmentVariableName: 'GOOGLE_PRIVATE_KEY',\n description: 'Google private key',\n }),\n privateKeyId: loadOptionalSetting({\n settingValue: undefined,\n environmentVariableName: 'GOOGLE_PRIVATE_KEY_ID',\n }),\n };\n } catch (error: any) {\n throw new Error(`Failed to load Google credentials: ${error.message}`);\n }\n};\n\n// Convert a string to base64url\nconst base64url = (str: string) => {\n return btoa(str).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n};\nconst importPrivateKey = async (pemKey: string) => {\n const pemHeader = '-----BEGIN PRIVATE KEY-----';\n const pemFooter = '-----END PRIVATE KEY-----';\n\n // Remove header, footer, and any whitespace/newlines\n const pemContents = pemKey\n .replace(pemHeader, '')\n .replace(pemFooter, '')\n .replace(/\\s/g, '');\n\n // Decode base64 to binary\n const binaryString = atob(pemContents);\n\n // Convert binary string to Uint8Array\n const binaryData = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n binaryData[i] = binaryString.charCodeAt(i);\n }\n\n return await crypto.subtle.importKey(\n 'pkcs8',\n binaryData,\n { name: 'RSASSA-PKCS1-v1_5', hash: 'SHA-256' },\n true,\n ['sign'],\n );\n};\n\nconst buildJwt = async (credentials: GoogleCredentials) => {\n const now = Math.floor(Date.now() / 1000);\n\n // Only include kid in header if privateKeyId is provided\n const header: { alg: string; typ: string; kid?: string } = {\n alg: 'RS256',\n typ: 'JWT',\n };\n\n if (credentials.privateKeyId) {\n header.kid = credentials.privateKeyId;\n }\n\n const payload = {\n iss: credentials.clientEmail,\n scope: 'https://www.googleapis.com/auth/cloud-platform',\n aud: 'https://oauth2.googleapis.com/token',\n exp: now + 3600,\n iat: now,\n };\n\n const privateKey = await importPrivateKey(credentials.privateKey);\n\n const signingInput = `${base64url(JSON.stringify(header))}.${base64url(\n JSON.stringify(payload),\n )}`;\n const encoder = new TextEncoder();\n const data = encoder.encode(signingInput);\n\n const signature = await crypto.subtle.sign(\n 'RSASSA-PKCS1-v1_5',\n privateKey,\n data,\n );\n\n const signatureBase64 = base64url(\n String.fromCharCode(...new Uint8Array(signature)),\n );\n\n return `${base64url(JSON.stringify(header))}.${base64url(\n JSON.stringify(payload),\n )}.${signatureBase64}`;\n};\n\n/**\n * Generate an authentication token for Google Vertex AI in a manner compatible\n * with the Edge runtime.\n */\nexport async function generateAuthToken(credentials?: GoogleCredentials) {\n const creds = credentials || (await loadCredentials());\n const jwt = await buildJwt(creds);\n\n const response = await fetch('https://oauth2.googleapis.com/token', {\n method: 'POST',\n headers: withUserAgentSuffix(\n { 'Content-Type': 'application/x-www-form-urlencoded' },\n `ai-sdk/google-vertex/${VERSION}`,\n getRuntimeEnvironmentUserAgent(),\n ),\n body: new URLSearchParams({\n grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',\n assertion: jwt,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Token request failed: ${response.statusText}`);\n }\n\n const data = await response.json();\n return data.access_token;\n}\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n","import {\n NoSuchModelError,\n type LanguageModelV4,\n type LanguageModelV4Usage,\n type ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n createOpenAICompatible,\n type OpenAICompatibleProvider,\n} from '@ai-sdk/openai-compatible';\nimport {\n loadOptionalSetting,\n loadSetting,\n withoutTrailingSlash,\n type FetchFunction,\n type Resolvable,\n} from '@ai-sdk/provider-utils';\nimport type { GoogleVertexXaiModelId } from './google-vertex-xai-options';\n\nexport interface GoogleVertexXaiProvider extends ProviderV4 {\n /**\n * Creates a model for text generation.\n */\n (modelId: GoogleVertexXaiModelId): LanguageModelV4;\n\n /**\n * Creates a model for text generation.\n */\n languageModel(modelId: GoogleVertexXaiModelId): LanguageModelV4;\n\n /**\n * Creates a chat model for text generation.\n */\n chatModel(modelId: GoogleVertexXaiModelId): LanguageModelV4;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: string): never;\n}\n\nexport interface GoogleVertexXaiProviderSettings {\n /**\n * Google Cloud project ID. Defaults to the value of the `GOOGLE_VERTEX_PROJECT` environment variable.\n */\n project?: string;\n\n /**\n * Google Cloud location/region. Defaults to the value of the `GOOGLE_VERTEX_LOCATION` environment variable.\n * Use 'global' for the global endpoint.\n */\n location?: string;\n\n /**\n * Base URL for the API calls. If not provided, will be constructed from project and location.\n */\n baseURL?: string;\n\n /**\n * Headers to use for requests. Can be:\n * - A headers object\n * - A Promise that resolves to a headers object\n * - A function that returns a headers object\n * - A function that returns a Promise of a headers object\n */\n headers?: Resolvable<Record<string, string | undefined>>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\ntype GoogleVertexXaiUsage =\n | {\n prompt_tokens?: number | null;\n completion_tokens?: number | null;\n prompt_tokens_details?: {\n cached_tokens?: number | null;\n } | null;\n completion_tokens_details?: {\n reasoning_tokens?: number | null;\n } | null;\n }\n | undefined\n | null;\n\nfunction convertGoogleVertexXaiUsage(\n usage: GoogleVertexXaiUsage,\n): LanguageModelV4Usage {\n if (usage == null) {\n return {\n inputTokens: {\n total: undefined,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: undefined,\n text: undefined,\n reasoning: undefined,\n },\n raw: undefined,\n };\n }\n\n const promptTokens = usage.prompt_tokens ?? 0;\n const completionTokens = usage.completion_tokens ?? 0;\n const cacheReadTokens = usage.prompt_tokens_details?.cached_tokens ?? 0;\n const reasoningTokens =\n usage.completion_tokens_details?.reasoning_tokens ?? 0;\n\n return {\n inputTokens: {\n total: promptTokens,\n noCache: promptTokens - cacheReadTokens,\n cacheRead: cacheReadTokens,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: completionTokens + reasoningTokens,\n text: completionTokens,\n reasoning: reasoningTokens,\n },\n raw: usage,\n };\n}\n\nfunction transformGoogleVertexXaiRequestBody(args: Record<string, any>) {\n const { reasoning_effort: _reasoningEffort, ...rest } = args;\n return rest;\n}\n\n/**\n * Create a Google Vertex AI xAI provider instance.\n * Uses the OpenAI-compatible Chat Completions API for Grok partner models.\n *\n * @see https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/grok\n */\nexport function createGoogleVertexXai(\n options: GoogleVertexXaiProviderSettings = {},\n): GoogleVertexXaiProvider {\n const loadLocation = () =>\n loadOptionalSetting({\n settingValue: options.location,\n environmentVariableName: 'GOOGLE_VERTEX_LOCATION',\n });\n\n const loadProject = () =>\n loadSetting({\n settingValue: options.project,\n settingName: 'project',\n environmentVariableName: 'GOOGLE_VERTEX_PROJECT',\n description: 'Google Vertex project',\n });\n\n const constructBaseURL = () => {\n const projectId = loadProject();\n const location = loadLocation() ?? 'global';\n\n return `https://aiplatform.googleapis.com/v1/projects/${projectId}/locations/${location}/endpoints/openapi`;\n };\n\n const loadBaseURL = () =>\n withoutTrailingSlash(options.baseURL ?? '') || constructBaseURL();\n\n let cachedProvider:\n | OpenAICompatibleProvider<GoogleVertexXaiModelId, string, string, string>\n | undefined;\n const getProvider = () =>\n (cachedProvider ??= createOpenAICompatible({\n name: 'googleVertex.xai',\n baseURL: loadBaseURL(),\n fetch: options.fetch,\n includeUsage: true,\n supportsStructuredOutputs: true,\n supportedUrls: () => ({\n 'image/*': [/^https?:\\/\\/.*$/],\n }),\n transformRequestBody: transformGoogleVertexXaiRequestBody,\n convertUsage: convertGoogleVertexXaiUsage,\n }));\n\n const createChatModel = (modelId: GoogleVertexXaiModelId) =>\n getProvider().languageModel(modelId);\n\n const provider = function (modelId: GoogleVertexXaiModelId) {\n if (new.target) {\n throw new Error(\n 'The Google Vertex xAI model function cannot be called with the new keyword.',\n );\n }\n\n return createChatModel(modelId);\n };\n\n provider.specificationVersion = 'v4' as const;\n provider.languageModel = createChatModel;\n provider.chatModel = (modelId: GoogleVertexXaiModelId) =>\n getProvider().chatModel(modelId);\n provider.embeddingModel = (modelId: string): never => {\n throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' });\n };\n provider.textEmbeddingModel = provider.embeddingModel;\n provider.imageModel = (modelId: string): never => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n\n return provider;\n}\n"],"mappings":"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","names":["loadOptionalSetting","loadSetting","createGoogleVertexXai"]}
1
+ {"version":3,"file":"index.js","names":["createGoogleVertexXai","createGoogleVertexXaiOriginal"],"sources":["../../../src/version.ts","../../../src/edge/google-vertex-auth-edge.ts","../../../src/xai/google-vertex-xai-provider.ts","../../../src/xai/edge/google-vertex-xai-provider-edge.ts"],"sourcesContent":["// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n","import {\n loadOptionalSetting,\n loadSetting,\n withUserAgentSuffix,\n getRuntimeEnvironmentUserAgent,\n} from '@ai-sdk/provider-utils';\nimport { VERSION } from '../version';\n\nexport interface GoogleCredentials {\n /**\n * The client email for the Google Cloud service account. Defaults to the\n * value of the `GOOGLE_CLIENT_EMAIL` environment variable.\n */\n clientEmail: string;\n\n /**\n * The private key for the Google Cloud service account. Defaults to the\n * value of the `GOOGLE_PRIVATE_KEY` environment variable.\n */\n privateKey: string;\n\n /**\n * Optional. The private key ID for the Google Cloud service account. Defaults\n * to the value of the `GOOGLE_PRIVATE_KEY_ID` environment variable.\n */\n privateKeyId?: string;\n}\n\nconst loadCredentials = async (): Promise<GoogleCredentials> => {\n try {\n return {\n clientEmail: loadSetting({\n settingValue: undefined,\n settingName: 'clientEmail',\n environmentVariableName: 'GOOGLE_CLIENT_EMAIL',\n description: 'Google client email',\n }),\n privateKey: loadSetting({\n settingValue: undefined,\n settingName: 'privateKey',\n environmentVariableName: 'GOOGLE_PRIVATE_KEY',\n description: 'Google private key',\n }),\n privateKeyId: loadOptionalSetting({\n settingValue: undefined,\n environmentVariableName: 'GOOGLE_PRIVATE_KEY_ID',\n }),\n };\n } catch (error: any) {\n throw new Error(`Failed to load Google credentials: ${error.message}`);\n }\n};\n\n// Convert a string to base64url\nconst base64url = (str: string) => {\n return btoa(str).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n};\nconst importPrivateKey = async (pemKey: string) => {\n const pemHeader = '-----BEGIN PRIVATE KEY-----';\n const pemFooter = '-----END PRIVATE KEY-----';\n\n // Remove header, footer, and any whitespace/newlines\n const pemContents = pemKey\n .replace(pemHeader, '')\n .replace(pemFooter, '')\n .replace(/\\s/g, '');\n\n // Decode base64 to binary\n const binaryString = atob(pemContents);\n\n // Convert binary string to Uint8Array\n const binaryData = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n binaryData[i] = binaryString.charCodeAt(i);\n }\n\n return await crypto.subtle.importKey(\n 'pkcs8',\n binaryData,\n { name: 'RSASSA-PKCS1-v1_5', hash: 'SHA-256' },\n true,\n ['sign'],\n );\n};\n\nconst buildJwt = async (credentials: GoogleCredentials) => {\n const now = Math.floor(Date.now() / 1000);\n\n // Only include kid in header if privateKeyId is provided\n const header: { alg: string; typ: string; kid?: string } = {\n alg: 'RS256',\n typ: 'JWT',\n };\n\n if (credentials.privateKeyId) {\n header.kid = credentials.privateKeyId;\n }\n\n const payload = {\n iss: credentials.clientEmail,\n scope: 'https://www.googleapis.com/auth/cloud-platform',\n aud: 'https://oauth2.googleapis.com/token',\n exp: now + 3600,\n iat: now,\n };\n\n const privateKey = await importPrivateKey(credentials.privateKey);\n\n const signingInput = `${base64url(JSON.stringify(header))}.${base64url(\n JSON.stringify(payload),\n )}`;\n const encoder = new TextEncoder();\n const data = encoder.encode(signingInput);\n\n const signature = await crypto.subtle.sign(\n 'RSASSA-PKCS1-v1_5',\n privateKey,\n data,\n );\n\n const signatureBase64 = base64url(\n String.fromCharCode(...new Uint8Array(signature)),\n );\n\n return `${base64url(JSON.stringify(header))}.${base64url(\n JSON.stringify(payload),\n )}.${signatureBase64}`;\n};\n\n/**\n * Generate an authentication token for Google Vertex AI in a manner compatible\n * with the Edge runtime.\n */\nexport async function generateAuthToken(credentials?: GoogleCredentials) {\n const creds = credentials || (await loadCredentials());\n const jwt = await buildJwt(creds);\n\n const response = await fetch('https://oauth2.googleapis.com/token', {\n method: 'POST',\n headers: withUserAgentSuffix(\n { 'Content-Type': 'application/x-www-form-urlencoded' },\n `ai-sdk-google-vertex/${VERSION}`,\n getRuntimeEnvironmentUserAgent(),\n ),\n body: new URLSearchParams({\n grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',\n assertion: jwt,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Token request failed: ${response.statusText}`);\n }\n\n const data = await response.json();\n return data.access_token;\n}\n","import {\n NoSuchModelError,\n type LanguageModelV4,\n type LanguageModelV4Usage,\n type ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n createOpenAICompatible,\n type OpenAICompatibleProvider,\n} from '@ai-sdk/openai-compatible';\nimport {\n loadOptionalSetting,\n loadSetting,\n withoutTrailingSlash,\n type FetchFunction,\n type Resolvable,\n} from '@ai-sdk/provider-utils';\nimport type { GoogleVertexXaiModelId } from './google-vertex-xai-options';\n\nexport interface GoogleVertexXaiProvider extends ProviderV4 {\n /**\n * Creates a model for text generation.\n */\n (modelId: GoogleVertexXaiModelId): LanguageModelV4;\n\n /**\n * Creates a model for text generation.\n */\n languageModel(modelId: GoogleVertexXaiModelId): LanguageModelV4;\n\n /**\n * Creates a chat model for text generation.\n */\n chatModel(modelId: GoogleVertexXaiModelId): LanguageModelV4;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: string): never;\n}\n\nexport interface GoogleVertexXaiProviderSettings {\n /**\n * Google Cloud project ID. Defaults to the value of the `GOOGLE_VERTEX_PROJECT` environment variable.\n */\n project?: string;\n\n /**\n * Google Cloud location/region. Defaults to the value of the `GOOGLE_VERTEX_LOCATION` environment variable.\n * Use 'global' for the global endpoint.\n */\n location?: string;\n\n /**\n * Base URL for the API calls. If not provided, will be constructed from project and location.\n */\n baseURL?: string;\n\n /**\n * Headers to use for requests. Can be:\n * - A headers object\n * - A Promise that resolves to a headers object\n * - A function that returns a headers object\n * - A function that returns a Promise of a headers object\n */\n headers?: Resolvable<Record<string, string | undefined>>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\ntype GoogleVertexXaiUsage =\n | {\n prompt_tokens?: number | null;\n completion_tokens?: number | null;\n prompt_tokens_details?: {\n cached_tokens?: number | null;\n } | null;\n completion_tokens_details?: {\n reasoning_tokens?: number | null;\n } | null;\n }\n | undefined\n | null;\n\nfunction convertGoogleVertexXaiUsage(\n usage: GoogleVertexXaiUsage,\n): LanguageModelV4Usage {\n if (usage == null) {\n return {\n inputTokens: {\n total: undefined,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: undefined,\n text: undefined,\n reasoning: undefined,\n },\n raw: undefined,\n };\n }\n\n const promptTokens = usage.prompt_tokens ?? 0;\n const completionTokens = usage.completion_tokens ?? 0;\n const cacheReadTokens = usage.prompt_tokens_details?.cached_tokens ?? 0;\n const reasoningTokens =\n usage.completion_tokens_details?.reasoning_tokens ?? 0;\n\n return {\n inputTokens: {\n total: promptTokens,\n noCache: promptTokens - cacheReadTokens,\n cacheRead: cacheReadTokens,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: completionTokens + reasoningTokens,\n text: completionTokens,\n reasoning: reasoningTokens,\n },\n raw: usage,\n };\n}\n\nfunction transformGoogleVertexXaiRequestBody(args: Record<string, any>) {\n const { reasoning_effort: _reasoningEffort, ...rest } = args;\n return rest;\n}\n\n/**\n * Create a Google Vertex AI xAI provider instance.\n * Uses the OpenAI-compatible Chat Completions API for Grok partner models.\n *\n * @see https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/grok\n */\nexport function createGoogleVertexXai(\n options: GoogleVertexXaiProviderSettings = {},\n): GoogleVertexXaiProvider {\n const loadLocation = () =>\n loadOptionalSetting({\n settingValue: options.location,\n environmentVariableName: 'GOOGLE_VERTEX_LOCATION',\n });\n\n const loadProject = () =>\n loadSetting({\n settingValue: options.project,\n settingName: 'project',\n environmentVariableName: 'GOOGLE_VERTEX_PROJECT',\n description: 'Google Vertex project',\n });\n\n const constructBaseURL = () => {\n const projectId = loadProject();\n const location = loadLocation() ?? 'global';\n\n return `https://aiplatform.googleapis.com/v1/projects/${projectId}/locations/${location}/endpoints/openapi`;\n };\n\n const loadBaseURL = () =>\n withoutTrailingSlash(options.baseURL ?? '') || constructBaseURL();\n\n let cachedProvider:\n | OpenAICompatibleProvider<GoogleVertexXaiModelId, string, string, string>\n | undefined;\n const getProvider = () =>\n (cachedProvider ??= createOpenAICompatible({\n name: 'googleVertex.xai',\n baseURL: loadBaseURL(),\n fetch: options.fetch,\n includeUsage: true,\n supportsStructuredOutputs: true,\n supportedUrls: () => ({\n 'image/*': [/^https?:\\/\\/.*$/],\n }),\n transformRequestBody: transformGoogleVertexXaiRequestBody,\n convertUsage: convertGoogleVertexXaiUsage,\n }));\n\n const createChatModel = (modelId: GoogleVertexXaiModelId) =>\n getProvider().languageModel(modelId);\n\n const provider = function (modelId: GoogleVertexXaiModelId) {\n if (new.target) {\n throw new Error(\n 'The Google Vertex xAI model function cannot be called with the new keyword.',\n );\n }\n\n return createChatModel(modelId);\n };\n\n provider.specificationVersion = 'v4' as const;\n provider.languageModel = createChatModel;\n provider.chatModel = (modelId: GoogleVertexXaiModelId) =>\n getProvider().chatModel(modelId);\n provider.embeddingModel = (modelId: string): never => {\n throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' });\n };\n provider.textEmbeddingModel = provider.embeddingModel;\n provider.imageModel = (modelId: string): never => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n\n return provider;\n}\n","import { resolve, type FetchFunction } from '@ai-sdk/provider-utils';\nimport {\n generateAuthToken,\n type GoogleCredentials,\n} from '../../edge/google-vertex-auth-edge';\nimport {\n createGoogleVertexXai as createGoogleVertexXaiOriginal,\n type GoogleVertexXaiProvider,\n type GoogleVertexXaiProviderSettings as GoogleVertexXaiProviderSettingsOriginal,\n} from '../google-vertex-xai-provider';\nexport type { GoogleVertexXaiProvider };\n\nexport interface GoogleVertexXaiProviderSettings extends GoogleVertexXaiProviderSettingsOriginal {\n /**\n * Optional. The Google credentials for the Google Cloud service account. If\n * not provided, the Google Vertex provider will use environment variables to\n * load the credentials.\n */\n googleCredentials?: GoogleCredentials;\n}\n\n/**\n * Create a Google Vertex AI xAI provider instance for Edge runtimes.\n * Uses the OpenAI-compatible Chat Completions API for Grok partner models.\n * Automatically handles Google Cloud authentication.\n *\n * @see https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/grok\n */\nexport function createGoogleVertexXai(\n options: GoogleVertexXaiProviderSettings = {},\n): GoogleVertexXaiProvider {\n const customFetch: FetchFunction = async (url, init) => {\n const token = await generateAuthToken(options.googleCredentials);\n const resolvedHeaders = await resolve(options.headers);\n const authHeaders = {\n ...resolvedHeaders,\n Authorization: `Bearer ${token}`,\n };\n\n const fetchInit = {\n ...init,\n headers: {\n ...init?.headers,\n ...authHeaders,\n },\n };\n\n return (options.fetch ?? fetch)(url, fetchInit);\n };\n\n return createGoogleVertexXaiOriginal({\n ...options,\n fetch: customFetch,\n headers: undefined,\n });\n}\n\n/**\n * Default Google Vertex AI xAI provider instance for Edge runtimes.\n */\nexport const googleVertexXai = createGoogleVertexXai();\n"],"mappings":"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"}