diff --git a/changelog.d/features/7209-kiro-gpt56-family.md b/changelog.d/features/7209-kiro-gpt56-family.md new file mode 100644 index 0000000000..eed9627975 --- /dev/null +++ b/changelog.d/features/7209-kiro-gpt56-family.md @@ -0,0 +1 @@ +- **feat(kiro):** register the GPT-5.6 Sol/Terra/Luna model family (272k context window). (thanks @SemonCat) diff --git a/open-sse/config/providers/registry/kiro/index.ts b/open-sse/config/providers/registry/kiro/index.ts index 71262a4f09..cda51e77c8 100644 --- a/open-sse/config/providers/registry/kiro/index.ts +++ b/open-sse/config/providers/registry/kiro/index.ts @@ -46,5 +46,26 @@ export const kiroProvider: RegistryEntry = { { id: "minimax-m2.1", name: "MiniMax M2.1" }, { id: "glm-5", name: "GLM-5" }, { id: "qwen3-coder-next", name: "Qwen3 Coder Next" }, + // Kiro's first OpenAI-family models (kiro.dev/changelog/models, 2026-07-14): + // three tiers — Sol (flagship), Terra (balanced mid-tier), Luna (fastest/ + // cheapest) — all sharing the announced 272k context window. + { + id: "gpt-5.6-sol", + name: "GPT-5.6 Sol", + contextLength: 272000, + maxOutputTokens: 128000, + }, + { + id: "gpt-5.6-terra", + name: "GPT-5.6 Terra", + contextLength: 272000, + maxOutputTokens: 128000, + }, + { + id: "gpt-5.6-luna", + name: "GPT-5.6 Luna", + contextLength: 272000, + maxOutputTokens: 128000, + }, ], }; diff --git a/src/shared/constants/pricing/oauth-subscriptions.ts b/src/shared/constants/pricing/oauth-subscriptions.ts index 19c1f2e991..43bf8385fb 100644 --- a/src/shared/constants/pricing/oauth-subscriptions.ts +++ b/src/shared/constants/pricing/oauth-subscriptions.ts @@ -592,5 +592,10 @@ export const DEFAULT_PRICING_OAUTH = { reasoning: 15.0, cache_creation: 3.0, }, + // Kiro's GPT-5.6 family (kiro.dev/changelog/models, 2026-07-14) — same + // per-tier rates the codex/openai aliases already bill at. + "gpt-5.6-sol": GPT_5_6_SOL_PRICING, + "gpt-5.6-terra": GPT_5_6_TERRA_PRICING, + "gpt-5.6-luna": GPT_5_6_LUNA_PRICING, }, }; diff --git a/tests/unit/kiro-catalog-real-models.test.ts b/tests/unit/kiro-catalog-real-models.test.ts index e896ca5e44..186684b81d 100644 --- a/tests/unit/kiro-catalog-real-models.test.ts +++ b/tests/unit/kiro-catalog-real-models.test.ts @@ -29,6 +29,11 @@ const REAL_KIRO_IDS = [ "minimax-m2.5", // proven 200 "minimax-m2.1", // proven 200 "qwen3-coder-next", // proven 200 + // Kiro's first OpenAI-family models, per kiro.dev/changelog/models + // (2026-07-14) — not yet independently live-VPS-verified like the ids above. + "gpt-5.6-sol", + "gpt-5.6-terra", + "gpt-5.6-luna", ]; test("kiro registry exposes no fabricated model ids", () => { diff --git a/tests/unit/kiro-gpt56-family-registration.test.ts b/tests/unit/kiro-gpt56-family-registration.test.ts new file mode 100644 index 0000000000..205b494316 --- /dev/null +++ b/tests/unit/kiro-gpt56-family-registration.test.ts @@ -0,0 +1,39 @@ +import test from "node:test"; +import assert from "node:assert/strict"; + +import { REGISTRY } from "@omniroute/open-sse/config/providers/index.ts"; + +const { getResolvedModelCapabilities } = await import("../../src/lib/modelCapabilities.ts"); + +// Kiro's first OpenAI-family models, announced 2026-07-14 +// (kiro.dev/changelog/models): GPT-5.6 Sol / Terra / Luna, all sharing a +// 272k context window and a 128k max-output budget on the Kiro backend. +const GPT_5_6_KIRO_MODELS = ["gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna"] as const; + +test("kiro registry exposes the GPT-5.6 Sol/Terra/Luna model ids", () => { + const ids = new Set((REGISTRY.kiro?.models || []).map((m) => m.id)); + for (const id of GPT_5_6_KIRO_MODELS) { + assert.ok(ids.has(id), `kiro registry must expose "${id}"`); + } +}); + +test("kiro GPT-5.6 models resolve the announced 272k context window", () => { + for (const model of GPT_5_6_KIRO_MODELS) { + const caps = getResolvedModelCapabilities({ provider: "kiro", model }); + assert.equal(caps.contextWindow, 272000, `${model} must resolve a 272k context window`); + } +}); + +test("kiro GPT-5.6 models resolve a 128k max output budget", () => { + for (const model of GPT_5_6_KIRO_MODELS) { + const caps = getResolvedModelCapabilities({ provider: "kiro", model }); + assert.equal(caps.maxOutputTokens, 128000, `${model} must resolve a 128k max output`); + } +}); + +test("kiro GPT-5.6 models resolve through the 'kr' provider alias too", () => { + for (const model of GPT_5_6_KIRO_MODELS) { + const caps = getResolvedModelCapabilities({ provider: "kr", model }); + assert.equal(caps.contextWindow, 272000, `${model} must resolve via the 'kr' alias`); + } +});