import { describe, expect, it } from "vitest"; import { DEFAULT_MODEL_BY_PROVIDER, type ModelCapabilities } from "@t3tools/contracts"; import { applyClaudePromptEffortPrefix, buildProviderOptionSelectionsFromDescriptors, createModelCapabilities, createModelSelection, getModelSelectionBooleanOptionValue, getModelSelectionStringOptionValue, getProviderOptionDescriptors, getProviderOptionBooleanSelectionValue, getProviderOptionStringSelectionValue, isClaudeUltrathinkPrompt, normalizeModelSlug, resolveModelSlugForProvider, resolveSelectableModel, trimOrNull, } from "./model.ts"; const codexCaps: ModelCapabilities = createModelCapabilities({ optionDescriptors: [ { id: "reasoningEffort", label: "Reasoning", type: "select", options: [ { id: "xhigh", label: "Extra High" }, { id: "high", label: "High", isDefault: true }, ], currentValue: "high", }, { id: "fastMode", label: "Fast Mode", type: "boolean", }, ], }); const claudeCaps: ModelCapabilities = createModelCapabilities({ optionDescriptors: [ { id: "effort", label: "Reasoning", type: "select", options: [ { id: "medium", label: "Medium" }, { id: "high", label: "High", isDefault: true }, { id: "ultrathink", label: "Ultrathink" }, ], currentValue: "high", promptInjectedValues: ["ultrathink"], }, { id: "contextWindow", label: "Context Window", type: "select", options: [ { id: "200k", label: "200k" }, { id: "1m", label: "1M", isDefault: true }, ], currentValue: "1m", }, ], }); describe("normalizeModelSlug", () => { it("maps known aliases to canonical slugs", () => { expect(normalizeModelSlug("gpt-5-codex")).toBe("gpt-5.4"); expect(normalizeModelSlug("5.3")).toBe("gpt-5.3-codex"); expect(normalizeModelSlug("sonnet", "claudeAgent")).toBe("claude-sonnet-4-6"); }); it("returns null for empty or missing values", () => { expect(normalizeModelSlug("")).toBeNull(); expect(normalizeModelSlug(" ")).toBeNull(); expect(normalizeModelSlug(null)).toBeNull(); expect(normalizeModelSlug(undefined)).toBeNull(); }); }); describe("resolveModelSlugForProvider", () => { it("returns defaults when the model is missing", () => { expect(resolveModelSlugForProvider("codex", undefined)).toBe(DEFAULT_MODEL_BY_PROVIDER.codex); expect(resolveModelSlugForProvider("claudeAgent", undefined)).toBe( DEFAULT_MODEL_BY_PROVIDER.claudeAgent, ); }); it("preserves normalized unknown models", () => { expect(resolveModelSlugForProvider("codex", "custom/internal-model")).toBe( "custom/internal-model", ); }); }); describe("resolveSelectableModel", () => { it("resolves exact slugs, labels, and aliases", () => { const options = [ { slug: "gpt-5.3-codex", name: "GPT-5.3 Codex" }, { slug: "claude-sonnet-4-6", name: "Claude Sonnet 4.6" }, ]; expect(resolveSelectableModel("codex", "gpt-5.3-codex", options)).toBe("gpt-5.3-codex"); expect(resolveSelectableModel("codex", "gpt-5.3 codex", options)).toBe("gpt-5.3-codex"); expect(resolveSelectableModel("claudeAgent", "sonnet", options)).toBe("claude-sonnet-4-6"); }); }); describe("misc helpers", () => { it("detects ultrathink prompts", () => { expect(isClaudeUltrathinkPrompt("Please ultrathink about this")).toBe(true); expect(isClaudeUltrathinkPrompt("Ultrathink:\nInvestigate")).toBe(true); expect(isClaudeUltrathinkPrompt("Investigate")).toBe(false); }); it("prefixes ultrathink prompts once", () => { expect(applyClaudePromptEffortPrefix("Investigate", "ultrathink")).toBe( "Ultrathink:\nInvestigate", ); expect(applyClaudePromptEffortPrefix("Ultrathink:\nInvestigate", "ultrathink")).toBe( "Ultrathink:\nInvestigate", ); }); it("trims strings to null", () => { expect(trimOrNull(" hi ")).toBe("hi"); expect(trimOrNull(" ")).toBeNull(); }); }); describe("descriptor helpers", () => { it("applies selection values to capability descriptors", () => { expect( getProviderOptionDescriptors({ caps: claudeCaps, selections: [ { id: "effort", value: "medium" }, { id: "contextWindow", value: "200k" }, ], }), ).toEqual([ { id: "effort", label: "Reasoning", type: "select", options: [ { id: "medium", label: "Medium" }, { id: "high", label: "High", isDefault: true }, { id: "ultrathink", label: "Ultrathink" }, ], currentValue: "medium", promptInjectedValues: ["ultrathink"], }, { id: "contextWindow", label: "Context Window", type: "select", options: [ { id: "200k", label: "200k" }, { id: "1m", label: "1M", isDefault: true }, ], currentValue: "200k", }, ]); }); it("builds wire-format option selections from descriptors", () => { const descriptors = getProviderOptionDescriptors({ caps: codexCaps, selections: [ { id: "reasoningEffort", value: "high" }, { id: "fastMode", value: true }, ], }); expect(buildProviderOptionSelectionsFromDescriptors(descriptors)).toEqual([ { id: "reasoningEffort", value: "high" }, { id: "fastMode", value: true }, ]); }); it("stores option selection arrays in model selections", () => { expect( createModelSelection("codex", "gpt-5.4", [ { id: "reasoningEffort", value: "high" }, { id: "fastMode", value: true }, ]), ).toEqual({ provider: "codex", model: "gpt-5.4", options: [ { id: "reasoningEffort", value: "high" }, { id: "fastMode", value: true }, ], }); }); it("reads typed option selection values", () => { const selection = createModelSelection("codex", "gpt-5.4", [ { id: "reasoningEffort", value: "high" }, { id: "fastMode", value: true }, ]); expect(getProviderOptionStringSelectionValue(selection.options, "reasoningEffort")).toBe( "high", ); expect(getProviderOptionStringSelectionValue(selection.options, "fastMode")).toBeUndefined(); expect(getProviderOptionBooleanSelectionValue(selection.options, "fastMode")).toBe(true); expect( getProviderOptionBooleanSelectionValue(selection.options, "reasoningEffort"), ).toBeUndefined(); expect(getModelSelectionStringOptionValue(selection, "reasoningEffort")).toBe("high"); expect(getModelSelectionBooleanOptionValue(selection, "fastMode")).toBe(true); }); });