feat: discover models from live provider catalogs (#112412)

* feat: discover models from live provider catalogs

* fix(provider-catalog): satisfy current catalog contracts

* fix(deps): update fast-uri past new advisory

* fix(deps): refresh fast-uri shrinkwraps

* fix(openrouter): satisfy provider catalog lint

* fix(agents): preserve refreshable catalog metadata

* test(agents): keep catalog fallback proof within lint budget

* fix(provider-catalog): honor live model contracts

* fix(minimax): type discovery headers explicitly

* docs(plugin-sdk): define live model discovery contract
This commit is contained in:
Jason (Json)
2026-07-21 19:29:57 -06:00
committed by GitHub
parent 0f066eec81
commit 55cf9523e0
88 changed files with 2031 additions and 144 deletions
+16 -2
View File
@@ -94,7 +94,9 @@ describe("opencode provider plugin", () => {
"claude-sonnet-4-5",
"claude-sonnet-4",
"claude-haiku-4-5",
"gemini-3.6-flash",
"gemini-3.5-flash",
"gemini-3.5-flash-lite",
"gemini-3.1-pro",
"gemini-3-flash",
"gpt-5.6-sol",
@@ -209,6 +211,18 @@ describe("opencode provider plugin", () => {
api: "google-generative-ai",
baseUrl: "https://opencode.ai/zen/v1",
});
expect(requireMapEntry(models, "gemini-3.6-flash")).toMatchObject({
name: "Gemini 3.6 Flash",
contextWindow: 1_048_576,
maxTokens: 65_536,
cost: { input: 1.5, output: 7.5, cacheRead: 0.15, cacheWrite: 0 },
});
expect(requireMapEntry(models, "gemini-3.5-flash-lite")).toMatchObject({
name: "Gemini 3.5 Flash-Lite",
contextWindow: 1_048_576,
maxTokens: 65_536,
cost: { input: 0.3, output: 2.5, cacheRead: 0.03, cacheWrite: 0 },
});
expect(requireMapEntry(models, "minimax-m2.7")).toMatchObject({
api: "openai-completions",
baseUrl: "https://opencode.ai/zen/v1",
@@ -459,7 +473,7 @@ describe("opencode provider plugin", () => {
throw new Error("expected OpenCode Zen static provider");
}
expect(result.provider.models).toHaveLength(55);
expect(result.provider.models).toHaveLength(57);
expect(result.provider.models.map((model) => model.id)).toContain("claude-opus-4-8");
expect(result.provider.models.map((model) => model.id)).toContain("claude-sonnet-5");
expect(result.provider.models.map((model) => model.id)).toContain("glm-5.2");
@@ -483,7 +497,7 @@ describe("opencode provider plugin", () => {
throw new Error("expected registered OpenCode Zen static provider");
}
expect(result.provider.models).toHaveLength(55);
expect(result.provider.models).toHaveLength(57);
expect(result.provider.models.map((model) => model.id)).toContain("claude-sonnet-5");
expect(result.provider.models.map((model) => model.id)).toContain("gpt-5.6-sol");
expect(result.provider.models.map((model) => model.id)).toContain("minimax-m3");
+6
View File
@@ -92,6 +92,8 @@ const MODEL_COSTS: Record<string, ModelDefinitionConfig["cost"]> = {
],
},
"gemini-3.5-flash": { input: 1.5, output: 9, cacheRead: 0.15, cacheWrite: 0 },
"gemini-3.5-flash-lite": { input: 0.3, output: 2.5, cacheRead: 0.03, cacheWrite: 0 },
"gemini-3.6-flash": { input: 1.5, output: 7.5, cacheRead: 0.15, cacheWrite: 0 },
"gpt-5.6-luna": {
input: 1,
output: 6,
@@ -204,6 +206,8 @@ const MODEL_NAMES: Record<string, string> = {
"gemini-3-flash": "Gemini 3 Flash",
"gemini-3.1-pro": "Gemini 3.1 Pro",
"gemini-3.5-flash": "Gemini 3.5 Flash",
"gemini-3.5-flash-lite": "Gemini 3.5 Flash-Lite",
"gemini-3.6-flash": "Gemini 3.6 Flash",
"gpt-5.6-luna": "GPT-5.6 Luna",
"gpt-5.6-sol": "GPT-5.6 Sol",
"gpt-5.6-terra": "GPT-5.6 Terra",
@@ -402,7 +406,9 @@ const OPENCODE_ZEN_MODELS = [
"claude-sonnet-4-5",
"claude-sonnet-4",
"claude-haiku-4-5",
"gemini-3.6-flash",
"gemini-3.5-flash",
"gemini-3.5-flash-lite",
"gemini-3.1-pro",
"gemini-3-flash",
"gpt-5.6-sol",