@askdkc/kiokuko 0.2.6 → 0.2.8
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.ja.md +18 -0
- package/README.ko.md +17 -0
- package/README.md +23 -0
- package/README.zh-CN.md +16 -0
- package/dist/akinator/agent-task.d.ts +5 -0
- package/dist/akinator/agent-task.d.ts.map +1 -1
- package/dist/akinator/agent-task.js +98 -28
- package/dist/akinator/agent-task.js.map +1 -1
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +94 -8
- package/dist/cli.js.map +1 -1
- package/dist/commands/doctor.d.ts +4 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +46 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/embeddings.d.ts +26 -0
- package/dist/commands/embeddings.d.ts.map +1 -0
- package/dist/commands/embeddings.js +190 -0
- package/dist/commands/embeddings.js.map +1 -0
- package/dist/commands/import.d.ts.map +1 -1
- package/dist/commands/import.js +7 -0
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/use.d.ts.map +1 -1
- package/dist/commands/use.js +22 -8
- package/dist/commands/use.js.map +1 -1
- package/dist/config/paths.d.ts +5 -0
- package/dist/config/paths.d.ts.map +1 -1
- package/dist/config/paths.js +34 -0
- package/dist/config/paths.js.map +1 -1
- package/dist/context/broker.d.ts +3 -1
- package/dist/context/broker.d.ts.map +1 -1
- package/dist/context/broker.js +11 -7
- package/dist/context/broker.js.map +1 -1
- package/dist/context/delivery.d.ts.map +1 -1
- package/dist/context/delivery.js +5 -3
- package/dist/context/delivery.js.map +1 -1
- package/dist/context/ranking.d.ts +1 -1
- package/dist/context/ranking.d.ts.map +1 -1
- package/dist/context/ranking.js +1 -0
- package/dist/context/ranking.js.map +1 -1
- package/dist/context/scoped-broker.d.ts +4 -3
- package/dist/context/scoped-broker.d.ts.map +1 -1
- package/dist/context/scoped-broker.js +45 -7
- package/dist/context/scoped-broker.js.map +1 -1
- package/dist/context/selection-state.d.ts +12 -0
- package/dist/context/selection-state.d.ts.map +1 -1
- package/dist/context/selection-state.js +117 -7
- package/dist/context/selection-state.js.map +1 -1
- package/dist/db/capabilities.d.ts +8 -0
- package/dist/db/capabilities.d.ts.map +1 -1
- package/dist/db/capabilities.js +14 -0
- package/dist/db/capabilities.js.map +1 -1
- package/dist/db/connection.d.ts +7 -0
- package/dist/db/connection.d.ts.map +1 -1
- package/dist/db/connection.js +56 -0
- package/dist/db/connection.js.map +1 -1
- package/dist/db/migrate.d.ts.map +1 -1
- package/dist/db/migrate.js +3 -0
- package/dist/db/migrate.js.map +1 -1
- package/dist/embedding/backend.d.ts +27 -0
- package/dist/embedding/backend.d.ts.map +1 -0
- package/dist/embedding/backend.js +67 -0
- package/dist/embedding/backend.js.map +1 -0
- package/dist/embedding/config.d.ts +10 -0
- package/dist/embedding/config.d.ts.map +1 -0
- package/dist/embedding/config.js +142 -0
- package/dist/embedding/config.js.map +1 -0
- package/dist/embedding/diagnostics.d.ts +34 -0
- package/dist/embedding/diagnostics.d.ts.map +1 -0
- package/dist/embedding/diagnostics.js +263 -0
- package/dist/embedding/diagnostics.js.map +1 -0
- package/dist/embedding/document.d.ts +20 -0
- package/dist/embedding/document.d.ts.map +1 -0
- package/dist/embedding/document.js +122 -0
- package/dist/embedding/document.js.map +1 -0
- package/dist/embedding/javascript-backend.d.ts +11 -0
- package/dist/embedding/javascript-backend.d.ts.map +1 -0
- package/dist/embedding/javascript-backend.js +164 -0
- package/dist/embedding/javascript-backend.js.map +1 -0
- package/dist/embedding/jobs.d.ts +67 -0
- package/dist/embedding/jobs.d.ts.map +1 -0
- package/dist/embedding/jobs.js +259 -0
- package/dist/embedding/jobs.js.map +1 -0
- package/dist/embedding/local-model-loader.d.ts +24 -0
- package/dist/embedding/local-model-loader.d.ts.map +1 -0
- package/dist/embedding/local-model-loader.js +64 -0
- package/dist/embedding/local-model-loader.js.map +1 -0
- package/dist/embedding/local-transformers-provider.d.ts +17 -0
- package/dist/embedding/local-transformers-provider.d.ts.map +1 -0
- package/dist/embedding/local-transformers-provider.js +54 -0
- package/dist/embedding/local-transformers-provider.js.map +1 -0
- package/dist/embedding/model-download.d.ts +32 -0
- package/dist/embedding/model-download.d.ts.map +1 -0
- package/dist/embedding/model-download.js +41 -0
- package/dist/embedding/model-download.js.map +1 -0
- package/dist/embedding/model-installation.d.ts +17 -0
- package/dist/embedding/model-installation.d.ts.map +1 -0
- package/dist/embedding/model-installation.js +71 -0
- package/dist/embedding/model-installation.js.map +1 -0
- package/dist/embedding/model-manifest.d.ts +18 -0
- package/dist/embedding/model-manifest.d.ts.map +1 -0
- package/dist/embedding/model-manifest.js +86 -0
- package/dist/embedding/model-manifest.js.map +1 -0
- package/dist/embedding/openai-compatible-provider.d.ts +24 -0
- package/dist/embedding/openai-compatible-provider.d.ts.map +1 -0
- package/dist/embedding/openai-compatible-provider.js +330 -0
- package/dist/embedding/openai-compatible-provider.js.map +1 -0
- package/dist/embedding/presets/local-small.d.ts +8 -0
- package/dist/embedding/presets/local-small.d.ts.map +1 -0
- package/dist/embedding/presets/local-small.js +67 -0
- package/dist/embedding/presets/local-small.js.map +1 -0
- package/dist/embedding/presets/manifest.d.ts +27 -0
- package/dist/embedding/presets/manifest.d.ts.map +1 -0
- package/dist/embedding/presets/manifest.js +5 -0
- package/dist/embedding/presets/manifest.js.map +1 -0
- package/dist/embedding/profile.d.ts +10 -0
- package/dist/embedding/profile.d.ts.map +1 -0
- package/dist/embedding/profile.js +67 -0
- package/dist/embedding/profile.js.map +1 -0
- package/dist/embedding/provider.d.ts +13 -0
- package/dist/embedding/provider.d.ts.map +1 -0
- package/dist/embedding/provider.js +17 -0
- package/dist/embedding/provider.js.map +1 -0
- package/dist/embedding/query-cache.d.ts +45 -0
- package/dist/embedding/query-cache.d.ts.map +1 -0
- package/dist/embedding/query-cache.js +181 -0
- package/dist/embedding/query-cache.js.map +1 -0
- package/dist/embedding/runtime.d.ts +14 -0
- package/dist/embedding/runtime.d.ts.map +1 -0
- package/dist/embedding/runtime.js +407 -0
- package/dist/embedding/runtime.js.map +1 -0
- package/dist/embedding/settings.d.ts +6 -0
- package/dist/embedding/settings.d.ts.map +1 -0
- package/dist/embedding/settings.js +69 -0
- package/dist/embedding/settings.js.map +1 -0
- package/dist/embedding/setup-lock.d.ts +7 -0
- package/dist/embedding/setup-lock.d.ts.map +1 -0
- package/dist/embedding/setup-lock.js +35 -0
- package/dist/embedding/setup-lock.js.map +1 -0
- package/dist/embedding/setup-service.d.ts +53 -0
- package/dist/embedding/setup-service.d.ts.map +1 -0
- package/dist/embedding/setup-service.js +184 -0
- package/dist/embedding/setup-service.js.map +1 -0
- package/dist/embedding/sqlite-vec-backend.d.ts +9 -0
- package/dist/embedding/sqlite-vec-backend.d.ts.map +1 -0
- package/dist/embedding/sqlite-vec-backend.js +106 -0
- package/dist/embedding/sqlite-vec-backend.js.map +1 -0
- package/dist/embedding/sqlite-vec-loader.d.ts +17 -0
- package/dist/embedding/sqlite-vec-loader.d.ts.map +1 -0
- package/dist/embedding/sqlite-vec-loader.js +51 -0
- package/dist/embedding/sqlite-vec-loader.js.map +1 -0
- package/dist/embedding/store.d.ts +66 -0
- package/dist/embedding/store.d.ts.map +1 -0
- package/dist/embedding/store.js +490 -0
- package/dist/embedding/store.js.map +1 -0
- package/dist/embedding/types.d.ts +126 -0
- package/dist/embedding/types.d.ts.map +1 -0
- package/dist/embedding/types.js +2 -0
- package/dist/embedding/types.js.map +1 -0
- package/dist/embedding/vector.d.ts +9 -0
- package/dist/embedding/vector.d.ts.map +1 -0
- package/dist/embedding/vector.js +90 -0
- package/dist/embedding/vector.js.map +1 -0
- package/dist/embedding/worker.d.ts +23 -0
- package/dist/embedding/worker.d.ts.map +1 -0
- package/dist/embedding/worker.js +84 -0
- package/dist/embedding/worker.js.map +1 -0
- package/dist/enno-oduno/schemas.d.ts +2 -2
- package/dist/ledger/checkpoint-contract.d.ts +2 -2
- package/dist/mcp/bounded-stdio-transport.d.ts +3 -0
- package/dist/mcp/bounded-stdio-transport.d.ts.map +1 -1
- package/dist/mcp/bounded-stdio-transport.js +15 -3
- package/dist/mcp/bounded-stdio-transport.js.map +1 -1
- package/dist/mcp/request-deadline.d.ts +51 -0
- package/dist/mcp/request-deadline.d.ts.map +1 -0
- package/dist/mcp/request-deadline.js +155 -0
- package/dist/mcp/request-deadline.js.map +1 -0
- package/dist/mcp/runtime-owner.d.ts +27 -0
- package/dist/mcp/runtime-owner.d.ts.map +1 -0
- package/dist/mcp/runtime-owner.js +129 -0
- package/dist/mcp/runtime-owner.js.map +1 -0
- package/dist/mcp/server.d.ts +11 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +83 -22
- package/dist/mcp/server.js.map +1 -1
- package/dist/memory/checkpoint-contract.d.ts +3 -3
- package/dist/memory/entries.d.ts.map +1 -1
- package/dist/memory/entries.js +13 -0
- package/dist/memory/entries.js.map +1 -1
- package/dist/memory/federated-retrieval.d.ts +3 -2
- package/dist/memory/federated-retrieval.d.ts.map +1 -1
- package/dist/memory/federated-retrieval.js +112 -31
- package/dist/memory/federated-retrieval.js.map +1 -1
- package/dist/memory/hybrid-retrieval.d.ts +9 -2
- package/dist/memory/hybrid-retrieval.d.ts.map +1 -1
- package/dist/memory/hybrid-retrieval.js +60 -13
- package/dist/memory/hybrid-retrieval.js.map +1 -1
- package/dist/memory/retrieval.d.ts +4 -3
- package/dist/memory/retrieval.d.ts.map +1 -1
- package/dist/memory/retrieval.js +6 -6
- package/dist/memory/retrieval.js.map +1 -1
- package/dist/memory/scoped-memory.d.ts +3 -2
- package/dist/memory/scoped-memory.d.ts.map +1 -1
- package/dist/memory/scoped-memory.js +7 -3
- package/dist/memory/scoped-memory.js.map +1 -1
- package/dist/server/agent-application.js +1 -1
- package/dist/server/agent-application.js.map +1 -1
- package/dist/server/http.d.ts +17 -1
- package/dist/server/http.d.ts.map +1 -1
- package/dist/server/http.js +79 -13
- package/dist/server/http.js.map +1 -1
- package/dist/skills/discovery-service.d.ts.map +1 -1
- package/dist/skills/discovery-service.js +10 -8
- package/dist/skills/discovery-service.js.map +1 -1
- package/dist/skills/find.d.ts +1 -0
- package/dist/skills/find.d.ts.map +1 -1
- package/dist/skills/find.js +1 -0
- package/dist/skills/find.js.map +1 -1
- package/dist/skills/materialization-authority.d.ts +1 -1
- package/dist/skills/materialization-authority.d.ts.map +1 -1
- package/dist/skills/materialization-authority.js +2 -2
- package/dist/skills/materialization-authority.js.map +1 -1
- package/dist/skills/providers/skills-sh-compat.d.ts.map +1 -1
- package/dist/skills/providers/skills-sh-compat.js +4 -2
- package/dist/skills/providers/skills-sh-compat.js.map +1 -1
- package/dist/skills/providers/skills-sh-v1.d.ts +2 -2
- package/dist/skills/providers/skills-sh-v1.d.ts.map +1 -1
- package/dist/skills/providers/skills-sh-v1.js +22 -4
- package/dist/skills/providers/skills-sh-v1.js.map +1 -1
- package/dist/skills/source/github-fetcher.d.ts.map +1 -1
- package/dist/skills/source/github-fetcher.js +8 -4
- package/dist/skills/source/github-fetcher.js.map +1 -1
- package/dist/skills/types.d.ts +3 -2
- package/dist/skills/types.d.ts.map +1 -1
- package/docs/agent-file.md +72 -0
- package/docs/agent-gateway.md +104 -0
- package/docs/architecture.md +12 -0
- package/docs/cli-contract.md +13 -0
- package/docs/client-compatibility.md +298 -0
- package/docs/database.md +11 -0
- package/docs/execution-ledger.md +89 -0
- package/docs/release-notes-0.1.18.md +103 -0
- package/docs/retrieval-evaluation.md +10 -0
- package/docs/security.md +11 -0
- package/docs/sqlite-driver-adr.md +8 -0
- package/migrations/021_semantic_embeddings.sql +122 -0
- package/migrations/022_embedding_setup_v2.sql +236 -0
- package/migrations/down/021_semantic_embeddings.sql +17 -0
- package/migrations/down/022_embedding_setup_v2.sql +133 -0
- package/package.json +10 -1
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type PathEnvironment } from '../config/paths.js';
|
|
2
|
+
import { type ModelDownloader, type ModelDownloadProgress } from './model-download.js';
|
|
3
|
+
import type { LocalEmbeddingPreset } from './presets/manifest.js';
|
|
4
|
+
export interface InstalledModel {
|
|
5
|
+
readonly installation: 'installed' | 'reused';
|
|
6
|
+
readonly directory: string;
|
|
7
|
+
readonly relativePath: string;
|
|
8
|
+
readonly totalBytes: number;
|
|
9
|
+
readonly manifestHash: string;
|
|
10
|
+
}
|
|
11
|
+
export interface InstallModelOptions extends PathEnvironment {
|
|
12
|
+
readonly downloader?: ModelDownloader;
|
|
13
|
+
readonly signal?: AbortSignal;
|
|
14
|
+
readonly onProgress?: (progress: ModelDownloadProgress) => void;
|
|
15
|
+
}
|
|
16
|
+
export declare function installEmbeddingModel(preset: LocalEmbeddingPreset, options?: InstallModelOptions): Promise<InstalledModel>;
|
|
17
|
+
//# sourceMappingURL=model-installation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-installation.d.ts","sourceRoot":"","sources":["../../src/embedding/model-installation.ts"],"names":[],"mappings":"AAIA,OAAO,EAA+B,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEvF,OAAO,EAAoC,KAAK,eAAe,EAAE,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACzH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAElE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,YAAY,EAAE,WAAW,GAAG,QAAQ,CAAC;IAC9C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,mBAAoB,SAAQ,eAAe;IAC1D,QAAQ,CAAC,UAAU,CAAC,EAAE,eAAe,CAAC;IACtC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,qBAAqB,KAAK,IAAI,CAAC;CACjE;AAkBD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,oBAAoB,EAC5B,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,cAAc,CAAC,CA0CzB"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { chmod, lstat, mkdir, rename, rm, writeFile } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { KiokukoError } from '../errors.js';
|
|
5
|
+
import { getEmbeddingPresetDirectory } from '../config/paths.js';
|
|
6
|
+
import { assertNoUnexpectedModelFiles, MODEL_MANIFEST_FILENAME, serializeModelManifest, verifyModelDirectory } from './model-manifest.js';
|
|
7
|
+
import { createHuggingFaceModelDownloader } from './model-download.js';
|
|
8
|
+
function relativeModelPath(preset) {
|
|
9
|
+
return path.posix.join('models', 'embeddings', preset.id, preset.revision);
|
|
10
|
+
}
|
|
11
|
+
async function existingDirectory(pathname) {
|
|
12
|
+
try {
|
|
13
|
+
const stat = await lstat(pathname);
|
|
14
|
+
if (!stat.isDirectory() || stat.isSymbolicLink())
|
|
15
|
+
throw new KiokukoError('SECURITY_REJECTION', 'Existing model installation is not a private directory');
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
if (error instanceof KiokukoError)
|
|
20
|
+
throw error;
|
|
21
|
+
if (error instanceof Error && 'code' in error && error.code === 'ENOENT')
|
|
22
|
+
return false;
|
|
23
|
+
throw error;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export async function installEmbeddingModel(preset, options = {}) {
|
|
27
|
+
const downloader = options.downloader ?? createHuggingFaceModelDownloader();
|
|
28
|
+
const finalDirectory = getEmbeddingPresetDirectory(preset.id, preset.revision, options);
|
|
29
|
+
if (await existingDirectory(finalDirectory)) {
|
|
30
|
+
const manifest = await verifyModelDirectory(finalDirectory, preset);
|
|
31
|
+
await assertNoUnexpectedModelFiles(finalDirectory, preset);
|
|
32
|
+
return { installation: 'reused', directory: finalDirectory, relativePath: relativeModelPath(preset), totalBytes: manifest.totalBytes, manifestHash: manifest.artifactManifestHash };
|
|
33
|
+
}
|
|
34
|
+
const stagingParent = path.dirname(path.dirname(finalDirectory));
|
|
35
|
+
const stagingDirectory = path.join(stagingParent, '.staging', randomUUID());
|
|
36
|
+
await mkdir(stagingDirectory, { recursive: true, mode: 0o700 });
|
|
37
|
+
try {
|
|
38
|
+
const downloaded = await downloader.download(preset, stagingDirectory, {
|
|
39
|
+
...(options.signal === undefined ? {} : { signal: options.signal }),
|
|
40
|
+
...(options.onProgress === undefined ? {} : { onProgress: options.onProgress }),
|
|
41
|
+
});
|
|
42
|
+
const manifest = await verifyModelDirectory(downloaded.directory, preset);
|
|
43
|
+
await assertNoUnexpectedModelFiles(downloaded.directory, preset);
|
|
44
|
+
await writeFile(path.join(downloaded.directory, MODEL_MANIFEST_FILENAME), serializeModelManifest(manifest), { mode: 0o600, flag: 'wx' });
|
|
45
|
+
await chmod(downloaded.directory, 0o700);
|
|
46
|
+
await mkdir(path.dirname(finalDirectory), { recursive: true, mode: 0o700 });
|
|
47
|
+
if (await existingDirectory(finalDirectory)) {
|
|
48
|
+
const existing = await verifyModelDirectory(finalDirectory, preset);
|
|
49
|
+
if (existing.artifactManifestHash !== manifest.artifactManifestHash)
|
|
50
|
+
throw new KiokukoError('CONFLICT', 'A different model installation already exists for this preset revision');
|
|
51
|
+
return { installation: 'reused', directory: finalDirectory, relativePath: relativeModelPath(preset), totalBytes: existing.totalBytes, manifestHash: existing.artifactManifestHash };
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
await rename(downloaded.directory, finalDirectory);
|
|
55
|
+
return { installation: 'installed', directory: finalDirectory, relativePath: relativeModelPath(preset), totalBytes: manifest.totalBytes, manifestHash: manifest.artifactManifestHash };
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
if (error instanceof Error && 'code' in error && error.code === 'ENOTEMPTY'
|
|
59
|
+
&& await existingDirectory(finalDirectory)) {
|
|
60
|
+
const existing = await verifyModelDirectory(finalDirectory, preset);
|
|
61
|
+
return { installation: 'reused', directory: finalDirectory, relativePath: relativeModelPath(preset), totalBytes: existing.totalBytes, manifestHash: existing.artifactManifestHash };
|
|
62
|
+
}
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
await rm(stagingDirectory, { recursive: true, force: true }).catch(() => undefined);
|
|
68
|
+
throw error;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=model-installation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-installation.js","sourceRoot":"","sources":["../../src/embedding/model-installation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { LocalEmbeddingPreset, LocalEmbeddingPresetFile } from './presets/manifest.js';
|
|
2
|
+
export declare const MODEL_MANIFEST_FILENAME = "kiokuko-model-manifest.json";
|
|
3
|
+
export declare const MAX_MODEL_BYTES: number;
|
|
4
|
+
export interface VerifiedModelManifest {
|
|
5
|
+
readonly schemaVersion: 1;
|
|
6
|
+
readonly presetId: 'local-small';
|
|
7
|
+
readonly repositoryId: string;
|
|
8
|
+
readonly revision: string;
|
|
9
|
+
readonly artifactManifestHash: string;
|
|
10
|
+
readonly files: readonly LocalEmbeddingPresetFile[];
|
|
11
|
+
readonly totalBytes: number;
|
|
12
|
+
}
|
|
13
|
+
export declare function validatePresetManifest(preset: LocalEmbeddingPreset): void;
|
|
14
|
+
export declare function createModelManifest(preset: LocalEmbeddingPreset): VerifiedModelManifest;
|
|
15
|
+
export declare function serializeModelManifest(manifest: VerifiedModelManifest): string;
|
|
16
|
+
export declare function verifyModelDirectory(directory: string, preset: LocalEmbeddingPreset): Promise<VerifiedModelManifest>;
|
|
17
|
+
export declare function assertNoUnexpectedModelFiles(directory: string, preset: LocalEmbeddingPreset): Promise<void>;
|
|
18
|
+
//# sourceMappingURL=model-manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-manifest.d.ts","sourceRoot":"","sources":["../../src/embedding/model-manifest.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAG5F,eAAO,MAAM,uBAAuB,gCAAgC,CAAC;AACrE,eAAO,MAAM,eAAe,QAAoB,CAAC;AAEjD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,SAAS,wBAAwB,EAAE,CAAC;IACpD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAUD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAuBzE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,oBAAoB,GAAG,qBAAqB,CAYvF;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,MAAM,CAE9E;AAED,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,qBAAqB,CAAC,CAUhC;AAED,wBAAsB,4BAA4B,CAChD,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAWf"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { lstat, readdir, readFile } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { KiokukoError } from '../errors.js';
|
|
5
|
+
import { canonicalJson } from '../serialization/validate.js';
|
|
6
|
+
import { presetManifestHash } from './presets/manifest.js';
|
|
7
|
+
export const MODEL_MANIFEST_FILENAME = 'kiokuko-model-manifest.json';
|
|
8
|
+
export const MAX_MODEL_BYTES = 512 * 1024 * 1024;
|
|
9
|
+
function invalid(message) {
|
|
10
|
+
throw new KiokukoError('VALIDATION_ERROR', message);
|
|
11
|
+
}
|
|
12
|
+
function hashFile(bytes) {
|
|
13
|
+
return createHash('sha256').update(bytes).digest('hex');
|
|
14
|
+
}
|
|
15
|
+
export function validatePresetManifest(preset) {
|
|
16
|
+
if (preset.id !== 'local-small' || preset.schemaVersion !== 1
|
|
17
|
+
|| preset.sourceModel !== 'intfloat/multilingual-e5-small'
|
|
18
|
+
|| preset.artifactRepository !== 'Xenova/multilingual-e5-small'
|
|
19
|
+
|| !/^[0-9a-f]{40}$/u.test(preset.revision)
|
|
20
|
+
|| preset.dimensions !== 384 || preset.maximumTokens !== 512
|
|
21
|
+
|| preset.dtype !== 'q8' || preset.pooling !== 'mean' || preset.normalize !== true
|
|
22
|
+
|| preset.distanceMetric !== 'cosine' || preset.distanceCeiling <= 0 || preset.distanceCeiling >= 2
|
|
23
|
+
|| preset.inputContract !== 'e5-query-passage-v1' || preset.queryPrefix !== 'query: '
|
|
24
|
+
|| preset.documentPrefix !== 'passage: ' || !/^[0-9]+\.[0-9]+\.[0-9]+$/u.test(preset.transformersJsVersion)) {
|
|
25
|
+
invalid('Embedding preset manifest is invalid');
|
|
26
|
+
}
|
|
27
|
+
const paths = new Set();
|
|
28
|
+
let totalBytes = 0;
|
|
29
|
+
for (const file of preset.files) {
|
|
30
|
+
if (paths.has(file.path) || file.path.length === 0 || file.path.startsWith('/')
|
|
31
|
+
|| file.path.split('/').some((part) => part === '' || part === '.' || part === '..')
|
|
32
|
+
|| !Number.isSafeInteger(file.size) || file.size <= 0
|
|
33
|
+
|| !/^[0-9a-f]{64}$/u.test(file.sha256))
|
|
34
|
+
invalid('Embedding preset file manifest is invalid');
|
|
35
|
+
paths.add(file.path);
|
|
36
|
+
totalBytes += file.size;
|
|
37
|
+
}
|
|
38
|
+
if (preset.files.length === 0 || totalBytes > MAX_MODEL_BYTES)
|
|
39
|
+
invalid('Embedding preset file size is unsupported');
|
|
40
|
+
}
|
|
41
|
+
export function createModelManifest(preset) {
|
|
42
|
+
validatePresetManifest(preset);
|
|
43
|
+
const totalBytes = preset.files.reduce((total, file) => total + file.size, 0);
|
|
44
|
+
return Object.freeze({
|
|
45
|
+
schemaVersion: 1,
|
|
46
|
+
presetId: preset.id,
|
|
47
|
+
repositoryId: preset.artifactRepository,
|
|
48
|
+
revision: preset.revision,
|
|
49
|
+
artifactManifestHash: presetManifestHash(preset),
|
|
50
|
+
files: Object.freeze(preset.files.map((file) => Object.freeze({ ...file }))),
|
|
51
|
+
totalBytes,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
export function serializeModelManifest(manifest) {
|
|
55
|
+
return `${canonicalJson(manifest)}\n`;
|
|
56
|
+
}
|
|
57
|
+
export async function verifyModelDirectory(directory, preset) {
|
|
58
|
+
const expected = createModelManifest(preset);
|
|
59
|
+
for (const file of expected.files) {
|
|
60
|
+
const filePath = path.join(directory, file.path);
|
|
61
|
+
const stat = await lstat(filePath);
|
|
62
|
+
if (!stat.isFile() || stat.isSymbolicLink())
|
|
63
|
+
throw new KiokukoError('SECURITY_REJECTION', `Model artifact is not a regular file: ${file.path}`);
|
|
64
|
+
if (stat.size !== file.size)
|
|
65
|
+
throw new KiokukoError('INTEGRITY_ERROR', `Model artifact size mismatch: ${file.path}`);
|
|
66
|
+
if (hashFile(await readFile(filePath)) !== file.sha256)
|
|
67
|
+
throw new KiokukoError('SECURITY_REJECTION', `Model artifact hash mismatch: ${file.path}`);
|
|
68
|
+
}
|
|
69
|
+
return expected;
|
|
70
|
+
}
|
|
71
|
+
export async function assertNoUnexpectedModelFiles(directory, preset) {
|
|
72
|
+
const allowed = new Set([...preset.files.map((file) => file.path), MODEL_MANIFEST_FILENAME]);
|
|
73
|
+
const walk = async (current, prefix) => {
|
|
74
|
+
for (const entry of await readdir(current, { withFileTypes: true })) {
|
|
75
|
+
const relative = prefix.length === 0 ? entry.name : `${prefix}/${entry.name}`;
|
|
76
|
+
if (entry.isSymbolicLink())
|
|
77
|
+
throw new KiokukoError('SECURITY_REJECTION', `Model directory contains a symbolic link: ${relative}`);
|
|
78
|
+
if (entry.isDirectory())
|
|
79
|
+
await walk(path.join(current, entry.name), relative);
|
|
80
|
+
else if (!allowed.has(relative))
|
|
81
|
+
throw new KiokukoError('SECURITY_REJECTION', `Model directory contains an unexpected file: ${relative}`);
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
await walk(directory, '');
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=model-manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-manifest.js","sourceRoot":"","sources":["../../src/embedding/model-manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { EmbeddingProvider, EmbeddingProfileIdentity, EnabledEmbeddingConfig } from './types.js';
|
|
2
|
+
export declare const MAX_EMBEDDING_PROVIDER_INPUTS = 64;
|
|
3
|
+
export declare const MAX_EMBEDDING_PROVIDER_REQUEST_BYTES: number;
|
|
4
|
+
export declare const MAX_EMBEDDING_PROVIDER_RESPONSE_BYTES: number;
|
|
5
|
+
export declare const DEFAULT_EMBEDDING_PROVIDER_RETRIES = 2;
|
|
6
|
+
export declare const MAX_EMBEDDING_PROVIDER_RETRY_DELAY_MS = 5000;
|
|
7
|
+
export interface OpenAICompatibleEmbeddingProviderOptions {
|
|
8
|
+
readonly config: EnabledEmbeddingConfig;
|
|
9
|
+
readonly fetchImpl?: typeof fetch;
|
|
10
|
+
readonly timeoutMs?: number;
|
|
11
|
+
readonly maxRetries?: number;
|
|
12
|
+
readonly retryDelayMs?: number;
|
|
13
|
+
readonly sleepImpl?: (milliseconds: number, signal?: AbortSignal) => Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
export declare class OpenAICompatibleEmbeddingProvider implements EmbeddingProvider {
|
|
16
|
+
#private;
|
|
17
|
+
readonly profile: EmbeddingProfileIdentity;
|
|
18
|
+
constructor(options: OpenAICompatibleEmbeddingProviderOptions);
|
|
19
|
+
embed(inputs: readonly string[], options?: {
|
|
20
|
+
signal?: AbortSignal;
|
|
21
|
+
}): Promise<readonly Float32Array[]>;
|
|
22
|
+
}
|
|
23
|
+
export { OpenAICompatibleEmbeddingProvider as OpenAICompatibleProvider };
|
|
24
|
+
//# sourceMappingURL=openai-compatible-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-compatible-provider.d.ts","sourceRoot":"","sources":["../../src/embedding/openai-compatible-provider.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEtG,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAChD,eAAO,MAAM,oCAAoC,QAAkB,CAAC;AACpE,eAAO,MAAM,qCAAqC,QAAkB,CAAC;AACrE,eAAO,MAAM,kCAAkC,IAAI,CAAC;AACpD,eAAO,MAAM,qCAAqC,OAAQ,CAAC;AAM3D,MAAM,WAAW,wCAAwC;IACvD,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACpF;AAqND,qBAAa,iCAAkC,YAAW,iBAAiB;;IACzE,QAAQ,CAAC,OAAO,EAAE,wBAAwB,CAAC;gBAS/B,OAAO,EAAE,wCAAwC;IAavD,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC;CAwEjH;AAED,OAAO,EAAE,iCAAiC,IAAI,wBAAwB,EAAE,CAAC"}
|
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
import { TextDecoder } from 'node:util';
|
|
2
|
+
import { parseStrictJson } from '../setup/strict-json.js';
|
|
3
|
+
import { findSecret } from '../memory/secrets.js';
|
|
4
|
+
import { KiokukoError } from '../errors.js';
|
|
5
|
+
import { normalizeEmbeddingBaseUrl, requireEnabledEmbeddingConfig } from './config.js';
|
|
6
|
+
import { createEmbeddingProfileIdentity } from './profile.js';
|
|
7
|
+
import { normalizeVector } from './vector.js';
|
|
8
|
+
import { EmbeddingProviderError } from './provider.js';
|
|
9
|
+
export const MAX_EMBEDDING_PROVIDER_INPUTS = 64;
|
|
10
|
+
export const MAX_EMBEDDING_PROVIDER_REQUEST_BYTES = 4 * 1024 * 1024;
|
|
11
|
+
export const MAX_EMBEDDING_PROVIDER_RESPONSE_BYTES = 4 * 1024 * 1024;
|
|
12
|
+
export const DEFAULT_EMBEDDING_PROVIDER_RETRIES = 2;
|
|
13
|
+
export const MAX_EMBEDDING_PROVIDER_RETRY_DELAY_MS = 5_000;
|
|
14
|
+
const INVALID_UNICODE = /[\p{Cs}\uFFFD]/u;
|
|
15
|
+
const INVALID_CONTROL = /[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/u;
|
|
16
|
+
const decoder = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true });
|
|
17
|
+
function invalidResponse() {
|
|
18
|
+
throw new EmbeddingProviderError('invalid_response', false);
|
|
19
|
+
}
|
|
20
|
+
function requestInvalid(message) {
|
|
21
|
+
throw new KiokukoError('VALIDATION_ERROR', message);
|
|
22
|
+
}
|
|
23
|
+
function isRecord(value) {
|
|
24
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
25
|
+
}
|
|
26
|
+
function boundedInteger(value, minimum, maximum, label) {
|
|
27
|
+
if (!Number.isSafeInteger(value) || value < minimum || value > maximum)
|
|
28
|
+
requestInvalid(`${label} is invalid`);
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
function endpointUrl(baseUrl) {
|
|
32
|
+
const url = new URL(baseUrl);
|
|
33
|
+
const path = url.pathname.replace(/\/+$/u, '');
|
|
34
|
+
url.pathname = `${path}/embeddings`;
|
|
35
|
+
return url;
|
|
36
|
+
}
|
|
37
|
+
function validateInputs(inputs, batchSize) {
|
|
38
|
+
if (!Array.isArray(inputs) || inputs.length < 1 || inputs.length > Math.min(MAX_EMBEDDING_PROVIDER_INPUTS, batchSize)) {
|
|
39
|
+
requestInvalid('Embedding provider input count is invalid');
|
|
40
|
+
}
|
|
41
|
+
const copied = [...inputs];
|
|
42
|
+
for (const input of copied) {
|
|
43
|
+
if (typeof input !== 'string' || input.length === 0 || INVALID_CONTROL.test(input) || INVALID_UNICODE.test(input)) {
|
|
44
|
+
requestInvalid('Embedding provider input is invalid');
|
|
45
|
+
}
|
|
46
|
+
if (findSecret(input) !== undefined)
|
|
47
|
+
throw new EmbeddingProviderError('secret_blocked', false);
|
|
48
|
+
}
|
|
49
|
+
return copied;
|
|
50
|
+
}
|
|
51
|
+
function requestBody(config, inputs) {
|
|
52
|
+
const body = JSON.stringify({
|
|
53
|
+
input: [...inputs],
|
|
54
|
+
model: config.model,
|
|
55
|
+
encoding_format: 'float',
|
|
56
|
+
});
|
|
57
|
+
if (Buffer.byteLength(body, 'utf8') > MAX_EMBEDDING_PROVIDER_REQUEST_BYTES) {
|
|
58
|
+
requestInvalid('Embedding provider request exceeds the byte limit');
|
|
59
|
+
}
|
|
60
|
+
return body;
|
|
61
|
+
}
|
|
62
|
+
function retryAfterMs(response) {
|
|
63
|
+
const value = response.headers.get('retry-after');
|
|
64
|
+
if (value === null || !/^\d+$/u.test(value))
|
|
65
|
+
return null;
|
|
66
|
+
const seconds = Number(value);
|
|
67
|
+
if (!Number.isSafeInteger(seconds))
|
|
68
|
+
return null;
|
|
69
|
+
return Math.min(MAX_EMBEDDING_PROVIDER_RETRY_DELAY_MS, seconds * 1_000);
|
|
70
|
+
}
|
|
71
|
+
function statusFailure(response) {
|
|
72
|
+
if (response.status === 429)
|
|
73
|
+
return new EmbeddingProviderError('rate_limited', true, retryAfterMs(response));
|
|
74
|
+
if (response.status === 408 || response.status === 425)
|
|
75
|
+
return new EmbeddingProviderError('timeout', true);
|
|
76
|
+
if (response.status >= 500 && response.status <= 599)
|
|
77
|
+
return new EmbeddingProviderError('provider_unavailable', true);
|
|
78
|
+
return new EmbeddingProviderError('provider_unavailable', false);
|
|
79
|
+
}
|
|
80
|
+
async function cancelResponse(response) {
|
|
81
|
+
if (response.body === null)
|
|
82
|
+
return;
|
|
83
|
+
try {
|
|
84
|
+
await response.body.cancel();
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// The response is already being discarded; the public failure remains bounded.
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async function readResponseText(response) {
|
|
91
|
+
const contentType = response.headers.get('content-type');
|
|
92
|
+
if (contentType === null || !/^application\/(?:[\w.+-]+\+)?json(?:\s*;|$)/iu.test(contentType))
|
|
93
|
+
invalidResponse();
|
|
94
|
+
const contentLength = response.headers.get('content-length');
|
|
95
|
+
if (contentLength !== null && !/^\d+$/u.test(contentLength))
|
|
96
|
+
invalidResponse();
|
|
97
|
+
const declared = contentLength === null ? null : Number(contentLength);
|
|
98
|
+
if (declared !== null && (!Number.isSafeInteger(declared) || declared > MAX_EMBEDDING_PROVIDER_RESPONSE_BYTES))
|
|
99
|
+
invalidResponse();
|
|
100
|
+
const reader = response.body?.getReader();
|
|
101
|
+
if (reader === undefined) {
|
|
102
|
+
let body;
|
|
103
|
+
try {
|
|
104
|
+
body = await response.text();
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
throw new EmbeddingProviderError('provider_unavailable', true);
|
|
108
|
+
}
|
|
109
|
+
if (Buffer.byteLength(body, 'utf8') > MAX_EMBEDDING_PROVIDER_RESPONSE_BYTES || INVALID_UNICODE.test(body))
|
|
110
|
+
invalidResponse();
|
|
111
|
+
return body;
|
|
112
|
+
}
|
|
113
|
+
const chunks = [];
|
|
114
|
+
let size = 0;
|
|
115
|
+
for (;;) {
|
|
116
|
+
let next;
|
|
117
|
+
try {
|
|
118
|
+
next = await reader.read();
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
throw new EmbeddingProviderError('provider_unavailable', true);
|
|
122
|
+
}
|
|
123
|
+
if (next.done)
|
|
124
|
+
break;
|
|
125
|
+
if (next.value === undefined)
|
|
126
|
+
invalidResponse();
|
|
127
|
+
const chunk = Buffer.from(next.value);
|
|
128
|
+
size += chunk.byteLength;
|
|
129
|
+
if (size > MAX_EMBEDDING_PROVIDER_RESPONSE_BYTES) {
|
|
130
|
+
try {
|
|
131
|
+
await reader.cancel();
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
// Preserve the bounded validation failure if cancellation itself fails.
|
|
135
|
+
}
|
|
136
|
+
invalidResponse();
|
|
137
|
+
}
|
|
138
|
+
chunks.push(chunk);
|
|
139
|
+
}
|
|
140
|
+
let body;
|
|
141
|
+
try {
|
|
142
|
+
body = decoder.decode(Buffer.concat(chunks));
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
invalidResponse();
|
|
146
|
+
}
|
|
147
|
+
if (INVALID_UNICODE.test(body))
|
|
148
|
+
invalidResponse();
|
|
149
|
+
return body;
|
|
150
|
+
}
|
|
151
|
+
function parseProviderResponse(value, config, expectedCount) {
|
|
152
|
+
if (!isRecord(value))
|
|
153
|
+
invalidResponse();
|
|
154
|
+
const allowedRootKeys = new Set(['object', 'data', 'model', 'usage']);
|
|
155
|
+
if (Object.keys(value).some((key) => !allowedRootKeys.has(key))
|
|
156
|
+
|| !Object.prototype.hasOwnProperty.call(value, 'data')
|
|
157
|
+
|| !Object.prototype.hasOwnProperty.call(value, 'model'))
|
|
158
|
+
invalidResponse();
|
|
159
|
+
const response = value;
|
|
160
|
+
if (response.object !== undefined && response.object !== 'list')
|
|
161
|
+
invalidResponse();
|
|
162
|
+
if (response.model !== config.model || !Array.isArray(response.data) || response.data.length !== expectedCount)
|
|
163
|
+
invalidResponse();
|
|
164
|
+
const vectors = new Array(expectedCount);
|
|
165
|
+
const seen = new Set();
|
|
166
|
+
for (const itemValue of response.data) {
|
|
167
|
+
if (!isRecord(itemValue))
|
|
168
|
+
invalidResponse();
|
|
169
|
+
const allowedItemKeys = new Set(['object', 'embedding', 'index']);
|
|
170
|
+
if (Object.keys(itemValue).some((key) => !allowedItemKeys.has(key))
|
|
171
|
+
|| !Object.prototype.hasOwnProperty.call(itemValue, 'embedding')
|
|
172
|
+
|| !Object.prototype.hasOwnProperty.call(itemValue, 'index'))
|
|
173
|
+
invalidResponse();
|
|
174
|
+
const item = itemValue;
|
|
175
|
+
if (item.object !== undefined && item.object !== 'embedding')
|
|
176
|
+
invalidResponse();
|
|
177
|
+
if (typeof item.index !== 'number' || !Number.isSafeInteger(item.index) || item.index < 0 || item.index >= expectedCount || seen.has(item.index))
|
|
178
|
+
invalidResponse();
|
|
179
|
+
if (!Array.isArray(item.embedding) || item.embedding.length !== config.dimensions) {
|
|
180
|
+
throw new EmbeddingProviderError('dimension_mismatch', false);
|
|
181
|
+
}
|
|
182
|
+
for (const valueAtIndex of item.embedding) {
|
|
183
|
+
if (typeof valueAtIndex !== 'number' || !Number.isFinite(valueAtIndex))
|
|
184
|
+
invalidResponse();
|
|
185
|
+
}
|
|
186
|
+
let vector;
|
|
187
|
+
try {
|
|
188
|
+
vector = normalizeVector(item.embedding, config.dimensions);
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
if (error instanceof KiokukoError && error.code === 'VALIDATION_ERROR') {
|
|
192
|
+
throw new EmbeddingProviderError('dimension_mismatch', false);
|
|
193
|
+
}
|
|
194
|
+
throw error;
|
|
195
|
+
}
|
|
196
|
+
seen.add(item.index);
|
|
197
|
+
vectors[item.index] = vector;
|
|
198
|
+
}
|
|
199
|
+
if (seen.size !== expectedCount || vectors.some((vector) => vector === undefined))
|
|
200
|
+
invalidResponse();
|
|
201
|
+
return Object.freeze(vectors);
|
|
202
|
+
}
|
|
203
|
+
async function defaultSleep(milliseconds, signal) {
|
|
204
|
+
if (milliseconds <= 0)
|
|
205
|
+
return;
|
|
206
|
+
await new Promise((resolve, reject) => {
|
|
207
|
+
let timer;
|
|
208
|
+
const onAbort = () => {
|
|
209
|
+
clearTimeout(timer);
|
|
210
|
+
signal?.removeEventListener('abort', onAbort);
|
|
211
|
+
reject(new EmbeddingProviderError('timeout', false));
|
|
212
|
+
};
|
|
213
|
+
const finish = () => {
|
|
214
|
+
signal?.removeEventListener('abort', onAbort);
|
|
215
|
+
resolve();
|
|
216
|
+
};
|
|
217
|
+
timer = setTimeout(finish, milliseconds);
|
|
218
|
+
if (signal === undefined)
|
|
219
|
+
return;
|
|
220
|
+
if (signal.aborted) {
|
|
221
|
+
clearTimeout(timer);
|
|
222
|
+
reject(new EmbeddingProviderError('timeout', false));
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
function retryDelay(attempt, configuredDelayMs, retryAfter) {
|
|
229
|
+
const exponential = configuredDelayMs * (2 ** attempt);
|
|
230
|
+
return Math.min(MAX_EMBEDDING_PROVIDER_RETRY_DELAY_MS, retryAfter ?? exponential);
|
|
231
|
+
}
|
|
232
|
+
export class OpenAICompatibleEmbeddingProvider {
|
|
233
|
+
profile;
|
|
234
|
+
#endpoint;
|
|
235
|
+
#config;
|
|
236
|
+
#fetchImpl;
|
|
237
|
+
#timeoutMs;
|
|
238
|
+
#maxRetries;
|
|
239
|
+
#retryDelayMs;
|
|
240
|
+
#sleepImpl;
|
|
241
|
+
constructor(options) {
|
|
242
|
+
const config = requireEnabledEmbeddingConfig(options.config);
|
|
243
|
+
const baseUrl = normalizeEmbeddingBaseUrl(config.baseUrl, config.allowRemote);
|
|
244
|
+
this.#config = Object.freeze({ ...config, baseUrl });
|
|
245
|
+
this.profile = createEmbeddingProfileIdentity(this.#config);
|
|
246
|
+
this.#endpoint = endpointUrl(baseUrl);
|
|
247
|
+
this.#fetchImpl = options.fetchImpl ?? fetch;
|
|
248
|
+
this.#timeoutMs = boundedInteger(options.timeoutMs ?? config.timeoutMs, 100, 120_000, 'Embedding provider timeout');
|
|
249
|
+
this.#maxRetries = boundedInteger(options.maxRetries ?? DEFAULT_EMBEDDING_PROVIDER_RETRIES, 0, 3, 'Embedding provider retries');
|
|
250
|
+
this.#retryDelayMs = boundedInteger(options.retryDelayMs ?? 100, 0, MAX_EMBEDDING_PROVIDER_RETRY_DELAY_MS, 'Embedding provider retry delay');
|
|
251
|
+
this.#sleepImpl = options.sleepImpl ?? defaultSleep;
|
|
252
|
+
}
|
|
253
|
+
async embed(inputs, options = {}) {
|
|
254
|
+
const normalizedInputs = validateInputs(inputs, this.#config.batchSize);
|
|
255
|
+
const body = requestBody(this.#config, normalizedInputs);
|
|
256
|
+
if (options.signal?.aborted)
|
|
257
|
+
throw new EmbeddingProviderError('timeout', false);
|
|
258
|
+
for (let attempt = 0; attempt <= this.#maxRetries; attempt += 1) {
|
|
259
|
+
let timedOut = false;
|
|
260
|
+
const controller = new AbortController();
|
|
261
|
+
const onAbort = () => controller.abort();
|
|
262
|
+
if (options.signal?.aborted)
|
|
263
|
+
controller.abort();
|
|
264
|
+
else
|
|
265
|
+
options.signal?.addEventListener('abort', onAbort, { once: true });
|
|
266
|
+
const timer = setTimeout(() => {
|
|
267
|
+
timedOut = true;
|
|
268
|
+
controller.abort();
|
|
269
|
+
}, this.#timeoutMs);
|
|
270
|
+
try {
|
|
271
|
+
let response;
|
|
272
|
+
try {
|
|
273
|
+
response = await this.#fetchImpl(this.#endpoint, {
|
|
274
|
+
method: 'POST',
|
|
275
|
+
redirect: 'manual',
|
|
276
|
+
headers: {
|
|
277
|
+
accept: 'application/json',
|
|
278
|
+
'content-type': 'application/json',
|
|
279
|
+
...(this.#config.apiKey === undefined ? {} : { authorization: `Bearer ${this.#config.apiKey}` }),
|
|
280
|
+
},
|
|
281
|
+
body,
|
|
282
|
+
signal: controller.signal,
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
catch {
|
|
286
|
+
throw timedOut || options.signal?.aborted === true
|
|
287
|
+
? new EmbeddingProviderError('timeout', timedOut)
|
|
288
|
+
: new EmbeddingProviderError('provider_unavailable', true);
|
|
289
|
+
}
|
|
290
|
+
if (response.status !== 200) {
|
|
291
|
+
const failure = statusFailure(response);
|
|
292
|
+
await cancelResponse(response);
|
|
293
|
+
throw failure;
|
|
294
|
+
}
|
|
295
|
+
const responseText = await readResponseText(response);
|
|
296
|
+
let parsed;
|
|
297
|
+
try {
|
|
298
|
+
parsed = parseStrictJson(responseText, { allowTrailingComma: false, disallowComments: true, allowEmptyContent: false }, 'Embedding provider response is invalid');
|
|
299
|
+
}
|
|
300
|
+
catch {
|
|
301
|
+
invalidResponse();
|
|
302
|
+
}
|
|
303
|
+
return parseProviderResponse(parsed, this.#config, normalizedInputs.length);
|
|
304
|
+
}
|
|
305
|
+
catch (error) {
|
|
306
|
+
const classified = error instanceof EmbeddingProviderError
|
|
307
|
+
? error
|
|
308
|
+
: error instanceof KiokukoError && error.code === 'VALIDATION_ERROR'
|
|
309
|
+
? new EmbeddingProviderError('invalid_response', false)
|
|
310
|
+
: new EmbeddingProviderError('provider_unavailable', true);
|
|
311
|
+
const failure = timedOut
|
|
312
|
+
? new EmbeddingProviderError('timeout', true)
|
|
313
|
+
: options.signal?.aborted === true
|
|
314
|
+
? new EmbeddingProviderError('timeout', false)
|
|
315
|
+
: classified;
|
|
316
|
+
if (!failure.retryable || attempt >= this.#maxRetries || options.signal?.aborted)
|
|
317
|
+
throw failure;
|
|
318
|
+
const delay = retryDelay(attempt, this.#retryDelayMs, failure.retryAfterMs);
|
|
319
|
+
await this.#sleepImpl(delay, options.signal);
|
|
320
|
+
}
|
|
321
|
+
finally {
|
|
322
|
+
clearTimeout(timer);
|
|
323
|
+
options.signal?.removeEventListener('abort', onAbort);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
throw new EmbeddingProviderError('provider_unavailable', false);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
export { OpenAICompatibleEmbeddingProvider as OpenAICompatibleProvider };
|
|
330
|
+
//# sourceMappingURL=openai-compatible-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-compatible-provider.js","sourceRoot":"","sources":["../../src/embedding/openai-compatible-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { LocalEmbeddingPreset } from './manifest.js';
|
|
2
|
+
/**
|
|
3
|
+
* The only public local model preset. Every artifact coordinate is immutable;
|
|
4
|
+
* model installation code must consume this value rather than user input.
|
|
5
|
+
*/
|
|
6
|
+
export declare const LOCAL_SMALL_PRESET: LocalEmbeddingPreset;
|
|
7
|
+
export declare const LOCAL_SMALL_PRESET_MANIFEST_HASH = "85d724217ffdda4333b6c2892f5138754d716f62e08a82cb0093ca5baca24fe4";
|
|
8
|
+
//# sourceMappingURL=local-small.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-small.d.ts","sourceRoot":"","sources":["../../../src/embedding/presets/local-small.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAE1D;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,oBA4D/B,CAAC;AAEH,eAAO,MAAM,gCAAgC,qEACuB,CAAC"}
|