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); });});
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);
});
});