Update OpenAI defaults to GPT-5.5

This commit is contained in:
YeonGyu-Kim
2026-04-25 00:41:16 +09:00
parent 17d3350985
commit fbd4cfba9e
13 changed files with 280 additions and 281 deletions
+6 -6
View File
@@ -10,15 +10,15 @@ Agent factories following `createXXXAgent(model) → AgentConfig` pattern. Each
| Agent | Model | Temp | Mode | Fallback Chain | Purpose | | Agent | Model | Temp | Mode | Fallback Chain | Purpose |
|-------|-------|------|------|----------------|---------| |-------|-------|------|------|----------------|---------|
| **Sisyphus** | claude-opus-4-7 max | 0.1 | all | k2p5 -> kimi-k2.5 -> gpt-5.4 medium -> glm-5 -> big-pickle | Main orchestrator, plans + delegates | | **Sisyphus** | claude-opus-4-7 max | 0.1 | all | k2p5 -> kimi-k2.5 -> gpt-5.5 medium -> glm-5 -> big-pickle | Main orchestrator, plans + delegates |
| **Hephaestus** | gpt-5.4 medium | 0.1 | all | — | Autonomous deep worker | | **Hephaestus** | gpt-5.5 medium | 0.1 | all | — | Autonomous deep worker |
| **Oracle** | gpt-5.4 high | 0.1 | subagent | gemini-3.1-pro high -> claude-opus-4-7 max | Read-only consultation | | **Oracle** | gpt-5.5 high | 0.1 | subagent | gemini-3.1-pro high -> claude-opus-4-7 max | Read-only consultation |
| **Librarian** | gpt-5.4-mini-fast | 0.1 | subagent | minimax-m2.7-highspeed -> minimax-m2.7 -> claude-haiku-4-5 -> gpt-5.4-nano | External docs/code search | | **Librarian** | gpt-5.4-mini-fast | 0.1 | subagent | minimax-m2.7-highspeed -> minimax-m2.7 -> claude-haiku-4-5 -> gpt-5.4-nano | External docs/code search |
| **Explore** | gpt-5.4-mini-fast | 0.1 | subagent | minimax-m2.7-highspeed -> minimax-m2.7 -> claude-haiku-4-5 -> gpt-5.4-nano | Contextual grep | | **Explore** | gpt-5.4-mini-fast | 0.1 | subagent | minimax-m2.7-highspeed -> minimax-m2.7 -> claude-haiku-4-5 -> gpt-5.4-nano | Contextual grep |
| **Multimodal-Looker** | gpt-5.3-codex medium | 0.1 | subagent | k2p5 -> gemini-3-flash -> glm-4.6v -> gpt-5-nano | PDF/image analysis | | **Multimodal-Looker** | gpt-5.3-codex medium | 0.1 | subagent | k2p5 -> gemini-3-flash -> glm-4.6v -> gpt-5-nano | PDF/image analysis |
| **Metis** | claude-opus-4-7 max | **0.3** | subagent | gpt-5.4 high -> gemini-3.1-pro high | Pre-planning consultant | | **Metis** | claude-opus-4-7 max | **0.3** | subagent | gpt-5.5 high -> gemini-3.1-pro high | Pre-planning consultant |
| **Momus** | gpt-5.4 xhigh | 0.1 | subagent | claude-opus-4-7 max -> gemini-3.1-pro high | Plan reviewer | | **Momus** | gpt-5.5 xhigh | 0.1 | subagent | claude-opus-4-7 max -> gemini-3.1-pro high | Plan reviewer |
| **Atlas** | claude-sonnet-4-6 | 0.1 | primary | gpt-5.4 medium | Todo-list orchestrator | | **Atlas** | claude-sonnet-4-6 | 0.1 | primary | gpt-5.5 medium | Todo-list orchestrator |
| **Prometheus** | claude-opus-4-7 max | 0.1 | — | internal planner | Strategic planner (internal) | | **Prometheus** | claude-opus-4-7 max | 0.1 | — | internal planner | Strategic planner (internal) |
| **Sisyphus-Junior** | claude-sonnet-4-6 | 0.1 | all | user-configurable | Category-spawned executor | | **Sisyphus-Junior** | claude-sonnet-4-6 | 0.1 | all | user-configurable | Category-spawned executor |
+2 -1
View File
@@ -4,7 +4,7 @@
## OVERVIEW ## OVERVIEW
6 files. Hephaestus agent -- autonomous deep worker powered by GPT-5.4. Goal-oriented: give it objectives, not step-by-step instructions. "The Legitimate Craftsman." 6 files. Hephaestus agent -- autonomous deep worker powered by GPT-5.5. Goal-oriented: give it objectives, not step-by-step instructions. "The Legitimate Craftsman."
## FILES ## FILES
@@ -29,6 +29,7 @@
| Model | Prompt Source | Optimizations | | Model | Prompt Source | Optimizations |
|-------|-------------|---------------| |-------|-------------|---------------|
| gpt-5.5 | `gpt-5-5.ts` | GPT-5.5-tuned prompt architecture |
| gpt-5.4 | `gpt-5-4.ts` | XML-tagged blocks, 8 sections | | gpt-5.4 | `gpt-5-4.ts` | XML-tagged blocks, 8 sections |
| gpt-5.3-codex | `gpt-5-3-codex.ts` | Task discipline, 549 LOC prompt | | gpt-5.3-codex | `gpt-5-3-codex.ts` | Task discipline, 549 LOC prompt |
| Other GPT | `gpt.ts` | Base prompt, 507 LOC | | Other GPT | `gpt.ts` | Base prompt, 507 LOC |
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -94,7 +94,7 @@ Examples:
$ bunx oh-my-opencode run --on-complete "notify-send Done" "Fix the bug" $ bunx oh-my-opencode run --on-complete "notify-send Done" "Fix the bug"
$ bunx oh-my-opencode run --session-id ses_abc123 "Continue the work" $ bunx oh-my-opencode run --session-id ses_abc123 "Continue the work"
$ bunx oh-my-opencode run --model anthropic/claude-sonnet-4 "Fix the bug" $ bunx oh-my-opencode run --model anthropic/claude-sonnet-4 "Fix the bug"
$ bunx oh-my-opencode run --agent Sisyphus --model openai/gpt-5.4 "Implement feature X" $ bunx oh-my-opencode run --agent Sisyphus --model openai/gpt-5.5 "Implement feature X"
Agent resolution order: Agent resolution order:
1) --agent flag 1) --agent flag
+5 -5
View File
@@ -401,7 +401,7 @@ describe("generateModelConfig", () => {
expect(result.agents?.sisyphus?.model).toBe("anthropic/claude-opus-4-7") expect(result.agents?.sisyphus?.model).toBe("anthropic/claude-opus-4-7")
}) })
test("Sisyphus resolves to gpt-5.4 medium when only OpenAI is available", () => { test("Sisyphus resolves to gpt-5.5 medium when only OpenAI is available", () => {
// #given // #given
const config = createConfig({ hasOpenAI: true }) const config = createConfig({ hasOpenAI: true })
@@ -409,7 +409,7 @@ describe("generateModelConfig", () => {
const result = generateModelConfig(config) const result = generateModelConfig(config)
// #then // #then
expect(result.agents?.sisyphus?.model).toBe("openai/gpt-5.4") expect(result.agents?.sisyphus?.model).toBe("openai/gpt-5.5")
expect(result.agents?.sisyphus?.variant).toBe("medium") expect(result.agents?.sisyphus?.variant).toBe("medium")
}) })
}) })
@@ -423,7 +423,7 @@ describe("generateModelConfig", () => {
const result = generateModelConfig(config) const result = generateModelConfig(config)
// #then // #then
expect(result.agents?.atlas?.model).toBe("openai/gpt-5.4") expect(result.agents?.atlas?.model).toBe("openai/gpt-5.5")
expect(result.agents?.atlas?.variant).toBe("medium") expect(result.agents?.atlas?.variant).toBe("medium")
}) })
@@ -435,7 +435,7 @@ describe("generateModelConfig", () => {
const result = generateModelConfig(config) const result = generateModelConfig(config)
// #then // #then
expect(result.agents?.metis?.model).toBe("openai/gpt-5.4") expect(result.agents?.metis?.model).toBe("openai/gpt-5.5")
expect(result.agents?.metis?.variant).toBe("high") expect(result.agents?.metis?.variant).toBe("high")
}) })
@@ -447,7 +447,7 @@ describe("generateModelConfig", () => {
const result = generateModelConfig(config) const result = generateModelConfig(config)
// #then // #then
expect(result.agents?.["sisyphus-junior"]?.model).toBe("openai/gpt-5.4") expect(result.agents?.["sisyphus-junior"]?.model).toBe("openai/gpt-5.5")
expect(result.agents?.["sisyphus-junior"]?.variant).toBe("medium") expect(result.agents?.["sisyphus-junior"]?.variant).toBe("medium")
}) })
}) })
+3 -3
View File
@@ -40,10 +40,10 @@ describe("generateModelConfig OpenAI-only model catalog", () => {
const result = generateModelConfig(config) const result = generateModelConfig(config)
// #then // #then
expect(result.categories?.artistry).toEqual({ model: "openai/gpt-5.4", variant: "xhigh" }) expect(result.categories?.artistry).toEqual({ model: "openai/gpt-5.5", variant: "xhigh" })
expect(result.categories?.quick).toEqual({ model: "openai/gpt-5.4-mini" }) expect(result.categories?.quick).toEqual({ model: "openai/gpt-5.4-mini" })
expect(result.categories?.["visual-engineering"]).toEqual({ model: "openai/gpt-5.4", variant: "high" }) expect(result.categories?.["visual-engineering"]).toEqual({ model: "openai/gpt-5.5", variant: "high" })
expect(result.categories?.writing).toEqual({ model: "openai/gpt-5.4", variant: "medium" }) expect(result.categories?.writing).toEqual({ model: "openai/gpt-5.5", variant: "medium" })
}) })
test("does not apply OpenAI-only overrides when OpenCode Go is also available", () => { test("does not apply OpenAI-only overrides when OpenCode Go is also available", () => {
+3 -3
View File
@@ -6,10 +6,10 @@ const OPENAI_ONLY_AGENT_OVERRIDES: Record<string, AgentConfig> = {
} }
const OPENAI_ONLY_CATEGORY_OVERRIDES: Record<string, CategoryConfig> = { const OPENAI_ONLY_CATEGORY_OVERRIDES: Record<string, CategoryConfig> = {
artistry: { model: "openai/gpt-5.4", variant: "xhigh" }, artistry: { model: "openai/gpt-5.5", variant: "xhigh" },
quick: { model: "openai/gpt-5.4-mini" }, quick: { model: "openai/gpt-5.4-mini" },
"visual-engineering": { model: "openai/gpt-5.4", variant: "high" }, "visual-engineering": { model: "openai/gpt-5.5", variant: "high" },
writing: { model: "openai/gpt-5.4", variant: "medium" }, writing: { model: "openai/gpt-5.5", variant: "medium" },
} }
export function isOpenAiOnlyAvailability(availability: ProviderAvailability): boolean { export function isOpenAiOnlyAvailability(availability: ProviderAvailability): boolean {
+1 -1
View File
@@ -74,7 +74,7 @@ export async function promptInstallConfig(detected: DetectedConfig): Promise<Ins
message: "Do you have access to OpenCode Zen (opencode/ models)?", message: "Do you have access to OpenCode Zen (opencode/ models)?",
options: [ options: [
{ value: "no", label: "No", hint: "Will use other configured providers" }, { value: "no", label: "No", hint: "Will use other configured providers" },
{ value: "yes", label: "Yes", hint: "opencode/claude-opus-4-7, opencode/gpt-5.4, etc." }, { value: "yes", label: "Yes", hint: "opencode/claude-opus-4-7, opencode/gpt-5.5, etc." },
], ],
initialValue: initial.opencodeZen, initialValue: initial.opencodeZen,
}) })
+22 -22
View File
@@ -23,7 +23,7 @@ describe("AGENT_MODEL_REQUIREMENTS", () => {
expect(primary.variant).toBe("high") expect(primary.variant).toBe("high")
}) })
test("sisyphus has claude-opus-4-7 as primary with k2p5, kimi-k2.5, gpt-5.4 medium fallbacks", () => { test("sisyphus has claude-opus-4-7 as primary with k2p5, kimi-k2.5, gpt-5.5 medium fallbacks", () => {
// #given - sisyphus agent requirement // #given - sisyphus agent requirement
const sisyphus = AGENT_MODEL_REQUIREMENTS["sisyphus"] const sisyphus = AGENT_MODEL_REQUIREMENTS["sisyphus"]
@@ -50,10 +50,10 @@ describe("AGENT_MODEL_REQUIREMENTS", () => {
const fourth = sisyphus.fallbackChain[3] const fourth = sisyphus.fallbackChain[3]
expect(fourth.model).toBe("kimi-k2.5") expect(fourth.model).toBe("kimi-k2.5")
const fifth = sisyphus.fallbackChain[4] const fifth = sisyphus.fallbackChain[4]
expect(fifth.providers).toContain("openai") expect(fifth.providers).toContain("openai")
expect(fifth.model).toBe("gpt-5.4") expect(fifth.model).toBe("gpt-5.5")
expect(fifth.variant).toBe("medium") expect(fifth.variant).toBe("medium")
const sixth = sisyphus.fallbackChain[5] const sixth = sisyphus.fallbackChain[5]
expect(sixth.providers[0]).toBe("zai-coding-plan") expect(sixth.providers[0]).toBe("zai-coding-plan")
@@ -125,19 +125,19 @@ describe("AGENT_MODEL_REQUIREMENTS", () => {
expect(fifth.model).toBe("gpt-5.4-nano") expect(fifth.model).toBe("gpt-5.4-nano")
}) })
test("multimodal-looker has valid fallbackChain with gpt-5.4 as primary", () => { test("multimodal-looker has valid fallbackChain with gpt-5.5 as primary", () => {
// given - multimodal-looker agent requirement // given - multimodal-looker agent requirement
const multimodalLooker = AGENT_MODEL_REQUIREMENTS["multimodal-looker"] const multimodalLooker = AGENT_MODEL_REQUIREMENTS["multimodal-looker"]
// when - accessing multimodal-looker requirement // when - accessing multimodal-looker requirement
// then - fallbackChain: gpt-5.4 -> opencode-go/kimi-k2.5 -> glm-4.6v -> gpt-5-nano // then - fallbackChain: gpt-5.5 -> opencode-go/kimi-k2.5 -> glm-4.6v -> gpt-5-nano
expect(multimodalLooker).toBeDefined() expect(multimodalLooker).toBeDefined()
expect(multimodalLooker.fallbackChain).toBeArray() expect(multimodalLooker.fallbackChain).toBeArray()
expect(multimodalLooker.fallbackChain).toHaveLength(4) expect(multimodalLooker.fallbackChain).toHaveLength(4)
const primary = multimodalLooker.fallbackChain[0] const primary = multimodalLooker.fallbackChain[0]
expect(primary.providers).toEqual(["openai", "opencode", "vercel"]) expect(primary.providers).toEqual(["openai", "opencode", "vercel"])
expect(primary.model).toBe("gpt-5.4") expect(primary.model).toBe("gpt-5.5")
expect(primary.variant).toBe("medium") expect(primary.variant).toBe("medium")
const secondary = multimodalLooker.fallbackChain[1] const secondary = multimodalLooker.fallbackChain[1]
@@ -186,23 +186,23 @@ describe("AGENT_MODEL_REQUIREMENTS", () => {
const openAiFallback = metis.fallbackChain.find((entry) => entry.providers.includes("openai")) const openAiFallback = metis.fallbackChain.find((entry) => entry.providers.includes("openai"))
expect(openAiFallback).toEqual({ expect(openAiFallback).toEqual({
providers: ["openai", "github-copilot", "opencode", "vercel"], providers: ["openai", "github-copilot", "opencode", "vercel"],
model: "gpt-5.4", model: "gpt-5.5",
variant: "high", variant: "high",
}) })
}) })
test("momus has valid fallbackChain with gpt-5.4 as primary", () => { test("momus has valid fallbackChain with gpt-5.5 as primary", () => {
// given - momus agent requirement // given - momus agent requirement
const momus = AGENT_MODEL_REQUIREMENTS["momus"] const momus = AGENT_MODEL_REQUIREMENTS["momus"]
// when - accessing Momus requirement // when - accessing Momus requirement
// then - fallbackChain exists with gpt-5.4 as first entry, variant xhigh // then - fallbackChain exists with gpt-5.5 as first entry, variant xhigh
expect(momus).toBeDefined() expect(momus).toBeDefined()
expect(momus.fallbackChain).toBeArray() expect(momus.fallbackChain).toBeArray()
expect(momus.fallbackChain.length).toBeGreaterThan(0) expect(momus.fallbackChain.length).toBeGreaterThan(0)
const primary = momus.fallbackChain[0] const primary = momus.fallbackChain[0]
expect(primary.model).toBe("gpt-5.4") expect(primary.model).toBe("gpt-5.5")
expect(primary.variant).toBe("xhigh") expect(primary.variant).toBe("xhigh")
expect(primary.providers[0]).toBe("openai") expect(primary.providers[0]).toBe("openai")
}) })
@@ -228,7 +228,7 @@ describe("AGENT_MODEL_REQUIREMENTS", () => {
const tertiary = atlas.fallbackChain[2] const tertiary = atlas.fallbackChain[2]
expect(tertiary).toEqual({ expect(tertiary).toEqual({
providers: ["openai", "github-copilot", "opencode", "vercel"], providers: ["openai", "github-copilot", "opencode", "vercel"],
model: "gpt-5.4", model: "gpt-5.5",
variant: "medium", variant: "medium",
}) })
@@ -250,7 +250,7 @@ describe("AGENT_MODEL_REQUIREMENTS", () => {
// then // then
expect(openAiFallback).toEqual({ expect(openAiFallback).toEqual({
providers: ["openai", "github-copilot", "opencode", "vercel"], providers: ["openai", "github-copilot", "opencode", "vercel"],
model: "gpt-5.4", model: "gpt-5.5",
variant: "medium", variant: "medium",
}) })
expect(openAiFallbackIndex).toBeGreaterThan(-1) expect(openAiFallbackIndex).toBeGreaterThan(-1)
@@ -307,19 +307,19 @@ describe("AGENT_MODEL_REQUIREMENTS", () => {
}) })
describe("CATEGORY_MODEL_REQUIREMENTS", () => { describe("CATEGORY_MODEL_REQUIREMENTS", () => {
test("ultrabrain has valid fallbackChain with gpt-5.4 as primary", () => { test("ultrabrain has valid fallbackChain with gpt-5.5 as primary", () => {
// given - ultrabrain category requirement // given - ultrabrain category requirement
const ultrabrain = CATEGORY_MODEL_REQUIREMENTS["ultrabrain"] const ultrabrain = CATEGORY_MODEL_REQUIREMENTS["ultrabrain"]
// when - accessing ultrabrain requirement // when - accessing ultrabrain requirement
// then - fallbackChain exists with gpt-5.4 as first entry // then - fallbackChain exists with gpt-5.5 as first entry
expect(ultrabrain).toBeDefined() expect(ultrabrain).toBeDefined()
expect(ultrabrain.fallbackChain).toBeArray() expect(ultrabrain.fallbackChain).toBeArray()
expect(ultrabrain.fallbackChain.length).toBeGreaterThan(0) expect(ultrabrain.fallbackChain.length).toBeGreaterThan(0)
const primary = ultrabrain.fallbackChain[0] const primary = ultrabrain.fallbackChain[0]
expect(primary.variant).toBe("xhigh") expect(primary.variant).toBe("xhigh")
expect(primary.model).toBe("gpt-5.4") expect(primary.model).toBe("gpt-5.5")
expect(primary.providers[0]).toBe("openai") expect(primary.providers[0]).toBe("openai")
}) })
@@ -406,12 +406,12 @@ describe("CATEGORY_MODEL_REQUIREMENTS", () => {
expect(primary.providers[0]).toBe("anthropic") expect(primary.providers[0]).toBe("anthropic")
}) })
test("unspecified-high has claude-opus-4-7 as primary and gpt-5.4 as secondary", () => { test("unspecified-high has claude-opus-4-7 as primary and gpt-5.5 as secondary", () => {
// #given - unspecified-high category requirement // #given - unspecified-high category requirement
const unspecifiedHigh = CATEGORY_MODEL_REQUIREMENTS["unspecified-high"] const unspecifiedHigh = CATEGORY_MODEL_REQUIREMENTS["unspecified-high"]
// #when - accessing unspecified-high requirement // #when - accessing unspecified-high requirement
// #then - claude-opus-4-7 is first and gpt-5.4 is second // #then - claude-opus-4-7 is first and gpt-5.5 is second
expect(unspecifiedHigh).toBeDefined() expect(unspecifiedHigh).toBeDefined()
expect(unspecifiedHigh.fallbackChain).toBeArray() expect(unspecifiedHigh.fallbackChain).toBeArray()
expect(unspecifiedHigh.fallbackChain.length).toBeGreaterThan(1) expect(unspecifiedHigh.fallbackChain.length).toBeGreaterThan(1)
@@ -422,7 +422,7 @@ describe("CATEGORY_MODEL_REQUIREMENTS", () => {
expect(primary.providers).toEqual(["anthropic", "github-copilot", "opencode", "vercel"]) expect(primary.providers).toEqual(["anthropic", "github-copilot", "opencode", "vercel"])
const secondary = unspecifiedHigh.fallbackChain[1] const secondary = unspecifiedHigh.fallbackChain[1]
expect(secondary.model).toBe("gpt-5.4") expect(secondary.model).toBe("gpt-5.5")
expect(secondary.variant).toBe("high") expect(secondary.variant).toBe("high")
expect(secondary.providers).toEqual(["openai", "github-copilot", "opencode", "vercel"]) expect(secondary.providers).toEqual(["openai", "github-copilot", "opencode", "vercel"])
}) })
@@ -539,7 +539,7 @@ describe("ModelRequirement type", () => {
const requirement: ModelRequirement = { const requirement: ModelRequirement = {
fallbackChain: [ fallbackChain: [
{ providers: ["anthropic", "github-copilot"], model: "claude-opus-4-7", variant: "max" }, { providers: ["anthropic", "github-copilot"], model: "claude-opus-4-7", variant: "max" },
{ providers: ["openai", "github-copilot"], model: "gpt-5.4", variant: "high" }, { providers: ["openai", "github-copilot"], model: "gpt-5.5", variant: "high" },
], ],
} }
@@ -548,7 +548,7 @@ describe("ModelRequirement type", () => {
expect(requirement.fallbackChain).toBeArray() expect(requirement.fallbackChain).toBeArray()
expect(requirement.fallbackChain).toHaveLength(2) expect(requirement.fallbackChain).toHaveLength(2)
expect(requirement.fallbackChain[0].model).toBe("claude-opus-4-7") expect(requirement.fallbackChain[0].model).toBe("claude-opus-4-7")
expect(requirement.fallbackChain[1].model).toBe("gpt-5.4") expect(requirement.fallbackChain[1].model).toBe("gpt-5.5")
}) })
test("ModelRequirement variant is optional", () => { test("ModelRequirement variant is optional", () => {
+10 -10
View File
@@ -39,7 +39,7 @@ export const AGENT_MODEL_REQUIREMENTS: Record<string, ModelRequirement> = {
], ],
model: "kimi-k2.5", model: "kimi-k2.5",
}, },
{ providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5.4", variant: "medium" }, { providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5.5", variant: "medium" },
{ providers: ["zai-coding-plan", "opencode", "vercel"], model: "glm-5" }, { providers: ["zai-coding-plan", "opencode", "vercel"], model: "glm-5" },
{ providers: ["opencode"], model: "big-pickle" }, { providers: ["opencode"], model: "big-pickle" },
], ],
@@ -95,7 +95,7 @@ export const AGENT_MODEL_REQUIREMENTS: Record<string, ModelRequirement> = {
}, },
"multimodal-looker": { "multimodal-looker": {
fallbackChain: [ fallbackChain: [
{ providers: ["openai", "opencode", "vercel"], model: "gpt-5.4", variant: "medium" }, { providers: ["openai", "opencode", "vercel"], model: "gpt-5.5", variant: "medium" },
{ providers: ["opencode-go", "vercel"], model: "kimi-k2.5" }, { providers: ["opencode-go", "vercel"], model: "kimi-k2.5" },
{ providers: ["zai-coding-plan", "vercel"], model: "glm-4.6v" }, { providers: ["zai-coding-plan", "vercel"], model: "glm-4.6v" },
{ providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5-nano" }, { providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5-nano" },
@@ -110,7 +110,7 @@ export const AGENT_MODEL_REQUIREMENTS: Record<string, ModelRequirement> = {
}, },
{ {
providers: ["openai", "github-copilot", "opencode", "vercel"], providers: ["openai", "github-copilot", "opencode", "vercel"],
model: "gpt-5.4", model: "gpt-5.5",
variant: "high", variant: "high",
}, },
{ providers: ["opencode-go", "vercel"], model: "glm-5" }, { providers: ["opencode-go", "vercel"], model: "glm-5" },
@@ -129,7 +129,7 @@ export const AGENT_MODEL_REQUIREMENTS: Record<string, ModelRequirement> = {
}, },
{ {
providers: ["openai", "github-copilot", "opencode", "vercel"], providers: ["openai", "github-copilot", "opencode", "vercel"],
model: "gpt-5.4", model: "gpt-5.5",
variant: "high", variant: "high",
}, },
{ providers: ["opencode-go", "vercel"], model: "glm-5" }, { providers: ["opencode-go", "vercel"], model: "glm-5" },
@@ -140,7 +140,7 @@ export const AGENT_MODEL_REQUIREMENTS: Record<string, ModelRequirement> = {
fallbackChain: [ fallbackChain: [
{ {
providers: ["openai", "github-copilot", "opencode", "vercel"], providers: ["openai", "github-copilot", "opencode", "vercel"],
model: "gpt-5.4", model: "gpt-5.5",
variant: "xhigh", variant: "xhigh",
}, },
{ {
@@ -162,7 +162,7 @@ export const AGENT_MODEL_REQUIREMENTS: Record<string, ModelRequirement> = {
{ providers: ["opencode-go", "vercel"], model: "kimi-k2.5" }, { providers: ["opencode-go", "vercel"], model: "kimi-k2.5" },
{ {
providers: ["openai", "github-copilot", "opencode", "vercel"], providers: ["openai", "github-copilot", "opencode", "vercel"],
model: "gpt-5.4", model: "gpt-5.5",
variant: "medium", variant: "medium",
}, },
{ providers: ["opencode-go", "vercel"], model: "minimax-m2.7" }, { providers: ["opencode-go", "vercel"], model: "minimax-m2.7" },
@@ -174,7 +174,7 @@ export const AGENT_MODEL_REQUIREMENTS: Record<string, ModelRequirement> = {
{ providers: ["opencode-go", "vercel"], model: "kimi-k2.5" }, { providers: ["opencode-go", "vercel"], model: "kimi-k2.5" },
{ {
providers: ["openai", "github-copilot", "opencode", "vercel"], providers: ["openai", "github-copilot", "opencode", "vercel"],
model: "gpt-5.4", model: "gpt-5.5",
variant: "medium", variant: "medium",
}, },
{ providers: ["opencode-go", "vercel"], model: "minimax-m2.7" }, { providers: ["opencode-go", "vercel"], model: "minimax-m2.7" },
@@ -205,7 +205,7 @@ export const CATEGORY_MODEL_REQUIREMENTS: Record<string, ModelRequirement> = {
fallbackChain: [ fallbackChain: [
{ {
providers: ["openai", "opencode", "vercel"], providers: ["openai", "opencode", "vercel"],
model: "gpt-5.4", model: "gpt-5.5",
variant: "xhigh", variant: "xhigh",
}, },
{ {
@@ -252,7 +252,7 @@ export const CATEGORY_MODEL_REQUIREMENTS: Record<string, ModelRequirement> = {
model: "claude-opus-4-7", model: "claude-opus-4-7",
variant: "max", variant: "max",
}, },
{ providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5.4" }, { providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5.5" },
], ],
requiresModel: "gemini-3.1-pro", requiresModel: "gemini-3.1-pro",
}, },
@@ -302,7 +302,7 @@ export const CATEGORY_MODEL_REQUIREMENTS: Record<string, ModelRequirement> = {
}, },
{ {
providers: ["openai", "github-copilot", "opencode", "vercel"], providers: ["openai", "github-copilot", "opencode", "vercel"],
model: "gpt-5.4", model: "gpt-5.5",
variant: "high", variant: "high",
}, },
{ providers: ["zai-coding-plan", "opencode", "vercel"], model: "glm-5" }, { providers: ["zai-coding-plan", "opencode", "vercel"], model: "glm-5" },
+2 -2
View File
@@ -92,8 +92,8 @@
| Category | Model | Domain | | Category | Model | Domain |
|----------|-------|--------| |----------|-------|--------|
| visual-engineering | gemini-3.1-pro high | Frontend, UI/UX | | visual-engineering | gemini-3.1-pro high | Frontend, UI/UX |
| ultrabrain | gpt-5.4 xhigh | Hard logic | | ultrabrain | gpt-5.5 xhigh | Hard logic |
| deep | gpt-5.4 medium | Autonomous problem-solving | | deep | gpt-5.5 medium | Autonomous problem-solving |
| artistry | gemini-3.1-pro high | Creative approaches | | artistry | gemini-3.1-pro high | Creative approaches |
| quick | gpt-5.4-mini | Trivial tasks | | quick | gpt-5.4-mini | Trivial tasks |
| unspecified-low | claude-sonnet-4-6 | Moderate effort | | unspecified-low | claude-sonnet-4-6 | Moderate effort |
+1 -1
View File
@@ -97,7 +97,7 @@ If your prompt lacks this structure, REWRITE IT before delegating.
export const OPENAI_CATEGORIES: BuiltinCategoryDefinition[] = [ export const OPENAI_CATEGORIES: BuiltinCategoryDefinition[] = [
{ {
name: "ultrabrain", name: "ultrabrain",
config: { model: "openai/gpt-5.4", variant: "xhigh" }, config: { model: "openai/gpt-5.5", variant: "xhigh" },
description: "Use ONLY for genuinely hard, logic-heavy tasks. Give clear goals only, not step-by-step instructions.", description: "Use ONLY for genuinely hard, logic-heavy tasks. Give clear goals only, not step-by-step instructions.",
promptAppend: ULTRABRAIN_CATEGORY_PROMPT_APPEND, promptAppend: ULTRABRAIN_CATEGORY_PROMPT_APPEND,
}, },
+35 -37
View File
@@ -33,8 +33,8 @@ const TEST_AVAILABLE_MODELS = new Set([
"anthropic/claude-haiku-4-5", "anthropic/claude-haiku-4-5",
"google/gemini-3.1-pro", "google/gemini-3.1-pro",
"google/gemini-3-flash", "google/gemini-3-flash",
"openai/gpt-5.4-mini",
"openai/gpt-5.5", "openai/gpt-5.5",
"openai/gpt-5.4",
"openai/gpt-5.3-codex", "openai/gpt-5.3-codex",
]) ])
@@ -69,7 +69,7 @@ describe("sisyphus-task", () => {
models: { models: {
anthropic: ["claude-opus-4-7", "claude-sonnet-4-6", "claude-haiku-4-5"], anthropic: ["claude-opus-4-7", "claude-sonnet-4-6", "claude-haiku-4-5"],
google: ["gemini-3.1-pro", "gemini-3-flash"], google: ["gemini-3.1-pro", "gemini-3-flash"],
openai: ["gpt-5.5", "gpt-5.4", "gpt-5.3-codex"], openai: ["gpt-5.5", "gpt-5.4-mini", "gpt-5.3-codex"],
}, },
connected: ["anthropic", "google", "openai"], connected: ["anthropic", "google", "openai"],
updatedAt: "2026-01-01T00:00:00.000Z", updatedAt: "2026-01-01T00:00:00.000Z",
@@ -99,7 +99,7 @@ describe("sisyphus-task", () => {
// when / #then // when / #then
expect(category).toBeDefined() expect(category).toBeDefined()
expect(category.model).toBe("openai/gpt-5.4") expect(category.model).toBe("openai/gpt-5.5")
expect(category.variant).toBe("xhigh") expect(category.variant).toBe("xhigh")
}) })
@@ -381,7 +381,7 @@ describe("sisyphus-task", () => {
} }
//#when //#when
await tool.execute(args as unknown as DelegateTaskArgs, toolContext) await tool.execute(args as DelegateTaskArgs, toolContext)
//#then //#then
expect(args.load_skills).toEqual(["playwright", "git-master"]) expect(args.load_skills).toEqual(["playwright", "git-master"])
@@ -444,7 +444,7 @@ describe("sisyphus-task", () => {
} }
//#when //#when
await tool.execute(args as unknown as DelegateTaskArgs, toolContext) await tool.execute(args as DelegateTaskArgs, toolContext)
//#then //#then
expect(args.load_skills).toEqual([]) expect(args.load_skills).toEqual([])
@@ -877,7 +877,7 @@ describe("sisyphus-task", () => {
const categoryName = "my-custom" const categoryName = "my-custom"
const userCategories = { const userCategories = {
"my-custom": { "my-custom": {
model: "openai/gpt-5.4", model: "openai/gpt-5.5",
temperature: 0.5, temperature: 0.5,
prompt_append: "You are a custom agent", prompt_append: "You are a custom agent",
}, },
@@ -888,7 +888,7 @@ describe("sisyphus-task", () => {
// then // then
expect(result).not.toBeNull() expect(result).not.toBeNull()
expect(result!.config.model).toBe("openai/gpt-5.4") expect(result!.config.model).toBe("openai/gpt-5.5")
expect(result!.config.temperature).toBe(0.5) expect(result!.config.temperature).toBe(0.5)
expect(result!.promptAppend).toBe("You are a custom agent") expect(result!.promptAppend).toBe("You are a custom agent")
}) })
@@ -927,7 +927,7 @@ describe("sisyphus-task", () => {
test("systemDefaultModel is used as fallback when custom category has no model", () => { test("systemDefaultModel is used as fallback when custom category has no model", () => {
// given - custom category with no model defined // given - custom category with no model defined
const categoryName = "my-custom-no-model" const categoryName = "my-custom-no-model"
const userCategories = { "my-custom-no-model": { temperature: 0.5 } } as unknown as Record<string, CategoryConfig> const userCategories: Record<string, CategoryConfig> = { "my-custom-no-model": { temperature: 0.5 } }
const inheritedModel = "cliproxy/claude-opus-4-7" const inheritedModel = "cliproxy/claude-opus-4-7"
// when // when
@@ -1001,7 +1001,7 @@ describe("sisyphus-task", () => {
manager: mockManager, manager: mockManager,
client: mockClient, client: mockClient,
userCategories: { userCategories: {
ultrabrain: { model: "openai/gpt-5.4", variant: "xhigh" }, ultrabrain: { model: "openai/gpt-5.5", variant: "xhigh" },
}, },
connectedProvidersOverride: TEST_CONNECTED_PROVIDERS, connectedProvidersOverride: TEST_CONNECTED_PROVIDERS,
availableModelsOverride: createTestAvailableModels(), availableModelsOverride: createTestAvailableModels(),
@@ -1029,7 +1029,7 @@ describe("sisyphus-task", () => {
// then // then
expect(launchInput.model).toEqual({ expect(launchInput.model).toEqual({
providerID: "openai", providerID: "openai",
modelID: "gpt-5.4", modelID: "gpt-5.5",
variant: "xhigh", variant: "xhigh",
}) })
}) })
@@ -2448,7 +2448,7 @@ describe("sisyphus-task", () => {
}, },
} }
// Use ultrabrain which uses gpt-5.4 (non-gemini) // Use ultrabrain which uses gpt-5.5 (non-gemini)
const tool = createDelegateTask({ const tool = createDelegateTask({
manager: mockManager, manager: mockManager,
client: mockClient, client: mockClient,
@@ -2554,7 +2554,7 @@ describe("sisyphus-task", () => {
models: { models: {
anthropic: ["claude-opus-4-7", "claude-sonnet-4-6", "claude-haiku-4-5"], anthropic: ["claude-opus-4-7", "claude-sonnet-4-6", "claude-haiku-4-5"],
google: ["gemini-3.1-pro", "gemini-3-flash"], google: ["gemini-3.1-pro", "gemini-3-flash"],
openai: ["gpt-5.5", "gpt-5.4", "gpt-5.3-codex"], openai: ["gpt-5.5", "gpt-5.5", "gpt-5.3-codex"],
"kimi-for-coding": ["k2p5"], "kimi-for-coding": ["k2p5"],
}, },
connected: ["anthropic", "google", "openai", "kimi-for-coding"], connected: ["anthropic", "google", "openai", "kimi-for-coding"],
@@ -2665,7 +2665,7 @@ describe("sisyphus-task", () => {
client: mockClient, client: mockClient,
userCategories: { userCategories: {
"my-unstable-cat": { "my-unstable-cat": {
model: "openai/gpt-5.4", model: "openai/gpt-5.5",
is_unstable_agent: true, is_unstable_agent: true,
}, },
}, },
@@ -2747,7 +2747,7 @@ describe("sisyphus-task", () => {
abort: new AbortController().signal, abort: new AbortController().signal,
} }
// when - using "quick" category which should use "anthropic/claude-haiku-4-5" // when - using "quick" category which should use the catalog model
await tool.execute( await tool.execute(
{ {
description: "Test category fallback", description: "Test category fallback",
@@ -2759,10 +2759,10 @@ describe("sisyphus-task", () => {
toolContext toolContext
) )
// then - model should be anthropic/claude-haiku-4-5 from DEFAULT_CATEGORIES // then - model should be openai/gpt-5.4-mini from DEFAULT_CATEGORIES
// NOT anthropic/claude-sonnet-4-6 (system default) // NOT anthropic/claude-sonnet-4-6 (system default)
expect(launchInput.model.providerID).toBe("anthropic") expect(launchInput.model.providerID).toBe("openai")
expect(launchInput.model.modelID).toBe("claude-haiku-4-5") expect(launchInput.model.modelID).toBe("gpt-5.4-mini")
}) })
test("category delegation ignores UI-selected (Kimi) system default model", async () => { test("category delegation ignores UI-selected (Kimi) system default model", async () => {
@@ -2812,7 +2812,7 @@ describe("sisyphus-task", () => {
abort: new AbortController().signal, abort: new AbortController().signal,
} }
// when - using "quick" category which should use "anthropic/claude-haiku-4-5" // when - using "quick" category which should use the catalog model
await tool.execute( await tool.execute(
{ {
description: "UI model inheritance test", description: "UI model inheritance test",
@@ -2825,8 +2825,8 @@ describe("sisyphus-task", () => {
) )
// then - category model must win (not Kimi) // then - category model must win (not Kimi)
expect(launchInput.model.providerID).toBe("anthropic") expect(launchInput.model.providerID).toBe("openai")
expect(launchInput.model.modelID).toBe("claude-haiku-4-5") expect(launchInput.model.modelID).toBe("gpt-5.4-mini")
}) })
test("sisyphus-junior model override takes precedence over category model", async () => { test("sisyphus-junior model override takes precedence over category model", async () => {
@@ -2873,7 +2873,7 @@ describe("sisyphus-task", () => {
abort: new AbortController().signal, abort: new AbortController().signal,
} }
// when - using ultrabrain category (default model is openai/gpt-5.4) // when - using ultrabrain category (default model is openai/gpt-5.5)
await tool.execute( await tool.execute(
{ {
description: "Override precedence test", description: "Override precedence test",
@@ -2925,7 +2925,7 @@ describe("sisyphus-task", () => {
client: mockClient, client: mockClient,
sisyphusJuniorModel: "anthropic/claude-sonnet-4-6", sisyphusJuniorModel: "anthropic/claude-sonnet-4-6",
userCategories: { userCategories: {
ultrabrain: { model: "openai/gpt-5.4" }, ultrabrain: { model: "openai/gpt-5.5" },
}, },
connectedProvidersOverride: TEST_CONNECTED_PROVIDERS, connectedProvidersOverride: TEST_CONNECTED_PROVIDERS,
availableModelsOverride: createTestAvailableModels(), availableModelsOverride: createTestAvailableModels(),
@@ -2952,7 +2952,7 @@ describe("sisyphus-task", () => {
// then - explicit category model should win // then - explicit category model should win
expect(launchInput.model.providerID).toBe("openai") expect(launchInput.model.providerID).toBe("openai")
expect(launchInput.model.modelID).toBe("gpt-5.4") expect(launchInput.model.modelID).toBe("gpt-5.5")
}) })
test("sisyphus-junior model override works with quick category (#1295)", async () => { test("sisyphus-junior model override works with quick category (#1295)", async () => {
@@ -3049,7 +3049,7 @@ describe("sisyphus-task", () => {
const tool = createDelegateTask({ const tool = createDelegateTask({
manager: mockManager, manager: mockManager,
client: mockClient, client: mockClient,
sisyphusJuniorModel: "openai/gpt-5.4", sisyphusJuniorModel: "openai/gpt-5.5",
userCategories: { userCategories: {
"my-custom": { temperature: 0.5 }, "my-custom": { temperature: 0.5 },
}, },
@@ -3076,7 +3076,7 @@ describe("sisyphus-task", () => {
// then - sisyphus-junior override model should be used as fallback // then - sisyphus-junior override model should be used as fallback
expect(launchInput.model.providerID).toBe("openai") expect(launchInput.model.providerID).toBe("openai")
expect(launchInput.model.modelID).toBe("gpt-5.4") expect(launchInput.model.modelID).toBe("gpt-5.5")
}) })
}) })
@@ -3447,7 +3447,7 @@ describe("sisyphus-task", () => {
// then - catalog model is used // then - catalog model is used
expect(resolved).not.toBeNull() expect(resolved).not.toBeNull()
expect(resolved!.config.model).toBe("openai/gpt-5.4") expect(resolved!.config.model).toBe("openai/gpt-5.5")
expect(resolved!.config.variant).toBe("xhigh") expect(resolved!.config.variant).toBe("xhigh")
}) })
@@ -3471,10 +3471,10 @@ describe("sisyphus-task", () => {
// when // when
const resolved = resolveCategoryConfig(categoryName, { inheritedModel, systemDefaultModel: SYSTEM_DEFAULT_MODEL }) const resolved = resolveCategoryConfig(categoryName, { inheritedModel, systemDefaultModel: SYSTEM_DEFAULT_MODEL })
// then - category's built-in model wins (ultrabrain uses gpt-5.4) // then - category's built-in model wins (ultrabrain uses gpt-5.5)
expect(resolved).not.toBeNull() expect(resolved).not.toBeNull()
const actualModel = resolved!.config.model const actualModel = resolved!.config.model
expect(actualModel).toBe("openai/gpt-5.4") expect(actualModel).toBe("openai/gpt-5.5")
}) })
test("when user defines model - modelInfo should report user-defined regardless of inheritedModel", () => { test("when user defines model - modelInfo should report user-defined regardless of inheritedModel", () => {
@@ -3528,18 +3528,18 @@ describe("sisyphus-task", () => {
const categoryName = "ultrabrain" const categoryName = "ultrabrain"
const inheritedModel = "anthropic/claude-opus-4-7" const inheritedModel = "anthropic/claude-opus-4-7"
// when category has a built-in model (gpt-5.4 for ultrabrain) // when category has a built-in model (gpt-5.5 for ultrabrain)
const resolved = resolveCategoryConfig(categoryName, { inheritedModel, systemDefaultModel: SYSTEM_DEFAULT_MODEL }) const resolved = resolveCategoryConfig(categoryName, { inheritedModel, systemDefaultModel: SYSTEM_DEFAULT_MODEL })
// then category's built-in model should be used, NOT inheritedModel // then category's built-in model should be used, NOT inheritedModel
expect(resolved).not.toBeNull() expect(resolved).not.toBeNull()
expect(resolved!.model).toBe("openai/gpt-5.4") expect(resolved!.model).toBe("openai/gpt-5.5")
}) })
test("FIXED: systemDefaultModel is used when no userConfig.model and no inheritedModel", () => { test("FIXED: systemDefaultModel is used when no userConfig.model and no inheritedModel", () => {
// given a custom category with no default model // given a custom category with no default model
const categoryName = "custom-no-default" const categoryName = "custom-no-default"
const userCategories = { "custom-no-default": { temperature: 0.5 } } as unknown as Record<string, CategoryConfig> const userCategories: Record<string, CategoryConfig> = { "custom-no-default": { temperature: 0.5 } }
const systemDefaultModel = "anthropic/claude-sonnet-4-6" const systemDefaultModel = "anthropic/claude-sonnet-4-6"
// when no inheritedModel is provided, only systemDefaultModel // when no inheritedModel is provided, only systemDefaultModel
@@ -3589,8 +3589,7 @@ describe("sisyphus-task", () => {
test("FIXED: undefined userConfig.model falls back to category built-in model", () => { test("FIXED: undefined userConfig.model falls back to category built-in model", () => {
// given user sets a builtin category but leaves model undefined // given user sets a builtin category but leaves model undefined
const categoryName = "visual-engineering" const categoryName = "visual-engineering"
// Using type assertion since we're testing fallback behavior for categories without model const userCategories: Record<string, CategoryConfig> = { "visual-engineering": { temperature: 0.2 } }
const userCategories = { "visual-engineering": { temperature: 0.2 } } as unknown as Record<string, CategoryConfig>
const inheritedModel = "anthropic/claude-opus-4-7" const inheritedModel = "anthropic/claude-opus-4-7"
// when resolveCategoryConfig is called // when resolveCategoryConfig is called
@@ -3604,8 +3603,7 @@ describe("sisyphus-task", () => {
test("systemDefaultModel is used when no other model is available", () => { test("systemDefaultModel is used when no other model is available", () => {
// given - custom category with no model, but systemDefaultModel is set // given - custom category with no model, but systemDefaultModel is set
const categoryName = "my-custom" const categoryName = "my-custom"
// Using type assertion since we're testing fallback behavior for categories without model const userCategories: Record<string, CategoryConfig> = { "my-custom": { temperature: 0.5 } }
const userCategories = { "my-custom": { temperature: 0.5 } } as unknown as Record<string, CategoryConfig>
const systemDefaultModel = "anthropic/claude-sonnet-4-6" const systemDefaultModel = "anthropic/claude-sonnet-4-6"
// when // when
@@ -3936,7 +3934,7 @@ describe("sisyphus-task", () => {
app: { app: {
agents: async () => ({ agents: async () => ({
data: [ data: [
{ name: "oracle", mode: "subagent", model: { providerID: "openai", modelID: "gpt-5.4" } }, { name: "oracle", mode: "subagent", model: { providerID: "openai", modelID: "gpt-5.5" } },
], ],
}), }),
}, },
@@ -4003,7 +4001,7 @@ describe("sisyphus-task", () => {
app: { app: {
agents: async () => ({ agents: async () => ({
data: [ data: [
{ name: "oracle", mode: "subagent", model: { providerID: "openai", modelID: "gpt-5.4" } }, { name: "oracle", mode: "subagent", model: { providerID: "openai", modelID: "gpt-5.5" } },
], ],
}), }),
}, },