@staticn0va/wigolo 0.6.6 → 1.0.1
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/cache/store.d.ts +9 -1
- package/dist/cache/store.d.ts.map +1 -1
- package/dist/cache/store.js +30 -4
- package/dist/cache/store.js.map +1 -1
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +56 -2
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/status.js +1 -1
- package/dist/cli/status.js.map +1 -1
- package/dist/cli/tui/hooks/useInstall.js +1 -1
- package/dist/cli/tui/hooks/useInstall.js.map +1 -1
- package/dist/cli/tui/hooks/useVerify.js +1 -1
- package/dist/cli/tui/hooks/useVerify.js.map +1 -1
- package/dist/cli/tui/status-format.d.ts +1 -1
- package/dist/cli/tui/status-format.d.ts.map +1 -1
- package/dist/cli/tui/status-format.js +1 -1
- package/dist/cli/tui/status-format.js.map +1 -1
- package/dist/cli/tui/status-python.d.ts +1 -1
- package/dist/cli/tui/status-python.d.ts.map +1 -1
- package/dist/cli/tui/status-python.js +17 -1
- package/dist/cli/tui/status-python.js.map +1 -1
- package/dist/cli/tui/verify-suggestions.d.ts +1 -1
- package/dist/cli/tui/verify-suggestions.d.ts.map +1 -1
- package/dist/cli/tui/verify-suggestions.js +3 -3
- package/dist/cli/tui/verify-suggestions.js.map +1 -1
- package/dist/cli/tui/verify.d.ts +2 -2
- package/dist/cli/tui/verify.d.ts.map +1 -1
- package/dist/cli/tui/verify.js +32 -6
- package/dist/cli/tui/verify.js.map +1 -1
- package/dist/cli/warmup.d.ts.map +1 -1
- package/dist/cli/warmup.js +16 -12
- package/dist/cli/warmup.js.map +1 -1
- package/dist/config.d.ts +6 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +15 -2
- package/dist/config.js.map +1 -1
- package/dist/crawl/dedup.d.ts +1 -0
- package/dist/crawl/dedup.d.ts.map +1 -1
- package/dist/crawl/dedup.js +47 -1
- package/dist/crawl/dedup.js.map +1 -1
- package/dist/extraction/boilerplate.d.ts +15 -0
- package/dist/extraction/boilerplate.d.ts.map +1 -0
- package/dist/extraction/boilerplate.js +49 -0
- package/dist/extraction/boilerplate.js.map +1 -0
- package/dist/extraction/defuddle.d.ts.map +1 -1
- package/dist/extraction/defuddle.js +7 -3
- package/dist/extraction/defuddle.js.map +1 -1
- package/dist/extraction/jsonld.js +1 -1
- package/dist/extraction/jsonld.js.map +1 -1
- package/dist/extraction/lang-hints.d.ts +2 -0
- package/dist/extraction/lang-hints.d.ts.map +1 -0
- package/dist/extraction/lang-hints.js +28 -0
- package/dist/extraction/lang-hints.js.map +1 -0
- package/dist/extraction/llm/anthropic.d.ts +3 -0
- package/dist/extraction/llm/anthropic.d.ts.map +1 -0
- package/dist/extraction/llm/anthropic.js +33 -0
- package/dist/extraction/llm/anthropic.js.map +1 -0
- package/dist/extraction/llm/cache.d.ts +5 -0
- package/dist/extraction/llm/cache.d.ts.map +1 -0
- package/dist/extraction/llm/cache.js +35 -0
- package/dist/extraction/llm/cache.js.map +1 -0
- package/dist/extraction/llm/gemini.d.ts +3 -0
- package/dist/extraction/llm/gemini.d.ts.map +1 -0
- package/dist/extraction/llm/gemini.js +35 -0
- package/dist/extraction/llm/gemini.js.map +1 -0
- package/dist/extraction/llm/groq.d.ts +3 -0
- package/dist/extraction/llm/groq.d.ts.map +1 -0
- package/dist/extraction/llm/groq.js +63 -0
- package/dist/extraction/llm/groq.js.map +1 -0
- package/dist/extraction/llm/hash.d.ts +3 -0
- package/dist/extraction/llm/hash.d.ts.map +1 -0
- package/dist/extraction/llm/hash.js +22 -0
- package/dist/extraction/llm/hash.js.map +1 -0
- package/dist/extraction/llm/openai.d.ts +3 -0
- package/dist/extraction/llm/openai.d.ts.map +1 -0
- package/dist/extraction/llm/openai.js +38 -0
- package/dist/extraction/llm/openai.js.map +1 -0
- package/dist/extraction/llm/select.d.ts +5 -0
- package/dist/extraction/llm/select.d.ts.map +1 -0
- package/dist/extraction/llm/select.js +27 -0
- package/dist/extraction/llm/select.js.map +1 -0
- package/dist/extraction/llm/types.d.ts +24 -0
- package/dist/extraction/llm/types.d.ts.map +1 -0
- package/dist/extraction/llm/types.js +2 -0
- package/dist/extraction/llm/types.js.map +1 -0
- package/dist/extraction/llm/validate.d.ts +6 -0
- package/dist/extraction/llm/validate.d.ts.map +1 -0
- package/dist/extraction/llm/validate.js +63 -0
- package/dist/extraction/llm/validate.js.map +1 -0
- package/dist/extraction/llm-fallback.d.ts +17 -0
- package/dist/extraction/llm-fallback.d.ts.map +1 -0
- package/dist/extraction/llm-fallback.js +129 -0
- package/dist/extraction/llm-fallback.js.map +1 -0
- package/dist/extraction/markdown.d.ts +9 -0
- package/dist/extraction/markdown.d.ts.map +1 -1
- package/dist/extraction/markdown.js +52 -3
- package/dist/extraction/markdown.js.map +1 -1
- package/dist/extraction/pipeline.d.ts.map +1 -1
- package/dist/extraction/pipeline.js +17 -5
- package/dist/extraction/pipeline.js.map +1 -1
- package/dist/extraction/readability.d.ts.map +1 -1
- package/dist/extraction/readability.js +2 -3
- package/dist/extraction/readability.js.map +1 -1
- package/dist/extraction/schema.d.ts +12 -0
- package/dist/extraction/schema.d.ts.map +1 -1
- package/dist/extraction/schema.js +81 -11
- package/dist/extraction/schema.js.map +1 -1
- package/dist/extraction/site-extractors/docs-generic.d.ts.map +1 -1
- package/dist/extraction/site-extractors/docs-generic.js +2 -3
- package/dist/extraction/site-extractors/docs-generic.js.map +1 -1
- package/dist/extraction/site-extractors/github.d.ts.map +1 -1
- package/dist/extraction/site-extractors/github.js +4 -5
- package/dist/extraction/site-extractors/github.js.map +1 -1
- package/dist/extraction/site-extractors/mdn.d.ts.map +1 -1
- package/dist/extraction/site-extractors/mdn.js +2 -3
- package/dist/extraction/site-extractors/mdn.js.map +1 -1
- package/dist/extraction/site-extractors/stackoverflow.d.ts.map +1 -1
- package/dist/extraction/site-extractors/stackoverflow.js +3 -4
- package/dist/extraction/site-extractors/stackoverflow.js.map +1 -1
- package/dist/extraction/structured-data.d.ts +4 -0
- package/dist/extraction/structured-data.d.ts.map +1 -0
- package/dist/extraction/structured-data.js +203 -0
- package/dist/extraction/structured-data.js.map +1 -0
- package/dist/fetch/router.d.ts +2 -1
- package/dist/fetch/router.d.ts.map +1 -1
- package/dist/fetch/router.js +19 -1
- package/dist/fetch/router.js.map +1 -1
- package/dist/instructions.d.ts +7 -7
- package/dist/instructions.d.ts.map +1 -1
- package/dist/instructions.js +43 -36
- package/dist/instructions.js.map +1 -1
- package/dist/logger.d.ts +1 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/research/brief.js +1 -1
- package/dist/research/brief.js.map +1 -1
- package/dist/search/evidence.d.ts +25 -0
- package/dist/search/evidence.d.ts.map +1 -0
- package/dist/search/evidence.js +260 -0
- package/dist/search/evidence.js.map +1 -0
- package/dist/search/highlights.d.ts +11 -2
- package/dist/search/highlights.d.ts.map +1 -1
- package/dist/search/highlights.js +131 -48
- package/dist/search/highlights.js.map +1 -1
- package/dist/search/multi-query.d.ts +1 -0
- package/dist/search/multi-query.d.ts.map +1 -1
- package/dist/search/multi-query.js +13 -0
- package/dist/search/multi-query.js.map +1 -1
- package/dist/search/rerank.d.ts +3 -2
- package/dist/search/rerank.d.ts.map +1 -1
- package/dist/search/rerank.js +16 -44
- package/dist/search/rerank.js.map +1 -1
- package/dist/search/reranker/download.d.ts +9 -0
- package/dist/search/reranker/download.d.ts.map +1 -0
- package/dist/search/reranker/download.js +77 -0
- package/dist/search/reranker/download.js.map +1 -0
- package/dist/search/reranker/models.d.ts +14 -0
- package/dist/search/reranker/models.d.ts.map +1 -0
- package/dist/search/reranker/models.js +37 -0
- package/dist/search/reranker/models.js.map +1 -0
- package/dist/search/reranker/onnx.d.ts +13 -0
- package/dist/search/reranker/onnx.d.ts.map +1 -0
- package/dist/search/reranker/onnx.js +70 -0
- package/dist/search/reranker/onnx.js.map +1 -0
- package/dist/search/reranker/recency-boost.d.ts +3 -0
- package/dist/search/reranker/recency-boost.d.ts.map +1 -0
- package/dist/search/reranker/recency-boost.js +12 -0
- package/dist/search/reranker/recency-boost.js.map +1 -0
- package/dist/search/reranker/recency.d.ts +3 -0
- package/dist/search/reranker/recency.d.ts.map +1 -0
- package/dist/search/reranker/recency.js +26 -0
- package/dist/search/reranker/recency.js.map +1 -0
- package/dist/search/reranker/tokenizer.d.ts +30 -0
- package/dist/search/reranker/tokenizer.d.ts.map +1 -0
- package/dist/search/reranker/tokenizer.js +49 -0
- package/dist/search/reranker/tokenizer.js.map +1 -0
- package/dist/search/tokens.d.ts +3 -0
- package/dist/search/tokens.d.ts.map +1 -0
- package/dist/search/tokens.js +38 -0
- package/dist/search/tokens.js.map +1 -0
- package/dist/search/truncate.d.ts +4 -0
- package/dist/search/truncate.d.ts.map +1 -1
- package/dist/search/truncate.js +13 -0
- package/dist/search/truncate.js.map +1 -1
- package/dist/server/tool-schemas.d.ts +503 -0
- package/dist/server/tool-schemas.d.ts.map +1 -0
- package/dist/server/tool-schemas.js +425 -0
- package/dist/server/tool-schemas.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +1 -326
- package/dist/server.js.map +1 -1
- package/dist/tools/agent.d.ts.map +1 -1
- package/dist/tools/agent.js +36 -0
- package/dist/tools/agent.js.map +1 -1
- package/dist/tools/crawl.d.ts.map +1 -1
- package/dist/tools/crawl.js +37 -2
- package/dist/tools/crawl.js.map +1 -1
- package/dist/tools/extract.d.ts.map +1 -1
- package/dist/tools/extract.js +19 -3
- package/dist/tools/extract.js.map +1 -1
- package/dist/tools/fetch.d.ts.map +1 -1
- package/dist/tools/fetch.js +44 -7
- package/dist/tools/fetch.js.map +1 -1
- package/dist/tools/find-similar.d.ts.map +1 -1
- package/dist/tools/find-similar.js +32 -1
- package/dist/tools/find-similar.js.map +1 -1
- package/dist/tools/research.d.ts.map +1 -1
- package/dist/tools/research.js +34 -1
- package/dist/tools/research.js.map +1 -1
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +101 -55
- package/dist/tools/search.js.map +1 -1
- package/dist/types.d.ts +65 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/dist/util/mode.d.ts +4 -0
- package/dist/util/mode.d.ts.map +1 -0
- package/dist/util/mode.js +13 -0
- package/dist/util/mode.js.map +1 -0
- package/package.json +9 -1
- package/dist/search/flashrank.d.ts +0 -12
- package/dist/search/flashrank.d.ts.map +0 -1
- package/dist/search/flashrank.js +0 -64
- package/dist/search/flashrank.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/tools/extract.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC3F,OAAO,
|
|
1
|
+
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/tools/extract.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../src/tools/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAiB,MAAM,aAAa,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../src/tools/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAiB,MAAM,aAAa,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AA2EtD,wBAAsB,WAAW,CAC/B,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,WAAW,CAAC,CA+FtB"}
|
package/dist/tools/fetch.js
CHANGED
|
@@ -1,11 +1,33 @@
|
|
|
1
1
|
import { extractContent } from '../extraction/pipeline.js';
|
|
2
|
-
import { getCachedContent, cacheContent,
|
|
2
|
+
import { getCachedContent, cacheContent, isCacheUsable } from '../cache/store.js';
|
|
3
|
+
import { getConfig } from '../config.js';
|
|
3
4
|
import { extractSection } from '../extraction/markdown.js';
|
|
4
5
|
import { detectChange } from '../cache/change-detector.js';
|
|
5
6
|
import { getEmbeddingService } from '../embedding/embed.js';
|
|
6
|
-
import { truncateSmartly } from '../search/truncate.js';
|
|
7
|
+
import { truncateSmartly, applyOutputBudget } from '../search/truncate.js';
|
|
8
|
+
import { buildEvidenceFromMarkdown } from '../search/evidence.js';
|
|
9
|
+
import { resolveMode } from '../util/mode.js';
|
|
7
10
|
import { createLogger } from '../logger.js';
|
|
8
11
|
const log = createLogger('fetch');
|
|
12
|
+
const DEFAULT_MAX_TOKENS_OUT = 4000;
|
|
13
|
+
async function attachEvidence(output, input, markdown) {
|
|
14
|
+
if (!markdown)
|
|
15
|
+
return;
|
|
16
|
+
const includeFull = input.include_full_markdown ?? true;
|
|
17
|
+
const maxTokensOut = input.max_tokens_out ?? DEFAULT_MAX_TOKENS_OUT;
|
|
18
|
+
const evidence = await buildEvidenceFromMarkdown(output.title || output.url, output.title, output.url, markdown, { maxTokensOut, maxItems: 1 });
|
|
19
|
+
if (evidence.length > 0)
|
|
20
|
+
output.evidence = evidence;
|
|
21
|
+
if (!includeFull) {
|
|
22
|
+
output.markdown = '';
|
|
23
|
+
}
|
|
24
|
+
else if (output.markdown) {
|
|
25
|
+
output.markdown = applyOutputBudget(output.markdown, {
|
|
26
|
+
maxTokensOut: input.max_tokens_out,
|
|
27
|
+
maxChars: input.max_chars,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
9
31
|
function formatCachedResponse(cached, input) {
|
|
10
32
|
let markdown = cached.markdown;
|
|
11
33
|
let sectionMatched;
|
|
@@ -31,23 +53,35 @@ function formatCachedResponse(cached, input) {
|
|
|
31
53
|
links: JSON.parse(cached.links || '[]'),
|
|
32
54
|
images: JSON.parse(cached.images || '[]'),
|
|
33
55
|
cached: true,
|
|
56
|
+
cached_at: cached.fetchedAt,
|
|
34
57
|
};
|
|
35
58
|
}
|
|
36
59
|
export async function handleFetch(input, router) {
|
|
60
|
+
const mode = resolveMode(input.mode);
|
|
37
61
|
try {
|
|
38
62
|
if (!input.force_refresh) {
|
|
39
63
|
const cached = getCachedContent(input.url);
|
|
40
|
-
if (cached &&
|
|
41
|
-
|
|
42
|
-
|
|
64
|
+
if (cached && (!input.actions || input.actions.length === 0)) {
|
|
65
|
+
const staleMaxSeconds = mode === 'fast' ? getConfig().fastStaleMaxHours * 3600 : 0;
|
|
66
|
+
const { usable, stale } = isCacheUsable(cached, { staleMaxSeconds });
|
|
67
|
+
if (usable) {
|
|
68
|
+
log.info('Serving from cache', { url: input.url, stale });
|
|
69
|
+
const out = formatCachedResponse(cached, input);
|
|
70
|
+
if (stale)
|
|
71
|
+
out.stale = true;
|
|
72
|
+
const fullMarkdown = out.markdown;
|
|
73
|
+
await attachEvidence(out, input, fullMarkdown);
|
|
74
|
+
return out;
|
|
75
|
+
}
|
|
43
76
|
}
|
|
44
77
|
}
|
|
45
78
|
const raw = await router.fetch(input.url, {
|
|
46
|
-
renderJs: input.render_js ?? 'auto',
|
|
79
|
+
renderJs: mode === 'fast' ? 'never' : (input.render_js ?? 'auto'),
|
|
47
80
|
useAuth: input.use_auth ?? false,
|
|
48
81
|
headers: input.headers,
|
|
49
82
|
screenshot: input.screenshot,
|
|
50
83
|
actions: input.actions,
|
|
84
|
+
mode,
|
|
51
85
|
});
|
|
52
86
|
const extraction = await extractContent(raw.html, raw.finalUrl, {
|
|
53
87
|
maxChars: input.max_chars,
|
|
@@ -81,7 +115,7 @@ export async function handleFetch(input, router) {
|
|
|
81
115
|
const finalMarkdown = input.max_content_chars !== undefined
|
|
82
116
|
? truncateSmartly(extraction.markdown, input.max_content_chars)
|
|
83
117
|
: extraction.markdown;
|
|
84
|
-
|
|
118
|
+
const out = {
|
|
85
119
|
url: raw.finalUrl,
|
|
86
120
|
title: extraction.title,
|
|
87
121
|
markdown: finalMarkdown,
|
|
@@ -91,12 +125,15 @@ export async function handleFetch(input, router) {
|
|
|
91
125
|
screenshot: raw.screenshot,
|
|
92
126
|
cached: false,
|
|
93
127
|
action_results: raw.actionResults,
|
|
128
|
+
...(raw.jsRequired ? { js_required: true } : {}),
|
|
94
129
|
...(changeResult?.changed ? {
|
|
95
130
|
changed: true,
|
|
96
131
|
previous_hash: changeResult.previousHash,
|
|
97
132
|
diff_summary: changeResult.diffSummary,
|
|
98
133
|
} : {}),
|
|
99
134
|
};
|
|
135
|
+
await attachEvidence(out, input, finalMarkdown);
|
|
136
|
+
return out;
|
|
100
137
|
}
|
|
101
138
|
catch (err) {
|
|
102
139
|
log.error('Fetch failed', { url: input.url, error: String(err) });
|
package/dist/tools/fetch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/tools/fetch.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/tools/fetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find-similar.d.ts","sourceRoot":"","sources":["../../src/tools/find-similar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"find-similar.d.ts","sourceRoot":"","sources":["../../src/tools/find-similar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EAEb,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAcjE,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,YAAY,EAAE,EACvB,MAAM,EAAE,WAAW,EACnB,aAAa,CAAC,EAAE,aAAa,GAC5B,OAAO,CAAC,iBAAiB,CAAC,CA+C5B"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { findSimilar } from '../search/find-similar.js';
|
|
2
|
+
import { buildEvidenceFromMarkdown, applyTokenBudget, applyAggregateMarkdownBudget, } from '../search/evidence.js';
|
|
2
3
|
import { createLogger } from '../logger.js';
|
|
3
4
|
const log = createLogger('search');
|
|
4
5
|
const MAX_RESULTS_CAP = 50;
|
|
6
|
+
const DEFAULT_MAX_TOKENS_OUT = 4000;
|
|
5
7
|
export async function handleFindSimilar(input, engines, router, backendStatus) {
|
|
6
8
|
try {
|
|
7
9
|
const url = input.url?.trim();
|
|
@@ -30,7 +32,9 @@ export async function handleFindSimilar(input, engines, router, backendStatus) {
|
|
|
30
32
|
includeCache: sanitizedInput.include_cache,
|
|
31
33
|
includeWeb: sanitizedInput.include_web,
|
|
32
34
|
});
|
|
33
|
-
|
|
35
|
+
const out = await findSimilar(sanitizedInput, engines, router, backendStatus);
|
|
36
|
+
await attachEvidence(out, input);
|
|
37
|
+
return out;
|
|
34
38
|
}
|
|
35
39
|
catch (err) {
|
|
36
40
|
log.error('handleFindSimilar failed', { error: String(err) });
|
|
@@ -45,4 +49,31 @@ export async function handleFindSimilar(input, engines, router, backendStatus) {
|
|
|
45
49
|
};
|
|
46
50
|
}
|
|
47
51
|
}
|
|
52
|
+
async function attachEvidence(out, input) {
|
|
53
|
+
if (out.results.length === 0)
|
|
54
|
+
return;
|
|
55
|
+
const includeFull = input.include_full_markdown ?? false;
|
|
56
|
+
const maxTokensOut = input.max_tokens_out ?? DEFAULT_MAX_TOKENS_OUT;
|
|
57
|
+
const query = input.concept?.trim() || input.url?.trim() || out.results[0].title;
|
|
58
|
+
const collected = [];
|
|
59
|
+
for (const r of out.results) {
|
|
60
|
+
if (!r.markdown)
|
|
61
|
+
continue;
|
|
62
|
+
const evs = await buildEvidenceFromMarkdown(query, r.title, r.url, r.markdown, {
|
|
63
|
+
maxItems: 1,
|
|
64
|
+
});
|
|
65
|
+
collected.push(...evs);
|
|
66
|
+
}
|
|
67
|
+
const budgeted = applyTokenBudget(collected, maxTokensOut);
|
|
68
|
+
if (budgeted.length > 0)
|
|
69
|
+
out.evidence = budgeted;
|
|
70
|
+
if (!includeFull) {
|
|
71
|
+
for (const r of out.results) {
|
|
72
|
+
r.markdown = '';
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
applyAggregateMarkdownBudget(out.results, (r) => r.markdown ?? '', (r, body) => { r.markdown = body; }, { maxTokensOut });
|
|
77
|
+
}
|
|
78
|
+
}
|
|
48
79
|
//# sourceMappingURL=find-similar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find-similar.js","sourceRoot":"","sources":["../../src/tools/find-similar.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"find-similar.js","sourceRoot":"","sources":["../../src/tools/find-similar.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"research.d.ts","sourceRoot":"","sources":["../../src/tools/research.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"research.d.ts","sourceRoot":"","sources":["../../src/tools/research.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAEV,aAAa,EACb,cAAc,EACd,YAAY,EACb,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAQnE,wBAAsB,cAAc,CAClC,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,YAAY,EAAE,EACvB,MAAM,EAAE,WAAW,EACnB,cAAc,CAAC,EAAE,OAAO,EACxB,MAAM,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAAC,cAAc,CAAC,CA6CzB"}
|
package/dist/tools/research.js
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { createLogger } from '../logger.js';
|
|
2
2
|
import { runResearchPipeline } from '../research/pipeline.js';
|
|
3
|
+
import { buildEvidenceFromMarkdown, applyTokenBudget, applyAggregateMarkdownBudget, } from '../search/evidence.js';
|
|
4
|
+
import { applyOutputBudget } from '../search/truncate.js';
|
|
3
5
|
const log = createLogger('research');
|
|
4
6
|
const VALID_DEPTHS = new Set(['quick', 'standard', 'comprehensive']);
|
|
5
7
|
const MAX_SOURCES_LIMIT = 50;
|
|
8
|
+
const DEFAULT_MAX_TOKENS_OUT = 4000;
|
|
6
9
|
export async function handleResearch(input, engines, router, _backendStatus, server) {
|
|
7
10
|
const start = Date.now();
|
|
8
11
|
try {
|
|
@@ -25,7 +28,9 @@ export async function handleResearch(input, engines, router, _backendStatus, ser
|
|
|
25
28
|
depth: input.depth ?? 'standard',
|
|
26
29
|
max_sources: input.max_sources,
|
|
27
30
|
});
|
|
28
|
-
|
|
31
|
+
const out = await runResearchPipeline(input, engines, router, server);
|
|
32
|
+
await attachEvidence(out, input);
|
|
33
|
+
return out;
|
|
29
34
|
}
|
|
30
35
|
catch (err) {
|
|
31
36
|
log.error('research handler failed', {
|
|
@@ -35,6 +40,34 @@ export async function handleResearch(input, engines, router, _backendStatus, ser
|
|
|
35
40
|
return errorResult(err instanceof Error ? err.message : String(err), input, start);
|
|
36
41
|
}
|
|
37
42
|
}
|
|
43
|
+
async function attachEvidence(out, input) {
|
|
44
|
+
// Always honour max_tokens_out for the report text, regardless of sources.
|
|
45
|
+
if (input.max_tokens_out !== undefined && out.report) {
|
|
46
|
+
out.report = applyOutputBudget(out.report, { maxTokensOut: input.max_tokens_out });
|
|
47
|
+
}
|
|
48
|
+
if (out.sources.length === 0)
|
|
49
|
+
return;
|
|
50
|
+
const includeFull = input.include_full_markdown ?? false;
|
|
51
|
+
const maxTokensOut = input.max_tokens_out ?? DEFAULT_MAX_TOKENS_OUT;
|
|
52
|
+
const collected = [];
|
|
53
|
+
for (const s of out.sources) {
|
|
54
|
+
if (!s.markdown_content)
|
|
55
|
+
continue;
|
|
56
|
+
const evs = await buildEvidenceFromMarkdown(input.question, s.title, s.url, s.markdown_content, { maxItems: 1 });
|
|
57
|
+
collected.push(...evs);
|
|
58
|
+
}
|
|
59
|
+
const budgeted = applyTokenBudget(collected, maxTokensOut);
|
|
60
|
+
if (budgeted.length > 0)
|
|
61
|
+
out.evidence = budgeted;
|
|
62
|
+
if (!includeFull) {
|
|
63
|
+
for (const s of out.sources) {
|
|
64
|
+
s.markdown_content = '';
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
applyAggregateMarkdownBudget(out.sources, (s) => s.markdown_content ?? '', (s, body) => { s.markdown_content = body; }, { maxTokensOut });
|
|
69
|
+
}
|
|
70
|
+
}
|
|
38
71
|
function errorResult(error, input, start) {
|
|
39
72
|
return {
|
|
40
73
|
report: '',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"research.js","sourceRoot":"","sources":["../../src/tools/research.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"research.js","sourceRoot":"","sources":["../../src/tools/research.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAoB,YAAY,EAAmB,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAChI,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAOjE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAoB,YAAY,EAAmB,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAChI,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAOjE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAqBnE,wBAAsB,YAAY,CAChC,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,YAAY,EAAE,EACvB,MAAM,EAAE,WAAW,EACnB,aAAa,CAAC,EAAE,aAAa,EAC7B,cAAc,CAAC,EAAE,qBAAqB,EACtC,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,YAAY,CAAC,CAiYvB"}
|
package/dist/tools/search.js
CHANGED
|
@@ -6,23 +6,53 @@ import { applyAllFilters } from '../search/filters.js';
|
|
|
6
6
|
import { formatSearchContext } from '../search/context-formatter.js';
|
|
7
7
|
import { synthesizeAnswer, buildStructuredFallback } from '../search/answer-synthesis.js';
|
|
8
8
|
import { extractHighlights } from '../search/highlights.js';
|
|
9
|
-
import {
|
|
9
|
+
import { applyEvidenceDefault } from '../search/evidence.js';
|
|
10
|
+
import { normalizeQueries, fanOutSearch, synthesizeIntent, expandQueryHeuristic } from '../search/multi-query.js';
|
|
10
11
|
import { extractContent } from '../extraction/pipeline.js';
|
|
11
12
|
import { truncateSmartly } from '../search/truncate.js';
|
|
12
13
|
import { cacheSearchResults, getCachedSearchResults, cacheContent } from '../cache/store.js';
|
|
13
14
|
import { getEmbeddingService } from '../embedding/embed.js';
|
|
14
15
|
import { getConfig } from '../config.js';
|
|
16
|
+
import { resolveMode } from '../util/mode.js';
|
|
15
17
|
import { createLogger } from '../logger.js';
|
|
16
18
|
const log = createLogger('search');
|
|
17
19
|
const DEFAULT_MAX_RESULTS = 5;
|
|
18
20
|
const MAX_RESULTS_CAP = 20;
|
|
19
21
|
const DEFAULT_CONTENT_MAX_CHARS = 30000;
|
|
20
22
|
const DEFAULT_MAX_TOTAL_CHARS = 50000;
|
|
23
|
+
const TOP_K_DEEP = 5;
|
|
21
24
|
export async function handleSearch(input, engines, router, backendStatus, samplingServer, onProgress) {
|
|
25
|
+
const mode = resolveMode(input.mode);
|
|
22
26
|
const start = Date.now();
|
|
23
27
|
const config = getConfig();
|
|
28
|
+
const RETIRED_FORMATS = new Set(['full', 'context', 'highlights']);
|
|
29
|
+
const VALID_FORMATS = new Set(['answer', 'stream_answer']);
|
|
30
|
+
if (input.format != null) {
|
|
31
|
+
const fmt = String(input.format);
|
|
32
|
+
if (RETIRED_FORMATS.has(fmt)) {
|
|
33
|
+
return {
|
|
34
|
+
results: [],
|
|
35
|
+
query: typeof input.query === 'string' ? input.query : (input.query?.[0] ?? ''),
|
|
36
|
+
engines_used: [],
|
|
37
|
+
total_time_ms: Date.now() - start,
|
|
38
|
+
error: `format renamed; pass 'evidence' (default — omit) or 'answer'/'stream_answer' for synthesis`,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
if (!VALID_FORMATS.has(fmt)) {
|
|
42
|
+
return {
|
|
43
|
+
results: [],
|
|
44
|
+
query: typeof input.query === 'string' ? input.query : (input.query?.[0] ?? ''),
|
|
45
|
+
engines_used: [],
|
|
46
|
+
total_time_ms: Date.now() - start,
|
|
47
|
+
error: `unknown format='${fmt}'. Valid: omit (evidence), 'answer', 'stream_answer'`,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
24
51
|
const maxResults = Math.min(input.max_results ?? DEFAULT_MAX_RESULTS, MAX_RESULTS_CAP);
|
|
25
|
-
const includeContent = input.include_content ?? true;
|
|
52
|
+
const includeContent = mode === 'deep' ? true : (input.include_content ?? true);
|
|
53
|
+
const deepFetchCap = mode === 'deep'
|
|
54
|
+
? Math.min(input.max_results ?? 10, TOP_K_DEEP)
|
|
55
|
+
: undefined;
|
|
26
56
|
const contentMaxChars = input.content_max_chars ?? DEFAULT_CONTENT_MAX_CHARS;
|
|
27
57
|
const maxContentChars = input.max_content_chars;
|
|
28
58
|
const maxTotalChars = input.max_total_chars ?? DEFAULT_MAX_TOTAL_CHARS;
|
|
@@ -40,10 +70,16 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
|
|
|
40
70
|
log.debug('progress notification failed', { error: String(err) });
|
|
41
71
|
}
|
|
42
72
|
};
|
|
43
|
-
|
|
73
|
+
let normalizedQuery = input.query;
|
|
74
|
+
let deepAutoExpanded = false;
|
|
75
|
+
if (mode === 'deep' && typeof normalizedQuery === 'string') {
|
|
76
|
+
normalizedQuery = expandQueryHeuristic(normalizedQuery);
|
|
77
|
+
deepAutoExpanded = true;
|
|
78
|
+
}
|
|
79
|
+
const isMultiQuery = Array.isArray(normalizedQuery);
|
|
44
80
|
// --- Multi-query path ---
|
|
45
81
|
if (isMultiQuery) {
|
|
46
|
-
const normalizedQueries = normalizeQueries(
|
|
82
|
+
const normalizedQueries = normalizeQueries(normalizedQuery);
|
|
47
83
|
if (normalizedQueries.length === 0) {
|
|
48
84
|
const output = {
|
|
49
85
|
results: [],
|
|
@@ -58,13 +94,27 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
|
|
|
58
94
|
output.warning = warning;
|
|
59
95
|
return output;
|
|
60
96
|
}
|
|
61
|
-
const displayQuery =
|
|
97
|
+
const displayQuery = deepAutoExpanded && typeof input.query === 'string'
|
|
98
|
+
? input.query
|
|
99
|
+
: normalizedQueries[0];
|
|
62
100
|
const cacheKey = normalizedQueries.join(' | ');
|
|
63
|
-
const
|
|
101
|
+
const staleMaxSeconds = mode === 'fast' ? config.fastStaleMaxHours * 3600 : 0;
|
|
102
|
+
const cached = input.force_refresh
|
|
103
|
+
? null
|
|
104
|
+
: getCachedSearchResults(cacheKey, { staleMaxSeconds });
|
|
64
105
|
if (cached && !includeContent) {
|
|
65
|
-
log.info('serving multi-query search results from cache', {
|
|
106
|
+
log.info('serving multi-query search results from cache', {
|
|
107
|
+
queries: normalizedQueries,
|
|
108
|
+
stale: cached.stale ?? false,
|
|
109
|
+
});
|
|
110
|
+
const stamped = cached.results.slice(0, maxResults).map(r => ({
|
|
111
|
+
...r,
|
|
112
|
+
cached: true,
|
|
113
|
+
cached_at: cached.searched_at,
|
|
114
|
+
...(cached.stale ? { stale: true } : {}),
|
|
115
|
+
}));
|
|
66
116
|
const output = {
|
|
67
|
-
results:
|
|
117
|
+
results: stamped,
|
|
68
118
|
query: displayQuery,
|
|
69
119
|
engines_used: cached.engines_used,
|
|
70
120
|
total_time_ms: Date.now() - start,
|
|
@@ -73,15 +123,12 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
|
|
|
73
123
|
const warning = backendStatus?.consumeWarning();
|
|
74
124
|
if (warning)
|
|
75
125
|
output.warning = warning;
|
|
76
|
-
if (input.format === 'context') {
|
|
77
|
-
output.context_text = formatSearchContext(output.results, maxTotalChars);
|
|
78
|
-
}
|
|
79
|
-
if (input.format === 'highlights' && output.results.length > 0) {
|
|
80
|
-
await applyHighlightsFormat(output, output.results, displayQuery, input.max_highlights);
|
|
81
|
-
}
|
|
82
126
|
if ((input.format === 'answer' || input.format === 'stream_answer') && output.results.length > 0) {
|
|
83
127
|
await applyAnswerSynthesis(input, output, output.results, maxTotalChars, samplingServer, streamProgress);
|
|
84
128
|
}
|
|
129
|
+
else if (output.results.length > 0 && mode !== 'fast') {
|
|
130
|
+
await applyEvidenceDefault(input, output, output.results, displayQuery);
|
|
131
|
+
}
|
|
85
132
|
return output;
|
|
86
133
|
}
|
|
87
134
|
let activeEngines = engines;
|
|
@@ -93,7 +140,7 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
|
|
|
93
140
|
}
|
|
94
141
|
}
|
|
95
142
|
await emit(1, 5, `Running ${normalizedQueries.length} search queries across engines...`);
|
|
96
|
-
const { results: rawResults, enginesUsed, errors } = await fanOutSearch(normalizedQueries, activeEngines, {
|
|
143
|
+
const { results: rawResults, enginesUsed, errors } = await fanOutSearch(normalizedQueries, mode === 'fast' ? activeEngines.slice(0, 1) : activeEngines, {
|
|
97
144
|
maxResults,
|
|
98
145
|
timeRange: input.time_range,
|
|
99
146
|
language: input.language,
|
|
@@ -115,9 +162,6 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
|
|
|
115
162
|
const warning = backendStatus?.consumeWarning();
|
|
116
163
|
if (warning)
|
|
117
164
|
output.warning = warning;
|
|
118
|
-
if (input.format === 'context') {
|
|
119
|
-
output.context_text = '';
|
|
120
|
-
}
|
|
121
165
|
return output;
|
|
122
166
|
}
|
|
123
167
|
await emit(2, 5, `Deduplicating and reranking ${rawResults.length} results...`);
|
|
@@ -130,8 +174,9 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
|
|
|
130
174
|
category: input.category,
|
|
131
175
|
});
|
|
132
176
|
const intentString = synthesizeIntent(normalizedQueries);
|
|
133
|
-
merged = await rerankResults(intentString, merged);
|
|
134
|
-
|
|
177
|
+
merged = await rerankResults(intentString, merged, { skip: mode === 'fast' });
|
|
178
|
+
if (mode !== 'fast')
|
|
179
|
+
merged = await validateLinks(merged);
|
|
135
180
|
merged = merged.slice(0, maxResults);
|
|
136
181
|
const results = merged.map(m => ({
|
|
137
182
|
title: m.title,
|
|
@@ -152,6 +197,7 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
|
|
|
152
197
|
fetchTimeoutMs,
|
|
153
198
|
totalDeadline: start + totalTimeoutMs,
|
|
154
199
|
forceRefresh: input.force_refresh ?? false,
|
|
200
|
+
maxFetches: deepFetchCap,
|
|
155
201
|
});
|
|
156
202
|
fetchElapsed = Date.now() - fetchStart;
|
|
157
203
|
}
|
|
@@ -173,24 +219,33 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
|
|
|
173
219
|
const warning = backendStatus?.consumeWarning();
|
|
174
220
|
if (warning)
|
|
175
221
|
output.warning = warning;
|
|
176
|
-
if (input.format === 'context') {
|
|
177
|
-
output.context_text = formatSearchContext(output.results, maxTotalChars);
|
|
178
|
-
}
|
|
179
222
|
if ((input.format === 'answer' || input.format === 'stream_answer') && results.length > 0) {
|
|
180
223
|
await applyAnswerSynthesis(input, output, results, maxTotalChars, samplingServer, streamProgress);
|
|
181
224
|
}
|
|
182
|
-
if (
|
|
183
|
-
await
|
|
225
|
+
else if (results.length > 0 && mode !== 'fast') {
|
|
226
|
+
await applyEvidenceDefault(input, output, results, displayQuery);
|
|
184
227
|
}
|
|
185
228
|
return output;
|
|
186
229
|
}
|
|
187
230
|
// --- Single-query path (unchanged from v2) ---
|
|
188
231
|
const queryStr = input.query;
|
|
189
|
-
const
|
|
232
|
+
const staleMaxSeconds = mode === 'fast' ? config.fastStaleMaxHours * 3600 : 0;
|
|
233
|
+
const cached = input.force_refresh
|
|
234
|
+
? null
|
|
235
|
+
: getCachedSearchResults(queryStr, { staleMaxSeconds });
|
|
190
236
|
if (cached && !includeContent) {
|
|
191
|
-
log.info('serving search results from cache', {
|
|
237
|
+
log.info('serving search results from cache', {
|
|
238
|
+
query: queryStr,
|
|
239
|
+
stale: cached.stale ?? false,
|
|
240
|
+
});
|
|
241
|
+
const stamped = cached.results.slice(0, maxResults).map(r => ({
|
|
242
|
+
...r,
|
|
243
|
+
cached: true,
|
|
244
|
+
cached_at: cached.searched_at,
|
|
245
|
+
...(cached.stale ? { stale: true } : {}),
|
|
246
|
+
}));
|
|
192
247
|
const output = {
|
|
193
|
-
results:
|
|
248
|
+
results: stamped,
|
|
194
249
|
query: queryStr,
|
|
195
250
|
engines_used: cached.engines_used,
|
|
196
251
|
total_time_ms: Date.now() - start,
|
|
@@ -198,15 +253,12 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
|
|
|
198
253
|
const warning = backendStatus?.consumeWarning();
|
|
199
254
|
if (warning)
|
|
200
255
|
output.warning = warning;
|
|
201
|
-
if (input.format === 'context') {
|
|
202
|
-
output.context_text = formatSearchContext(output.results, maxTotalChars);
|
|
203
|
-
}
|
|
204
|
-
if (input.format === 'highlights' && output.results.length > 0) {
|
|
205
|
-
await applyHighlightsFormat(output, output.results, queryStr, input.max_highlights);
|
|
206
|
-
}
|
|
207
256
|
if ((input.format === 'answer' || input.format === 'stream_answer') && output.results.length > 0) {
|
|
208
257
|
await applyAnswerSynthesis(input, output, output.results, maxTotalChars, samplingServer, streamProgress);
|
|
209
258
|
}
|
|
259
|
+
else if (output.results.length > 0 && mode !== 'fast') {
|
|
260
|
+
await applyEvidenceDefault(input, output, output.results, queryStr);
|
|
261
|
+
}
|
|
210
262
|
return output;
|
|
211
263
|
}
|
|
212
264
|
let activeEngines = engines;
|
|
@@ -219,13 +271,14 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
|
|
|
219
271
|
}
|
|
220
272
|
const subQueries = decomposeQuery(queryStr);
|
|
221
273
|
log.debug('query decomposition', { original: queryStr, parts: subQueries.length });
|
|
222
|
-
|
|
274
|
+
const effectiveEngines = mode === 'fast' ? activeEngines.slice(0, 1) : activeEngines;
|
|
275
|
+
await emit(1, 5, `Running ${subQueries.length} search queries across ${effectiveEngines.length} engines...`);
|
|
223
276
|
const allRaw = [];
|
|
224
277
|
const enginesUsed = new Set();
|
|
225
278
|
const errors = [];
|
|
226
279
|
const hasFilterAttrition = !!(input.include_domains?.length || input.exclude_domains?.length);
|
|
227
280
|
const overfetchFactor = hasFilterAttrition ? 3 : 2;
|
|
228
|
-
const searchPromises =
|
|
281
|
+
const searchPromises = effectiveEngines.flatMap(engine => subQueries.map(async (query) => {
|
|
229
282
|
try {
|
|
230
283
|
const results = await engine.search(query, {
|
|
231
284
|
maxResults: maxResults * overfetchFactor,
|
|
@@ -260,9 +313,6 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
|
|
|
260
313
|
const warning = backendStatus?.consumeWarning();
|
|
261
314
|
if (warning)
|
|
262
315
|
output.warning = warning;
|
|
263
|
-
if (input.format === 'context') {
|
|
264
|
-
output.context_text = '';
|
|
265
|
-
}
|
|
266
316
|
return output;
|
|
267
317
|
}
|
|
268
318
|
await emit(2, 5, `Deduplicating and reranking ${allRaw.length} results...`);
|
|
@@ -274,8 +324,9 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
|
|
|
274
324
|
toDate: input.to_date,
|
|
275
325
|
category: input.category,
|
|
276
326
|
});
|
|
277
|
-
merged = await rerankResults(queryStr, merged);
|
|
278
|
-
|
|
327
|
+
merged = await rerankResults(queryStr, merged, { skip: mode === 'fast' });
|
|
328
|
+
if (mode !== 'fast')
|
|
329
|
+
merged = await validateLinks(merged);
|
|
279
330
|
merged = merged.slice(0, maxResults);
|
|
280
331
|
const results = merged.map(m => ({
|
|
281
332
|
title: m.title,
|
|
@@ -316,15 +367,12 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
|
|
|
316
367
|
const warning = backendStatus?.consumeWarning();
|
|
317
368
|
if (warning)
|
|
318
369
|
output.warning = warning;
|
|
319
|
-
if (input.format === 'context') {
|
|
320
|
-
output.context_text = formatSearchContext(output.results, maxTotalChars);
|
|
321
|
-
}
|
|
322
|
-
if (input.format === 'highlights' && results.length > 0) {
|
|
323
|
-
await applyHighlightsFormat(output, results, queryStr, input.max_highlights);
|
|
324
|
-
}
|
|
325
370
|
if ((input.format === 'answer' || input.format === 'stream_answer') && results.length > 0) {
|
|
326
371
|
await applyAnswerSynthesis(input, output, results, maxTotalChars, samplingServer, streamProgress);
|
|
327
372
|
}
|
|
373
|
+
else if (results.length > 0 && mode !== 'fast') {
|
|
374
|
+
await applyEvidenceDefault(input, output, results, queryStr);
|
|
375
|
+
}
|
|
328
376
|
return output;
|
|
329
377
|
}
|
|
330
378
|
async function applyAnswerSynthesis(input, output, results, maxTotalChars, samplingServer, onProgress) {
|
|
@@ -399,14 +447,12 @@ async function applyHighlightsFallback(output, results, query, maxTotalChars, ma
|
|
|
399
447
|
output.warning = fallback.warning;
|
|
400
448
|
}
|
|
401
449
|
}
|
|
402
|
-
async function applyHighlightsFormat(output, results, query, maxHighlights) {
|
|
403
|
-
const { highlights, citations } = await extractHighlights(query, results, maxHighlights ?? 10);
|
|
404
|
-
output.highlights = highlights;
|
|
405
|
-
output.citations = citations;
|
|
406
|
-
}
|
|
407
450
|
// Parallel fetch all URLs; then apply total-char budget in relevance (input) order.
|
|
408
451
|
async function fetchContentForResults(results, router, ctx) {
|
|
409
|
-
const
|
|
452
|
+
const fetchTargets = ctx.maxFetches !== undefined
|
|
453
|
+
? results.slice(0, ctx.maxFetches)
|
|
454
|
+
: results;
|
|
455
|
+
const fetches = fetchTargets.map(async (result) => {
|
|
410
456
|
if (Date.now() >= ctx.totalDeadline) {
|
|
411
457
|
return { error: 'total_timeout' };
|
|
412
458
|
}
|
|
@@ -450,8 +496,8 @@ async function fetchContentForResults(results, router, ctx) {
|
|
|
450
496
|
});
|
|
451
497
|
const fetched = await Promise.all(fetches);
|
|
452
498
|
let totalCharsUsed = 0;
|
|
453
|
-
for (let i = 0; i <
|
|
454
|
-
const result =
|
|
499
|
+
for (let i = 0; i < fetchTargets.length; i++) {
|
|
500
|
+
const result = fetchTargets[i];
|
|
455
501
|
const { content, error } = fetched[i];
|
|
456
502
|
if (error) {
|
|
457
503
|
result.fetch_failed = error;
|