sync google models

This commit is contained in:
Aiden Cline
2026-05-19 15:58:06 -05:00
parent 462c7877d9
commit 8c677f0134
79 changed files with 827 additions and 497 deletions
+3
View File
@@ -5,6 +5,7 @@ import { mkdir, readdir, rm } from "node:fs/promises";
import { z } from "zod";
import { AuthoredModel, AuthoredModelShape } from "../src/schema.js";
import { google } from "./sync/google.js";
import { openrouter } from "./sync/openrouter.js";
const ExistingModel = AuthoredModelShape.partial()
@@ -46,11 +47,13 @@ export interface SyncResult {
}
export const providers = {
google,
openrouter,
};
export const groups = {
aggregators: ["openrouter"],
direct: ["google"],
} as const;
type ProviderID = keyof typeof providers;
+139
View File
@@ -0,0 +1,139 @@
import { z } from "zod";
import type { ExistingModel, SyncProvider } from "../sync-models.js";
const API_ENDPOINT = "https://generativelanguage.googleapis.com/v1beta/models";
const GoogleModel = z.object({
name: z.string(),
baseModelId: z.string().optional(),
version: z.string().optional(),
displayName: z.string().optional(),
description: z.string().optional(),
inputTokenLimit: z.number().int().nonnegative(),
outputTokenLimit: z.number().int().nonnegative(),
supportedGenerationMethods: z.array(z.string()).optional(),
temperature: z.number().optional(),
topP: z.number().optional(),
topK: z.number().optional(),
maxTemperature: z.number().optional(),
thinking: z.boolean().optional(),
}).passthrough();
const GoogleResponse = z.object({
models: z.array(GoogleModel).optional(),
nextPageToken: z.string().optional(),
}).passthrough();
type GoogleModel = z.infer<typeof GoogleModel>;
export const google = {
id: "google",
name: "Google",
modelsDir: "providers/google/models",
async fetchModels() {
const key = process.env.GOOGLE_API_KEY
?? process.env.GEMINI_API_KEY
?? process.env.GOOGLE_GENERATIVE_AI_API_KEY;
if (key === undefined) {
throw new Error("Google sync requires GOOGLE_API_KEY, GEMINI_API_KEY, or GOOGLE_GENERATIVE_AI_API_KEY");
}
const models: GoogleModel[] = [];
let pageToken: string | undefined;
do {
const url = new URL(API_ENDPOINT);
url.searchParams.set("key", key);
url.searchParams.set("pageSize", "1000");
if (pageToken !== undefined) url.searchParams.set("pageToken", pageToken);
const response = await fetch(url);
if (!response.ok) {
throw new Error(`Google models request failed: ${response.status} ${response.statusText}`);
}
const page = GoogleResponse.parse(await response.json());
models.push(...page.models ?? []);
pageToken = page.nextPageToken;
} while (pageToken !== undefined);
return { models };
},
parseModels(raw) {
return GoogleResponse.parse(raw).models ?? [];
},
translateModel(model, context) {
const id = model.name.replace(/^models\//, "");
return {
id,
model: buildModel(id, model, context.existing(id)),
};
},
} satisfies SyncProvider<GoogleModel>;
function buildModel(id: string, model: GoogleModel, existing: ExistingModel | undefined) {
const methods = new Set(model.supportedGenerationMethods ?? []);
const modalities = inferModalities(id, methods, existing);
const today = new Date().toISOString().slice(0, 10);
return {
name: model.displayName ?? existing?.name ?? id,
family: existing?.family ?? inferFamily(id),
release_date: existing?.release_date ?? today,
last_updated: existing?.last_updated ?? today,
attachment: modalities.input.some((value) => value !== "text"),
reasoning: model.thinking ?? existing?.reasoning ?? false,
temperature: model.temperature !== undefined || model.maxTemperature !== undefined
? true
: (existing?.temperature ?? false),
tool_call: existing?.tool_call ?? false,
structured_output: existing?.structured_output,
knowledge: existing?.knowledge,
open_weights: id.startsWith("gemma-") || (existing?.open_weights ?? false),
status: existing?.status,
interleaved: existing?.interleaved,
cost: existing?.cost,
limit: {
context: model.inputTokenLimit,
input: existing?.limit?.input,
output: model.outputTokenLimit,
},
modalities,
};
}
function inferFamily(id: string) {
if (id.startsWith("gemini-embedding")) return "gemini-embedding";
if (id.includes("flash-lite")) return "gemini-flash-lite";
if (id.includes("flash")) return "gemini-flash";
if (id.includes("pro")) return "gemini-pro";
if (id.startsWith("gemini-")) return "gemini";
if (id.startsWith("gemma-")) return "gemma";
if (id.startsWith("imagen-")) return "imagen";
if (id.startsWith("veo-")) return "veo";
if (id.startsWith("lyria-")) return "lyria";
return undefined;
}
function inferModalities(id: string, methods: Set<string>, existing: ExistingModel | undefined) {
if (id.startsWith("imagen-")) {
return { input: ["text"], output: ["image"] } as const;
}
if (id.startsWith("veo-")) {
return { input: ["text", "image"], output: ["video"] } as const;
}
if (id.startsWith("lyria-")) {
return { input: ["text"], output: ["audio"] } as const;
}
if (id.includes("tts")) {
return { input: ["text"], output: ["audio"] } as const;
}
if (id.includes("native-audio") || id.includes("live")) {
return existing?.modalities ?? { input: ["text", "image", "audio", "video"], output: ["text", "audio"] };
}
if (methods.has("embedContent") || methods.has("asyncBatchEmbedContent")) {
return existing?.modalities ?? { input: ["text"], output: ["text"] };
}
return existing?.modalities ?? { input: ["text"], output: ["text"] };
}
@@ -1,3 +0,0 @@
[extends]
from = "google/gemini-2.5-flash-lite-preview-09-2025"
omit = ["structured_output"]
@@ -1,2 +0,0 @@
[extends]
from = "google/gemini-2.5-flash-preview-04-17"
@@ -1,3 +0,0 @@
[extends]
from = "google/gemini-2.5-flash-preview-05-20"
omit = ["structured_output"]
@@ -1,3 +0,0 @@
[extends]
from = "google/gemini-2.5-pro-preview-05-06"
omit = ["structured_output"]
@@ -1,3 +0,0 @@
[extends]
from = "google/gemini-2.5-pro-preview-06-05"
omit = ["structured_output"]
+16
View File
@@ -0,0 +1,16 @@
name = "ajax-vertex"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = false
reasoning = true
temperature = true
tool_call = false
open_weights = false
[limit]
context = 1_048_576
output = 65_536
[modalities]
input = ["text"]
output = ["text"]
+16
View File
@@ -0,0 +1,16 @@
name = "ajax"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = false
reasoning = true
temperature = true
tool_call = false
open_weights = false
[limit]
context = 1_048_576
output = 65_536
[modalities]
input = ["text"]
output = ["text"]
+16
View File
@@ -0,0 +1,16 @@
name = "Model that performs Attributed Question Answering."
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = false
reasoning = false
temperature = true
tool_call = false
open_weights = false
[limit]
context = 7_168
output = 1_024
[modalities]
input = ["text"]
output = ["text"]
@@ -0,0 +1,16 @@
name = "Deep Research Max Preview (Apr-21-2026)"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = false
reasoning = true
temperature = true
tool_call = false
open_weights = false
[limit]
context = 131_072
output = 65_536
[modalities]
input = ["text"]
output = ["text"]
@@ -0,0 +1,16 @@
name = "Deep Research Preview (Apr-21-2026)"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = false
reasoning = true
temperature = true
tool_call = false
open_weights = false
[limit]
context = 131_072
output = 65_536
[modalities]
input = ["text"]
output = ["text"]
@@ -0,0 +1,17 @@
name = "Deep Research Pro Preview (Dec-12-2025)"
family = "gemini-pro"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = false
reasoning = true
temperature = true
tool_call = false
open_weights = false
[limit]
context = 131_072
output = 65_536
[modalities]
input = ["text"]
output = ["text"]
@@ -0,0 +1,16 @@
name = "fiercefalcon"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = false
reasoning = true
temperature = true
tool_call = false
open_weights = false
[limit]
context = 1_048_576
output = 65_536
[modalities]
input = ["text"]
output = ["text"]
@@ -0,0 +1,16 @@
name = "fiercefalcon-inline-citation"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = false
reasoning = true
temperature = true
tool_call = false
open_weights = false
[limit]
context = 1_048_576
output = 65_536
[modalities]
input = ["text"]
output = ["text"]
+16
View File
@@ -0,0 +1,16 @@
name = "fiercefalcon"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = false
reasoning = true
temperature = true
tool_call = false
open_weights = false
[limit]
context = 1_048_576
output = 65_536
[modalities]
input = ["text"]
output = ["text"]
@@ -1,23 +0,0 @@
name = "Gemini 1.5 Flash-8B"
family = "gemini-flash"
release_date = "2024-10-03"
last_updated = "2024-10-03"
attachment = true
reasoning = false
temperature = true
knowledge = "2024-04"
tool_call = true
open_weights = false
[cost]
input = 0.0375
output = 0.15
cache_read = 0.01
[limit]
context = 1_000_000
output = 8_192
[modalities]
input = ["text", "image", "audio", "video"]
output = ["text"]
@@ -1,23 +0,0 @@
name = "Gemini 1.5 Flash"
family = "gemini-flash"
release_date = "2024-05-14"
last_updated = "2024-05-14"
attachment = true
reasoning = false
temperature = true
knowledge = "2024-04"
tool_call = true
open_weights = false
[cost]
input = 0.075
output = 0.30
cache_read = 0.01875
[limit]
context = 1_000_000
output = 8_192
[modalities]
input = ["text", "image", "audio", "video"]
output = ["text"]
@@ -1,23 +0,0 @@
name = "Gemini 1.5 Pro"
family = "gemini-pro"
release_date = "2024-02-15"
last_updated = "2024-02-15"
attachment = true
reasoning = false
temperature = true
knowledge = "2024-04"
tool_call = true
open_weights = false
[cost]
input = 1.25
output = 5.00
cache_read = 0.3125
[limit]
context = 1_000_000
output = 8_192
[modalities]
input = ["text", "image", "audio", "video"]
output = ["text"]
@@ -0,0 +1,17 @@
name = "Gemini 2.0 Flash 001"
family = "gemini-flash"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = false
reasoning = false
temperature = true
tool_call = false
open_weights = false
[limit]
context = 1_048_576
output = 8_192
[modalities]
input = ["text"]
output = ["text"]
@@ -0,0 +1,17 @@
name = "Gemini 2.0 Flash-Lite 001"
family = "gemini-flash-lite"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = false
reasoning = false
temperature = true
tool_call = false
open_weights = false
[limit]
context = 1_048_576
output = 8_192
[modalities]
input = ["text"]
output = ["text"]
@@ -1,18 +1,18 @@
name = "Gemini 2.0 Flash Lite"
name = "Gemini 2.0 Flash-Lite"
family = "gemini-flash-lite"
release_date = "2024-12-11"
last_updated = "2024-12-11"
attachment = true
reasoning = false
temperature = true
knowledge = "2024-06"
tool_call = true
structured_output = true
knowledge = "2024-06"
open_weights = false
[cost]
input = 0.075
output = 0.30
output = 0.3
[limit]
context = 1_048_576
@@ -0,0 +1,17 @@
name = "Gemini 2.5 Computer Use Preview 10-2025"
family = "gemini"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = false
reasoning = true
temperature = true
tool_call = false
open_weights = false
[limit]
context = 131_072
output = 65_536
[modalities]
input = ["text"]
output = ["text"]
@@ -1,23 +0,0 @@
name = "Gemini 2.5 Flash Image (Preview)"
family = "gemini-flash"
release_date = "2025-08-26"
last_updated = "2025-08-26"
attachment = true
reasoning = true
temperature = true
knowledge = "2025-06"
tool_call = false
open_weights = false
[cost]
input = 0.30
output = 30
cache_read = 0.075
[limit]
context = 32_768
output = 32_768
[modalities]
input = ["text", "image"]
output = ["text", "image"]
@@ -1,16 +1,16 @@
name = "Gemini 2.5 Flash Image"
name = "Nano Banana"
family = "gemini-flash"
release_date = "2025-08-26"
last_updated = "2025-08-26"
attachment = true
reasoning = true
temperature = true
knowledge = "2025-06"
tool_call = false
knowledge = "2025-06"
open_weights = false
[cost]
input = 0.30
input = 0.3
output = 30
cache_read = 0.075
@@ -20,4 +20,4 @@ output = 32_768
[modalities]
input = ["text", "image"]
output = ["text", "image"]
output = ["text", "image"]
@@ -1,24 +0,0 @@
name = "Gemini 2.5 Flash Lite Preview 06-17"
family = "gemini-flash-lite"
release_date = "2025-06-17"
last_updated = "2025-06-17"
attachment = true
reasoning = true
temperature = true
knowledge = "2025-01"
tool_call = true
open_weights = false
[cost]
input = 0.10
output = 0.40
cache_read = 0.025
input_audio = 0.30
[limit]
context = 1_048_576
output = 65_536
[modalities]
input = ["text", "image", "audio", "video", "pdf"]
output = ["text"]
@@ -1,24 +0,0 @@
name = "Gemini 2.5 Flash Lite Preview 09-25"
family = "gemini-flash-lite"
release_date = "2025-09-25"
last_updated = "2025-09-25"
attachment = true
reasoning = true
temperature = true
knowledge = "2025-01"
tool_call = true
structured_output = true
open_weights = false
[cost]
input = 0.10
output = 0.40
cache_read = 0.025
[limit]
context = 1_048_576
output = 65_536
[modalities]
input = ["text", "image", "audio", "video", "pdf"]
output = ["text"]
@@ -1,20 +1,20 @@
name = "Gemini 2.5 Flash Lite"
name = "Gemini 2.5 Flash-Lite"
family = "gemini-flash-lite"
release_date = "2025-06-17"
last_updated = "2025-06-17"
attachment = true
reasoning = true
temperature = true
knowledge = "2025-01"
tool_call = true
structured_output = true
knowledge = "2025-01"
open_weights = false
[cost]
input = 0.10
output = 0.40
input = 0.1
output = 0.4
cache_read = 0.01
input_audio = 0.30
input_audio = 0.3
[limit]
context = 1_048_576
@@ -0,0 +1,17 @@
name = "Gemini 2.5 Flash Native Audio Latest"
family = "gemini-flash"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = true
reasoning = true
temperature = true
tool_call = false
open_weights = false
[limit]
context = 131_072
output = 8_192
[modalities]
input = ["text", "image", "audio", "video"]
output = ["text", "audio"]
@@ -0,0 +1,17 @@
name = "Gemini 2.5 Flash Native Audio Preview 09-2025"
family = "gemini-flash"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = true
reasoning = true
temperature = true
tool_call = false
open_weights = false
[limit]
context = 131_072
output = 8_192
[modalities]
input = ["text", "image", "audio", "video"]
output = ["text", "audio"]
@@ -0,0 +1,17 @@
name = "Gemini 2.5 Flash Native Audio Preview 12-2025"
family = "gemini-flash"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = true
reasoning = true
temperature = true
tool_call = false
open_weights = false
[limit]
context = 131_072
output = 8_192
[modalities]
input = ["text", "image", "audio", "video"]
output = ["text", "audio"]
@@ -1,23 +0,0 @@
name = "Gemini 2.5 Flash Preview 04-17"
family = "gemini-flash"
release_date = "2025-04-17"
last_updated = "2025-04-17"
attachment = true
reasoning = true
temperature = true
knowledge = "2025-01"
tool_call = true
open_weights = false
[cost]
input = 0.15
output = 0.60
cache_read = 0.0375
[limit]
context = 1_048_576
output = 65_536
[modalities]
input = ["text", "image", "audio", "video", "pdf"]
output = ["text"]
@@ -1,24 +0,0 @@
name = "Gemini 2.5 Flash Preview 05-20"
family = "gemini-flash"
release_date = "2025-05-20"
last_updated = "2025-05-20"
attachment = true
reasoning = true
temperature = true
knowledge = "2025-01"
tool_call = true
structured_output = true
open_weights = false
[cost]
input = 0.15
output = 0.60
cache_read = 0.0375
[limit]
context = 1_048_576
output = 65_536
[modalities]
input = ["text", "image", "audio", "video", "pdf"]
output = ["text"]
@@ -1,25 +0,0 @@
name = "Gemini 2.5 Flash Preview 09-25"
family = "gemini-flash"
release_date = "2025-09-25"
last_updated = "2025-09-25"
attachment = true
reasoning = true
temperature = true
knowledge = "2025-01"
tool_call = true
structured_output = true
open_weights = false
[cost]
input = 0.30
output = 2.50
cache_read = 0.075
input_audio = 1.00
[limit]
context = 1_048_576
output = 65_536
[modalities]
input = ["text", "image", "audio", "video", "pdf"]
output = ["text"]
@@ -4,19 +4,19 @@ release_date = "2025-05-01"
last_updated = "2025-05-01"
attachment = false
reasoning = false
temperature = false
knowledge = "2025-01"
temperature = true
tool_call = false
knowledge = "2025-01"
open_weights = false
[cost]
input = 0.50
output = 10.00
input = 0.5
output = 10
[limit]
context = 8_000
output = 16_000
context = 8_192
output = 16_384
[modalities]
input = ["text"]
output = ["audio"]
output = ["audio"]
@@ -1,24 +0,0 @@
name = "Gemini 2.5 Pro Preview 05-06"
family = "gemini-pro"
release_date = "2025-05-06"
last_updated = "2025-05-06"
attachment = true
reasoning = true
temperature = true
knowledge = "2025-01"
tool_call = true
structured_output = true
open_weights = false
[cost]
input = 1.25
output = 10.00
cache_read = 0.31
[limit]
context = 1_048_576
output = 65_536
[modalities]
input = ["text", "image", "audio", "video", "pdf"]
output = ["text"]
@@ -1,24 +0,0 @@
name = "Gemini 2.5 Pro Preview 06-05"
family = "gemini-pro"
release_date = "2025-06-05"
last_updated = "2025-06-05"
attachment = true
reasoning = true
temperature = true
knowledge = "2025-01"
tool_call = true
structured_output = true
open_weights = false
[cost]
input = 1.25
output = 10.00
cache_read = 0.31
[limit]
context = 1_048_576
output = 65_536
[modalities]
input = ["text", "image", "audio", "video", "pdf"]
output = ["text"]
@@ -4,19 +4,19 @@ release_date = "2025-05-01"
last_updated = "2025-05-01"
attachment = false
reasoning = false
temperature = false
knowledge = "2025-01"
temperature = true
tool_call = false
knowledge = "2025-01"
open_weights = false
[cost]
input = 1.00
output = 20.00
input = 1
output = 20
[limit]
context = 8_000
output = 16_000
context = 8_192
output = 16_384
[modalities]
input = ["text"]
output = ["audio"]
output = ["audio"]
@@ -0,0 +1,17 @@
name = "Nano Banana Pro"
family = "gemini-pro"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = false
reasoning = true
temperature = true
tool_call = false
open_weights = false
[limit]
context = 131_072
output = 32_768
[modalities]
input = ["text"]
output = ["text"]
@@ -11,19 +11,19 @@ knowledge = "2025-01"
open_weights = false
[cost]
input = 2.00
output = 12.00
cache_read = 0.20
input = 2
output = 12
cache_read = 0.2
[[cost.tiers]]
tier = { size = 200_000 }
input = 4.00
output = 18.00
cache_read = 0.40
input = 4
output = 18
cache_read = 0.4
[limit]
context = 1000000
output = 64000
context = 1_048_576
output = 65_536
[modalities]
input = ["text", "image", "video", "audio", "pdf"]
@@ -1,21 +1,21 @@
name = "Gemini 3.1 Flash Image (Preview)"
name = "Nano Banana 2"
family = "gemini-flash"
release_date = "2026-02-26"
last_updated = "2026-02-26"
attachment = true
reasoning = true
temperature = true
knowledge = "2025-01"
tool_call = false
knowledge = "2025-01"
open_weights = false
[cost]
input = 0.50
output = 60.00
input = 0.5
output = 60
[limit]
context = 131_072
output = 32_768
context = 65_536
output = 65_536
[modalities]
input = ["text", "image", "pdf"]
@@ -0,0 +1,17 @@
name = "Gemini 3.1 Flash Live Preview"
family = "gemini-flash"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = true
reasoning = false
temperature = true
tool_call = false
open_weights = false
[limit]
context = 131_072
output = 65_536
[modalities]
input = ["text", "image", "audio", "video"]
output = ["text", "audio"]
@@ -0,0 +1,17 @@
name = "Gemini 3.1 Flash TTS EAP"
family = "gemini-flash"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = false
reasoning = true
temperature = true
tool_call = false
open_weights = false
[limit]
context = 8_192
output = 16_384
[modalities]
input = ["text"]
output = ["audio"]
@@ -0,0 +1,17 @@
name = "Gemini 3.1 Flash TTS Preview"
family = "gemini-flash"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = false
reasoning = true
temperature = true
tool_call = false
open_weights = false
[limit]
context = 8_192
output = 16_384
[modalities]
input = ["text"]
output = ["audio"]
@@ -5,17 +5,17 @@ last_updated = "2025-05-20"
attachment = false
reasoning = false
temperature = false
knowledge = "2025-05"
tool_call = false
knowledge = "2025-05"
open_weights = false
[cost]
input = 0.15
output = 0.00
output = 0
[limit]
context = 2_048
output = 3_072
output = 1
[modalities]
input = ["text"]
@@ -0,0 +1,17 @@
name = "Gemini Embedding 2 Preview"
family = "gemini-embedding"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = false
reasoning = false
temperature = false
tool_call = false
open_weights = false
[limit]
context = 8_192
output = 1
[modalities]
input = ["text"]
output = ["text"]
@@ -0,0 +1,17 @@
name = "Gemini Embedding 2"
family = "gemini-embedding"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = false
reasoning = false
temperature = false
tool_call = false
open_weights = false
[limit]
context = 8_192
output = 1
[modalities]
input = ["text"]
output = ["text"]
@@ -1,24 +0,0 @@
name = "Gemini Live 2.5 Flash Preview Native Audio"
family = "gemini-flash"
release_date = "2025-06-17"
last_updated = "2025-09-18"
attachment = false
reasoning = true
temperature = false
knowledge = "2025-01"
tool_call = true
open_weights = false
[cost]
input = 0.50
output = 2.00
input_audio = 3.00
output_audio = 12.00
[limit]
context = 131_072
output = 65_536
[modalities]
input = ["text", "audio", "video"]
output = ["text", "audio"]
@@ -1,24 +0,0 @@
name = "Gemini Live 2.5 Flash"
family = "gemini-flash"
release_date = "2025-09-01"
last_updated = "2025-09-01"
attachment = true
reasoning = true
temperature = true
knowledge = "2025-01"
tool_call = true
open_weights = false
[cost]
input = 0.50
output = 2.00
input_audio = 3.00
output_audio = 12.00
[limit]
context = 128_000
output = 8_000
[modalities]
input = ["text", "image", "audio", "video"]
output = ["text", "audio"]
@@ -0,0 +1,17 @@
name = "Gemini Pro Latest"
family = "gemini-pro"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = false
reasoning = true
temperature = true
tool_call = false
open_weights = false
[limit]
context = 1_048_576
output = 65_536
[modalities]
input = ["text"]
output = ["text"]
@@ -0,0 +1,17 @@
name = "Gemini Robotics-ER 1.5 Preview"
family = "gemini"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = false
reasoning = true
temperature = true
tool_call = false
open_weights = false
[limit]
context = 1_048_576
output = 65_536
[modalities]
input = ["text"]
output = ["text"]
@@ -0,0 +1,17 @@
name = "Gemini Robotics-ER 1.6 Preview"
family = "gemini"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = false
reasoning = true
temperature = true
tool_call = false
open_weights = false
[limit]
context = 131_072
output = 65_536
[modalities]
input = ["text"]
output = ["text"]
@@ -1,23 +0,0 @@
name = "Gemma 3 12B"
family = "gemma"
release_date = "2025-03-13"
last_updated = "2025-03-13"
attachment = true
reasoning = false
temperature = true
knowledge = "2024-10"
tool_call = false
structured_output = true
open_weights = true
[cost]
input = 0
output = 0
[limit]
context = 32_768
output = 8_192
[modalities]
input = ["text", "image"]
output = ["text"]
@@ -1,23 +0,0 @@
name = "Gemma 3 27B"
family = "gemma"
release_date = "2025-03-12"
last_updated = "2025-03-12"
attachment = true
reasoning = false
temperature = true
knowledge = "2024-10"
tool_call = true
structured_output = true
open_weights = true
[cost]
input = 0
output = 0
[limit]
context = 131_072
output = 8_192
[modalities]
input = ["text", "image"]
output = ["text"]
@@ -1,22 +0,0 @@
name = "Gemma 3 4B"
family = "gemma"
release_date = "2025-03-13"
last_updated = "2025-03-13"
attachment = true
reasoning = false
temperature = true
knowledge = "2024-10"
tool_call = false
open_weights = true
[cost]
input = 0
output = 0
[limit]
context = 32_768
output = 8_192
[modalities]
input = ["text", "image"]
output = ["text"]
@@ -1,22 +0,0 @@
name = "Gemma 3n 2B"
family = "gemma"
release_date = "2025-07-09"
last_updated = "2025-07-09"
attachment = true
reasoning = false
temperature = true
knowledge = "2024-10"
tool_call = false
open_weights = true
[cost]
input = 0
output = 0
[limit]
context = 8_192
output = 2_000
[modalities]
input = ["text"]
output = ["text"]
@@ -1,22 +0,0 @@
name = "Gemma 3n 4B"
family = "gemma"
release_date = "2025-05-20"
last_updated = "2025-05-20"
attachment = true
reasoning = false
temperature = true
knowledge = "2024-10"
tool_call = false
open_weights = true
[cost]
input = 0
output = 0
[limit]
context = 8_192
output = 2_000
[modalities]
input = ["text"]
output = ["text"]
@@ -1,8 +1,8 @@
name = "Gemma 4 26B"
name = "Gemma 4 26B A4B IT"
family = "gemma"
release_date = "2026-04-02"
last_updated = "2026-04-02"
attachment = false
attachment = true
reasoning = true
temperature = true
tool_call = true
@@ -10,8 +10,8 @@ structured_output = true
open_weights = true
[limit]
context = 256000
output = 8192
context = 262_144
output = 32_768
[modalities]
input = ["text", "image"]
+4 -4
View File
@@ -1,8 +1,8 @@
name = "Gemma 4 31B"
name = "Gemma 4 31B IT"
family = "gemma"
release_date = "2026-04-02"
last_updated = "2026-04-02"
attachment = false
attachment = true
reasoning = true
temperature = true
tool_call = true
@@ -10,8 +10,8 @@ structured_output = true
open_weights = true
[limit]
context = 256000
output = 8192
context = 262_144
output = 32_768
[modalities]
input = ["text", "image"]
@@ -0,0 +1,17 @@
name = "Imagen 4 Fast"
family = "imagen"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = false
reasoning = false
temperature = false
tool_call = false
open_weights = false
[limit]
context = 480
output = 8_192
[modalities]
input = ["text"]
output = ["image"]
@@ -0,0 +1,17 @@
name = "Imagen 4"
family = "imagen"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = false
reasoning = false
temperature = false
tool_call = false
open_weights = false
[limit]
context = 480
output = 8_192
[modalities]
input = ["text"]
output = ["image"]
@@ -0,0 +1,17 @@
name = "Imagen 4 Ultra"
family = "imagen"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = false
reasoning = false
temperature = false
tool_call = false
open_weights = false
[limit]
context = 480
output = 8_192
[modalities]
input = ["text"]
output = ["image"]
@@ -0,0 +1,17 @@
name = "Lyria 3 Clip Preview"
family = "lyria"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = false
reasoning = false
temperature = true
tool_call = false
open_weights = false
[limit]
context = 1_048_576
output = 65_536
[modalities]
input = ["text"]
output = ["audio"]
@@ -0,0 +1,17 @@
name = "Lyria 3 Pro Preview"
family = "gemini-pro"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = false
reasoning = false
temperature = true
tool_call = false
open_weights = false
[limit]
context = 1_048_576
output = 65_536
[modalities]
input = ["text"]
output = ["audio"]
@@ -0,0 +1,17 @@
name = "Nano Banana Pro"
family = "gemini-pro"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = false
reasoning = true
temperature = true
tool_call = false
open_weights = false
[limit]
context = 131_072
output = 32_768
[modalities]
input = ["text"]
output = ["text"]
@@ -0,0 +1,17 @@
name = "Veo 2"
family = "veo"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = true
reasoning = false
temperature = false
tool_call = false
open_weights = false
[limit]
context = 480
output = 8_192
[modalities]
input = ["text", "image"]
output = ["video"]
@@ -0,0 +1,17 @@
name = "Veo 3 fast"
family = "veo"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = true
reasoning = false
temperature = false
tool_call = false
open_weights = false
[limit]
context = 480
output = 8_192
[modalities]
input = ["text", "image"]
output = ["video"]
@@ -0,0 +1,17 @@
name = "Veo 3"
family = "veo"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = true
reasoning = false
temperature = false
tool_call = false
open_weights = false
[limit]
context = 480
output = 8_192
[modalities]
input = ["text", "image"]
output = ["video"]
@@ -0,0 +1,17 @@
name = "Veo 3.1 fast"
family = "veo"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = true
reasoning = false
temperature = false
tool_call = false
open_weights = false
[limit]
context = 480
output = 8_192
[modalities]
input = ["text", "image"]
output = ["video"]
@@ -0,0 +1,17 @@
name = "Veo 3.1"
family = "veo"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = true
reasoning = false
temperature = false
tool_call = false
open_weights = false
[limit]
context = 480
output = 8_192
[modalities]
input = ["text", "image"]
output = ["video"]
@@ -0,0 +1,17 @@
name = "Veo 3.1 lite"
family = "veo"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = true
reasoning = false
temperature = false
tool_call = false
open_weights = false
[limit]
context = 480
output = 8_192
[modalities]
input = ["text", "image"]
output = ["video"]
+16
View File
@@ -0,0 +1,16 @@
name = "Waverunner Agent"
release_date = "2026-05-19"
last_updated = "2026-05-19"
attachment = false
reasoning = false
temperature = false
tool_call = false
open_weights = false
[limit]
context = 131_072
output = 65_536
[modalities]
input = ["text"]
output = ["text"]
+1 -1
View File
@@ -1,4 +1,4 @@
name = "Google"
env = ["GOOGLE_GENERATIVE_AI_API_KEY", "GEMINI_API_KEY"]
env = ["GOOGLE_API_KEY", "GOOGLE_GENERATIVE_AI_API_KEY", "GEMINI_API_KEY"]
npm = "@ai-sdk/google"
doc = "https://ai.google.dev/gemini-api/docs/models"
@@ -1,2 +0,0 @@
[extends]
from = "google/gemini-2.5-flash-lite-preview-09-2025"
@@ -1,2 +0,0 @@
[extends]
from = "google/gemma-3-12b-it"
@@ -1,2 +0,0 @@
[extends]
from = "google/gemma-3-4b-it"
@@ -1,2 +0,0 @@
[extends]
from = "google/gemma-3n-e2b-it"
@@ -1,2 +0,0 @@
[extends]
from = "google/gemma-3n-e4b-it"
+13 -1
View File
@@ -4,12 +4,14 @@ TODO: delete
Model syncs are centralized in `packages/core/script/sync-models.ts`. The runner owns file IO, TOML formatting, validation, reporting, dry runs, and deletion behavior. Individual provider sync modules only fetch source data, parse it, and translate each source model into the catalog schema.
The current grouped sync target is `aggregators`, which runs OpenRouter only.
The grouped sync targets are `aggregators`, which runs OpenRouter, and `direct`, which runs direct provider APIs like Google.
## Commands
- `bun models:sync aggregators` syncs every provider in the `aggregators` group.
- `bun models:sync openrouter` syncs only OpenRouter.
- `bun models:sync direct` syncs every provider in the `direct` group.
- `bun models:sync google` syncs only Google.
- `bun models:sync aggregators --dry-run` prints changes without writing model files.
- `bun models:sync aggregators --new-only` creates new model files but skips updates and removals.
- `bun validate` validates the generated catalog after a sync.
@@ -108,6 +110,16 @@ OpenRouter is implemented in `packages/core/script/sync/openrouter.ts`.
- `structured_output` comes from `supported_parameters.includes("structured_outputs")` only.
- Existing `status`, `interleaved`, `knowledge`, `limit.input`, and `cost.tiers` may be preserved when OpenRouter is not authoritative enough for those fields.
## Google Notes
Google is implemented in `packages/core/script/sync/google.ts`.
- Source endpoint: `https://generativelanguage.googleapis.com/v1beta/models`.
- Required auth: `GOOGLE_API_KEY`, `GEMINI_API_KEY`, or `GOOGLE_GENERATIVE_AI_API_KEY`.
- Model IDs are derived from the `models/{model}` resource names.
- The API is authoritative for the model list, display names, token limits, supported methods, temperature metadata, and the `thinking` flag when present.
- Existing pricing, knowledge cutoff, release date, modalities, tool calling, structured output, status, and interleaved metadata may be preserved when the Google API is not authoritative enough for those fields.
## Vercel Status
Vercel is intentionally not wired into `bun models:sync` right now. Keep using the existing `vercel:generate` script until Vercel sync behavior is redesigned and reviewed separately.