From b6fb48e5b3099df335ebc9875c0bd0f11df668c6 Mon Sep 17 00:00:00 2001 From: Caihaohan Date: Sat, 28 Mar 2026 17:01:49 +0800 Subject: [PATCH] test(api): add failing model profile registry specs --- apps/api/package.json | 9 +++- apps/api/src/config/config.test.ts | 72 ++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 apps/api/src/config/config.test.ts diff --git a/apps/api/package.json b/apps/api/package.json index a9b7d46..c98d40a 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -2,5 +2,12 @@ "name": "@aiquant/api", "version": "0.0.0", "private": true, - "type": "module" + "type": "module", + "scripts": { + "test": "vitest run --" + }, + "devDependencies": { + "typescript": "^5.9.2", + "vitest": "^2.1.9" + } } diff --git a/apps/api/src/config/config.test.ts b/apps/api/src/config/config.test.ts new file mode 100644 index 0000000..9873d6a --- /dev/null +++ b/apps/api/src/config/config.test.ts @@ -0,0 +1,72 @@ +import { describe, expect, it } from "vitest"; +import { createConfigFromEnv, createModelProfileRegistry } from "./model-profile-registry"; + +describe("model profile registry", () => { + const env = { + MODEL_PROFILES_JSON: JSON.stringify([ + { + name: "signal.fast.v1", + provider: "openai-compatible", + apiBase: "https://example.com/v1", + apiKeyRef: "OPENAI_API_KEY", + model: "gpt-4.1-mini", + temperature: 0.2, + timeoutMs: 10_000, + capabilities: { + structuredOutputs: true, + jsonMode: true + }, + tags: ["fast"] + }, + { + name: "optimizer.reasoning.v1", + provider: "openai-compatible", + apiBase: "https://example.com/v1", + apiKeyRef: "OPENAI_API_KEY", + model: "o4-mini", + temperature: 0.6, + timeoutMs: 20_000, + capabilities: { + structuredOutputs: true, + jsonMode: true + }, + tags: ["reasoning"] + } + ]), + AGENT_MODEL_BINDINGS_JSON: JSON.stringify({ + signal: "signal.fast.v1", + risk: "signal.fast.v1", + evaluator: "optimizer.reasoning.v1", + optimizer: "optimizer.reasoning.v1" + }) + }; + + it("loads model profiles from environment-backed config", () => { + const config = createConfigFromEnv(env); + + expect(config.modelProfiles).toHaveLength(2); + expect(config.agentBindings.optimizer).toBe("optimizer.reasoning.v1"); + }); + + it("resolves agent bindings to concrete profiles", () => { + const config = createConfigFromEnv(env); + const registry = createModelProfileRegistry(config); + + expect(registry.get("signal.fast.v1").model).toBe("gpt-4.1-mini"); + expect(registry.resolveAgentBinding("optimizer").model).toBe("o4-mini"); + }); + + it("rejects bindings to unknown profiles", () => { + expect(() => + createModelProfileRegistry({ + modelProfiles: createConfigFromEnv(env).modelProfiles, + agentBindings: { + signal: "signal.fast.v1", + risk: "signal.fast.v1", + evaluator: "signal.fast.v1", + optimizer: "missing-profile" + } + }) + ).toThrow(/Unknown model profile/); + }); +});