@tanstack/ai-gemini 0.21.0 → 0.23.0
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.
- package/dist/esm/adapters/embedding.d.ts +77 -0
- package/dist/esm/adapters/embedding.js +119 -0
- package/dist/esm/adapters/embedding.js.map +1 -0
- package/dist/esm/embedding/embedding-provider-options.d.ts +20 -0
- package/dist/esm/index.d.ts +4 -1
- package/dist/esm/index.js +3 -2
- package/dist/esm/model-meta.d.ts +44 -1
- package/dist/esm/model-meta.js +45 -1
- package/dist/esm/model-meta.js.map +1 -1
- package/package.json +4 -4
- package/src/adapters/embedding.ts +173 -0
- package/src/embedding/embedding-provider-options.ts +29 -0
- package/src/index.ts +13 -0
- package/src/model-meta.ts +77 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { BaseEmbeddingAdapter } from '@tanstack/ai/adapters';
|
|
2
|
+
import { EmbeddingOptions, EmbeddingResult } from '@tanstack/ai';
|
|
3
|
+
import { GoogleGenAI } from '@google/genai';
|
|
4
|
+
import { GeminiEmbeddingModel, GeminiEmbeddingModelInputModalitiesByName, GeminiEmbeddingModelProviderOptionsByName } from '../model-meta.js';
|
|
5
|
+
import { GeminiEmbeddingProviderOptions } from '../embedding/embedding-provider-options.js';
|
|
6
|
+
import { GeminiClientConfig } from '../utils/client.js';
|
|
7
|
+
/**
|
|
8
|
+
* Configuration for Gemini Embedding adapter
|
|
9
|
+
*/
|
|
10
|
+
export interface GeminiEmbeddingConfig extends GeminiClientConfig {
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Gemini Embedding Adapter
|
|
14
|
+
*
|
|
15
|
+
* Tree-shakeable adapter for Gemini text embeddings.
|
|
16
|
+
* Supports gemini-embedding-001.
|
|
17
|
+
*
|
|
18
|
+
* Features:
|
|
19
|
+
* - Batch embedding (one request for the whole input array)
|
|
20
|
+
* - Matryoshka dimension reduction via the top-level `dimensions` option
|
|
21
|
+
* (mapped to the SDK's `outputDimensionality`)
|
|
22
|
+
* - Task-type hints (`taskType`, `title`) via provider options
|
|
23
|
+
*/
|
|
24
|
+
export declare class GeminiEmbeddingAdapter<TModel extends GeminiEmbeddingModel> extends BaseEmbeddingAdapter<TModel, GeminiEmbeddingProviderOptions, GeminiEmbeddingModelProviderOptionsByName, GeminiEmbeddingModelInputModalitiesByName> {
|
|
25
|
+
readonly name: "gemini";
|
|
26
|
+
protected client: GoogleGenAI;
|
|
27
|
+
constructor(config: GeminiEmbeddingConfig, model: TModel);
|
|
28
|
+
createEmbeddings(options: EmbeddingOptions<GeminiEmbeddingProviderOptions>): Promise<EmbeddingResult>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Creates a Gemini embedding adapter with explicit API key.
|
|
32
|
+
* Type resolution happens here at the call site.
|
|
33
|
+
*
|
|
34
|
+
* @param model - The model name (e.g., 'gemini-embedding-001')
|
|
35
|
+
* @param apiKey - Your Google API key
|
|
36
|
+
* @param config - Optional additional configuration
|
|
37
|
+
* @returns Configured Gemini embedding adapter instance with resolved types
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```typescript
|
|
41
|
+
* const adapter = createGeminiEmbedding('gemini-embedding-001', "your-api-key");
|
|
42
|
+
*
|
|
43
|
+
* const result = await embed({
|
|
44
|
+
* adapter,
|
|
45
|
+
* input: 'a red guitar'
|
|
46
|
+
* });
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export declare function createGeminiEmbedding<TModel extends GeminiEmbeddingModel>(model: TModel, apiKey: string, config?: Omit<GeminiEmbeddingConfig, 'apiKey'>): GeminiEmbeddingAdapter<TModel>;
|
|
50
|
+
/**
|
|
51
|
+
* Creates a Gemini embedding adapter with automatic API key detection from environment variables.
|
|
52
|
+
* Type resolution happens here at the call site.
|
|
53
|
+
*
|
|
54
|
+
* Looks for `GOOGLE_API_KEY` or `GEMINI_API_KEY` in:
|
|
55
|
+
* - `process.env` (Node.js)
|
|
56
|
+
* - `window.env` (Browser with injected env)
|
|
57
|
+
*
|
|
58
|
+
* @param model - The model name (e.g., 'gemini-embedding-001')
|
|
59
|
+
* @param config - Optional configuration (excluding apiKey which is auto-detected)
|
|
60
|
+
* @returns Configured Gemini embedding adapter instance with resolved types
|
|
61
|
+
* @throws Error if GOOGLE_API_KEY or GEMINI_API_KEY is not found in environment
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```typescript
|
|
65
|
+
* // Automatically uses GOOGLE_API_KEY from environment
|
|
66
|
+
* const adapter = geminiEmbedding('gemini-embedding-001');
|
|
67
|
+
*
|
|
68
|
+
* const result = await embed({
|
|
69
|
+
* adapter,
|
|
70
|
+
* input: ['a red guitar', 'a blue drum kit'],
|
|
71
|
+
* dimensions: 1536
|
|
72
|
+
* });
|
|
73
|
+
*
|
|
74
|
+
* console.log(result.embeddings[0].vector)
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
export declare function geminiEmbedding<TModel extends GeminiEmbeddingModel>(model: TModel, config?: Omit<GeminiEmbeddingConfig, 'apiKey'>): GeminiEmbeddingAdapter<TModel>;
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { createGeminiClient, generateId, getGeminiApiKeyFromEnv } from "../utils/client.js";
|
|
2
|
+
import "../utils/index.js";
|
|
3
|
+
import { requireTextOnlyEmbeddingInput } from "@tanstack/ai";
|
|
4
|
+
import { toRunErrorPayload } from "@tanstack/ai/adapter-internals";
|
|
5
|
+
import { BaseEmbeddingAdapter } from "@tanstack/ai/adapters";
|
|
6
|
+
//#region src/adapters/embedding.ts
|
|
7
|
+
/**
|
|
8
|
+
* Gemini Embedding Adapter
|
|
9
|
+
*
|
|
10
|
+
* Tree-shakeable adapter for Gemini text embeddings.
|
|
11
|
+
* Supports gemini-embedding-001.
|
|
12
|
+
*
|
|
13
|
+
* Features:
|
|
14
|
+
* - Batch embedding (one request for the whole input array)
|
|
15
|
+
* - Matryoshka dimension reduction via the top-level `dimensions` option
|
|
16
|
+
* (mapped to the SDK's `outputDimensionality`)
|
|
17
|
+
* - Task-type hints (`taskType`, `title`) via provider options
|
|
18
|
+
*/
|
|
19
|
+
var GeminiEmbeddingAdapter = class extends BaseEmbeddingAdapter {
|
|
20
|
+
name = "gemini";
|
|
21
|
+
client;
|
|
22
|
+
constructor(config, model) {
|
|
23
|
+
super(model, {});
|
|
24
|
+
this.client = createGeminiClient(config);
|
|
25
|
+
}
|
|
26
|
+
async createEmbeddings(options) {
|
|
27
|
+
const { model, logger, modelOptions } = options;
|
|
28
|
+
const texts = requireTextOnlyEmbeddingInput(options.input, this.name, model);
|
|
29
|
+
try {
|
|
30
|
+
const config = {};
|
|
31
|
+
if (options.dimensions !== void 0) config.outputDimensionality = options.dimensions;
|
|
32
|
+
if (modelOptions?.taskType !== void 0) config.taskType = modelOptions.taskType;
|
|
33
|
+
if (modelOptions?.title !== void 0) config.title = modelOptions.title;
|
|
34
|
+
logger.request(`activity=embed provider=${this.name} model=${model} inputs=${texts.length}`, {
|
|
35
|
+
provider: this.name,
|
|
36
|
+
model
|
|
37
|
+
});
|
|
38
|
+
const embeddings = (await this.client.models.embedContent({
|
|
39
|
+
model,
|
|
40
|
+
contents: texts,
|
|
41
|
+
config
|
|
42
|
+
})).embeddings;
|
|
43
|
+
if (!embeddings || embeddings.length !== texts.length) throw new Error(`Gemini embedContent returned ${embeddings ? embeddings.length : "no"} embeddings for ${texts.length} inputs (model: ${model}).`);
|
|
44
|
+
return {
|
|
45
|
+
id: generateId(this.name),
|
|
46
|
+
model,
|
|
47
|
+
embeddings: embeddings.map((embedding, index) => ({
|
|
48
|
+
vector: embedding.values ?? [],
|
|
49
|
+
index
|
|
50
|
+
}))
|
|
51
|
+
};
|
|
52
|
+
} catch (error) {
|
|
53
|
+
logger.errors(`${this.name}.createEmbeddings fatal`, {
|
|
54
|
+
error: toRunErrorPayload(error, `${this.name}.createEmbeddings failed`),
|
|
55
|
+
source: `${this.name}.createEmbeddings`
|
|
56
|
+
});
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Creates a Gemini embedding adapter with explicit API key.
|
|
63
|
+
* Type resolution happens here at the call site.
|
|
64
|
+
*
|
|
65
|
+
* @param model - The model name (e.g., 'gemini-embedding-001')
|
|
66
|
+
* @param apiKey - Your Google API key
|
|
67
|
+
* @param config - Optional additional configuration
|
|
68
|
+
* @returns Configured Gemini embedding adapter instance with resolved types
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```typescript
|
|
72
|
+
* const adapter = createGeminiEmbedding('gemini-embedding-001', "your-api-key");
|
|
73
|
+
*
|
|
74
|
+
* const result = await embed({
|
|
75
|
+
* adapter,
|
|
76
|
+
* input: 'a red guitar'
|
|
77
|
+
* });
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
function createGeminiEmbedding(model, apiKey, config) {
|
|
81
|
+
return new GeminiEmbeddingAdapter({
|
|
82
|
+
...config,
|
|
83
|
+
apiKey
|
|
84
|
+
}, model);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Creates a Gemini embedding adapter with automatic API key detection from environment variables.
|
|
88
|
+
* Type resolution happens here at the call site.
|
|
89
|
+
*
|
|
90
|
+
* Looks for `GOOGLE_API_KEY` or `GEMINI_API_KEY` in:
|
|
91
|
+
* - `process.env` (Node.js)
|
|
92
|
+
* - `window.env` (Browser with injected env)
|
|
93
|
+
*
|
|
94
|
+
* @param model - The model name (e.g., 'gemini-embedding-001')
|
|
95
|
+
* @param config - Optional configuration (excluding apiKey which is auto-detected)
|
|
96
|
+
* @returns Configured Gemini embedding adapter instance with resolved types
|
|
97
|
+
* @throws Error if GOOGLE_API_KEY or GEMINI_API_KEY is not found in environment
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```typescript
|
|
101
|
+
* // Automatically uses GOOGLE_API_KEY from environment
|
|
102
|
+
* const adapter = geminiEmbedding('gemini-embedding-001');
|
|
103
|
+
*
|
|
104
|
+
* const result = await embed({
|
|
105
|
+
* adapter,
|
|
106
|
+
* input: ['a red guitar', 'a blue drum kit'],
|
|
107
|
+
* dimensions: 1536
|
|
108
|
+
* });
|
|
109
|
+
*
|
|
110
|
+
* console.log(result.embeddings[0].vector)
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
function geminiEmbedding(model, config) {
|
|
114
|
+
return createGeminiEmbedding(model, getGeminiApiKeyFromEnv(), config);
|
|
115
|
+
}
|
|
116
|
+
//#endregion
|
|
117
|
+
export { GeminiEmbeddingAdapter, createGeminiEmbedding, geminiEmbedding };
|
|
118
|
+
|
|
119
|
+
//# sourceMappingURL=embedding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding.js","names":[],"sources":["../../../src/adapters/embedding.ts"],"sourcesContent":["import { BaseEmbeddingAdapter } from '@tanstack/ai/adapters'\nimport { toRunErrorPayload } from '@tanstack/ai/adapter-internals'\nimport { requireTextOnlyEmbeddingInput } from '@tanstack/ai'\nimport {\n createGeminiClient,\n generateId,\n getGeminiApiKeyFromEnv,\n} from '../utils'\nimport type { EmbeddingOptions, EmbeddingResult } from '@tanstack/ai'\nimport type { EmbedContentConfig, GoogleGenAI } from '@google/genai'\nimport type {\n GeminiEmbeddingModel,\n GeminiEmbeddingModelInputModalitiesByName,\n GeminiEmbeddingModelProviderOptionsByName,\n} from '../model-meta'\nimport type { GeminiEmbeddingProviderOptions } from '../embedding/embedding-provider-options'\nimport type { GeminiClientConfig } from '../utils/client'\n\n/**\n * Configuration for Gemini Embedding adapter\n */\nexport interface GeminiEmbeddingConfig extends GeminiClientConfig {}\n\n/**\n * Gemini Embedding Adapter\n *\n * Tree-shakeable adapter for Gemini text embeddings.\n * Supports gemini-embedding-001.\n *\n * Features:\n * - Batch embedding (one request for the whole input array)\n * - Matryoshka dimension reduction via the top-level `dimensions` option\n * (mapped to the SDK's `outputDimensionality`)\n * - Task-type hints (`taskType`, `title`) via provider options\n */\nexport class GeminiEmbeddingAdapter<\n TModel extends GeminiEmbeddingModel,\n> extends BaseEmbeddingAdapter<\n TModel,\n GeminiEmbeddingProviderOptions,\n GeminiEmbeddingModelProviderOptionsByName,\n GeminiEmbeddingModelInputModalitiesByName\n> {\n readonly name = 'gemini' as const\n\n protected client: GoogleGenAI\n\n constructor(config: GeminiEmbeddingConfig, model: TModel) {\n super(model, {})\n this.client = createGeminiClient(config)\n }\n\n async createEmbeddings(\n options: EmbeddingOptions<GeminiEmbeddingProviderOptions>,\n ): Promise<EmbeddingResult> {\n const { model, logger, modelOptions } = options\n const texts = requireTextOnlyEmbeddingInput(options.input, this.name, model)\n\n try {\n // Build the config incrementally so possibly-undefined values are never\n // assigned to optional fields (exactOptionalPropertyTypes).\n const config: EmbedContentConfig = {}\n if (options.dimensions !== undefined) {\n config.outputDimensionality = options.dimensions\n }\n if (modelOptions?.taskType !== undefined) {\n config.taskType = modelOptions.taskType\n }\n if (modelOptions?.title !== undefined) {\n config.title = modelOptions.title\n }\n\n logger.request(\n `activity=embed provider=${this.name} model=${model} inputs=${texts.length}`,\n { provider: this.name, model },\n )\n\n const response = await this.client.models.embedContent({\n model,\n contents: texts,\n config,\n })\n\n const embeddings = response.embeddings\n if (!embeddings || embeddings.length !== texts.length) {\n throw new Error(\n `Gemini embedContent returned ${embeddings ? embeddings.length : 'no'} embeddings for ${texts.length} inputs (model: ${model}).`,\n )\n }\n\n // The Gemini embedding API does not report token usage, so `usage` is\n // omitted from the result.\n return {\n id: generateId(this.name),\n model,\n embeddings: embeddings.map((embedding, index) => ({\n vector: embedding.values ?? [],\n index,\n })),\n }\n } catch (error: unknown) {\n logger.errors(`${this.name}.createEmbeddings fatal`, {\n error: toRunErrorPayload(error, `${this.name}.createEmbeddings failed`),\n source: `${this.name}.createEmbeddings`,\n })\n throw error\n }\n }\n}\n\n/**\n * Creates a Gemini embedding adapter with explicit API key.\n * Type resolution happens here at the call site.\n *\n * @param model - The model name (e.g., 'gemini-embedding-001')\n * @param apiKey - Your Google API key\n * @param config - Optional additional configuration\n * @returns Configured Gemini embedding adapter instance with resolved types\n *\n * @example\n * ```typescript\n * const adapter = createGeminiEmbedding('gemini-embedding-001', \"your-api-key\");\n *\n * const result = await embed({\n * adapter,\n * input: 'a red guitar'\n * });\n * ```\n */\nexport function createGeminiEmbedding<TModel extends GeminiEmbeddingModel>(\n model: TModel,\n apiKey: string,\n config?: Omit<GeminiEmbeddingConfig, 'apiKey'>,\n): GeminiEmbeddingAdapter<TModel> {\n // Put apiKey LAST so caller-supplied config can't silently override the\n // explicit argument.\n return new GeminiEmbeddingAdapter({ ...config, apiKey }, model)\n}\n\n/**\n * Creates a Gemini embedding adapter with automatic API key detection from environment variables.\n * Type resolution happens here at the call site.\n *\n * Looks for `GOOGLE_API_KEY` or `GEMINI_API_KEY` in:\n * - `process.env` (Node.js)\n * - `window.env` (Browser with injected env)\n *\n * @param model - The model name (e.g., 'gemini-embedding-001')\n * @param config - Optional configuration (excluding apiKey which is auto-detected)\n * @returns Configured Gemini embedding adapter instance with resolved types\n * @throws Error if GOOGLE_API_KEY or GEMINI_API_KEY is not found in environment\n *\n * @example\n * ```typescript\n * // Automatically uses GOOGLE_API_KEY from environment\n * const adapter = geminiEmbedding('gemini-embedding-001');\n *\n * const result = await embed({\n * adapter,\n * input: ['a red guitar', 'a blue drum kit'],\n * dimensions: 1536\n * });\n *\n * console.log(result.embeddings[0].vector)\n * ```\n */\nexport function geminiEmbedding<TModel extends GeminiEmbeddingModel>(\n model: TModel,\n config?: Omit<GeminiEmbeddingConfig, 'apiKey'>,\n): GeminiEmbeddingAdapter<TModel> {\n const apiKey = getGeminiApiKeyFromEnv()\n return createGeminiEmbedding(model, apiKey, config)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAmCA,IAAa,yBAAb,cAEU,qBAKR;CACA,OAAgB;CAEhB;CAEA,YAAY,QAA+B,OAAe;EACxD,MAAM,OAAO,CAAC,CAAC;EACf,KAAK,SAAS,mBAAmB,MAAM;CACzC;CAEA,MAAM,iBACJ,SAC0B;EAC1B,MAAM,EAAE,OAAO,QAAQ,iBAAiB;EACxC,MAAM,QAAQ,8BAA8B,QAAQ,OAAO,KAAK,MAAM,KAAK;EAE3E,IAAI;GAGF,MAAM,SAA6B,CAAC;GACpC,IAAI,QAAQ,eAAe,KAAA,GACzB,OAAO,uBAAuB,QAAQ;GAExC,IAAI,cAAc,aAAa,KAAA,GAC7B,OAAO,WAAW,aAAa;GAEjC,IAAI,cAAc,UAAU,KAAA,GAC1B,OAAO,QAAQ,aAAa;GAG9B,OAAO,QACL,2BAA2B,KAAK,KAAK,SAAS,MAAM,UAAU,MAAM,UACpE;IAAE,UAAU,KAAK;IAAM;GAAM,CAC/B;GAQA,MAAM,cAAa,MANI,KAAK,OAAO,OAAO,aAAa;IACrD;IACA,UAAU;IACV;GACF,CAAC,EAAA,CAE2B;GAC5B,IAAI,CAAC,cAAc,WAAW,WAAW,MAAM,QAC7C,MAAM,IAAI,MACR,gCAAgC,aAAa,WAAW,SAAS,KAAK,kBAAkB,MAAM,OAAO,kBAAkB,MAAM,GAC/H;GAKF,OAAO;IACL,IAAI,WAAW,KAAK,IAAI;IACxB;IACA,YAAY,WAAW,KAAK,WAAW,WAAW;KAChD,QAAQ,UAAU,UAAU,CAAC;KAC7B;IACF,EAAE;GACJ;EACF,SAAS,OAAgB;GACvB,OAAO,OAAO,GAAG,KAAK,KAAK,0BAA0B;IACnD,OAAO,kBAAkB,OAAO,GAAG,KAAK,KAAK,yBAAyB;IACtE,QAAQ,GAAG,KAAK,KAAK;GACvB,CAAC;GACD,MAAM;EACR;CACF;AACF;;;;;;;;;;;;;;;;;;;;AAqBA,SAAgB,sBACd,OACA,QACA,QACgC;CAGhC,OAAO,IAAI,uBAAuB;EAAE,GAAG;EAAQ;CAAO,GAAG,KAAK;AAChE;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,SAAgB,gBACd,OACA,QACgC;CAEhC,OAAO,sBAAsB,OADd,uBACqB,GAAQ,MAAM;AACpD"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider options for Gemini embedding models.
|
|
3
|
+
*
|
|
4
|
+
* `dimensions` is deliberately absent: it's a first-class top-level option on
|
|
5
|
+
* `embed()` and is mapped to the SDK's `outputDimensionality` by the adapter.
|
|
6
|
+
*/
|
|
7
|
+
export interface GeminiEmbeddingProviderOptions {
|
|
8
|
+
/**
|
|
9
|
+
* Type of task for which the embedding will be used. Helps the model
|
|
10
|
+
* produce embeddings optimized for the intended use case.
|
|
11
|
+
*
|
|
12
|
+
* @see https://ai.google.dev/gemini-api/docs/embeddings#task-types
|
|
13
|
+
*/
|
|
14
|
+
taskType?: 'SEMANTIC_SIMILARITY' | 'CLASSIFICATION' | 'CLUSTERING' | 'RETRIEVAL_DOCUMENT' | 'RETRIEVAL_QUERY' | 'QUESTION_ANSWERING' | 'FACT_VERIFICATION' | 'CODE_RETRIEVAL_QUERY';
|
|
15
|
+
/**
|
|
16
|
+
* Title for the text. Only applicable when `taskType` is
|
|
17
|
+
* `RETRIEVAL_DOCUMENT`.
|
|
18
|
+
*/
|
|
19
|
+
title?: string;
|
|
20
|
+
}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -2,6 +2,8 @@ export { GeminiTextAdapter, createGeminiChat, geminiText, type GeminiTextConfig,
|
|
|
2
2
|
export { createGeminiSummarize, geminiSummarize, type GeminiSummarizeConfig, type GeminiSummarizeModel, } from './adapters/summarize.js';
|
|
3
3
|
export { GeminiImageAdapter, createGeminiImage, geminiImage, type GeminiImageConfig, } from './adapters/image.js';
|
|
4
4
|
export type { GeminiImageProviderOptions, GeminiImageModelProviderOptionsByName, GeminiAspectRatio, PersonGeneration, SafetyFilterLevel, ImagePromptLanguage, } from './image/image-provider-options.js';
|
|
5
|
+
export { GeminiEmbeddingAdapter, createGeminiEmbedding, geminiEmbedding, type GeminiEmbeddingConfig, } from './adapters/embedding.js';
|
|
6
|
+
export type { GeminiEmbeddingProviderOptions } from './embedding/embedding-provider-options.js';
|
|
5
7
|
/**
|
|
6
8
|
* @experimental Gemini TTS is an experimental feature and may change.
|
|
7
9
|
*/
|
|
@@ -24,10 +26,11 @@ export { GEMINI_TTS_VOICES as GeminiTTSVoices } from './model-meta.js';
|
|
|
24
26
|
export { GEMINI_AUDIO_MODELS as GeminiAudioModels } from './model-meta.js';
|
|
25
27
|
export { GEMINI_VIDEO_MODELS as GeminiVideoModels } from './model-meta.js';
|
|
26
28
|
export { GEMINI_INTERACTIONS_VIDEO_MODELS as GeminiInteractionsVideoModels } from './model-meta.js';
|
|
29
|
+
export { GEMINI_EMBEDDING_MODELS } from './model-meta.js';
|
|
27
30
|
export type { GeminiModels as GeminiTextModel } from './model-meta.js';
|
|
28
31
|
export type { GeminiImageModels as GeminiImageModel } from './model-meta.js';
|
|
29
32
|
export type { GeminiTTSVoice } from './model-meta.js';
|
|
30
|
-
export type { GeminiChatModelProviderOptionsByName, GeminiChatModelToolCapabilitiesByName, GeminiModelInputModalitiesByName, } from './model-meta.js';
|
|
33
|
+
export type { GeminiChatModelProviderOptionsByName, GeminiChatModelToolCapabilitiesByName, GeminiModelInputModalitiesByName, GeminiEmbeddingModel, GeminiEmbeddingModelProviderOptionsByName, GeminiEmbeddingModelInputModalitiesByName, } from './model-meta.js';
|
|
31
34
|
export type { GeminiStructuredOutputOptions, GeminiThinkingOptions, } from './text/text-provider-options.js';
|
|
32
35
|
export type { GoogleGeminiTool } from './tools/index.js';
|
|
33
36
|
export type { GeminiTextMetadata, GeminiImageMetadata, GeminiAudioMetadata, GeminiVideoMetadata, GeminiDocumentMetadata, GeminiMessageMetadataByModality, } from './message-types.js';
|
package/dist/esm/index.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { GEMINI_AUDIO_MODELS, GEMINI_COMBINED_TOOLS_AND_SCHEMA_MODELS, GEMINI_IMAGE_MODELS, GEMINI_INTERACTIONS_VIDEO_MODELS, GEMINI_MODELS, GEMINI_TTS_MODELS, GEMINI_TTS_VOICES, GEMINI_VIDEO_MODELS } from "./model-meta.js";
|
|
1
|
+
import { GEMINI_AUDIO_MODELS, GEMINI_COMBINED_TOOLS_AND_SCHEMA_MODELS, GEMINI_EMBEDDING_MODELS, GEMINI_IMAGE_MODELS, GEMINI_INTERACTIONS_VIDEO_MODELS, GEMINI_MODELS, GEMINI_TTS_MODELS, GEMINI_TTS_VOICES, GEMINI_VIDEO_MODELS } from "./model-meta.js";
|
|
2
2
|
import { GeminiTextAdapter, createGeminiChat, geminiText } from "./adapters/text.js";
|
|
3
3
|
import { createGeminiSummarize, geminiSummarize } from "./adapters/summarize.js";
|
|
4
4
|
import { GeminiImageAdapter, createGeminiImage, geminiImage } from "./adapters/image.js";
|
|
5
|
+
import { GeminiEmbeddingAdapter, createGeminiEmbedding, geminiEmbedding } from "./adapters/embedding.js";
|
|
5
6
|
import { GeminiTTSAdapter, createGeminiSpeech, geminiSpeech } from "./adapters/tts.js";
|
|
6
7
|
import { GeminiAudioAdapter, createGeminiAudio, geminiAudio } from "./adapters/audio.js";
|
|
7
8
|
import { GEMINI_VIDEO_DURATIONS, getGeminiVideoDurationOptions, isInteractionsVideoModel } from "./video/video-provider-options.js";
|
|
@@ -9,4 +10,4 @@ import { GeminiVideoAdapter, createGeminiVideo, geminiVideo } from "./adapters/v
|
|
|
9
10
|
import { geminiRealtimeToken } from "./realtime/token.js";
|
|
10
11
|
import { geminiRealtime } from "./realtime/adapter.js";
|
|
11
12
|
import "./realtime/index.js";
|
|
12
|
-
export { GEMINI_COMBINED_TOOLS_AND_SCHEMA_MODELS, GEMINI_MODELS, GEMINI_VIDEO_DURATIONS, GeminiAudioAdapter, GEMINI_AUDIO_MODELS as GeminiAudioModels, GeminiImageAdapter, GEMINI_IMAGE_MODELS as GeminiImageModels, GEMINI_INTERACTIONS_VIDEO_MODELS as GeminiInteractionsVideoModels, GeminiTTSAdapter, GEMINI_TTS_MODELS as GeminiTTSModels, GEMINI_TTS_VOICES as GeminiTTSVoices, GeminiTextAdapter, GEMINI_MODELS as GeminiTextModels, GeminiVideoAdapter, GEMINI_VIDEO_MODELS as GeminiVideoModels, createGeminiAudio, createGeminiChat, createGeminiImage, createGeminiSpeech, createGeminiSummarize, createGeminiVideo, geminiAudio, geminiImage, geminiRealtime, geminiRealtimeToken, geminiSpeech, geminiSummarize, geminiText, geminiVideo, getGeminiVideoDurationOptions, isInteractionsVideoModel };
|
|
13
|
+
export { GEMINI_COMBINED_TOOLS_AND_SCHEMA_MODELS, GEMINI_EMBEDDING_MODELS, GEMINI_MODELS, GEMINI_VIDEO_DURATIONS, GeminiAudioAdapter, GEMINI_AUDIO_MODELS as GeminiAudioModels, GeminiEmbeddingAdapter, GeminiImageAdapter, GEMINI_IMAGE_MODELS as GeminiImageModels, GEMINI_INTERACTIONS_VIDEO_MODELS as GeminiInteractionsVideoModels, GeminiTTSAdapter, GEMINI_TTS_MODELS as GeminiTTSModels, GEMINI_TTS_VOICES as GeminiTTSVoices, GeminiTextAdapter, GEMINI_MODELS as GeminiTextModels, GeminiVideoAdapter, GEMINI_VIDEO_MODELS as GeminiVideoModels, createGeminiAudio, createGeminiChat, createGeminiEmbedding, createGeminiImage, createGeminiSpeech, createGeminiSummarize, createGeminiVideo, geminiAudio, geminiEmbedding, geminiImage, geminiRealtime, geminiRealtimeToken, geminiSpeech, geminiSummarize, geminiText, geminiVideo, getGeminiVideoDurationOptions, isInteractionsVideoModel };
|
package/dist/esm/model-meta.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { GeminiCachedContentOptions, GeminiCommonConfigOptions, GeminiSafetyOptions, GeminiStructuredOutputOptions, GeminiThinkingOptions, GeminiToolConfigOptions } from './text/text-provider-options.js';
|
|
2
|
+
import { GeminiEmbeddingProviderOptions } from './embedding/embedding-provider-options.js';
|
|
2
3
|
declare const GEMINI_3_1_PRO: {
|
|
3
4
|
readonly name: "gemini-3.1-pro-preview";
|
|
4
5
|
readonly max_input_tokens: 1048576;
|
|
@@ -139,6 +140,27 @@ declare const GEMINI_2_5_FLASH_LITE: {
|
|
|
139
140
|
};
|
|
140
141
|
};
|
|
141
142
|
};
|
|
143
|
+
declare const GEMINI_3_7_FLASH: {
|
|
144
|
+
readonly name: "gemini-3.7-flash";
|
|
145
|
+
readonly max_input_tokens: 1048576;
|
|
146
|
+
readonly max_output_tokens: 65536;
|
|
147
|
+
readonly knowledge_cutoff: "2026-03-01";
|
|
148
|
+
readonly supports: {
|
|
149
|
+
readonly input: ["text", "image", "video", "audio", "document"];
|
|
150
|
+
readonly output: ["text"];
|
|
151
|
+
readonly capabilities: ["batch_api", "caching", "function_calling", "structured_output", "thinking"];
|
|
152
|
+
readonly tools: ["code_execution", "file_search", "google_search", "google_maps", "url_context", "computer_use"];
|
|
153
|
+
};
|
|
154
|
+
readonly pricing: {
|
|
155
|
+
readonly input: {
|
|
156
|
+
readonly normal: 0.75;
|
|
157
|
+
readonly cached: 0.075;
|
|
158
|
+
};
|
|
159
|
+
readonly output: {
|
|
160
|
+
readonly normal: 3.75;
|
|
161
|
+
};
|
|
162
|
+
};
|
|
163
|
+
};
|
|
142
164
|
declare const GEMINI_3_6_FLASH: {
|
|
143
165
|
readonly name: "gemini-3.6-flash";
|
|
144
166
|
readonly max_input_tokens: 1048576;
|
|
@@ -201,7 +223,7 @@ declare const GEMINI_3_5_FLASH_LITE: {
|
|
|
201
223
|
};
|
|
202
224
|
};
|
|
203
225
|
};
|
|
204
|
-
export declare const GEMINI_MODELS: readonly ["gemini-3.6-flash", "gemini-3.5-flash", "gemini-3.5-flash-lite", "gemini-3.1-pro-preview", "gemini-3-flash-preview", "gemini-3.1-flash-lite", "gemini-3.1-flash-lite-preview", "gemini-2.5-pro", "gemini-2.5-flash", "gemini-2.5-flash-lite"];
|
|
226
|
+
export declare const GEMINI_MODELS: readonly ["gemini-3.7-flash", "gemini-3.6-flash", "gemini-3.5-flash", "gemini-3.5-flash-lite", "gemini-3.1-pro-preview", "gemini-3-flash-preview", "gemini-3.1-flash-lite", "gemini-3.1-flash-lite-preview", "gemini-2.5-pro", "gemini-2.5-flash", "gemini-2.5-flash-lite"];
|
|
205
227
|
/**
|
|
206
228
|
* Gemini models that support combining `tools` + `responseSchema` in a
|
|
207
229
|
* single streaming `generateContent` call (per issue #605). Per the
|
|
@@ -242,7 +264,26 @@ export declare const GEMINI_VIDEO_MODELS: readonly ["veo-3.1-generate-preview",
|
|
|
242
264
|
* @experimental Omni video generation is an experimental feature and may change.
|
|
243
265
|
*/
|
|
244
266
|
export declare const GEMINI_INTERACTIONS_VIDEO_MODELS: readonly ["gemini-omni-flash-preview"];
|
|
267
|
+
/**
|
|
268
|
+
* Embedding models
|
|
269
|
+
*/
|
|
270
|
+
export declare const GEMINI_EMBEDDING_MODELS: readonly ["gemini-embedding-001"];
|
|
271
|
+
export type GeminiEmbeddingModel = (typeof GEMINI_EMBEDDING_MODELS)[number];
|
|
272
|
+
/**
|
|
273
|
+
* Type-only map from embedding model name to its provider options type.
|
|
274
|
+
*/
|
|
275
|
+
export type GeminiEmbeddingModelProviderOptionsByName = {
|
|
276
|
+
'gemini-embedding-001': GeminiEmbeddingProviderOptions;
|
|
277
|
+
};
|
|
278
|
+
/**
|
|
279
|
+
* Per-model input modalities for embedding models. Gemini embedding models
|
|
280
|
+
* are text-only, so image inputs fail at compile time.
|
|
281
|
+
*/
|
|
282
|
+
export type GeminiEmbeddingModelInputModalitiesByName = {
|
|
283
|
+
'gemini-embedding-001': readonly ['text'];
|
|
284
|
+
};
|
|
245
285
|
export type GeminiChatModelProviderOptionsByName = {
|
|
286
|
+
[GEMINI_3_7_FLASH.name]: GeminiToolConfigOptions & GeminiSafetyOptions & GeminiCommonConfigOptions & GeminiCachedContentOptions & GeminiStructuredOutputOptions & GeminiThinkingOptions;
|
|
246
287
|
[GEMINI_3_6_FLASH.name]: GeminiToolConfigOptions & GeminiSafetyOptions & GeminiCommonConfigOptions & GeminiCachedContentOptions & GeminiStructuredOutputOptions & GeminiThinkingOptions;
|
|
247
288
|
[GEMINI_3_5_FLASH.name]: GeminiToolConfigOptions & GeminiSafetyOptions & GeminiCommonConfigOptions & GeminiCachedContentOptions & GeminiStructuredOutputOptions & GeminiThinkingOptions;
|
|
248
289
|
[GEMINI_3_5_FLASH_LITE.name]: GeminiToolConfigOptions & GeminiSafetyOptions & GeminiCommonConfigOptions & GeminiCachedContentOptions & GeminiStructuredOutputOptions & GeminiThinkingOptions;
|
|
@@ -259,6 +300,7 @@ export type GeminiChatModelProviderOptionsByName = {
|
|
|
259
300
|
* Based on the 'supports.tools' arrays defined for each model.
|
|
260
301
|
*/
|
|
261
302
|
export type GeminiChatModelToolCapabilitiesByName = {
|
|
303
|
+
[GEMINI_3_7_FLASH.name]: typeof GEMINI_3_7_FLASH.supports.tools;
|
|
262
304
|
[GEMINI_3_6_FLASH.name]: typeof GEMINI_3_6_FLASH.supports.tools;
|
|
263
305
|
[GEMINI_3_5_FLASH.name]: typeof GEMINI_3_5_FLASH.supports.tools;
|
|
264
306
|
[GEMINI_3_5_FLASH_LITE.name]: typeof GEMINI_3_5_FLASH_LITE.supports.tools;
|
|
@@ -284,6 +326,7 @@ export type GeminiChatModelToolCapabilitiesByName = {
|
|
|
284
326
|
* @see https://ai.google.dev/gemini-api/docs/document-processing
|
|
285
327
|
*/
|
|
286
328
|
export type GeminiModelInputModalitiesByName = {
|
|
329
|
+
[GEMINI_3_7_FLASH.name]: typeof GEMINI_3_7_FLASH.supports.input;
|
|
287
330
|
[GEMINI_3_6_FLASH.name]: typeof GEMINI_3_6_FLASH.supports.input;
|
|
288
331
|
[GEMINI_3_5_FLASH.name]: typeof GEMINI_3_5_FLASH.supports.input;
|
|
289
332
|
[GEMINI_3_5_FLASH_LITE.name]: typeof GEMINI_3_5_FLASH_LITE.supports.input;
|
package/dist/esm/model-meta.js
CHANGED
|
@@ -540,6 +540,44 @@ var GEMINI_OMNI_FLASH_PREVIEW = {
|
|
|
540
540
|
output: { normal: .1 }
|
|
541
541
|
}
|
|
542
542
|
};
|
|
543
|
+
var GEMINI_3_7_FLASH = {
|
|
544
|
+
name: "gemini-3.7-flash",
|
|
545
|
+
max_input_tokens: 1048576,
|
|
546
|
+
max_output_tokens: 65536,
|
|
547
|
+
knowledge_cutoff: "2026-03-01",
|
|
548
|
+
supports: {
|
|
549
|
+
input: [
|
|
550
|
+
"text",
|
|
551
|
+
"image",
|
|
552
|
+
"video",
|
|
553
|
+
"audio",
|
|
554
|
+
"document"
|
|
555
|
+
],
|
|
556
|
+
output: ["text"],
|
|
557
|
+
capabilities: [
|
|
558
|
+
"batch_api",
|
|
559
|
+
"caching",
|
|
560
|
+
"function_calling",
|
|
561
|
+
"structured_output",
|
|
562
|
+
"thinking"
|
|
563
|
+
],
|
|
564
|
+
tools: [
|
|
565
|
+
"code_execution",
|
|
566
|
+
"file_search",
|
|
567
|
+
"google_search",
|
|
568
|
+
"google_maps",
|
|
569
|
+
"url_context",
|
|
570
|
+
"computer_use"
|
|
571
|
+
]
|
|
572
|
+
},
|
|
573
|
+
pricing: {
|
|
574
|
+
input: {
|
|
575
|
+
normal: .75,
|
|
576
|
+
cached: .075
|
|
577
|
+
},
|
|
578
|
+
output: { normal: 3.75 }
|
|
579
|
+
}
|
|
580
|
+
};
|
|
543
581
|
var GEMINI_3_6_FLASH = {
|
|
544
582
|
name: "gemini-3.6-flash",
|
|
545
583
|
max_input_tokens: 1048576,
|
|
@@ -653,6 +691,7 @@ var GEMINI_3_5_FLASH_LITE = {
|
|
|
653
691
|
}
|
|
654
692
|
};
|
|
655
693
|
var GEMINI_MODELS = [
|
|
694
|
+
GEMINI_3_7_FLASH.name,
|
|
656
695
|
GEMINI_3_6_FLASH.name,
|
|
657
696
|
GEMINI_3_5_FLASH.name,
|
|
658
697
|
GEMINI_3_5_FLASH_LITE.name,
|
|
@@ -672,6 +711,7 @@ var GEMINI_MODELS = [
|
|
|
672
711
|
* brittle and keeps the engine's legacy finalization fallback.
|
|
673
712
|
*/
|
|
674
713
|
var GEMINI_COMBINED_TOOLS_AND_SCHEMA_MODELS = /* @__PURE__ */ new Set([
|
|
714
|
+
GEMINI_3_7_FLASH.name,
|
|
675
715
|
GEMINI_3_6_FLASH.name,
|
|
676
716
|
GEMINI_3_5_FLASH.name,
|
|
677
717
|
GEMINI_3_5_FLASH_LITE.name,
|
|
@@ -757,7 +797,11 @@ var GEMINI_VIDEO_MODELS = [
|
|
|
757
797
|
* @experimental Omni video generation is an experimental feature and may change.
|
|
758
798
|
*/
|
|
759
799
|
var GEMINI_INTERACTIONS_VIDEO_MODELS = [GEMINI_OMNI_FLASH_PREVIEW.name];
|
|
800
|
+
/**
|
|
801
|
+
* Embedding models
|
|
802
|
+
*/
|
|
803
|
+
var GEMINI_EMBEDDING_MODELS = ["gemini-embedding-001"];
|
|
760
804
|
//#endregion
|
|
761
|
-
export { GEMINI_AUDIO_MODELS, GEMINI_COMBINED_TOOLS_AND_SCHEMA_MODELS, GEMINI_IMAGE_MODELS, GEMINI_INTERACTIONS_VIDEO_MODELS, GEMINI_MODELS, GEMINI_TTS_MODELS, GEMINI_TTS_VOICES, GEMINI_VIDEO_MODELS };
|
|
805
|
+
export { GEMINI_AUDIO_MODELS, GEMINI_COMBINED_TOOLS_AND_SCHEMA_MODELS, GEMINI_EMBEDDING_MODELS, GEMINI_IMAGE_MODELS, GEMINI_INTERACTIONS_VIDEO_MODELS, GEMINI_MODELS, GEMINI_TTS_MODELS, GEMINI_TTS_VOICES, GEMINI_VIDEO_MODELS };
|
|
762
806
|
|
|
763
807
|
//# sourceMappingURL=model-meta.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-meta.js","names":[],"sources":["../../src/model-meta.ts"],"sourcesContent":["import type {\n GeminiCachedContentOptions,\n GeminiCommonConfigOptions,\n GeminiSafetyOptions,\n GeminiStructuredOutputOptions,\n GeminiThinkingOptions,\n GeminiToolConfigOptions,\n} from './text/text-provider-options'\n\ninterface ModelMeta<TProviderOptions = unknown> {\n name: string\n supports: {\n input: Array<'text' | 'image' | 'audio' | 'video' | 'document'>\n output: Array<'text' | 'image' | 'audio' | 'video'>\n capabilities?: Array<\n | 'audio_generation'\n | 'batch_api'\n | 'caching'\n | 'function_calling'\n | 'live_api'\n | 'structured_output'\n | 'thinking'\n >\n tools?: Array<\n | 'code_execution'\n | 'file_search'\n | 'google_search'\n | 'google_search_retrieval'\n | 'google_maps'\n | 'url_context'\n | 'computer_use'\n >\n }\n max_input_tokens?: number\n max_output_tokens?: number\n knowledge_cutoff?: string\n pricing?: {\n input: {\n normal: number\n cached?: number\n }\n output: {\n normal: number\n }\n }\n /**\n * Type-level description of which provider options this model supports.\n */\n providerOptions?: TProviderOptions\n}\n\nconst GEMINI_3_1_PRO = {\n name: 'gemini-3.1-pro-preview',\n max_input_tokens: 1_048_576,\n max_output_tokens: 65_536,\n knowledge_cutoff: '2025-01-01',\n supports: {\n input: ['text', 'image', 'audio', 'video', 'document'],\n output: ['text'],\n capabilities: [\n 'batch_api',\n 'caching',\n 'function_calling',\n 'structured_output',\n 'thinking',\n ],\n tools: ['code_execution', 'file_search', 'google_search', 'url_context'],\n },\n pricing: {\n input: {\n normal: 2.5,\n },\n output: {\n normal: 15,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n>\n\nconst GEMINI_3_FLASH = {\n name: 'gemini-3-flash-preview',\n max_input_tokens: 1_048_576,\n max_output_tokens: 65_536,\n knowledge_cutoff: '2025-01-01',\n supports: {\n input: ['text', 'image', 'audio', 'video', 'document'],\n output: ['text'],\n capabilities: [\n 'batch_api',\n 'caching',\n 'function_calling',\n 'structured_output',\n 'thinking',\n ],\n tools: ['code_execution', 'file_search', 'google_search', 'url_context'],\n },\n pricing: {\n input: {\n normal: 0.5,\n },\n output: {\n normal: 3,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n>\n\nconst GEMINI_3_PRO_IMAGE = {\n name: 'gemini-3-pro-image-preview',\n max_input_tokens: 65_536,\n max_output_tokens: 32_768,\n knowledge_cutoff: '2025-01-01',\n supports: {\n input: ['text', 'image'],\n output: ['text', 'image'],\n capabilities: ['batch_api', 'structured_output', 'thinking'],\n tools: ['google_search'],\n },\n pricing: {\n input: {\n normal: 2,\n },\n output: {\n normal: 0.134,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n>\n\nconst GEMINI_3_1_FLASH_IMAGE = {\n name: 'gemini-3.1-flash-image-preview',\n max_input_tokens: 65_536,\n max_output_tokens: 65_536,\n knowledge_cutoff: '2025-01-01',\n supports: {\n input: ['text', 'image'],\n output: ['text', 'image'],\n capabilities: ['batch_api', 'structured_output', 'thinking'],\n tools: ['google_search'],\n },\n pricing: {\n input: {\n normal: 0.25,\n },\n output: {\n normal: 1.5,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n>\n\nconst GEMINI_3_1_FLASH_LITE_IMAGE = {\n name: 'gemini-3.1-flash-lite-image',\n max_input_tokens: 65_536,\n max_output_tokens: 65_536,\n knowledge_cutoff: '2025-01-01',\n supports: {\n input: ['text', 'image'],\n output: ['text', 'image'],\n capabilities: ['batch_api', 'structured_output', 'thinking'],\n tools: ['google_search'],\n },\n pricing: {\n input: {\n normal: 0.25,\n },\n output: {\n normal: 1.5,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n>\n\nconst GEMINI_3_1_FLASH_LITE = {\n name: 'gemini-3.1-flash-lite',\n max_input_tokens: 1_048_576,\n max_output_tokens: 65_536,\n knowledge_cutoff: '2025-01-01',\n supports: {\n input: ['text', 'image', 'audio', 'video', 'document'],\n output: ['text'],\n capabilities: [\n 'batch_api',\n 'caching',\n 'function_calling',\n 'structured_output',\n 'thinking',\n ],\n tools: ['code_execution', 'file_search', 'google_search', 'url_context'],\n },\n pricing: {\n input: {\n normal: 0.25,\n },\n output: {\n normal: 1.5,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n>\n\nconst GEMINI_3_1_FLASH_LITE_PREVIEW = {\n name: 'gemini-3.1-flash-lite-preview',\n max_input_tokens: 1_048_576,\n max_output_tokens: 65_536,\n knowledge_cutoff: '2025-01-01',\n supports: {\n input: ['text', 'image', 'audio', 'video', 'document'],\n output: ['text'],\n capabilities: [\n 'batch_api',\n 'caching',\n 'function_calling',\n 'structured_output',\n 'thinking',\n ],\n tools: ['code_execution', 'file_search', 'google_search', 'url_context'],\n },\n pricing: {\n input: {\n normal: 0.25,\n },\n output: {\n normal: 1.5,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n>\n\nconst GEMINI_2_5_PRO = {\n name: 'gemini-2.5-pro',\n max_input_tokens: 1_048_576,\n max_output_tokens: 65_536,\n knowledge_cutoff: '2025-01-01',\n supports: {\n input: ['text', 'image', 'audio', 'video', 'document'],\n output: ['text'],\n capabilities: [\n 'batch_api',\n 'caching',\n 'function_calling',\n 'structured_output',\n 'thinking',\n ],\n tools: [\n 'code_execution',\n 'file_search',\n 'google_maps',\n 'google_search',\n 'url_context',\n ],\n },\n pricing: {\n input: {\n normal: 2.5,\n },\n output: {\n normal: 15,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n>\n\nconst GEMINI_2_5_PRO_TTS = {\n name: 'gemini-2.5-pro-preview-tts',\n max_input_tokens: 8_192,\n max_output_tokens: 16_384,\n knowledge_cutoff: '2025-05-01',\n supports: {\n input: ['text'],\n output: ['audio'],\n capabilities: ['audio_generation'],\n },\n pricing: {\n input: {\n normal: 2.5,\n },\n output: {\n normal: 15,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions\n>\n\nconst GEMINI_2_5_FLASH = {\n name: 'gemini-2.5-flash',\n max_input_tokens: 1_048_576,\n max_output_tokens: 65_536,\n knowledge_cutoff: '2025-01-01',\n supports: {\n input: ['text', 'image', 'audio', 'video'],\n output: ['text'],\n capabilities: [\n 'batch_api',\n 'caching',\n 'function_calling',\n 'structured_output',\n 'thinking',\n ],\n tools: [\n 'code_execution',\n 'file_search',\n 'google_maps',\n 'google_search',\n 'url_context',\n ],\n },\n pricing: {\n input: {\n normal: 1,\n },\n output: {\n normal: 2.5,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n>\n\nconst GEMINI_2_5_FLASH_IMAGE = {\n name: 'gemini-2.5-flash-image',\n max_input_tokens: 1_048_576,\n max_output_tokens: 65_536,\n knowledge_cutoff: '2025-06-01',\n supports: {\n input: ['text', 'image'],\n output: ['text', 'image'],\n capabilities: ['batch_api', 'caching', 'structured_output'],\n tools: ['file_search'],\n },\n pricing: {\n input: {\n normal: 0.3,\n },\n output: {\n normal: 0.4,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions\n>\n/**\nconst GEMINI_2_5_FLASH_LIVE = {\n name: 'gemini-2.5-flash-native-audio-preview-09-2025',\n max_input_tokens: 141_072,\n max_output_tokens: 8_192,\n knowledge_cutoff: '2025-01-01',\n supports: {\n input: ['text', 'audio', 'video'],\n output: ['text', 'audio'],\n capabilities: [\n 'audio_generation',\n 'file_search',\n 'function_calling',\n 'live_api',\n 'search_grounding',\n 'thinking',\n ],\n },\n pricing: {\n // todo find this info\n input: {\n normal: 0,\n },\n output: {\n normal: 0,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiGenerationConfigOptions &\n GeminiCachedContentOptions &\n GeminiThinkingOptions\n>\n*/\nconst GEMINI_2_5_FLASH_TTS = {\n name: 'gemini-2.5-flash-preview-tts',\n max_input_tokens: 8_192,\n max_output_tokens: 16_384,\n knowledge_cutoff: '2025-05-01',\n supports: {\n input: ['text'],\n output: ['audio'],\n capabilities: ['audio_generation', 'batch_api'],\n },\n pricing: {\n input: {\n normal: 1,\n },\n output: {\n normal: 2.5,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions\n>\n\n/**\n * Gemini 3.1 Flash TTS Preview - latest expressive TTS model with\n * 200+ audio tags, 70+ languages, and multi-speaker dialogue support.\n * @see https://ai.google.dev/gemini-api/docs/models/gemini-3.1-flash-tts-preview\n */\nconst GEMINI_3_1_FLASH_TTS = {\n name: 'gemini-3.1-flash-tts-preview',\n max_input_tokens: 32_768,\n max_output_tokens: 16_384,\n knowledge_cutoff: '2025-05-01',\n supports: {\n input: ['text'],\n output: ['audio'],\n capabilities: ['audio_generation', 'batch_api'],\n },\n pricing: {\n input: {\n normal: 0.5,\n },\n output: {\n normal: 10,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions\n>\n\n/**\n * Lyria 3 Pro Preview — Google's flagship music generation model.\n * Generates full-length songs with multiple verses, choruses, and bridges.\n * Outputs MP3 or WAV at 48 kHz stereo.\n * @see https://ai.google.dev/gemini-api/docs/models/lyria-3-pro-preview\n */\nconst LYRIA_3_PRO = {\n name: 'lyria-3-pro-preview',\n max_input_tokens: 131_072,\n supports: {\n input: ['text', 'image'],\n output: ['audio'],\n capabilities: ['audio_generation'],\n },\n pricing: {\n input: {\n normal: 0,\n },\n output: {\n normal: 0,\n },\n },\n} as const satisfies ModelMeta\n\n/**\n * Lyria 3 Clip Preview — 30-second music clips in MP3 format.\n * @see https://ai.google.dev/gemini-api/docs/music-generation\n */\nconst LYRIA_3_CLIP = {\n name: 'lyria-3-clip-preview',\n max_input_tokens: 131_072,\n supports: {\n input: ['text', 'image'],\n output: ['audio'],\n capabilities: ['audio_generation'],\n },\n pricing: {\n input: {\n normal: 0,\n },\n output: {\n normal: 0,\n },\n },\n} as const satisfies ModelMeta\n\nconst GEMINI_2_5_FLASH_LITE = {\n name: 'gemini-2.5-flash-lite',\n max_input_tokens: 1_048_576,\n max_output_tokens: 65_536,\n knowledge_cutoff: '2025-01-01',\n supports: {\n input: ['text', 'image', 'audio', 'video', 'document'],\n output: ['text'],\n capabilities: [\n 'batch_api',\n 'caching',\n 'function_calling',\n 'structured_output',\n 'thinking',\n ],\n tools: ['code_execution', 'google_maps', 'google_search', 'url_context'],\n },\n pricing: {\n input: {\n normal: 0.1,\n },\n output: {\n normal: 0.4,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n>\n\nconst IMAGEN_4_GENERATE = {\n name: 'imagen-4.0-generate-001',\n max_input_tokens: 480,\n max_output_tokens: 4,\n supports: {\n input: ['text'],\n output: ['image'],\n },\n pricing: {\n input: {\n normal: 0,\n },\n output: {\n normal: 0.4,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions\n>\n\nconst IMAGEN_4_GENERATE_ULTRA = {\n name: 'imagen-4.0-ultra-generate-001',\n max_input_tokens: 480,\n max_output_tokens: 4,\n supports: {\n input: ['text'],\n output: ['image'],\n },\n pricing: {\n input: {\n normal: 0,\n },\n output: {\n normal: 0.6,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions\n>\n\nconst IMAGEN_4_GENERATE_FAST = {\n name: 'imagen-4.0-fast-generate-001',\n max_input_tokens: 480,\n max_output_tokens: 4,\n supports: {\n input: ['text'],\n output: ['image'],\n },\n pricing: {\n input: {\n normal: 0,\n },\n output: {\n normal: 0.2,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions\n>\n\n/**\n * Veo video generation models. Pricing is per second of generated video\n * (audio+video rate where the model supports audio).\n * @experimental Veo video generation is an experimental feature and may change.\n */\nconst VEO_3_1_PREVIEW = {\n name: 'veo-3.1-generate-preview',\n max_input_tokens: 1024,\n max_output_tokens: 1,\n supports: {\n input: ['text', 'image'],\n output: ['video', 'audio'],\n },\n pricing: {\n input: {\n normal: 0,\n },\n output: {\n normal: 0.4,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions\n>\n\nconst VEO_3_1_FAST_PREVIEW = {\n name: 'veo-3.1-fast-generate-preview',\n max_input_tokens: 1024,\n max_output_tokens: 1,\n supports: {\n input: ['text', 'image'],\n output: ['video', 'audio'],\n },\n pricing: {\n input: {\n normal: 0,\n },\n output: {\n normal: 0.15,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions\n>\n\nconst VEO_3_1_LITE_PREVIEW = {\n name: 'veo-3.1-lite-generate-preview',\n max_input_tokens: 1024,\n max_output_tokens: 1,\n supports: {\n input: ['text', 'image'],\n output: ['video', 'audio'],\n },\n pricing: {\n input: {\n normal: 0,\n },\n output: {\n normal: 0.05,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions\n>\n\n/**\n * Gemini Omni Flash — multimodal video generation with conversational\n * editing. Serves only the Interactions API (`generateContent` rejects it),\n * so it routes through the interactions-based path of the video adapter,\n * not Veo's `:predictLongRunning` flow. Pricing is per second of generated\n * video ($0.10/sec). 720p / 24 FPS, 3–10 second clips (default 10s).\n * @experimental Omni video generation is an experimental feature and may change.\n */\nconst GEMINI_OMNI_FLASH_PREVIEW = {\n name: 'gemini-omni-flash-preview',\n max_input_tokens: 1_048_576,\n max_output_tokens: 1,\n supports: {\n input: ['text', 'image', 'video'],\n output: ['video', 'audio'],\n },\n pricing: {\n input: {\n normal: 0,\n },\n output: {\n normal: 0.1,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions\n>\n\nconst GEMINI_3_6_FLASH = {\n name: 'gemini-3.6-flash',\n max_input_tokens: 1_048_576,\n max_output_tokens: 65_536,\n knowledge_cutoff: '2026-03-01',\n supports: {\n input: ['text', 'image', 'video', 'audio', 'document'],\n output: ['text'],\n capabilities: [\n 'batch_api',\n 'caching',\n 'function_calling',\n 'structured_output',\n 'thinking',\n ],\n tools: [\n 'code_execution',\n 'file_search',\n 'google_search',\n 'google_maps',\n 'url_context',\n 'computer_use',\n ],\n },\n pricing: {\n input: {\n normal: 1.5,\n cached: 0.15,\n },\n output: {\n normal: 7.5,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n>\n\nconst GEMINI_3_5_FLASH = {\n name: 'gemini-3.5-flash',\n max_input_tokens: 1_048_576,\n max_output_tokens: 65_536,\n supports: {\n input: ['text', 'image', 'video', 'document', 'audio'],\n output: ['text'],\n capabilities: [\n 'batch_api',\n 'caching',\n 'function_calling',\n 'structured_output',\n 'thinking',\n ],\n tools: [\n 'code_execution',\n 'file_search',\n 'google_search',\n 'google_maps',\n 'url_context',\n 'computer_use',\n ],\n },\n pricing: {\n input: {\n normal: 1.5,\n cached: 0.15,\n },\n output: {\n normal: 9,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n>\n\nconst GEMINI_3_5_FLASH_LITE = {\n name: 'gemini-3.5-flash-lite',\n max_input_tokens: 1_048_576,\n max_output_tokens: 65_536,\n knowledge_cutoff: '2025-01-01',\n supports: {\n input: ['text', 'image', 'video', 'audio', 'document'],\n output: ['text'],\n capabilities: [\n 'batch_api',\n 'caching',\n 'function_calling',\n 'structured_output',\n 'thinking',\n ],\n tools: [\n 'code_execution',\n 'file_search',\n 'google_search',\n 'google_maps',\n 'url_context',\n ],\n },\n pricing: {\n input: {\n normal: 0.3,\n cached: 0.03,\n },\n output: {\n normal: 2.5,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n>\n\nexport const GEMINI_MODELS = [\n GEMINI_3_6_FLASH.name,\n GEMINI_3_5_FLASH.name,\n GEMINI_3_5_FLASH_LITE.name,\n GEMINI_3_1_PRO.name,\n GEMINI_3_FLASH.name,\n GEMINI_3_1_FLASH_LITE.name,\n GEMINI_3_1_FLASH_LITE_PREVIEW.name,\n GEMINI_2_5_PRO.name,\n GEMINI_2_5_FLASH.name,\n GEMINI_2_5_FLASH_LITE.name,\n] as const\n\n/**\n * Gemini models that support combining `tools` + `responseSchema` in a\n * single streaming `generateContent` call (per issue #605). Per the\n * provider matrix, Gemini 3.x natively interleaves the schema-constrained\n * answer with function-calling on one pass; Gemini 2.x is unsupported /\n * brittle and keeps the engine's legacy finalization fallback.\n */\nexport const GEMINI_COMBINED_TOOLS_AND_SCHEMA_MODELS = new Set<string>([\n GEMINI_3_6_FLASH.name,\n GEMINI_3_5_FLASH.name,\n GEMINI_3_5_FLASH_LITE.name,\n GEMINI_3_1_PRO.name,\n GEMINI_3_FLASH.name,\n GEMINI_3_1_FLASH_LITE.name,\n GEMINI_3_1_FLASH_LITE_PREVIEW.name,\n])\n\nexport type GeminiModels = (typeof GEMINI_MODELS)[number]\n\nexport type GeminiImageModels = (typeof GEMINI_IMAGE_MODELS)[number]\n\nexport const GEMINI_IMAGE_MODELS = [\n GEMINI_3_1_FLASH_IMAGE.name,\n GEMINI_3_1_FLASH_LITE_IMAGE.name,\n GEMINI_3_PRO_IMAGE.name,\n GEMINI_2_5_FLASH_IMAGE.name,\n IMAGEN_4_GENERATE.name,\n IMAGEN_4_GENERATE_FAST.name,\n IMAGEN_4_GENERATE_ULTRA.name,\n] as const\n\n/**\n * Text-to-speech models\n * @experimental Gemini TTS is an experimental feature and may change.\n */\nexport const GEMINI_TTS_MODELS = [\n GEMINI_3_1_FLASH_TTS.name,\n GEMINI_2_5_FLASH_TTS.name,\n GEMINI_2_5_PRO_TTS.name,\n] as const\n\n/**\n * Audio generation models (Lyria music generation).\n * @experimental Lyria music generation is an experimental feature and may change.\n */\nexport const GEMINI_AUDIO_MODELS = [\n LYRIA_3_PRO.name,\n LYRIA_3_CLIP.name,\n] as const\n\n/**\n * Available voice names for Gemini TTS\n * @see https://ai.google.dev/gemini-api/docs/speech-generation\n */\nexport const GEMINI_TTS_VOICES = [\n 'Zephyr',\n 'Puck',\n 'Charon',\n 'Kore',\n 'Fenrir',\n 'Leda',\n 'Orus',\n 'Aoede',\n 'Callirrhoe',\n 'Autonoe',\n 'Enceladus',\n 'Iapetus',\n 'Umbriel',\n 'Algieba',\n 'Despina',\n 'Erinome',\n 'Algenib',\n 'Rasalgethi',\n 'Laomedeia',\n 'Achernar',\n 'Alnilam',\n 'Schedar',\n 'Gacrux',\n 'Pulcherrima',\n 'Achird',\n 'Zubenelgenubi',\n 'Vindemiatrix',\n 'Sadachbia',\n 'Sadaltager',\n 'Sulafat',\n] as const\n\nexport type GeminiTTSVoice = (typeof GEMINI_TTS_VOICES)[number]\n\n/**\n * Video generation models. Veo models run on the long-running\n * `:predictLongRunning` flow; Gemini Omni Flash runs on the Interactions\n * API — the video adapter routes by model.\n * @experimental Video generation is an experimental feature and may change.\n */\nexport const GEMINI_VIDEO_MODELS = [\n VEO_3_1_PREVIEW.name,\n VEO_3_1_FAST_PREVIEW.name,\n VEO_3_1_LITE_PREVIEW.name,\n GEMINI_OMNI_FLASH_PREVIEW.name,\n] as const\n\n/**\n * Video models served by the Interactions API rather than Veo's\n * `:predictLongRunning` operations flow.\n * @experimental Omni video generation is an experimental feature and may change.\n */\nexport const GEMINI_INTERACTIONS_VIDEO_MODELS = [\n GEMINI_OMNI_FLASH_PREVIEW.name,\n] as const\n\n// Manual type map for per-model provider options\nexport type GeminiChatModelProviderOptionsByName = {\n // Models with thinking and structured output support\n [GEMINI_3_6_FLASH.name]: GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n [GEMINI_3_5_FLASH.name]: GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n [GEMINI_3_5_FLASH_LITE.name]: GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n [GEMINI_3_1_PRO.name]: GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n [GEMINI_3_FLASH.name]: GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n [GEMINI_3_1_FLASH_LITE.name]: GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n [GEMINI_3_1_FLASH_LITE_PREVIEW.name]: GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n [GEMINI_2_5_PRO.name]: GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n [GEMINI_2_5_FLASH.name]: GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n [GEMINI_2_5_FLASH_LITE.name]: GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n}\n\n/**\n * Type-only map from chat model name to its supported tool capabilities.\n * Based on the 'supports.tools' arrays defined for each model.\n */\nexport type GeminiChatModelToolCapabilitiesByName = {\n [GEMINI_3_6_FLASH.name]: typeof GEMINI_3_6_FLASH.supports.tools\n [GEMINI_3_5_FLASH.name]: typeof GEMINI_3_5_FLASH.supports.tools\n [GEMINI_3_5_FLASH_LITE.name]: typeof GEMINI_3_5_FLASH_LITE.supports.tools\n [GEMINI_3_1_PRO.name]: typeof GEMINI_3_1_PRO.supports.tools\n [GEMINI_3_FLASH.name]: typeof GEMINI_3_FLASH.supports.tools\n [GEMINI_3_1_FLASH_LITE.name]: typeof GEMINI_3_1_FLASH_LITE.supports.tools\n [GEMINI_3_1_FLASH_LITE_PREVIEW.name]: typeof GEMINI_3_1_FLASH_LITE_PREVIEW.supports.tools\n [GEMINI_2_5_PRO.name]: typeof GEMINI_2_5_PRO.supports.tools\n [GEMINI_2_5_FLASH.name]: typeof GEMINI_2_5_FLASH.supports.tools\n [GEMINI_2_5_FLASH_LITE.name]: typeof GEMINI_2_5_FLASH_LITE.supports.tools\n}\n\n/**\n * Type-only map from chat model name to its supported input modalities.\n * Based on the 'supports.input' arrays defined for each model.\n * Note: 'document' in the model meta is mapped to 'document' modality.\n * Used by the core AI types to constrain ContentPart types based on the selected model.\n * Note: These must be inlined as readonly arrays (not typeof) because the model\n * constants are not exported and typeof references don't work in .d.ts files\n * when consumed by external packages.\n *\n * @see https://ai.google.dev/gemini-api/docs/vision\n * @see https://ai.google.dev/gemini-api/docs/audio\n * @see https://ai.google.dev/gemini-api/docs/document-processing\n */\nexport type GeminiModelInputModalitiesByName = {\n // Models with full multimodal support (text, image, audio, video, document)\n [GEMINI_3_6_FLASH.name]: typeof GEMINI_3_6_FLASH.supports.input\n [GEMINI_3_5_FLASH.name]: typeof GEMINI_3_5_FLASH.supports.input\n [GEMINI_3_5_FLASH_LITE.name]: typeof GEMINI_3_5_FLASH_LITE.supports.input\n [GEMINI_3_1_PRO.name]: typeof GEMINI_3_1_PRO.supports.input\n [GEMINI_3_FLASH.name]: typeof GEMINI_3_FLASH.supports.input\n [GEMINI_3_1_FLASH_LITE.name]: typeof GEMINI_3_1_FLASH_LITE.supports.input\n [GEMINI_3_1_FLASH_LITE_PREVIEW.name]: typeof GEMINI_3_1_FLASH_LITE_PREVIEW.supports.input\n [GEMINI_2_5_PRO.name]: typeof GEMINI_2_5_PRO.supports.input\n [GEMINI_2_5_FLASH_LITE.name]: typeof GEMINI_2_5_FLASH_LITE.supports.input\n\n // Models with text, image, audio, video (no document)\n [GEMINI_2_5_FLASH.name]: typeof GEMINI_2_5_FLASH.supports.input\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"model-meta.js","names":[],"sources":["../../src/model-meta.ts"],"sourcesContent":["import type {\n GeminiCachedContentOptions,\n GeminiCommonConfigOptions,\n GeminiSafetyOptions,\n GeminiStructuredOutputOptions,\n GeminiThinkingOptions,\n GeminiToolConfigOptions,\n} from './text/text-provider-options'\nimport type { GeminiEmbeddingProviderOptions } from './embedding/embedding-provider-options'\n\ninterface ModelMeta<TProviderOptions = unknown> {\n name: string\n supports: {\n input: Array<'text' | 'image' | 'audio' | 'video' | 'document'>\n output: Array<'text' | 'image' | 'audio' | 'video'>\n capabilities?: Array<\n | 'audio_generation'\n | 'batch_api'\n | 'caching'\n | 'function_calling'\n | 'live_api'\n | 'structured_output'\n | 'thinking'\n >\n tools?: Array<\n | 'code_execution'\n | 'file_search'\n | 'google_search'\n | 'google_search_retrieval'\n | 'google_maps'\n | 'url_context'\n | 'computer_use'\n >\n }\n max_input_tokens?: number\n max_output_tokens?: number\n knowledge_cutoff?: string\n pricing?: {\n input: {\n normal: number\n cached?: number\n }\n output: {\n normal: number\n }\n }\n /**\n * Type-level description of which provider options this model supports.\n */\n providerOptions?: TProviderOptions\n}\n\nconst GEMINI_3_1_PRO = {\n name: 'gemini-3.1-pro-preview',\n max_input_tokens: 1_048_576,\n max_output_tokens: 65_536,\n knowledge_cutoff: '2025-01-01',\n supports: {\n input: ['text', 'image', 'audio', 'video', 'document'],\n output: ['text'],\n capabilities: [\n 'batch_api',\n 'caching',\n 'function_calling',\n 'structured_output',\n 'thinking',\n ],\n tools: ['code_execution', 'file_search', 'google_search', 'url_context'],\n },\n pricing: {\n input: {\n normal: 2.5,\n },\n output: {\n normal: 15,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n>\n\nconst GEMINI_3_FLASH = {\n name: 'gemini-3-flash-preview',\n max_input_tokens: 1_048_576,\n max_output_tokens: 65_536,\n knowledge_cutoff: '2025-01-01',\n supports: {\n input: ['text', 'image', 'audio', 'video', 'document'],\n output: ['text'],\n capabilities: [\n 'batch_api',\n 'caching',\n 'function_calling',\n 'structured_output',\n 'thinking',\n ],\n tools: ['code_execution', 'file_search', 'google_search', 'url_context'],\n },\n pricing: {\n input: {\n normal: 0.5,\n },\n output: {\n normal: 3,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n>\n\nconst GEMINI_3_PRO_IMAGE = {\n name: 'gemini-3-pro-image-preview',\n max_input_tokens: 65_536,\n max_output_tokens: 32_768,\n knowledge_cutoff: '2025-01-01',\n supports: {\n input: ['text', 'image'],\n output: ['text', 'image'],\n capabilities: ['batch_api', 'structured_output', 'thinking'],\n tools: ['google_search'],\n },\n pricing: {\n input: {\n normal: 2,\n },\n output: {\n normal: 0.134,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n>\n\nconst GEMINI_3_1_FLASH_IMAGE = {\n name: 'gemini-3.1-flash-image-preview',\n max_input_tokens: 65_536,\n max_output_tokens: 65_536,\n knowledge_cutoff: '2025-01-01',\n supports: {\n input: ['text', 'image'],\n output: ['text', 'image'],\n capabilities: ['batch_api', 'structured_output', 'thinking'],\n tools: ['google_search'],\n },\n pricing: {\n input: {\n normal: 0.25,\n },\n output: {\n normal: 1.5,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n>\n\nconst GEMINI_3_1_FLASH_LITE_IMAGE = {\n name: 'gemini-3.1-flash-lite-image',\n max_input_tokens: 65_536,\n max_output_tokens: 65_536,\n knowledge_cutoff: '2025-01-01',\n supports: {\n input: ['text', 'image'],\n output: ['text', 'image'],\n capabilities: ['batch_api', 'structured_output', 'thinking'],\n tools: ['google_search'],\n },\n pricing: {\n input: {\n normal: 0.25,\n },\n output: {\n normal: 1.5,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n>\n\nconst GEMINI_3_1_FLASH_LITE = {\n name: 'gemini-3.1-flash-lite',\n max_input_tokens: 1_048_576,\n max_output_tokens: 65_536,\n knowledge_cutoff: '2025-01-01',\n supports: {\n input: ['text', 'image', 'audio', 'video', 'document'],\n output: ['text'],\n capabilities: [\n 'batch_api',\n 'caching',\n 'function_calling',\n 'structured_output',\n 'thinking',\n ],\n tools: ['code_execution', 'file_search', 'google_search', 'url_context'],\n },\n pricing: {\n input: {\n normal: 0.25,\n },\n output: {\n normal: 1.5,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n>\n\nconst GEMINI_3_1_FLASH_LITE_PREVIEW = {\n name: 'gemini-3.1-flash-lite-preview',\n max_input_tokens: 1_048_576,\n max_output_tokens: 65_536,\n knowledge_cutoff: '2025-01-01',\n supports: {\n input: ['text', 'image', 'audio', 'video', 'document'],\n output: ['text'],\n capabilities: [\n 'batch_api',\n 'caching',\n 'function_calling',\n 'structured_output',\n 'thinking',\n ],\n tools: ['code_execution', 'file_search', 'google_search', 'url_context'],\n },\n pricing: {\n input: {\n normal: 0.25,\n },\n output: {\n normal: 1.5,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n>\n\nconst GEMINI_2_5_PRO = {\n name: 'gemini-2.5-pro',\n max_input_tokens: 1_048_576,\n max_output_tokens: 65_536,\n knowledge_cutoff: '2025-01-01',\n supports: {\n input: ['text', 'image', 'audio', 'video', 'document'],\n output: ['text'],\n capabilities: [\n 'batch_api',\n 'caching',\n 'function_calling',\n 'structured_output',\n 'thinking',\n ],\n tools: [\n 'code_execution',\n 'file_search',\n 'google_maps',\n 'google_search',\n 'url_context',\n ],\n },\n pricing: {\n input: {\n normal: 2.5,\n },\n output: {\n normal: 15,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n>\n\nconst GEMINI_2_5_PRO_TTS = {\n name: 'gemini-2.5-pro-preview-tts',\n max_input_tokens: 8_192,\n max_output_tokens: 16_384,\n knowledge_cutoff: '2025-05-01',\n supports: {\n input: ['text'],\n output: ['audio'],\n capabilities: ['audio_generation'],\n },\n pricing: {\n input: {\n normal: 2.5,\n },\n output: {\n normal: 15,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions\n>\n\nconst GEMINI_2_5_FLASH = {\n name: 'gemini-2.5-flash',\n max_input_tokens: 1_048_576,\n max_output_tokens: 65_536,\n knowledge_cutoff: '2025-01-01',\n supports: {\n input: ['text', 'image', 'audio', 'video'],\n output: ['text'],\n capabilities: [\n 'batch_api',\n 'caching',\n 'function_calling',\n 'structured_output',\n 'thinking',\n ],\n tools: [\n 'code_execution',\n 'file_search',\n 'google_maps',\n 'google_search',\n 'url_context',\n ],\n },\n pricing: {\n input: {\n normal: 1,\n },\n output: {\n normal: 2.5,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n>\n\nconst GEMINI_2_5_FLASH_IMAGE = {\n name: 'gemini-2.5-flash-image',\n max_input_tokens: 1_048_576,\n max_output_tokens: 65_536,\n knowledge_cutoff: '2025-06-01',\n supports: {\n input: ['text', 'image'],\n output: ['text', 'image'],\n capabilities: ['batch_api', 'caching', 'structured_output'],\n tools: ['file_search'],\n },\n pricing: {\n input: {\n normal: 0.3,\n },\n output: {\n normal: 0.4,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions\n>\n/**\nconst GEMINI_2_5_FLASH_LIVE = {\n name: 'gemini-2.5-flash-native-audio-preview-09-2025',\n max_input_tokens: 141_072,\n max_output_tokens: 8_192,\n knowledge_cutoff: '2025-01-01',\n supports: {\n input: ['text', 'audio', 'video'],\n output: ['text', 'audio'],\n capabilities: [\n 'audio_generation',\n 'file_search',\n 'function_calling',\n 'live_api',\n 'search_grounding',\n 'thinking',\n ],\n },\n pricing: {\n // todo find this info\n input: {\n normal: 0,\n },\n output: {\n normal: 0,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiGenerationConfigOptions &\n GeminiCachedContentOptions &\n GeminiThinkingOptions\n>\n*/\nconst GEMINI_2_5_FLASH_TTS = {\n name: 'gemini-2.5-flash-preview-tts',\n max_input_tokens: 8_192,\n max_output_tokens: 16_384,\n knowledge_cutoff: '2025-05-01',\n supports: {\n input: ['text'],\n output: ['audio'],\n capabilities: ['audio_generation', 'batch_api'],\n },\n pricing: {\n input: {\n normal: 1,\n },\n output: {\n normal: 2.5,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions\n>\n\n/**\n * Gemini 3.1 Flash TTS Preview - latest expressive TTS model with\n * 200+ audio tags, 70+ languages, and multi-speaker dialogue support.\n * @see https://ai.google.dev/gemini-api/docs/models/gemini-3.1-flash-tts-preview\n */\nconst GEMINI_3_1_FLASH_TTS = {\n name: 'gemini-3.1-flash-tts-preview',\n max_input_tokens: 32_768,\n max_output_tokens: 16_384,\n knowledge_cutoff: '2025-05-01',\n supports: {\n input: ['text'],\n output: ['audio'],\n capabilities: ['audio_generation', 'batch_api'],\n },\n pricing: {\n input: {\n normal: 0.5,\n },\n output: {\n normal: 10,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions\n>\n\n/**\n * Lyria 3 Pro Preview — Google's flagship music generation model.\n * Generates full-length songs with multiple verses, choruses, and bridges.\n * Outputs MP3 or WAV at 48 kHz stereo.\n * @see https://ai.google.dev/gemini-api/docs/models/lyria-3-pro-preview\n */\nconst LYRIA_3_PRO = {\n name: 'lyria-3-pro-preview',\n max_input_tokens: 131_072,\n supports: {\n input: ['text', 'image'],\n output: ['audio'],\n capabilities: ['audio_generation'],\n },\n pricing: {\n input: {\n normal: 0,\n },\n output: {\n normal: 0,\n },\n },\n} as const satisfies ModelMeta\n\n/**\n * Lyria 3 Clip Preview — 30-second music clips in MP3 format.\n * @see https://ai.google.dev/gemini-api/docs/music-generation\n */\nconst LYRIA_3_CLIP = {\n name: 'lyria-3-clip-preview',\n max_input_tokens: 131_072,\n supports: {\n input: ['text', 'image'],\n output: ['audio'],\n capabilities: ['audio_generation'],\n },\n pricing: {\n input: {\n normal: 0,\n },\n output: {\n normal: 0,\n },\n },\n} as const satisfies ModelMeta\n\nconst GEMINI_2_5_FLASH_LITE = {\n name: 'gemini-2.5-flash-lite',\n max_input_tokens: 1_048_576,\n max_output_tokens: 65_536,\n knowledge_cutoff: '2025-01-01',\n supports: {\n input: ['text', 'image', 'audio', 'video', 'document'],\n output: ['text'],\n capabilities: [\n 'batch_api',\n 'caching',\n 'function_calling',\n 'structured_output',\n 'thinking',\n ],\n tools: ['code_execution', 'google_maps', 'google_search', 'url_context'],\n },\n pricing: {\n input: {\n normal: 0.1,\n },\n output: {\n normal: 0.4,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n>\n\nconst IMAGEN_4_GENERATE = {\n name: 'imagen-4.0-generate-001',\n max_input_tokens: 480,\n max_output_tokens: 4,\n supports: {\n input: ['text'],\n output: ['image'],\n },\n pricing: {\n input: {\n normal: 0,\n },\n output: {\n normal: 0.4,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions\n>\n\nconst IMAGEN_4_GENERATE_ULTRA = {\n name: 'imagen-4.0-ultra-generate-001',\n max_input_tokens: 480,\n max_output_tokens: 4,\n supports: {\n input: ['text'],\n output: ['image'],\n },\n pricing: {\n input: {\n normal: 0,\n },\n output: {\n normal: 0.6,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions\n>\n\nconst IMAGEN_4_GENERATE_FAST = {\n name: 'imagen-4.0-fast-generate-001',\n max_input_tokens: 480,\n max_output_tokens: 4,\n supports: {\n input: ['text'],\n output: ['image'],\n },\n pricing: {\n input: {\n normal: 0,\n },\n output: {\n normal: 0.2,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions\n>\n\n/**\n * Veo video generation models. Pricing is per second of generated video\n * (audio+video rate where the model supports audio).\n * @experimental Veo video generation is an experimental feature and may change.\n */\nconst VEO_3_1_PREVIEW = {\n name: 'veo-3.1-generate-preview',\n max_input_tokens: 1024,\n max_output_tokens: 1,\n supports: {\n input: ['text', 'image'],\n output: ['video', 'audio'],\n },\n pricing: {\n input: {\n normal: 0,\n },\n output: {\n normal: 0.4,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions\n>\n\nconst VEO_3_1_FAST_PREVIEW = {\n name: 'veo-3.1-fast-generate-preview',\n max_input_tokens: 1024,\n max_output_tokens: 1,\n supports: {\n input: ['text', 'image'],\n output: ['video', 'audio'],\n },\n pricing: {\n input: {\n normal: 0,\n },\n output: {\n normal: 0.15,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions\n>\n\nconst VEO_3_1_LITE_PREVIEW = {\n name: 'veo-3.1-lite-generate-preview',\n max_input_tokens: 1024,\n max_output_tokens: 1,\n supports: {\n input: ['text', 'image'],\n output: ['video', 'audio'],\n },\n pricing: {\n input: {\n normal: 0,\n },\n output: {\n normal: 0.05,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions\n>\n\n/**\n * Gemini Omni Flash — multimodal video generation with conversational\n * editing. Serves only the Interactions API (`generateContent` rejects it),\n * so it routes through the interactions-based path of the video adapter,\n * not Veo's `:predictLongRunning` flow. Pricing is per second of generated\n * video ($0.10/sec). 720p / 24 FPS, 3–10 second clips (default 10s).\n * @experimental Omni video generation is an experimental feature and may change.\n */\nconst GEMINI_OMNI_FLASH_PREVIEW = {\n name: 'gemini-omni-flash-preview',\n max_input_tokens: 1_048_576,\n max_output_tokens: 1,\n supports: {\n input: ['text', 'image', 'video'],\n output: ['video', 'audio'],\n },\n pricing: {\n input: {\n normal: 0,\n },\n output: {\n normal: 0.1,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions\n>\n\nconst GEMINI_3_7_FLASH = {\n name: 'gemini-3.7-flash',\n max_input_tokens: 1_048_576,\n max_output_tokens: 65_536,\n knowledge_cutoff: '2026-03-01',\n supports: {\n input: ['text', 'image', 'video', 'audio', 'document'],\n output: ['text'],\n capabilities: [\n 'batch_api',\n 'caching',\n 'function_calling',\n 'structured_output',\n 'thinking',\n ],\n tools: [\n 'code_execution',\n 'file_search',\n 'google_search',\n 'google_maps',\n 'url_context',\n 'computer_use',\n ],\n },\n // Currently 50% off through the end of 2026.\n // https://ai.google.dev/gemini-api/docs/pricing#gemini-3.7-flash\n pricing: {\n input: {\n normal: 0.75,\n cached: 0.075,\n },\n output: {\n normal: 3.75,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n>\n\nconst GEMINI_3_6_FLASH = {\n name: 'gemini-3.6-flash',\n max_input_tokens: 1_048_576,\n max_output_tokens: 65_536,\n knowledge_cutoff: '2026-03-01',\n supports: {\n input: ['text', 'image', 'video', 'audio', 'document'],\n output: ['text'],\n capabilities: [\n 'batch_api',\n 'caching',\n 'function_calling',\n 'structured_output',\n 'thinking',\n ],\n tools: [\n 'code_execution',\n 'file_search',\n 'google_search',\n 'google_maps',\n 'url_context',\n 'computer_use',\n ],\n },\n pricing: {\n input: {\n normal: 1.5,\n cached: 0.15,\n },\n output: {\n normal: 7.5,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n>\n\nconst GEMINI_3_5_FLASH = {\n name: 'gemini-3.5-flash',\n max_input_tokens: 1_048_576,\n max_output_tokens: 65_536,\n supports: {\n input: ['text', 'image', 'video', 'document', 'audio'],\n output: ['text'],\n capabilities: [\n 'batch_api',\n 'caching',\n 'function_calling',\n 'structured_output',\n 'thinking',\n ],\n tools: [\n 'code_execution',\n 'file_search',\n 'google_search',\n 'google_maps',\n 'url_context',\n 'computer_use',\n ],\n },\n pricing: {\n input: {\n normal: 1.5,\n cached: 0.15,\n },\n output: {\n normal: 9,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n>\n\nconst GEMINI_3_5_FLASH_LITE = {\n name: 'gemini-3.5-flash-lite',\n max_input_tokens: 1_048_576,\n max_output_tokens: 65_536,\n knowledge_cutoff: '2025-01-01',\n supports: {\n input: ['text', 'image', 'video', 'audio', 'document'],\n output: ['text'],\n capabilities: [\n 'batch_api',\n 'caching',\n 'function_calling',\n 'structured_output',\n 'thinking',\n ],\n tools: [\n 'code_execution',\n 'file_search',\n 'google_search',\n 'google_maps',\n 'url_context',\n ],\n },\n pricing: {\n input: {\n normal: 0.3,\n cached: 0.03,\n },\n output: {\n normal: 2.5,\n },\n },\n} as const satisfies ModelMeta<\n GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n>\n\nexport const GEMINI_MODELS = [\n GEMINI_3_7_FLASH.name,\n GEMINI_3_6_FLASH.name,\n GEMINI_3_5_FLASH.name,\n GEMINI_3_5_FLASH_LITE.name,\n GEMINI_3_1_PRO.name,\n GEMINI_3_FLASH.name,\n GEMINI_3_1_FLASH_LITE.name,\n GEMINI_3_1_FLASH_LITE_PREVIEW.name,\n GEMINI_2_5_PRO.name,\n GEMINI_2_5_FLASH.name,\n GEMINI_2_5_FLASH_LITE.name,\n] as const\n\n/**\n * Gemini models that support combining `tools` + `responseSchema` in a\n * single streaming `generateContent` call (per issue #605). Per the\n * provider matrix, Gemini 3.x natively interleaves the schema-constrained\n * answer with function-calling on one pass; Gemini 2.x is unsupported /\n * brittle and keeps the engine's legacy finalization fallback.\n */\nexport const GEMINI_COMBINED_TOOLS_AND_SCHEMA_MODELS = new Set<string>([\n GEMINI_3_7_FLASH.name,\n GEMINI_3_6_FLASH.name,\n GEMINI_3_5_FLASH.name,\n GEMINI_3_5_FLASH_LITE.name,\n GEMINI_3_1_PRO.name,\n GEMINI_3_FLASH.name,\n GEMINI_3_1_FLASH_LITE.name,\n GEMINI_3_1_FLASH_LITE_PREVIEW.name,\n])\n\nexport type GeminiModels = (typeof GEMINI_MODELS)[number]\n\nexport type GeminiImageModels = (typeof GEMINI_IMAGE_MODELS)[number]\n\nexport const GEMINI_IMAGE_MODELS = [\n GEMINI_3_1_FLASH_IMAGE.name,\n GEMINI_3_1_FLASH_LITE_IMAGE.name,\n GEMINI_3_PRO_IMAGE.name,\n GEMINI_2_5_FLASH_IMAGE.name,\n IMAGEN_4_GENERATE.name,\n IMAGEN_4_GENERATE_FAST.name,\n IMAGEN_4_GENERATE_ULTRA.name,\n] as const\n\n/**\n * Text-to-speech models\n * @experimental Gemini TTS is an experimental feature and may change.\n */\nexport const GEMINI_TTS_MODELS = [\n GEMINI_3_1_FLASH_TTS.name,\n GEMINI_2_5_FLASH_TTS.name,\n GEMINI_2_5_PRO_TTS.name,\n] as const\n\n/**\n * Audio generation models (Lyria music generation).\n * @experimental Lyria music generation is an experimental feature and may change.\n */\nexport const GEMINI_AUDIO_MODELS = [\n LYRIA_3_PRO.name,\n LYRIA_3_CLIP.name,\n] as const\n\n/**\n * Available voice names for Gemini TTS\n * @see https://ai.google.dev/gemini-api/docs/speech-generation\n */\nexport const GEMINI_TTS_VOICES = [\n 'Zephyr',\n 'Puck',\n 'Charon',\n 'Kore',\n 'Fenrir',\n 'Leda',\n 'Orus',\n 'Aoede',\n 'Callirrhoe',\n 'Autonoe',\n 'Enceladus',\n 'Iapetus',\n 'Umbriel',\n 'Algieba',\n 'Despina',\n 'Erinome',\n 'Algenib',\n 'Rasalgethi',\n 'Laomedeia',\n 'Achernar',\n 'Alnilam',\n 'Schedar',\n 'Gacrux',\n 'Pulcherrima',\n 'Achird',\n 'Zubenelgenubi',\n 'Vindemiatrix',\n 'Sadachbia',\n 'Sadaltager',\n 'Sulafat',\n] as const\n\nexport type GeminiTTSVoice = (typeof GEMINI_TTS_VOICES)[number]\n\n/**\n * Video generation models. Veo models run on the long-running\n * `:predictLongRunning` flow; Gemini Omni Flash runs on the Interactions\n * API — the video adapter routes by model.\n * @experimental Video generation is an experimental feature and may change.\n */\nexport const GEMINI_VIDEO_MODELS = [\n VEO_3_1_PREVIEW.name,\n VEO_3_1_FAST_PREVIEW.name,\n VEO_3_1_LITE_PREVIEW.name,\n GEMINI_OMNI_FLASH_PREVIEW.name,\n] as const\n\n/**\n * Video models served by the Interactions API rather than Veo's\n * `:predictLongRunning` operations flow.\n * @experimental Omni video generation is an experimental feature and may change.\n */\nexport const GEMINI_INTERACTIONS_VIDEO_MODELS = [\n GEMINI_OMNI_FLASH_PREVIEW.name,\n] as const\n\n/**\n * Embedding models\n */\nexport const GEMINI_EMBEDDING_MODELS = ['gemini-embedding-001'] as const\n\nexport type GeminiEmbeddingModel = (typeof GEMINI_EMBEDDING_MODELS)[number]\n\n/**\n * Type-only map from embedding model name to its provider options type.\n */\nexport type GeminiEmbeddingModelProviderOptionsByName = {\n 'gemini-embedding-001': GeminiEmbeddingProviderOptions\n}\n\n/**\n * Per-model input modalities for embedding models. Gemini embedding models\n * are text-only, so image inputs fail at compile time.\n */\nexport type GeminiEmbeddingModelInputModalitiesByName = {\n 'gemini-embedding-001': readonly ['text']\n}\n\n// Manual type map for per-model provider options\nexport type GeminiChatModelProviderOptionsByName = {\n // Models with thinking and structured output support\n [GEMINI_3_7_FLASH.name]: GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n [GEMINI_3_6_FLASH.name]: GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n [GEMINI_3_5_FLASH.name]: GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n [GEMINI_3_5_FLASH_LITE.name]: GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n [GEMINI_3_1_PRO.name]: GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n [GEMINI_3_FLASH.name]: GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n [GEMINI_3_1_FLASH_LITE.name]: GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n [GEMINI_3_1_FLASH_LITE_PREVIEW.name]: GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n [GEMINI_2_5_PRO.name]: GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n [GEMINI_2_5_FLASH.name]: GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n [GEMINI_2_5_FLASH_LITE.name]: GeminiToolConfigOptions &\n GeminiSafetyOptions &\n GeminiCommonConfigOptions &\n GeminiCachedContentOptions &\n GeminiStructuredOutputOptions &\n GeminiThinkingOptions\n}\n\n/**\n * Type-only map from chat model name to its supported tool capabilities.\n * Based on the 'supports.tools' arrays defined for each model.\n */\nexport type GeminiChatModelToolCapabilitiesByName = {\n [GEMINI_3_7_FLASH.name]: typeof GEMINI_3_7_FLASH.supports.tools\n [GEMINI_3_6_FLASH.name]: typeof GEMINI_3_6_FLASH.supports.tools\n [GEMINI_3_5_FLASH.name]: typeof GEMINI_3_5_FLASH.supports.tools\n [GEMINI_3_5_FLASH_LITE.name]: typeof GEMINI_3_5_FLASH_LITE.supports.tools\n [GEMINI_3_1_PRO.name]: typeof GEMINI_3_1_PRO.supports.tools\n [GEMINI_3_FLASH.name]: typeof GEMINI_3_FLASH.supports.tools\n [GEMINI_3_1_FLASH_LITE.name]: typeof GEMINI_3_1_FLASH_LITE.supports.tools\n [GEMINI_3_1_FLASH_LITE_PREVIEW.name]: typeof GEMINI_3_1_FLASH_LITE_PREVIEW.supports.tools\n [GEMINI_2_5_PRO.name]: typeof GEMINI_2_5_PRO.supports.tools\n [GEMINI_2_5_FLASH.name]: typeof GEMINI_2_5_FLASH.supports.tools\n [GEMINI_2_5_FLASH_LITE.name]: typeof GEMINI_2_5_FLASH_LITE.supports.tools\n}\n\n/**\n * Type-only map from chat model name to its supported input modalities.\n * Based on the 'supports.input' arrays defined for each model.\n * Note: 'document' in the model meta is mapped to 'document' modality.\n * Used by the core AI types to constrain ContentPart types based on the selected model.\n * Note: These must be inlined as readonly arrays (not typeof) because the model\n * constants are not exported and typeof references don't work in .d.ts files\n * when consumed by external packages.\n *\n * @see https://ai.google.dev/gemini-api/docs/vision\n * @see https://ai.google.dev/gemini-api/docs/audio\n * @see https://ai.google.dev/gemini-api/docs/document-processing\n */\nexport type GeminiModelInputModalitiesByName = {\n // Models with full multimodal support (text, image, audio, video, document)\n [GEMINI_3_7_FLASH.name]: typeof GEMINI_3_7_FLASH.supports.input\n [GEMINI_3_6_FLASH.name]: typeof GEMINI_3_6_FLASH.supports.input\n [GEMINI_3_5_FLASH.name]: typeof GEMINI_3_5_FLASH.supports.input\n [GEMINI_3_5_FLASH_LITE.name]: typeof GEMINI_3_5_FLASH_LITE.supports.input\n [GEMINI_3_1_PRO.name]: typeof GEMINI_3_1_PRO.supports.input\n [GEMINI_3_FLASH.name]: typeof GEMINI_3_FLASH.supports.input\n [GEMINI_3_1_FLASH_LITE.name]: typeof GEMINI_3_1_FLASH_LITE.supports.input\n [GEMINI_3_1_FLASH_LITE_PREVIEW.name]: typeof GEMINI_3_1_FLASH_LITE_PREVIEW.supports.input\n [GEMINI_2_5_PRO.name]: typeof GEMINI_2_5_PRO.supports.input\n [GEMINI_2_5_FLASH_LITE.name]: typeof GEMINI_2_5_FLASH_LITE.supports.input\n\n // Models with text, image, audio, video (no document)\n [GEMINI_2_5_FLASH.name]: typeof GEMINI_2_5_FLASH.supports.input\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/ai-gemini",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.23.0",
|
|
4
4
|
"description": "Google Gemini adapter for TanStack AI chat, images, speech, audio generation, and structured outputs.",
|
|
5
5
|
"author": "Tanner Linsley",
|
|
6
6
|
"license": "MIT",
|
|
@@ -56,16 +56,16 @@
|
|
|
56
56
|
"dependencies": {
|
|
57
57
|
"@google/genai": "^2.10.0",
|
|
58
58
|
"partial-json": "^0.1.7",
|
|
59
|
-
"@tanstack/ai-utils": "0.4.0"
|
|
59
|
+
"@tanstack/ai-utils": "^0.4.0"
|
|
60
60
|
},
|
|
61
61
|
"peerDependencies": {
|
|
62
|
-
"@tanstack/ai": "^0.
|
|
62
|
+
"@tanstack/ai": "^0.44.1"
|
|
63
63
|
},
|
|
64
64
|
"devDependencies": {
|
|
65
65
|
"@vitest/coverage-v8": "4.0.14",
|
|
66
66
|
"vite": "^8.1.4",
|
|
67
67
|
"zod": "^4.2.0",
|
|
68
|
-
"@tanstack/ai": "0.
|
|
68
|
+
"@tanstack/ai": "0.44.1"
|
|
69
69
|
},
|
|
70
70
|
"scripts": {
|
|
71
71
|
"build": "vite build",
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { BaseEmbeddingAdapter } from '@tanstack/ai/adapters'
|
|
2
|
+
import { toRunErrorPayload } from '@tanstack/ai/adapter-internals'
|
|
3
|
+
import { requireTextOnlyEmbeddingInput } from '@tanstack/ai'
|
|
4
|
+
import {
|
|
5
|
+
createGeminiClient,
|
|
6
|
+
generateId,
|
|
7
|
+
getGeminiApiKeyFromEnv,
|
|
8
|
+
} from '../utils'
|
|
9
|
+
import type { EmbeddingOptions, EmbeddingResult } from '@tanstack/ai'
|
|
10
|
+
import type { EmbedContentConfig, GoogleGenAI } from '@google/genai'
|
|
11
|
+
import type {
|
|
12
|
+
GeminiEmbeddingModel,
|
|
13
|
+
GeminiEmbeddingModelInputModalitiesByName,
|
|
14
|
+
GeminiEmbeddingModelProviderOptionsByName,
|
|
15
|
+
} from '../model-meta'
|
|
16
|
+
import type { GeminiEmbeddingProviderOptions } from '../embedding/embedding-provider-options'
|
|
17
|
+
import type { GeminiClientConfig } from '../utils/client'
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Configuration for Gemini Embedding adapter
|
|
21
|
+
*/
|
|
22
|
+
export interface GeminiEmbeddingConfig extends GeminiClientConfig {}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Gemini Embedding Adapter
|
|
26
|
+
*
|
|
27
|
+
* Tree-shakeable adapter for Gemini text embeddings.
|
|
28
|
+
* Supports gemini-embedding-001.
|
|
29
|
+
*
|
|
30
|
+
* Features:
|
|
31
|
+
* - Batch embedding (one request for the whole input array)
|
|
32
|
+
* - Matryoshka dimension reduction via the top-level `dimensions` option
|
|
33
|
+
* (mapped to the SDK's `outputDimensionality`)
|
|
34
|
+
* - Task-type hints (`taskType`, `title`) via provider options
|
|
35
|
+
*/
|
|
36
|
+
export class GeminiEmbeddingAdapter<
|
|
37
|
+
TModel extends GeminiEmbeddingModel,
|
|
38
|
+
> extends BaseEmbeddingAdapter<
|
|
39
|
+
TModel,
|
|
40
|
+
GeminiEmbeddingProviderOptions,
|
|
41
|
+
GeminiEmbeddingModelProviderOptionsByName,
|
|
42
|
+
GeminiEmbeddingModelInputModalitiesByName
|
|
43
|
+
> {
|
|
44
|
+
readonly name = 'gemini' as const
|
|
45
|
+
|
|
46
|
+
protected client: GoogleGenAI
|
|
47
|
+
|
|
48
|
+
constructor(config: GeminiEmbeddingConfig, model: TModel) {
|
|
49
|
+
super(model, {})
|
|
50
|
+
this.client = createGeminiClient(config)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async createEmbeddings(
|
|
54
|
+
options: EmbeddingOptions<GeminiEmbeddingProviderOptions>,
|
|
55
|
+
): Promise<EmbeddingResult> {
|
|
56
|
+
const { model, logger, modelOptions } = options
|
|
57
|
+
const texts = requireTextOnlyEmbeddingInput(options.input, this.name, model)
|
|
58
|
+
|
|
59
|
+
try {
|
|
60
|
+
// Build the config incrementally so possibly-undefined values are never
|
|
61
|
+
// assigned to optional fields (exactOptionalPropertyTypes).
|
|
62
|
+
const config: EmbedContentConfig = {}
|
|
63
|
+
if (options.dimensions !== undefined) {
|
|
64
|
+
config.outputDimensionality = options.dimensions
|
|
65
|
+
}
|
|
66
|
+
if (modelOptions?.taskType !== undefined) {
|
|
67
|
+
config.taskType = modelOptions.taskType
|
|
68
|
+
}
|
|
69
|
+
if (modelOptions?.title !== undefined) {
|
|
70
|
+
config.title = modelOptions.title
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
logger.request(
|
|
74
|
+
`activity=embed provider=${this.name} model=${model} inputs=${texts.length}`,
|
|
75
|
+
{ provider: this.name, model },
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
const response = await this.client.models.embedContent({
|
|
79
|
+
model,
|
|
80
|
+
contents: texts,
|
|
81
|
+
config,
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
const embeddings = response.embeddings
|
|
85
|
+
if (!embeddings || embeddings.length !== texts.length) {
|
|
86
|
+
throw new Error(
|
|
87
|
+
`Gemini embedContent returned ${embeddings ? embeddings.length : 'no'} embeddings for ${texts.length} inputs (model: ${model}).`,
|
|
88
|
+
)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// The Gemini embedding API does not report token usage, so `usage` is
|
|
92
|
+
// omitted from the result.
|
|
93
|
+
return {
|
|
94
|
+
id: generateId(this.name),
|
|
95
|
+
model,
|
|
96
|
+
embeddings: embeddings.map((embedding, index) => ({
|
|
97
|
+
vector: embedding.values ?? [],
|
|
98
|
+
index,
|
|
99
|
+
})),
|
|
100
|
+
}
|
|
101
|
+
} catch (error: unknown) {
|
|
102
|
+
logger.errors(`${this.name}.createEmbeddings fatal`, {
|
|
103
|
+
error: toRunErrorPayload(error, `${this.name}.createEmbeddings failed`),
|
|
104
|
+
source: `${this.name}.createEmbeddings`,
|
|
105
|
+
})
|
|
106
|
+
throw error
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Creates a Gemini embedding adapter with explicit API key.
|
|
113
|
+
* Type resolution happens here at the call site.
|
|
114
|
+
*
|
|
115
|
+
* @param model - The model name (e.g., 'gemini-embedding-001')
|
|
116
|
+
* @param apiKey - Your Google API key
|
|
117
|
+
* @param config - Optional additional configuration
|
|
118
|
+
* @returns Configured Gemini embedding adapter instance with resolved types
|
|
119
|
+
*
|
|
120
|
+
* @example
|
|
121
|
+
* ```typescript
|
|
122
|
+
* const adapter = createGeminiEmbedding('gemini-embedding-001', "your-api-key");
|
|
123
|
+
*
|
|
124
|
+
* const result = await embed({
|
|
125
|
+
* adapter,
|
|
126
|
+
* input: 'a red guitar'
|
|
127
|
+
* });
|
|
128
|
+
* ```
|
|
129
|
+
*/
|
|
130
|
+
export function createGeminiEmbedding<TModel extends GeminiEmbeddingModel>(
|
|
131
|
+
model: TModel,
|
|
132
|
+
apiKey: string,
|
|
133
|
+
config?: Omit<GeminiEmbeddingConfig, 'apiKey'>,
|
|
134
|
+
): GeminiEmbeddingAdapter<TModel> {
|
|
135
|
+
// Put apiKey LAST so caller-supplied config can't silently override the
|
|
136
|
+
// explicit argument.
|
|
137
|
+
return new GeminiEmbeddingAdapter({ ...config, apiKey }, model)
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Creates a Gemini embedding adapter with automatic API key detection from environment variables.
|
|
142
|
+
* Type resolution happens here at the call site.
|
|
143
|
+
*
|
|
144
|
+
* Looks for `GOOGLE_API_KEY` or `GEMINI_API_KEY` in:
|
|
145
|
+
* - `process.env` (Node.js)
|
|
146
|
+
* - `window.env` (Browser with injected env)
|
|
147
|
+
*
|
|
148
|
+
* @param model - The model name (e.g., 'gemini-embedding-001')
|
|
149
|
+
* @param config - Optional configuration (excluding apiKey which is auto-detected)
|
|
150
|
+
* @returns Configured Gemini embedding adapter instance with resolved types
|
|
151
|
+
* @throws Error if GOOGLE_API_KEY or GEMINI_API_KEY is not found in environment
|
|
152
|
+
*
|
|
153
|
+
* @example
|
|
154
|
+
* ```typescript
|
|
155
|
+
* // Automatically uses GOOGLE_API_KEY from environment
|
|
156
|
+
* const adapter = geminiEmbedding('gemini-embedding-001');
|
|
157
|
+
*
|
|
158
|
+
* const result = await embed({
|
|
159
|
+
* adapter,
|
|
160
|
+
* input: ['a red guitar', 'a blue drum kit'],
|
|
161
|
+
* dimensions: 1536
|
|
162
|
+
* });
|
|
163
|
+
*
|
|
164
|
+
* console.log(result.embeddings[0].vector)
|
|
165
|
+
* ```
|
|
166
|
+
*/
|
|
167
|
+
export function geminiEmbedding<TModel extends GeminiEmbeddingModel>(
|
|
168
|
+
model: TModel,
|
|
169
|
+
config?: Omit<GeminiEmbeddingConfig, 'apiKey'>,
|
|
170
|
+
): GeminiEmbeddingAdapter<TModel> {
|
|
171
|
+
const apiKey = getGeminiApiKeyFromEnv()
|
|
172
|
+
return createGeminiEmbedding(model, apiKey, config)
|
|
173
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider options for Gemini embedding models.
|
|
3
|
+
*
|
|
4
|
+
* `dimensions` is deliberately absent: it's a first-class top-level option on
|
|
5
|
+
* `embed()` and is mapped to the SDK's `outputDimensionality` by the adapter.
|
|
6
|
+
*/
|
|
7
|
+
export interface GeminiEmbeddingProviderOptions {
|
|
8
|
+
/**
|
|
9
|
+
* Type of task for which the embedding will be used. Helps the model
|
|
10
|
+
* produce embeddings optimized for the intended use case.
|
|
11
|
+
*
|
|
12
|
+
* @see https://ai.google.dev/gemini-api/docs/embeddings#task-types
|
|
13
|
+
*/
|
|
14
|
+
taskType?:
|
|
15
|
+
| 'SEMANTIC_SIMILARITY'
|
|
16
|
+
| 'CLASSIFICATION'
|
|
17
|
+
| 'CLUSTERING'
|
|
18
|
+
| 'RETRIEVAL_DOCUMENT'
|
|
19
|
+
| 'RETRIEVAL_QUERY'
|
|
20
|
+
| 'QUESTION_ANSWERING'
|
|
21
|
+
| 'FACT_VERIFICATION'
|
|
22
|
+
| 'CODE_RETRIEVAL_QUERY'
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Title for the text. Only applicable when `taskType` is
|
|
26
|
+
* `RETRIEVAL_DOCUMENT`.
|
|
27
|
+
*/
|
|
28
|
+
title?: string
|
|
29
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -36,6 +36,15 @@ export type {
|
|
|
36
36
|
ImagePromptLanguage,
|
|
37
37
|
} from './image/image-provider-options'
|
|
38
38
|
|
|
39
|
+
// Embedding adapter - for embedding vectors
|
|
40
|
+
export {
|
|
41
|
+
GeminiEmbeddingAdapter,
|
|
42
|
+
createGeminiEmbedding,
|
|
43
|
+
geminiEmbedding,
|
|
44
|
+
type GeminiEmbeddingConfig,
|
|
45
|
+
} from './adapters/embedding'
|
|
46
|
+
export type { GeminiEmbeddingProviderOptions } from './embedding/embedding-provider-options'
|
|
47
|
+
|
|
39
48
|
// TTS adapter (experimental)
|
|
40
49
|
/**
|
|
41
50
|
* @experimental Gemini TTS is an experimental feature and may change.
|
|
@@ -100,6 +109,7 @@ export { GEMINI_TTS_VOICES as GeminiTTSVoices } from './model-meta'
|
|
|
100
109
|
export { GEMINI_AUDIO_MODELS as GeminiAudioModels } from './model-meta'
|
|
101
110
|
export { GEMINI_VIDEO_MODELS as GeminiVideoModels } from './model-meta'
|
|
102
111
|
export { GEMINI_INTERACTIONS_VIDEO_MODELS as GeminiInteractionsVideoModels } from './model-meta'
|
|
112
|
+
export { GEMINI_EMBEDDING_MODELS } from './model-meta'
|
|
103
113
|
export type { GeminiModels as GeminiTextModel } from './model-meta'
|
|
104
114
|
export type { GeminiImageModels as GeminiImageModel } from './model-meta'
|
|
105
115
|
export type { GeminiTTSVoice } from './model-meta'
|
|
@@ -112,6 +122,9 @@ export type {
|
|
|
112
122
|
GeminiChatModelProviderOptionsByName,
|
|
113
123
|
GeminiChatModelToolCapabilitiesByName,
|
|
114
124
|
GeminiModelInputModalitiesByName,
|
|
125
|
+
GeminiEmbeddingModel,
|
|
126
|
+
GeminiEmbeddingModelProviderOptionsByName,
|
|
127
|
+
GeminiEmbeddingModelInputModalitiesByName,
|
|
115
128
|
} from './model-meta'
|
|
116
129
|
export type {
|
|
117
130
|
GeminiStructuredOutputOptions,
|
package/src/model-meta.ts
CHANGED
|
@@ -6,6 +6,7 @@ import type {
|
|
|
6
6
|
GeminiThinkingOptions,
|
|
7
7
|
GeminiToolConfigOptions,
|
|
8
8
|
} from './text/text-provider-options'
|
|
9
|
+
import type { GeminiEmbeddingProviderOptions } from './embedding/embedding-provider-options'
|
|
9
10
|
|
|
10
11
|
interface ModelMeta<TProviderOptions = unknown> {
|
|
11
12
|
name: string
|
|
@@ -743,6 +744,50 @@ const GEMINI_OMNI_FLASH_PREVIEW = {
|
|
|
743
744
|
GeminiCachedContentOptions
|
|
744
745
|
>
|
|
745
746
|
|
|
747
|
+
const GEMINI_3_7_FLASH = {
|
|
748
|
+
name: 'gemini-3.7-flash',
|
|
749
|
+
max_input_tokens: 1_048_576,
|
|
750
|
+
max_output_tokens: 65_536,
|
|
751
|
+
knowledge_cutoff: '2026-03-01',
|
|
752
|
+
supports: {
|
|
753
|
+
input: ['text', 'image', 'video', 'audio', 'document'],
|
|
754
|
+
output: ['text'],
|
|
755
|
+
capabilities: [
|
|
756
|
+
'batch_api',
|
|
757
|
+
'caching',
|
|
758
|
+
'function_calling',
|
|
759
|
+
'structured_output',
|
|
760
|
+
'thinking',
|
|
761
|
+
],
|
|
762
|
+
tools: [
|
|
763
|
+
'code_execution',
|
|
764
|
+
'file_search',
|
|
765
|
+
'google_search',
|
|
766
|
+
'google_maps',
|
|
767
|
+
'url_context',
|
|
768
|
+
'computer_use',
|
|
769
|
+
],
|
|
770
|
+
},
|
|
771
|
+
// Currently 50% off through the end of 2026.
|
|
772
|
+
// https://ai.google.dev/gemini-api/docs/pricing#gemini-3.7-flash
|
|
773
|
+
pricing: {
|
|
774
|
+
input: {
|
|
775
|
+
normal: 0.75,
|
|
776
|
+
cached: 0.075,
|
|
777
|
+
},
|
|
778
|
+
output: {
|
|
779
|
+
normal: 3.75,
|
|
780
|
+
},
|
|
781
|
+
},
|
|
782
|
+
} as const satisfies ModelMeta<
|
|
783
|
+
GeminiToolConfigOptions &
|
|
784
|
+
GeminiSafetyOptions &
|
|
785
|
+
GeminiCommonConfigOptions &
|
|
786
|
+
GeminiCachedContentOptions &
|
|
787
|
+
GeminiStructuredOutputOptions &
|
|
788
|
+
GeminiThinkingOptions
|
|
789
|
+
>
|
|
790
|
+
|
|
746
791
|
const GEMINI_3_6_FLASH = {
|
|
747
792
|
name: 'gemini-3.6-flash',
|
|
748
793
|
max_input_tokens: 1_048_576,
|
|
@@ -868,6 +913,7 @@ const GEMINI_3_5_FLASH_LITE = {
|
|
|
868
913
|
>
|
|
869
914
|
|
|
870
915
|
export const GEMINI_MODELS = [
|
|
916
|
+
GEMINI_3_7_FLASH.name,
|
|
871
917
|
GEMINI_3_6_FLASH.name,
|
|
872
918
|
GEMINI_3_5_FLASH.name,
|
|
873
919
|
GEMINI_3_5_FLASH_LITE.name,
|
|
@@ -888,6 +934,7 @@ export const GEMINI_MODELS = [
|
|
|
888
934
|
* brittle and keeps the engine's legacy finalization fallback.
|
|
889
935
|
*/
|
|
890
936
|
export const GEMINI_COMBINED_TOOLS_AND_SCHEMA_MODELS = new Set<string>([
|
|
937
|
+
GEMINI_3_7_FLASH.name,
|
|
891
938
|
GEMINI_3_6_FLASH.name,
|
|
892
939
|
GEMINI_3_5_FLASH.name,
|
|
893
940
|
GEMINI_3_5_FLASH_LITE.name,
|
|
@@ -991,9 +1038,37 @@ export const GEMINI_INTERACTIONS_VIDEO_MODELS = [
|
|
|
991
1038
|
GEMINI_OMNI_FLASH_PREVIEW.name,
|
|
992
1039
|
] as const
|
|
993
1040
|
|
|
1041
|
+
/**
|
|
1042
|
+
* Embedding models
|
|
1043
|
+
*/
|
|
1044
|
+
export const GEMINI_EMBEDDING_MODELS = ['gemini-embedding-001'] as const
|
|
1045
|
+
|
|
1046
|
+
export type GeminiEmbeddingModel = (typeof GEMINI_EMBEDDING_MODELS)[number]
|
|
1047
|
+
|
|
1048
|
+
/**
|
|
1049
|
+
* Type-only map from embedding model name to its provider options type.
|
|
1050
|
+
*/
|
|
1051
|
+
export type GeminiEmbeddingModelProviderOptionsByName = {
|
|
1052
|
+
'gemini-embedding-001': GeminiEmbeddingProviderOptions
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
/**
|
|
1056
|
+
* Per-model input modalities for embedding models. Gemini embedding models
|
|
1057
|
+
* are text-only, so image inputs fail at compile time.
|
|
1058
|
+
*/
|
|
1059
|
+
export type GeminiEmbeddingModelInputModalitiesByName = {
|
|
1060
|
+
'gemini-embedding-001': readonly ['text']
|
|
1061
|
+
}
|
|
1062
|
+
|
|
994
1063
|
// Manual type map for per-model provider options
|
|
995
1064
|
export type GeminiChatModelProviderOptionsByName = {
|
|
996
1065
|
// Models with thinking and structured output support
|
|
1066
|
+
[GEMINI_3_7_FLASH.name]: GeminiToolConfigOptions &
|
|
1067
|
+
GeminiSafetyOptions &
|
|
1068
|
+
GeminiCommonConfigOptions &
|
|
1069
|
+
GeminiCachedContentOptions &
|
|
1070
|
+
GeminiStructuredOutputOptions &
|
|
1071
|
+
GeminiThinkingOptions
|
|
997
1072
|
[GEMINI_3_6_FLASH.name]: GeminiToolConfigOptions &
|
|
998
1073
|
GeminiSafetyOptions &
|
|
999
1074
|
GeminiCommonConfigOptions &
|
|
@@ -1061,6 +1136,7 @@ export type GeminiChatModelProviderOptionsByName = {
|
|
|
1061
1136
|
* Based on the 'supports.tools' arrays defined for each model.
|
|
1062
1137
|
*/
|
|
1063
1138
|
export type GeminiChatModelToolCapabilitiesByName = {
|
|
1139
|
+
[GEMINI_3_7_FLASH.name]: typeof GEMINI_3_7_FLASH.supports.tools
|
|
1064
1140
|
[GEMINI_3_6_FLASH.name]: typeof GEMINI_3_6_FLASH.supports.tools
|
|
1065
1141
|
[GEMINI_3_5_FLASH.name]: typeof GEMINI_3_5_FLASH.supports.tools
|
|
1066
1142
|
[GEMINI_3_5_FLASH_LITE.name]: typeof GEMINI_3_5_FLASH_LITE.supports.tools
|
|
@@ -1088,6 +1164,7 @@ export type GeminiChatModelToolCapabilitiesByName = {
|
|
|
1088
1164
|
*/
|
|
1089
1165
|
export type GeminiModelInputModalitiesByName = {
|
|
1090
1166
|
// Models with full multimodal support (text, image, audio, video, document)
|
|
1167
|
+
[GEMINI_3_7_FLASH.name]: typeof GEMINI_3_7_FLASH.supports.input
|
|
1091
1168
|
[GEMINI_3_6_FLASH.name]: typeof GEMINI_3_6_FLASH.supports.input
|
|
1092
1169
|
[GEMINI_3_5_FLASH.name]: typeof GEMINI_3_5_FLASH.supports.input
|
|
1093
1170
|
[GEMINI_3_5_FLASH_LITE.name]: typeof GEMINI_3_5_FLASH_LITE.supports.input
|