| ... | ... | @@ -1,13 +1,7 @@ |
| 1 | 1 | import { describe, expect, it } from "vite-plus/test"; |
| 2 | | import { |
| 3 | | DEFAULT_MODEL, |
| 4 | | ProviderDriverKind, |
| 5 | | ProviderInstanceId, |
| 6 | | type ModelCapabilities, |
| 7 | | } from "@t3tools/contracts"; |
| 2 | import { ProviderInstanceId, type ModelCapabilities } from "@t3tools/contracts"; |
| 8 | 3 | |
| 9 | 4 | import { |
| 10 | | applyClaudePromptEffortPrefix, |
| 11 | 5 | buildProviderOptionSelectionsFromDescriptors, |
| 12 | 6 | createModelCapabilities, |
| 13 | 7 | createModelSelection, |
| ... | ... | @@ -16,11 +10,6 @@ import { |
| 16 | 10 | getProviderOptionDescriptors, |
| 17 | 11 | getProviderOptionBooleanSelectionValue, |
| 18 | 12 | getProviderOptionStringSelectionValue, |
| 19 | | isClaudeUltrathinkPrompt, |
| 20 | | normalizeModelSlug, |
| 21 | | resolveModelSlugForProvider, |
| 22 | | resolveSelectableModel, |
| 23 | | trimOrNull, |
| 24 | 13 | } from "./model.ts"; |
| 25 | 14 | |
| 26 | 15 | const codexCaps: ModelCapabilities = createModelCapabilities({ |
| ... | ... | @@ -70,82 +59,6 @@ const claudeCaps: ModelCapabilities = createModelCapabilities({ |
| 70 | 59 | ], |
| 71 | 60 | }); |
| 72 | 61 | |
| 73 | | describe("normalizeModelSlug", () => { |
| 74 | | it("maps known aliases to canonical slugs", () => { |
| 75 | | const claude = ProviderDriverKind.make("claudeAgent"); |
| 76 | | expect(normalizeModelSlug("gpt-5-codex")).toBe("gpt-5.4"); |
| 77 | | expect(normalizeModelSlug("5.3")).toBe("gpt-5.3-codex"); |
| 78 | | expect(normalizeModelSlug("sonnet", claude)).toBe("claude-sonnet-4-6"); |
| 79 | | }); |
| 80 | | |
| 81 | | it("returns null for empty or missing values", () => { |
| 82 | | expect(normalizeModelSlug("")).toBeNull(); |
| 83 | | expect(normalizeModelSlug(" ")).toBeNull(); |
| 84 | | expect(normalizeModelSlug(null)).toBeNull(); |
| 85 | | expect(normalizeModelSlug(undefined)).toBeNull(); |
| 86 | | }); |
| 87 | | }); |
| 88 | | |
| 89 | | describe("resolveModelSlugForProvider", () => { |
| 90 | | it("returns defaults when the model is missing", () => { |
| 91 | | expect(resolveModelSlugForProvider(ProviderDriverKind.make("codex"), undefined)).toBe( |
| 92 | | DEFAULT_MODEL, |
| 93 | | ); |
| 94 | | expect(resolveModelSlugForProvider(ProviderDriverKind.make("ollama"), undefined)).toBe( |
| 95 | | DEFAULT_MODEL, |
| 96 | | ); |
| 97 | | expect(resolveModelSlugForProvider(ProviderDriverKind.make("grok"), undefined)).toBe( |
| 98 | | "grok-build", |
| 99 | | ); |
| 100 | | }); |
| 101 | | |
| 102 | | it("preserves normalized unknown models", () => { |
| 103 | | expect( |
| 104 | | resolveModelSlugForProvider(ProviderDriverKind.make("codex"), "custom/internal-model"), |
| 105 | | ).toBe("custom/internal-model"); |
| 106 | | }); |
| 107 | | }); |
| 108 | | |
| 109 | | describe("resolveSelectableModel", () => { |
| 110 | | it("resolves exact slugs, labels, and aliases", () => { |
| 111 | | const options = [ |
| 112 | | { slug: "gpt-5.3-codex", name: "GPT-5.3 Codex" }, |
| 113 | | { slug: "claude-sonnet-4-6", name: "Claude Sonnet 4.6" }, |
| 114 | | ]; |
| 115 | | expect(resolveSelectableModel(ProviderDriverKind.make("codex"), "gpt-5.3-codex", options)).toBe( |
| 116 | | "gpt-5.3-codex", |
| 117 | | ); |
| 118 | | expect(resolveSelectableModel(ProviderDriverKind.make("codex"), "gpt-5.3 codex", options)).toBe( |
| 119 | | "gpt-5.3-codex", |
| 120 | | ); |
| 121 | | expect(resolveSelectableModel(ProviderDriverKind.make("claudeAgent"), "sonnet", options)).toBe( |
| 122 | | "claude-sonnet-4-6", |
| 123 | | ); |
| 124 | | }); |
| 125 | | }); |
| 126 | | |
| 127 | | describe("misc helpers", () => { |
| 128 | | it("detects ultrathink prompts", () => { |
| 129 | | expect(isClaudeUltrathinkPrompt("Please ultrathink about this")).toBe(true); |
| 130 | | expect(isClaudeUltrathinkPrompt("Ultrathink:\nInvestigate")).toBe(true); |
| 131 | | expect(isClaudeUltrathinkPrompt("Investigate")).toBe(false); |
| 132 | | }); |
| 133 | | |
| 134 | | it("prefixes ultrathink prompts once", () => { |
| 135 | | expect(applyClaudePromptEffortPrefix("Investigate", "ultrathink")).toBe( |
| 136 | | "Ultrathink:\nInvestigate", |
| 137 | | ); |
| 138 | | expect(applyClaudePromptEffortPrefix("Ultrathink:\nInvestigate", "ultrathink")).toBe( |
| 139 | | "Ultrathink:\nInvestigate", |
| 140 | | ); |
| 141 | | }); |
| 142 | | |
| 143 | | it("trims strings to null", () => { |
| 144 | | expect(trimOrNull(" hi ")).toBe("hi"); |
| 145 | | expect(trimOrNull(" ")).toBeNull(); |
| 146 | | }); |
| 147 | | }); |
| 148 | | |
| 149 | 62 | describe("descriptor helpers", () => { |
| 150 | 63 | it("applies selection values to capability descriptors", () => { |
| 151 | 64 | expect( |