When overriding an agent's model to a different provider, the agent
now automatically gets provider-appropriate reasoning options:
- GPT models: `reasoningEffort`, `textVerbosity`
- Anthropic models: `thinking` with `budgetTokens`
## Why utils.ts changes are required
The original flow merges overrides onto pre-built agent configs:
mergeAgentConfig(sisyphusAgent, { model: "gpt-5.2" })
// Result: { model: "gpt-5.2", thinking: {...} }
The `thinking` config persists because it exists in the pre-built
`sisyphusAgent`. GPT models ignore `thinking` and need `reasoningEffort`.
The fix: call the agent factory with the resolved model, so the factory
can return the correct provider-specific config:
buildAgent(createSisyphusAgent, "gpt-5.2")
// Result: { model: "gpt-5.2", reasoningEffort: "medium" }
Closes #144
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
88 lines
2.7 KiB
TypeScript
88 lines
2.7 KiB
TypeScript
import { describe, test, expect } from "bun:test"
|
|
import { createBuiltinAgents } from "./utils"
|
|
|
|
describe("createBuiltinAgents with model overrides", () => {
|
|
test("Sisyphus with default model has thinking config", () => {
|
|
// #given - no overrides
|
|
|
|
// #when
|
|
const agents = createBuiltinAgents()
|
|
|
|
// #then
|
|
expect(agents.Sisyphus.model).toBe("anthropic/claude-opus-4-5")
|
|
expect(agents.Sisyphus.thinking).toEqual({ type: "enabled", budgetTokens: 32000 })
|
|
expect(agents.Sisyphus.reasoningEffort).toBeUndefined()
|
|
})
|
|
|
|
test("Sisyphus with GPT model override has reasoningEffort, no thinking", () => {
|
|
// #given
|
|
const overrides = {
|
|
Sisyphus: { model: "github-copilot/gpt-5.2" },
|
|
}
|
|
|
|
// #when
|
|
const agents = createBuiltinAgents([], overrides)
|
|
|
|
// #then
|
|
expect(agents.Sisyphus.model).toBe("github-copilot/gpt-5.2")
|
|
expect(agents.Sisyphus.reasoningEffort).toBe("medium")
|
|
expect(agents.Sisyphus.thinking).toBeUndefined()
|
|
})
|
|
|
|
test("Sisyphus with systemDefaultModel GPT has reasoningEffort, no thinking", () => {
|
|
// #given
|
|
const systemDefaultModel = "openai/gpt-5.2"
|
|
|
|
// #when
|
|
const agents = createBuiltinAgents([], {}, undefined, systemDefaultModel)
|
|
|
|
// #then
|
|
expect(agents.Sisyphus.model).toBe("openai/gpt-5.2")
|
|
expect(agents.Sisyphus.reasoningEffort).toBe("medium")
|
|
expect(agents.Sisyphus.thinking).toBeUndefined()
|
|
})
|
|
|
|
test("Oracle with default model has reasoningEffort", () => {
|
|
// #given - no overrides
|
|
|
|
// #when
|
|
const agents = createBuiltinAgents()
|
|
|
|
// #then
|
|
expect(agents.oracle.model).toBe("openai/gpt-5.2")
|
|
expect(agents.oracle.reasoningEffort).toBe("medium")
|
|
expect(agents.oracle.textVerbosity).toBe("high")
|
|
expect(agents.oracle.thinking).toBeUndefined()
|
|
})
|
|
|
|
test("Oracle with Claude model override has thinking, no reasoningEffort", () => {
|
|
// #given
|
|
const overrides = {
|
|
oracle: { model: "anthropic/claude-sonnet-4" },
|
|
}
|
|
|
|
// #when
|
|
const agents = createBuiltinAgents([], overrides)
|
|
|
|
// #then
|
|
expect(agents.oracle.model).toBe("anthropic/claude-sonnet-4")
|
|
expect(agents.oracle.thinking).toEqual({ type: "enabled", budgetTokens: 32000 })
|
|
expect(agents.oracle.reasoningEffort).toBeUndefined()
|
|
expect(agents.oracle.textVerbosity).toBeUndefined()
|
|
})
|
|
|
|
test("non-model overrides are still applied after factory rebuild", () => {
|
|
// #given
|
|
const overrides = {
|
|
Sisyphus: { model: "github-copilot/gpt-5.2", temperature: 0.5 },
|
|
}
|
|
|
|
// #when
|
|
const agents = createBuiltinAgents([], overrides)
|
|
|
|
// #then
|
|
expect(agents.Sisyphus.model).toBe("github-copilot/gpt-5.2")
|
|
expect(agents.Sisyphus.temperature).toBe(0.5)
|
|
})
|
|
})
|