@askdb/rag 0.2.0-beta.23 → 0.2.0-beta.25
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 +14 -10
- package/bin/askdb-rag.js +8 -1
- package/dist/chunker/chunker.d.ts +5 -1
- package/dist/chunker/chunker.d.ts.map +1 -1
- package/dist/chunker/chunker.js +198 -130
- package/dist/chunker/chunker.js.map +1 -1
- package/dist/chunker/ids.d.ts +15 -0
- package/dist/chunker/ids.d.ts.map +1 -0
- package/dist/chunker/ids.js +22 -0
- package/dist/chunker/ids.js.map +1 -0
- package/dist/chunker/index.d.ts +1 -0
- package/dist/chunker/index.d.ts.map +1 -1
- package/dist/chunker/index.js +1 -0
- package/dist/chunker/index.js.map +1 -1
- package/dist/chunker/sources.d.ts.map +1 -1
- package/dist/chunker/sources.js +1 -0
- package/dist/chunker/sources.js.map +1 -1
- package/dist/embedders/ai-sdk.d.ts +15 -0
- package/dist/embedders/ai-sdk.d.ts.map +1 -1
- package/dist/embedders/ai-sdk.js +9 -0
- package/dist/embedders/ai-sdk.js.map +1 -1
- package/dist/embedders/dimensions.d.ts +9 -0
- package/dist/embedders/dimensions.d.ts.map +1 -0
- package/dist/embedders/dimensions.js +18 -0
- package/dist/embedders/dimensions.js.map +1 -0
- package/dist/embedders/openai.d.ts +1 -1
- package/dist/embedders/openai.js +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/indexer/hash.d.ts +7 -0
- package/dist/indexer/hash.d.ts.map +1 -1
- package/dist/indexer/hash.js +13 -0
- package/dist/indexer/hash.js.map +1 -1
- package/dist/indexer/index.d.ts +10 -4
- package/dist/indexer/index.d.ts.map +1 -1
- package/dist/indexer/index.js +167 -30
- package/dist/indexer/index.js.map +1 -1
- package/dist/indexer/lock-file.d.ts +85 -4
- package/dist/indexer/lock-file.d.ts.map +1 -1
- package/dist/indexer/lock-file.js +108 -9
- package/dist/indexer/lock-file.js.map +1 -1
- package/dist/log-events.d.ts +11 -0
- package/dist/log-events.d.ts.map +1 -1
- package/dist/log-events.js +11 -0
- package/dist/log-events.js.map +1 -1
- package/dist/stores/file.d.ts +7 -1
- package/dist/stores/file.d.ts.map +1 -1
- package/dist/stores/file.js +52 -10
- package/dist/stores/file.js.map +1 -1
- package/dist/stores/memory.d.ts.map +1 -1
- package/dist/stores/memory.js +31 -3
- package/dist/stores/memory.js.map +1 -1
- package/dist/stores/pgvector.d.ts +36 -3
- package/dist/stores/pgvector.d.ts.map +1 -1
- package/dist/stores/pgvector.js +125 -17
- package/dist/stores/pgvector.js.map +1 -1
- package/dist/types.d.ts +69 -9
- package/dist/types.d.ts.map +1 -1
- package/package.json +10 -12
- package/dist/bin.d.ts +0 -3
- package/dist/bin.d.ts.map +0 -1
- package/dist/bin.js +0 -7
- package/dist/bin.js.map +0 -1
- package/dist/cli.d.ts +0 -11
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -356
- package/dist/cli.js.map +0 -1
package/dist/types.d.ts
CHANGED
|
@@ -10,8 +10,14 @@ export type ChunkType = "table" | "column" | "cql" | "question" | "concept" | "r
|
|
|
10
10
|
/**
|
|
11
11
|
* One slice of the v2 artifact, embedded as a single vector.
|
|
12
12
|
*
|
|
13
|
-
* `text` is what gets embedded. `id` is stable across runs
|
|
14
|
-
*
|
|
13
|
+
* `text` is what gets embedded. `id` is stable across runs and scoped to the
|
|
14
|
+
* schema (`chunk:<schemaId>:<local-id>`, `%`/`:` in the schema id
|
|
15
|
+
* percent-encoded; e.g.
|
|
16
|
+
* `chunk:orders-users:table:public.orders`) so several schemas can share one
|
|
17
|
+
* vector store without overwriting each other. Re-embedding is gated on the
|
|
18
|
+
* hash the store reports for the chunk, which covers its text and the
|
|
19
|
+
* embedder id (or on `schema.lock.json`'s text hashes, for stores that cannot
|
|
20
|
+
* report hashes).
|
|
15
21
|
*/
|
|
16
22
|
export type Chunk = {
|
|
17
23
|
id: string;
|
|
@@ -21,9 +27,10 @@ export type Chunk = {
|
|
|
21
27
|
/** Schema-v2 ids referenced by this chunk (for cross-link filtering). */
|
|
22
28
|
refs: string[];
|
|
23
29
|
/**
|
|
24
|
-
* True when the chunk
|
|
25
|
-
*
|
|
26
|
-
* so
|
|
30
|
+
* True when the chunk carries describable content that references a
|
|
31
|
+
* sensitive column/table. The default chunker drops that content (or the
|
|
32
|
+
* whole chunk), so this is only `true` in opt-in mode
|
|
33
|
+
* (`includeSensitiveDescribable: true`) — it flows through for telemetry.
|
|
27
34
|
*/
|
|
28
35
|
sensitive: boolean;
|
|
29
36
|
};
|
|
@@ -53,7 +60,11 @@ export type UpsertRecord = {
|
|
|
53
60
|
id: string;
|
|
54
61
|
vector: number[];
|
|
55
62
|
payload: ChunkPayload;
|
|
56
|
-
/**
|
|
63
|
+
/**
|
|
64
|
+
* Hash of the chunk text and the embedder id that produced `vector`. Stores
|
|
65
|
+
* that persist it and return it from `hashesByPrefix` let the indexer skip
|
|
66
|
+
* chunks they already hold.
|
|
67
|
+
*/
|
|
57
68
|
hash?: string;
|
|
58
69
|
};
|
|
59
70
|
/**
|
|
@@ -63,6 +74,34 @@ export type UpsertRecord = {
|
|
|
63
74
|
* embedded together. No model-specific concerns leak across this seam.
|
|
64
75
|
*/
|
|
65
76
|
export type Embedder = (texts: string[]) => Promise<number[][]>;
|
|
77
|
+
/**
|
|
78
|
+
* Identity of a vector store, recorded in `schema.lock.json` so the indexer
|
|
79
|
+
* can tell when the lock was written against a different store.
|
|
80
|
+
*/
|
|
81
|
+
export type VectorStoreDescriptor = {
|
|
82
|
+
/** Adapter kind, e.g. `"memory"`, `"file"`, `"pgvector"`. */
|
|
83
|
+
kind: string;
|
|
84
|
+
/**
|
|
85
|
+
* Where the vectors live, e.g. the pgvector table name. It is written to
|
|
86
|
+
* `schema.lock.json`, which is usually committed, so keep it stable across
|
|
87
|
+
* machines: no absolute paths, never credentials.
|
|
88
|
+
*/
|
|
89
|
+
location?: string;
|
|
90
|
+
/** Vector dimensions the store holds/expects, when known. */
|
|
91
|
+
dimensions?: number;
|
|
92
|
+
/**
|
|
93
|
+
* The store keeps nothing past the process (the memory store). The indexer
|
|
94
|
+
* neither reads nor writes `schema.lock.json` for it, since the lock
|
|
95
|
+
* describes a persisted index another process can query.
|
|
96
|
+
*/
|
|
97
|
+
ephemeral?: boolean;
|
|
98
|
+
/**
|
|
99
|
+
* How to give this store a different vector width, appended to the
|
|
100
|
+
* indexer's width-mismatch error (e.g. which files to delete or table to
|
|
101
|
+
* drop). Not written to the lock.
|
|
102
|
+
*/
|
|
103
|
+
widthHint?: string;
|
|
104
|
+
};
|
|
66
105
|
/**
|
|
67
106
|
* BYO vector-store seam.
|
|
68
107
|
*
|
|
@@ -74,11 +113,32 @@ export type VectorStore = {
|
|
|
74
113
|
query(vector: number[], k: number, filter?: Filter): Promise<QueryResult[]>;
|
|
75
114
|
delete(ids: string[]): Promise<void>;
|
|
76
115
|
/**
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
116
|
+
* Returns `chunkId → hash` (the `UpsertRecord.hash` stored with it) for
|
|
117
|
+
* stored ids that start with `prefix` (records stored without a hash are
|
|
118
|
+
* omitted).
|
|
119
|
+
*
|
|
120
|
+
* When implemented, the indexer treats the store as the source of truth:
|
|
121
|
+
* a chunk is skipped only if the store reports the hash of the same text
|
|
122
|
+
* embedded by the same embedder for its id. Stores that omit it fall back to `schema.lock.json` bookkeeping
|
|
123
|
+
* (guarded by {@link VectorStore.describe} identity and dimensions); a store
|
|
124
|
+
* that implements neither re-embeds every chunk on each run.
|
|
80
125
|
*/
|
|
81
126
|
hashesByPrefix?(prefix: string): Promise<Record<string, string>>;
|
|
127
|
+
/**
|
|
128
|
+
* Optional: every stored id whose payload `schemaId` matches. Lets the
|
|
129
|
+
* indexer prune orphaned chunks for one schema (including ids written in
|
|
130
|
+
* an older id format) without touching other schemas sharing the store.
|
|
131
|
+
* Without it, the indexer only prunes ids listed in the previous
|
|
132
|
+
* `schema.lock.json`.
|
|
133
|
+
*/
|
|
134
|
+
idsBySchema?(schemaId: string): Promise<string[]>;
|
|
135
|
+
/**
|
|
136
|
+
* Optional: store identity recorded in the lock file. A store without
|
|
137
|
+
* `hashesByPrefix` needs it to reuse chunks from the lock: with neither,
|
|
138
|
+
* the indexer can't tell a fresh, empty instance from the one the lock
|
|
139
|
+
* describes, so it re-embeds everything.
|
|
140
|
+
*/
|
|
141
|
+
describe?(): VectorStoreDescriptor;
|
|
82
142
|
};
|
|
83
143
|
/** Retriever shape consumed by `@askdb/core` `ask({ retriever })`. */
|
|
84
144
|
export type Retriever = (params: {
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,+EAA+E;AAC/E,MAAM,MAAM,SAAS,GACjB,OAAO,GACP,QAAQ,GACR,KAAK,GACL,UAAU,GACV,SAAS,GACT,cAAc,GACd,eAAe,CAAC;AAEpB
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@askdb/rag",
|
|
3
|
-
"version": "0.2.0-beta.
|
|
3
|
+
"version": "0.2.0-beta.25",
|
|
4
4
|
"description": "AskDB RAG layer: deterministic chunker over Schema v2, BYO embedder + vector store (in-memory, file-backed, pgvector), and an optional retriever wired into @askdb/core ask().",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"askdb",
|
|
@@ -24,8 +24,7 @@
|
|
|
24
24
|
"author": "Yahya Gilany",
|
|
25
25
|
"type": "module",
|
|
26
26
|
"sideEffects": [
|
|
27
|
-
"./bin/askdb-rag.js"
|
|
28
|
-
"./dist/bin.js"
|
|
27
|
+
"./bin/askdb-rag.js"
|
|
29
28
|
],
|
|
30
29
|
"main": "./dist/index.js",
|
|
31
30
|
"types": "./dist/index.d.ts",
|
|
@@ -72,15 +71,14 @@
|
|
|
72
71
|
"NOTICE"
|
|
73
72
|
],
|
|
74
73
|
"engines": {
|
|
75
|
-
"node": ">=22.
|
|
74
|
+
"node": ">=22.23.4"
|
|
76
75
|
},
|
|
77
76
|
"dependencies": {
|
|
78
|
-
"@askdb/core": "1.0.0-beta.
|
|
79
|
-
"@askdb/config": "1.0.0-beta.12"
|
|
77
|
+
"@askdb/core": "1.0.0-beta.45"
|
|
80
78
|
},
|
|
81
79
|
"peerDependencies": {
|
|
82
|
-
"@ai-sdk/openai": "^4.0.
|
|
83
|
-
"ai": "^7.0.
|
|
80
|
+
"@ai-sdk/openai": "^3.0.0 || ^4.0.29",
|
|
81
|
+
"ai": "^6.0.0 || ^7.0.51",
|
|
84
82
|
"pg": ">=8"
|
|
85
83
|
},
|
|
86
84
|
"peerDependenciesMeta": {
|
|
@@ -95,12 +93,12 @@
|
|
|
95
93
|
}
|
|
96
94
|
},
|
|
97
95
|
"devDependencies": {
|
|
98
|
-
"@ai-sdk/openai": "^4.0.
|
|
96
|
+
"@ai-sdk/openai": "^4.0.106",
|
|
99
97
|
"@types/pg": "^8.23.1",
|
|
100
|
-
"ai": "^7.0.
|
|
101
|
-
"pg": "^8.23.
|
|
98
|
+
"ai": "^7.0.51",
|
|
99
|
+
"pg": "^8.23.1",
|
|
102
100
|
"typescript": "^6.0.3",
|
|
103
|
-
"vitest": "^5.0.
|
|
101
|
+
"vitest": "^5.0.5"
|
|
104
102
|
},
|
|
105
103
|
"scripts": {
|
|
106
104
|
"build": "tsc -p tsconfig.build.json",
|
package/dist/bin.d.ts
DELETED
package/dist/bin.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":""}
|
package/dist/bin.js
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { bootstrapAskDbEnv } from "@askdb/config";
|
|
3
|
-
import { runRagCli } from "./cli.js";
|
|
4
|
-
bootstrapAskDbEnv({ cwd: process.cwd() });
|
|
5
|
-
const exitCode = await runRagCli(process.argv.slice(2));
|
|
6
|
-
process.exit(exitCode);
|
|
7
|
-
//# sourceMappingURL=bin.js.map
|
package/dist/bin.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,iBAAiB,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAC1C,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC"}
|
package/dist/cli.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { Embedder } from "./types.js";
|
|
2
|
-
export declare function runRagCli(argv: readonly string[]): Promise<number>;
|
|
3
|
-
/**
|
|
4
|
-
* Deterministic mock embedder used for tests, CI, and quick smoke-checks.
|
|
5
|
-
*
|
|
6
|
-
* Produces a stable lexical bag-of-words vector by hashing normalized tokens;
|
|
7
|
-
* same text always yields the same vector. Not a real embedder, but useful for
|
|
8
|
-
* local smoke tests because shared terms like "revenue" can rank related chunks.
|
|
9
|
-
*/
|
|
10
|
-
export declare function createMockEmbedder(dim?: number): Embedder;
|
|
11
|
-
//# sourceMappingURL=cli.d.ts.map
|
package/dist/cli.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EACV,QAAQ,EAIT,MAAM,YAAY,CAAC;AAuBpB,wBAAsB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BxE;AA0ID;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,SAAK,GAAG,QAAQ,CAYrD"}
|
package/dist/cli.js
DELETED
|
@@ -1,356 +0,0 @@
|
|
|
1
|
-
import { randomUUID } from "node:crypto";
|
|
2
|
-
import { readFileSync } from "node:fs";
|
|
3
|
-
import { join, resolve } from "node:path";
|
|
4
|
-
import { createAskDbLogger, formatSupportedAskDbLogLevels, isSupportedAskDbLogLevel, } from "@askdb/core";
|
|
5
|
-
import { getAskDbRuntimeConfig } from "@askdb/config";
|
|
6
|
-
import { buildSchemaIndex } from "./indexer/index.js";
|
|
7
|
-
import { loadChunkerSourcesFromDir } from "./chunker/sources.js";
|
|
8
|
-
import { createOpenAiEmbedder as createAiSdkOpenAiEmbedder } from "./embedders/openai.js";
|
|
9
|
-
import { createMemoryStore } from "./stores/memory.js";
|
|
10
|
-
import { createFileStore } from "./stores/file.js";
|
|
11
|
-
import { createPgvectorStore, } from "./stores/pgvector.js";
|
|
12
|
-
export async function runRagCli(argv) {
|
|
13
|
-
try {
|
|
14
|
-
if (argv.includes("--version") || argv.includes("-V")) {
|
|
15
|
-
process.stdout.write(`${readPackageVersion()}\n`);
|
|
16
|
-
return 0;
|
|
17
|
-
}
|
|
18
|
-
if (argv.length === 0 || argv.includes("--help") || argv.includes("-h")) {
|
|
19
|
-
printHelp();
|
|
20
|
-
return 0;
|
|
21
|
-
}
|
|
22
|
-
const cmd = argv[0];
|
|
23
|
-
if (cmd !== "index" && cmd !== "query" && cmd !== "setup-store") {
|
|
24
|
-
throw new Error(`Unknown command: ${cmd} (expected 'index', 'query', or 'setup-store')`);
|
|
25
|
-
}
|
|
26
|
-
const opts = parseOptions(argv.slice(1));
|
|
27
|
-
opts.command = cmd;
|
|
28
|
-
if (cmd === "setup-store")
|
|
29
|
-
return await runSetupStore(opts);
|
|
30
|
-
if (!opts.schemaDir) {
|
|
31
|
-
throw new Error("Missing positional <schema-dir>.");
|
|
32
|
-
}
|
|
33
|
-
const runtimeConfig = getAskDbRuntimeConfig();
|
|
34
|
-
const logger = buildLogger(opts, runtimeConfig);
|
|
35
|
-
if (cmd === "index")
|
|
36
|
-
return await runIndex(opts, logger, runtimeConfig);
|
|
37
|
-
return await runQuery(opts, logger, runtimeConfig);
|
|
38
|
-
}
|
|
39
|
-
catch (e) {
|
|
40
|
-
process.stderr.write(`${e instanceof Error ? e.message : String(e)}\n`);
|
|
41
|
-
return 1;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
async function runIndex(opts, logger, runtimeConfig) {
|
|
45
|
-
const sources = loadChunkerSourcesFromDir(opts.schemaDir);
|
|
46
|
-
const embedder = buildEmbedder(opts, runtimeConfig);
|
|
47
|
-
const dimensions = embedderDimensions(opts);
|
|
48
|
-
const store = await buildStore(opts, dimensions);
|
|
49
|
-
const result = await buildSchemaIndex({
|
|
50
|
-
schema: sources,
|
|
51
|
-
embedder,
|
|
52
|
-
store,
|
|
53
|
-
embedderId: embedderId(opts),
|
|
54
|
-
lockFilePath: join(resolve(opts.schemaDir), "schema.lock.json"),
|
|
55
|
-
correlationId: opts.correlationId,
|
|
56
|
-
logger,
|
|
57
|
-
});
|
|
58
|
-
process.stdout.write(`${JSON.stringify({
|
|
59
|
-
schemaId: sources.schema.schemaId,
|
|
60
|
-
chunksTotal: result.stats.chunksTotal,
|
|
61
|
-
chunksIndexed: result.stats.chunksIndexed,
|
|
62
|
-
chunksReused: result.stats.chunksReused,
|
|
63
|
-
sensitiveExcluded: result.stats.sensitiveExcluded,
|
|
64
|
-
sensitiveIncluded: result.stats.sensitiveIncluded,
|
|
65
|
-
}, null, 2)}\n`);
|
|
66
|
-
await closeStore(store);
|
|
67
|
-
return 0;
|
|
68
|
-
}
|
|
69
|
-
async function runQuery(opts, logger, runtimeConfig) {
|
|
70
|
-
if (!opts.question) {
|
|
71
|
-
throw new Error("Missing --question for query command.");
|
|
72
|
-
}
|
|
73
|
-
const sources = loadChunkerSourcesFromDir(opts.schemaDir);
|
|
74
|
-
const embedder = buildEmbedder(opts, runtimeConfig);
|
|
75
|
-
const dimensions = embedderDimensions(opts);
|
|
76
|
-
const store = await buildStore(opts, dimensions);
|
|
77
|
-
const filter = { schemaId: sources.schema.schemaId };
|
|
78
|
-
if (opts.filterTypes && opts.filterTypes.length > 0) {
|
|
79
|
-
filter.types = opts.filterTypes;
|
|
80
|
-
}
|
|
81
|
-
const [vector] = await embedder([opts.question]);
|
|
82
|
-
const k = opts.k ?? 8;
|
|
83
|
-
const results = await store.query(vector, k, filter);
|
|
84
|
-
logger.info({
|
|
85
|
-
event: "askdb.rag.cli.query",
|
|
86
|
-
questionChars: opts.question.length,
|
|
87
|
-
k,
|
|
88
|
-
resultCount: results.length,
|
|
89
|
-
}, "rag query completed");
|
|
90
|
-
process.stdout.write(`${JSON.stringify({
|
|
91
|
-
question: opts.question,
|
|
92
|
-
k,
|
|
93
|
-
results: results.map((r) => ({
|
|
94
|
-
id: r.id,
|
|
95
|
-
score: Number(r.score.toFixed(6)),
|
|
96
|
-
type: r.payload.type,
|
|
97
|
-
schemaId: r.payload.schemaId,
|
|
98
|
-
refs: r.payload.refs,
|
|
99
|
-
textPreview: r.payload.text.slice(0, 200),
|
|
100
|
-
})),
|
|
101
|
-
}, null, 2)}\n`);
|
|
102
|
-
await closeStore(store);
|
|
103
|
-
return 0;
|
|
104
|
-
}
|
|
105
|
-
async function runSetupStore(opts) {
|
|
106
|
-
if (!opts.pgUrl) {
|
|
107
|
-
throw new Error("setup-store requires --pg-url <connection-string>.");
|
|
108
|
-
}
|
|
109
|
-
const dimensions = opts.dimensions ?? 1536;
|
|
110
|
-
const store = createPgvectorStore({
|
|
111
|
-
connectionString: opts.pgUrl,
|
|
112
|
-
table: opts.pgTable,
|
|
113
|
-
dimensions,
|
|
114
|
-
});
|
|
115
|
-
await store.ensureSchema();
|
|
116
|
-
await store.close();
|
|
117
|
-
const table = opts.pgTable ?? "askdb_rag_chunks";
|
|
118
|
-
process.stdout.write(`pgvector schema ready: table "${table}" (dimensions=${dimensions})\n`);
|
|
119
|
-
return 0;
|
|
120
|
-
}
|
|
121
|
-
function buildEmbedder(opts, runtimeConfig) {
|
|
122
|
-
const choice = opts.embedder ?? "mock";
|
|
123
|
-
if (choice === "mock")
|
|
124
|
-
return createMockEmbedder();
|
|
125
|
-
if (choice === "openai")
|
|
126
|
-
return createOpenAiEmbedder(opts, runtimeConfig);
|
|
127
|
-
throw new Error(`Unknown embedder: ${choice}`);
|
|
128
|
-
}
|
|
129
|
-
function embedderId(opts) {
|
|
130
|
-
const choice = opts.embedder ?? "mock";
|
|
131
|
-
if (choice === "openai") {
|
|
132
|
-
const base = `openai:${opts.embedderModel ?? "text-embedding-3-small"}`;
|
|
133
|
-
return opts.dimensions ? `${base}:${opts.dimensions}` : base;
|
|
134
|
-
}
|
|
135
|
-
return `mock:lexical-${embedderDimensions(opts)}`;
|
|
136
|
-
}
|
|
137
|
-
function embedderDimensions(opts) {
|
|
138
|
-
if (opts.dimensions)
|
|
139
|
-
return opts.dimensions;
|
|
140
|
-
const choice = opts.embedder ?? "mock";
|
|
141
|
-
if (choice === "openai") {
|
|
142
|
-
const model = opts.embedderModel ?? "text-embedding-3-small";
|
|
143
|
-
if (model === "text-embedding-3-small")
|
|
144
|
-
return 1536;
|
|
145
|
-
if (model === "text-embedding-3-large")
|
|
146
|
-
return 3072;
|
|
147
|
-
if (model === "text-embedding-ada-002")
|
|
148
|
-
return 1536;
|
|
149
|
-
throw new Error(`Pass --dimensions for unknown embedder model: ${model}`);
|
|
150
|
-
}
|
|
151
|
-
return 64;
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Deterministic mock embedder used for tests, CI, and quick smoke-checks.
|
|
155
|
-
*
|
|
156
|
-
* Produces a stable lexical bag-of-words vector by hashing normalized tokens;
|
|
157
|
-
* same text always yields the same vector. Not a real embedder, but useful for
|
|
158
|
-
* local smoke tests because shared terms like "revenue" can rank related chunks.
|
|
159
|
-
*/
|
|
160
|
-
export function createMockEmbedder(dim = 64) {
|
|
161
|
-
return async (texts) => {
|
|
162
|
-
return texts.map((text) => {
|
|
163
|
-
const v = new Array(dim).fill(0);
|
|
164
|
-
const tokens = text.toLowerCase().match(/[a-z0-9_]+/g) ?? [];
|
|
165
|
-
for (const token of tokens) {
|
|
166
|
-
v[stableTokenHash(token) % dim] += 1;
|
|
167
|
-
}
|
|
168
|
-
const norm = Math.sqrt(v.reduce((s, x) => s + x * x, 0)) || 1;
|
|
169
|
-
return v.map((x) => x / norm);
|
|
170
|
-
});
|
|
171
|
-
};
|
|
172
|
-
}
|
|
173
|
-
function stableTokenHash(token) {
|
|
174
|
-
let h = 2166136261;
|
|
175
|
-
for (let i = 0; i < token.length; i++) {
|
|
176
|
-
h ^= token.charCodeAt(i);
|
|
177
|
-
h = Math.imul(h, 16777619);
|
|
178
|
-
}
|
|
179
|
-
return h >>> 0;
|
|
180
|
-
}
|
|
181
|
-
function createOpenAiEmbedder(opts, runtimeConfig) {
|
|
182
|
-
const apiKey = opts.apiKey ?? runtimeConfig.rag.embedder.apiKey;
|
|
183
|
-
if (!apiKey) {
|
|
184
|
-
throw new Error("createOpenAiEmbedder: set OPENAI_API_KEY or pass --api-key. The OpenAI embedder uses the AI SDK optional peers (`ai` and `@ai-sdk/openai`).");
|
|
185
|
-
}
|
|
186
|
-
return createAiSdkOpenAiEmbedder({
|
|
187
|
-
apiKey,
|
|
188
|
-
model: opts.embedderModel ?? "text-embedding-3-small",
|
|
189
|
-
baseURL: runtimeConfig.rag.embedder.baseURL,
|
|
190
|
-
dimensions: opts.dimensions,
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
async function buildStore(opts, dimensions) {
|
|
194
|
-
const choice = opts.store ?? "file";
|
|
195
|
-
if (choice === "memory")
|
|
196
|
-
return createMemoryStore();
|
|
197
|
-
if (choice === "file") {
|
|
198
|
-
const path = opts.filePath
|
|
199
|
-
? opts.filePath
|
|
200
|
-
: join(resolve(opts.schemaDir), "schema");
|
|
201
|
-
return createFileStore({ basePath: path });
|
|
202
|
-
}
|
|
203
|
-
if (choice === "pgvector") {
|
|
204
|
-
if (!opts.pgUrl) {
|
|
205
|
-
throw new Error("pgvector store requires --pg-url (or set PGURL/DATABASE_URL via your shell).");
|
|
206
|
-
}
|
|
207
|
-
const pgOptions = {
|
|
208
|
-
connectionString: opts.pgUrl,
|
|
209
|
-
table: opts.pgTable,
|
|
210
|
-
dimensions,
|
|
211
|
-
};
|
|
212
|
-
return createPgvectorStore(pgOptions);
|
|
213
|
-
}
|
|
214
|
-
throw new Error(`Unknown store: ${choice}`);
|
|
215
|
-
}
|
|
216
|
-
async function closeStore(store) {
|
|
217
|
-
if (typeof store.flush === "function")
|
|
218
|
-
store.flush();
|
|
219
|
-
if (typeof store.close === "function")
|
|
220
|
-
await store.close();
|
|
221
|
-
}
|
|
222
|
-
function buildLogger(opts, runtimeConfig) {
|
|
223
|
-
const level = resolveLogLevel(opts, runtimeConfig);
|
|
224
|
-
return createAskDbLogger({
|
|
225
|
-
correlationId: opts.correlationId ?? runtimeConfig.logging.correlationId ?? randomUUID(),
|
|
226
|
-
level,
|
|
227
|
-
logFile: opts.logFile ?? runtimeConfig.logging.logFile,
|
|
228
|
-
logStdout: opts.logStdout ?? runtimeConfig.logging.logStdout,
|
|
229
|
-
});
|
|
230
|
-
}
|
|
231
|
-
function resolveLogLevel(opts, runtimeConfig) {
|
|
232
|
-
if (opts.logLevel !== undefined && opts.logLevel !== "") {
|
|
233
|
-
const lvl = opts.logLevel.toLowerCase();
|
|
234
|
-
if (!isSupportedAskDbLogLevel(lvl)) {
|
|
235
|
-
throw new Error(`Invalid --log-level: ${opts.logLevel} (expected one of ${formatSupportedAskDbLogLevels()})`);
|
|
236
|
-
}
|
|
237
|
-
return lvl;
|
|
238
|
-
}
|
|
239
|
-
const envLevel = runtimeConfig.logging.level?.toLowerCase();
|
|
240
|
-
if (envLevel && isSupportedAskDbLogLevel(envLevel))
|
|
241
|
-
return envLevel;
|
|
242
|
-
if (opts.verbose || opts.logFile || opts.logStdout)
|
|
243
|
-
return "info";
|
|
244
|
-
return "silent";
|
|
245
|
-
}
|
|
246
|
-
function parseOptions(argv) {
|
|
247
|
-
const opts = {};
|
|
248
|
-
let positional = 0;
|
|
249
|
-
for (let i = 0; i < argv.length; i++) {
|
|
250
|
-
const arg = argv[i];
|
|
251
|
-
if (!arg.startsWith("-")) {
|
|
252
|
-
if (positional === 0)
|
|
253
|
-
opts.schemaDir = arg;
|
|
254
|
-
else
|
|
255
|
-
throw new Error(`Unexpected positional argument: ${arg}`);
|
|
256
|
-
positional++;
|
|
257
|
-
continue;
|
|
258
|
-
}
|
|
259
|
-
switch (arg) {
|
|
260
|
-
case "--store":
|
|
261
|
-
opts.store = readValue(argv, ++i, arg);
|
|
262
|
-
break;
|
|
263
|
-
case "--embedder":
|
|
264
|
-
opts.embedder = readValue(argv, ++i, arg);
|
|
265
|
-
break;
|
|
266
|
-
case "--embedder-model":
|
|
267
|
-
opts.embedderModel = readValue(argv, ++i, arg);
|
|
268
|
-
break;
|
|
269
|
-
case "--api-key":
|
|
270
|
-
opts.apiKey = readValue(argv, ++i, arg);
|
|
271
|
-
break;
|
|
272
|
-
case "--question":
|
|
273
|
-
opts.question = readValue(argv, ++i, arg);
|
|
274
|
-
break;
|
|
275
|
-
case "-k":
|
|
276
|
-
case "--k":
|
|
277
|
-
opts.k = Number(readValue(argv, ++i, arg));
|
|
278
|
-
break;
|
|
279
|
-
case "--pg-url":
|
|
280
|
-
opts.pgUrl = readValue(argv, ++i, arg);
|
|
281
|
-
break;
|
|
282
|
-
case "--pg-table":
|
|
283
|
-
opts.pgTable = readValue(argv, ++i, arg);
|
|
284
|
-
break;
|
|
285
|
-
case "--dimensions":
|
|
286
|
-
opts.dimensions = Number(readValue(argv, ++i, arg));
|
|
287
|
-
break;
|
|
288
|
-
case "--types":
|
|
289
|
-
opts.filterTypes = readValue(argv, ++i, arg).split(",").map((s) => s.trim()).filter(Boolean);
|
|
290
|
-
break;
|
|
291
|
-
case "--file-path":
|
|
292
|
-
opts.filePath = readValue(argv, ++i, arg);
|
|
293
|
-
break;
|
|
294
|
-
case "-v":
|
|
295
|
-
case "--verbose":
|
|
296
|
-
opts.verbose = true;
|
|
297
|
-
break;
|
|
298
|
-
case "--log-level":
|
|
299
|
-
opts.logLevel = readValue(argv, ++i, arg);
|
|
300
|
-
break;
|
|
301
|
-
case "--log-file":
|
|
302
|
-
opts.logFile = readValue(argv, ++i, arg);
|
|
303
|
-
break;
|
|
304
|
-
case "--log-stdout":
|
|
305
|
-
opts.logStdout = true;
|
|
306
|
-
break;
|
|
307
|
-
case "--correlation-id":
|
|
308
|
-
opts.correlationId = readValue(argv, ++i, arg);
|
|
309
|
-
break;
|
|
310
|
-
default:
|
|
311
|
-
throw new Error(`Unknown option: ${arg}`);
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
return opts;
|
|
315
|
-
}
|
|
316
|
-
function readValue(argv, index, flag) {
|
|
317
|
-
const value = argv[index];
|
|
318
|
-
if (!value || (value.startsWith("--") && value !== flag)) {
|
|
319
|
-
throw new Error(`${flag} requires a value.`);
|
|
320
|
-
}
|
|
321
|
-
return value;
|
|
322
|
-
}
|
|
323
|
-
function readPackageVersion() {
|
|
324
|
-
const pkgPath = new URL("../package.json", import.meta.url);
|
|
325
|
-
const parsed = JSON.parse(readFileSync(pkgPath, "utf8"));
|
|
326
|
-
return typeof parsed.version === "string" ? parsed.version : "0.0.0";
|
|
327
|
-
}
|
|
328
|
-
function printHelp() {
|
|
329
|
-
process.stdout.write([
|
|
330
|
-
"askdb-rag - Chunk + index + query a Schema v2 directory.",
|
|
331
|
-
"",
|
|
332
|
-
"Usage:",
|
|
333
|
-
" askdb-rag index <schema-dir> [--store memory|file|pgvector] [--embedder mock|openai] [--dimensions <n>]",
|
|
334
|
-
" askdb-rag query <schema-dir> --question \"...\" [-k 8] [--types table,column,cql]",
|
|
335
|
-
" askdb-rag setup-store --pg-url <conn> [--pg-table askdb_rag_chunks] [--dimensions <n>]",
|
|
336
|
-
"",
|
|
337
|
-
"Commands:",
|
|
338
|
-
" index Chunk and embed a schema directory into the configured store.",
|
|
339
|
-
" query Run a similarity query against an indexed store.",
|
|
340
|
-
" setup-store Create the pgvector extension, table, and indexes. Idempotent — safe to re-run.",
|
|
341
|
-
"",
|
|
342
|
-
"Stores:",
|
|
343
|
-
" memory in-memory cosine. Ephemeral. Default for `query`-only smoke checks against `index --store memory`.",
|
|
344
|
-
" file persisted as <schema-dir>/schema.embeddings.{bin,json} (default).",
|
|
345
|
-
" pgvector --pg-url <conn> [--pg-table askdb_rag_chunks] [--dimensions <n>]",
|
|
346
|
-
"",
|
|
347
|
-
"Embedders:",
|
|
348
|
-
" mock deterministic lexical hash. Default. CI-safe.",
|
|
349
|
-
" openai AI SDK OpenAI embeddings; OPENAI_API_KEY (or --api-key); --embedder-model text-embedding-3-small (default).",
|
|
350
|
-
"",
|
|
351
|
-
"Logging matches `askdb`:",
|
|
352
|
-
" --log-level <level> --log-file <path> --log-stdout --correlation-id <id> -v/--verbose",
|
|
353
|
-
"",
|
|
354
|
-
].join("\n"));
|
|
355
|
-
}
|
|
356
|
-
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|