Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .changeset/fluffy-rats-worry.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
'@tanstack/ai-gemini': minor
---

feat: add support for Gemini 3.1 Flash Lite Preview model

Added `gemini-3.1-flash-lite-preview` to the Gemini adapter with:

- Full multimodal support (text, image, audio, video, document)
- Thinking and structured output capabilities
- Available for summarization tasks
- Comprehensive type tests

Model specs:

- 1M input tokens, 65K output tokens
- $0.25/1M input, $1.50/1M output pricing
- Knowledge cutoff: 2025-01-01
1 change: 1 addition & 0 deletions packages/typescript/ai-gemini/src/adapters/summarize.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ export interface GeminiSummarizeConfig extends GeminiClientConfig {}
* Available Gemini models for summarization
*/
export const GeminiSummarizeModels = [
'gemini-3.1-flash-lite-preview',
'gemini-2.0-flash',
'gemini-1.5-flash',
'gemini-1.5-pro',
Expand Down
45 changes: 45 additions & 0 deletions packages/typescript/ai-gemini/src/model-meta.ts
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,43 @@ const GEMINI_3_1_FLASH_IMAGE = {
GeminiThinkingOptions
>

const GEMINI_3_1_FLASH_LITE = {
name: 'gemini-3.1-flash-lite-preview',
max_input_tokens: 1_048_576,
max_output_tokens: 65_536,
knowledge_cutoff: '2025-01-01',
supports: {
input: ['text', 'image', 'audio', 'video', 'document'],
output: ['text'],
capabilities: [
'batch_api',
'caching',
'code_execution',
'file_search',
'function_calling',
'search_grounding',
'structured_output',
'thinking',
'url_context',
],
},
pricing: {
input: {
normal: 0.25,
},
output: {
normal: 1.5,
},
},
} as const satisfies ModelMeta<
GeminiToolConfigOptions &
GeminiSafetyOptions &
GeminiCommonConfigOptions &
GeminiCachedContentOptions &
GeminiStructuredOutputOptions &
GeminiThinkingOptions
>

const GEMINI_2_5_PRO = {
name: 'gemini-2.5-pro',
max_input_tokens: 1_048_576,
Expand Down Expand Up @@ -894,6 +931,7 @@ export const GEMINI_MODELS = [
GEMINI_3_1_PRO.name,
GEMINI_3_PRO.name,
GEMINI_3_FLASH.name,
GEMINI_3_1_FLASH_LITE.name,
GEMINI_2_5_PRO.name,
GEMINI_2_5_FLASH.name,
GEMINI_2_5_FLASH_PREVIEW.name,
Expand Down Expand Up @@ -1005,6 +1043,12 @@ export type GeminiChatModelProviderOptionsByName = {
GeminiStructuredOutputOptions &
GeminiThinkingOptions &
GeminiThinkingAdvancedOptions
[GEMINI_3_1_FLASH_LITE.name]: GeminiToolConfigOptions &
GeminiSafetyOptions &
GeminiCommonConfigOptions &
GeminiCachedContentOptions &
GeminiStructuredOutputOptions &
GeminiThinkingOptions
[GEMINI_2_5_PRO.name]: GeminiToolConfigOptions &
GeminiSafetyOptions &
GeminiCommonConfigOptions &
Expand Down Expand Up @@ -1066,6 +1110,7 @@ export type GeminiModelInputModalitiesByName = {
[GEMINI_3_1_PRO.name]: typeof GEMINI_3_1_PRO.supports.input
[GEMINI_3_PRO.name]: typeof GEMINI_3_PRO.supports.input
[GEMINI_3_FLASH.name]: typeof GEMINI_3_FLASH.supports.input
[GEMINI_3_1_FLASH_LITE.name]: typeof GEMINI_3_1_FLASH_LITE.supports.input
[GEMINI_2_5_PRO.name]: typeof GEMINI_2_5_PRO.supports.input
[GEMINI_2_5_FLASH_LITE.name]: typeof GEMINI_2_5_FLASH_LITE.supports.input
[GEMINI_2_5_FLASH_LITE_PREVIEW.name]: typeof GEMINI_2_5_FLASH_LITE_PREVIEW.supports.input
Expand Down
54 changes: 54 additions & 0 deletions packages/typescript/ai-gemini/tests/model-meta.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,28 @@ describe('Gemini Model Provider Options Type Assertions', () => {
// Should have base options
expectTypeOf<Options>().toExtend<BaseOptions>()
})

it('gemini-3.1-flash-lite-preview should support thinking options', () => {
type Model = 'gemini-3.1-flash-lite-preview'
type Options = GeminiChatModelProviderOptionsByName[Model]

// Should have thinking options
expectTypeOf<Options>().toExtend<GeminiThinkingOptions>()

// Should have structured output options
expectTypeOf<Options>().toExtend<GeminiStructuredOutputOptions>()

// Should have base options
expectTypeOf<Options>().toExtend<BaseOptions>()

// Verify specific properties exist
expectTypeOf<Options>().toHaveProperty('generationConfig')
expectTypeOf<Options>().toHaveProperty('safetySettings')
expectTypeOf<Options>().toHaveProperty('toolConfig')
expectTypeOf<Options>().toHaveProperty('cachedContent')
expectTypeOf<Options>().toHaveProperty('responseMimeType')
expectTypeOf<Options>().toHaveProperty('responseSchema')
})
})

describe('Models WITHOUT thinking support', () => {
Expand Down Expand Up @@ -195,6 +217,7 @@ describe('Gemini Model Provider Options Type Assertions', () => {

expectTypeOf<'gemini-3-pro-preview'>().toExtend<Keys>()
expectTypeOf<'gemini-3-flash-preview'>().toExtend<Keys>()
expectTypeOf<'gemini-3.1-flash-lite-preview'>().toExtend<Keys>()
expectTypeOf<'gemini-2.5-pro'>().toExtend<Keys>()
expectTypeOf<'gemini-2.5-flash'>().toExtend<Keys>()
expectTypeOf<'gemini-2.5-flash-preview-09-2025'>().toExtend<Keys>()
Expand Down Expand Up @@ -244,6 +267,9 @@ describe('Gemini Model Provider Options Type Assertions', () => {
expectTypeOf<
GeminiChatModelProviderOptionsByName['gemini-2.5-flash-lite-preview-09-2025']
>().toHaveProperty('safetySettings')
expectTypeOf<
GeminiChatModelProviderOptionsByName['gemini-3.1-flash-lite-preview']
>().toHaveProperty('safetySettings')
expectTypeOf<
GeminiChatModelProviderOptionsByName['gemini-2.0-flash']
>().toHaveProperty('safetySettings')
Expand Down Expand Up @@ -274,6 +300,9 @@ describe('Gemini Model Provider Options Type Assertions', () => {
expectTypeOf<
GeminiChatModelProviderOptionsByName['gemini-2.5-flash-lite-preview-09-2025']
>().toHaveProperty('toolConfig')
expectTypeOf<
GeminiChatModelProviderOptionsByName['gemini-3.1-flash-lite-preview']
>().toHaveProperty('toolConfig')
expectTypeOf<
GeminiChatModelProviderOptionsByName['gemini-2.0-flash']
>().toHaveProperty('toolConfig')
Expand Down Expand Up @@ -304,6 +333,9 @@ describe('Gemini Model Provider Options Type Assertions', () => {
expectTypeOf<
GeminiChatModelProviderOptionsByName['gemini-2.5-flash-lite-preview-09-2025']
>().toHaveProperty('cachedContent')
expectTypeOf<
GeminiChatModelProviderOptionsByName['gemini-3.1-flash-lite-preview']
>().toHaveProperty('cachedContent')
expectTypeOf<
GeminiChatModelProviderOptionsByName['gemini-2.0-flash']
>().toHaveProperty('cachedContent')
Expand Down Expand Up @@ -336,6 +368,9 @@ describe('Gemini Model Provider Options Type Assertions', () => {
expectTypeOf<
GeminiChatModelProviderOptionsByName['gemini-2.5-flash-lite-preview-09-2025']
>().toExtend<GeminiThinkingOptions>()
expectTypeOf<
GeminiChatModelProviderOptionsByName['gemini-3.1-flash-lite-preview']
>().toExtend<GeminiThinkingOptions>()
})

it('models without thinking should NOT extend GeminiThinkingOptions', () => {
Expand Down Expand Up @@ -369,6 +404,9 @@ describe('Gemini Model Provider Options Type Assertions', () => {
expectTypeOf<
GeminiChatModelProviderOptionsByName['gemini-2.5-flash-lite-preview-09-2025']
>().toExtend<GeminiStructuredOutputOptions>()
expectTypeOf<
GeminiChatModelProviderOptionsByName['gemini-3.1-flash-lite-preview']
>().toExtend<GeminiStructuredOutputOptions>()
expectTypeOf<
GeminiChatModelProviderOptionsByName['gemini-2.0-flash']
>().toExtend<GeminiStructuredOutputOptions>()
Expand All @@ -387,7 +425,9 @@ describe('Gemini Model Provider Options Type Assertions', () => {
*
* Models with full multimodal (text + image + audio + video + document):
* - gemini-3-pro-preview
* - gemini-3-flash-preview
* - gemini-2.5-pro
* - gemini-3.1-flash-lite-preview
* - gemini-2.5-flash-lite (and preview)
*
* Models with limited multimodal (text + image + audio + video, NO document):
Expand Down Expand Up @@ -439,6 +479,20 @@ describe('Gemini Model Input Modality Type Assertions', () => {
})
})

describe('gemini-3.1-flash-lite-preview (full multimodal)', () => {
type Modalities =
GeminiModelInputModalitiesByName['gemini-3.1-flash-lite-preview']
type Message = ConstrainedModelMessage<Modalities>

it('should allow all content part types', () => {
expectTypeOf<MessageWithContent<TextPart>>().toExtend<Message>()
expectTypeOf<MessageWithContent<ImagePart>>().toExtend<Message>()
expectTypeOf<MessageWithContent<AudioPart>>().toExtend<Message>()
expectTypeOf<MessageWithContent<VideoPart>>().toExtend<Message>()
expectTypeOf<MessageWithContent<DocumentPart>>().toExtend<Message>()
})
})

describe('gemini-2.5-flash-lite (full multimodal)', () => {
type Modalities = GeminiModelInputModalitiesByName['gemini-2.5-flash-lite']
type Message = ConstrainedModelMessage<Modalities>
Expand Down