feat: add OpenRouter audit generation pipeline

This commit is contained in:
2026-06-05 11:06:01 +02:00
parent 370aeec2a0
commit 03cb65fde4
29 changed files with 5462 additions and 74 deletions

View File

@@ -0,0 +1,130 @@
import assert from "node:assert/strict";
import test from "node:test";
import {
MODEL_PROFILE_KEYS,
MODEL_PROFILES,
resolveModelProfile,
resolveModelId,
} from "../lib/ai/model-profiles";
import type { ModelProfileKey } from "../lib/ai/model-profiles";
type AssertNoExtraProfiles = Array<
(typeof MODEL_PROFILE_KEYS)[number]
>;
const assertNoExtraProfiles: AssertNoExtraProfiles = [
"classification",
"multimodalAudit",
"germanCopy",
"qualityReview",
];
test("all required model profiles exist", () => {
const keys = Object.keys(MODEL_PROFILES).sort();
assert.deepEqual(keys, [...assertNoExtraProfiles].sort());
});
test("each profile includes required contract fields", () => {
const profileEntries = Object.entries(MODEL_PROFILES) as Array<
[ModelProfileKey, unknown]
>;
for (const [key, rawProfile] of profileEntries) {
const profile = rawProfile as {
modelId: string;
temperature: number;
maxTokens: number;
supportsImages: boolean;
stage: string;
envOverrideKey: string;
};
assert.equal(typeof profile.modelId, "string", `${key} modelId`);
assert.equal(
profile.modelId.length > 0,
true,
`${key} modelId should be non-empty`,
);
assert.equal(typeof profile.temperature, "number", `${key} temperature`);
assert.equal(typeof profile.maxTokens, "number", `${key} maxTokens`);
assert.equal(
Number.isFinite(profile.temperature),
true,
`${key} temperature numeric`,
);
assert.equal(
Number.isInteger(profile.maxTokens),
true,
`${key} maxTokens integer`,
);
assert.equal(
typeof profile.supportsImages,
"boolean",
`${key} supportsImages`,
);
assert.equal(typeof profile.stage, "string", `${key} stage`);
assert.equal(profile.stage.length > 0, true, `${key} stage label`);
assert.equal(typeof profile.envOverrideKey, "string", `${key} env override`);
assert.equal(profile.envOverrideKey.length > 0, true, `${key} env key`);
}
});
test("multimodal profile explicitly supports images", () => {
assert.equal(MODEL_PROFILES.multimodalAudit.supportsImages, true);
});
test("non-multimodal profiles disable image support", () => {
assert.equal(MODEL_PROFILES.classification.supportsImages, false);
assert.equal(MODEL_PROFILES.germanCopy.supportsImages, false);
assert.equal(MODEL_PROFILES.qualityReview.supportsImages, false);
});
test("model IDs can be overridden via dedicated env variables", () => {
assert.equal(
resolveModelId("classification", {
OPENROUTER_MODEL_CLASSIFICATION: "custom/classification",
}),
"custom/classification",
);
assert.equal(
resolveModelId("multimodalAudit", {
OPENROUTER_MODEL_MULTIMODAL_AUDIT: "custom/multimodal",
}),
"custom/multimodal",
);
assert.equal(
resolveModelId("germanCopy", {
OPENROUTER_MODEL_GERMAN_COPY: "custom/german",
}),
"custom/german",
);
assert.equal(
resolveModelId("qualityReview", {
OPENROUTER_MODEL_QUALITY_REVIEW: "custom/quality",
}),
"custom/quality",
);
});
test("ENV overrides are ignored when empty", () => {
assert.equal(
resolveModelId("classification", {
OPENROUTER_MODEL_CLASSIFICATION: "",
}),
MODEL_PROFILES.classification.modelId,
);
});
test("resolveModelProfile returns profile config including runtime values", () => {
const profile = resolveModelProfile("qualityReview", {
OPENROUTER_MODEL_QUALITY_REVIEW: "custom/quality-review-profile",
});
assert.equal(profile.stage, "qualityReview");
assert.equal(profile.maxTokens, MODEL_PROFILES.qualityReview.maxTokens);
assert.equal(profile.temperature, MODEL_PROFILES.qualityReview.temperature);
assert.equal(profile.supportsImages, MODEL_PROFILES.qualityReview.supportsImages);
assert.equal(profile.modelId, "custom/quality-review-profile");
});