From 602f897c50ee874bcd3b1b79012020070f5240cc Mon Sep 17 00:00:00 2001 From: backryun Date: Mon, 11 May 2026 11:47:20 +0900 Subject: [PATCH] fix: remove duplicate cloud agent provider constants (#2141) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Integrated into release/v3.8.0 — Kiro model alias normalization (dash→dot), trimmed duplicate catalog entries, and new tests. --- open-sse/config/providerRegistry.ts | 12 +----- open-sse/services/model.ts | 7 ++++ src/i18n/messages/en.json | 1 + src/shared/constants/providers.ts | 44 --------------------- tests/unit/model-cross-proxy-compat.test.ts | 14 +++++++ tests/unit/provider-models-config.test.ts | 3 ++ 6 files changed, 26 insertions(+), 55 deletions(-) diff --git a/open-sse/config/providerRegistry.ts b/open-sse/config/providerRegistry.ts index f365a290e4..a483cadd55 100644 --- a/open-sse/config/providerRegistry.ts +++ b/open-sse/config/providerRegistry.ts @@ -593,20 +593,10 @@ export const REGISTRY: Record = { { id: "auto-kiro", name: "Auto (Kiro picks best model)" }, { id: "claude-opus-4.7", name: "Claude Opus 4.7" }, { id: "claude-opus-4.6", name: "Claude Opus 4.6" }, - { id: "claude-opus-4.5", name: "Claude Opus 4.5" }, { id: "claude-sonnet-4.6", name: "Claude Sonnet 4.6" }, + // models for kiro free tier { id: "claude-sonnet-4.5", name: "Claude Sonnet 4.5" }, - { id: "claude-sonnet-4", name: "Claude Sonnet 4" }, { id: "claude-haiku-4.5", name: "Claude Haiku 4.5" }, - { id: "claude-3.7-sonnet", name: "Claude 3.7 Sonnet" }, - // Dash aliases — Claude Code sends dashes, Kiro API uses dots - { id: "claude-opus-4-7", name: "Claude Opus 4.7" }, - { id: "claude-opus-4-6", name: "Claude Opus 4.6" }, - { id: "claude-opus-4-5", name: "Claude Opus 4.5" }, - { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6" }, - { id: "claude-sonnet-4-5", name: "Claude Sonnet 4.5" }, - { id: "claude-haiku-4-5", name: "Claude Haiku 4.5" }, - // Non-Claude models on Kiro subscription { id: "deepseek-3.2", name: "DeepSeek V3.2" }, { id: "minimax-m2.5", name: "MiniMax M2.5" }, { id: "minimax-m2.1", name: "MiniMax M2.1" }, diff --git a/open-sse/services/model.ts b/open-sse/services/model.ts index d66ae5dcc6..d3b1210dcf 100644 --- a/open-sse/services/model.ts +++ b/open-sse/services/model.ts @@ -55,6 +55,13 @@ const PROVIDER_MODEL_ALIASES: ProviderModelAliasMap = { "nvidia/gpt-oss-20b": "openai/gpt-oss-20b", }, antigravity: { ...ANTIGRAVITY_MODEL_ALIASES }, + kiro: { + "claude-opus-4-7": "claude-opus-4.7", + "claude-opus-4-6": "claude-opus-4.6", + "claude-sonnet-4-6": "claude-sonnet-4.6", + "claude-sonnet-4-5": "claude-sonnet-4.5", + "claude-haiku-4-5": "claude-haiku-4.5", + }, }; const CROSS_PROXY_MODEL_ALIASES: Record = { diff --git a/src/i18n/messages/en.json b/src/i18n/messages/en.json index 6d47235d8c..e930e685d8 100644 --- a/src/i18n/messages/en.json +++ b/src/i18n/messages/en.json @@ -2984,6 +2984,7 @@ "apikey": "Apikey", "audio": "Audio", "audioProvidersHeading": "Audio Providers Heading", + "cloudAgentProviders": "Cloud Agent Providers", "audioShortLabel": "Audio Short Label", "azureOpenAiBaseUrlHint": "Azure Open Ai Base Url Hint", "bailianBaseUrlHint": "Bailian Base Url Hint", diff --git a/src/shared/constants/providers.ts b/src/shared/constants/providers.ts index 2cf47a5798..0a8b74a79b 100644 --- a/src/shared/constants/providers.ts +++ b/src/shared/constants/providers.ts @@ -1913,37 +1913,6 @@ export function isSelfHostedChatProvider(providerId: unknown): boolean { return typeof providerId === "string" && SELF_HOSTED_CHAT_PROVIDER_IDS.has(providerId); } -// ── Cloud Agent Providers ─────────────────────────────────────────────────── -export const CLOUD_AGENT_PROVIDERS = { - jules: { - id: "jules", - alias: "jules", - name: "Jules", - icon: "engineering", - color: "#EAB308", - textIcon: "JU", - website: "https://jules.google.com", - }, - devin: { - id: "devin", - alias: "devin", - name: "Devin", - icon: "smart_toy", - color: "#2563EB", - textIcon: "DV", - website: "https://devin.ai", - }, - "codex-cloud": { - id: "codex-cloud", - alias: "codex-cloud", - name: "Codex Cloud", - icon: "code", - color: "#10B981", - textIcon: "CX", - website: "https://chatgpt.com/codex", - }, -}; - // ── System Providers (virtual, not user-connectable) ────────────────────────── export const SYSTEM_PROVIDERS = { auto: { @@ -1958,19 +1927,6 @@ export const SYSTEM_PROVIDERS = { }, }; -// Cloud Agent Providers -export const CLOUD_AGENT_PROVIDERS = { - jules: { id: "jules", alias: "jules", name: "Jules AI", icon: "smart_toy", color: "#6366F1" }, - devin: { id: "devin", alias: "devin", name: "Devin AI", icon: "auto_fix_high", color: "#10B981" }, - "codex-cloud": { - id: "codex-cloud", - alias: "codex-cloud", - name: "Codex Cloud", - icon: "cloud", - color: "#3B82F6", - }, -}; - // All providers (combined) export const AI_PROVIDERS = { ...FREE_PROVIDERS, diff --git a/tests/unit/model-cross-proxy-compat.test.ts b/tests/unit/model-cross-proxy-compat.test.ts index 70dff4f056..f1553418e5 100644 --- a/tests/unit/model-cross-proxy-compat.test.ts +++ b/tests/unit/model-cross-proxy-compat.test.ts @@ -50,3 +50,17 @@ test("explicit provider routes can still normalize cross-proxy model dialects", extendedContext: false, }); }); + +test("Kiro Claude Code-style model aliases resolve without polluting the visible catalog", async () => { + assert.deepEqual(await getModelInfoCore("kr/claude-opus-4-7", {}), { + provider: "kiro", + model: "claude-opus-4.7", + extendedContext: false, + }); + + assert.deepEqual(await getModelInfoCore("kiro/claude-sonnet-4-6", {}), { + provider: "kiro", + model: "claude-sonnet-4.6", + extendedContext: false, + }); +}); diff --git a/tests/unit/provider-models-config.test.ts b/tests/unit/provider-models-config.test.ts index 5149eaa5d4..b4f9a65fba 100644 --- a/tests/unit/provider-models-config.test.ts +++ b/tests/unit/provider-models-config.test.ts @@ -84,4 +84,7 @@ test("Kiro registry exposes the current CLI model lineup with context windows", assert.equal(byId.get("claude-opus-4.7")?.contextLength, undefined); // Uses default assert.ok(byId.has("claude-sonnet-4.6")); assert.ok(byId.has("claude-haiku-4.5")); + assert.equal(byId.has("claude-opus-4-7"), false); + assert.equal(byId.has("claude-sonnet-4-6"), false); + assert.equal(byId.has("claude-haiku-4-5"), false); });