// Probe 00: list models via REST (x-goog-api-key) and via SDK; dump per-model metadata. // Run: set -a; . ../../.env; set +a; npx tsx 00-models-list.ts import { GoogleGenAI } from "@google/genai"; import { writeFileSync } from "node:fs"; const key = process.env.GOOGLE_GEMINI_API_KEY!; if (!key) throw new Error("GOOGLE_GEMINI_API_KEY missing"); async function main() { // REST, paginated const all: any[] = []; let pageToken: string | undefined; do { const url = new URL("https://generativelanguage.googleapis.com/v1beta/models"); url.searchParams.set("pageSize", "1000"); if (pageToken) url.searchParams.set("pageToken", pageToken); const r = await fetch(url, { headers: { "x-goog-api-key": key } }); console.log("REST status", r.status, "headers:", Object.fromEntries([...r.headers.entries()].filter(([k]) => !/set-cookie/.test(k)))); const j = await r.json(); all.push(...(j.models ?? [])); pageToken = j.nextPageToken; } while (pageToken); writeFileSync("out/models.json", JSON.stringify(all, null, 2)); console.log("model count", all.length); const keys = new Set(); for (const m of all) Object.keys(m).forEach((k) => keys.add(k)); console.log("metadata fields seen:", [...keys].join(", ")); for (const m of all) { console.log( m.name.replace("models/", "").padEnd(48), String(m.inputTokenLimit).padStart(8), String(m.outputTokenLimit).padStart(7), (m.thinking ? "think" : " "), (m.supportedGenerationMethods ?? []).join("|"), `T=${m.temperature ?? "-"}/${m.maxTemperature ?? "-"} P=${m.topP ?? "-"} K=${m.topK ?? "-"}`, ); } // SDK const ai = new GoogleGenAI({ apiKey: key }); const pager = await ai.models.list({ config: { pageSize: 5 } }); let n = 0; for await (const m of pager) { n++; if (n === 1) console.log("SDK first model sample:", JSON.stringify(m)); if (n >= 5) break; } } main().catch((e) => { console.error("ERR", e?.message ?? e); process.exit(1); });