bikky 0.3.1 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +124 -35
- package/dist/cli.d.ts +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +7 -1
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +22 -3
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +61 -6
- package/dist/config.js.map +1 -1
- package/dist/config.test.js +17 -9
- package/dist/config.test.js.map +1 -1
- package/dist/daemon/capture-policy.d.ts +95 -0
- package/dist/daemon/capture-policy.d.ts.map +1 -0
- package/dist/daemon/capture-policy.js +139 -0
- package/dist/daemon/capture-policy.js.map +1 -0
- package/dist/daemon/capture-policy.test.d.ts +2 -0
- package/dist/daemon/capture-policy.test.d.ts.map +1 -0
- package/dist/daemon/capture-policy.test.js +46 -0
- package/dist/daemon/capture-policy.test.js.map +1 -0
- package/dist/daemon/consolidation.d.ts.map +1 -1
- package/dist/daemon/consolidation.js +84 -98
- package/dist/daemon/consolidation.js.map +1 -1
- package/dist/daemon/episode-summary.d.ts +72 -0
- package/dist/daemon/episode-summary.d.ts.map +1 -0
- package/dist/daemon/episode-summary.js +208 -0
- package/dist/daemon/episode-summary.js.map +1 -0
- package/dist/daemon/episode-summary.test.d.ts +2 -0
- package/dist/daemon/episode-summary.test.d.ts.map +1 -0
- package/dist/daemon/episode-summary.test.js +101 -0
- package/dist/daemon/episode-summary.test.js.map +1 -0
- package/dist/daemon/extraction.d.ts +25 -0
- package/dist/daemon/extraction.d.ts.map +1 -1
- package/dist/daemon/extraction.js +244 -124
- package/dist/daemon/extraction.js.map +1 -1
- package/dist/daemon/extraction.test.d.ts +2 -0
- package/dist/daemon/extraction.test.d.ts.map +1 -0
- package/dist/daemon/extraction.test.js +106 -0
- package/dist/daemon/extraction.test.js.map +1 -0
- package/dist/daemon/loop.d.ts.map +1 -1
- package/dist/daemon/loop.js +8 -6
- package/dist/daemon/loop.js.map +1 -1
- package/dist/daemon/qdrant.d.ts +59 -8
- package/dist/daemon/qdrant.d.ts.map +1 -1
- package/dist/daemon/qdrant.js +74 -23
- package/dist/daemon/qdrant.js.map +1 -1
- package/dist/daemon/qdrant.test.js +2 -2
- package/dist/daemon/qdrant.test.js.map +1 -1
- package/dist/daemon/relations.d.ts +6 -1
- package/dist/daemon/relations.d.ts.map +1 -1
- package/dist/daemon/relations.js +44 -63
- package/dist/daemon/relations.js.map +1 -1
- package/dist/daemon/session-index.d.ts +60 -0
- package/dist/daemon/session-index.d.ts.map +1 -0
- package/dist/daemon/session-index.js +136 -0
- package/dist/daemon/session-index.js.map +1 -0
- package/dist/daemon/session-index.test.d.ts +2 -0
- package/dist/daemon/session-index.test.d.ts.map +1 -0
- package/dist/daemon/session-index.test.js +54 -0
- package/dist/daemon/session-index.test.js.map +1 -0
- package/dist/daemon/session-summary.d.ts +69 -0
- package/dist/daemon/session-summary.d.ts.map +1 -0
- package/dist/daemon/session-summary.js +200 -0
- package/dist/daemon/session-summary.js.map +1 -0
- package/dist/daemon/session-summary.test.d.ts +2 -0
- package/dist/daemon/session-summary.test.d.ts.map +1 -0
- package/dist/daemon/session-summary.test.js +160 -0
- package/dist/daemon/session-summary.test.js.map +1 -0
- package/dist/daemon/staleness.test.d.ts +7 -0
- package/dist/daemon/staleness.test.d.ts.map +1 -0
- package/dist/daemon/staleness.test.js +128 -0
- package/dist/daemon/staleness.test.js.map +1 -0
- package/dist/daemon/workstream-summary.d.ts +61 -0
- package/dist/daemon/workstream-summary.d.ts.map +1 -0
- package/dist/daemon/workstream-summary.js +220 -0
- package/dist/daemon/workstream-summary.js.map +1 -0
- package/dist/daemon/workstream-summary.test.d.ts +2 -0
- package/dist/daemon/workstream-summary.test.d.ts.map +1 -0
- package/dist/daemon/workstream-summary.test.js +86 -0
- package/dist/daemon/workstream-summary.test.js.map +1 -0
- package/dist/lib/qdrant-client.d.ts +6 -1
- package/dist/lib/qdrant-client.d.ts.map +1 -1
- package/dist/lib/qdrant-client.js +3 -4
- package/dist/lib/qdrant-client.js.map +1 -1
- package/dist/lib/qdrant-client.test.js +21 -2
- package/dist/lib/qdrant-client.test.js.map +1 -1
- package/dist/lifecycle.test.d.ts +8 -0
- package/dist/lifecycle.test.d.ts.map +1 -0
- package/dist/lifecycle.test.js +74 -0
- package/dist/lifecycle.test.js.map +1 -0
- package/dist/llm/embedding/index.d.ts +42 -0
- package/dist/llm/embedding/index.d.ts.map +1 -0
- package/dist/llm/embedding/index.js +78 -0
- package/dist/llm/embedding/index.js.map +1 -0
- package/dist/llm/embedding/index.test.d.ts +8 -0
- package/dist/llm/embedding/index.test.d.ts.map +1 -0
- package/dist/llm/embedding/index.test.js +100 -0
- package/dist/llm/embedding/index.test.js.map +1 -0
- package/dist/llm/embedding/providers/bedrock.d.ts +16 -0
- package/dist/llm/embedding/providers/bedrock.d.ts.map +1 -0
- package/dist/llm/embedding/providers/bedrock.js +90 -0
- package/dist/llm/embedding/providers/bedrock.js.map +1 -0
- package/dist/llm/embedding/providers/bedrock.test.d.ts +2 -0
- package/dist/llm/embedding/providers/bedrock.test.d.ts.map +1 -0
- package/dist/llm/embedding/providers/bedrock.test.js +24 -0
- package/dist/llm/embedding/providers/bedrock.test.js.map +1 -0
- package/dist/llm/embedding/providers/index.d.ts +9 -0
- package/dist/llm/embedding/providers/index.d.ts.map +1 -0
- package/dist/llm/embedding/providers/index.js +9 -0
- package/dist/llm/embedding/providers/index.js.map +1 -0
- package/dist/llm/embedding/providers/ollama.d.ts +6 -0
- package/dist/llm/embedding/providers/ollama.d.ts.map +1 -0
- package/dist/llm/embedding/providers/ollama.js +39 -0
- package/dist/llm/embedding/providers/ollama.js.map +1 -0
- package/dist/llm/embedding/providers/ollama.test.d.ts +2 -0
- package/dist/llm/embedding/providers/ollama.test.d.ts.map +1 -0
- package/dist/llm/embedding/providers/ollama.test.js +54 -0
- package/dist/llm/embedding/providers/ollama.test.js.map +1 -0
- package/dist/llm/embedding/providers/openai.d.ts +6 -0
- package/dist/llm/embedding/providers/openai.d.ts.map +1 -0
- package/dist/llm/embedding/providers/openai.js +44 -0
- package/dist/llm/embedding/providers/openai.js.map +1 -0
- package/dist/llm/embedding/providers/openai.test.d.ts +2 -0
- package/dist/llm/embedding/providers/openai.test.d.ts.map +1 -0
- package/dist/llm/embedding/providers/openai.test.js +48 -0
- package/dist/llm/embedding/providers/openai.test.js.map +1 -0
- package/dist/llm/embedding/providers/portkey.d.ts +15 -0
- package/dist/llm/embedding/providers/portkey.d.ts.map +1 -0
- package/dist/llm/embedding/providers/portkey.js +58 -0
- package/dist/llm/embedding/providers/portkey.js.map +1 -0
- package/dist/llm/embedding/providers/portkey.test.d.ts +2 -0
- package/dist/llm/embedding/providers/portkey.test.d.ts.map +1 -0
- package/dist/llm/embedding/providers/portkey.test.js +56 -0
- package/dist/llm/embedding/providers/portkey.test.js.map +1 -0
- package/dist/llm/embedding/registry.d.ts +14 -0
- package/dist/llm/embedding/registry.d.ts.map +1 -0
- package/dist/llm/embedding/registry.js +27 -0
- package/dist/llm/embedding/registry.js.map +1 -0
- package/dist/llm/embedding/registry.test.d.ts +7 -0
- package/dist/llm/embedding/registry.test.d.ts.map +1 -0
- package/dist/llm/embedding/registry.test.js +68 -0
- package/dist/llm/embedding/registry.test.js.map +1 -0
- package/dist/llm/embedding/types.d.ts +55 -0
- package/dist/llm/embedding/types.d.ts.map +1 -0
- package/dist/llm/embedding/types.js +12 -0
- package/dist/llm/embedding/types.js.map +1 -0
- package/dist/llm/errors.d.ts +95 -0
- package/dist/llm/errors.d.ts.map +1 -0
- package/dist/llm/errors.js +164 -0
- package/dist/llm/errors.js.map +1 -0
- package/dist/llm/errors.test.d.ts +2 -0
- package/dist/llm/errors.test.d.ts.map +1 -0
- package/dist/llm/errors.test.js +103 -0
- package/dist/llm/errors.test.js.map +1 -0
- package/dist/llm/fetch.d.ts +39 -0
- package/dist/llm/fetch.d.ts.map +1 -0
- package/dist/llm/fetch.js +52 -0
- package/dist/llm/fetch.js.map +1 -0
- package/dist/llm/index.d.ts +6 -3
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +2 -2
- package/dist/llm/index.js.map +1 -1
- package/dist/llm/inference/index.d.ts +39 -0
- package/dist/llm/inference/index.d.ts.map +1 -0
- package/dist/llm/inference/index.js +118 -0
- package/dist/llm/inference/index.js.map +1 -0
- package/dist/llm/inference/index.test.d.ts +6 -0
- package/dist/llm/inference/index.test.d.ts.map +1 -0
- package/dist/llm/inference/index.test.js +109 -0
- package/dist/llm/inference/index.test.js.map +1 -0
- package/dist/llm/inference/providers/bedrock.d.ts +18 -0
- package/dist/llm/inference/providers/bedrock.d.ts.map +1 -0
- package/dist/llm/inference/providers/bedrock.js +105 -0
- package/dist/llm/inference/providers/bedrock.js.map +1 -0
- package/dist/llm/inference/providers/bedrock.test.d.ts +2 -0
- package/dist/llm/inference/providers/bedrock.test.d.ts.map +1 -0
- package/dist/llm/inference/providers/bedrock.test.js +21 -0
- package/dist/llm/inference/providers/bedrock.test.js.map +1 -0
- package/dist/llm/inference/providers/index.d.ts +10 -0
- package/dist/llm/inference/providers/index.d.ts.map +1 -0
- package/dist/llm/inference/providers/index.js +10 -0
- package/dist/llm/inference/providers/index.js.map +1 -0
- package/dist/llm/inference/providers/ollama.d.ts +8 -0
- package/dist/llm/inference/providers/ollama.d.ts.map +1 -0
- package/dist/llm/inference/providers/ollama.js +63 -0
- package/dist/llm/inference/providers/ollama.js.map +1 -0
- package/dist/llm/inference/providers/ollama.test.d.ts +2 -0
- package/dist/llm/inference/providers/ollama.test.d.ts.map +1 -0
- package/dist/llm/inference/providers/ollama.test.js +57 -0
- package/dist/llm/inference/providers/ollama.test.js.map +1 -0
- package/dist/llm/inference/providers/openai.d.ts +11 -0
- package/dist/llm/inference/providers/openai.d.ts.map +1 -0
- package/dist/llm/inference/providers/openai.js +73 -0
- package/dist/llm/inference/providers/openai.js.map +1 -0
- package/dist/llm/inference/providers/openai.test.d.ts +2 -0
- package/dist/llm/inference/providers/openai.test.d.ts.map +1 -0
- package/dist/llm/inference/providers/openai.test.js +46 -0
- package/dist/llm/inference/providers/openai.test.js.map +1 -0
- package/dist/llm/inference/providers/portkey.d.ts +13 -0
- package/dist/llm/inference/providers/portkey.d.ts.map +1 -0
- package/dist/llm/inference/providers/portkey.js +80 -0
- package/dist/llm/inference/providers/portkey.js.map +1 -0
- package/dist/llm/inference/providers/portkey.test.d.ts +2 -0
- package/dist/llm/inference/providers/portkey.test.d.ts.map +1 -0
- package/dist/llm/inference/providers/portkey.test.js +48 -0
- package/dist/llm/inference/providers/portkey.test.js.map +1 -0
- package/dist/llm/inference/registry.d.ts +15 -0
- package/dist/llm/inference/registry.d.ts.map +1 -0
- package/dist/llm/inference/registry.js +28 -0
- package/dist/llm/inference/registry.js.map +1 -0
- package/dist/llm/inference/registry.test.d.ts +6 -0
- package/dist/llm/inference/registry.test.d.ts.map +1 -0
- package/dist/llm/inference/registry.test.js +63 -0
- package/dist/llm/inference/registry.test.js.map +1 -0
- package/dist/llm/inference/types.d.ts +84 -0
- package/dist/llm/inference/types.d.ts.map +1 -0
- package/dist/llm/inference/types.js +9 -0
- package/dist/llm/inference/types.js.map +1 -0
- package/dist/llm/telemetry.d.ts +25 -0
- package/dist/llm/telemetry.d.ts.map +1 -0
- package/dist/llm/telemetry.js +43 -0
- package/dist/llm/telemetry.js.map +1 -0
- package/dist/llm/telemetry.test.d.ts +5 -0
- package/dist/llm/telemetry.test.d.ts.map +1 -0
- package/dist/llm/telemetry.test.js +89 -0
- package/dist/llm/telemetry.test.js.map +1 -0
- package/dist/llm/types.d.ts +4 -37
- package/dist/llm/types.d.ts.map +1 -1
- package/dist/llm/types.js +4 -1
- package/dist/llm/types.js.map +1 -1
- package/dist/logger.d.ts +18 -3
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +102 -20
- package/dist/logger.js.map +1 -1
- package/dist/logger.test.d.ts +5 -0
- package/dist/logger.test.d.ts.map +1 -0
- package/dist/logger.test.js +103 -0
- package/dist/logger.test.js.map +1 -0
- package/dist/mcp/api.d.ts +15 -1
- package/dist/mcp/api.d.ts.map +1 -1
- package/dist/mcp/api.js +44 -19
- package/dist/mcp/api.js.map +1 -1
- package/dist/mcp/api.test.d.ts +6 -0
- package/dist/mcp/api.test.d.ts.map +1 -0
- package/dist/mcp/api.test.js +130 -0
- package/dist/mcp/api.test.js.map +1 -0
- package/dist/mcp/helpers.d.ts +1 -0
- package/dist/mcp/helpers.d.ts.map +1 -1
- package/dist/mcp/helpers.js +62 -6
- package/dist/mcp/helpers.js.map +1 -1
- package/dist/mcp/helpers.test.js +71 -10
- package/dist/mcp/helpers.test.js.map +1 -1
- package/dist/mcp/index.d.ts +7 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +46 -21
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/taxonomy.d.ts +251 -31
- package/dist/mcp/taxonomy.d.ts.map +1 -1
- package/dist/mcp/taxonomy.js +603 -171
- package/dist/mcp/taxonomy.js.map +1 -1
- package/dist/mcp/taxonomy.test.d.ts +1 -1
- package/dist/mcp/taxonomy.test.js +141 -302
- package/dist/mcp/taxonomy.test.js.map +1 -1
- package/dist/mcp/tools.d.ts +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.integration.itest.d.ts +23 -0
- package/dist/mcp/tools.integration.itest.d.ts.map +1 -0
- package/dist/mcp/tools.integration.itest.js +172 -0
- package/dist/mcp/tools.integration.itest.js.map +1 -0
- package/dist/mcp/tools.js +422 -357
- package/dist/mcp/tools.js.map +1 -1
- package/dist/mcp/tools.test.d.ts +16 -0
- package/dist/mcp/tools.test.d.ts.map +1 -0
- package/dist/mcp/tools.test.js +472 -0
- package/dist/mcp/tools.test.js.map +1 -0
- package/dist/mcp/types.d.ts +63 -8
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/prompts/brief.d.ts +19 -0
- package/dist/prompts/brief.d.ts.map +1 -0
- package/dist/prompts/brief.js +67 -0
- package/dist/prompts/brief.js.map +1 -0
- package/dist/prompts/contradiction.d.ts +24 -0
- package/dist/prompts/contradiction.d.ts.map +1 -0
- package/dist/prompts/contradiction.js +73 -0
- package/dist/prompts/contradiction.js.map +1 -0
- package/dist/prompts/distill.d.ts +21 -0
- package/dist/prompts/distill.d.ts.map +1 -0
- package/dist/prompts/distill.js +92 -0
- package/dist/prompts/distill.js.map +1 -0
- package/dist/prompts/episode-summary.d.ts +15 -0
- package/dist/prompts/episode-summary.d.ts.map +1 -0
- package/dist/prompts/episode-summary.js +60 -0
- package/dist/prompts/episode-summary.js.map +1 -0
- package/dist/prompts/extraction.d.ts +14 -0
- package/dist/prompts/extraction.d.ts.map +1 -0
- package/dist/prompts/extraction.js +110 -0
- package/dist/prompts/extraction.js.map +1 -0
- package/dist/prompts/index.d.ts +52 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +104 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/prompts.test.d.ts +8 -0
- package/dist/prompts/prompts.test.d.ts.map +1 -0
- package/dist/prompts/prompts.test.js +140 -0
- package/dist/prompts/prompts.test.js.map +1 -0
- package/dist/prompts/relations.d.ts +17 -0
- package/dist/prompts/relations.d.ts.map +1 -0
- package/dist/prompts/relations.js +72 -0
- package/dist/prompts/relations.js.map +1 -0
- package/dist/prompts/workstream-summary.d.ts +17 -0
- package/dist/prompts/workstream-summary.d.ts.map +1 -0
- package/dist/prompts/workstream-summary.js +72 -0
- package/dist/prompts/workstream-summary.js.map +1 -0
- package/dist/render.d.ts +41 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +185 -0
- package/dist/render.js.map +1 -0
- package/dist/render.test.d.ts +8 -0
- package/dist/render.test.d.ts.map +1 -0
- package/dist/render.test.js +243 -0
- package/dist/render.test.js.map +1 -0
- package/docs/diagrams/architecture.svg +87 -0
- package/docs/diagrams/team-memory.svg +250 -0
- package/docs/screenshots/dashboard.png +0 -0
- package/docs/screenshots/graph.png +0 -0
- package/docs/screenshots/memory.png +0 -0
- package/package.json +12 -3
- package/dist/llm/embedding.d.ts +0 -13
- package/dist/llm/embedding.d.ts.map +0 -1
- package/dist/llm/embedding.js +0 -127
- package/dist/llm/embedding.js.map +0 -1
- package/dist/llm/embedding.test.d.ts +0 -8
- package/dist/llm/embedding.test.d.ts.map +0 -1
- package/dist/llm/embedding.test.js +0 -117
- package/dist/llm/embedding.test.js.map +0 -1
- package/dist/llm/inference.d.ts +0 -12
- package/dist/llm/inference.d.ts.map +0 -1
- package/dist/llm/inference.js +0 -146
- package/dist/llm/inference.js.map +0 -1
- package/dist/llm/inference.test.d.ts +0 -8
- package/dist/llm/inference.test.d.ts.map +0 -1
- package/dist/llm/inference.test.js +0 -117
- package/dist/llm/inference.test.js.map +0 -1
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { describe, it, beforeEach, afterEach } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { ollamaEmbeddingProvider } from "./ollama.js";
|
|
4
|
+
const cfg = {
|
|
5
|
+
provider: "ollama",
|
|
6
|
+
model: "qwen3-embedding:0.6b",
|
|
7
|
+
dimensions: 4,
|
|
8
|
+
baseUrl: "http://localhost:11434",
|
|
9
|
+
apiKey: null,
|
|
10
|
+
extra: {},
|
|
11
|
+
timeoutMs: 5_000,
|
|
12
|
+
retries: 0,
|
|
13
|
+
retryBaseDelayMs: 10,
|
|
14
|
+
};
|
|
15
|
+
describe("ollama embedding provider", () => {
|
|
16
|
+
const realFetch = globalThis.fetch;
|
|
17
|
+
beforeEach(() => { globalThis.fetch = realFetch; });
|
|
18
|
+
afterEach(() => { globalThis.fetch = realFetch; });
|
|
19
|
+
it("POSTs to /v1/embeddings with model + input, no auth header", async () => {
|
|
20
|
+
let captured = null;
|
|
21
|
+
globalThis.fetch = (async (url, init) => {
|
|
22
|
+
captured = { url, init };
|
|
23
|
+
return new Response(JSON.stringify({ data: [{ embedding: [1, 2, 3, 4] }] }), { status: 200 });
|
|
24
|
+
});
|
|
25
|
+
const out = await ollamaEmbeddingProvider.embed("hello", cfg);
|
|
26
|
+
assert.deepStrictEqual(out, [1, 2, 3, 4]);
|
|
27
|
+
assert.ok(captured, "fetch should have been called");
|
|
28
|
+
const cap = captured;
|
|
29
|
+
assert.strictEqual(cap.url, "http://localhost:11434/v1/embeddings");
|
|
30
|
+
assert.strictEqual(cap.init.method, "POST");
|
|
31
|
+
const headers = cap.init.headers;
|
|
32
|
+
assert.strictEqual(headers["Content-Type"], "application/json");
|
|
33
|
+
assert.ok(!("Authorization" in headers), "should not send Authorization header");
|
|
34
|
+
assert.deepStrictEqual(JSON.parse(cap.init.body), {
|
|
35
|
+
model: "qwen3-embedding:0.6b", input: "hello",
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
it("throws with status + body snippet on non-OK response", async () => {
|
|
39
|
+
globalThis.fetch = (async () => new Response("model not found", { status: 404 }));
|
|
40
|
+
await assert.rejects(() => ollamaEmbeddingProvider.embed("hi", cfg), {
|
|
41
|
+
message: /\[ollama\/qwen3-embedding:0\.6b\] \(404\): model not found/,
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
it("throws when response data array is empty", async () => {
|
|
45
|
+
globalThis.fetch = (async () => new Response(JSON.stringify({ data: [] }), { status: 200 }));
|
|
46
|
+
await assert.rejects(() => ollamaEmbeddingProvider.embed("hi", cfg), { message: /missing data/ });
|
|
47
|
+
});
|
|
48
|
+
it("declares browserCompatible + ollama defaults", () => {
|
|
49
|
+
assert.strictEqual(ollamaEmbeddingProvider.name, "ollama");
|
|
50
|
+
assert.strictEqual(ollamaEmbeddingProvider.browserCompatible, true);
|
|
51
|
+
assert.strictEqual(ollamaEmbeddingProvider.defaults.dimensions, 1024);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
//# sourceMappingURL=ollama.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.test.js","sourceRoot":"","sources":["../../../../src/llm/embedding/providers/ollama.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAGtD,MAAM,GAAG,GAA4B;IACnC,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,sBAAsB;IAC7B,UAAU,EAAE,CAAC;IACb,OAAO,EAAE,wBAAwB;IACjC,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,EAAE;IACT,SAAS,EAAE,KAAK;IAChB,OAAO,EAAE,CAAC;IACV,gBAAgB,EAAE,EAAE;CACrB,CAAC;AAEF,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC;IACnC,UAAU,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,SAAS,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnD,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,IAAI,QAAQ,GAA8C,IAAI,CAAC;QAC/D,UAAU,CAAC,KAAK,GAAG,CAAC,KAAK,EAAE,GAAW,EAAE,IAAiB,EAAE,EAAE;YAC3D,QAAQ,GAAG,EAAE,GAAG,EAAE,IAAI,EAAwC,CAAC;YAC/D,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAChG,CAAC,CAA4B,CAAC;QAE9B,MAAM,GAAG,GAAG,MAAM,uBAAuB,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC9D,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,+BAA+B,CAAC,CAAC;QACrD,MAAM,GAAG,GAAG,QAAyD,CAAC;QACtE,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,sCAAsC,CAAC,CAAC;QACpE,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,OAAiC,CAAC;QAC3D,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAChE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,IAAI,OAAO,CAAC,EAAE,sCAAsC,CAAC,CAAC;QACjF,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAc,CAAC,EAAE;YAC1D,KAAK,EAAE,sBAAsB,EAAE,KAAK,EAAE,OAAO;SAC9C,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,UAAU,CAAC,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,QAAQ,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAA4B,CAAC;QAC7G,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,uBAAuB,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE;YACnE,OAAO,EAAE,4DAA4D;SACtE,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,UAAU,CAAC,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAA4B,CAAC;QACxH,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,uBAAuB,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;IACpG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,WAAW,CAAC,uBAAuB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC3D,MAAM,CAAC,WAAW,CAAC,uBAAuB,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;QACpE,MAAM,CAAC,WAAW,CAAC,uBAAuB,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../../src/llm/embedding/providers/openai.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAA2B,MAAM,aAAa,CAAC;AAQ9E,eAAO,MAAM,uBAAuB,EAAE,iBAiCrC,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI embedding provider — /v1/embeddings with bearer auth.
|
|
3
|
+
*/
|
|
4
|
+
import { registerEmbeddingProvider } from "../registry.js";
|
|
5
|
+
import { resilientFetch } from "../../fetch.js";
|
|
6
|
+
const RETRY_CAP_MS = 5_000;
|
|
7
|
+
export const openaiEmbeddingProvider = {
|
|
8
|
+
name: "openai",
|
|
9
|
+
label: "OpenAI",
|
|
10
|
+
browserCompatible: true,
|
|
11
|
+
defaults: {
|
|
12
|
+
model: "text-embedding-3-small",
|
|
13
|
+
dimensions: 1536,
|
|
14
|
+
baseUrl: "https://api.openai.com",
|
|
15
|
+
},
|
|
16
|
+
async embed(text, cfg) {
|
|
17
|
+
if (!cfg.apiKey)
|
|
18
|
+
throw new Error("Embedding failed [openai]: api key not configured");
|
|
19
|
+
const resp = await resilientFetch({
|
|
20
|
+
url: `${cfg.baseUrl}/v1/embeddings`,
|
|
21
|
+
init: {
|
|
22
|
+
method: "POST",
|
|
23
|
+
headers: {
|
|
24
|
+
"Content-Type": "application/json",
|
|
25
|
+
Authorization: `Bearer ${cfg.apiKey}`,
|
|
26
|
+
},
|
|
27
|
+
body: JSON.stringify({ model: cfg.model, input: text }),
|
|
28
|
+
},
|
|
29
|
+
timeoutMs: cfg.timeoutMs,
|
|
30
|
+
retries: cfg.retries,
|
|
31
|
+
baseDelayMs: cfg.retryBaseDelayMs,
|
|
32
|
+
capDelayMs: RETRY_CAP_MS,
|
|
33
|
+
provider: "openai",
|
|
34
|
+
model: cfg.model,
|
|
35
|
+
});
|
|
36
|
+
const data = (await resp.json());
|
|
37
|
+
const first = data.data[0];
|
|
38
|
+
if (!first)
|
|
39
|
+
throw new Error(`Embedding response from openai missing data`);
|
|
40
|
+
return first.embedding;
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
registerEmbeddingProvider(openaiEmbeddingProvider);
|
|
44
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../../src/llm/embedding/providers/openai.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAOhD,MAAM,YAAY,GAAG,KAAK,CAAC;AAE3B,MAAM,CAAC,MAAM,uBAAuB,GAAsB;IACxD,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,QAAQ;IACf,iBAAiB,EAAE,IAAI;IACvB,QAAQ,EAAE;QACR,KAAK,EAAE,wBAAwB;QAC/B,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,wBAAwB;KAClC;IACD,KAAK,CAAC,KAAK,CAAC,IAAY,EAAE,GAA4B;QACpD,IAAI,CAAC,GAAG,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACtF,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC;YAChC,GAAG,EAAE,GAAG,GAAG,CAAC,OAAO,gBAAgB;YACnC,IAAI,EAAE;gBACJ,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,aAAa,EAAE,UAAU,GAAG,CAAC,MAAM,EAAE;iBACtC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;aACxD;YACD,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,WAAW,EAAE,GAAG,CAAC,gBAAgB;YACjC,UAAU,EAAE,YAAY;YACxB,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,GAAG,CAAC,KAAK;SACjB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAwB,CAAC;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAC3E,OAAO,KAAK,CAAC,SAAS,CAAC;IACzB,CAAC;CACF,CAAC;AAEF,yBAAyB,CAAC,uBAAuB,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.test.d.ts","sourceRoot":"","sources":["../../../../src/llm/embedding/providers/openai.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { describe, it, beforeEach, afterEach } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { openaiEmbeddingProvider } from "./openai.js";
|
|
4
|
+
const baseCfg = {
|
|
5
|
+
provider: "openai",
|
|
6
|
+
model: "text-embedding-3-small",
|
|
7
|
+
dimensions: 1536,
|
|
8
|
+
baseUrl: "https://api.openai.com",
|
|
9
|
+
apiKey: "sk-test",
|
|
10
|
+
extra: {},
|
|
11
|
+
timeoutMs: 5_000,
|
|
12
|
+
retries: 0,
|
|
13
|
+
retryBaseDelayMs: 10,
|
|
14
|
+
};
|
|
15
|
+
describe("openai embedding provider", () => {
|
|
16
|
+
const realFetch = globalThis.fetch;
|
|
17
|
+
beforeEach(() => { globalThis.fetch = realFetch; });
|
|
18
|
+
afterEach(() => { globalThis.fetch = realFetch; });
|
|
19
|
+
it("POSTs to /v1/embeddings with bearer auth", async () => {
|
|
20
|
+
let captured = null;
|
|
21
|
+
globalThis.fetch = (async (url, init) => {
|
|
22
|
+
captured = { url, init };
|
|
23
|
+
return new Response(JSON.stringify({ data: [{ embedding: [0.1, 0.2] }] }), { status: 200 });
|
|
24
|
+
});
|
|
25
|
+
const out = await openaiEmbeddingProvider.embed("hello", baseCfg);
|
|
26
|
+
assert.deepStrictEqual(out, [0.1, 0.2]);
|
|
27
|
+
assert.strictEqual(captured.url, "https://api.openai.com/v1/embeddings");
|
|
28
|
+
const headers = captured.init.headers;
|
|
29
|
+
assert.strictEqual(headers["Authorization"], "Bearer sk-test");
|
|
30
|
+
});
|
|
31
|
+
it("throws when api key is missing", async () => {
|
|
32
|
+
await assert.rejects(() => openaiEmbeddingProvider.embed("hi", { ...baseCfg, apiKey: null }), {
|
|
33
|
+
message: /api key not configured/,
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
it("surfaces upstream error status + body", async () => {
|
|
37
|
+
globalThis.fetch = (async () => new Response("invalid_api_key", { status: 401 }));
|
|
38
|
+
await assert.rejects(() => openaiEmbeddingProvider.embed("hi", baseCfg), {
|
|
39
|
+
message: /\[openai\/text-embedding-3-small\] \(401\): invalid_api_key/,
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
it("declares browserCompatible + openai defaults", () => {
|
|
43
|
+
assert.strictEqual(openaiEmbeddingProvider.browserCompatible, true);
|
|
44
|
+
assert.strictEqual(openaiEmbeddingProvider.defaults.model, "text-embedding-3-small");
|
|
45
|
+
assert.strictEqual(openaiEmbeddingProvider.defaults.dimensions, 1536);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=openai.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.test.js","sourceRoot":"","sources":["../../../../src/llm/embedding/providers/openai.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Portkey embedding provider — OpenAI-compatible gateway with provider routing.
|
|
3
|
+
*
|
|
4
|
+
* Portkey is a unified gateway: one endpoint, many underlying providers, with
|
|
5
|
+
* routing/fallback/observability handled server-side. Configure the underlying
|
|
6
|
+
* provider via either:
|
|
7
|
+
*
|
|
8
|
+
* - extra.virtual_key → server-side credential alias (recommended)
|
|
9
|
+
* - extra.config_id → a saved Portkey config bundle
|
|
10
|
+
*
|
|
11
|
+
* Reference: https://portkey.ai/docs/api-reference/embeddings
|
|
12
|
+
*/
|
|
13
|
+
import type { EmbeddingProvider } from "../types.js";
|
|
14
|
+
export declare const portkeyEmbeddingProvider: EmbeddingProvider;
|
|
15
|
+
//# sourceMappingURL=portkey.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portkey.d.ts","sourceRoot":"","sources":["../../../../src/llm/embedding/providers/portkey.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAA2B,MAAM,aAAa,CAAC;AAQ9E,eAAO,MAAM,wBAAwB,EAAE,iBAqCtC,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Portkey embedding provider — OpenAI-compatible gateway with provider routing.
|
|
3
|
+
*
|
|
4
|
+
* Portkey is a unified gateway: one endpoint, many underlying providers, with
|
|
5
|
+
* routing/fallback/observability handled server-side. Configure the underlying
|
|
6
|
+
* provider via either:
|
|
7
|
+
*
|
|
8
|
+
* - extra.virtual_key → server-side credential alias (recommended)
|
|
9
|
+
* - extra.config_id → a saved Portkey config bundle
|
|
10
|
+
*
|
|
11
|
+
* Reference: https://portkey.ai/docs/api-reference/embeddings
|
|
12
|
+
*/
|
|
13
|
+
import { registerEmbeddingProvider } from "../registry.js";
|
|
14
|
+
import { resilientFetch } from "../../fetch.js";
|
|
15
|
+
const RETRY_CAP_MS = 5_000;
|
|
16
|
+
export const portkeyEmbeddingProvider = {
|
|
17
|
+
name: "portkey",
|
|
18
|
+
label: "Portkey (gateway)",
|
|
19
|
+
browserCompatible: true,
|
|
20
|
+
defaults: {
|
|
21
|
+
model: "@openai/text-embedding-3-small",
|
|
22
|
+
dimensions: 1536,
|
|
23
|
+
baseUrl: "https://api.portkey.ai",
|
|
24
|
+
},
|
|
25
|
+
async embed(text, cfg) {
|
|
26
|
+
if (!cfg.apiKey)
|
|
27
|
+
throw new Error("Embedding failed [portkey]: api key not configured");
|
|
28
|
+
const headers = {
|
|
29
|
+
"Content-Type": "application/json",
|
|
30
|
+
"x-portkey-api-key": cfg.apiKey,
|
|
31
|
+
};
|
|
32
|
+
if (cfg.extra.virtual_key)
|
|
33
|
+
headers["x-portkey-virtual-key"] = cfg.extra.virtual_key;
|
|
34
|
+
if (cfg.extra.config_id)
|
|
35
|
+
headers["x-portkey-config"] = cfg.extra.config_id;
|
|
36
|
+
const resp = await resilientFetch({
|
|
37
|
+
url: `${cfg.baseUrl}/v1/embeddings`,
|
|
38
|
+
init: {
|
|
39
|
+
method: "POST",
|
|
40
|
+
headers,
|
|
41
|
+
body: JSON.stringify({ model: cfg.model, input: text }),
|
|
42
|
+
},
|
|
43
|
+
timeoutMs: cfg.timeoutMs,
|
|
44
|
+
retries: cfg.retries,
|
|
45
|
+
baseDelayMs: cfg.retryBaseDelayMs,
|
|
46
|
+
capDelayMs: RETRY_CAP_MS,
|
|
47
|
+
provider: "portkey",
|
|
48
|
+
model: cfg.model,
|
|
49
|
+
});
|
|
50
|
+
const data = (await resp.json());
|
|
51
|
+
const first = data.data[0];
|
|
52
|
+
if (!first)
|
|
53
|
+
throw new Error(`Embedding response from portkey missing data`);
|
|
54
|
+
return first.embedding;
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
registerEmbeddingProvider(portkeyEmbeddingProvider);
|
|
58
|
+
//# sourceMappingURL=portkey.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portkey.js","sourceRoot":"","sources":["../../../../src/llm/embedding/providers/portkey.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAOhD,MAAM,YAAY,GAAG,KAAK,CAAC;AAE3B,MAAM,CAAC,MAAM,wBAAwB,GAAsB;IACzD,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,mBAAmB;IAC1B,iBAAiB,EAAE,IAAI;IACvB,QAAQ,EAAE;QACR,KAAK,EAAE,gCAAgC;QACvC,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,wBAAwB;KAClC;IACD,KAAK,CAAC,KAAK,CAAC,IAAY,EAAE,GAA4B;QACpD,IAAI,CAAC,GAAG,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACvF,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,mBAAmB,EAAE,GAAG,CAAC,MAAM;SAChC,CAAC;QACF,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW;YAAE,OAAO,CAAC,uBAAuB,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;QACpF,IAAI,GAAG,CAAC,KAAK,CAAC,SAAS;YAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC;QAE3E,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC;YAChC,GAAG,EAAE,GAAG,GAAG,CAAC,OAAO,gBAAgB;YACnC,IAAI,EAAE;gBACJ,MAAM,EAAE,MAAM;gBACd,OAAO;gBACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;aACxD;YACD,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,WAAW,EAAE,GAAG,CAAC,gBAAgB;YACjC,UAAU,EAAE,YAAY;YACxB,QAAQ,EAAE,SAAS;YACnB,KAAK,EAAE,GAAG,CAAC,KAAK;SACjB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAyB,CAAC;QACzD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC5E,OAAO,KAAK,CAAC,SAAS,CAAC;IACzB,CAAC;CACF,CAAC;AAEF,yBAAyB,CAAC,wBAAwB,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portkey.test.d.ts","sourceRoot":"","sources":["../../../../src/llm/embedding/providers/portkey.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { describe, it, beforeEach, afterEach } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { portkeyEmbeddingProvider } from "./portkey.js";
|
|
4
|
+
const baseCfg = {
|
|
5
|
+
provider: "portkey",
|
|
6
|
+
model: "@openai/text-embedding-3-small",
|
|
7
|
+
dimensions: 1536,
|
|
8
|
+
baseUrl: "https://api.portkey.ai",
|
|
9
|
+
apiKey: "pk-test",
|
|
10
|
+
extra: {},
|
|
11
|
+
timeoutMs: 5_000,
|
|
12
|
+
retries: 0,
|
|
13
|
+
retryBaseDelayMs: 10,
|
|
14
|
+
};
|
|
15
|
+
describe("portkey embedding provider", () => {
|
|
16
|
+
const realFetch = globalThis.fetch;
|
|
17
|
+
beforeEach(() => { globalThis.fetch = realFetch; });
|
|
18
|
+
afterEach(() => { globalThis.fetch = realFetch; });
|
|
19
|
+
it("sends x-portkey-api-key + virtual key + config id when present", async () => {
|
|
20
|
+
let captured = null;
|
|
21
|
+
globalThis.fetch = (async (_url, init) => {
|
|
22
|
+
captured = init;
|
|
23
|
+
return new Response(JSON.stringify({ data: [{ embedding: [9, 9] }] }), { status: 200 });
|
|
24
|
+
});
|
|
25
|
+
const out = await portkeyEmbeddingProvider.embed("hi", {
|
|
26
|
+
...baseCfg,
|
|
27
|
+
extra: { virtual_key: "vk-openai", config_id: "cfg-fallback" },
|
|
28
|
+
});
|
|
29
|
+
assert.deepStrictEqual(out, [9, 9]);
|
|
30
|
+
const headers = captured.headers;
|
|
31
|
+
assert.strictEqual(headers["x-portkey-api-key"], "pk-test");
|
|
32
|
+
assert.strictEqual(headers["x-portkey-virtual-key"], "vk-openai");
|
|
33
|
+
assert.strictEqual(headers["x-portkey-config"], "cfg-fallback");
|
|
34
|
+
});
|
|
35
|
+
it("omits virtual key + config id when not in extra", async () => {
|
|
36
|
+
let captured = null;
|
|
37
|
+
globalThis.fetch = (async (_url, init) => {
|
|
38
|
+
captured = init;
|
|
39
|
+
return new Response(JSON.stringify({ data: [{ embedding: [1] }] }), { status: 200 });
|
|
40
|
+
});
|
|
41
|
+
await portkeyEmbeddingProvider.embed("hi", baseCfg);
|
|
42
|
+
const headers = captured.headers;
|
|
43
|
+
assert.ok(!("x-portkey-virtual-key" in headers));
|
|
44
|
+
assert.ok(!("x-portkey-config" in headers));
|
|
45
|
+
});
|
|
46
|
+
it("throws when api key is missing", async () => {
|
|
47
|
+
await assert.rejects(() => portkeyEmbeddingProvider.embed("hi", { ...baseCfg, apiKey: null }), {
|
|
48
|
+
message: /api key not configured/,
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
it("declares browserCompatible + portkey defaults", () => {
|
|
52
|
+
assert.strictEqual(portkeyEmbeddingProvider.browserCompatible, true);
|
|
53
|
+
assert.strictEqual(portkeyEmbeddingProvider.defaults.baseUrl, "https://api.portkey.ai");
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
//# sourceMappingURL=portkey.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portkey.test.js","sourceRoot":"","sources":["../../../../src/llm/embedding/providers/portkey.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory registry of embedding providers.
|
|
3
|
+
*
|
|
4
|
+
* Providers self-register from their own files — see ./providers/*.ts.
|
|
5
|
+
* The registry is populated as a side-effect of importing ./providers/index.js,
|
|
6
|
+
* which ./index.ts does at module top.
|
|
7
|
+
*/
|
|
8
|
+
import type { EmbeddingProvider } from "./types.js";
|
|
9
|
+
export declare function registerEmbeddingProvider(provider: EmbeddingProvider): void;
|
|
10
|
+
export declare function getEmbeddingProvider(name: string): EmbeddingProvider;
|
|
11
|
+
export declare function listEmbeddingProviders(): EmbeddingProvider[];
|
|
12
|
+
/** Test-only: clear the registry. Not exported from the package barrel. */
|
|
13
|
+
export declare function _resetEmbeddingRegistry(): void;
|
|
14
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/llm/embedding/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAIpD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAE3E;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAOpE;AAED,wBAAgB,sBAAsB,IAAI,iBAAiB,EAAE,CAE5D;AAED,2EAA2E;AAC3E,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory registry of embedding providers.
|
|
3
|
+
*
|
|
4
|
+
* Providers self-register from their own files — see ./providers/*.ts.
|
|
5
|
+
* The registry is populated as a side-effect of importing ./providers/index.js,
|
|
6
|
+
* which ./index.ts does at module top.
|
|
7
|
+
*/
|
|
8
|
+
const providers = new Map();
|
|
9
|
+
export function registerEmbeddingProvider(provider) {
|
|
10
|
+
providers.set(provider.name, provider);
|
|
11
|
+
}
|
|
12
|
+
export function getEmbeddingProvider(name) {
|
|
13
|
+
const p = providers.get(name);
|
|
14
|
+
if (!p) {
|
|
15
|
+
const known = [...providers.keys()].sort().join(", ") || "(none registered)";
|
|
16
|
+
throw new Error(`Unknown embedding provider: "${name}". Registered: ${known}`);
|
|
17
|
+
}
|
|
18
|
+
return p;
|
|
19
|
+
}
|
|
20
|
+
export function listEmbeddingProviders() {
|
|
21
|
+
return [...providers.values()];
|
|
22
|
+
}
|
|
23
|
+
/** Test-only: clear the registry. Not exported from the package barrel. */
|
|
24
|
+
export function _resetEmbeddingRegistry() {
|
|
25
|
+
providers.clear();
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/llm/embedding/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,SAAS,GAAG,IAAI,GAAG,EAA6B,CAAC;AAEvD,MAAM,UAAU,yBAAyB,CAAC,QAA2B;IACnE,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAC;QAC7E,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,kBAAkB,KAAK,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,uBAAuB;IACrC,SAAS,CAAC,KAAK,EAAE,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.test.d.ts","sourceRoot":"","sources":["../../../src/llm/embedding/registry.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the embedding registry — the dispatch layer.
|
|
3
|
+
*
|
|
4
|
+
* Provider-specific behaviour is tested in providers/*.test.ts.
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, beforeEach, afterEach } from "node:test";
|
|
7
|
+
import assert from "node:assert/strict";
|
|
8
|
+
import { registerEmbeddingProvider, getEmbeddingProvider, listEmbeddingProviders, _resetEmbeddingRegistry, } from "./registry.js";
|
|
9
|
+
const fakeProvider = {
|
|
10
|
+
name: "fake-test",
|
|
11
|
+
label: "Fake (test)",
|
|
12
|
+
browserCompatible: true,
|
|
13
|
+
defaults: { model: "fake-model", dimensions: 4 },
|
|
14
|
+
async embed() { return [0, 0, 0, 0]; },
|
|
15
|
+
};
|
|
16
|
+
describe("embedding registry", () => {
|
|
17
|
+
let snapshot;
|
|
18
|
+
beforeEach(() => {
|
|
19
|
+
snapshot = listEmbeddingProviders();
|
|
20
|
+
_resetEmbeddingRegistry();
|
|
21
|
+
});
|
|
22
|
+
afterEach(() => {
|
|
23
|
+
_resetEmbeddingRegistry();
|
|
24
|
+
for (const p of snapshot)
|
|
25
|
+
registerEmbeddingProvider(p);
|
|
26
|
+
});
|
|
27
|
+
it("registers and retrieves a provider by name", () => {
|
|
28
|
+
registerEmbeddingProvider(fakeProvider);
|
|
29
|
+
const got = getEmbeddingProvider("fake-test");
|
|
30
|
+
assert.strictEqual(got.name, "fake-test");
|
|
31
|
+
assert.strictEqual(got.defaults.dimensions, 4);
|
|
32
|
+
});
|
|
33
|
+
it("throws a helpful error when the provider is unknown", () => {
|
|
34
|
+
registerEmbeddingProvider(fakeProvider);
|
|
35
|
+
assert.throws(() => getEmbeddingProvider("nope"), {
|
|
36
|
+
message: /Unknown embedding provider: "nope"\. Registered: fake-test/,
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
it("lists all registered providers", () => {
|
|
40
|
+
registerEmbeddingProvider(fakeProvider);
|
|
41
|
+
registerEmbeddingProvider({ ...fakeProvider, name: "fake-2", label: "Fake 2" });
|
|
42
|
+
const names = listEmbeddingProviders().map((p) => p.name).sort();
|
|
43
|
+
assert.deepStrictEqual(names, ["fake-2", "fake-test"]);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
describe("built-in embedding providers (registered via barrel import)", () => {
|
|
47
|
+
it("registers ollama, openai, bedrock, portkey by importing the index", async () => {
|
|
48
|
+
// Snapshot before mutating
|
|
49
|
+
const snap = listEmbeddingProviders();
|
|
50
|
+
_resetEmbeddingRegistry();
|
|
51
|
+
try {
|
|
52
|
+
// Re-import the barrel — providers self-register.
|
|
53
|
+
// (Cache-busting is unnecessary; the module-level register call ran on first import.)
|
|
54
|
+
await import("./providers/index.js");
|
|
55
|
+
const names = listEmbeddingProviders().map((p) => p.name).sort();
|
|
56
|
+
// bedrock + ollama + openai + portkey
|
|
57
|
+
for (const expected of ["bedrock", "ollama", "openai", "portkey"]) {
|
|
58
|
+
assert.ok(names.includes(expected), `expected ${expected} to be registered, got ${names.join(", ")}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
finally {
|
|
62
|
+
_resetEmbeddingRegistry();
|
|
63
|
+
for (const p of snap)
|
|
64
|
+
registerEmbeddingProvider(p);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
//# sourceMappingURL=registry.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.test.js","sourceRoot":"","sources":["../../../src/llm/embedding/registry.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding provider interface.
|
|
3
|
+
*
|
|
4
|
+
* Each embedding backend (Ollama, OpenAI, Bedrock, Portkey, …) lives in its
|
|
5
|
+
* own file under ./providers/ and self-registers via registerEmbeddingProvider().
|
|
6
|
+
* Adding a new provider is a single-file change — no edits to dispatchers,
|
|
7
|
+
* no edits to config types, no edits to UI gates.
|
|
8
|
+
*
|
|
9
|
+
* See CONTRIBUTING.md → "Adding a provider" for the recipe.
|
|
10
|
+
*/
|
|
11
|
+
import type { LogFn } from "../types.js";
|
|
12
|
+
export type { LogFn };
|
|
13
|
+
/**
|
|
14
|
+
* Resolved per-call embedding configuration. Built once by initEmbedding()
|
|
15
|
+
* from the user's config + the provider's defaults, then passed to embed()
|
|
16
|
+
* on every call.
|
|
17
|
+
*/
|
|
18
|
+
export interface ResolvedEmbeddingConfig {
|
|
19
|
+
/** Provider name — matches EmbeddingProvider.name. */
|
|
20
|
+
provider: string;
|
|
21
|
+
/** Model identifier. Provider-specific (e.g. "text-embedding-3-small", "@openai/text-embedding-3-small"). */
|
|
22
|
+
model: string;
|
|
23
|
+
/** Output vector dimensions. The Qdrant collection is created with this. */
|
|
24
|
+
dimensions: number;
|
|
25
|
+
/** HTTP base URL (no trailing slash). Empty for SDK-only providers like Bedrock. */
|
|
26
|
+
baseUrl: string;
|
|
27
|
+
/** API key, or null for unauthenticated/SDK providers. */
|
|
28
|
+
apiKey: string | null;
|
|
29
|
+
/** Provider-specific bag — region for Bedrock, virtual_key for Portkey, project_id for Vertex, … */
|
|
30
|
+
extra: Record<string, string | undefined>;
|
|
31
|
+
/** Per-request timeout in milliseconds (HTTP providers). Defaults set by initEmbedding. */
|
|
32
|
+
timeoutMs: number;
|
|
33
|
+
/** Max retries on transient/rate-limit/timeout failures. */
|
|
34
|
+
retries: number;
|
|
35
|
+
/** Base backoff delay in milliseconds (full-jitter exponential). */
|
|
36
|
+
retryBaseDelayMs: number;
|
|
37
|
+
}
|
|
38
|
+
export interface EmbeddingProvider {
|
|
39
|
+
/** Stable identifier used in config (e.g. "ollama"). Lowercase, no spaces. */
|
|
40
|
+
readonly name: string;
|
|
41
|
+
/** Human label for logs and tooling. */
|
|
42
|
+
readonly label: string;
|
|
43
|
+
/** Defaults applied when the user picks this provider with no overrides. */
|
|
44
|
+
readonly defaults: {
|
|
45
|
+
model: string;
|
|
46
|
+
dimensions: number;
|
|
47
|
+
/** Default HTTP base URL. Omit for SDK-only providers. */
|
|
48
|
+
baseUrl?: string;
|
|
49
|
+
};
|
|
50
|
+
/** Whether this provider can be called from a browser (UI uses this to gate semantic search). */
|
|
51
|
+
readonly browserCompatible: boolean;
|
|
52
|
+
/** Compute one embedding. Providers that need heavy SDKs should dynamic-import on first call. */
|
|
53
|
+
embed(text: string, cfg: ResolvedEmbeddingConfig): Promise<number[]>;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/llm/embedding/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,YAAY,EAAE,KAAK,EAAE,CAAC;AAEtB;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACtC,sDAAsD;IACtD,QAAQ,EAAE,MAAM,CAAC;IACjB,6GAA6G;IAC7G,KAAK,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,UAAU,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,oGAAoG;IACpG,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAC1C,2FAA2F;IAC3F,SAAS,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,8EAA8E;IAC9E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,EAAE;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,0DAA0D;QAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,iGAAiG;IACjG,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC,iGAAiG;IACjG,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACtE"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding provider interface.
|
|
3
|
+
*
|
|
4
|
+
* Each embedding backend (Ollama, OpenAI, Bedrock, Portkey, …) lives in its
|
|
5
|
+
* own file under ./providers/ and self-registers via registerEmbeddingProvider().
|
|
6
|
+
* Adding a new provider is a single-file change — no edits to dispatchers,
|
|
7
|
+
* no edits to config types, no edits to UI gates.
|
|
8
|
+
*
|
|
9
|
+
* See CONTRIBUTING.md → "Adding a provider" for the recipe.
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/llm/embedding/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|