Files
tasq/node_modules/@ai-sdk/google/src/google-provider.ts
T
2026-04-09 19:01:53 +08:00

228 lines
6.6 KiB
TypeScript

import {
EmbeddingModelV3,
Experimental_VideoModelV3,
ImageModelV3,
LanguageModelV3,
ProviderV3,
} from '@ai-sdk/provider';
import {
FetchFunction,
generateId,
loadApiKey,
withoutTrailingSlash,
withUserAgentSuffix,
} from '@ai-sdk/provider-utils';
import { VERSION } from './version';
import { GoogleGenerativeAIEmbeddingModel } from './google-generative-ai-embedding-model';
import { GoogleGenerativeAIEmbeddingModelId } from './google-generative-ai-embedding-options';
import { GoogleGenerativeAILanguageModel } from './google-generative-ai-language-model';
import { GoogleGenerativeAIModelId } from './google-generative-ai-options';
import { googleTools } from './google-tools';
import {
GoogleGenerativeAIImageSettings,
GoogleGenerativeAIImageModelId,
} from './google-generative-ai-image-settings';
import { GoogleGenerativeAIImageModel } from './google-generative-ai-image-model';
import { GoogleGenerativeAIVideoModel } from './google-generative-ai-video-model';
import { GoogleGenerativeAIVideoModelId } from './google-generative-ai-video-settings';
export interface GoogleGenerativeAIProvider extends ProviderV3 {
(modelId: GoogleGenerativeAIModelId): LanguageModelV3;
languageModel(modelId: GoogleGenerativeAIModelId): LanguageModelV3;
chat(modelId: GoogleGenerativeAIModelId): LanguageModelV3;
/**
* Creates a model for image generation.
*/
image(
modelId: GoogleGenerativeAIImageModelId,
settings?: GoogleGenerativeAIImageSettings,
): ImageModelV3;
/**
* @deprecated Use `chat()` instead.
*/
generativeAI(modelId: GoogleGenerativeAIModelId): LanguageModelV3;
/**
* Creates a model for text embeddings.
*/
embedding(modelId: GoogleGenerativeAIEmbeddingModelId): EmbeddingModelV3;
/**
* Creates a model for text embeddings.
*/
embeddingModel(modelId: GoogleGenerativeAIEmbeddingModelId): EmbeddingModelV3;
/**
* @deprecated Use `embedding` instead.
*/
textEmbedding(modelId: GoogleGenerativeAIEmbeddingModelId): EmbeddingModelV3;
/**
* @deprecated Use `embeddingModel` instead.
*/
textEmbeddingModel(
modelId: GoogleGenerativeAIEmbeddingModelId,
): EmbeddingModelV3;
/**
* Creates a model for video generation.
*/
video(modelId: GoogleGenerativeAIVideoModelId): Experimental_VideoModelV3;
/**
* Creates a model for video generation.
*/
videoModel(
modelId: GoogleGenerativeAIVideoModelId,
): Experimental_VideoModelV3;
tools: typeof googleTools;
}
export interface GoogleGenerativeAIProviderSettings {
/**
* Use a different URL prefix for API calls, e.g. to use proxy servers.
* The default prefix is `https://generativelanguage.googleapis.com/v1beta`.
*/
baseURL?: string;
/**
* API key that is being send using the `x-goog-api-key` header.
* It defaults to the `GOOGLE_GENERATIVE_AI_API_KEY` environment variable.
*/
apiKey?: string;
/**
* Custom headers to include in the requests.
*/
headers?: Record<string, string | undefined>;
/**
* Custom fetch implementation. You can use it as a middleware to intercept requests,
* or to provide a custom fetch implementation for e.g. testing.
*/
fetch?: FetchFunction;
/**
* Optional function to generate a unique ID for each request.
*/
generateId?: () => string;
/**
* Custom provider name
* Defaults to 'google.generative-ai'.
*/
name?: string;
}
/**
* Create a Google Generative AI provider instance.
*/
export function createGoogleGenerativeAI(
options: GoogleGenerativeAIProviderSettings = {},
): GoogleGenerativeAIProvider {
const baseURL =
withoutTrailingSlash(options.baseURL) ??
'https://generativelanguage.googleapis.com/v1beta';
const providerName = options.name ?? 'google.generative-ai';
const getHeaders = () =>
withUserAgentSuffix(
{
'x-goog-api-key': loadApiKey({
apiKey: options.apiKey,
environmentVariableName: 'GOOGLE_GENERATIVE_AI_API_KEY',
description: 'Google Generative AI',
}),
...options.headers,
},
`ai-sdk/google/${VERSION}`,
);
const createChatModel = (modelId: GoogleGenerativeAIModelId) =>
new GoogleGenerativeAILanguageModel(modelId, {
provider: providerName,
baseURL,
headers: getHeaders,
generateId: options.generateId ?? generateId,
supportedUrls: () => ({
'*': [
// Google Generative Language "files" endpoint
// e.g. https://generativelanguage.googleapis.com/v1beta/files/...
new RegExp(`^${baseURL}/files/.*$`),
// YouTube URLs (public or unlisted videos)
new RegExp(
`^https://(?:www\\.)?youtube\\.com/watch\\?v=[\\w-]+(?:&[\\w=&.-]*)?$`,
),
new RegExp(`^https://youtu\\.be/[\\w-]+(?:\\?[\\w=&.-]*)?$`),
],
}),
fetch: options.fetch,
});
const createEmbeddingModel = (modelId: GoogleGenerativeAIEmbeddingModelId) =>
new GoogleGenerativeAIEmbeddingModel(modelId, {
provider: providerName,
baseURL,
headers: getHeaders,
fetch: options.fetch,
});
const createImageModel = (
modelId: GoogleGenerativeAIImageModelId,
settings: GoogleGenerativeAIImageSettings = {},
) =>
new GoogleGenerativeAIImageModel(modelId, settings, {
provider: providerName,
baseURL,
headers: getHeaders,
fetch: options.fetch,
});
const createVideoModel = (modelId: GoogleGenerativeAIVideoModelId) =>
new GoogleGenerativeAIVideoModel(modelId, {
provider: providerName,
baseURL,
headers: getHeaders,
fetch: options.fetch,
generateId: options.generateId ?? generateId,
});
const provider = function (modelId: GoogleGenerativeAIModelId) {
if (new.target) {
throw new Error(
'The Google Generative AI model function cannot be called with the new keyword.',
);
}
return createChatModel(modelId);
};
provider.specificationVersion = 'v3' as const;
provider.languageModel = createChatModel;
provider.chat = createChatModel;
provider.generativeAI = createChatModel;
provider.embedding = createEmbeddingModel;
provider.embeddingModel = createEmbeddingModel;
provider.textEmbedding = createEmbeddingModel;
provider.textEmbeddingModel = createEmbeddingModel;
provider.image = createImageModel;
provider.imageModel = createImageModel;
provider.video = createVideoModel;
provider.videoModel = createVideoModel;
provider.tools = googleTools;
return provider as GoogleGenerativeAIProvider;
}
/**
* Default Google Generative AI provider instance.
*/
export const google = createGoogleGenerativeAI();