@librechat/agents 3.7.9 → 3.7.10
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/dist/cjs/tools/search/metrics.cjs +234 -0
- package/dist/cjs/tools/search/metrics.cjs.map +1 -0
- package/dist/cjs/tools/search/rerankers.cjs +80 -68
- package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
- package/dist/cjs/tools/search/search.cjs +95 -45
- package/dist/cjs/tools/search/search.cjs.map +1 -1
- package/dist/cjs/tools/search/tool.cjs +77 -49
- package/dist/cjs/tools/search/tool.cjs.map +1 -1
- package/dist/cjs/tools/search/utils.cjs.map +1 -1
- package/dist/esm/tools/search/metrics.mjs +234 -0
- package/dist/esm/tools/search/metrics.mjs.map +1 -0
- package/dist/esm/tools/search/rerankers.mjs +80 -68
- package/dist/esm/tools/search/rerankers.mjs.map +1 -1
- package/dist/esm/tools/search/search.mjs +96 -46
- package/dist/esm/tools/search/search.mjs.map +1 -1
- package/dist/esm/tools/search/tool.mjs +77 -49
- package/dist/esm/tools/search/tool.mjs.map +1 -1
- package/dist/esm/tools/search/utils.mjs.map +1 -1
- package/dist/types/tools/search/metrics.d.ts +15 -0
- package/dist/types/tools/search/rerankers.d.ts +30 -5
- package/dist/types/tools/search/tool.d.ts +7 -1
- package/dist/types/tools/search/types.d.ts +88 -4
- package/dist/types/tools/search/utils.d.ts +2 -10
- package/package.json +1 -1
- package/src/tools/search/metrics.ts +400 -0
- package/src/tools/search/rerankers.ts +160 -97
- package/src/tools/search/search.ts +139 -56
- package/src/tools/search/tool.ts +126 -62
- package/src/tools/search/types.ts +104 -4
- package/src/tools/search/utils.ts +2 -10
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
//#region src/tools/search/metrics.ts
|
|
2
|
+
const MAX_REASON_KEYS = 6;
|
|
3
|
+
const MAX_FAILURE_SAMPLES = 3;
|
|
4
|
+
const MAX_DETAIL_LENGTH = 200;
|
|
5
|
+
const MAX_LABEL_LENGTH = 48;
|
|
6
|
+
const OTHER_REASON = "other";
|
|
7
|
+
const HTTP_STATUS_REGEX = /\b(?:status(?:\scode)?|http)\D{0,3}(\d{3})\b/i;
|
|
8
|
+
const REASON_PATTERNS = [
|
|
9
|
+
[/ECONNABORTED|ETIMEDOUT|timeout|timed out/i, "timeout"],
|
|
10
|
+
[/ENOTFOUND|EAI_AGAIN|getaddrinfo/i, "dns"],
|
|
11
|
+
[/ECONNREFUSED|ECONNRESET|EPIPE|socket hang up/i, "connection"],
|
|
12
|
+
[/CERT_|SSL|TLS|self[- ]signed/i, "tls"],
|
|
13
|
+
[/abort|cancel/i, "aborted"]
|
|
14
|
+
];
|
|
15
|
+
const classifyFailure = (message) => {
|
|
16
|
+
if (message == null || message === "") return "unknown";
|
|
17
|
+
const status = HTTP_STATUS_REGEX.exec(message);
|
|
18
|
+
if (status != null) return `http_${status[1]}`;
|
|
19
|
+
for (const [pattern, reason] of REASON_PATTERNS) if (pattern.test(message)) return reason;
|
|
20
|
+
return OTHER_REASON;
|
|
21
|
+
};
|
|
22
|
+
const bump = (counts, rawKey) => {
|
|
23
|
+
const key = label(rawKey);
|
|
24
|
+
const existing = counts.get(key);
|
|
25
|
+
if (existing != null) {
|
|
26
|
+
counts.set(key, existing + 1);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (counts.size >= MAX_REASON_KEYS) {
|
|
30
|
+
counts.set(OTHER_REASON, (counts.get(OTHER_REASON) ?? 0) + 1);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
counts.set(key, 1);
|
|
34
|
+
};
|
|
35
|
+
const hostOf = (url) => {
|
|
36
|
+
try {
|
|
37
|
+
return new URL(url).hostname.replace(/^www\./, "");
|
|
38
|
+
} catch {
|
|
39
|
+
return url.slice(0, 60);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
const formatCount = (value) => value < 1e4 ? String(value) : `${(value / 1e3).toFixed(1)}k`;
|
|
43
|
+
const formatMs = (ms) => ms < 1e3 ? `${Math.round(ms)}ms` : `${(ms / 1e3).toFixed(1)}s`;
|
|
44
|
+
const formatMap = (counts) => {
|
|
45
|
+
let out = "";
|
|
46
|
+
for (const [key, count] of counts) out += `${out === "" ? "" : ","}${key}:${count}`;
|
|
47
|
+
return `{${out}}`;
|
|
48
|
+
};
|
|
49
|
+
const truncate = (value, max) => value.length <= max ? value : `${value.slice(0, max)}…`;
|
|
50
|
+
const UNPRINTABLE = /[\p{Cc}\p{Cf}\p{Zl}\p{Zp}"]+/gu;
|
|
51
|
+
const sanitize = (value) => value.replace(UNPRINTABLE, " ");
|
|
52
|
+
const label = (value) => truncate(sanitize(value), MAX_LABEL_LENGTH);
|
|
53
|
+
const detailOf = (value) => truncate(sanitize(value), MAX_DETAIL_LENGTH);
|
|
54
|
+
const mergeProvider = (current, incoming) => current === incoming ? current : "mixed";
|
|
55
|
+
const createSearchMetrics = (logger, autoFlush = false) => {
|
|
56
|
+
let search;
|
|
57
|
+
let scrape;
|
|
58
|
+
let rerank;
|
|
59
|
+
const flushSearch = (phase) => {
|
|
60
|
+
let line = `[web_search] search=${label(phase.provider)} queries=${phase.queries}`;
|
|
61
|
+
if (phase.types.size > 0) line += ` results=${formatMap(phase.types)}`;
|
|
62
|
+
line += ` dur=${formatMs(phase.durationMs)}`;
|
|
63
|
+
if (phase.failed === 0) {
|
|
64
|
+
logger.debug(line);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
line += ` failed=${phase.failed} reasons=${formatMap(phase.reasons)}`;
|
|
68
|
+
if (phase.errors === 0) {
|
|
69
|
+
logger.warn(line);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
if (phase.detail == null) {
|
|
73
|
+
logger.error(line);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
logger.error(line, phase.detail);
|
|
77
|
+
};
|
|
78
|
+
const flushScrape = (phase) => {
|
|
79
|
+
let line = `[web_search] scrape links=${phase.links} ok=${phase.ok} chars=${formatCount(phase.chars)} highlights=${phase.highlights}`;
|
|
80
|
+
if (phase.empty > 0) line += ` empty=${phase.empty}`;
|
|
81
|
+
if (phase.failed === 0) {
|
|
82
|
+
logger.debug(line);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
line += ` failed=${phase.failed} reasons=${formatMap(phase.reasons)}`;
|
|
86
|
+
if (phase.samples.length > 0) line += ` sample=${phase.samples.join(",")}`;
|
|
87
|
+
if (phase.detail == null) {
|
|
88
|
+
logger.error(line);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
logger.error(line, phase.detail);
|
|
92
|
+
};
|
|
93
|
+
const flushRerank = (phase) => {
|
|
94
|
+
let line = `[web_search] rerank=${label(phase.provider)} calls=${phase.calls} chunks=${phase.chunks} maxChunks=${phase.maxChunks} results=${phase.results} dur=${formatMs(phase.durationMs)} maxDur=${formatMs(phase.maxDurationMs)}`;
|
|
95
|
+
if (phase.model != null) line += ` model="${label(phase.model)}"`;
|
|
96
|
+
if (phase.units > 0) line += ` units=${phase.units}`;
|
|
97
|
+
if (phase.dropped > 0) line += ` dropped=${phase.dropped}`;
|
|
98
|
+
if (phase.topKLimit != null) line += ` topK=${phase.topK} topKLimit=${phase.topKLimit}`;
|
|
99
|
+
if (phase.fallbacks === 0) {
|
|
100
|
+
logger.debug(line);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
line += ` fallbacks=${phase.fallbacks} reasons=${formatMap(phase.reasons)}`;
|
|
104
|
+
if (phase.fallbacks - (phase.reasons.get("placeholder") ?? 0) === 0 && phase.errors === 0) {
|
|
105
|
+
logger.debug(line);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (phase.errors === 0) {
|
|
109
|
+
logger.warn(line);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (phase.error == null) {
|
|
113
|
+
logger.error(line);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
logger.error(line, phase.error);
|
|
117
|
+
};
|
|
118
|
+
const flush = () => {
|
|
119
|
+
if (search != null) {
|
|
120
|
+
flushSearch(search);
|
|
121
|
+
search = void 0;
|
|
122
|
+
}
|
|
123
|
+
if (scrape != null) {
|
|
124
|
+
flushScrape(scrape);
|
|
125
|
+
scrape = void 0;
|
|
126
|
+
}
|
|
127
|
+
if (rerank != null) {
|
|
128
|
+
flushRerank(rerank);
|
|
129
|
+
rerank = void 0;
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
const recordSearch = (observation) => {
|
|
133
|
+
search ??= {
|
|
134
|
+
provider: observation.provider,
|
|
135
|
+
queries: 0,
|
|
136
|
+
failed: 0,
|
|
137
|
+
errors: 0,
|
|
138
|
+
durationMs: 0,
|
|
139
|
+
types: /* @__PURE__ */ new Map(),
|
|
140
|
+
reasons: /* @__PURE__ */ new Map()
|
|
141
|
+
};
|
|
142
|
+
search.provider = mergeProvider(search.provider, observation.provider);
|
|
143
|
+
search.queries += 1;
|
|
144
|
+
search.durationMs = Math.max(search.durationMs, observation.durationMs);
|
|
145
|
+
if (observation.error != null) {
|
|
146
|
+
search.failed += 1;
|
|
147
|
+
bump(search.reasons, `${observation.type}:${classifyFailure(observation.error)}`);
|
|
148
|
+
if (observation.thrown === true) {
|
|
149
|
+
search.errors += 1;
|
|
150
|
+
search.detail ??= detailOf(observation.error);
|
|
151
|
+
}
|
|
152
|
+
} else if (observation.results > 0) {
|
|
153
|
+
const type = label(observation.type);
|
|
154
|
+
const seen = search.types.get(type) ?? 0;
|
|
155
|
+
search.types.set(type, seen + observation.results);
|
|
156
|
+
}
|
|
157
|
+
if (autoFlush) flush();
|
|
158
|
+
};
|
|
159
|
+
const recordScrape = (observation) => {
|
|
160
|
+
scrape ??= {
|
|
161
|
+
links: 0,
|
|
162
|
+
ok: 0,
|
|
163
|
+
empty: 0,
|
|
164
|
+
chars: 0,
|
|
165
|
+
highlights: 0,
|
|
166
|
+
failed: 0,
|
|
167
|
+
reasons: /* @__PURE__ */ new Map(),
|
|
168
|
+
samples: [],
|
|
169
|
+
detail: void 0
|
|
170
|
+
};
|
|
171
|
+
scrape.links += 1;
|
|
172
|
+
if (observation.error != null) {
|
|
173
|
+
scrape.failed += 1;
|
|
174
|
+
const reason = classifyFailure(observation.error);
|
|
175
|
+
bump(scrape.reasons, reason);
|
|
176
|
+
if (scrape.samples.length < MAX_FAILURE_SAMPLES) scrape.samples.push(label(`${hostOf(observation.url)}:${reason}`));
|
|
177
|
+
scrape.detail ??= detailOf(observation.error);
|
|
178
|
+
} else {
|
|
179
|
+
scrape.ok += 1;
|
|
180
|
+
const chars = observation.chars ?? 0;
|
|
181
|
+
scrape.chars += chars;
|
|
182
|
+
scrape.highlights += observation.highlights ?? 0;
|
|
183
|
+
if (chars === 0) scrape.empty += 1;
|
|
184
|
+
}
|
|
185
|
+
if (autoFlush) flush();
|
|
186
|
+
};
|
|
187
|
+
const recordRerank = (observation) => {
|
|
188
|
+
rerank ??= {
|
|
189
|
+
provider: observation.provider,
|
|
190
|
+
calls: 0,
|
|
191
|
+
fallbacks: 0,
|
|
192
|
+
errors: 0,
|
|
193
|
+
chunks: 0,
|
|
194
|
+
maxChunks: 0,
|
|
195
|
+
dropped: 0,
|
|
196
|
+
results: 0,
|
|
197
|
+
units: 0,
|
|
198
|
+
durationMs: 0,
|
|
199
|
+
maxDurationMs: 0,
|
|
200
|
+
reasons: /* @__PURE__ */ new Map()
|
|
201
|
+
};
|
|
202
|
+
rerank.provider = mergeProvider(rerank.provider, observation.provider);
|
|
203
|
+
rerank.calls += 1;
|
|
204
|
+
rerank.chunks += observation.chunks;
|
|
205
|
+
rerank.maxChunks = Math.max(rerank.maxChunks, observation.chunks);
|
|
206
|
+
rerank.results += observation.results;
|
|
207
|
+
rerank.dropped += observation.dropped ?? 0;
|
|
208
|
+
rerank.topK ??= observation.topK;
|
|
209
|
+
rerank.topKLimit ??= observation.topKLimit;
|
|
210
|
+
rerank.units += observation.units ?? 0;
|
|
211
|
+
rerank.durationMs += observation.durationMs;
|
|
212
|
+
rerank.maxDurationMs = Math.max(rerank.maxDurationMs, observation.durationMs);
|
|
213
|
+
if (observation.model != null) rerank.model = rerank.model == null ? observation.model : mergeProvider(rerank.model, observation.model);
|
|
214
|
+
if (observation.reason != null) {
|
|
215
|
+
rerank.fallbacks += 1;
|
|
216
|
+
bump(rerank.reasons, observation.reason);
|
|
217
|
+
}
|
|
218
|
+
if (observation.error != null) {
|
|
219
|
+
rerank.errors += 1;
|
|
220
|
+
rerank.error ??= observation.error;
|
|
221
|
+
}
|
|
222
|
+
if (autoFlush) flush();
|
|
223
|
+
};
|
|
224
|
+
return {
|
|
225
|
+
recordSearch,
|
|
226
|
+
recordScrape,
|
|
227
|
+
recordRerank,
|
|
228
|
+
flush
|
|
229
|
+
};
|
|
230
|
+
};
|
|
231
|
+
//#endregion
|
|
232
|
+
exports.createSearchMetrics = createSearchMetrics;
|
|
233
|
+
|
|
234
|
+
//# sourceMappingURL=metrics.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.cjs","names":[],"sources":["../../../../src/tools/search/metrics.ts"],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const require_runtime = require("../../_virtual/_rolldown/runtime.cjs");
|
|
2
2
|
const require_utils = require("./utils.cjs");
|
|
3
|
+
const require_metrics = require("./metrics.cjs");
|
|
3
4
|
let axios = require("axios");
|
|
4
5
|
axios = require_runtime.__toESM(axios, 1);
|
|
5
6
|
//#region src/tools/search/rerankers.ts
|
|
@@ -9,6 +10,7 @@ const getDefaultJinaApiUrl = () => process.env.JINA_API_URL != null && process.e
|
|
|
9
10
|
var BaseReranker = class {
|
|
10
11
|
apiKey;
|
|
11
12
|
logger;
|
|
13
|
+
ownMetrics;
|
|
12
14
|
constructor(logger) {
|
|
13
15
|
this.logger = logger || require_utils.createDefaultLogger();
|
|
14
16
|
}
|
|
@@ -18,8 +20,43 @@ var BaseReranker = class {
|
|
|
18
20
|
score: 0
|
|
19
21
|
}));
|
|
20
22
|
}
|
|
23
|
+
localMetrics() {
|
|
24
|
+
this.ownMetrics ??= require_metrics.createSearchMetrics(this.logger, true);
|
|
25
|
+
return this.ownMetrics;
|
|
26
|
+
}
|
|
27
|
+
beginRerank(documents, topK, metrics) {
|
|
28
|
+
return {
|
|
29
|
+
metrics: metrics ?? this.localMetrics(),
|
|
30
|
+
documents,
|
|
31
|
+
topK,
|
|
32
|
+
startedAt: Date.now()
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
record(run, highlights, reason, error) {
|
|
36
|
+
run.metrics.recordRerank({
|
|
37
|
+
provider: this.provider,
|
|
38
|
+
chunks: run.documents.length,
|
|
39
|
+
results: highlights.length,
|
|
40
|
+
durationMs: Date.now() - run.startedAt,
|
|
41
|
+
model: run.model,
|
|
42
|
+
units: run.units,
|
|
43
|
+
dropped: run.dropped,
|
|
44
|
+
topK: run.topKLimit != null ? run.topK : void 0,
|
|
45
|
+
topKLimit: run.topKLimit,
|
|
46
|
+
reason,
|
|
47
|
+
error
|
|
48
|
+
});
|
|
49
|
+
return highlights;
|
|
50
|
+
}
|
|
51
|
+
complete(run, highlights) {
|
|
52
|
+
return this.record(run, highlights);
|
|
53
|
+
}
|
|
54
|
+
fallback(run, reason, error) {
|
|
55
|
+
return this.record(run, this.getDefaultRanking(run.documents, run.topK), reason, error);
|
|
56
|
+
}
|
|
21
57
|
};
|
|
22
58
|
var JinaReranker = class extends BaseReranker {
|
|
59
|
+
provider = "jina";
|
|
23
60
|
apiUrl;
|
|
24
61
|
timeout;
|
|
25
62
|
httpAgent;
|
|
@@ -32,13 +69,10 @@ var JinaReranker = class extends BaseReranker {
|
|
|
32
69
|
this.httpAgent = httpAgent;
|
|
33
70
|
this.httpsAgent = httpsAgent;
|
|
34
71
|
}
|
|
35
|
-
async rerank(query, documents, topK = 5) {
|
|
36
|
-
this.
|
|
72
|
+
async rerank(query, documents, topK = 5, metrics) {
|
|
73
|
+
const run = this.beginRerank(documents, topK, metrics);
|
|
37
74
|
try {
|
|
38
|
-
if (this.apiKey == null || this.apiKey === "")
|
|
39
|
-
this.logger.warn("JINA_API_KEY is not set. Using default ranking.");
|
|
40
|
-
return this.getDefaultRanking(documents, topK);
|
|
41
|
-
}
|
|
75
|
+
if (this.apiKey == null || this.apiKey === "") return this.fallback(run, "no_api_key");
|
|
42
76
|
const requestData = {
|
|
43
77
|
model: "jina-reranker-v2-base-multilingual",
|
|
44
78
|
query,
|
|
@@ -55,9 +89,11 @@ var JinaReranker = class extends BaseReranker {
|
|
|
55
89
|
httpAgent: this.httpAgent,
|
|
56
90
|
httpsAgent: this.httpsAgent
|
|
57
91
|
});
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
92
|
+
run.model = response.data?.model;
|
|
93
|
+
run.units = response.data?.usage?.total_tokens;
|
|
94
|
+
const results = response.data?.results;
|
|
95
|
+
if (!Array.isArray(results) || results.length === 0) return this.fallback(run, "bad_response");
|
|
96
|
+
return this.complete(run, results.map((result) => {
|
|
61
97
|
const docIndex = result.index;
|
|
62
98
|
const score = result.relevance_score;
|
|
63
99
|
let text = "";
|
|
@@ -70,18 +106,14 @@ var JinaReranker = class extends BaseReranker {
|
|
|
70
106
|
text,
|
|
71
107
|
score
|
|
72
108
|
};
|
|
73
|
-
});
|
|
74
|
-
else {
|
|
75
|
-
this.logger.warn("Unexpected response format from Jina API. Using default ranking.");
|
|
76
|
-
return this.getDefaultRanking(documents, topK);
|
|
77
|
-
}
|
|
109
|
+
}));
|
|
78
110
|
} catch (error) {
|
|
79
|
-
this.
|
|
80
|
-
return this.getDefaultRanking(documents, topK);
|
|
111
|
+
return this.fallback(run, "error", require_utils.formatErrorForLog(error));
|
|
81
112
|
}
|
|
82
113
|
}
|
|
83
114
|
};
|
|
84
115
|
var CohereReranker = class extends BaseReranker {
|
|
116
|
+
provider = "cohere";
|
|
85
117
|
timeout;
|
|
86
118
|
httpAgent;
|
|
87
119
|
httpsAgent;
|
|
@@ -92,15 +124,13 @@ var CohereReranker = class extends BaseReranker {
|
|
|
92
124
|
this.httpAgent = httpAgent;
|
|
93
125
|
this.httpsAgent = httpsAgent;
|
|
94
126
|
}
|
|
95
|
-
async rerank(query, documents, topK = 5) {
|
|
96
|
-
this.
|
|
127
|
+
async rerank(query, documents, topK = 5, metrics) {
|
|
128
|
+
const run = this.beginRerank(documents, topK, metrics);
|
|
97
129
|
try {
|
|
98
|
-
if (this.apiKey == null || this.apiKey === "")
|
|
99
|
-
|
|
100
|
-
return this.getDefaultRanking(documents, topK);
|
|
101
|
-
}
|
|
130
|
+
if (this.apiKey == null || this.apiKey === "") return this.fallback(run, "no_api_key");
|
|
131
|
+
const model = "rerank-v3.5";
|
|
102
132
|
const requestData = {
|
|
103
|
-
model
|
|
133
|
+
model,
|
|
104
134
|
query,
|
|
105
135
|
top_n: topK,
|
|
106
136
|
documents
|
|
@@ -114,23 +144,20 @@ var CohereReranker = class extends BaseReranker {
|
|
|
114
144
|
httpAgent: this.httpAgent,
|
|
115
145
|
httpsAgent: this.httpsAgent
|
|
116
146
|
});
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
147
|
+
run.model = model;
|
|
148
|
+
run.units = response.data?.meta?.billed_units?.search_units;
|
|
149
|
+
const results = response.data?.results;
|
|
150
|
+
if (!Array.isArray(results) || results.length === 0) return this.fallback(run, "bad_response");
|
|
151
|
+
return this.complete(run, results.map((result) => {
|
|
120
152
|
const docIndex = result.index;
|
|
121
153
|
const score = result.relevance_score;
|
|
122
154
|
return {
|
|
123
155
|
text: documents[docIndex],
|
|
124
156
|
score
|
|
125
157
|
};
|
|
126
|
-
});
|
|
127
|
-
else {
|
|
128
|
-
this.logger.warn("Unexpected response format from Cohere API. Using default ranking.");
|
|
129
|
-
return this.getDefaultRanking(documents, topK);
|
|
130
|
-
}
|
|
158
|
+
}));
|
|
131
159
|
} catch (error) {
|
|
132
|
-
this.
|
|
133
|
-
return this.getDefaultRanking(documents, topK);
|
|
160
|
+
return this.fallback(run, "error", require_utils.formatErrorForLog(error));
|
|
134
161
|
}
|
|
135
162
|
}
|
|
136
163
|
};
|
|
@@ -143,14 +170,10 @@ const toRagApiCandidate = (text, index) => ({
|
|
|
143
170
|
text,
|
|
144
171
|
base_score: 0
|
|
145
172
|
});
|
|
146
|
-
const buildRagApiCandidates = (documents
|
|
147
|
-
|
|
148
|
-
logger.debug(`rag_api fast-v1 accepts at most ${RAG_API_MAX_CANDIDATES} candidates; truncating ${documents.length} to ${RAG_API_MAX_CANDIDATES}.`);
|
|
149
|
-
return documents.slice(0, RAG_API_MAX_CANDIDATES).map(toRagApiCandidate);
|
|
150
|
-
};
|
|
151
|
-
const clampRagApiTopN = (topN, logger) => {
|
|
173
|
+
const buildRagApiCandidates = (documents) => documents.length <= RAG_API_MAX_CANDIDATES ? documents.map(toRagApiCandidate) : documents.slice(0, RAG_API_MAX_CANDIDATES).map(toRagApiCandidate);
|
|
174
|
+
const clampRagApiTopN = (topN, run) => {
|
|
152
175
|
if (topN <= RAG_API_MAX_TOP_N) return topN;
|
|
153
|
-
|
|
176
|
+
run.topKLimit = RAG_API_MAX_TOP_N;
|
|
154
177
|
return RAG_API_MAX_TOP_N;
|
|
155
178
|
};
|
|
156
179
|
const sortRagApiResults = (results) => [...results].sort((a, b) => b.score - a.score || a.index - b.index);
|
|
@@ -179,6 +202,7 @@ const withRerankDeadline = (operation, timeout) => {
|
|
|
179
202
|
return Promise.race([pending, deadline]).finally(() => clearTimeout(timer));
|
|
180
203
|
};
|
|
181
204
|
var RagApiReranker = class extends BaseReranker {
|
|
205
|
+
provider = "rag-api";
|
|
182
206
|
baseUrl;
|
|
183
207
|
tokenSupplier;
|
|
184
208
|
profile;
|
|
@@ -194,21 +218,16 @@ var RagApiReranker = class extends BaseReranker {
|
|
|
194
218
|
this.httpAgent = httpAgent;
|
|
195
219
|
this.httpsAgent = httpsAgent;
|
|
196
220
|
}
|
|
197
|
-
async rerank(query, documents, topK = 5) {
|
|
221
|
+
async rerank(query, documents, topK = 5, metrics) {
|
|
198
222
|
if (documents.length === 0) return [];
|
|
199
|
-
|
|
223
|
+
const run = this.beginRerank(documents, topK, metrics);
|
|
200
224
|
const baseUrl = this.baseUrl;
|
|
201
|
-
if (baseUrl == null || baseUrl === "")
|
|
202
|
-
this.logger.warn("RAG_API_URL is not set. Using default ranking.");
|
|
203
|
-
return this.getDefaultRanking(documents, topK);
|
|
204
|
-
}
|
|
225
|
+
if (baseUrl == null || baseUrl === "") return this.fallback(run, "no_base_url");
|
|
205
226
|
const tokenSupplier = this.tokenSupplier;
|
|
206
|
-
if (tokenSupplier == null)
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
const candidates = buildRagApiCandidates(documents, this.logger);
|
|
211
|
-
const topN = clampRagApiTopN(Math.max(0, topK), this.logger);
|
|
227
|
+
if (tokenSupplier == null) return this.fallback(run, "no_token_supplier");
|
|
228
|
+
const candidates = buildRagApiCandidates(documents);
|
|
229
|
+
const topN = clampRagApiTopN(Math.max(0, topK), run);
|
|
230
|
+
run.dropped = documents.length - candidates.length;
|
|
212
231
|
const requestData = {
|
|
213
232
|
profile: this.profile,
|
|
214
233
|
query,
|
|
@@ -229,33 +248,26 @@ var RagApiReranker = class extends BaseReranker {
|
|
|
229
248
|
signal
|
|
230
249
|
})).data;
|
|
231
250
|
}, this.timeout);
|
|
232
|
-
|
|
251
|
+
run.model = data?.model;
|
|
233
252
|
const rawResults = data?.results;
|
|
234
|
-
if (!Array.isArray(rawResults) || rawResults.length === 0)
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
}
|
|
238
|
-
if (!isValidRagApiBatch(rawResults, candidates.length)) {
|
|
239
|
-
this.logger.warn("rag_api rerank response contained no valid results. Using default ranking.");
|
|
240
|
-
return this.getDefaultRanking(documents, topK);
|
|
241
|
-
}
|
|
242
|
-
return sortRagApiResults(rawResults).slice(0, topN).map((result) => ({
|
|
253
|
+
if (!Array.isArray(rawResults) || rawResults.length === 0) return this.fallback(run, "bad_response");
|
|
254
|
+
if (!isValidRagApiBatch(rawResults, candidates.length)) return this.fallback(run, "invalid_results");
|
|
255
|
+
return this.complete(run, sortRagApiResults(rawResults).slice(0, topN).map((result) => ({
|
|
243
256
|
text: documents[result.index],
|
|
244
257
|
score: result.score
|
|
245
|
-
}));
|
|
258
|
+
})));
|
|
246
259
|
} catch (error) {
|
|
247
|
-
this.
|
|
248
|
-
return this.getDefaultRanking(documents, topK);
|
|
260
|
+
return this.fallback(run, "error", require_utils.formatErrorForLog(error));
|
|
249
261
|
}
|
|
250
262
|
}
|
|
251
263
|
};
|
|
252
264
|
var InfinityReranker = class extends BaseReranker {
|
|
265
|
+
provider = "infinity";
|
|
253
266
|
constructor(logger) {
|
|
254
267
|
super(logger);
|
|
255
268
|
}
|
|
256
|
-
async rerank(query, documents, topK = 5) {
|
|
257
|
-
this.
|
|
258
|
-
return this.getDefaultRanking(documents, topK);
|
|
269
|
+
async rerank(query, documents, topK = 5, metrics) {
|
|
270
|
+
return this.fallback(this.beginRerank(documents, topK, metrics), "placeholder");
|
|
259
271
|
}
|
|
260
272
|
};
|
|
261
273
|
const createReranker = (config) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rerankers.cjs","names":["createDefaultLogger","formatErrorForLog"],"sources":["../../../../src/tools/search/rerankers.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"rerankers.cjs","names":["createDefaultLogger","createSearchMetrics","formatErrorForLog"],"sources":["../../../../src/tools/search/rerankers.ts"],"mappings":"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"}
|