@tanstack/ai-gemini 0.23.0 → 0.24.1
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/README.md +10 -1
- package/dist/esm/adapters/image.d.ts +14 -7
- package/dist/esm/adapters/image.js +27 -56
- package/dist/esm/adapters/image.js.map +1 -1
- package/dist/esm/adapters/text.js.map +1 -1
- package/dist/esm/adapters/video.js +2 -1
- package/dist/esm/adapters/video.js.map +1 -1
- package/dist/esm/experimental/text-interactions/adapter.d.ts +8 -5
- package/dist/esm/experimental/text-interactions/adapter.js +20 -18
- package/dist/esm/experimental/text-interactions/adapter.js.map +1 -1
- package/dist/esm/image/image-provider-options.d.ts +167 -20
- package/dist/esm/image/image-provider-options.js +52 -5
- package/dist/esm/image/image-provider-options.js.map +1 -1
- package/dist/esm/index.d.ts +3 -1
- package/dist/esm/index.js +3 -1
- package/dist/esm/model-meta.d.ts +15 -2
- package/dist/esm/model-meta.js +82 -1
- package/dist/esm/model-meta.js.map +1 -1
- package/dist/esm/realtime/adapter.js +1 -5
- package/dist/esm/realtime/adapter.js.map +1 -1
- package/dist/esm/realtime/client.js.map +1 -1
- package/dist/esm/realtime/token.js +3 -2
- package/dist/esm/realtime/token.js.map +1 -1
- package/dist/esm/realtime/utils.js +4 -1
- package/dist/esm/realtime/utils.js.map +1 -1
- package/dist/esm/tools/code-execution-tool.js +3 -3
- package/dist/esm/tools/code-execution-tool.js.map +1 -1
- package/dist/esm/tools/computer-use-tool.js +4 -4
- package/dist/esm/tools/computer-use-tool.js.map +1 -1
- package/dist/esm/tools/file-search-tool.js +4 -4
- package/dist/esm/tools/file-search-tool.js.map +1 -1
- package/dist/esm/tools/gemini-provider-tool.d.ts +16 -0
- package/dist/esm/tools/gemini-provider-tool.js +42 -0
- package/dist/esm/tools/gemini-provider-tool.js.map +1 -0
- package/dist/esm/tools/google-maps-tool.js +4 -4
- package/dist/esm/tools/google-maps-tool.js.map +1 -1
- package/dist/esm/tools/google-search-retriveal-tool.js +4 -4
- package/dist/esm/tools/google-search-retriveal-tool.js.map +1 -1
- package/dist/esm/tools/google-search-tool.js +4 -4
- package/dist/esm/tools/google-search-tool.js.map +1 -1
- package/dist/esm/tools/tool-converter.js +5 -3
- package/dist/esm/tools/tool-converter.js.map +1 -1
- package/dist/esm/tools/url-context-tool.js +3 -3
- package/dist/esm/tools/url-context-tool.js.map +1 -1
- package/dist/esm/usage.js +1 -3
- package/dist/esm/usage.js.map +1 -1
- package/package.json +5 -5
- package/src/adapters/image.ts +123 -36
- package/src/experimental/text-interactions/adapter.ts +31 -18
- package/src/image/image-provider-options.ts +226 -25
- package/src/index.ts +28 -0
- package/src/model-meta.ts +118 -1
- package/src/tools/code-execution-tool.ts +9 -6
- package/src/tools/computer-use-tool.ts +19 -13
- package/src/tools/file-search-tool.ts +13 -7
- package/src/tools/gemini-provider-tool.ts +60 -0
- package/src/tools/google-maps-tool.ts +13 -7
- package/src/tools/google-search-retriveal-tool.ts +15 -7
- package/src/tools/google-search-tool.ts +13 -7
- package/src/tools/tool-converter.ts +5 -4
- package/src/tools/url-context-tool.ts +9 -6
|
@@ -1,12 +1,24 @@
|
|
|
1
1
|
import type { GeminiImageModels } from '../model-meta'
|
|
2
2
|
import type {
|
|
3
|
+
ContentUnion,
|
|
4
|
+
ImageConfig,
|
|
3
5
|
ImagePromptLanguage,
|
|
4
6
|
PersonGeneration,
|
|
5
7
|
SafetyFilterLevel,
|
|
8
|
+
SafetySetting,
|
|
9
|
+
ThinkingConfig,
|
|
6
10
|
} from '@google/genai'
|
|
7
11
|
|
|
8
12
|
// Re-export SDK types so users can use them directly
|
|
9
|
-
export type {
|
|
13
|
+
export type {
|
|
14
|
+
ContentUnion,
|
|
15
|
+
ImageConfig,
|
|
16
|
+
ImagePromptLanguage,
|
|
17
|
+
PersonGeneration,
|
|
18
|
+
SafetyFilterLevel,
|
|
19
|
+
SafetySetting,
|
|
20
|
+
ThinkingConfig,
|
|
21
|
+
}
|
|
10
22
|
|
|
11
23
|
/**
|
|
12
24
|
* Gemini Imagen aspect ratio options
|
|
@@ -121,11 +133,80 @@ export interface GeminiImageProviderOptions {
|
|
|
121
133
|
}
|
|
122
134
|
|
|
123
135
|
/**
|
|
124
|
-
*
|
|
125
|
-
*
|
|
136
|
+
* Provider options for Gemini native image models (Nano Banana and friends).
|
|
137
|
+
*
|
|
138
|
+
* These models are served by `generateContent`, not `generateImages`, so they
|
|
139
|
+
* are configured by @google/genai's `GenerateContentConfig` — a different
|
|
140
|
+
* shape from the Imagen-only {@link GeminiImageProviderOptions} above. Only
|
|
141
|
+
* the `GenerateContentConfig` fields with clear image-generation semantics are
|
|
142
|
+
* surfaced; sampling knobs (`temperature`, `topK`, …) and chat-only plumbing
|
|
143
|
+
* (`tools`, `responseSchema`, …) are deliberately left out.
|
|
144
|
+
*
|
|
145
|
+
* `responseModalities` is intentionally absent: the adapter always requests
|
|
146
|
+
* `['TEXT', 'IMAGE']`, and letting a caller override it would silently disable
|
|
147
|
+
* image output on an image-generation call.
|
|
148
|
+
*/
|
|
149
|
+
export interface GeminiNativeImageProviderOptions {
|
|
150
|
+
/**
|
|
151
|
+
* Optional seed for reproducible image generation
|
|
152
|
+
* When the same seed is used with the same prompt and settings,
|
|
153
|
+
* you should get similar (though not identical) results
|
|
154
|
+
*/
|
|
155
|
+
seed?: number
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Per-category safety thresholds applied to the request
|
|
159
|
+
* Each entry pairs a HarmCategory with a HarmBlockThreshold
|
|
160
|
+
*/
|
|
161
|
+
safetySettings?: Array<SafetySetting>
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Controls the model's internal reasoning before it emits an image
|
|
165
|
+
* Use to raise or disable the thinking budget on models that support it
|
|
166
|
+
*/
|
|
167
|
+
thinkingConfig?: ThinkingConfig
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Native image output controls. Merged over the values derived from the
|
|
171
|
+
* portable `size` option, so fields set here win per field while the rest
|
|
172
|
+
* of `size` is preserved.
|
|
173
|
+
*
|
|
174
|
+
* Only `aspectRatio` and `imageSize` are accepted on the Gemini Developer
|
|
175
|
+
* API. Other SDK `ImageConfig` keys throw on this surface.
|
|
176
|
+
*/
|
|
177
|
+
imageConfig?: GeminiNativeImageConfig
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* System-level instructions that steer the model for the whole request,
|
|
181
|
+
* e.g. a house art direction applied on top of the per-call prompt
|
|
182
|
+
*/
|
|
183
|
+
systemInstruction?: ContentUnion
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Every provider-option field this adapter understands, across both API
|
|
188
|
+
* paths. Used as the adapter's base (model-agnostic) option type; the
|
|
189
|
+
* per-model map below is what narrows a given model to the half that
|
|
190
|
+
* actually applies to it.
|
|
191
|
+
*/
|
|
192
|
+
export type GeminiAnyImageProviderOptions = GeminiImageProviderOptions &
|
|
193
|
+
GeminiNativeImageProviderOptions
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Model-specific provider options mapping.
|
|
197
|
+
* Gemini native image models go through `generateContent` and take
|
|
198
|
+
* `GenerateContentConfig` fields; Imagen models go through `generateImages`
|
|
199
|
+
* and take `GenerateImagesConfig` fields. Mirrors the native/Imagen split in
|
|
200
|
+
* {@link GeminiImageModelSizeByName} and
|
|
201
|
+
* {@link GeminiImageModelInputModalitiesByName}.
|
|
126
202
|
*/
|
|
127
203
|
export type GeminiImageModelProviderOptionsByName = {
|
|
128
|
-
[K in
|
|
204
|
+
[K in GeminiNativeImageModels]: GeminiNativeImageProviderOptions
|
|
205
|
+
} & {
|
|
206
|
+
[K in Exclude<
|
|
207
|
+
GeminiImageModels,
|
|
208
|
+
GeminiNativeImageModels
|
|
209
|
+
>]: GeminiImageProviderOptions
|
|
129
210
|
}
|
|
130
211
|
|
|
131
212
|
/**
|
|
@@ -145,47 +226,157 @@ export type GeminiImageSize =
|
|
|
145
226
|
| '1080x1920'
|
|
146
227
|
|
|
147
228
|
/**
|
|
148
|
-
*
|
|
149
|
-
*
|
|
229
|
+
* The ten aspect ratios every Gemini native image model accepts.
|
|
230
|
+
*
|
|
231
|
+
* Note `9:21` is deliberately absent: it exists only on Vertex / Cloud and is
|
|
232
|
+
* rejected by the Gemini API (`generateContent`), which is the surface this
|
|
233
|
+
* adapter targets.
|
|
234
|
+
*
|
|
235
|
+
* @see https://ai.google.dev/gemini-api/docs/image-generation
|
|
150
236
|
*/
|
|
151
|
-
export type
|
|
237
|
+
export type GeminiStandardImageAspectRatio =
|
|
152
238
|
| '1:1'
|
|
153
239
|
| '2:3'
|
|
154
240
|
| '3:2'
|
|
155
241
|
| '3:4'
|
|
156
242
|
| '4:3'
|
|
243
|
+
| '4:5'
|
|
244
|
+
| '5:4'
|
|
157
245
|
| '9:16'
|
|
158
246
|
| '16:9'
|
|
159
247
|
| '21:9'
|
|
160
248
|
|
|
161
249
|
/**
|
|
162
|
-
*
|
|
163
|
-
*
|
|
250
|
+
* The ten standard ratios plus the four extreme banner/strip ratios that only
|
|
251
|
+
* the Gemini 3.1 Flash Image models accept — 14 values, matching the
|
|
252
|
+
* `generateContent` `ImageConfig.aspectRatio` field union.
|
|
253
|
+
*
|
|
254
|
+
* @see https://ai.google.dev/api/generate-content
|
|
255
|
+
*/
|
|
256
|
+
export type GeminiExtendedImageAspectRatio =
|
|
257
|
+
| GeminiStandardImageAspectRatio
|
|
258
|
+
| '1:4'
|
|
259
|
+
| '4:1'
|
|
260
|
+
| '1:8'
|
|
261
|
+
| '8:1'
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Sizes for `gemini-3.1-flash-image` (and its shut-down `-preview` alias):
|
|
265
|
+
* all 14 aspect ratios at 512 / 1K / 2K / 4K. `512` is the wire token for the
|
|
266
|
+
* 0.5K tier — not `512px`, and the `K` is case-sensitive (`1k` is rejected).
|
|
267
|
+
*/
|
|
268
|
+
export type Gemini31FlashImageSize =
|
|
269
|
+
`${GeminiExtendedImageAspectRatio}_${'512' | '1K' | '2K' | '4K'}`
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Sizes for `gemini-3.1-flash-lite-image`: all 14 aspect ratios, 1K only.
|
|
273
|
+
* 2K and 4K are unsupported on this model.
|
|
274
|
+
*
|
|
275
|
+
* The four banner ratios (`1:4`, `4:1`, `1:8`, `8:1`) come from the Cloud
|
|
276
|
+
* model page. The Gemini API page states a count of 14 but does not list them.
|
|
277
|
+
*
|
|
278
|
+
* @see https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/gemini/3-1-flash-lite-image
|
|
279
|
+
* @see https://ai.google.dev/gemini-api/docs/models/gemini-3.1-flash-lite-image
|
|
280
|
+
*/
|
|
281
|
+
export type Gemini31FlashLiteImageSize = `${GeminiExtendedImageAspectRatio}_1K`
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* Sizes for `gemini-3-pro-image` (and its shut-down `-preview` alias): the ten
|
|
285
|
+
* standard aspect ratios at 1K / 2K / 4K. Pro has no 512 tier and none of the
|
|
286
|
+
* extreme banner ratios on the Gemini API.
|
|
287
|
+
*/
|
|
288
|
+
export type Gemini3ProImageSize =
|
|
289
|
+
`${GeminiStandardImageAspectRatio}_${'1K' | '2K' | '4K'}`
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Sizes for `gemini-2.5-flash-image`: a bare aspect ratio with no resolution
|
|
293
|
+
* suffix, e.g. `'16:9'`. Google documents no `image_size` value or default for
|
|
294
|
+
* this model — it emits a single fixed 1024px-class output — so the adapter
|
|
295
|
+
* sends `imageConfig.aspectRatio` and omits `imageSize` entirely rather than
|
|
296
|
+
* guessing a tier the API never documented.
|
|
164
297
|
*/
|
|
165
|
-
export type
|
|
298
|
+
export type Gemini25FlashImageSize = GeminiStandardImageAspectRatio
|
|
166
299
|
|
|
167
300
|
/**
|
|
168
|
-
*
|
|
301
|
+
* `imageConfig` fields the Gemini Developer API accepts on `generateContent`.
|
|
302
|
+
* Other `@google/genai` `ImageConfig` keys (`personGeneration`,
|
|
303
|
+
* `outputMimeType`, and more) throw on this surface.
|
|
304
|
+
*/
|
|
305
|
+
export type GeminiNativeImageConfig = {
|
|
306
|
+
aspectRatio?: GeminiExtendedImageAspectRatio
|
|
307
|
+
imageSize?: '512' | '1K' | '2K' | '4K'
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* Any size accepted by any Gemini native image model. Prefer the per-model
|
|
312
|
+
* narrowing in {@link GeminiImageModelSizeByName} — this union is the widest
|
|
313
|
+
* possible set and accepts combinations no single model supports.
|
|
169
314
|
*/
|
|
170
315
|
export type GeminiNativeImageSize =
|
|
171
|
-
|
|
316
|
+
| Gemini31FlashImageSize
|
|
317
|
+
| Gemini31FlashLiteImageSize
|
|
318
|
+
| Gemini3ProImageSize
|
|
319
|
+
| Gemini25FlashImageSize
|
|
172
320
|
|
|
173
321
|
/**
|
|
174
322
|
* Gemini native image models that use the generateContent API path.
|
|
175
|
-
* These models
|
|
323
|
+
* These models take an aspect-ratio-based size rather than Imagen's
|
|
324
|
+
* WIDTHxHEIGHT pixel strings.
|
|
325
|
+
*
|
|
326
|
+
* This array is the single source of truth for the native/Imagen split: the
|
|
327
|
+
* `GeminiNativeImageModels` union and the per-model option/size/modality maps
|
|
328
|
+
* all derive from it. The `satisfies` clause makes a typo (or a name that
|
|
329
|
+
* is not a known image model) a build error rather than a phantom key on every
|
|
330
|
+
* per-model map.
|
|
331
|
+
*
|
|
332
|
+
* It is also the single source of truth for the adapter's runtime routing
|
|
333
|
+
* — see {@link isGeminiNativeImageModel}. Adding a new `gemini-*` image model
|
|
334
|
+
* means adding it here as well as to `GEMINI_IMAGE_MODELS` in model-meta.
|
|
335
|
+
* Until it is listed here it routes to the Imagen API instead and fails
|
|
336
|
+
* loudly on the first call, rather than silently taking the wrong option
|
|
337
|
+
* shape.
|
|
176
338
|
*/
|
|
339
|
+
export const GEMINI_NATIVE_IMAGE_MODELS = [
|
|
340
|
+
'gemini-3.1-flash-image',
|
|
341
|
+
'gemini-3.1-flash-image-preview',
|
|
342
|
+
'gemini-3.1-flash-lite-image',
|
|
343
|
+
'gemini-3-pro-image',
|
|
344
|
+
'gemini-3-pro-image-preview',
|
|
345
|
+
'gemini-2.5-flash-image',
|
|
346
|
+
] as const satisfies ReadonlyArray<GeminiImageModels>
|
|
347
|
+
|
|
177
348
|
export type GeminiNativeImageModels =
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
349
|
+
(typeof GEMINI_NATIVE_IMAGE_MODELS)[number]
|
|
350
|
+
|
|
351
|
+
const NATIVE_IMAGE_MODEL_NAMES: ReadonlySet<string> = new Set(
|
|
352
|
+
GEMINI_NATIVE_IMAGE_MODELS,
|
|
353
|
+
)
|
|
182
354
|
|
|
183
355
|
/**
|
|
184
|
-
*
|
|
185
|
-
* Gemini
|
|
356
|
+
* Runtime counterpart to {@link GeminiNativeImageModels} — decides which of
|
|
357
|
+
* the two Gemini image APIs a model goes to.
|
|
358
|
+
*
|
|
359
|
+
* Membership in {@link GEMINI_NATIVE_IMAGE_MODELS}, not a `gemini-` prefix
|
|
360
|
+
* test, so the runtime route and the type-level split cannot drift apart. An
|
|
361
|
+
* id this package does not know about reaches the Imagen endpoint and fails
|
|
362
|
+
* there, which is the intended signal to add the model here rather than to
|
|
363
|
+
* have it silently take the native path with Imagen-shaped option types.
|
|
364
|
+
*/
|
|
365
|
+
export function isGeminiNativeImageModel(model: string): boolean {
|
|
366
|
+
return NATIVE_IMAGE_MODEL_NAMES.has(model)
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
/**
|
|
370
|
+
* Model-specific size options mapping. Each native model gets its own ratio ×
|
|
371
|
+
* resolution set (they genuinely differ); Imagen models use pixel sizes.
|
|
186
372
|
*/
|
|
187
373
|
export type GeminiImageModelSizeByName = {
|
|
188
|
-
|
|
374
|
+
'gemini-3.1-flash-image': Gemini31FlashImageSize
|
|
375
|
+
'gemini-3.1-flash-image-preview': Gemini31FlashImageSize
|
|
376
|
+
'gemini-3.1-flash-lite-image': Gemini31FlashLiteImageSize
|
|
377
|
+
'gemini-3-pro-image': Gemini3ProImageSize
|
|
378
|
+
'gemini-3-pro-image-preview': Gemini3ProImageSize
|
|
379
|
+
'gemini-2.5-flash-image': Gemini25FlashImageSize
|
|
189
380
|
} & {
|
|
190
381
|
[K in Exclude<GeminiImageModels, GeminiNativeImageModels>]: GeminiImageSize
|
|
191
382
|
}
|
|
@@ -309,13 +500,23 @@ export function validatePrompt(options: {
|
|
|
309
500
|
|
|
310
501
|
/**
|
|
311
502
|
* Parses a Gemini native image size string into its components.
|
|
312
|
-
*
|
|
503
|
+
*
|
|
504
|
+
* Format: `"aspectRatio_resolution"`, e.g. `"16:9_4K"` →
|
|
505
|
+
* `{ aspectRatio: "16:9", resolution: "4K" }`.
|
|
506
|
+
*
|
|
507
|
+
* The resolution suffix is optional: `gemini-2.5-flash-image` takes a bare
|
|
508
|
+
* aspect ratio (`"16:9"` → `{ aspectRatio: "16:9" }`) because Google documents
|
|
509
|
+
* no `image_size` for it, and the caller must then omit `imageSize` from the
|
|
510
|
+
* request rather than substituting a default.
|
|
313
511
|
*/
|
|
314
512
|
export function parseNativeImageSize(
|
|
315
513
|
size: string,
|
|
316
|
-
): { aspectRatio: string; resolution
|
|
317
|
-
const match = size.match(/^(\d+:\d+)_(.+)
|
|
514
|
+
): { aspectRatio: string; resolution?: string } | undefined {
|
|
515
|
+
const match = size.match(/^(\d+:\d+)(?:_(.+))?$/)
|
|
318
516
|
const [, aspectRatio, resolution] = match ?? []
|
|
319
|
-
if (aspectRatio === undefined
|
|
320
|
-
return {
|
|
517
|
+
if (aspectRatio === undefined) return undefined
|
|
518
|
+
return {
|
|
519
|
+
aspectRatio,
|
|
520
|
+
...(resolution !== undefined && { resolution }),
|
|
521
|
+
}
|
|
321
522
|
}
|
package/src/index.ts
CHANGED
|
@@ -28,13 +28,37 @@ export {
|
|
|
28
28
|
} from './adapters/image'
|
|
29
29
|
export type {
|
|
30
30
|
GeminiImageProviderOptions,
|
|
31
|
+
GeminiNativeImageConfig,
|
|
32
|
+
GeminiNativeImageProviderOptions,
|
|
33
|
+
GeminiAnyImageProviderOptions,
|
|
31
34
|
GeminiImageModelProviderOptionsByName,
|
|
32
35
|
GeminiAspectRatio,
|
|
36
|
+
// Per-model size narrowing. `GeminiImageModelSizeByName` is the map
|
|
37
|
+
// `generateImage()` applies at the call site; the per-model aliases let you
|
|
38
|
+
// name a single model's set directly. `GeminiNativeImageSize` is the widest
|
|
39
|
+
// union across all native models — prefer the narrower types above it.
|
|
40
|
+
GeminiImageModelSizeByName,
|
|
41
|
+
GeminiStandardImageAspectRatio,
|
|
42
|
+
GeminiExtendedImageAspectRatio,
|
|
43
|
+
Gemini31FlashImageSize,
|
|
44
|
+
Gemini31FlashLiteImageSize,
|
|
45
|
+
Gemini3ProImageSize,
|
|
46
|
+
Gemini25FlashImageSize,
|
|
47
|
+
GeminiNativeImageSize,
|
|
33
48
|
// Re-export SDK types for convenience
|
|
34
49
|
PersonGeneration,
|
|
35
50
|
SafetyFilterLevel,
|
|
36
51
|
ImagePromptLanguage,
|
|
52
|
+
SafetySetting,
|
|
53
|
+
ThinkingConfig,
|
|
54
|
+
ImageConfig,
|
|
55
|
+
ContentUnion,
|
|
37
56
|
} from './image/image-provider-options'
|
|
57
|
+
// `SafetySetting` is built from two SDK enums, and enums are values — they
|
|
58
|
+
// cannot travel through `export type`. Re-exported here so `safetySettings`
|
|
59
|
+
// is usable with only `@tanstack/ai-gemini` installed, without the consumer
|
|
60
|
+
// having to add `@google/genai` to their own dependencies.
|
|
61
|
+
export { HarmBlockThreshold, HarmCategory } from '@google/genai'
|
|
38
62
|
|
|
39
63
|
// Embedding adapter - for embedding vectors
|
|
40
64
|
export {
|
|
@@ -104,6 +128,10 @@ export {
|
|
|
104
128
|
} from './model-meta'
|
|
105
129
|
export { GEMINI_MODELS as GeminiTextModels } from './model-meta'
|
|
106
130
|
export { GEMINI_IMAGE_MODELS as GeminiImageModels } from './model-meta'
|
|
131
|
+
export {
|
|
132
|
+
GEMINI_NATIVE_IMAGE_MODELS,
|
|
133
|
+
isGeminiNativeImageModel,
|
|
134
|
+
} from './image/image-provider-options'
|
|
107
135
|
export { GEMINI_TTS_MODELS as GeminiTTSModels } from './model-meta'
|
|
108
136
|
export { GEMINI_TTS_VOICES as GeminiTTSVoices } from './model-meta'
|
|
109
137
|
export { GEMINI_AUDIO_MODELS as GeminiAudioModels } from './model-meta'
|
package/src/model-meta.ts
CHANGED
|
@@ -118,7 +118,46 @@ const GEMINI_3_FLASH = {
|
|
|
118
118
|
GeminiThinkingOptions
|
|
119
119
|
>
|
|
120
120
|
|
|
121
|
+
/**
|
|
122
|
+
* Gemini 3 Pro Image ("Nano Banana Pro") — GA. Accepts the ten standard
|
|
123
|
+
* aspect ratios at 1K / 2K / 4K.
|
|
124
|
+
* @see https://ai.google.dev/gemini-api/docs/models/gemini-3-pro-image
|
|
125
|
+
*/
|
|
121
126
|
const GEMINI_3_PRO_IMAGE = {
|
|
127
|
+
name: 'gemini-3-pro-image',
|
|
128
|
+
max_input_tokens: 65_536,
|
|
129
|
+
max_output_tokens: 32_768,
|
|
130
|
+
knowledge_cutoff: '2025-01-01',
|
|
131
|
+
supports: {
|
|
132
|
+
input: ['text', 'image'],
|
|
133
|
+
output: ['text', 'image'],
|
|
134
|
+
capabilities: ['batch_api', 'structured_output', 'thinking'],
|
|
135
|
+
tools: ['google_search'],
|
|
136
|
+
},
|
|
137
|
+
pricing: {
|
|
138
|
+
input: {
|
|
139
|
+
normal: 2,
|
|
140
|
+
},
|
|
141
|
+
output: {
|
|
142
|
+
normal: 0.134,
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
} as const satisfies ModelMeta<
|
|
146
|
+
GeminiToolConfigOptions &
|
|
147
|
+
GeminiSafetyOptions &
|
|
148
|
+
GeminiCommonConfigOptions &
|
|
149
|
+
GeminiCachedContentOptions &
|
|
150
|
+
GeminiStructuredOutputOptions &
|
|
151
|
+
GeminiThinkingOptions
|
|
152
|
+
>
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* @deprecated `gemini-3-pro-image-preview` was shut down on 2026-06-25. Use
|
|
156
|
+
* the GA id `gemini-3-pro-image` instead — the preview id now 404s.
|
|
157
|
+
* Kept in the model union so existing code still compiles.
|
|
158
|
+
* @see https://ai.google.dev/gemini-api/docs/deprecations
|
|
159
|
+
*/
|
|
160
|
+
const GEMINI_3_PRO_IMAGE_PREVIEW = {
|
|
122
161
|
name: 'gemini-3-pro-image-preview',
|
|
123
162
|
max_input_tokens: 65_536,
|
|
124
163
|
max_output_tokens: 32_768,
|
|
@@ -146,7 +185,46 @@ const GEMINI_3_PRO_IMAGE = {
|
|
|
146
185
|
GeminiThinkingOptions
|
|
147
186
|
>
|
|
148
187
|
|
|
188
|
+
/**
|
|
189
|
+
* Gemini 3.1 Flash Image ("Nano Banana 2") — GA. The only native image model
|
|
190
|
+
* that accepts the four extreme banner ratios (1:4, 4:1, 1:8, 8:1) and the
|
|
191
|
+
* 512 (0.5K) resolution tier.
|
|
192
|
+
* @see https://ai.google.dev/gemini-api/docs/models/gemini-3.1-flash-image
|
|
193
|
+
*/
|
|
149
194
|
const GEMINI_3_1_FLASH_IMAGE = {
|
|
195
|
+
name: 'gemini-3.1-flash-image',
|
|
196
|
+
max_input_tokens: 131_072,
|
|
197
|
+
max_output_tokens: 32_768,
|
|
198
|
+
knowledge_cutoff: '2025-01-01',
|
|
199
|
+
supports: {
|
|
200
|
+
input: ['text', 'image'],
|
|
201
|
+
output: ['text', 'image'],
|
|
202
|
+
capabilities: ['batch_api', 'thinking'],
|
|
203
|
+
tools: ['google_search'],
|
|
204
|
+
},
|
|
205
|
+
pricing: {
|
|
206
|
+
input: {
|
|
207
|
+
normal: 0.5,
|
|
208
|
+
},
|
|
209
|
+
output: {
|
|
210
|
+
normal: 3,
|
|
211
|
+
},
|
|
212
|
+
},
|
|
213
|
+
} as const satisfies ModelMeta<
|
|
214
|
+
GeminiToolConfigOptions &
|
|
215
|
+
GeminiSafetyOptions &
|
|
216
|
+
GeminiCommonConfigOptions &
|
|
217
|
+
GeminiCachedContentOptions &
|
|
218
|
+
GeminiThinkingOptions
|
|
219
|
+
>
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* @deprecated `gemini-3.1-flash-image-preview` was shut down on 2026-06-25.
|
|
223
|
+
* Use the GA id `gemini-3.1-flash-image` instead — the preview id now 404s.
|
|
224
|
+
* Kept in the model union so existing code still compiles.
|
|
225
|
+
* @see https://ai.google.dev/gemini-api/docs/deprecations
|
|
226
|
+
*/
|
|
227
|
+
const GEMINI_3_1_FLASH_IMAGE_PREVIEW = {
|
|
150
228
|
name: 'gemini-3.1-flash-image-preview',
|
|
151
229
|
max_input_tokens: 65_536,
|
|
152
230
|
max_output_tokens: 65_536,
|
|
@@ -174,6 +252,10 @@ const GEMINI_3_1_FLASH_IMAGE = {
|
|
|
174
252
|
GeminiThinkingOptions
|
|
175
253
|
>
|
|
176
254
|
|
|
255
|
+
/**
|
|
256
|
+
* Gemini 3.1 Flash Lite Image ("Nano Banana 2 Lite") — GA. 1K output only.
|
|
257
|
+
* @see https://ai.google.dev/gemini-api/docs/models/gemini-3.1-flash-lite-image
|
|
258
|
+
*/
|
|
177
259
|
const GEMINI_3_1_FLASH_LITE_IMAGE = {
|
|
178
260
|
name: 'gemini-3.1-flash-lite-image',
|
|
179
261
|
max_input_tokens: 65_536,
|
|
@@ -375,6 +457,17 @@ const GEMINI_2_5_FLASH = {
|
|
|
375
457
|
GeminiThinkingOptions
|
|
376
458
|
>
|
|
377
459
|
|
|
460
|
+
/**
|
|
461
|
+
* Gemini 2.5 Flash Image ("Nano Banana") — still GA, but documented as the
|
|
462
|
+
* legacy member of the family. Google publishes no `image_size` value for it,
|
|
463
|
+
* so its size type is a bare aspect ratio and the adapter sends no
|
|
464
|
+
* `imageConfig.imageSize`.
|
|
465
|
+
* @deprecated `gemini-2.5-flash-image` shuts down on 2026-10-02. Migrate to
|
|
466
|
+
* `gemini-3.1-flash-lite-image` (cheapest successor) or
|
|
467
|
+
* `gemini-3.1-flash-image`. Google's deprecations table still names the
|
|
468
|
+
* already-dead `gemini-3.1-flash-image-preview` as the replacement.
|
|
469
|
+
* @see https://ai.google.dev/gemini-api/docs/deprecations
|
|
470
|
+
*/
|
|
378
471
|
const GEMINI_2_5_FLASH_IMAGE = {
|
|
379
472
|
name: 'gemini-2.5-flash-image',
|
|
380
473
|
max_input_tokens: 1_048_576,
|
|
@@ -946,8 +1039,29 @@ export const GEMINI_COMBINED_TOOLS_AND_SCHEMA_MODELS = new Set<string>([
|
|
|
946
1039
|
|
|
947
1040
|
export type GeminiModels = (typeof GEMINI_MODELS)[number]
|
|
948
1041
|
|
|
949
|
-
|
|
1042
|
+
/**
|
|
1043
|
+
* @deprecated Shut down 2026-06-25. Use `gemini-3.1-flash-image`.
|
|
1044
|
+
*/
|
|
1045
|
+
type Gemini31FlashImagePreviewModel = 'gemini-3.1-flash-image-preview'
|
|
1046
|
+
|
|
1047
|
+
/**
|
|
1048
|
+
* @deprecated Shut down 2026-06-25. Use `gemini-3-pro-image`.
|
|
1049
|
+
*/
|
|
1050
|
+
type Gemini3ProImagePreviewModel = 'gemini-3-pro-image-preview'
|
|
950
1051
|
|
|
1052
|
+
export type GeminiImageModels =
|
|
1053
|
+
| Exclude<
|
|
1054
|
+
(typeof GEMINI_IMAGE_MODELS)[number],
|
|
1055
|
+
Gemini31FlashImagePreviewModel | Gemini3ProImagePreviewModel
|
|
1056
|
+
>
|
|
1057
|
+
| Gemini31FlashImagePreviewModel
|
|
1058
|
+
| Gemini3ProImagePreviewModel
|
|
1059
|
+
|
|
1060
|
+
/**
|
|
1061
|
+
* Image generation models. GA ids come first; the trailing `-preview` ids are
|
|
1062
|
+
* shut-down aliases kept only so existing code keeps compiling — new code
|
|
1063
|
+
* should use the GA id above its alias.
|
|
1064
|
+
*/
|
|
951
1065
|
export const GEMINI_IMAGE_MODELS = [
|
|
952
1066
|
GEMINI_3_1_FLASH_IMAGE.name,
|
|
953
1067
|
GEMINI_3_1_FLASH_LITE_IMAGE.name,
|
|
@@ -956,6 +1070,9 @@ export const GEMINI_IMAGE_MODELS = [
|
|
|
956
1070
|
IMAGEN_4_GENERATE.name,
|
|
957
1071
|
IMAGEN_4_GENERATE_FAST.name,
|
|
958
1072
|
IMAGEN_4_GENERATE_ULTRA.name,
|
|
1073
|
+
// Deprecated aliases — shut down 2026-06-25.
|
|
1074
|
+
GEMINI_3_1_FLASH_IMAGE_PREVIEW.name,
|
|
1075
|
+
GEMINI_3_PRO_IMAGE_PREVIEW.name,
|
|
959
1076
|
] as const
|
|
960
1077
|
|
|
961
1078
|
/**
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { brandGeminiProviderTool } from './gemini-provider-tool'
|
|
2
2
|
import type { ProviderTool, Tool } from '@tanstack/ai'
|
|
3
3
|
|
|
4
4
|
export interface CodeExecutionToolConfig {}
|
|
@@ -15,9 +15,12 @@ export function convertCodeExecutionToolToAdapterFormat(_tool: Tool) {
|
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
export function codeExecutionTool(): GeminiCodeExecutionTool {
|
|
18
|
-
return
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
18
|
+
return brandGeminiProviderTool<GeminiCodeExecutionTool>(
|
|
19
|
+
{
|
|
20
|
+
name: 'code_execution',
|
|
21
|
+
description: '',
|
|
22
|
+
metadata: {},
|
|
23
|
+
},
|
|
24
|
+
'code_execution',
|
|
25
|
+
)
|
|
23
26
|
}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
brandGeminiProviderTool,
|
|
3
|
+
getGeminiProviderToolMetadata,
|
|
4
|
+
} from './gemini-provider-tool'
|
|
2
5
|
import type { ComputerUse } from '@google/genai'
|
|
3
6
|
import type { ProviderTool, Tool } from '@tanstack/ai'
|
|
4
7
|
|
|
@@ -10,7 +13,7 @@ export type ComputerUseTool = ComputerUseToolConfig
|
|
|
10
13
|
export type GeminiComputerUseTool = ProviderTool<'gemini', 'computer_use'>
|
|
11
14
|
|
|
12
15
|
export function convertComputerUseToolToAdapterFormat(tool: Tool) {
|
|
13
|
-
const metadata = tool
|
|
16
|
+
const metadata = getGeminiProviderToolMetadata(tool) as ComputerUseToolConfig
|
|
14
17
|
// Vendor `ComputerUse` fields are `field?: T` (no `| undefined`) under EOPT,
|
|
15
18
|
// so spread each field conditionally rather than emitting explicit
|
|
16
19
|
// `undefined`s on the wire payload.
|
|
@@ -29,16 +32,19 @@ export function convertComputerUseToolToAdapterFormat(tool: Tool) {
|
|
|
29
32
|
export function computerUseTool(
|
|
30
33
|
config: ComputerUseToolConfig,
|
|
31
34
|
): GeminiComputerUseTool {
|
|
32
|
-
return
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
35
|
+
return brandGeminiProviderTool<GeminiComputerUseTool>(
|
|
36
|
+
{
|
|
37
|
+
name: 'computer_use',
|
|
38
|
+
description: '',
|
|
39
|
+
metadata: {
|
|
40
|
+
...(config.environment !== undefined && {
|
|
41
|
+
environment: config.environment,
|
|
42
|
+
}),
|
|
43
|
+
...(config.excludedPredefinedFunctions !== undefined && {
|
|
44
|
+
excludedPredefinedFunctions: config.excludedPredefinedFunctions,
|
|
45
|
+
}),
|
|
46
|
+
},
|
|
42
47
|
},
|
|
43
|
-
|
|
48
|
+
'computer_use',
|
|
49
|
+
)
|
|
44
50
|
}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
brandGeminiProviderTool,
|
|
3
|
+
getGeminiProviderToolMetadata,
|
|
4
|
+
} from './gemini-provider-tool'
|
|
2
5
|
import type { FileSearch } from '@google/genai'
|
|
3
6
|
import type { ProviderTool, Tool } from '@tanstack/ai'
|
|
4
7
|
|
|
@@ -10,7 +13,7 @@ export type FileSearchTool = FileSearchToolConfig
|
|
|
10
13
|
export type GeminiFileSearchTool = ProviderTool<'gemini', 'file_search'>
|
|
11
14
|
|
|
12
15
|
export function convertFileSearchToolToAdapterFormat(tool: Tool) {
|
|
13
|
-
const metadata = tool
|
|
16
|
+
const metadata = getGeminiProviderToolMetadata(tool) as FileSearchToolConfig
|
|
14
17
|
return {
|
|
15
18
|
fileSearch: metadata,
|
|
16
19
|
}
|
|
@@ -19,9 +22,12 @@ export function convertFileSearchToolToAdapterFormat(tool: Tool) {
|
|
|
19
22
|
export function fileSearchTool(
|
|
20
23
|
config: FileSearchToolConfig,
|
|
21
24
|
): GeminiFileSearchTool {
|
|
22
|
-
return
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
return brandGeminiProviderTool<GeminiFileSearchTool>(
|
|
26
|
+
{
|
|
27
|
+
name: 'file_search',
|
|
28
|
+
description: '',
|
|
29
|
+
metadata: config,
|
|
30
|
+
},
|
|
31
|
+
'file_search',
|
|
32
|
+
)
|
|
27
33
|
}
|