From b9e2611045b84441378402d770b275c2badda309 Mon Sep 17 00:00:00 2001 From: Rafli Ahmad Zulfikar Date: Fri, 10 Jul 2026 11:14:40 +0700 Subject: [PATCH] feat(providers): add max thinking level for gpt-5.6-sol (#2500) Expose max in the Codex thinking dropdown for gpt-5.6-sol only (maps to xhigh on wire; live probe rejected ultra). Include custom/kilo models when computing provider thinking options so manually added gpt-5.6-sol contributes its max level. Co-authored-by: Cursor --- open-sse/providers/thinkingLevels.js | 2 ++ .../dashboard/providers/[id]/page.js | 18 ++++++++++++---- tests/unit/thinking-levels-gpt56-sol.test.js | 21 +++++++++++++++++++ 3 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 tests/unit/thinking-levels-gpt56-sol.test.js diff --git a/open-sse/providers/thinkingLevels.js b/open-sse/providers/thinkingLevels.js index ab258836..ba998ee7 100644 --- a/open-sse/providers/thinkingLevels.js +++ b/open-sse/providers/thinkingLevels.js @@ -32,6 +32,8 @@ const FORMAT_LEVELS = { // Model-name pattern overrides (glob, first match wins) — more precise than format default. const PATTERN_THINKING = [ + // gpt-5.6-sol accepts max (maps to xhigh on wire); live probe rejected ultra. + { pattern: "*gpt-5.6-sol*", levels: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }, { pattern: "*codex*", levels: ["low", "medium", "high", "xhigh"] }, // codex cannot disable thinking ]; diff --git a/src/app/(dashboard)/dashboard/providers/[id]/page.js b/src/app/(dashboard)/dashboard/providers/[id]/page.js index 0b0061e6..07158ee4 100644 --- a/src/app/(dashboard)/dashboard/providers/[id]/page.js +++ b/src/app/(dashboard)/dashboard/providers/[id]/page.js @@ -156,17 +156,27 @@ export default function ProviderDetailPage() { const levels = getThinkingLevels(providerId, modelId); return levels && levels.includes(thinkingMode) ? thinkingMode : null; }; + const providerStorageAlias = isCompatible ? providerId : providerAlias; // Union of levels across this provider's reasoning models — drives the level picker options. + // Include custom models too (e.g. manually added gpt-5.6-sol → max). const providerThinkingLevels = (() => { const set = new Set(); - for (const m of models) { - const lv = getThinkingLevels(providerId, m.id); + const seen = new Set(); + const addLevels = (modelId) => { + if (!modelId || seen.has(modelId)) return; + seen.add(modelId); + const lv = getThinkingLevels(providerId, modelId); if (lv) lv.forEach((l) => { if (l !== "none") set.add(l); }); + }; + for (const m of models) addLevels(m.id); + for (const m of kiloFreeModels) addLevels(m.id); + for (const entry of customModels) { + if (entry.providerAlias !== providerStorageAlias) continue; + if ((entry.kind || entry.type || "llm") !== "llm") continue; + addLevels(entry.id); } return set.size ? ["auto", ...[...set]] : null; })(); - - const providerStorageAlias = isCompatible ? providerId : providerAlias; const providerDisplayAlias = isCompatible ? (providerNode?.prefix || providerId) : providerAlias; diff --git a/tests/unit/thinking-levels-gpt56-sol.test.js b/tests/unit/thinking-levels-gpt56-sol.test.js new file mode 100644 index 00000000..1a5a3ceb --- /dev/null +++ b/tests/unit/thinking-levels-gpt56-sol.test.js @@ -0,0 +1,21 @@ +import { describe, it, expect } from "vitest"; +import { getThinkingLevels } from "../../open-sse/providers/thinkingLevels.js"; + +describe("getThinkingLevels", () => { + it("adds max for gpt-5.6-sol on codex", () => { + const levels = getThinkingLevels("codex", "gpt-5.6-sol"); + expect(levels).toContain("max"); + expect(levels).toContain("xhigh"); + expect(levels).not.toContain("ultra"); + }); + + it("does not add max for other codex models", () => { + const levels = getThinkingLevels("codex", "gpt-5.3-codex"); + expect(levels).toEqual(["low", "medium", "high", "xhigh"]); + }); + + it("does not add max for other gpt-5.6 models", () => { + const levels = getThinkingLevels("codex", "gpt-5.5"); + expect(levels || []).not.toContain("max"); + }); +});