@ai-sdk/google-vertex
Version:
156 lines (155 loc) • 6.08 kB
JavaScript
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