@ai-sdk/google-vertex 5.0.99 → 5.0.100

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.
@@ -1,7 +1,8 @@
1
- import { getRuntimeEnvironmentUserAgent, loadOptionalSetting, loadSetting, resolve, withUserAgentSuffix, withoutTrailingSlash } from "@ai-sdk/provider-utils";
1
+ import { getRuntimeEnvironmentUserAgent, isValidHostnamePart, loadOptionalSetting, loadSetting, resolve, withUserAgentSuffix, withoutTrailingSlash } from "@ai-sdk/provider-utils";
2
+ import { InvalidArgumentError } from "@ai-sdk/provider";
2
3
  import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
3
4
  //#region src/version.ts
4
- const VERSION = "5.0.99";
5
+ const VERSION = "5.0.100";
5
6
  //#endregion
6
7
  //#region src/edge/google-vertex-auth-edge.ts
7
8
  const loadCredentials = async () => {
@@ -100,10 +101,17 @@ function transformGoogleVertexMaasRequestBody(args) {
100
101
  * @see https://cloud.google.com/vertex-ai/generative-ai/docs/maas/use-open-models
101
102
  */
102
103
  function createGoogleVertexMaas$1(options = {}) {
103
- const loadLocation = () => loadOptionalSetting({
104
- settingValue: options.location,
105
- environmentVariableName: "GOOGLE_VERTEX_LOCATION"
106
- });
104
+ const loadLocation = () => {
105
+ const location = loadOptionalSetting({
106
+ settingValue: options.location,
107
+ environmentVariableName: "GOOGLE_VERTEX_LOCATION"
108
+ }) ?? "global";
109
+ if (!isValidHostnamePart(location)) throw new InvalidArgumentError({
110
+ argument: "location",
111
+ message: "Invalid Google Vertex location. Expected a single DNS label (letters, digits, and hyphens). Use `baseURL` for custom endpoints."
112
+ });
113
+ return location;
114
+ };
107
115
  const loadProject = () => loadSetting({
108
116
  settingValue: options.project,
109
117
  settingName: "project",
@@ -117,7 +125,7 @@ function createGoogleVertexMaas$1(options = {}) {
117
125
  };
118
126
  const constructBaseURL = () => {
119
127
  const projectId = loadProject();
120
- const location = loadLocation() ?? "global";
128
+ const location = loadLocation();
121
129
  return `https://${getHost(location)}/v1/projects/${projectId}/locations/${location}/endpoints/openapi`;
122
130
  };
123
131
  const loadBaseURL = () => withoutTrailingSlash(options.baseURL ?? "") || constructBaseURL();
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["createGoogleVertexMaas","createVertexMaasOriginal"],"sources":["../../../src/version.ts","../../../src/edge/google-vertex-auth-edge.ts","../../../src/maas/google-vertex-maas-provider.ts","../../../src/maas/edge/google-vertex-maas-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 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 { GoogleVertexMaasModelId } from './google-vertex-maas-options';\n\nconst maxOutputTokensByModel: Record<string, number | undefined> = {\n 'meta/llama-4-maverick-17b-128e-instruct-maas': 8192,\n 'meta/llama-4-scout-17b-16e-instruct-maas': 8192,\n};\n\nfunction transformGoogleVertexMaasRequestBody(args: Record<string, any>) {\n const maxOutputTokens = maxOutputTokensByModel[args.model];\n\n return maxOutputTokens != null && args.max_tokens === undefined\n ? { ...args, max_tokens: maxOutputTokens }\n : args;\n}\n\nexport interface GoogleVertexMaasProvider extends OpenAICompatibleProvider<\n GoogleVertexMaasModelId,\n string,\n string,\n string\n> {}\n\nexport interface GoogleVertexMaasProviderSettings {\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\n/**\n * Create a Google Vertex AI MaaS (Model as a Service) provider instance.\n * Uses the OpenAI-compatible Chat Completions API for partner and open models.\n *\n * @see https://cloud.google.com/vertex-ai/generative-ai/docs/maas/use-open-models\n */\nexport function createGoogleVertexMaas(\n options: GoogleVertexMaasProviderSettings = {},\n): GoogleVertexMaasProvider {\n // Lazy-load settings to support loading from environment variables at runtime\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 getHost = (location: string) => {\n if (location === 'global') {\n return 'aiplatform.googleapis.com';\n } else if (location === 'eu' || location === 'us') {\n return `aiplatform.${location}.rep.googleapis.com`;\n } else {\n return `${location}-aiplatform.googleapis.com`;\n }\n };\n\n const constructBaseURL = () => {\n const projectId = loadProject();\n const location = loadLocation() ?? 'global';\n\n return `https://${getHost(location)}/v1/projects/${projectId}/locations/${location}/endpoints/openapi`;\n };\n\n const loadBaseURL = () =>\n withoutTrailingSlash(options.baseURL ?? '') || constructBaseURL();\n\n let cachedProvider: GoogleVertexMaasProvider | undefined;\n const getProvider = () =>\n (cachedProvider ??= createOpenAICompatible({\n name: 'vertex.maas',\n baseURL: loadBaseURL(),\n fetch: options.fetch,\n transformRequestBody: transformGoogleVertexMaasRequestBody,\n }));\n\n const provider = (modelId: GoogleVertexMaasModelId) => getProvider()(modelId);\n\n provider.specificationVersion = 'v4' as const;\n provider.languageModel = (modelId: GoogleVertexMaasModelId) =>\n getProvider().languageModel(modelId);\n provider.chatModel = (modelId: GoogleVertexMaasModelId) =>\n getProvider().chatModel(modelId);\n provider.completionModel = (modelId: string) =>\n getProvider().completionModel(modelId);\n provider.embeddingModel = (modelId: string) =>\n getProvider().embeddingModel(modelId);\n provider.textEmbeddingModel = (modelId: string) =>\n getProvider().textEmbeddingModel(modelId);\n provider.imageModel = (modelId: string) => getProvider().imageModel(modelId);\n\n return provider as GoogleVertexMaasProvider;\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 createGoogleVertexMaas as createVertexMaasOriginal,\n type GoogleVertexMaasProvider,\n type GoogleVertexMaasProviderSettings as GoogleVertexMaasProviderSettingsOriginal,\n} from '../google-vertex-maas-provider';\nexport type { GoogleVertexMaasProvider };\n\nexport interface GoogleVertexMaasProviderSettings extends GoogleVertexMaasProviderSettingsOriginal {\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 MaaS (Model as a Service) provider instance for Edge runtimes.\n * Uses the OpenAI-compatible Chat Completions API for partner and open models.\n * Automatically handles Google Cloud authentication.\n *\n * @see https://cloud.google.com/vertex-ai/generative-ai/docs/maas/use-open-models\n */\nexport function createGoogleVertexMaas(\n options: GoogleVertexMaasProviderSettings = {},\n): GoogleVertexMaasProvider {\n // Create a custom fetch wrapper that adds auth headers\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 // Merge auth headers with existing headers from init\n const fetchInit = {\n ...init,\n headers: {\n ...init?.headers,\n ...authHeaders,\n },\n };\n\n // Call the original fetch or user's custom fetch\n return (options.fetch ?? fetch)(url, fetchInit);\n };\n\n return createVertexMaasOriginal({\n ...options,\n fetch: customFetch,\n headers: undefined, // Don't pass headers, we handle them in fetch\n });\n}\n\n/**\n * Default Google Vertex AI MaaS provider instance for Edge runtimes.\n */\nexport const googleVertexMaas = createGoogleVertexMaas();\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["createGoogleVertexMaas","createVertexMaasOriginal"],"sources":["../../../src/version.ts","../../../src/edge/google-vertex-auth-edge.ts","../../../src/maas/google-vertex-maas-provider.ts","../../../src/maas/edge/google-vertex-maas-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 { InvalidArgumentError } from '@ai-sdk/provider';\nimport {\n createOpenAICompatible,\n type OpenAICompatibleProvider,\n} from '@ai-sdk/openai-compatible';\nimport {\n isValidHostnamePart,\n loadOptionalSetting,\n loadSetting,\n withoutTrailingSlash,\n type FetchFunction,\n type Resolvable,\n} from '@ai-sdk/provider-utils';\nimport type { GoogleVertexMaasModelId } from './google-vertex-maas-options';\n\nconst maxOutputTokensByModel: Record<string, number | undefined> = {\n 'meta/llama-4-maverick-17b-128e-instruct-maas': 8192,\n 'meta/llama-4-scout-17b-16e-instruct-maas': 8192,\n};\n\nfunction transformGoogleVertexMaasRequestBody(args: Record<string, any>) {\n const maxOutputTokens = maxOutputTokensByModel[args.model];\n\n return maxOutputTokens != null && args.max_tokens === undefined\n ? { ...args, max_tokens: maxOutputTokens }\n : args;\n}\n\nexport interface GoogleVertexMaasProvider extends OpenAICompatibleProvider<\n GoogleVertexMaasModelId,\n string,\n string,\n string\n> {}\n\nexport interface GoogleVertexMaasProviderSettings {\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\n/**\n * Create a Google Vertex AI MaaS (Model as a Service) provider instance.\n * Uses the OpenAI-compatible Chat Completions API for partner and open models.\n *\n * @see https://cloud.google.com/vertex-ai/generative-ai/docs/maas/use-open-models\n */\nexport function createGoogleVertexMaas(\n options: GoogleVertexMaasProviderSettings = {},\n): GoogleVertexMaasProvider {\n // Lazy-load settings to support loading from environment variables at runtime\n const loadLocation = () => {\n const location =\n loadOptionalSetting({\n settingValue: options.location,\n environmentVariableName: 'GOOGLE_VERTEX_LOCATION',\n }) ?? 'global';\n if (!isValidHostnamePart(location)) {\n throw new InvalidArgumentError({\n argument: 'location',\n message:\n 'Invalid Google Vertex location. Expected a single DNS label (letters, digits, and hyphens). Use `baseURL` for custom endpoints.',\n });\n }\n return 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 getHost = (location: string) => {\n if (location === 'global') {\n return 'aiplatform.googleapis.com';\n } else if (location === 'eu' || location === 'us') {\n return `aiplatform.${location}.rep.googleapis.com`;\n } else {\n return `${location}-aiplatform.googleapis.com`;\n }\n };\n\n const constructBaseURL = () => {\n const projectId = loadProject();\n const location = loadLocation();\n\n return `https://${getHost(location)}/v1/projects/${projectId}/locations/${location}/endpoints/openapi`;\n };\n\n const loadBaseURL = () =>\n withoutTrailingSlash(options.baseURL ?? '') || constructBaseURL();\n\n let cachedProvider: GoogleVertexMaasProvider | undefined;\n const getProvider = () =>\n (cachedProvider ??= createOpenAICompatible({\n name: 'vertex.maas',\n baseURL: loadBaseURL(),\n fetch: options.fetch,\n transformRequestBody: transformGoogleVertexMaasRequestBody,\n }));\n\n const provider = (modelId: GoogleVertexMaasModelId) => getProvider()(modelId);\n\n provider.specificationVersion = 'v4' as const;\n provider.languageModel = (modelId: GoogleVertexMaasModelId) =>\n getProvider().languageModel(modelId);\n provider.chatModel = (modelId: GoogleVertexMaasModelId) =>\n getProvider().chatModel(modelId);\n provider.completionModel = (modelId: string) =>\n getProvider().completionModel(modelId);\n provider.embeddingModel = (modelId: string) =>\n getProvider().embeddingModel(modelId);\n provider.textEmbeddingModel = (modelId: string) =>\n getProvider().textEmbeddingModel(modelId);\n provider.imageModel = (modelId: string) => getProvider().imageModel(modelId);\n\n return provider as GoogleVertexMaasProvider;\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 createGoogleVertexMaas as createVertexMaasOriginal,\n type GoogleVertexMaasProvider,\n type GoogleVertexMaasProviderSettings as GoogleVertexMaasProviderSettingsOriginal,\n} from '../google-vertex-maas-provider';\nexport type { GoogleVertexMaasProvider };\n\nexport interface GoogleVertexMaasProviderSettings extends GoogleVertexMaasProviderSettingsOriginal {\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 MaaS (Model as a Service) provider instance for Edge runtimes.\n * Uses the OpenAI-compatible Chat Completions API for partner and open models.\n * Automatically handles Google Cloud authentication.\n *\n * @see https://cloud.google.com/vertex-ai/generative-ai/docs/maas/use-open-models\n */\nexport function createGoogleVertexMaas(\n options: GoogleVertexMaasProviderSettings = {},\n): GoogleVertexMaasProvider {\n // Create a custom fetch wrapper that adds auth headers\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 // Merge auth headers with existing headers from init\n const fetchInit = {\n ...init,\n headers: {\n ...init?.headers,\n ...authHeaders,\n },\n };\n\n // Call the original fetch or user's custom fetch\n return (options.fetch ?? fetch)(url, fetchInit);\n };\n\n return createVertexMaasOriginal({\n ...options,\n fetch: customFetch,\n headers: undefined, // Don't pass headers, we handle them in fetch\n });\n}\n\n/**\n * Default Google Vertex AI MaaS provider instance for Edge runtimes.\n */\nexport const googleVertexMaas = createGoogleVertexMaas();\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":["GoogleVertexMaasProviderSettings","GoogleVertexMaasProviderSettingsOriginal"],"sources":["../../src/maas/google-vertex-maas-options.ts","../../src/maas/google-vertex-maas-provider.ts","../../src/maas/google-vertex-maas-provider-node.ts"],"mappings":";;;;KACY;;;UCyBK,iCAAiC,yBAChD;UAMeA;;;;EAIf;;;;;EAMA;;;;EAKA;;;;;;;;EASA,UAAU,WAAW;;;;;EAMrB,QAAQ;;;;UCrDO,yCAAyCC;;;;;;;EAOxD,oBAAoB;;;;;;;;;wBAUN,uBACd,UAAS,mCACR;;;;qBAmCU,kBAAgB"}
1
+ {"version":3,"file":"index.d.ts","names":["GoogleVertexMaasProviderSettings","GoogleVertexMaasProviderSettingsOriginal"],"sources":["../../src/maas/google-vertex-maas-options.ts","../../src/maas/google-vertex-maas-provider.ts","../../src/maas/google-vertex-maas-provider-node.ts"],"mappings":";;;;KACY;;;UC2BK,iCAAiC,yBAChD;UAMeA;;;;EAIf;;;;;EAMA;;;;EAKA;;;;;;;;EASA,UAAU,WAAW;;;;;EAMrB,QAAQ;;;;UCvDO,yCAAyCC;;;;;;;EAOxD,oBAAoB;;;;;;;;;wBAUN,uBACd,UAAS,mCACR;;;;qBAmCU,kBAAgB"}
@@ -1,5 +1,6 @@
1
- import { loadOptionalSetting, loadSetting, resolve, withoutTrailingSlash } from "@ai-sdk/provider-utils";
1
+ import { isValidHostnamePart, loadOptionalSetting, loadSetting, resolve, withoutTrailingSlash } from "@ai-sdk/provider-utils";
2
2
  import { GoogleAuth } from "google-auth-library";
3
+ import { InvalidArgumentError } from "@ai-sdk/provider";
3
4
  import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
4
5
  //#region src/google-vertex-auth-google-auth-library.ts
5
6
  function createAuthTokenGenerator(options) {
@@ -31,10 +32,17 @@ function transformGoogleVertexMaasRequestBody(args) {
31
32
  * @see https://cloud.google.com/vertex-ai/generative-ai/docs/maas/use-open-models
32
33
  */
33
34
  function createGoogleVertexMaas$1(options = {}) {
34
- const loadLocation = () => loadOptionalSetting({
35
- settingValue: options.location,
36
- environmentVariableName: "GOOGLE_VERTEX_LOCATION"
37
- });
35
+ const loadLocation = () => {
36
+ const location = loadOptionalSetting({
37
+ settingValue: options.location,
38
+ environmentVariableName: "GOOGLE_VERTEX_LOCATION"
39
+ }) ?? "global";
40
+ if (!isValidHostnamePart(location)) throw new InvalidArgumentError({
41
+ argument: "location",
42
+ message: "Invalid Google Vertex location. Expected a single DNS label (letters, digits, and hyphens). Use `baseURL` for custom endpoints."
43
+ });
44
+ return location;
45
+ };
38
46
  const loadProject = () => loadSetting({
39
47
  settingValue: options.project,
40
48
  settingName: "project",
@@ -48,7 +56,7 @@ function createGoogleVertexMaas$1(options = {}) {
48
56
  };
49
57
  const constructBaseURL = () => {
50
58
  const projectId = loadProject();
51
- const location = loadLocation() ?? "global";
59
+ const location = loadLocation();
52
60
  return `https://${getHost(location)}/v1/projects/${projectId}/locations/${location}/endpoints/openapi`;
53
61
  };
54
62
  const loadBaseURL = () => withoutTrailingSlash(options.baseURL ?? "") || constructBaseURL();
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["createGoogleVertexMaas","createVertexMaasOriginal"],"sources":["../../src/google-vertex-auth-google-auth-library.ts","../../src/maas/google-vertex-maas-provider.ts","../../src/maas/google-vertex-maas-provider-node.ts"],"sourcesContent":["import { GoogleAuth, type GoogleAuthOptions } from 'google-auth-library';\n\nexport function createAuthTokenGenerator(options?: GoogleAuthOptions) {\n const auth = new GoogleAuth({\n scopes: ['https://www.googleapis.com/auth/cloud-platform'],\n ...options,\n });\n\n return async function generateAuthToken() {\n const client = await auth.getClient();\n const token = await client.getAccessToken();\n return token?.token ?? null;\n };\n}\n","import {\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 { GoogleVertexMaasModelId } from './google-vertex-maas-options';\n\nconst maxOutputTokensByModel: Record<string, number | undefined> = {\n 'meta/llama-4-maverick-17b-128e-instruct-maas': 8192,\n 'meta/llama-4-scout-17b-16e-instruct-maas': 8192,\n};\n\nfunction transformGoogleVertexMaasRequestBody(args: Record<string, any>) {\n const maxOutputTokens = maxOutputTokensByModel[args.model];\n\n return maxOutputTokens != null && args.max_tokens === undefined\n ? { ...args, max_tokens: maxOutputTokens }\n : args;\n}\n\nexport interface GoogleVertexMaasProvider extends OpenAICompatibleProvider<\n GoogleVertexMaasModelId,\n string,\n string,\n string\n> {}\n\nexport interface GoogleVertexMaasProviderSettings {\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\n/**\n * Create a Google Vertex AI MaaS (Model as a Service) provider instance.\n * Uses the OpenAI-compatible Chat Completions API for partner and open models.\n *\n * @see https://cloud.google.com/vertex-ai/generative-ai/docs/maas/use-open-models\n */\nexport function createGoogleVertexMaas(\n options: GoogleVertexMaasProviderSettings = {},\n): GoogleVertexMaasProvider {\n // Lazy-load settings to support loading from environment variables at runtime\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 getHost = (location: string) => {\n if (location === 'global') {\n return 'aiplatform.googleapis.com';\n } else if (location === 'eu' || location === 'us') {\n return `aiplatform.${location}.rep.googleapis.com`;\n } else {\n return `${location}-aiplatform.googleapis.com`;\n }\n };\n\n const constructBaseURL = () => {\n const projectId = loadProject();\n const location = loadLocation() ?? 'global';\n\n return `https://${getHost(location)}/v1/projects/${projectId}/locations/${location}/endpoints/openapi`;\n };\n\n const loadBaseURL = () =>\n withoutTrailingSlash(options.baseURL ?? '') || constructBaseURL();\n\n let cachedProvider: GoogleVertexMaasProvider | undefined;\n const getProvider = () =>\n (cachedProvider ??= createOpenAICompatible({\n name: 'vertex.maas',\n baseURL: loadBaseURL(),\n fetch: options.fetch,\n transformRequestBody: transformGoogleVertexMaasRequestBody,\n }));\n\n const provider = (modelId: GoogleVertexMaasModelId) => getProvider()(modelId);\n\n provider.specificationVersion = 'v4' as const;\n provider.languageModel = (modelId: GoogleVertexMaasModelId) =>\n getProvider().languageModel(modelId);\n provider.chatModel = (modelId: GoogleVertexMaasModelId) =>\n getProvider().chatModel(modelId);\n provider.completionModel = (modelId: string) =>\n getProvider().completionModel(modelId);\n provider.embeddingModel = (modelId: string) =>\n getProvider().embeddingModel(modelId);\n provider.textEmbeddingModel = (modelId: string) =>\n getProvider().textEmbeddingModel(modelId);\n provider.imageModel = (modelId: string) => getProvider().imageModel(modelId);\n\n return provider as GoogleVertexMaasProvider;\n}\n","import { resolve, type FetchFunction } from '@ai-sdk/provider-utils';\nimport type { GoogleAuthOptions } from 'google-auth-library';\nimport { createAuthTokenGenerator } from '../google-vertex-auth-google-auth-library';\nimport {\n createGoogleVertexMaas as createVertexMaasOriginal,\n type GoogleVertexMaasProvider,\n type GoogleVertexMaasProviderSettings as GoogleVertexMaasProviderSettingsOriginal,\n} from './google-vertex-maas-provider';\nexport type { GoogleVertexMaasProvider };\n\nexport interface GoogleVertexMaasProviderSettings extends GoogleVertexMaasProviderSettingsOriginal {\n /**\n * Optional. The Authentication options provided by google-auth-library.\n * Complete list of authentication options is documented in the\n * GoogleAuthOptions interface:\n * https://github.com/googleapis/google-auth-library-nodejs/blob/main/src/auth/googleauth.ts.\n */\n googleAuthOptions?: GoogleAuthOptions;\n}\n\n/**\n * Create a Google Vertex AI MaaS (Model as a Service) provider instance for Node.js.\n * Uses the OpenAI-compatible Chat Completions API for partner and open models.\n * Automatically handles Google Cloud authentication.\n *\n * @see https://cloud.google.com/vertex-ai/generative-ai/docs/maas/use-open-models\n */\nexport function createGoogleVertexMaas(\n options: GoogleVertexMaasProviderSettings = {},\n): GoogleVertexMaasProvider {\n const generateAuthToken = createAuthTokenGenerator(options.googleAuthOptions);\n\n // Create a custom fetch wrapper that adds auth headers\n const customFetch: FetchFunction = async (url, init) => {\n const token = await generateAuthToken();\n const resolvedHeaders = await resolve(options.headers);\n const authHeaders = {\n ...resolvedHeaders,\n Authorization: `Bearer ${token}`,\n };\n\n // Merge auth headers with existing headers from init\n const fetchInit = {\n ...init,\n headers: {\n ...init?.headers,\n ...authHeaders,\n },\n };\n\n // Call the original fetch or user's custom fetch\n return (options.fetch ?? fetch)(url, fetchInit);\n };\n\n return createVertexMaasOriginal({\n ...options,\n fetch: customFetch,\n headers: undefined, // Don't pass headers, we handle them in fetch\n });\n}\n\n/**\n * Default Google Vertex AI MaaS provider instance for Node.js.\n */\nexport const googleVertexMaas = createGoogleVertexMaas();\n"],"mappings":";;;;AAEA,SAAgB,yBAAyB,SAA6B;CACpE,MAAM,OAAO,IAAI,WAAW;EAC1B,QAAQ,CAAC,gDAAgD;EACzD,GAAG;CACL,CAAC;CAED,OAAO,eAAe,oBAAoB;EAGxC,QAAO,OADa,MADC,KAAK,UAAU,EAAA,CACT,eAAe,EAAA,EAC5B,SAAS;CACzB;AACF;;;ACAA,MAAM,yBAA6D;CACjE,gDAAgD;CAChD,4CAA4C;AAC9C;AAEA,SAAS,qCAAqC,MAA2B;CACvE,MAAM,kBAAkB,uBAAuB,KAAK;CAEpD,OAAO,mBAAmB,QAAQ,KAAK,eAAe,KAAA,IAClD;EAAE,GAAG;EAAM,YAAY;CAAgB,IACvC;AACN;;;;;;;AAgDA,SAAgBA,yBACd,UAA4C,CAAC,GACnB;CAE1B,MAAM,qBACJ,oBAAoB;EAClB,cAAc,QAAQ;EACtB,yBAAyB;CAC3B,CAAC;CAEH,MAAM,oBACJ,YAAY;EACV,cAAc,QAAQ;EACtB,aAAa;EACb,yBAAyB;EACzB,aAAa;CACf,CAAC;CAEH,MAAM,WAAW,aAAqB;EACpC,IAAI,aAAa,UACf,OAAO;OACF,IAAI,aAAa,QAAQ,aAAa,MAC3C,OAAO,cAAc,SAAS;OAE9B,OAAO,GAAG,SAAS;CAEvB;CAEA,MAAM,yBAAyB;EAC7B,MAAM,YAAY,YAAY;EAC9B,MAAM,WAAW,aAAa,KAAK;EAEnC,OAAO,WAAW,QAAQ,QAAQ,EAAE,eAAe,UAAU,aAAa,SAAS;CACrF;CAEA,MAAM,oBACJ,qBAAqB,QAAQ,WAAW,EAAE,KAAK,iBAAiB;CAElE,IAAI;CACJ,MAAM,oBACH,mBAAmB,uBAAuB;EACzC,MAAM;EACN,SAAS,YAAY;EACrB,OAAO,QAAQ;EACf,sBAAsB;CACxB,CAAC;CAEH,MAAM,YAAY,YAAqC,YAAY,CAAC,CAAC,OAAO;CAE5E,SAAS,uBAAuB;CAChC,SAAS,iBAAiB,YACxB,YAAY,CAAC,CAAC,cAAc,OAAO;CACrC,SAAS,aAAa,YACpB,YAAY,CAAC,CAAC,UAAU,OAAO;CACjC,SAAS,mBAAmB,YAC1B,YAAY,CAAC,CAAC,gBAAgB,OAAO;CACvC,SAAS,kBAAkB,YACzB,YAAY,CAAC,CAAC,eAAe,OAAO;CACtC,SAAS,sBAAsB,YAC7B,YAAY,CAAC,CAAC,mBAAmB,OAAO;CAC1C,SAAS,cAAc,YAAoB,YAAY,CAAC,CAAC,WAAW,OAAO;CAE3E,OAAO;AACT;;;;;;;;;;AC5GA,SAAgB,uBACd,UAA4C,CAAC,GACnB;CAC1B,MAAM,oBAAoB,yBAAyB,QAAQ,iBAAiB;CAG5E,MAAM,cAA6B,OAAO,KAAK,SAAS;EACtD,MAAM,QAAQ,MAAM,kBAAkB;EAEtC,MAAM,cAAc;GAClB,GAAG,MAFyB,QAAQ,QAAQ,OAAO;GAGnD,eAAe,UAAU;EAC3B;EAGA,MAAM,YAAY;GAChB,GAAG;GACH,SAAS;IACP,GAAG,MAAM;IACT,GAAG;GACL;EACF;EAGA,QAAQ,QAAQ,SAAS,MAAA,CAAO,KAAK,SAAS;CAChD;CAEA,OAAOC,yBAAyB;EAC9B,GAAG;EACH,OAAO;EACP,SAAS,KAAA;CACX,CAAC;AACH;;;;AAKA,MAAa,mBAAmB,uBAAuB"}
1
+ {"version":3,"file":"index.js","names":["createGoogleVertexMaas","createVertexMaasOriginal"],"sources":["../../src/google-vertex-auth-google-auth-library.ts","../../src/maas/google-vertex-maas-provider.ts","../../src/maas/google-vertex-maas-provider-node.ts"],"sourcesContent":["import { GoogleAuth, type GoogleAuthOptions } from 'google-auth-library';\n\nexport function createAuthTokenGenerator(options?: GoogleAuthOptions) {\n const auth = new GoogleAuth({\n scopes: ['https://www.googleapis.com/auth/cloud-platform'],\n ...options,\n });\n\n return async function generateAuthToken() {\n const client = await auth.getClient();\n const token = await client.getAccessToken();\n return token?.token ?? null;\n };\n}\n","import { InvalidArgumentError } from '@ai-sdk/provider';\nimport {\n createOpenAICompatible,\n type OpenAICompatibleProvider,\n} from '@ai-sdk/openai-compatible';\nimport {\n isValidHostnamePart,\n loadOptionalSetting,\n loadSetting,\n withoutTrailingSlash,\n type FetchFunction,\n type Resolvable,\n} from '@ai-sdk/provider-utils';\nimport type { GoogleVertexMaasModelId } from './google-vertex-maas-options';\n\nconst maxOutputTokensByModel: Record<string, number | undefined> = {\n 'meta/llama-4-maverick-17b-128e-instruct-maas': 8192,\n 'meta/llama-4-scout-17b-16e-instruct-maas': 8192,\n};\n\nfunction transformGoogleVertexMaasRequestBody(args: Record<string, any>) {\n const maxOutputTokens = maxOutputTokensByModel[args.model];\n\n return maxOutputTokens != null && args.max_tokens === undefined\n ? { ...args, max_tokens: maxOutputTokens }\n : args;\n}\n\nexport interface GoogleVertexMaasProvider extends OpenAICompatibleProvider<\n GoogleVertexMaasModelId,\n string,\n string,\n string\n> {}\n\nexport interface GoogleVertexMaasProviderSettings {\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\n/**\n * Create a Google Vertex AI MaaS (Model as a Service) provider instance.\n * Uses the OpenAI-compatible Chat Completions API for partner and open models.\n *\n * @see https://cloud.google.com/vertex-ai/generative-ai/docs/maas/use-open-models\n */\nexport function createGoogleVertexMaas(\n options: GoogleVertexMaasProviderSettings = {},\n): GoogleVertexMaasProvider {\n // Lazy-load settings to support loading from environment variables at runtime\n const loadLocation = () => {\n const location =\n loadOptionalSetting({\n settingValue: options.location,\n environmentVariableName: 'GOOGLE_VERTEX_LOCATION',\n }) ?? 'global';\n if (!isValidHostnamePart(location)) {\n throw new InvalidArgumentError({\n argument: 'location',\n message:\n 'Invalid Google Vertex location. Expected a single DNS label (letters, digits, and hyphens). Use `baseURL` for custom endpoints.',\n });\n }\n return 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 getHost = (location: string) => {\n if (location === 'global') {\n return 'aiplatform.googleapis.com';\n } else if (location === 'eu' || location === 'us') {\n return `aiplatform.${location}.rep.googleapis.com`;\n } else {\n return `${location}-aiplatform.googleapis.com`;\n }\n };\n\n const constructBaseURL = () => {\n const projectId = loadProject();\n const location = loadLocation();\n\n return `https://${getHost(location)}/v1/projects/${projectId}/locations/${location}/endpoints/openapi`;\n };\n\n const loadBaseURL = () =>\n withoutTrailingSlash(options.baseURL ?? '') || constructBaseURL();\n\n let cachedProvider: GoogleVertexMaasProvider | undefined;\n const getProvider = () =>\n (cachedProvider ??= createOpenAICompatible({\n name: 'vertex.maas',\n baseURL: loadBaseURL(),\n fetch: options.fetch,\n transformRequestBody: transformGoogleVertexMaasRequestBody,\n }));\n\n const provider = (modelId: GoogleVertexMaasModelId) => getProvider()(modelId);\n\n provider.specificationVersion = 'v4' as const;\n provider.languageModel = (modelId: GoogleVertexMaasModelId) =>\n getProvider().languageModel(modelId);\n provider.chatModel = (modelId: GoogleVertexMaasModelId) =>\n getProvider().chatModel(modelId);\n provider.completionModel = (modelId: string) =>\n getProvider().completionModel(modelId);\n provider.embeddingModel = (modelId: string) =>\n getProvider().embeddingModel(modelId);\n provider.textEmbeddingModel = (modelId: string) =>\n getProvider().textEmbeddingModel(modelId);\n provider.imageModel = (modelId: string) => getProvider().imageModel(modelId);\n\n return provider as GoogleVertexMaasProvider;\n}\n","import { resolve, type FetchFunction } from '@ai-sdk/provider-utils';\nimport type { GoogleAuthOptions } from 'google-auth-library';\nimport { createAuthTokenGenerator } from '../google-vertex-auth-google-auth-library';\nimport {\n createGoogleVertexMaas as createVertexMaasOriginal,\n type GoogleVertexMaasProvider,\n type GoogleVertexMaasProviderSettings as GoogleVertexMaasProviderSettingsOriginal,\n} from './google-vertex-maas-provider';\nexport type { GoogleVertexMaasProvider };\n\nexport interface GoogleVertexMaasProviderSettings extends GoogleVertexMaasProviderSettingsOriginal {\n /**\n * Optional. The Authentication options provided by google-auth-library.\n * Complete list of authentication options is documented in the\n * GoogleAuthOptions interface:\n * https://github.com/googleapis/google-auth-library-nodejs/blob/main/src/auth/googleauth.ts.\n */\n googleAuthOptions?: GoogleAuthOptions;\n}\n\n/**\n * Create a Google Vertex AI MaaS (Model as a Service) provider instance for Node.js.\n * Uses the OpenAI-compatible Chat Completions API for partner and open models.\n * Automatically handles Google Cloud authentication.\n *\n * @see https://cloud.google.com/vertex-ai/generative-ai/docs/maas/use-open-models\n */\nexport function createGoogleVertexMaas(\n options: GoogleVertexMaasProviderSettings = {},\n): GoogleVertexMaasProvider {\n const generateAuthToken = createAuthTokenGenerator(options.googleAuthOptions);\n\n // Create a custom fetch wrapper that adds auth headers\n const customFetch: FetchFunction = async (url, init) => {\n const token = await generateAuthToken();\n const resolvedHeaders = await resolve(options.headers);\n const authHeaders = {\n ...resolvedHeaders,\n Authorization: `Bearer ${token}`,\n };\n\n // Merge auth headers with existing headers from init\n const fetchInit = {\n ...init,\n headers: {\n ...init?.headers,\n ...authHeaders,\n },\n };\n\n // Call the original fetch or user's custom fetch\n return (options.fetch ?? fetch)(url, fetchInit);\n };\n\n return createVertexMaasOriginal({\n ...options,\n fetch: customFetch,\n headers: undefined, // Don't pass headers, we handle them in fetch\n });\n}\n\n/**\n * Default Google Vertex AI MaaS provider instance for Node.js.\n */\nexport const googleVertexMaas = createGoogleVertexMaas();\n"],"mappings":";;;;;AAEA,SAAgB,yBAAyB,SAA6B;CACpE,MAAM,OAAO,IAAI,WAAW;EAC1B,QAAQ,CAAC,gDAAgD;EACzD,GAAG;CACL,CAAC;CAED,OAAO,eAAe,oBAAoB;EAGxC,QAAO,OADa,MADC,KAAK,UAAU,EAAA,CACT,eAAe,EAAA,EAC5B,SAAS;CACzB;AACF;;;ACEA,MAAM,yBAA6D;CACjE,gDAAgD;CAChD,4CAA4C;AAC9C;AAEA,SAAS,qCAAqC,MAA2B;CACvE,MAAM,kBAAkB,uBAAuB,KAAK;CAEpD,OAAO,mBAAmB,QAAQ,KAAK,eAAe,KAAA,IAClD;EAAE,GAAG;EAAM,YAAY;CAAgB,IACvC;AACN;;;;;;;AAgDA,SAAgBA,yBACd,UAA4C,CAAC,GACnB;CAE1B,MAAM,qBAAqB;EACzB,MAAM,WACJ,oBAAoB;GAClB,cAAc,QAAQ;GACtB,yBAAyB;EAC3B,CAAC,KAAK;EACR,IAAI,CAAC,oBAAoB,QAAQ,GAC/B,MAAM,IAAI,qBAAqB;GAC7B,UAAU;GACV,SACE;EACJ,CAAC;EAEH,OAAO;CACT;CAEA,MAAM,oBACJ,YAAY;EACV,cAAc,QAAQ;EACtB,aAAa;EACb,yBAAyB;EACzB,aAAa;CACf,CAAC;CAEH,MAAM,WAAW,aAAqB;EACpC,IAAI,aAAa,UACf,OAAO;OACF,IAAI,aAAa,QAAQ,aAAa,MAC3C,OAAO,cAAc,SAAS;OAE9B,OAAO,GAAG,SAAS;CAEvB;CAEA,MAAM,yBAAyB;EAC7B,MAAM,YAAY,YAAY;EAC9B,MAAM,WAAW,aAAa;EAE9B,OAAO,WAAW,QAAQ,QAAQ,EAAE,eAAe,UAAU,aAAa,SAAS;CACrF;CAEA,MAAM,oBACJ,qBAAqB,QAAQ,WAAW,EAAE,KAAK,iBAAiB;CAElE,IAAI;CACJ,MAAM,oBACH,mBAAmB,uBAAuB;EACzC,MAAM;EACN,SAAS,YAAY;EACrB,OAAO,QAAQ;EACf,sBAAsB;CACxB,CAAC;CAEH,MAAM,YAAY,YAAqC,YAAY,CAAC,CAAC,OAAO;CAE5E,SAAS,uBAAuB;CAChC,SAAS,iBAAiB,YACxB,YAAY,CAAC,CAAC,cAAc,OAAO;CACrC,SAAS,aAAa,YACpB,YAAY,CAAC,CAAC,UAAU,OAAO;CACjC,SAAS,mBAAmB,YAC1B,YAAY,CAAC,CAAC,gBAAgB,OAAO;CACvC,SAAS,kBAAkB,YACzB,YAAY,CAAC,CAAC,eAAe,OAAO;CACtC,SAAS,sBAAsB,YAC7B,YAAY,CAAC,CAAC,mBAAmB,OAAO;CAC1C,SAAS,cAAc,YAAoB,YAAY,CAAC,CAAC,WAAW,OAAO;CAE3E,OAAO;AACT;;;;;;;;;;ACxHA,SAAgB,uBACd,UAA4C,CAAC,GACnB;CAC1B,MAAM,oBAAoB,yBAAyB,QAAQ,iBAAiB;CAG5E,MAAM,cAA6B,OAAO,KAAK,SAAS;EACtD,MAAM,QAAQ,MAAM,kBAAkB;EAEtC,MAAM,cAAc;GAClB,GAAG,MAFyB,QAAQ,QAAQ,OAAO;GAGnD,eAAe,UAAU;EAC3B;EAGA,MAAM,YAAY;GAChB,GAAG;GACH,SAAS;IACP,GAAG,MAAM;IACT,GAAG;GACL;EACF;EAGA,QAAQ,QAAQ,SAAS,MAAA,CAAO,KAAK,SAAS;CAChD;CAEA,OAAOC,yBAAyB;EAC9B,GAAG;EACH,OAAO;EACP,SAAS,KAAA;CACX,CAAC;AACH;;;;AAKA,MAAa,mBAAmB,uBAAuB"}
@@ -2,7 +2,7 @@ import { getRuntimeEnvironmentUserAgent, loadOptionalSetting, loadSetting, resol
2
2
  import { NoSuchModelError } from "@ai-sdk/provider";
3
3
  import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
4
4
  //#region src/version.ts
5
- const VERSION = "5.0.99";
5
+ const VERSION = "5.0.100";
6
6
  //#endregion
7
7
  //#region src/edge/google-vertex-auth-edge.ts
8
8
  const loadCredentials = async () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/google-vertex",
3
- "version": "5.0.99",
3
+ "version": "5.0.100",
4
4
  "type": "module",
5
5
  "license": "Apache-2.0",
6
6
  "sideEffects": false,
@@ -71,11 +71,11 @@
71
71
  }
72
72
  },
73
73
  "dependencies": {
74
- "@ai-sdk/anthropic": "4.0.69",
75
- "@ai-sdk/google": "4.0.86",
76
- "@ai-sdk/openai-compatible": "3.0.60",
77
- "@ai-sdk/provider": "4.0.20",
78
- "@ai-sdk/provider-utils": "5.0.52",
74
+ "@ai-sdk/anthropic": "4.0.70",
75
+ "@ai-sdk/google": "4.0.87",
76
+ "@ai-sdk/openai-compatible": "3.0.61",
77
+ "@ai-sdk/provider": "4.0.21",
78
+ "@ai-sdk/provider-utils": "5.0.53",
79
79
  "google-auth-library": "^10.6.2"
80
80
  },
81
81
  "devDependencies": {
@@ -1,9 +1,11 @@
1
1
  import {
2
+ InvalidArgumentError,
2
3
  NoSuchModelError,
3
4
  type LanguageModelV4,
4
5
  type ProviderV4,
5
6
  } from '@ai-sdk/provider';
6
7
  import {
8
+ isValidHostnamePart,
7
9
  loadOptionalSetting,
8
10
  withoutTrailingSlash,
9
11
  type FetchFunction,
@@ -178,10 +180,21 @@ export function createGoogleVertexAnthropic(
178
180
  options: GoogleVertexAnthropicProviderSettings = {},
179
181
  ): GoogleVertexAnthropicProvider {
180
182
  const getBaseURL = () => {
183
+ const baseURL = withoutTrailingSlash(options.baseURL);
184
+ if (baseURL != null) {
185
+ return baseURL;
186
+ }
181
187
  const location = loadOptionalSetting({
182
188
  settingValue: options.location,
183
189
  environmentVariableName: 'GOOGLE_VERTEX_LOCATION',
184
190
  });
191
+ if (location != null && !isValidHostnamePart(location)) {
192
+ throw new InvalidArgumentError({
193
+ argument: 'location',
194
+ message:
195
+ 'Invalid Google Vertex location. Expected a single DNS label (letters, digits, and hyphens). Use `baseURL` for custom endpoints.',
196
+ });
197
+ }
185
198
  const project = loadOptionalSetting({
186
199
  settingValue: options.project,
187
200
  environmentVariableName: 'GOOGLE_VERTEX_PROJECT',
@@ -197,10 +210,7 @@ export function createGoogleVertexAnthropic(
197
210
  }
198
211
  };
199
212
 
200
- return (
201
- withoutTrailingSlash(options.baseURL) ??
202
- `https://${getHost()}/v1/projects/${project}/locations/${location}/publishers/anthropic/models`
203
- );
213
+ return `https://${getHost()}/v1/projects/${project}/locations/${location}/publishers/anthropic/models`;
204
214
  };
205
215
 
206
216
  const createChatModel = (modelId: GoogleVertexAnthropicModelId) =>
@@ -248,6 +248,7 @@ export class GoogleVertexGeminiTranscriptionModel implements TranscriptionModelV
248
248
  },
249
249
  ...(response.usageMetadata != null
250
250
  ? {
251
+ usage: response.usageMetadata as JSONObject,
251
252
  providerMetadata: {
252
253
  google: { usageMetadata: response.usageMetadata as JSONObject },
253
254
  },
@@ -446,7 +447,10 @@ function createVertexLiveTranscriptionStream({
446
447
  language,
447
448
  durationInSeconds: undefined,
448
449
  ...(usageMetadata != null
449
- ? { providerMetadata: { google: { usageMetadata } } }
450
+ ? {
451
+ usage: usageMetadata,
452
+ providerMetadata: { google: { usageMetadata } },
453
+ }
450
454
  : {}),
451
455
  });
452
456
  controller.close();
@@ -6,16 +6,18 @@ import {
6
6
  type GoogleInteractionsModelId,
7
7
  type GoogleInteractionsModelInput,
8
8
  } from '@ai-sdk/google/internal';
9
- import type {
10
- Experimental_VideoModelV4,
11
- ImageModelV4,
12
- LanguageModelV4,
13
- ProviderV4,
14
- SpeechModelV4,
15
- TranscriptionModelV4,
9
+ import {
10
+ InvalidArgumentError,
11
+ type Experimental_VideoModelV4,
12
+ type ImageModelV4,
13
+ type LanguageModelV4,
14
+ type ProviderV4,
15
+ type SpeechModelV4,
16
+ type TranscriptionModelV4,
16
17
  } from '@ai-sdk/provider';
17
18
  import {
18
19
  generateId,
20
+ isValidHostnamePart,
19
21
  loadOptionalSetting,
20
22
  loadSetting,
21
23
  normalizeHeaders,
@@ -225,13 +227,22 @@ export function createGoogleVertex(
225
227
  description: 'Google Vertex project',
226
228
  });
227
229
 
228
- const loadGoogleVertexLocation = () =>
229
- loadSetting({
230
+ const loadGoogleVertexLocation = () => {
231
+ const location = loadSetting({
230
232
  settingValue: options.location,
231
233
  settingName: 'location',
232
234
  environmentVariableName: 'GOOGLE_VERTEX_LOCATION',
233
235
  description: 'Google Vertex location',
234
236
  });
237
+ if (!isValidHostnamePart(location)) {
238
+ throw new InvalidArgumentError({
239
+ argument: 'location',
240
+ message:
241
+ 'Invalid Google Vertex location. Expected a single DNS label (letters, digits, and hyphens). Use `baseURL` for custom endpoints.',
242
+ });
243
+ }
244
+ return location;
245
+ };
235
246
 
236
247
  // Tuned models are addressed via their deployed endpoint
237
248
  // `.../locations/{region}/endpoints/{id}` instead of the base-model
@@ -242,6 +253,11 @@ export function createGoogleVertex(
242
253
  return withoutTrailingSlash(options.baseURL) ?? EXPRESS_MODE_BASE_URL;
243
254
  }
244
255
 
256
+ const baseURL = withoutTrailingSlash(options.baseURL);
257
+ if (baseURL != null) {
258
+ return baseURL;
259
+ }
260
+
245
261
  const region = loadGoogleVertexLocation();
246
262
  const project = loadGoogleVertexProject();
247
263
 
@@ -255,12 +271,9 @@ export function createGoogleVertex(
255
271
  }
256
272
  };
257
273
 
258
- return (
259
- withoutTrailingSlash(options.baseURL) ??
260
- `https://${getHost()}/v1beta1/projects/${project}/locations/${region}${
261
- endpoint ? '' : '/publishers/google'
262
- }`
263
- );
274
+ return `https://${getHost()}/v1beta1/projects/${project}/locations/${region}${
275
+ endpoint ? '' : '/publishers/google'
276
+ }`;
264
277
  };
265
278
 
266
279
  const createConfig = (
@@ -32,7 +32,8 @@ export const googleVertexTranscriptionProviderOptionsSchema = z.object({
32
32
 
33
33
  /**
34
34
  * The Cloud Speech-to-Text region for the request (e.g. `'us'`, `'eu'`,
35
- * `'us-central1'`). Defaults to the provider `location`.
35
+ * `'us-central1'`). Defaults to the provider `location`. Must be a single
36
+ * DNS label (letters, digits, and hyphens).
36
37
  *
37
38
  * Note: Speech-to-Text regions differ from Vertex AI regions. Chirp is only
38
39
  * available in specific Speech-to-Text regions and is not available in the
@@ -1,8 +1,13 @@
1
- import type { SharedV4Warning, TranscriptionModelV4 } from '@ai-sdk/provider';
1
+ import {
2
+ InvalidArgumentError,
3
+ type SharedV4Warning,
4
+ type TranscriptionModelV4,
5
+ } from '@ai-sdk/provider';
2
6
  import {
3
7
  combineHeaders,
4
8
  convertUint8ArrayToBase64,
5
9
  createJsonResponseHandler,
10
+ isValidHostnamePart,
6
11
  parseProviderOptions,
7
12
  postJsonToApi,
8
13
  resolve,
@@ -106,6 +111,13 @@ export class GoogleVertexTranscriptionModel implements TranscriptionModelV4 {
106
111
  }
107
112
 
108
113
  const region = googleOptions?.region ?? this.config.location;
114
+ if (!isValidHostnamePart(region)) {
115
+ throw new InvalidArgumentError({
116
+ argument: googleOptions?.region != null ? 'region' : 'location',
117
+ message:
118
+ 'Invalid Google Cloud Speech-to-Text region. Expected a single DNS label (letters, digits, and hyphens).',
119
+ });
120
+ }
109
121
  const languageCodes = googleOptions?.languageCodes ?? ['auto'];
110
122
 
111
123
  // The recognize API takes base64-encoded audio in the `content` field. A
@@ -1,8 +1,10 @@
1
+ import { InvalidArgumentError } from '@ai-sdk/provider';
1
2
  import {
2
3
  createOpenAICompatible,
3
4
  type OpenAICompatibleProvider,
4
5
  } from '@ai-sdk/openai-compatible';
5
6
  import {
7
+ isValidHostnamePart,
6
8
  loadOptionalSetting,
7
9
  loadSetting,
8
10
  withoutTrailingSlash,
@@ -74,11 +76,21 @@ export function createGoogleVertexMaas(
74
76
  options: GoogleVertexMaasProviderSettings = {},
75
77
  ): GoogleVertexMaasProvider {
76
78
  // Lazy-load settings to support loading from environment variables at runtime
77
- const loadLocation = () =>
78
- loadOptionalSetting({
79
- settingValue: options.location,
80
- environmentVariableName: 'GOOGLE_VERTEX_LOCATION',
81
- });
79
+ const loadLocation = () => {
80
+ const location =
81
+ loadOptionalSetting({
82
+ settingValue: options.location,
83
+ environmentVariableName: 'GOOGLE_VERTEX_LOCATION',
84
+ }) ?? 'global';
85
+ if (!isValidHostnamePart(location)) {
86
+ throw new InvalidArgumentError({
87
+ argument: 'location',
88
+ message:
89
+ 'Invalid Google Vertex location. Expected a single DNS label (letters, digits, and hyphens). Use `baseURL` for custom endpoints.',
90
+ });
91
+ }
92
+ return location;
93
+ };
82
94
 
83
95
  const loadProject = () =>
84
96
  loadSetting({
@@ -100,7 +112,7 @@ export function createGoogleVertexMaas(
100
112
 
101
113
  const constructBaseURL = () => {
102
114
  const projectId = loadProject();
103
- const location = loadLocation() ?? 'global';
115
+ const location = loadLocation();
104
116
 
105
117
  return `https://${getHost(location)}/v1/projects/${projectId}/locations/${location}/endpoints/openapi`;
106
118
  };