Skip to content

Commit cda4846

Browse files
authored
Merge branch 'main' into 173-gpt-5-chat-model-names-are-incorrect
2 parents abf1f04 + c8244ee commit cda4846

3 files changed

Lines changed: 135 additions & 0 deletions

File tree

.changeset/gemini-3-models.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@tanstack/ai-gemini': minor
3+
---
4+
5+
Add Gemini 3 Flash and Pro Image models for text and image generation

packages/typescript/ai-gemini/src/model-meta.ts

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,76 @@ const GEMINI_3_PRO = {
8383
GeminiThinkingOptions
8484
>
8585

86+
const GEMINI_3_FLASH = {
87+
name: 'gemini-3-flash-preview',
88+
max_input_tokens: 1_048_576,
89+
max_output_tokens: 65_536,
90+
knowledge_cutoff: '2025-01-01',
91+
supports: {
92+
input: ['text', 'image', 'audio', 'video', 'document'],
93+
output: ['text'],
94+
capabilities: [
95+
'batch_api',
96+
'caching',
97+
'code_execution',
98+
'file_search',
99+
'function_calling',
100+
'search_grounding',
101+
'structured_output',
102+
'thinking',
103+
'url_context',
104+
],
105+
},
106+
pricing: {
107+
input: {
108+
normal: 0.5,
109+
},
110+
output: {
111+
normal: 3,
112+
},
113+
},
114+
} as const satisfies ModelMeta<
115+
GeminiToolConfigOptions &
116+
GeminiSafetyOptions &
117+
GeminiGenerationConfigOptions &
118+
GeminiCachedContentOptions &
119+
GeminiStructuredOutputOptions &
120+
GeminiThinkingOptions
121+
>
122+
123+
const GEMINI_3_PRO_IMAGE = {
124+
name: 'gemini-3-pro-image-preview',
125+
max_input_tokens: 65_536,
126+
max_output_tokens: 32_768,
127+
knowledge_cutoff: '2025-01-01',
128+
supports: {
129+
input: ['text', 'image'],
130+
output: ['text', 'image'],
131+
capabilities: [
132+
'batch_api',
133+
'image_generation',
134+
'search_grounding',
135+
'structured_output',
136+
'thinking',
137+
],
138+
},
139+
pricing: {
140+
input: {
141+
normal: 2,
142+
},
143+
output: {
144+
normal: 0.134,
145+
},
146+
},
147+
} as const satisfies ModelMeta<
148+
GeminiToolConfigOptions &
149+
GeminiSafetyOptions &
150+
GeminiGenerationConfigOptions &
151+
GeminiCachedContentOptions &
152+
GeminiStructuredOutputOptions &
153+
GeminiThinkingOptions
154+
>
155+
86156
const GEMINI_2_5_PRO = {
87157
name: 'gemini-2.5-pro',
88158
max_input_tokens: 1_048_576,
@@ -747,6 +817,7 @@ const VEO_2 = {
747817

748818
export const GEMINI_MODELS = [
749819
GEMINI_3_PRO.name,
820+
GEMINI_3_FLASH.name,
750821
GEMINI_2_5_PRO.name,
751822
GEMINI_2_5_FLASH.name,
752823
GEMINI_2_5_FLASH_PREVIEW.name,
@@ -761,6 +832,7 @@ export type GeminiModels = (typeof GEMINI_MODELS)[number]
761832
export type GeminiImageModels = (typeof GEMINI_IMAGE_MODELS)[number]
762833

763834
export const GEMINI_IMAGE_MODELS = [
835+
GEMINI_3_PRO_IMAGE.name,
764836
GEMINI_2_5_FLASH_IMAGE.name,
765837
GEMINI_2_FLASH_IMAGE.name,
766838
IMAGEN_3.name,
@@ -841,6 +913,12 @@ export type GeminiChatModelProviderOptionsByName = {
841913
GeminiCachedContentOptions &
842914
GeminiStructuredOutputOptions &
843915
GeminiThinkingOptions
916+
[GEMINI_3_FLASH.name]: GeminiToolConfigOptions &
917+
GeminiSafetyOptions &
918+
GeminiGenerationConfigOptions &
919+
GeminiCachedContentOptions &
920+
GeminiStructuredOutputOptions &
921+
GeminiThinkingOptions
844922
[GEMINI_2_5_PRO.name]: GeminiToolConfigOptions &
845923
GeminiSafetyOptions &
846924
GeminiGenerationConfigOptions &
@@ -900,6 +978,7 @@ export type GeminiChatModelProviderOptionsByName = {
900978
export type GeminiModelInputModalitiesByName = {
901979
// Models with full multimodal support (text, image, audio, video, document)
902980
[GEMINI_3_PRO.name]: typeof GEMINI_3_PRO.supports.input
981+
[GEMINI_3_FLASH.name]: typeof GEMINI_3_FLASH.supports.input
903982
[GEMINI_2_5_PRO.name]: typeof GEMINI_2_5_PRO.supports.input
904983
[GEMINI_2_5_FLASH_LITE.name]: typeof GEMINI_2_5_FLASH_LITE.supports.input
905984
[GEMINI_2_5_FLASH_LITE_PREVIEW.name]: typeof GEMINI_2_5_FLASH_LITE_PREVIEW.supports.input

packages/typescript/ai-gemini/tests/model-meta.test.ts

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,28 @@ describe('Gemini Model Provider Options Type Assertions', () => {
6060
expectTypeOf<Options>().toHaveProperty('responseSchema')
6161
})
6262

63+
it('gemini-3-flash-preview should support thinking options', () => {
64+
type Model = 'gemini-3-flash-preview'
65+
type Options = GeminiChatModelProviderOptionsByName[Model]
66+
67+
// Should have thinking options
68+
expectTypeOf<Options>().toExtend<GeminiThinkingOptions>()
69+
70+
// Should have structured output options
71+
expectTypeOf<Options>().toExtend<GeminiStructuredOutputOptions>()
72+
73+
// Should have base options
74+
expectTypeOf<Options>().toExtend<BaseOptions>()
75+
76+
// Verify specific properties exist
77+
expectTypeOf<Options>().toHaveProperty('generationConfig')
78+
expectTypeOf<Options>().toHaveProperty('safetySettings')
79+
expectTypeOf<Options>().toHaveProperty('toolConfig')
80+
expectTypeOf<Options>().toHaveProperty('cachedContent')
81+
expectTypeOf<Options>().toHaveProperty('responseMimeType')
82+
expectTypeOf<Options>().toHaveProperty('responseSchema')
83+
})
84+
6385
it('gemini-2.5-pro should support thinking options', () => {
6486
type Model = 'gemini-2.5-pro'
6587
type Options = GeminiChatModelProviderOptionsByName[Model]
@@ -172,6 +194,7 @@ describe('Gemini Model Provider Options Type Assertions', () => {
172194
type Keys = keyof GeminiChatModelProviderOptionsByName
173195

174196
expectTypeOf<'gemini-3-pro-preview'>().toExtend<Keys>()
197+
expectTypeOf<'gemini-3-flash-preview'>().toExtend<Keys>()
175198
expectTypeOf<'gemini-2.5-pro'>().toExtend<Keys>()
176199
expectTypeOf<'gemini-2.5-flash'>().toExtend<Keys>()
177200
expectTypeOf<'gemini-2.5-flash-preview-09-2025'>().toExtend<Keys>()
@@ -203,6 +226,9 @@ describe('Gemini Model Provider Options Type Assertions', () => {
203226
expectTypeOf<
204227
GeminiChatModelProviderOptionsByName['gemini-3-pro-preview']
205228
>().toHaveProperty('safetySettings')
229+
expectTypeOf<
230+
GeminiChatModelProviderOptionsByName['gemini-3-flash-preview']
231+
>().toHaveProperty('safetySettings')
206232
expectTypeOf<
207233
GeminiChatModelProviderOptionsByName['gemini-2.5-pro']
208234
>().toHaveProperty('safetySettings')
@@ -230,6 +256,9 @@ describe('Gemini Model Provider Options Type Assertions', () => {
230256
expectTypeOf<
231257
GeminiChatModelProviderOptionsByName['gemini-3-pro-preview']
232258
>().toHaveProperty('toolConfig')
259+
expectTypeOf<
260+
GeminiChatModelProviderOptionsByName['gemini-3-flash-preview']
261+
>().toHaveProperty('toolConfig')
233262
expectTypeOf<
234263
GeminiChatModelProviderOptionsByName['gemini-2.5-pro']
235264
>().toHaveProperty('toolConfig')
@@ -257,6 +286,9 @@ describe('Gemini Model Provider Options Type Assertions', () => {
257286
expectTypeOf<
258287
GeminiChatModelProviderOptionsByName['gemini-3-pro-preview']
259288
>().toHaveProperty('cachedContent')
289+
expectTypeOf<
290+
GeminiChatModelProviderOptionsByName['gemini-3-flash-preview']
291+
>().toHaveProperty('cachedContent')
260292
expectTypeOf<
261293
GeminiChatModelProviderOptionsByName['gemini-2.5-pro']
262294
>().toHaveProperty('cachedContent')
@@ -286,6 +318,9 @@ describe('Gemini Model Provider Options Type Assertions', () => {
286318
expectTypeOf<
287319
GeminiChatModelProviderOptionsByName['gemini-3-pro-preview']
288320
>().toExtend<GeminiThinkingOptions>()
321+
expectTypeOf<
322+
GeminiChatModelProviderOptionsByName['gemini-3-flash-preview']
323+
>().toExtend<GeminiThinkingOptions>()
289324
expectTypeOf<
290325
GeminiChatModelProviderOptionsByName['gemini-2.5-pro']
291326
>().toExtend<GeminiThinkingOptions>()
@@ -316,6 +351,9 @@ describe('Gemini Model Provider Options Type Assertions', () => {
316351
expectTypeOf<
317352
GeminiChatModelProviderOptionsByName['gemini-3-pro-preview']
318353
>().toExtend<GeminiStructuredOutputOptions>()
354+
expectTypeOf<
355+
GeminiChatModelProviderOptionsByName['gemini-3-flash-preview']
356+
>().toExtend<GeminiStructuredOutputOptions>()
319357
expectTypeOf<
320358
GeminiChatModelProviderOptionsByName['gemini-2.5-pro']
321359
>().toExtend<GeminiStructuredOutputOptions>()
@@ -375,6 +413,19 @@ describe('Gemini Model Input Modality Type Assertions', () => {
375413
})
376414
})
377415

416+
describe('gemini-3-flash-preview (full multimodal)', () => {
417+
type Modalities = GeminiModelInputModalitiesByName['gemini-3-flash-preview']
418+
type Message = ConstrainedModelMessage<Modalities>
419+
420+
it('should allow all content part types', () => {
421+
expectTypeOf<MessageWithContent<TextPart>>().toExtend<Message>()
422+
expectTypeOf<MessageWithContent<ImagePart>>().toExtend<Message>()
423+
expectTypeOf<MessageWithContent<AudioPart>>().toExtend<Message>()
424+
expectTypeOf<MessageWithContent<VideoPart>>().toExtend<Message>()
425+
expectTypeOf<MessageWithContent<DocumentPart>>().toExtend<Message>()
426+
})
427+
})
428+
378429
describe('gemini-2.5-pro (full multimodal)', () => {
379430
type Modalities = GeminiModelInputModalitiesByName['gemini-2.5-pro']
380431
type Message = ConstrainedModelMessage<Modalities>

0 commit comments

Comments
 (0)