* fix(shared): honor agent variant overrides * test(shared): use model in fallback chain to verify override precedence Address PR review: test now uses claude-opus-4-5 (which has default variant 'max' in sisyphus chain) to properly verify that agent override 'high' takes precedence over the fallback chain's default variant.
215 lines
5.6 KiB
TypeScript
215 lines
5.6 KiB
TypeScript
import { describe, expect, test } from "bun:test"
|
|
import type { OhMyOpenCodeConfig } from "../config"
|
|
import { applyAgentVariant, resolveAgentVariant, resolveVariantForModel } from "./agent-variant"
|
|
|
|
describe("resolveAgentVariant", () => {
|
|
test("returns undefined when agent name missing", () => {
|
|
// given
|
|
const config = {} as OhMyOpenCodeConfig
|
|
|
|
// when
|
|
const variant = resolveAgentVariant(config)
|
|
|
|
// then
|
|
expect(variant).toBeUndefined()
|
|
})
|
|
|
|
test("returns agent override variant", () => {
|
|
// given
|
|
const config = {
|
|
agents: {
|
|
sisyphus: { variant: "low" },
|
|
},
|
|
} as OhMyOpenCodeConfig
|
|
|
|
// when
|
|
const variant = resolveAgentVariant(config, "sisyphus")
|
|
|
|
// then
|
|
expect(variant).toBe("low")
|
|
})
|
|
|
|
test("returns category variant when agent uses category", () => {
|
|
// given
|
|
const config = {
|
|
agents: {
|
|
sisyphus: { category: "ultrabrain" },
|
|
},
|
|
categories: {
|
|
ultrabrain: { model: "openai/gpt-5.2", variant: "xhigh" },
|
|
},
|
|
} as OhMyOpenCodeConfig
|
|
|
|
// when
|
|
const variant = resolveAgentVariant(config, "sisyphus")
|
|
|
|
// then
|
|
expect(variant).toBe("xhigh")
|
|
})
|
|
})
|
|
|
|
describe("applyAgentVariant", () => {
|
|
test("sets variant when message is undefined", () => {
|
|
// given
|
|
const config = {
|
|
agents: {
|
|
sisyphus: { variant: "low" },
|
|
},
|
|
} as OhMyOpenCodeConfig
|
|
const message: { variant?: string } = {}
|
|
|
|
// when
|
|
applyAgentVariant(config, "sisyphus", message)
|
|
|
|
// then
|
|
expect(message.variant).toBe("low")
|
|
})
|
|
|
|
test("does not override existing variant", () => {
|
|
// given
|
|
const config = {
|
|
agents: {
|
|
sisyphus: { variant: "low" },
|
|
},
|
|
} as OhMyOpenCodeConfig
|
|
const message = { variant: "max" }
|
|
|
|
// when
|
|
applyAgentVariant(config, "sisyphus", message)
|
|
|
|
// then
|
|
expect(message.variant).toBe("max")
|
|
})
|
|
})
|
|
|
|
describe("resolveVariantForModel", () => {
|
|
test("returns agent override variant when configured", () => {
|
|
// given - use a model in sisyphus chain (claude-opus-4-5 has default variant "max")
|
|
// to verify override takes precedence over fallback chain
|
|
const config = {
|
|
agents: {
|
|
sisyphus: { variant: "high" },
|
|
},
|
|
} as OhMyOpenCodeConfig
|
|
const model = { providerID: "anthropic", modelID: "claude-opus-4-5" }
|
|
|
|
// when
|
|
const variant = resolveVariantForModel(config, "sisyphus", model)
|
|
|
|
// then
|
|
expect(variant).toBe("high")
|
|
})
|
|
|
|
test("returns correct variant for anthropic provider", () => {
|
|
// given
|
|
const config = {} as OhMyOpenCodeConfig
|
|
const model = { providerID: "anthropic", modelID: "claude-opus-4-5" }
|
|
|
|
// when
|
|
const variant = resolveVariantForModel(config, "sisyphus", model)
|
|
|
|
// then
|
|
expect(variant).toBe("max")
|
|
})
|
|
|
|
test("returns correct variant for openai provider (hephaestus agent)", () => {
|
|
// #given hephaestus has openai/gpt-5.2-codex with variant "medium" in its chain
|
|
const config = {} as OhMyOpenCodeConfig
|
|
const model = { providerID: "openai", modelID: "gpt-5.2-codex" }
|
|
|
|
// #when
|
|
const variant = resolveVariantForModel(config, "hephaestus", model)
|
|
|
|
// then
|
|
expect(variant).toBe("medium")
|
|
})
|
|
|
|
test("returns undefined for provider not in sisyphus chain", () => {
|
|
// #given openai is not in sisyphus fallback chain anymore
|
|
const config = {} as OhMyOpenCodeConfig
|
|
const model = { providerID: "openai", modelID: "gpt-5.2" }
|
|
|
|
// when
|
|
const variant = resolveVariantForModel(config, "sisyphus", model)
|
|
|
|
// then
|
|
expect(variant).toBeUndefined()
|
|
})
|
|
|
|
test("returns undefined for provider not in chain", () => {
|
|
// given
|
|
const config = {} as OhMyOpenCodeConfig
|
|
const model = { providerID: "unknown-provider", modelID: "some-model" }
|
|
|
|
// when
|
|
const variant = resolveVariantForModel(config, "sisyphus", model)
|
|
|
|
// then
|
|
expect(variant).toBeUndefined()
|
|
})
|
|
|
|
test("returns undefined for unknown agent", () => {
|
|
// given
|
|
const config = {} as OhMyOpenCodeConfig
|
|
const model = { providerID: "anthropic", modelID: "claude-opus-4-5" }
|
|
|
|
// when
|
|
const variant = resolveVariantForModel(config, "nonexistent-agent", model)
|
|
|
|
// then
|
|
expect(variant).toBeUndefined()
|
|
})
|
|
|
|
test("returns variant for zai-coding-plan provider without variant", () => {
|
|
// given
|
|
const config = {} as OhMyOpenCodeConfig
|
|
const model = { providerID: "zai-coding-plan", modelID: "glm-4.7" }
|
|
|
|
// when
|
|
const variant = resolveVariantForModel(config, "sisyphus", model)
|
|
|
|
// then
|
|
expect(variant).toBeUndefined()
|
|
})
|
|
|
|
test("falls back to category chain when agent has no requirement", () => {
|
|
// given
|
|
const config = {
|
|
agents: {
|
|
"custom-agent": { category: "ultrabrain" },
|
|
},
|
|
} as OhMyOpenCodeConfig
|
|
const model = { providerID: "openai", modelID: "gpt-5.2-codex" }
|
|
|
|
// when
|
|
const variant = resolveVariantForModel(config, "custom-agent", model)
|
|
|
|
// then
|
|
expect(variant).toBe("xhigh")
|
|
})
|
|
|
|
test("returns correct variant for oracle agent with openai", () => {
|
|
// given
|
|
const config = {} as OhMyOpenCodeConfig
|
|
const model = { providerID: "openai", modelID: "gpt-5.2" }
|
|
|
|
// when
|
|
const variant = resolveVariantForModel(config, "oracle", model)
|
|
|
|
// then
|
|
expect(variant).toBe("high")
|
|
})
|
|
|
|
test("returns correct variant for oracle agent with anthropic", () => {
|
|
// given
|
|
const config = {} as OhMyOpenCodeConfig
|
|
const model = { providerID: "anthropic", modelID: "claude-opus-4-5" }
|
|
|
|
// when
|
|
const variant = resolveVariantForModel(config, "oracle", model)
|
|
|
|
// then
|
|
expect(variant).toBe("max")
|
|
})
|
|
})
|