From e78b766a2095c8cebca185d936b73e3b36250637 Mon Sep 17 00:00:00 2001 From: semihisikman Date: Mon, 28 Sep 2026 13:00:01 +0700 Subject: [PATCH] feat(kiro): add claude-opus-5.5 models to registry and capabilities --- open-sse/providers/capabilities.js | 7 ++- open-sse/providers/registry/kiro.js | 8 ++- tests/unit/kiro-claude-opus-5-5.test.js | 77 +++++++++++++++++++++++++ 3 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 tests/unit/kiro-claude-opus-5-5.test.js diff --git a/open-sse/providers/capabilities.js b/open-sse/providers/capabilities.js index e3bb58ac..79aee774 100644 --- a/open-sse/providers/capabilities.js +++ b/open-sse/providers/capabilities.js @@ -83,8 +83,13 @@ export function capabilitiesFromServiceKind(kind) { * otherwise mis-match. Only declare deltas vs DEFAULT. */ export const MODEL_CAPABILITIES = { - // Claude Fable 5.1, Opus 5, 4.6/4.7/4.8, and Kiro Sonnet 5 have 1M context + adaptive thinking (override generic claude pattern) + // Claude Fable 5.1, Opus 5.5/5, 4.6/4.7/4.8, and Kiro Sonnet 5 have 1M context + adaptive thinking (override generic claude pattern) "claude-fable-5-1": { vision: true, reasoning: true, search: true, thinkingFormat: "claude-adaptive", thinkingCanDisable: false, contextWindow: 1000000, maxOutput: 128000 }, + // Claude Opus 5.5 — experimental preview on Kiro (rateMultiplier: 2.0, 1M context) (#4410) + "claude-opus-5.5": { vision: true, reasoning: true, search: true, thinkingFormat: "claude-adaptive", contextWindow: 1000000, maxOutput: 128000 }, + "claude-opus-5.5-thinking": { vision: true, reasoning: true, search: true, thinkingFormat: "claude-adaptive", contextWindow: 1000000, maxOutput: 128000 }, + "claude-opus-5.5-agentic": { vision: true, reasoning: true, search: true, thinkingFormat: "claude-adaptive", contextWindow: 1000000, maxOutput: 128000 }, + "claude-opus-5.5-thinking-agentic": { vision: true, reasoning: true, search: true, thinkingFormat: "claude-adaptive", contextWindow: 1000000, maxOutput: 128000 }, "claude-opus-5": { vision: true, reasoning: true, search: true, thinkingFormat: "claude-adaptive", contextWindow: 1000000, maxOutput: 128000 }, "claude-opus-5-thinking": { vision: true, reasoning: true, search: true, thinkingFormat: "claude-adaptive", contextWindow: 1000000, maxOutput: 128000 }, "claude-opus-5-agentic": { vision: true, reasoning: true, search: true, thinkingFormat: "claude-adaptive", contextWindow: 1000000, maxOutput: 128000 }, diff --git a/open-sse/providers/registry/kiro.js b/open-sse/providers/registry/kiro.js index f506b8d4..224cf801 100644 --- a/open-sse/providers/registry/kiro.js +++ b/open-sse/providers/registry/kiro.js @@ -41,7 +41,13 @@ export default { }, }, models: [ - // Opus (added per kiro.dev/changelog/models and kiro.dev/docs/models) + // Opus 5.5 — experimental preview, 1M context, 2x credits (#4410) + // Announced 2026-09-22; confirmed in kiro.dev session UI. + { id: "claude-opus-5.5", name: "Claude Opus 5.5" }, + { id: "claude-opus-5.5-thinking", name: "Claude Opus 5.5 (Thinking)" }, + { id: "claude-opus-5.5-agentic", name: "Claude Opus 5.5 (Agentic)" }, + { id: "claude-opus-5.5-thinking-agentic", name: "Claude Opus 5.5 (Thinking + Agentic)" }, + // Opus 5 { id: "claude-opus-5", name: "Claude Opus 5" }, { id: "claude-opus-5-thinking", name: "Claude Opus 5 (Thinking)" }, { id: "claude-opus-5-agentic", name: "Claude Opus 5 (Agentic)" }, diff --git a/tests/unit/kiro-claude-opus-5-5.test.js b/tests/unit/kiro-claude-opus-5-5.test.js new file mode 100644 index 00000000..91603295 --- /dev/null +++ b/tests/unit/kiro-claude-opus-5-5.test.js @@ -0,0 +1,77 @@ +/** + * Tests for #4410 — Kiro registry missing claude-opus-5.5 models. + * + * Kiro added Claude Opus 5.5 as an experimental preview on 2026-09-22. + * The model was missing from open-sse/providers/registry/kiro.js and + * open-sse/providers/capabilities.js. + * + * Fix: + * - Add claude-opus-5.5 / -thinking / -agentic / -thinking-agentic to kiro.js + * - Add capability entries (vision, reasoning, search, 1M context, adaptive thinking) + */ + +import { describe, it, expect } from "vitest"; +import { getCapabilitiesForModel } from "../../open-sse/providers/capabilities.js"; +import fs from "fs"; +import path from "path"; + +const kiroSrc = fs.readFileSync( + new URL("../../open-sse/providers/registry/kiro.js", import.meta.url), + "utf-8" +); + +describe("Kiro registry — claude-opus-5.5 (#4410)", () => { + it("includes claude-opus-5.5 in kiro registry", () => { + expect(kiroSrc).toContain('"claude-opus-5.5"'); + }); + + it("includes claude-opus-5.5-thinking in kiro registry", () => { + expect(kiroSrc).toContain('"claude-opus-5.5-thinking"'); + }); + + it("includes claude-opus-5.5-agentic in kiro registry", () => { + expect(kiroSrc).toContain('"claude-opus-5.5-agentic"'); + }); + + it("includes claude-opus-5.5-thinking-agentic in kiro registry", () => { + expect(kiroSrc).toContain('"claude-opus-5.5-thinking-agentic"'); + }); + + it("claude-opus-5 still present (regression guard)", () => { + expect(kiroSrc).toContain('"claude-opus-5"'); + }); +}); + +describe("capabilities — claude-opus-5.5 (#4410)", () => { + it("claude-opus-5.5 has vision:true", () => { + const caps = getCapabilitiesForModel("kiro", "claude-opus-5.5"); + expect(caps.vision).toBe(true); + }); + + it("claude-opus-5.5 has reasoning:true", () => { + const caps = getCapabilitiesForModel("kiro", "claude-opus-5.5"); + expect(caps.reasoning).toBe(true); + }); + + it("claude-opus-5.5 has contextWindow 1M", () => { + const caps = getCapabilitiesForModel("kiro", "claude-opus-5.5"); + expect(caps.contextWindow).toBe(1000000); + }); + + it("claude-opus-5.5 has maxOutput 128000", () => { + const caps = getCapabilitiesForModel("kiro", "claude-opus-5.5"); + expect(caps.maxOutput).toBe(128000); + }); + + it("claude-opus-5.5-thinking has same capabilities", () => { + const caps = getCapabilitiesForModel("kiro", "claude-opus-5.5-thinking"); + expect(caps.vision).toBe(true); + expect(caps.reasoning).toBe(true); + expect(caps.contextWindow).toBe(1000000); + }); + + it("claude-opus-5 still has 1M context (regression guard)", () => { + const caps = getCapabilitiesForModel("kiro", "claude-opus-5"); + expect(caps.contextWindow).toBe(1000000); + }); +}); \ No newline at end of file