217 lines
5.3 KiB
TypeScript
217 lines
5.3 KiB
TypeScript
import { describe, expect, it } from "vitest"
|
|
import { createUltraworkModelOverrideHook } from "./hook"
|
|
|
|
interface ChatParamsInput {
|
|
agent: string
|
|
message: {
|
|
variant: string
|
|
model?: { providerID?: string; modelID?: string }
|
|
}
|
|
sessionID?: string
|
|
}
|
|
|
|
interface ChatParamsOutput {
|
|
// Not used by this hook
|
|
}
|
|
|
|
function createMockParams(overrides: {
|
|
agent?: string
|
|
variant?: string
|
|
model?: { providerID?: string; modelID?: string }
|
|
sessionID?: string
|
|
}): { input: ChatParamsInput; output: ChatParamsOutput } {
|
|
const agent = overrides.agent ?? "sisyphus"
|
|
const variant = overrides.variant ?? "max"
|
|
const model = overrides.model
|
|
const sessionID = overrides.sessionID
|
|
|
|
return {
|
|
input: {
|
|
agent,
|
|
message: { variant, model },
|
|
sessionID,
|
|
},
|
|
output: {},
|
|
}
|
|
}
|
|
|
|
describe("createUltraworkModelOverrideHook", () => {
|
|
describe("model swap works", () => {
|
|
it("variant max, ultrawork config exists → model swapped", async () => {
|
|
// given
|
|
const agents = {
|
|
sisyphus: {
|
|
ultrawork: {
|
|
model: "openai/gpt-5.2",
|
|
},
|
|
},
|
|
}
|
|
const hook = createUltraworkModelOverrideHook({ agents })
|
|
const { input, output } = createMockParams({})
|
|
|
|
// when
|
|
await hook["chat.params"](input, output)
|
|
|
|
// then
|
|
expect(input.message.model).toEqual({
|
|
providerID: "openai",
|
|
modelID: "gpt-5.2",
|
|
})
|
|
})
|
|
})
|
|
|
|
describe("no-op on non-max variant", () => {
|
|
it("variant high → model unchanged", async () => {
|
|
// given
|
|
const agents = {
|
|
sisyphus: {
|
|
ultrawork: {
|
|
model: "openai/gpt-5.2",
|
|
},
|
|
},
|
|
}
|
|
const hook = createUltraworkModelOverrideHook({ agents })
|
|
const { input, output } = createMockParams({ variant: "high" })
|
|
|
|
// when
|
|
await hook["chat.params"](input, output)
|
|
|
|
// then
|
|
expect(input.message.model).toBeUndefined()
|
|
})
|
|
})
|
|
|
|
describe("no-op without config", () => {
|
|
it("agent has no ultrawork config → model unchanged", async () => {
|
|
// given
|
|
const agents = {
|
|
hephaestus: {
|
|
ultrawork: {
|
|
model: "openai/gpt-5.2",
|
|
},
|
|
},
|
|
}
|
|
const hook = createUltraworkModelOverrideHook({ agents })
|
|
const { input, output } = createMockParams({})
|
|
|
|
// when
|
|
await hook["chat.params"](input, output)
|
|
|
|
// then
|
|
expect(input.message.model).toBeUndefined()
|
|
})
|
|
})
|
|
|
|
describe("empty ultrawork config", () => {
|
|
it("ultrawork: {} → no-op (model required)", async () => {
|
|
// given
|
|
const agents = {
|
|
sisyphus: {
|
|
ultrawork: undefined,
|
|
},
|
|
}
|
|
const hook = createUltraworkModelOverrideHook({ agents })
|
|
const { input, output } = createMockParams({})
|
|
|
|
// when
|
|
await hook["chat.params"](input, output)
|
|
|
|
// then
|
|
expect(input.message.model).toBeUndefined()
|
|
})
|
|
})
|
|
|
|
describe("model string parsing", () => {
|
|
it("openai/gpt-5.2 → { providerID: openai, modelID: gpt-5.2 }", async () => {
|
|
// given
|
|
const agents = {
|
|
sisyphus: {
|
|
ultrawork: {
|
|
model: "openai/gpt-5.2",
|
|
},
|
|
},
|
|
}
|
|
const hook = createUltraworkModelOverrideHook({ agents })
|
|
const { input, output } = createMockParams({})
|
|
|
|
// when
|
|
await hook["chat.params"](input, output)
|
|
|
|
// then
|
|
expect(input.message.model).toEqual({
|
|
providerID: "openai",
|
|
modelID: "gpt-5.2",
|
|
})
|
|
})
|
|
})
|
|
|
|
describe("nested slashes", () => {
|
|
it("google-vertex-anthropic/claude-opus-4-6 → { providerID: google-vertex-anthropic, modelID: claude-opus-4-6 } (first / only)", async () => {
|
|
// given
|
|
const agents = {
|
|
sisyphus: {
|
|
ultrawork: {
|
|
model: "google-vertex-anthropic/claude-opus-4-6",
|
|
},
|
|
},
|
|
}
|
|
const hook = createUltraworkModelOverrideHook({ agents })
|
|
const { input, output } = createMockParams({})
|
|
|
|
// when
|
|
await hook["chat.params"](input, output)
|
|
|
|
// then
|
|
expect(input.message.model).toEqual({
|
|
providerID: "google-vertex-anthropic",
|
|
modelID: "claude-opus-4-6",
|
|
})
|
|
})
|
|
})
|
|
|
|
describe("variant override", () => {
|
|
it("ultrawork.variant exists → message.variant updated", async () => {
|
|
// given
|
|
const agents = {
|
|
sisyphus: {
|
|
ultrawork: {
|
|
model: "openai/gpt-5.2",
|
|
variant: "high",
|
|
},
|
|
},
|
|
}
|
|
const hook = createUltraworkModelOverrideHook({ agents })
|
|
const { input, output } = createMockParams({})
|
|
|
|
// when
|
|
await hook["chat.params"](input, output)
|
|
|
|
// then
|
|
expect(input.message.variant).toBe("high")
|
|
})
|
|
})
|
|
|
|
describe("agent name normalization", () => {
|
|
it("Sisyphus (Ultraworker) → sisyphus config key lookup", async () => {
|
|
// given
|
|
const agents = {
|
|
sisyphus: {
|
|
ultrawork: {
|
|
model: "openai/gpt-5.2",
|
|
},
|
|
},
|
|
}
|
|
const hook = createUltraworkModelOverrideHook({ agents })
|
|
const { input, output } = createMockParams({ agent: "Sisyphus (Ultraworker)" })
|
|
|
|
// when
|
|
await hook["chat.params"](input, output)
|
|
|
|
// then
|
|
expect(input.message.model).toEqual({
|
|
providerID: "openai",
|
|
modelID: "gpt-5.2",
|
|
})
|
|
})
|
|
})
|
|
}) |