feat(kiro): register GPT-5.6 Sol/Terra/Luna model family (#7209)

* 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 <gn00742754@gmail.com>
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 <gn00742754@gmail.com>
This commit is contained in:
Diego Rodrigues de Sa e Souza
2026-07-17 10:39:42 -03:00
committed by GitHub
parent 205361a850
commit 2dc4a92be7
5 changed files with 71 additions and 0 deletions

View File

@@ -0,0 +1 @@
- **feat(kiro):** register the GPT-5.6 Sol/Terra/Luna model family (272k context window). (thanks @SemonCat)

View File

@@ -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,
},
],
};

View File

@@ -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,
},
};

View File

@@ -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", () => {

View File

@@ -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`);
}
});