diff --git a/.changeset/openai-gpt-5-6-byok.md b/.changeset/openai-gpt-5-6-byok.md new file mode 100644 index 0000000000..ed92b6c80e --- /dev/null +++ b/.changeset/openai-gpt-5-6-byok.md @@ -0,0 +1,16 @@ +--- +"@mcpjam/inspector": patch +--- + +GPT-5.6 is selectable with your own OpenAI key. + +The BYOK OpenAI rows are hand-maintained and had stopped at GPT-5.1 while the +hosted catalog was already serving `gpt-5.6-luna`, `-sol` and `-terra`, so a +user with a valid key could not pick the models MCPJam already serves for free. +All three now lead the OpenAI group, with the 1,050,000-token context the +catalog reports. + +Token counting maps them to GPT-5, the closest id ai-tokenizer knows; an +approximate count beats dropping to the character-based fallback. Temperature +needed no new handling — the `gpt-5` carve-out in `modelSupportsTemperature` +already matches these ids, so the field is omitted rather than sent. diff --git a/mcpjam-inspector/server/utils/tokenizer-helpers.ts b/mcpjam-inspector/server/utils/tokenizer-helpers.ts index aa5ca74a2c..2de3650dc1 100644 --- a/mcpjam-inspector/server/utils/tokenizer-helpers.ts +++ b/mcpjam-inspector/server/utils/tokenizer-helpers.ts @@ -48,6 +48,9 @@ const MODEL_ID_MAPPINGS: Record = { "gpt-5.1-codex-mini": "openai/gpt-5.1-codex-mini", "gpt-5.5": "openai/gpt-5", "openai/gpt-5.5": "openai/gpt-5", + "gpt-5.6-luna": "openai/gpt-5", // Map to closest available + "gpt-5.6-sol": "openai/gpt-5", + "gpt-5.6-terra": "openai/gpt-5", // DeepSeek models "deepseek-chat": "deepseek/deepseek-v3.1", diff --git a/mcpjam-inspector/shared/__tests__/types.test.ts b/mcpjam-inspector/shared/__tests__/types.test.ts index 685834aca8..bbdc7891f4 100644 --- a/mcpjam-inspector/shared/__tests__/types.test.ts +++ b/mcpjam-inspector/shared/__tests__/types.test.ts @@ -153,6 +153,17 @@ describe("MCPJam-provided model classification", () => { } }); + it("offers the current OpenAI models to BYOK keys", () => { + // BYOK rows are hand-maintained and had drifted to 5.1. See BACK2-714. + const openaiIds = SUPPORTED_MODELS.filter( + (m) => m.provider === "openai", + ).map((m) => String(m.id)); + + for (const id of ["gpt-5.6-luna", "gpt-5.6-sol", "gpt-5.6-terra"]) { + expect(openaiIds).toContain(id); + } + }); + it("reports no temperature support for the Anthropic rows that reject it", () => { // Fable 5, Opus 5, Opus 4.8/4.7 and Sonnet 5 answer a temperature with a // 400, so every one of these rows would fail on its first request while @@ -226,6 +237,7 @@ describe("modelSupportsTemperature", () => { it("still strips temperature for own-provider GPT-5 models", () => { expect(modelSupportsTemperature("gpt-5")).toBe(false); expect(modelSupportsTemperature("gpt-5.1-codex")).toBe(false); + expect(modelSupportsTemperature("gpt-5.6-luna")).toBe(false); }); it("strips temperature for a hosted GPT-5 too", () => { diff --git a/mcpjam-inspector/shared/types.ts b/mcpjam-inspector/shared/types.ts index 9e1c47dd1f..f1eb483768 100644 --- a/mcpjam-inspector/shared/types.ts +++ b/mcpjam-inspector/shared/types.ts @@ -359,6 +359,9 @@ export enum Model { GPT_5_1 = "gpt-5.1", GPT_5_1_CODEX = "gpt-5.1-codex", GPT_5_1_CODEX_MINI = "gpt-5.1-codex-mini", + GPT_5_6_LUNA = "gpt-5.6-luna", + GPT_5_6_SOL = "gpt-5.6-sol", + GPT_5_6_TERRA = "gpt-5.6-terra", GPT_3_5_TURBO = "gpt-3.5-turbo", DEEPSEEK_CHAT = "deepseek-chat", DEEPSEEK_REASONER = "deepseek-reasoner", @@ -454,6 +457,24 @@ export const SUPPORTED_MODELS: ModelDefinition[] = [ provider: "anthropic", contextLength: 200000, }, + { + id: Model.GPT_5_6_LUNA, + name: "GPT-5.6 Luna", + provider: "openai", + contextLength: 1050000, + }, + { + id: Model.GPT_5_6_SOL, + name: "GPT-5.6 Sol", + provider: "openai", + contextLength: 1050000, + }, + { + id: Model.GPT_5_6_TERRA, + name: "GPT-5.6 Terra", + provider: "openai", + contextLength: 1050000, + }, { id: Model.GPT_5_1, name: "GPT-5.1",