@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
|
+
export { createSearchMetrics };
|
|
233
|
+
|
|
234
|
+
//# sourceMappingURL=metrics.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.mjs","names":[],"sources":["../../../../src/tools/search/metrics.ts"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createDefaultLogger, formatErrorForLog } from "./utils.mjs";
|
|
2
|
+
import { createSearchMetrics } from "./metrics.mjs";
|
|
2
3
|
import axios from "axios";
|
|
3
4
|
//#region src/tools/search/rerankers.ts
|
|
4
5
|
const DEFAULT_JINA_API_URL = "https://api.jina.ai/v1/rerank";
|
|
@@ -7,6 +8,7 @@ const getDefaultJinaApiUrl = () => process.env.JINA_API_URL != null && process.e
|
|
|
7
8
|
var BaseReranker = class {
|
|
8
9
|
apiKey;
|
|
9
10
|
logger;
|
|
11
|
+
ownMetrics;
|
|
10
12
|
constructor(logger) {
|
|
11
13
|
this.logger = logger || createDefaultLogger();
|
|
12
14
|
}
|
|
@@ -16,8 +18,43 @@ var BaseReranker = class {
|
|
|
16
18
|
score: 0
|
|
17
19
|
}));
|
|
18
20
|
}
|
|
21
|
+
localMetrics() {
|
|
22
|
+
this.ownMetrics ??= createSearchMetrics(this.logger, true);
|
|
23
|
+
return this.ownMetrics;
|
|
24
|
+
}
|
|
25
|
+
beginRerank(documents, topK, metrics) {
|
|
26
|
+
return {
|
|
27
|
+
metrics: metrics ?? this.localMetrics(),
|
|
28
|
+
documents,
|
|
29
|
+
topK,
|
|
30
|
+
startedAt: Date.now()
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
record(run, highlights, reason, error) {
|
|
34
|
+
run.metrics.recordRerank({
|
|
35
|
+
provider: this.provider,
|
|
36
|
+
chunks: run.documents.length,
|
|
37
|
+
results: highlights.length,
|
|
38
|
+
durationMs: Date.now() - run.startedAt,
|
|
39
|
+
model: run.model,
|
|
40
|
+
units: run.units,
|
|
41
|
+
dropped: run.dropped,
|
|
42
|
+
topK: run.topKLimit != null ? run.topK : void 0,
|
|
43
|
+
topKLimit: run.topKLimit,
|
|
44
|
+
reason,
|
|
45
|
+
error
|
|
46
|
+
});
|
|
47
|
+
return highlights;
|
|
48
|
+
}
|
|
49
|
+
complete(run, highlights) {
|
|
50
|
+
return this.record(run, highlights);
|
|
51
|
+
}
|
|
52
|
+
fallback(run, reason, error) {
|
|
53
|
+
return this.record(run, this.getDefaultRanking(run.documents, run.topK), reason, error);
|
|
54
|
+
}
|
|
19
55
|
};
|
|
20
56
|
var JinaReranker = class extends BaseReranker {
|
|
57
|
+
provider = "jina";
|
|
21
58
|
apiUrl;
|
|
22
59
|
timeout;
|
|
23
60
|
httpAgent;
|
|
@@ -30,13 +67,10 @@ var JinaReranker = class extends BaseReranker {
|
|
|
30
67
|
this.httpAgent = httpAgent;
|
|
31
68
|
this.httpsAgent = httpsAgent;
|
|
32
69
|
}
|
|
33
|
-
async rerank(query, documents, topK = 5) {
|
|
34
|
-
this.
|
|
70
|
+
async rerank(query, documents, topK = 5, metrics) {
|
|
71
|
+
const run = this.beginRerank(documents, topK, metrics);
|
|
35
72
|
try {
|
|
36
|
-
if (this.apiKey == null || this.apiKey === "")
|
|
37
|
-
this.logger.warn("JINA_API_KEY is not set. Using default ranking.");
|
|
38
|
-
return this.getDefaultRanking(documents, topK);
|
|
39
|
-
}
|
|
73
|
+
if (this.apiKey == null || this.apiKey === "") return this.fallback(run, "no_api_key");
|
|
40
74
|
const requestData = {
|
|
41
75
|
model: "jina-reranker-v2-base-multilingual",
|
|
42
76
|
query,
|
|
@@ -53,9 +87,11 @@ var JinaReranker = class extends BaseReranker {
|
|
|
53
87
|
httpAgent: this.httpAgent,
|
|
54
88
|
httpsAgent: this.httpsAgent
|
|
55
89
|
});
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
90
|
+
run.model = response.data?.model;
|
|
91
|
+
run.units = response.data?.usage?.total_tokens;
|
|
92
|
+
const results = response.data?.results;
|
|
93
|
+
if (!Array.isArray(results) || results.length === 0) return this.fallback(run, "bad_response");
|
|
94
|
+
return this.complete(run, results.map((result) => {
|
|
59
95
|
const docIndex = result.index;
|
|
60
96
|
const score = result.relevance_score;
|
|
61
97
|
let text = "";
|
|
@@ -68,18 +104,14 @@ var JinaReranker = class extends BaseReranker {
|
|
|
68
104
|
text,
|
|
69
105
|
score
|
|
70
106
|
};
|
|
71
|
-
});
|
|
72
|
-
else {
|
|
73
|
-
this.logger.warn("Unexpected response format from Jina API. Using default ranking.");
|
|
74
|
-
return this.getDefaultRanking(documents, topK);
|
|
75
|
-
}
|
|
107
|
+
}));
|
|
76
108
|
} catch (error) {
|
|
77
|
-
this.
|
|
78
|
-
return this.getDefaultRanking(documents, topK);
|
|
109
|
+
return this.fallback(run, "error", formatErrorForLog(error));
|
|
79
110
|
}
|
|
80
111
|
}
|
|
81
112
|
};
|
|
82
113
|
var CohereReranker = class extends BaseReranker {
|
|
114
|
+
provider = "cohere";
|
|
83
115
|
timeout;
|
|
84
116
|
httpAgent;
|
|
85
117
|
httpsAgent;
|
|
@@ -90,15 +122,13 @@ var CohereReranker = class extends BaseReranker {
|
|
|
90
122
|
this.httpAgent = httpAgent;
|
|
91
123
|
this.httpsAgent = httpsAgent;
|
|
92
124
|
}
|
|
93
|
-
async rerank(query, documents, topK = 5) {
|
|
94
|
-
this.
|
|
125
|
+
async rerank(query, documents, topK = 5, metrics) {
|
|
126
|
+
const run = this.beginRerank(documents, topK, metrics);
|
|
95
127
|
try {
|
|
96
|
-
if (this.apiKey == null || this.apiKey === "")
|
|
97
|
-
|
|
98
|
-
return this.getDefaultRanking(documents, topK);
|
|
99
|
-
}
|
|
128
|
+
if (this.apiKey == null || this.apiKey === "") return this.fallback(run, "no_api_key");
|
|
129
|
+
const model = "rerank-v3.5";
|
|
100
130
|
const requestData = {
|
|
101
|
-
model
|
|
131
|
+
model,
|
|
102
132
|
query,
|
|
103
133
|
top_n: topK,
|
|
104
134
|
documents
|
|
@@ -112,23 +142,20 @@ var CohereReranker = class extends BaseReranker {
|
|
|
112
142
|
httpAgent: this.httpAgent,
|
|
113
143
|
httpsAgent: this.httpsAgent
|
|
114
144
|
});
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
145
|
+
run.model = model;
|
|
146
|
+
run.units = response.data?.meta?.billed_units?.search_units;
|
|
147
|
+
const results = response.data?.results;
|
|
148
|
+
if (!Array.isArray(results) || results.length === 0) return this.fallback(run, "bad_response");
|
|
149
|
+
return this.complete(run, results.map((result) => {
|
|
118
150
|
const docIndex = result.index;
|
|
119
151
|
const score = result.relevance_score;
|
|
120
152
|
return {
|
|
121
153
|
text: documents[docIndex],
|
|
122
154
|
score
|
|
123
155
|
};
|
|
124
|
-
});
|
|
125
|
-
else {
|
|
126
|
-
this.logger.warn("Unexpected response format from Cohere API. Using default ranking.");
|
|
127
|
-
return this.getDefaultRanking(documents, topK);
|
|
128
|
-
}
|
|
156
|
+
}));
|
|
129
157
|
} catch (error) {
|
|
130
|
-
this.
|
|
131
|
-
return this.getDefaultRanking(documents, topK);
|
|
158
|
+
return this.fallback(run, "error", formatErrorForLog(error));
|
|
132
159
|
}
|
|
133
160
|
}
|
|
134
161
|
};
|
|
@@ -141,14 +168,10 @@ const toRagApiCandidate = (text, index) => ({
|
|
|
141
168
|
text,
|
|
142
169
|
base_score: 0
|
|
143
170
|
});
|
|
144
|
-
const buildRagApiCandidates = (documents
|
|
145
|
-
|
|
146
|
-
logger.debug(`rag_api fast-v1 accepts at most ${RAG_API_MAX_CANDIDATES} candidates; truncating ${documents.length} to ${RAG_API_MAX_CANDIDATES}.`);
|
|
147
|
-
return documents.slice(0, RAG_API_MAX_CANDIDATES).map(toRagApiCandidate);
|
|
148
|
-
};
|
|
149
|
-
const clampRagApiTopN = (topN, logger) => {
|
|
171
|
+
const buildRagApiCandidates = (documents) => documents.length <= RAG_API_MAX_CANDIDATES ? documents.map(toRagApiCandidate) : documents.slice(0, RAG_API_MAX_CANDIDATES).map(toRagApiCandidate);
|
|
172
|
+
const clampRagApiTopN = (topN, run) => {
|
|
150
173
|
if (topN <= RAG_API_MAX_TOP_N) return topN;
|
|
151
|
-
|
|
174
|
+
run.topKLimit = RAG_API_MAX_TOP_N;
|
|
152
175
|
return RAG_API_MAX_TOP_N;
|
|
153
176
|
};
|
|
154
177
|
const sortRagApiResults = (results) => [...results].sort((a, b) => b.score - a.score || a.index - b.index);
|
|
@@ -177,6 +200,7 @@ const withRerankDeadline = (operation, timeout) => {
|
|
|
177
200
|
return Promise.race([pending, deadline]).finally(() => clearTimeout(timer));
|
|
178
201
|
};
|
|
179
202
|
var RagApiReranker = class extends BaseReranker {
|
|
203
|
+
provider = "rag-api";
|
|
180
204
|
baseUrl;
|
|
181
205
|
tokenSupplier;
|
|
182
206
|
profile;
|
|
@@ -192,21 +216,16 @@ var RagApiReranker = class extends BaseReranker {
|
|
|
192
216
|
this.httpAgent = httpAgent;
|
|
193
217
|
this.httpsAgent = httpsAgent;
|
|
194
218
|
}
|
|
195
|
-
async rerank(query, documents, topK = 5) {
|
|
219
|
+
async rerank(query, documents, topK = 5, metrics) {
|
|
196
220
|
if (documents.length === 0) return [];
|
|
197
|
-
|
|
221
|
+
const run = this.beginRerank(documents, topK, metrics);
|
|
198
222
|
const baseUrl = this.baseUrl;
|
|
199
|
-
if (baseUrl == null || baseUrl === "")
|
|
200
|
-
this.logger.warn("RAG_API_URL is not set. Using default ranking.");
|
|
201
|
-
return this.getDefaultRanking(documents, topK);
|
|
202
|
-
}
|
|
223
|
+
if (baseUrl == null || baseUrl === "") return this.fallback(run, "no_base_url");
|
|
203
224
|
const tokenSupplier = this.tokenSupplier;
|
|
204
|
-
if (tokenSupplier == null)
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
const candidates = buildRagApiCandidates(documents, this.logger);
|
|
209
|
-
const topN = clampRagApiTopN(Math.max(0, topK), this.logger);
|
|
225
|
+
if (tokenSupplier == null) return this.fallback(run, "no_token_supplier");
|
|
226
|
+
const candidates = buildRagApiCandidates(documents);
|
|
227
|
+
const topN = clampRagApiTopN(Math.max(0, topK), run);
|
|
228
|
+
run.dropped = documents.length - candidates.length;
|
|
210
229
|
const requestData = {
|
|
211
230
|
profile: this.profile,
|
|
212
231
|
query,
|
|
@@ -227,33 +246,26 @@ var RagApiReranker = class extends BaseReranker {
|
|
|
227
246
|
signal
|
|
228
247
|
})).data;
|
|
229
248
|
}, this.timeout);
|
|
230
|
-
|
|
249
|
+
run.model = data?.model;
|
|
231
250
|
const rawResults = data?.results;
|
|
232
|
-
if (!Array.isArray(rawResults) || rawResults.length === 0)
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
}
|
|
236
|
-
if (!isValidRagApiBatch(rawResults, candidates.length)) {
|
|
237
|
-
this.logger.warn("rag_api rerank response contained no valid results. Using default ranking.");
|
|
238
|
-
return this.getDefaultRanking(documents, topK);
|
|
239
|
-
}
|
|
240
|
-
return sortRagApiResults(rawResults).slice(0, topN).map((result) => ({
|
|
251
|
+
if (!Array.isArray(rawResults) || rawResults.length === 0) return this.fallback(run, "bad_response");
|
|
252
|
+
if (!isValidRagApiBatch(rawResults, candidates.length)) return this.fallback(run, "invalid_results");
|
|
253
|
+
return this.complete(run, sortRagApiResults(rawResults).slice(0, topN).map((result) => ({
|
|
241
254
|
text: documents[result.index],
|
|
242
255
|
score: result.score
|
|
243
|
-
}));
|
|
256
|
+
})));
|
|
244
257
|
} catch (error) {
|
|
245
|
-
this.
|
|
246
|
-
return this.getDefaultRanking(documents, topK);
|
|
258
|
+
return this.fallback(run, "error", formatErrorForLog(error));
|
|
247
259
|
}
|
|
248
260
|
}
|
|
249
261
|
};
|
|
250
262
|
var InfinityReranker = class extends BaseReranker {
|
|
263
|
+
provider = "infinity";
|
|
251
264
|
constructor(logger) {
|
|
252
265
|
super(logger);
|
|
253
266
|
}
|
|
254
|
-
async rerank(query, documents, topK = 5) {
|
|
255
|
-
this.
|
|
256
|
-
return this.getDefaultRanking(documents, topK);
|
|
267
|
+
async rerank(query, documents, topK = 5, metrics) {
|
|
268
|
+
return this.fallback(this.beginRerank(documents, topK, metrics), "placeholder");
|
|
257
269
|
}
|
|
258
270
|
};
|
|
259
271
|
const createReranker = (config) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rerankers.mjs","names":[],"sources":["../../../../src/tools/search/rerankers.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"rerankers.mjs","names":[],"sources":["../../../../src/tools/search/rerankers.ts"],"mappings":"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"}
|