@functional-systems/srcx 0.1.0-dev.16 → 0.1.0-dev.18
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/CHANGELOG.md +6 -0
- package/DESIGN.md +36 -22
- package/README.md +82 -21
- package/RELEASING.md +15 -3
- package/VALIDATION.md +126 -13
- package/dist/cli.js +14 -1
- package/dist/cli.js.map +1 -1
- package/dist/rerank.d.ts +16 -0
- package/dist/rerank.js +68 -0
- package/dist/rerank.js.map +1 -0
- package/dist/search.d.ts +3 -1
- package/dist/search.js +80 -22
- package/dist/search.js.map +1 -1
- package/package.json +4 -2
- package/runtime/qwen.py +97 -0
- package/runtime/requirements.txt +34 -0
- package/src/cli.ts +26 -0
- package/src/rerank.ts +115 -0
- package/src/search.ts +99 -24
package/dist/rerank.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import { invariant } from "./common.js";
|
|
4
|
+
export const QWEN_MODEL = "Qwen/Qwen3-Reranker-0.6B";
|
|
5
|
+
export const QWEN_REVISION = "e61197ed45024b0ed8a2d74b80b4d909f1255473";
|
|
6
|
+
export function candidateLimit(limit, options) {
|
|
7
|
+
invariant(Number.isInteger(limit) && limit >= 1 && limit <= 100, "Limit must be an integer from 1 to 100.");
|
|
8
|
+
invariant(options.rerank === undefined || options.rerank === "qwen", "Unknown reranker.");
|
|
9
|
+
invariant(options.rerank || options.candidates === undefined, "--candidates requires --rerank qwen.");
|
|
10
|
+
const count = options.rerank
|
|
11
|
+
? (options.candidates ?? Math.max(50, limit))
|
|
12
|
+
: limit;
|
|
13
|
+
invariant(Number.isInteger(count) && count >= limit && count <= 100, "Candidates must be an integer between --limit and 100.");
|
|
14
|
+
if (options.rerank)
|
|
15
|
+
invariant(process.env.SRCX_RERANK_PYTHON, "Set SRCX_RERANK_PYTHON to the prepared Python executable; see README reranker setup.");
|
|
16
|
+
return count;
|
|
17
|
+
}
|
|
18
|
+
export async function qwenScores(query, candidates) {
|
|
19
|
+
invariant(candidates.length > 0 &&
|
|
20
|
+
candidates.length <= 100 &&
|
|
21
|
+
new Set(candidates.map((c) => c.id)).size === candidates.length, "Invalid reranker candidates.");
|
|
22
|
+
const input = JSON.stringify({ query, candidates });
|
|
23
|
+
invariant(Buffer.byteLength(input) <= 4 * 1024 * 1024, "Reranker input exceeds 4 MiB.");
|
|
24
|
+
const python = process.env.SRCX_RERANK_PYTHON;
|
|
25
|
+
invariant(python, "Set SRCX_RERANK_PYTHON to the prepared Python executable.");
|
|
26
|
+
const start = performance.now();
|
|
27
|
+
const stdout = await new Promise((resolve, reject) => {
|
|
28
|
+
const child = execFile(python, [fileURLToPath(new URL("../runtime/qwen.py", import.meta.url))], {
|
|
29
|
+
encoding: "utf8",
|
|
30
|
+
timeout: 120_000,
|
|
31
|
+
killSignal: "SIGKILL",
|
|
32
|
+
maxBuffer: 1024 * 1024,
|
|
33
|
+
env: {
|
|
34
|
+
...process.env,
|
|
35
|
+
HF_HUB_OFFLINE: "1",
|
|
36
|
+
HF_HUB_DISABLE_TELEMETRY: "1",
|
|
37
|
+
TOKENIZERS_PARALLELISM: "false",
|
|
38
|
+
},
|
|
39
|
+
}, (error, output) => {
|
|
40
|
+
if (error)
|
|
41
|
+
reject(new Error("Qwen reranking failed or exceeded 120 seconds. Check Python dependencies, cached model and SRCX_RERANK_DEVICE; no fallback was applied."));
|
|
42
|
+
else
|
|
43
|
+
resolve(output);
|
|
44
|
+
});
|
|
45
|
+
// An early worker exit can close stdin before Node finishes writing.
|
|
46
|
+
child.stdin?.on("error", () => { });
|
|
47
|
+
child.stdin?.end(input);
|
|
48
|
+
});
|
|
49
|
+
let response;
|
|
50
|
+
try {
|
|
51
|
+
response = JSON.parse(stdout);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
throw new Error("Invalid Qwen response.");
|
|
55
|
+
}
|
|
56
|
+
invariant(response?.model === QWEN_MODEL &&
|
|
57
|
+
response?.revision === QWEN_REVISION &&
|
|
58
|
+
Array.isArray(response.scores) &&
|
|
59
|
+
response.scores.length === candidates.length, "Qwen response model or candidate count mismatch.");
|
|
60
|
+
const scores = response.scores.map((entry, index) => {
|
|
61
|
+
invariant(entry?.id === candidates[index].id &&
|
|
62
|
+
typeof entry.score === "number" &&
|
|
63
|
+
Number.isFinite(entry.score), "Qwen response candidate identity or score mismatch.");
|
|
64
|
+
return entry.score;
|
|
65
|
+
});
|
|
66
|
+
return { scores, elapsedMs: performance.now() - start };
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=rerank.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rerank.js","sourceRoot":"","sources":["../src/rerank.ts"],"names":[],"mappings":"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"}
|
package/dist/search.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { type Settings } from "./settings.js";
|
|
|
3
3
|
import type { Repository } from "./repository.js";
|
|
4
4
|
import type { Published } from "./publish.js";
|
|
5
5
|
import { type InventoryItem } from "./build.js";
|
|
6
|
+
import { type RerankOptions } from "./rerank.js";
|
|
6
7
|
export type Handle = {
|
|
7
8
|
id: string;
|
|
8
9
|
endpoint: string;
|
|
@@ -30,13 +31,14 @@ export declare function retrievalQuery(query: string, size: number, filters: {
|
|
|
30
31
|
export declare function search(store: CollectionStore, s: Settings, r: Repository, v: Published, query: string, size?: number, filters?: {
|
|
31
32
|
path?: string;
|
|
32
33
|
language?: string;
|
|
33
|
-
}, mode?: SearchMode): Promise<unknown[]>;
|
|
34
|
+
}, mode?: SearchMode, options?: RerankOptions): Promise<unknown[]>;
|
|
34
35
|
export declare function loadHandle(id: string): Promise<Handle>;
|
|
35
36
|
export declare function directHandle(store: CollectionStore, s: Settings, r: Repository, v: Published, path: string): Promise<Handle>;
|
|
36
37
|
export declare function readHandle(store: CollectionStore, s: Settings, h: Handle, options?: {
|
|
37
38
|
context?: number;
|
|
38
39
|
fullFile?: boolean;
|
|
39
40
|
lines?: [number, number];
|
|
41
|
+
exactChunk?: boolean;
|
|
40
42
|
}): Promise<{
|
|
41
43
|
repository: string;
|
|
42
44
|
commitOid: string;
|
package/dist/search.js
CHANGED
|
@@ -4,6 +4,7 @@ import { atomic, hash, invariant, json, lineAt } from "./common.js";
|
|
|
4
4
|
import { one, tag } from "./remote.js";
|
|
5
5
|
import { stateRoot } from "./settings.js";
|
|
6
6
|
import { PRESET, recordHash } from "./build.js";
|
|
7
|
+
import { candidateLimit, qwenScores, QWEN_MODEL, QWEN_REVISION, } from "./rerank.js";
|
|
7
8
|
export async function inventoryAt(store, r, v) {
|
|
8
9
|
const current = (await store.tags()).find((t) => t.name === v.tagName);
|
|
9
10
|
invariant(current?.snapshotId === v.snapshotId, "Pinned Tag was deleted or recreated.");
|
|
@@ -63,14 +64,18 @@ export function retrievalQuery(query, size, filters, mode) {
|
|
|
63
64
|
};
|
|
64
65
|
return mode === "semantic" ? semantic : { rrf: [lexical, semantic] };
|
|
65
66
|
}
|
|
66
|
-
export async function search(store, s, r, v, query, size = 10, filters = {}, mode = "lexical") {
|
|
67
|
-
|
|
67
|
+
export async function search(store, s, r, v, query, size = 10, filters = {}, mode = "lexical", options = {}) {
|
|
68
|
+
const started = performance.now();
|
|
69
|
+
const count = candidateLimit(size, options);
|
|
68
70
|
invariant(mode === "lexical" || r.preset?.embedding?.managed, "Semantic/hybrid search requires a managed embedding Collection; register with --embedding text-embedding-3-small or text-embedding-3-large.");
|
|
69
|
-
const request = retrievalQuery(query,
|
|
71
|
+
const request = retrievalQuery(query, count, filters, mode);
|
|
70
72
|
const entries = await inventoryAt(store, r, v);
|
|
71
73
|
const files = new Map(entries.filter((e) => e.status === "included").map((e) => [e.fileId, e]));
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
+
const candidates = [];
|
|
75
|
+
const hits = await store.query(v.tagName, request, count);
|
|
76
|
+
invariant(hits.length <= count &&
|
|
77
|
+
new Set(hits.map((h) => h.doc.id)).size === hits.length, "Invalid search candidate count or duplicate IDs.");
|
|
78
|
+
for (const hit of hits) {
|
|
74
79
|
const d = hit.doc, e = files.get(d.fileId);
|
|
75
80
|
invariant(d.kind === "chunk" &&
|
|
76
81
|
d.configHash === r.configHash &&
|
|
@@ -93,23 +98,67 @@ export async function search(store, s, r, v, query, size = 10, filters = {}, mod
|
|
|
93
98
|
endLine: Number(d.endLine),
|
|
94
99
|
};
|
|
95
100
|
// Check the exact source/ranges before persisting an evidence handle.
|
|
96
|
-
const evidence = await readHandle(store, s, handle
|
|
97
|
-
|
|
101
|
+
const evidence = await readHandle(store, s, handle, {
|
|
102
|
+
exactChunk: !!options.rerank,
|
|
103
|
+
});
|
|
104
|
+
candidates.push({
|
|
105
|
+
handle,
|
|
106
|
+
text: evidence.sourceText,
|
|
107
|
+
result: {
|
|
108
|
+
resultId: id,
|
|
109
|
+
repository: r.repoKey,
|
|
110
|
+
commitOid: v.commitOid,
|
|
111
|
+
version: v.tagName,
|
|
112
|
+
snapshotId: v.snapshotId,
|
|
113
|
+
path: d.path,
|
|
114
|
+
startLine: d.startLine,
|
|
115
|
+
endLine: d.endLine,
|
|
116
|
+
symbol: d.symbol,
|
|
117
|
+
score: hit.score,
|
|
118
|
+
excerpt: evidence.sourceText.slice(0, 600),
|
|
119
|
+
citation: evidence.citation,
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
const retrievalMs = performance.now() - started;
|
|
124
|
+
let rerankMs = 0;
|
|
125
|
+
let ranked = candidates.map((candidate, index) => ({
|
|
126
|
+
...candidate,
|
|
127
|
+
index,
|
|
128
|
+
rerankScore: 0,
|
|
129
|
+
}));
|
|
130
|
+
if (options.rerank && candidates.length) {
|
|
131
|
+
const response = await qwenScores(query, candidates.map((c) => ({ id: c.handle.chunkId, text: c.text })));
|
|
132
|
+
rerankMs = response.elapsedMs;
|
|
133
|
+
ranked = ranked
|
|
134
|
+
.map((c, index) => ({ ...c, rerankScore: response.scores[index] }))
|
|
135
|
+
.sort((a, b) => b.rerankScore - a.rerankScore || a.index - b.index);
|
|
136
|
+
}
|
|
137
|
+
if (options.rerank)
|
|
138
|
+
invariant((await store.tags()).find((t) => t.name === v.tagName)?.snapshotId ===
|
|
139
|
+
v.snapshotId, "Pinned Tag was deleted or recreated during reranking.");
|
|
140
|
+
const result = [];
|
|
141
|
+
for (const c of ranked.slice(0, size)) {
|
|
142
|
+
await atomic(join(stateRoot(), "results", c.handle.id + ".json"), c.handle);
|
|
98
143
|
result.push({
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
symbol: d.symbol,
|
|
108
|
-
score: hit.score,
|
|
109
|
-
excerpt: evidence.sourceText.slice(0, 600),
|
|
110
|
-
citation: evidence.citation,
|
|
144
|
+
...c.result,
|
|
145
|
+
...(options.rerank
|
|
146
|
+
? {
|
|
147
|
+
rerankScore: c.rerankScore,
|
|
148
|
+
retrievalRank: c.index + 1,
|
|
149
|
+
reranker: { model: QWEN_MODEL, revision: QWEN_REVISION },
|
|
150
|
+
}
|
|
151
|
+
: {}),
|
|
111
152
|
});
|
|
112
153
|
}
|
|
154
|
+
if (options.rerank)
|
|
155
|
+
options.onTiming?.({
|
|
156
|
+
candidates: candidates.length,
|
|
157
|
+
returned: result.length,
|
|
158
|
+
retrievalMs,
|
|
159
|
+
rerankMs,
|
|
160
|
+
searchMs: performance.now() - started,
|
|
161
|
+
});
|
|
113
162
|
return result;
|
|
114
163
|
}
|
|
115
164
|
export async function loadHandle(id) {
|
|
@@ -149,6 +198,7 @@ export async function readHandle(store, s, h, options = {}) {
|
|
|
149
198
|
const total = raw.length === 0
|
|
150
199
|
? 0
|
|
151
200
|
: lineAt(raw, raw.length - (raw.at(-1) === 10 ? 1 : 0));
|
|
201
|
+
let chunkSource;
|
|
152
202
|
if (h.chunkId) {
|
|
153
203
|
const d = await one(store, tag(v.tagName), h.chunkId);
|
|
154
204
|
invariant(d &&
|
|
@@ -163,6 +213,7 @@ export async function readHandle(store, s, h, options = {}) {
|
|
|
163
213
|
z <= raw.length &&
|
|
164
214
|
lineAt(raw, a) === h.startLine &&
|
|
165
215
|
lineAt(raw, z - 1) === h.endLine, "Invalid source range.");
|
|
216
|
+
chunkSource = raw.subarray(a, z).toString("utf8");
|
|
166
217
|
}
|
|
167
218
|
const context = options.context ?? 0;
|
|
168
219
|
invariant(Number.isInteger(context) && context >= 0, "Context must be a nonnegative integer.");
|
|
@@ -182,9 +233,16 @@ export async function readHandle(store, s, h, options = {}) {
|
|
|
182
233
|
end = Math.min(total, end + context);
|
|
183
234
|
}
|
|
184
235
|
const lines = file.sourceText.match(/[^\n]*\n|[^\n]+$/g) ?? [];
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
236
|
+
invariant(!options.exactChunk ||
|
|
237
|
+
(chunkSource !== undefined &&
|
|
238
|
+
!options.fullFile &&
|
|
239
|
+
!options.lines &&
|
|
240
|
+
!options.context), "Exact chunk reads require a chunk handle without range overrides.");
|
|
241
|
+
const sourceText = options.exactChunk
|
|
242
|
+
? chunkSource
|
|
243
|
+
: options.fullFile
|
|
244
|
+
? file.sourceText
|
|
245
|
+
: lines.slice(start - 1, end).join("");
|
|
188
246
|
return {
|
|
189
247
|
repository: h.repository.repoKey,
|
|
190
248
|
commitOid: v.commitOid,
|
package/dist/search.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@functional-systems/srcx",
|
|
3
|
-
"version": "0.1.0-dev.
|
|
3
|
+
"version": "0.1.0-dev.18",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Version-aware code search on LambdaDB",
|
|
6
6
|
"type": "module",
|
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
},
|
|
10
10
|
"files": [
|
|
11
11
|
"dist",
|
|
12
|
+
"runtime/qwen.py",
|
|
13
|
+
"runtime/requirements.txt",
|
|
12
14
|
"README.md",
|
|
13
15
|
"DESIGN.md",
|
|
14
16
|
"VALIDATION.md",
|
|
@@ -62,5 +64,5 @@
|
|
|
62
64
|
"url": "https://github.com/lambdadb/srcx/issues"
|
|
63
65
|
},
|
|
64
66
|
"license": "Apache-2.0",
|
|
65
|
-
"gitHead": "
|
|
67
|
+
"gitHead": "7521974a331471b264a695e6f9795bba3e4a7dfd"
|
|
66
68
|
}
|
package/runtime/qwen.py
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"""Offline, one-request Qwen worker. Stdout is the versioned score protocol."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import math
|
|
5
|
+
import os
|
|
6
|
+
import sys
|
|
7
|
+
|
|
8
|
+
MODEL = "Qwen/Qwen3-Reranker-0.6B"
|
|
9
|
+
REVISION = "e61197ed45024b0ed8a2d74b80b4d909f1255473"
|
|
10
|
+
PREFIX = (
|
|
11
|
+
"<|im_start|>system\nJudge whether the Document meets the requirements "
|
|
12
|
+
"based on the Query and the Instruct provided. Note that the answer "
|
|
13
|
+
'can only be "yes" or "no".<|im_end|>\n<|im_start|>user\n'
|
|
14
|
+
)
|
|
15
|
+
SUFFIX = "<|im_end|>\n<|im_start|>assistant\n<think>\n\n</think>\n\n"
|
|
16
|
+
INSTRUCTION = "Given a code search query, retrieve code passages that answer the query."
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def require(condition, message):
|
|
20
|
+
if not condition:
|
|
21
|
+
raise ValueError(message)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def encode(tokenizer, query, text):
|
|
25
|
+
body = f"<Instruct>: {INSTRUCTION}\n<Query>: {query}\n<Document>: {text}"
|
|
26
|
+
ids = sum((tokenizer.encode(p, add_special_tokens=False)
|
|
27
|
+
for p in (PREFIX, body, SUFFIX)), [])
|
|
28
|
+
require(len(ids) <= 8192, "Pair exceeds 8192 tokens; no truncation")
|
|
29
|
+
return ids
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def validate(body):
|
|
33
|
+
require(isinstance(body, dict) and set(body) == {"query", "candidates"}, "Invalid request")
|
|
34
|
+
require(isinstance(body["query"], str) and 0 < len(body["query"]) <= 4096, "Invalid query")
|
|
35
|
+
candidates = body["candidates"]
|
|
36
|
+
require(isinstance(candidates, list) and 0 < len(candidates) <= 100, "Invalid candidates")
|
|
37
|
+
seen = set()
|
|
38
|
+
for c in candidates:
|
|
39
|
+
require(isinstance(c, dict) and set(c) == {"id", "text"} and
|
|
40
|
+
all(isinstance(v, str) and v for v in c.values()), "Invalid candidate")
|
|
41
|
+
require(c["id"] not in seen, "Duplicate candidate ID")
|
|
42
|
+
seen.add(c["id"])
|
|
43
|
+
return body
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def score(body):
|
|
47
|
+
os.environ["HF_HUB_OFFLINE"] = "1"
|
|
48
|
+
from huggingface_hub import snapshot_download
|
|
49
|
+
from transformers import AutoTokenizer, AutoModelForCausalLM
|
|
50
|
+
import torch
|
|
51
|
+
|
|
52
|
+
path = snapshot_download(MODEL, revision=REVISION, local_files_only=True,
|
|
53
|
+
allow_patterns=["config.json", "generation_config.json", "model.safetensors",
|
|
54
|
+
"tokenizer.json", "tokenizer_config.json", "vocab.json", "merges.txt"])
|
|
55
|
+
tokenizer = AutoTokenizer.from_pretrained(path, local_files_only=True, trust_remote_code=False)
|
|
56
|
+
# Reuse exact duplicate code within this query, retaining every candidate ID.
|
|
57
|
+
encoded = {c["text"]: None for c in body["candidates"]}
|
|
58
|
+
for text in encoded:
|
|
59
|
+
encoded[text] = encode(tokenizer, body["query"], text)
|
|
60
|
+
device = os.environ.get("SRCX_RERANK_DEVICE", "auto")
|
|
61
|
+
require(device in ("auto", "cpu", "mps", "cuda"), "Invalid device")
|
|
62
|
+
if device == "auto":
|
|
63
|
+
device = "cuda" if torch.cuda.is_available() else "mps" if torch.backends.mps.is_available() else "cpu"
|
|
64
|
+
model = AutoModelForCausalLM.from_pretrained(
|
|
65
|
+
path, local_files_only=True, trust_remote_code=False,
|
|
66
|
+
dtype=torch.float32, attn_implementation="sdpa",
|
|
67
|
+
).to(device).eval()
|
|
68
|
+
yes, no = (tokenizer.convert_tokens_to_ids(label) for label in ("yes", "no"))
|
|
69
|
+
require(tokenizer.encode("yes", add_special_tokens=False) == [yes] and
|
|
70
|
+
tokenizer.encode("no", add_special_tokens=False) == [no], "Invalid label tokens")
|
|
71
|
+
margins = {}
|
|
72
|
+
with torch.inference_mode():
|
|
73
|
+
for text, ids in encoded.items():
|
|
74
|
+
tensor = torch.tensor([ids], dtype=torch.long, device=device)
|
|
75
|
+
logits = model(input_ids=tensor, attention_mask=torch.ones_like(tensor),
|
|
76
|
+
use_cache=False, logits_to_keep=1).logits[0, -1]
|
|
77
|
+
margin = float((logits[yes].float() - logits[no].float()).cpu())
|
|
78
|
+
require(math.isfinite(margin), "Non-finite score")
|
|
79
|
+
margins[text] = margin
|
|
80
|
+
return {"model": MODEL, "revision": REVISION,
|
|
81
|
+
"scores": [{"id": c["id"], "score": margins[c["text"]]} for c in body["candidates"]]}
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def main():
|
|
85
|
+
raw = sys.stdin.buffer.read(4 * 1024 * 1024 + 1)
|
|
86
|
+
require(len(raw) <= 4 * 1024 * 1024, "Request exceeds 4 MiB")
|
|
87
|
+
body = validate(json.loads(raw))
|
|
88
|
+
print(json.dumps(score(body), allow_nan=False))
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
if __name__ == "__main__":
|
|
92
|
+
try:
|
|
93
|
+
main()
|
|
94
|
+
except Exception:
|
|
95
|
+
# Libraries may include source text or environment values in exceptions.
|
|
96
|
+
print("Qwen worker failed; verify setup, device and input size.", file=sys.stderr)
|
|
97
|
+
sys.exit(1)
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
annotated-doc==0.0.5
|
|
2
|
+
anyio==4.15.1
|
|
3
|
+
certifi==2026.7.22
|
|
4
|
+
click==8.5.0
|
|
5
|
+
filelock==4.0.3
|
|
6
|
+
fsspec==2026.9.0
|
|
7
|
+
h11==0.16.0
|
|
8
|
+
hf-xet==1.6.0
|
|
9
|
+
httpcore==1.0.9
|
|
10
|
+
httpx==0.28.1
|
|
11
|
+
huggingface-hub==1.33.0
|
|
12
|
+
idna==3.20
|
|
13
|
+
jinja2==3.1.6
|
|
14
|
+
markdown-it-py==4.2.0
|
|
15
|
+
markupsafe==3.0.3
|
|
16
|
+
mdurl==0.1.2
|
|
17
|
+
mpmath==1.3.0
|
|
18
|
+
networkx==3.7
|
|
19
|
+
numpy==2.5.3
|
|
20
|
+
packaging==26.3
|
|
21
|
+
pygments==2.21.0
|
|
22
|
+
pyyaml==6.0.3
|
|
23
|
+
regex==2026.9.10
|
|
24
|
+
rich==15.0.0
|
|
25
|
+
safetensors==0.8.0
|
|
26
|
+
setuptools==84.0.0
|
|
27
|
+
shellingham==1.5.4
|
|
28
|
+
sympy==1.14.0
|
|
29
|
+
tokenizers==0.23.2
|
|
30
|
+
torch==2.14.0
|
|
31
|
+
tqdm==4.70.1
|
|
32
|
+
transformers==5.17.0
|
|
33
|
+
typer==0.27.2
|
|
34
|
+
typing-extensions==4.16.0
|
package/src/cli.ts
CHANGED
|
@@ -33,6 +33,7 @@ import {
|
|
|
33
33
|
} from "./publish.js";
|
|
34
34
|
import { resolveVersion, syncTags } from "./releases.js";
|
|
35
35
|
import { directHandle, loadHandle, readHandle, search } from "./search.js";
|
|
36
|
+
import { candidateLimit } from "./rerank.js";
|
|
36
37
|
const cli = new Command()
|
|
37
38
|
.name("srcx")
|
|
38
39
|
.description("Version-aware code search on LambdaDB")
|
|
@@ -335,9 +336,22 @@ cli
|
|
|
335
336
|
.choices(["lexical", "semantic", "hybrid"])
|
|
336
337
|
.default("lexical"),
|
|
337
338
|
)
|
|
339
|
+
.addOption(
|
|
340
|
+
new Option(
|
|
341
|
+
"--rerank <model>",
|
|
342
|
+
"Opt-in local reranker (requires separate Python/model setup)",
|
|
343
|
+
).choices(["qwen"]),
|
|
344
|
+
)
|
|
345
|
+
.option(
|
|
346
|
+
"--candidates <count>",
|
|
347
|
+
"Rerank pool size (default: max(50, limit); max: 100)",
|
|
348
|
+
integer,
|
|
349
|
+
)
|
|
338
350
|
.option("--path <path>", "Exact path filter")
|
|
339
351
|
.option("--language <name>")
|
|
340
352
|
.action(async (o) => {
|
|
353
|
+
const started = performance.now();
|
|
354
|
+
candidateLimit(o.limit, o);
|
|
341
355
|
const { remote, settings } = await connected();
|
|
342
356
|
const r = await selectRepository(remote, o.repo),
|
|
343
357
|
store = remote.store(r.collection),
|
|
@@ -355,6 +369,18 @@ cli
|
|
|
355
369
|
language: o.language,
|
|
356
370
|
},
|
|
357
371
|
o.mode,
|
|
372
|
+
{
|
|
373
|
+
rerank: o.rerank,
|
|
374
|
+
candidates: o.candidates,
|
|
375
|
+
onTiming: (timing) =>
|
|
376
|
+
process.stderr.write(
|
|
377
|
+
JSON.stringify({
|
|
378
|
+
event: "rerank-timing",
|
|
379
|
+
...timing,
|
|
380
|
+
commandMs: performance.now() - started,
|
|
381
|
+
}) + "\n",
|
|
382
|
+
),
|
|
383
|
+
},
|
|
358
384
|
),
|
|
359
385
|
);
|
|
360
386
|
});
|
package/src/rerank.ts
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import { invariant } from "./common.js";
|
|
4
|
+
|
|
5
|
+
export const QWEN_MODEL = "Qwen/Qwen3-Reranker-0.6B";
|
|
6
|
+
export const QWEN_REVISION = "e61197ed45024b0ed8a2d74b80b4d909f1255473";
|
|
7
|
+
export type Candidate = { id: string; text: string };
|
|
8
|
+
export type RerankOptions = {
|
|
9
|
+
rerank?: "qwen";
|
|
10
|
+
candidates?: number;
|
|
11
|
+
onTiming?: (timing: Record<string, unknown>) => void;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export function candidateLimit(limit: number, options: RerankOptions): number {
|
|
15
|
+
invariant(
|
|
16
|
+
Number.isInteger(limit) && limit >= 1 && limit <= 100,
|
|
17
|
+
"Limit must be an integer from 1 to 100.",
|
|
18
|
+
);
|
|
19
|
+
invariant(
|
|
20
|
+
options.rerank === undefined || options.rerank === "qwen",
|
|
21
|
+
"Unknown reranker.",
|
|
22
|
+
);
|
|
23
|
+
invariant(
|
|
24
|
+
options.rerank || options.candidates === undefined,
|
|
25
|
+
"--candidates requires --rerank qwen.",
|
|
26
|
+
);
|
|
27
|
+
const count = options.rerank
|
|
28
|
+
? (options.candidates ?? Math.max(50, limit))
|
|
29
|
+
: limit;
|
|
30
|
+
invariant(
|
|
31
|
+
Number.isInteger(count) && count >= limit && count <= 100,
|
|
32
|
+
"Candidates must be an integer between --limit and 100.",
|
|
33
|
+
);
|
|
34
|
+
if (options.rerank)
|
|
35
|
+
invariant(
|
|
36
|
+
process.env.SRCX_RERANK_PYTHON,
|
|
37
|
+
"Set SRCX_RERANK_PYTHON to the prepared Python executable; see README reranker setup.",
|
|
38
|
+
);
|
|
39
|
+
return count;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export async function qwenScores(query: string, candidates: Candidate[]) {
|
|
43
|
+
invariant(
|
|
44
|
+
candidates.length > 0 &&
|
|
45
|
+
candidates.length <= 100 &&
|
|
46
|
+
new Set(candidates.map((c) => c.id)).size === candidates.length,
|
|
47
|
+
"Invalid reranker candidates.",
|
|
48
|
+
);
|
|
49
|
+
const input = JSON.stringify({ query, candidates });
|
|
50
|
+
invariant(
|
|
51
|
+
Buffer.byteLength(input) <= 4 * 1024 * 1024,
|
|
52
|
+
"Reranker input exceeds 4 MiB.",
|
|
53
|
+
);
|
|
54
|
+
const python = process.env.SRCX_RERANK_PYTHON;
|
|
55
|
+
invariant(
|
|
56
|
+
python,
|
|
57
|
+
"Set SRCX_RERANK_PYTHON to the prepared Python executable.",
|
|
58
|
+
);
|
|
59
|
+
const start = performance.now();
|
|
60
|
+
const stdout = await new Promise<string>((resolve, reject) => {
|
|
61
|
+
const child = execFile(
|
|
62
|
+
python,
|
|
63
|
+
[fileURLToPath(new URL("../runtime/qwen.py", import.meta.url))],
|
|
64
|
+
{
|
|
65
|
+
encoding: "utf8",
|
|
66
|
+
timeout: 120_000,
|
|
67
|
+
killSignal: "SIGKILL",
|
|
68
|
+
maxBuffer: 1024 * 1024,
|
|
69
|
+
env: {
|
|
70
|
+
...process.env,
|
|
71
|
+
HF_HUB_OFFLINE: "1",
|
|
72
|
+
HF_HUB_DISABLE_TELEMETRY: "1",
|
|
73
|
+
TOKENIZERS_PARALLELISM: "false",
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
(error, output) => {
|
|
77
|
+
if (error)
|
|
78
|
+
reject(
|
|
79
|
+
new Error(
|
|
80
|
+
"Qwen reranking failed or exceeded 120 seconds. Check Python dependencies, cached model and SRCX_RERANK_DEVICE; no fallback was applied.",
|
|
81
|
+
),
|
|
82
|
+
);
|
|
83
|
+
else resolve(output);
|
|
84
|
+
},
|
|
85
|
+
);
|
|
86
|
+
// An early worker exit can close stdin before Node finishes writing.
|
|
87
|
+
child.stdin?.on("error", () => {});
|
|
88
|
+
child.stdin?.end(input);
|
|
89
|
+
});
|
|
90
|
+
let response;
|
|
91
|
+
try {
|
|
92
|
+
response = JSON.parse(stdout);
|
|
93
|
+
} catch {
|
|
94
|
+
throw new Error("Invalid Qwen response.");
|
|
95
|
+
}
|
|
96
|
+
invariant(
|
|
97
|
+
response?.model === QWEN_MODEL &&
|
|
98
|
+
response?.revision === QWEN_REVISION &&
|
|
99
|
+
Array.isArray(response.scores) &&
|
|
100
|
+
response.scores.length === candidates.length,
|
|
101
|
+
"Qwen response model or candidate count mismatch.",
|
|
102
|
+
);
|
|
103
|
+
const scores: number[] = response.scores.map(
|
|
104
|
+
(entry: { id?: unknown; score?: unknown }, index: number) => {
|
|
105
|
+
invariant(
|
|
106
|
+
entry?.id === candidates[index]!.id &&
|
|
107
|
+
typeof entry.score === "number" &&
|
|
108
|
+
Number.isFinite(entry.score),
|
|
109
|
+
"Qwen response candidate identity or score mismatch.",
|
|
110
|
+
);
|
|
111
|
+
return entry.score;
|
|
112
|
+
},
|
|
113
|
+
);
|
|
114
|
+
return { scores, elapsedMs: performance.now() - start };
|
|
115
|
+
}
|