fix(providers): drop retired Gemini AI Studio models, align catalog to live API (#5337)

Integrated into release/v3.8.41. Drops retired Gemini AI Studio models + gemma-4 deprecation alias.
This commit is contained in:
backryun
2026-06-29 22:32:49 +09:00
committed by GitHub
parent c50033f393
commit fa31b14bb1
12 changed files with 29 additions and 46 deletions

View File

@@ -205,7 +205,10 @@ export const EMBEDDING_PROVIDERS: Record<string, EmbeddingProvider> = {
baseUrl: "https://generativelanguage.googleapis.com/v1beta/openai/embeddings",
authType: "apikey",
authHeader: "bearer",
models: [{ id: "text-embedding-004", name: "Text Embedding 004", dimensions: 768 }],
models: [
{ id: "gemini-embedding-2", name: "Gemini Embedding 2", dimensions: 768 },
{ id: "gemini-embedding-001", name: "Gemini Embedding 001", dimensions: 768 },
],
},
"voyage-ai": {

View File

@@ -167,9 +167,8 @@ export const FREE_MODEL_BUDGETS: FreeModelBudget[] = [
{ provider: "gemini", modelId: "gemini-2.5-flash", displayName: "Gemini 2.5 Flash", monthlyTokens: 60000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "gemini-free", tos: "caution" },
{ provider: "gemini", modelId: "gemini-2.5-flash-lite", displayName: "Gemini 2.5 Flash-Lite", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-daily", poolKey: "gemini-free", tos: "caution" },
{ provider: "gemini", modelId: "gemini-3-flash-preview", displayName: "Gemini 3 Flash Preview", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-daily", poolKey: "gemini-free", tos: "caution" },
{ provider: "gemini", modelId: "gemini-3.1-flash-lite-preview", displayName: "Gemini 3.1 Flash-Lite", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-daily", poolKey: "gemini-free", tos: "caution" },
{ provider: "gemini", modelId: "gemini-3.1-flash-lite", displayName: "Gemini 3.1 Flash-Lite", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-daily", poolKey: "gemini-free", tos: "caution" },
{ provider: "gemini", modelId: "gemini-3.5-flash", displayName: "Gemini 3.5 Flash", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-daily", poolKey: "gemini-free", tos: "caution" },
{ provider: "gemini", modelId: "gemma-4", displayName: "Gemma 4 (open model)", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-daily", poolKey: "gemini-free", tos: "caution" },
{ provider: "github-models", modelId: "openai/gpt-4.1", displayName: "GPT-4.1 (Free)", monthlyTokens: 18000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "github-models", tos: "caution" },
{ provider: "github-models", modelId: "openai/gpt-4o", displayName: "GPT-4o (Free)", monthlyTokens: 18000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "github-models", tos: "caution" },
{ provider: "github-models", modelId: "openai/gpt-4o-mini", displayName: "GPT-4o Mini (Free)", monthlyTokens: 18000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "github-models", tos: "caution" },

View File

@@ -21,13 +21,6 @@ export const geminiProvider: RegistryEntry = {
clientSecretDefault: resolvePublicCred("gemini_alt"),
},
models: [
{ id: "gemini-2.0-flash", name: "Gemini 2.0 Flash", toolCalling: true, supportsVision: true },
{
id: "gemini-2.0-flash-lite",
name: "Gemini 2.0 Flash Lite",
toolCalling: true,
supportsVision: true,
},
{
id: "gemini-3.1-pro-preview",
name: "Gemini 3.1 Pro Preview",
@@ -41,14 +34,8 @@ export const geminiProvider: RegistryEntry = {
supportsVision: true,
},
{
id: "gemini-3-flash-lite-preview",
name: "Gemini 3 Flash Lite Preview",
toolCalling: true,
supportsVision: true,
},
{
id: "gemini-3.1-flash-lite-preview",
name: "Gemini 3.1 Flash Lite Preview",
id: "gemini-3.1-flash-lite",
name: "Gemini 3.1 Flash Lite",
toolCalling: true,
supportsVision: true,
},
@@ -72,18 +59,5 @@ export const geminiProvider: RegistryEntry = {
toolCalling: true,
supportsVision: true,
},
{
id: "gemini-2.0-flash-thinking-exp-01-21",
name: "Gemini 2.0 Flash Thinking",
supportsReasoning: true,
},
{
id: "gemini-2.0-pro-exp-02-05",
name: "Gemini 2.0 Pro Experimental",
toolCalling: true,
supportsVision: true,
},
{ id: "gemini-1.5-pro", name: "Gemini 1.5 Pro", toolCalling: true, supportsVision: true },
{ id: "gemini-1.5-flash", name: "Gemini 1.5 Flash", toolCalling: true, supportsVision: true },
],
};

View File

@@ -13,7 +13,5 @@ export const gemini_webProvider: RegistryEntry = {
{ id: "gemini-2.5-flash", name: "Gemini 2.5 Flash" },
{ id: "gemini-2.0-pro", name: "Gemini 2.0 Pro" },
{ id: "gemini-2.0-flash", name: "Gemini 2.0 Flash" },
{ id: "gemini-1.5-pro", name: "Gemini 1.5 Pro" },
{ id: "gemini-1.5-flash", name: "Gemini 1.5 Flash" },
],
};

View File

@@ -18,8 +18,12 @@ const BUILT_IN_ALIASES: Record<string, string> = {
"gemini-1.5-flash": "gemini-2.5-flash",
"gemini-1.0-pro": "gemini-2.5-pro",
"gemini-2.0-flash": "gemini-2.5-flash",
"gemini-2.0-flash-lite": "gemini-3.1-flash-lite",
"gemini-3.1-flash-lite-preview": "gemini-3.1-flash-lite",
"gemini-3-pro-high": "gemini-3.1-pro-high",
"gemini-3-pro-low": "gemini-3.1-pro-low",
// Retired free Gemma (was in the gemini-free pool) → current gemini-free model
"gemma-4": "gemini-3.1-flash-lite",
// Claude legacy → current
"claude-3-opus-20240229": "claude-opus-4-20250514",

View File

@@ -15,7 +15,7 @@ const BATCH_SUPPORTED = ["openai", "anthropic", "gemini"];
const MODEL_DEFAULTS: Record<string, string[]> = {
openai: ["gpt-4o-mini", "gpt-4o", "gpt-4-turbo"],
anthropic: ["claude-3-5-sonnet-20241022", "claude-3-5-haiku-20241022"],
gemini: ["gemini-1.5-flash", "gemini-1.5-pro"],
gemini: ["gemini-2.5-flash", "gemini-2.5-pro"],
};
const PROVIDER_NAMES: Record<string, string> = {
openai: "OpenAI",

View File

@@ -1,14 +1,12 @@
import { getModelAliases, setModelAlias } from "@/lib/db/models";
export const DEFAULT_MODEL_ALIAS_SEED = Object.freeze({
"gemini-1.5-pro": "gemini/gemini-1.5-pro",
"gemini-1.5-flash": "gemini/gemini-1.5-flash",
"gemini-3-pro-high": "agy/gemini-3.1-pro-high",
"gemini-3-pro-low": "agy/gemini-3.1-pro-low",
"gemini-3-pro-preview": "agy/gemini-pro-agent",
"gemini-3.1-pro-preview": "agy/gemini-pro-agent",
"gemini-3-flash-preview": "agy/gemini-3.5-flash-medium",
"gemini-3.1-flash-lite-preview": "gemini/gemini-3.1-flash-lite-preview",
"gemini-3.1-flash-lite-preview": "gemini/gemini-3.1-flash-lite",
});
type SeedLogger = {

View File

@@ -19,7 +19,7 @@ test("getEmbeddingDimension resolves known dimensions from the registry", () =>
assert.equal(getEmbeddingDimension("openai/text-embedding-3-small"), 1536);
assert.equal(getEmbeddingDimension("openai/text-embedding-3-large"), 3072);
assert.equal(getEmbeddingDimension("nebius/Qwen/Qwen3-Embedding-8B"), 4096);
assert.equal(getEmbeddingDimension("gemini/text-embedding-004"), 768);
assert.equal(getEmbeddingDimension("gemini/gemini-embedding-001"), 768);
// OpenRouter re-exports OpenAI ids under its own prefix at the same dimension.
assert.equal(getEmbeddingDimension("openrouter/openai/text-embedding-3-small"), 1536);
});

View File

@@ -23,6 +23,13 @@ test("resolveModelAlias: resolves deprecated Gemini model", () => {
assert.equal(resolveModelAlias("gemini-pro"), "gemini-2.5-pro");
assert.equal(resolveModelAlias("gemini-1.5-pro"), "gemini-2.5-pro");
assert.equal(resolveModelAlias("gemini-1.5-flash"), "gemini-2.5-flash");
// Retired 2.0 Flash-Lite (Google shutdown 2026-06-01) + renamed flash-lite preview
// both forward to the live GA gemini-3.1-flash-lite.
assert.equal(resolveModelAlias("gemini-2.0-flash-lite"), "gemini-3.1-flash-lite");
assert.equal(resolveModelAlias("gemini-3.1-flash-lite-preview"), "gemini-3.1-flash-lite");
// Retired free Gemma (was in the gemini-free pool) forwards to the current
// gemini-free model instead of erroring with model-not-found.
assert.equal(resolveModelAlias("gemma-4"), "gemini-3.1-flash-lite");
});
test("resolveModelAlias: resolves deprecated Claude model", () => {

View File

@@ -28,8 +28,8 @@ const OPENAI_ADDED_IDS = [
] as const;
const GEMINI_ADDED_IDS = [
"gemini-3-flash-lite-preview",
"gemini-2.0-flash-lite",
"gemini-3.1-flash-lite",
"gemini-2.5-flash-lite",
] as const;
test("openai registry exposes gpt-4.1 mini/nano and o3-mini/o4-mini reasoning variants", () => {
@@ -69,7 +69,7 @@ test("port did not regress previously curated openai/gemini ids", () => {
"gemini-2.5-pro",
"gemini-2.5-flash",
"gemini-3.1-pro-preview",
"gemini-1.5-pro",
"gemini-3.5-flash",
] as const) {
assert.ok(geminiIds.has(id), `existing gemini model ${id} must remain`);
}

View File

@@ -12,11 +12,11 @@ test("T28: gemini AI Studio catalog includes current preview models", () => {
const geminiIds = REGISTRY.gemini.models.map((m) => m.id);
assert.ok(geminiIds.includes("gemini-3.1-pro-preview"));
assert.ok(geminiIds.includes("gemini-3-flash-preview"));
assert.ok(geminiIds.includes("gemini-3.1-flash-lite-preview"));
assert.ok(geminiIds.includes("gemini-3.1-flash-lite"));
assert.ok(geminiIds.includes("gemini-3.5-flash"));
assert.ok(geminiIds.includes("gemini-2.5-flash"));
assert.ok(geminiIds.includes("gemini-2.5-pro"));
assert.equal(geminiIds[0], "gemini-2.0-flash", "preserve the existing Gemini default");
assert.equal(geminiIds[0], "gemini-3.1-pro-preview", "preserve the existing Gemini default");
});
test("T28: antigravity static catalog exposes client-visible Gemini tier IDs", () => {

View File

@@ -643,11 +643,11 @@ test("vscode tokenized models route prefixes the provider without duplicating br
new Request(`http://localhost/api/v1/vscode/${encodeURIComponent(key.key)}/models`)
);
const body = (await response.json()) as any;
const model = (body.data || []).find((entry: any) => entry.id === "gemini/gemini-1.5-pro");
const model = (body.data || []).find((entry: any) => entry.id === "gemini/gemini-2.5-pro");
assert.equal(response.status, 200);
assert.ok(model, "missing gemini/gemini-1.5-pro in tokenized VS Code models route");
assert.equal(model.name, "Gemini 1.5 Pro");
assert.ok(model, "missing gemini/gemini-2.5-pro in tokenized VS Code models route");
assert.equal(model.name, "Gemini 2.5 Pro");
});
test("vscode tokenized tags route mirrors the Ollama tags payload", async () => {