From 7a09d476c1d7afb9e3f30461370dec01a9ff9d2f Mon Sep 17 00:00:00 2001 From: Mikael Hugo Date: Thu, 30 Apr 2026 10:07:36 +0200 Subject: [PATCH] Block OpenRouter meta routes from model registry --- packages/pi-ai/scripts/generate-models.ts | 26 ++--------- packages/pi-ai/src/models.generated.test.ts | 12 +++-- packages/pi-ai/src/models.generated.ts | 51 --------------------- 3 files changed, 10 insertions(+), 79 deletions(-) diff --git a/packages/pi-ai/scripts/generate-models.ts b/packages/pi-ai/scripts/generate-models.ts index 039e45f05..6f5ccb8ec 100644 --- a/packages/pi-ai/scripts/generate-models.ts +++ b/packages/pi-ai/scripts/generate-models.ts @@ -65,6 +65,9 @@ async function fetchOpenRouterModels(): Promise[]> { const models: Model[] = []; for (const model of data.data) { + if (model.id === "openrouter/auto" || model.id === "openrouter/free") { + continue; + } // Only include models that support tools if (!model.supported_parameters?.includes("tools")) continue; @@ -1037,29 +1040,6 @@ async function generateModels() { }); } - // Add "auto" alias for openrouter/auto - if (!allModels.some(m => m.provider === "openrouter" && m.id === "auto")) { - allModels.push({ - id: "auto", - name: "Auto", - api: "openai-completions", - provider: "openrouter", - baseUrl: "https://openrouter.ai/api/v1", - reasoning: true, - input: ["text", "image"], - cost: { - // we dont know about the costs because OpenRouter auto routes to different models - // and then charges you for the underlying used model - input:0, - output:0, - cacheRead:0, - cacheWrite:0, - }, - contextWindow: 2000000, - maxTokens: 30000, - }); - } - // Google Cloud Code Assist models (Gemini CLI) — sourced from // @google/gemini-cli-core's VALID_GEMINI_MODELS so new models ship // automatically on `npm update @google/gemini-cli-core`. cli-core is diff --git a/packages/pi-ai/src/models.generated.test.ts b/packages/pi-ai/src/models.generated.test.ts index 7644e5ad8..ae7525cf1 100644 --- a/packages/pi-ai/src/models.generated.test.ts +++ b/packages/pi-ai/src/models.generated.test.ts @@ -216,13 +216,8 @@ describe("MODELS structural invariants", () => { }); it("every model has a cost object with non-negative numeric fields", () => { - const knownNegativeCostModels = new Set([ - "openrouter/openrouter/auto", - ]); - const invalid: string[] = []; for (const { providerKey, modelKey, model } of allModels()) { - if (knownNegativeCostModels.has(`${providerKey}/${modelKey}`)) continue; const cost = model["cost"] as Record | undefined; if (!cost || typeof cost !== "object") { invalid.push(`${providerKey}/${modelKey}: missing cost object`); @@ -238,6 +233,13 @@ describe("MODELS structural invariants", () => { assert.deepEqual(invalid, [], `Models with invalid cost fields:\n ${invalid.join("\n ")}`); }); + it("does not expose OpenRouter meta-router aliases as selectable models", () => { + const openrouterModels = MODELS["openrouter"] as Record; + for (const id of ["auto", "openrouter/auto", "openrouter/free"]) { + assert.equal(openrouterModels[id], undefined, `openrouter/${id} must be blocked`); + } + }); + it("no provider has duplicate model IDs", () => { const duplicates: string[] = []; for (const [providerKey, providerModels] of Object.entries(MODELS)) { diff --git a/packages/pi-ai/src/models.generated.ts b/packages/pi-ai/src/models.generated.ts index ac53a05cd..84d951fcb 100644 --- a/packages/pi-ai/src/models.generated.ts +++ b/packages/pi-ai/src/models.generated.ts @@ -7320,23 +7320,6 @@ export const MODELS = { contextWindow: 131072, maxTokens: 64000, } satisfies Model<"openai-completions">, - "auto": { - id: "auto", - name: "Auto", - api: "openai-completions", - provider: "openrouter", - baseUrl: "https://openrouter.ai/api/v1", - reasoning: true, - input: ["text", "image"], - cost: { - input: 0, - output: 0, - cacheRead: 0, - cacheWrite: 0, - }, - contextWindow: 2000000, - maxTokens: 30000, - } satisfies Model<"openai-completions">, "baidu/ernie-4.5-21b-a3b": { id: "baidu/ernie-4.5-21b-a3b", name: "Baidu: ERNIE 4.5 21B A3B", @@ -9700,23 +9683,6 @@ export const MODELS = { contextWindow: 200000, maxTokens: 100000, } satisfies Model<"openai-completions">, - "openrouter/auto": { - id: "openrouter/auto", - name: "Auto Router", - api: "openai-completions", - provider: "openrouter", - baseUrl: "https://openrouter.ai/api/v1", - reasoning: true, - input: ["text", "image"], - cost: { - input: -1000000, - output: -1000000, - cacheRead: 0, - cacheWrite: 0, - }, - contextWindow: 2000000, - maxTokens: 4096, - } satisfies Model<"openai-completions">, "openrouter/elephant-alpha": { id: "openrouter/elephant-alpha", name: "Elephant", @@ -9734,23 +9700,6 @@ export const MODELS = { contextWindow: 262144, maxTokens: 32768, } satisfies Model<"openai-completions">, - "openrouter/free": { - id: "openrouter/free", - name: "Free Models Router", - api: "openai-completions", - provider: "openrouter", - baseUrl: "https://openrouter.ai/api/v1", - reasoning: true, - input: ["text", "image"], - cost: { - input: 0, - output: 0, - cacheRead: 0, - cacheWrite: 0, - }, - contextWindow: 200000, - maxTokens: 4096, - } satisfies Model<"openai-completions">, "prime-intellect/intellect-3": { id: "prime-intellect/intellect-3", name: "Prime Intellect: INTELLECT-3",