Skip to content
Source
Sign inSign up

modelSelection.test.ts

72 lines2.4 KB

1import { assert, it } from "@effect/vitest";
2import * as Effect from "effect/Effect";
3import * as Schema from "effect/Schema";
4​
5import { ModelSelection } from "./modelSelection.ts";
6import { ProviderInstanceId } from "./providerInstance.ts";
7​
8const decodeModelSelection = Schema.decodeUnknownEffect(ModelSelection);
9const encodeModelSelection = Schema.encodeUnknownEffect(ModelSelection);
10​
11it.effect("ModelSelection migrates legacy `provider` field to `instanceId`", () =>
12 Effect.gen(function* () {
13 const parsed = yield* decodeModelSelection({
14 provider: "codex",
15 model: "gpt-5-codex",
16 options: [{ id: "reasoningEffort", value: "high" }],
17 });
18 assert.strictEqual(parsed.instanceId, ProviderInstanceId.make("codex"));
19 assert.strictEqual(parsed.model, "gpt-5-codex");
20 assert.deepStrictEqual(parsed.options, [{ id: "reasoningEffort", value: "high" }]);
21 }),
22);
23​
24it.effect("ModelSelection prefers explicit instanceId over legacy provider", () =>
25 Effect.gen(function* () {
26 const parsed = yield* decodeModelSelection({
27 provider: "codex",
28 instanceId: "codex_personal",
29 model: "gpt-5-codex",
30 });
31 assert.strictEqual(parsed.instanceId, ProviderInstanceId.make("codex_personal"));
32 }),
33);
34​
35it.effect(
36 "ModelSelection decodes unknown driver kinds via legacy provider (rollback / fork invariant)",
37 () =>
38 Effect.gen(function* () {
39 const parsed = yield* decodeModelSelection({
40 provider: "ollama",
41 model: "llama3:70b",
42 options: [{ id: "temperature", value: "0.4" }],
43 });
44 assert.strictEqual(parsed.instanceId, ProviderInstanceId.make("ollama"));
45 assert.strictEqual(parsed.model, "llama3:70b");
46 }),
47);
48​
49it.effect(
50 "normalizes legacy object-shaped options on decode and re-encodes as a canonical array",
51 () =>
52 Effect.gen(function* () {
53 const decoded = yield* decodeModelSelection({
54 provider: "claudeAgent",
55 model: "claude-opus-4-6",
56 options: {
57 effort: "max",
58 fastMode: true,
59​
60 emptyStr: " ",
61 nullish: null,
62 nested: { foo: 1 },
63 },
64 });
65 assert.deepStrictEqual(decoded.options, [
66 { id: "effort", value: "max" },
67 { id: "fastMode", value: true },
68 ]);
69 const encoded = yield* encodeModelSelection(decoded);
70 assert.deepStrictEqual(encoded.options, decoded.options);
71 }),
72);