105 lines
4.0 KiB
TypeScript
105 lines
4.0 KiB
TypeScript
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
import { mkdtempSync } from "node:fs";
|
|
import { tmpdir } from "node:os";
|
|
import { join } from "node:path";
|
|
|
|
// familyGuard imports combo.ts which transitively touches DB modules at load;
|
|
// give it a throwaway DATA_DIR so it uses defaults instead of the real store.
|
|
process.env.DATA_DIR = mkdtempSync(join(tmpdir(), "omniroute-embed-family-"));
|
|
|
|
const { getEmbeddingDimension, detectEmbeddingDimensionConflict } = await import(
|
|
"../../open-sse/config/embeddingRegistry.ts"
|
|
);
|
|
const { findEmbeddingComboDimensionConflict } = await import(
|
|
"../../src/lib/embeddings/familyGuard.ts"
|
|
);
|
|
|
|
test("getEmbeddingDimension resolves known dimensions from the registry", () => {
|
|
assert.equal(getEmbeddingDimension("openai/text-embedding-3-small"), 1536);
|
|
assert.equal(getEmbeddingDimension("openai/text-embedding-3-large"), 3072);
|
|
assert.equal(getEmbeddingDimension("nebius/Qwen/Qwen3-Embedding-8B"), 4096);
|
|
assert.equal(getEmbeddingDimension("gemini/gemini-embedding-001"), 768);
|
|
// OpenRouter re-exports OpenAI ids under its own prefix at the same dimension.
|
|
assert.equal(getEmbeddingDimension("openrouter/openai/text-embedding-3-small"), 1536);
|
|
});
|
|
|
|
test("getEmbeddingDimension returns undefined for unknown/local models", () => {
|
|
assert.equal(getEmbeddingDimension("localembed/my-model"), undefined);
|
|
assert.equal(getEmbeddingDimension("mystery/whatever"), undefined);
|
|
});
|
|
|
|
test("detectEmbeddingDimensionConflict flags mixed vector spaces", () => {
|
|
const res = detectEmbeddingDimensionConflict([
|
|
"openai/text-embedding-3-small", // 1536
|
|
"nebius/Qwen/Qwen3-Embedding-8B", // 4096
|
|
]);
|
|
assert.equal(res.conflict, true);
|
|
assert.deepEqual(res.distinct, [1536, 4096]);
|
|
});
|
|
|
|
test("detectEmbeddingDimensionConflict accepts a uniform dimension", () => {
|
|
const res = detectEmbeddingDimensionConflict([
|
|
"openai/text-embedding-3-small", // 1536
|
|
"openrouter/openai/text-embedding-3-small", // 1536
|
|
]);
|
|
assert.equal(res.conflict, false);
|
|
assert.deepEqual(res.distinct, [1536]);
|
|
});
|
|
|
|
test("detectEmbeddingDimensionConflict ignores unknown dimensions (no false positive)", () => {
|
|
const res = detectEmbeddingDimensionConflict([
|
|
"openai/text-embedding-3-small", // 1536 (known)
|
|
"localembed/unknown", // undefined (ignored)
|
|
]);
|
|
assert.equal(res.conflict, false);
|
|
assert.deepEqual(res.distinct, [1536]);
|
|
});
|
|
|
|
test("detectEmbeddingDimensionConflict is a no-op for empty / all-unknown lists", () => {
|
|
assert.equal(detectEmbeddingDimensionConflict([]).conflict, false);
|
|
assert.equal(
|
|
detectEmbeddingDimensionConflict(["localembed/a", "localembed/b"]).conflict,
|
|
false
|
|
);
|
|
});
|
|
|
|
test("findEmbeddingComboDimensionConflict flags a mixed-dimension embedding combo", () => {
|
|
const combo = {
|
|
name: "mixed-embeds",
|
|
models: [
|
|
{ model: "openai/text-embedding-3-small" }, // 1536
|
|
{ model: "nebius/Qwen/Qwen3-Embedding-8B" }, // 4096
|
|
],
|
|
};
|
|
const res = findEmbeddingComboDimensionConflict(combo, [combo]);
|
|
assert.equal(res.conflict, true);
|
|
assert.deepEqual(res.distinct, [1536, 4096]);
|
|
});
|
|
|
|
test("findEmbeddingComboDimensionConflict passes a uniform embedding combo", () => {
|
|
const combo = {
|
|
name: "uniform-embeds",
|
|
models: [
|
|
{ model: "openai/text-embedding-3-small" }, // 1536
|
|
{ model: "openrouter/openai/text-embedding-3-small" }, // 1536
|
|
],
|
|
};
|
|
const res = findEmbeddingComboDimensionConflict(combo, [combo]);
|
|
assert.equal(res.conflict, false);
|
|
});
|
|
|
|
test("findEmbeddingComboDimensionConflict expands nested combos before checking", () => {
|
|
const child = {
|
|
name: "child-embeds",
|
|
models: [
|
|
{ model: "openai/text-embedding-3-small" }, // 1536
|
|
{ model: "nebius/Qwen/Qwen3-Embedding-8B" }, // 4096
|
|
],
|
|
};
|
|
const parent = { name: "parent-embeds", models: [{ model: "child-embeds" }] };
|
|
const res = findEmbeddingComboDimensionConflict(parent, [parent, child]);
|
|
assert.equal(res.conflict, true);
|
|
assert.deepEqual(res.distinct, [1536, 4096]);
|
|
});
|