UNPKG

@ai-sdk/google-vertex

Version:
156 lines (155 loc) • 6.08 kB
import { fetchWithValidatedEndpoint, isBrowserRuntime, isSameOrigin, isValidHostnamePart, loadOptionalSetting, loadSetting, resolve, withoutTrailingSlash } from "@ai-sdk/provider-utils"; import { GoogleAuth } from "google-auth-library"; import { InvalidArgumentError } from "@ai-sdk/provider"; import { createOpenAICompatible } from "@ai-sdk/openai-compatible"; //#region src/google-vertex-auth-google-auth-library.ts function createAuthTokenGenerator(options) { const auth = new GoogleAuth({ scopes: ["https://www.googleapis.com/auth/cloud-platform"], ...options }); return async function generateAuthToken() { return (await (await auth.getClient()).getAccessToken())?.token ?? null; }; } //#endregion //#region src/google-vertex-model-catalog-config.ts function requestConfig(modelId) { const embedContent = modelId === "gemini-embedding-2" || modelId === "gemini-embedding-2-preview"; return { language: { endpoint: modelId.startsWith("endpoints/"), maxOutputTokens: modelId === "meta/llama-4-maverick-17b-128e-instruct-maas" || modelId === "meta/llama-4-scout-17b-16e-instruct-maas" ? 8192 : void 0 }, image: { gemini: modelId.startsWith("gemini-") }, embedding: { endpoint: embedContent ? "embedContent" : "predict", maxEmbeddingsPerCall: embedContent ? 1 : 250 }, speech: { api: modelId.startsWith("chirp") ? "cloud-tts" : "gemini" }, transcription: { api: modelId.startsWith("gemini") ? "gemini" : "cloud-speech", live: modelId.includes("-live") } }; } function getGoogleVertexRequestConfig(modelId) { return requestConfig(modelId); } //#endregion //#region src/maas/google-vertex-maas-provider.ts function transformGoogleVertexMaasRequestBody(args) { const maxOutputTokens = getGoogleVertexRequestConfig(args.model).language?.maxOutputTokens; return maxOutputTokens != null && args.max_tokens === void 0 ? { ...args, max_tokens: maxOutputTokens } : args; } /** * Loads the base URL of the MaaS API from the settings or from the project and * location. Settings are loaded on each call so environment variables are read * at runtime. */ function loadGoogleVertexMaasBaseURL(options) { const loadLocation = () => { const location = loadOptionalSetting({ settingValue: options.location, environmentVariableName: "GOOGLE_VERTEX_LOCATION" }) ?? "global"; if (!isValidHostnamePart(location)) throw new InvalidArgumentError({ argument: "location", message: "Invalid Google Vertex location. Expected a single DNS label (letters, digits, and hyphens). Use `baseURL` for custom endpoints." }); return location; }; const loadProject = () => loadSetting({ settingValue: options.project, settingName: "project", environmentVariableName: "GOOGLE_VERTEX_PROJECT", description: "Google Vertex project" }); const getHost = (location) => { if (location === "global") return "aiplatform.googleapis.com"; else if (location === "eu" || location === "us") return `aiplatform.${location}.rep.googleapis.com`; else return `${location}-aiplatform.googleapis.com`; }; const constructBaseURL = () => { const projectId = loadProject(); const location = loadLocation(); return `https://${getHost(location)}/v1/projects/${projectId}/locations/${location}/endpoints/openapi`; }; return withoutTrailingSlash(options.baseURL ?? "") || constructBaseURL(); } /** * Create a Google Vertex AI MaaS (Model as a Service) provider instance. * Uses the OpenAI-compatible Chat Completions API for partner and open models. * * @see https://cloud.google.com/vertex-ai/generative-ai/docs/maas/use-open-models */ function createGoogleVertexMaas$1(options = {}) { let cachedProvider; const getProvider = () => cachedProvider ??= createOpenAICompatible({ name: "vertex.maas", baseURL: loadGoogleVertexMaasBaseURL(options), fetch: options.fetch, transformRequestBody: transformGoogleVertexMaasRequestBody }); const provider = (modelId) => getProvider()(modelId); provider.specificationVersion = "v4"; provider.languageModel = (modelId) => getProvider().languageModel(modelId); provider.chatModel = (modelId) => getProvider().chatModel(modelId); provider.completionModel = (modelId) => getProvider().completionModel(modelId); provider.embeddingModel = (modelId) => getProvider().embeddingModel(modelId); provider.textEmbeddingModel = (modelId) => getProvider().textEmbeddingModel(modelId); provider.imageModel = (modelId) => getProvider().imageModel(modelId); return provider; } //#endregion //#region src/maas/google-vertex-maas-provider-node.ts /** * Create a Google Vertex AI MaaS (Model as a Service) provider instance for Node.js. * Uses the OpenAI-compatible Chat Completions API for partner and open models. * Automatically handles Google Cloud authentication. * * @see https://cloud.google.com/vertex-ai/generative-ai/docs/maas/use-open-models */ function createGoogleVertexMaas(options = {}) { const generateAuthToken = createAuthTokenGenerator(options.googleAuthOptions); const customFetch = async (url, init) => { const href = typeof url === "string" ? url : url instanceof URL ? url.href : url.url; if (!isSameOrigin(href, loadGoogleVertexMaasBaseURL(options))) { if (isBrowserRuntime() && init?.redirect === "follow") return (options.fetch ?? fetch)(url, init); return fetchWithValidatedEndpoint({ url: href, init, fetch: options.fetch, redirect: "manual" }); } const token = await generateAuthToken(); const authHeaders = { ...await resolve(options.headers), Authorization: `Bearer ${token}` }; const fetchInit = { ...init, headers: { ...init?.headers, ...authHeaders } }; return (options.fetch ?? fetch)(url, fetchInit); }; return createGoogleVertexMaas$1({ ...options, fetch: customFetch, headers: void 0 }); } /** * Default Google Vertex AI MaaS provider instance for Node.js. */ const googleVertexMaas = createGoogleVertexMaas(); //#endregion export { createGoogleVertexMaas, createGoogleVertexMaas as createVertexMaas, googleVertexMaas, googleVertexMaas as vertexMaas }; //# sourceMappingURL=index.js.map