diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 928d66eb..cc782746 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -2,6 +2,14 @@ ## [Unreleased] +### Added + +- Added `gemini-3.1-flash-lite-preview` fallback model entry for the `google` provider so it remains selectable until upstream model catalogs include it ([#1785](https://github.com/badlogic/pi-mono/issues/1785), thanks [@n-WN](https://github.com/n-WN)). + +### Fixed + +- Fixed Gemini 3.1 thinking-level detection in `google` and `google-vertex` providers so `gemini-3.1-*` models use Gemini 3 level-based thinking config instead of budget fallback ([#1785](https://github.com/badlogic/pi-mono/issues/1785), thanks [@n-WN](https://github.com/n-WN)). + ## [0.55.4] - 2026-03-02 ## [0.55.3] - 2026-02-27 diff --git a/packages/ai/scripts/generate-models.ts b/packages/ai/scripts/generate-models.ts index ea51057d..67856390 100644 --- a/packages/ai/scripts/generate-models.ts +++ b/packages/ai/scripts/generate-models.ts @@ -742,6 +742,27 @@ async function generateModels() { }); } + // Add missing Gemini 3.1 Flash Lite Preview until models.dev includes it. + if (!allModels.some((m) => m.provider === "google" && m.id === "gemini-3.1-flash-lite-preview")) { + allModels.push({ + id: "gemini-3.1-flash-lite-preview", + name: "Gemini 3.1 Flash Lite Preview", + api: "google-generative-ai", + baseUrl: "https://generativelanguage.googleapis.com/v1beta", + provider: "google", + reasoning: true, + input: ["text", "image"], + cost: { + input: 0, + output: 0, + cacheRead: 0, + cacheWrite: 0, + }, + contextWindow: 1048576, + maxTokens: 65536, + }); + } + // Add missing gpt models if (!allModels.some(m => m.provider === "openai" && m.id === "gpt-5-chat-latest")) { allModels.push({ diff --git a/packages/ai/src/models.generated.ts b/packages/ai/src/models.generated.ts index c4806502..e6c7236b 100644 --- a/packages/ai/src/models.generated.ts +++ b/packages/ai/src/models.generated.ts @@ -3171,6 +3171,23 @@ export const MODELS = { contextWindow: 1000000, maxTokens: 64000, } satisfies Model<"google-generative-ai">, + "gemini-3.1-flash-lite-preview": { + id: "gemini-3.1-flash-lite-preview", + name: "Gemini 3.1 Flash Lite Preview", + api: "google-generative-ai", + provider: "google", + baseUrl: "https://generativelanguage.googleapis.com/v1beta", + reasoning: true, + input: ["text", "image"], + cost: { + input: 0, + output: 0, + cacheRead: 0, + cacheWrite: 0, + }, + contextWindow: 1048576, + maxTokens: 65536, + } satisfies Model<"google-generative-ai">, "gemini-3.1-pro-preview": { id: "gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", @@ -10162,13 +10179,13 @@ export const MODELS = { reasoning: true, input: ["text"], cost: { - input: 0.35, - output: 1.71, + input: 0.39, + output: 1.9, cacheRead: 0, cacheWrite: 0, }, - contextWindow: 202752, - maxTokens: 131072, + contextWindow: 204800, + maxTokens: 204800, } satisfies Model<"openai-completions">, "z-ai/glm-4.6:exacto": { id: "z-ai/glm-4.6:exacto", diff --git a/packages/ai/src/providers/google-vertex.ts b/packages/ai/src/providers/google-vertex.ts index cc8c852e..97a3f869 100644 --- a/packages/ai/src/providers/google-vertex.ts +++ b/packages/ai/src/providers/google-vertex.ts @@ -416,11 +416,11 @@ function buildParams( type ClampedThinkingLevel = Exclude; function isGemini3ProModel(model: Model<"google-generative-ai">): boolean { - return model.id.includes("3-pro"); + return /gemini-3(?:\.\d+)?-pro/.test(model.id.toLowerCase()); } function isGemini3FlashModel(model: Model<"google-generative-ai">): boolean { - return model.id.includes("3-flash"); + return /gemini-3(?:\.\d+)?-flash/.test(model.id.toLowerCase()); } function getGemini3ThinkingLevel( diff --git a/packages/ai/src/providers/google.ts b/packages/ai/src/providers/google.ts index e3abdc20..59c50245 100644 --- a/packages/ai/src/providers/google.ts +++ b/packages/ai/src/providers/google.ts @@ -386,11 +386,11 @@ function buildParams( type ClampedThinkingLevel = Exclude; function isGemini3ProModel(model: Model<"google-generative-ai">): boolean { - return model.id.includes("3-pro"); + return /gemini-3(?:\.\d+)?-pro/.test(model.id.toLowerCase()); } function isGemini3FlashModel(model: Model<"google-generative-ai">): boolean { - return model.id.includes("3-flash"); + return /gemini-3(?:\.\d+)?-flash/.test(model.id.toLowerCase()); } function getGemini3ThinkingLevel(