| @@ -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 { · 2 unmodified lines |
| 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({ · 43 unmodified lines |
| 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( |