From 2dc4a92be70e045d85fe2ff960b72d96f432fe37 Mon Sep 17 00:00:00 2001 From: Diego Rodrigues de Sa e Souza <8016841+diegosouzapw@users.noreply.github.com> Date: Fri, 17 Jul 2026 10:39:42 -0300 Subject: [PATCH] feat(kiro): register GPT-5.6 Sol/Terra/Luna model family (#7209) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(kiro): register GPT-5.6 Sol/Terra/Luna model family Kiro announced its first OpenAI-family models on 2026-07-14 (kiro.dev/changelog/models): GPT-5.6 Sol (flagship), Terra (balanced mid-tier) and Luna (fastest/cheapest), all sharing a 272k context window. Registers the three base model ids in the kiro provider registry with contextLength/maxOutputTokens so getResolvedModelCapabilities() resolves the real 272k window instead of falling back to the generic default. OmniRoute derives the thinking/agentic synthetic variants and per-account rate multipliers dynamically at discovery time (open-sse/services/kiroModels.ts), so only the three base entries need static registration here. Co-authored-by: Edison42 Inspired-by: https://github.com/decolua/9router/pull/2596 * chore(changelog): fragment for #7209 * fix(kiro): add GPT-5.6 Sol/Terra/Luna pricing rows The registry additions in this PR exposed three new Kiro model ids without matching pricing rows, tripping the catalog invariant that every Kiro registry model must resolve a non-zero pricing row (tests/unit/catalog-updates-v3x.test.ts) — the models would have billed at $0.00. Reuses the shared GPT_5_6_{SOL,TERRA,LUNA}_PRICING tiers already used by the codex and openai aliases. --------- Co-authored-by: Edison42 --- .../features/7209-kiro-gpt56-family.md | 1 + .../config/providers/registry/kiro/index.ts | 21 ++++++++++ .../constants/pricing/oauth-subscriptions.ts | 5 +++ tests/unit/kiro-catalog-real-models.test.ts | 5 +++ .../kiro-gpt56-family-registration.test.ts | 39 +++++++++++++++++++ 5 files changed, 71 insertions(+) create mode 100644 changelog.d/features/7209-kiro-gpt56-family.md create mode 100644 tests/unit/kiro-gpt56-family-registration.test.ts 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`); + } +});