@librechat/agents 2.4.319 → 2.4.321
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/format.cjs +111 -80
- package/dist/cjs/tools/search/format.cjs.map +1 -1
- package/dist/cjs/tools/search/search.cjs +83 -37
- package/dist/cjs/tools/search/search.cjs.map +1 -1
- package/dist/cjs/tools/search/tool.cjs +83 -57
- package/dist/cjs/tools/search/tool.cjs.map +1 -1
- package/dist/cjs/tools/search/utils.cjs +3 -1
- package/dist/cjs/tools/search/utils.cjs.map +1 -1
- package/dist/esm/tools/search/format.mjs +111 -80
- package/dist/esm/tools/search/format.mjs.map +1 -1
- package/dist/esm/tools/search/search.mjs +83 -37
- package/dist/esm/tools/search/search.mjs.map +1 -1
- package/dist/esm/tools/search/tool.mjs +82 -56
- package/dist/esm/tools/search/tool.mjs.map +1 -1
- package/dist/esm/tools/search/utils.mjs +3 -1
- package/dist/esm/tools/search/utils.mjs.map +1 -1
- package/dist/types/tools/search/search.d.ts +1 -1
- package/dist/types/tools/search/types.d.ts +22 -1
- package/package.json +1 -1
- package/src/scripts/search.ts +4 -1
- package/src/tools/search/format.ts +149 -86
- package/src/tools/search/search.ts +120 -47
- package/src/tools/search/tool.ts +137 -89
- package/src/tools/search/types.ts +30 -1
- package/src/tools/search/utils.ts +5 -1
|
@@ -1,9 +1,85 @@
|
|
|
1
1
|
import { getDomainName } from './utils.mjs';
|
|
2
2
|
|
|
3
|
+
function addHighlightSection() {
|
|
4
|
+
return ['\n## Highlights', ''];
|
|
5
|
+
}
|
|
6
|
+
// Helper function to format a source (organic or top story)
|
|
7
|
+
function formatSource(source, index, turn, sourceType, references) {
|
|
8
|
+
/** Array of all lines to include in the output */
|
|
9
|
+
const outputLines = [];
|
|
10
|
+
// Add the title
|
|
11
|
+
outputLines.push(`# ${sourceType.charAt(0).toUpperCase() + sourceType.slice(1)} ${index}: ${source.title != null && source.title ? `"${source.title}"` : '(no title)'}`);
|
|
12
|
+
outputLines.push(`\nAnchor: \\ue202turn${turn}${sourceType}${index}`);
|
|
13
|
+
outputLines.push(`URL: ${source.link}`);
|
|
14
|
+
// Add optional fields
|
|
15
|
+
if ('snippet' in source && source.snippet != null) {
|
|
16
|
+
outputLines.push(`Summary: ${source.snippet}`);
|
|
17
|
+
}
|
|
18
|
+
if (source.date != null) {
|
|
19
|
+
outputLines.push(`Date: ${source.date}`);
|
|
20
|
+
}
|
|
21
|
+
if (source.attribution != null) {
|
|
22
|
+
outputLines.push(`Source: ${source.attribution}`);
|
|
23
|
+
}
|
|
24
|
+
// Add highlight section or empty line
|
|
25
|
+
if ((source.highlights?.length ?? 0) > 0) {
|
|
26
|
+
outputLines.push(...addHighlightSection());
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
outputLines.push('');
|
|
30
|
+
}
|
|
31
|
+
// Process highlights if they exist
|
|
32
|
+
(source.highlights ?? [])
|
|
33
|
+
.filter((h) => h.text.trim().length > 0)
|
|
34
|
+
.forEach((h, hIndex) => {
|
|
35
|
+
outputLines.push(`### Highlight ${hIndex + 1} [Relevance: ${h.score.toFixed(2)}]`);
|
|
36
|
+
outputLines.push('');
|
|
37
|
+
outputLines.push('```text');
|
|
38
|
+
outputLines.push(h.text.trim());
|
|
39
|
+
outputLines.push('```');
|
|
40
|
+
outputLines.push('');
|
|
41
|
+
if (h.references != null && h.references.length) {
|
|
42
|
+
let hasHeader = false;
|
|
43
|
+
const refLines = [];
|
|
44
|
+
for (let j = 0; j < h.references.length; j++) {
|
|
45
|
+
const ref = h.references[j];
|
|
46
|
+
references.push({
|
|
47
|
+
type: ref.type,
|
|
48
|
+
link: ref.reference.originalUrl,
|
|
49
|
+
attribution: getDomainName(ref.reference.originalUrl),
|
|
50
|
+
title: (((ref.reference.title ?? '') || ref.reference.text) ??
|
|
51
|
+
'').split('\n')[0],
|
|
52
|
+
});
|
|
53
|
+
if (ref.type !== 'link') {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (!hasHeader) {
|
|
57
|
+
refLines.push('Core References:');
|
|
58
|
+
hasHeader = true;
|
|
59
|
+
}
|
|
60
|
+
refLines.push(`- ${ref.type}#${ref.originalIndex + 1}: ${ref.reference.originalUrl}`);
|
|
61
|
+
refLines.push(`\t- Anchor: \\ue202turn${turn}ref${references.length - 1}`);
|
|
62
|
+
}
|
|
63
|
+
if (hasHeader) {
|
|
64
|
+
outputLines.push(...refLines);
|
|
65
|
+
outputLines.push('');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (hIndex < (source.highlights?.length ?? 0) - 1) {
|
|
69
|
+
outputLines.push('---');
|
|
70
|
+
outputLines.push('');
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
outputLines.push('');
|
|
74
|
+
return outputLines.join('\n');
|
|
75
|
+
}
|
|
3
76
|
function formatResultsForLLM(turn, results) {
|
|
4
|
-
|
|
77
|
+
/** Array to collect all output lines */
|
|
78
|
+
const outputLines = [];
|
|
5
79
|
const addSection = (title) => {
|
|
6
|
-
|
|
80
|
+
outputLines.push('');
|
|
81
|
+
outputLines.push(`=== ${title} ===`);
|
|
82
|
+
outputLines.push('');
|
|
7
83
|
};
|
|
8
84
|
const references = [];
|
|
9
85
|
// Organic (web) results
|
|
@@ -11,82 +87,38 @@ function formatResultsForLLM(turn, results) {
|
|
|
11
87
|
addSection(`Web Results, Turn ${turn}`);
|
|
12
88
|
for (let i = 0; i < results.organic.length; i++) {
|
|
13
89
|
const r = results.organic[i];
|
|
14
|
-
|
|
15
|
-
`# Source ${i}: "${r.title ?? '(no title)'}"`,
|
|
16
|
-
`Anchor: \\ue202turn${turn}search${i}`,
|
|
17
|
-
`URL: ${r.link}`,
|
|
18
|
-
r.snippet != null ? `Summary: ${r.snippet}` : '',
|
|
19
|
-
r.date != null ? `Date: ${r.date}` : '',
|
|
20
|
-
r.attribution != null ? `Source: ${r.attribution}` : '',
|
|
21
|
-
'',
|
|
22
|
-
'\n## Highlights\n\n',
|
|
23
|
-
'',
|
|
24
|
-
'',
|
|
25
|
-
]
|
|
26
|
-
.filter(Boolean)
|
|
27
|
-
.join('\n');
|
|
28
|
-
(r.highlights ?? [])
|
|
29
|
-
.filter((h) => h.text.trim().length > 0)
|
|
30
|
-
.forEach((h, hIndex) => {
|
|
31
|
-
output += `### Highlight ${hIndex + 1} [Relevance: ${h.score.toFixed(2)}]\n\n`;
|
|
32
|
-
output += '```text\n' + h.text.trim() + '\n```\n\n';
|
|
33
|
-
if (h.references != null && h.references.length) {
|
|
34
|
-
output += 'Core References:\n';
|
|
35
|
-
output += h.references
|
|
36
|
-
.map((ref) => {
|
|
37
|
-
references.push({
|
|
38
|
-
link: ref.reference.originalUrl,
|
|
39
|
-
attribution: getDomainName(ref.reference.originalUrl),
|
|
40
|
-
title: (((ref.reference.title ?? '') || ref.reference.text) ??
|
|
41
|
-
'').split('\n')[0],
|
|
42
|
-
});
|
|
43
|
-
return `- ${ref.type}#${ref.originalIndex + 1}: ${ref.reference.originalUrl}\n\t- Anchor: \\ue202turn${turn}ref${references.length - 1}`;
|
|
44
|
-
})
|
|
45
|
-
.join('\n');
|
|
46
|
-
output += '\n\n';
|
|
47
|
-
}
|
|
48
|
-
if (hIndex < (r.highlights?.length ?? 0) - 1) {
|
|
49
|
-
output += '---\n\n';
|
|
50
|
-
}
|
|
51
|
-
});
|
|
90
|
+
outputLines.push(formatSource(r, i, turn, 'search', references));
|
|
52
91
|
delete results.organic[i].highlights;
|
|
53
|
-
output += '\n';
|
|
54
92
|
}
|
|
55
93
|
}
|
|
56
|
-
//
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
// r.attribution != null ? `Source: ${r.attribution}` : '',
|
|
69
|
-
// ''
|
|
70
|
-
// ].filter(Boolean).join('\n');
|
|
71
|
-
// });
|
|
72
|
-
// }
|
|
94
|
+
// Top stories (news)
|
|
95
|
+
const topStories = results.topStories ?? [];
|
|
96
|
+
if (topStories.length) {
|
|
97
|
+
addSection('News Results');
|
|
98
|
+
for (let i = 0; i < topStories.length; i++) {
|
|
99
|
+
const r = topStories[i];
|
|
100
|
+
outputLines.push(formatSource(r, i, turn, 'news', references));
|
|
101
|
+
if (results.topStories?.[i]?.highlights) {
|
|
102
|
+
delete results.topStories[i].highlights;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
73
106
|
// // Images
|
|
74
107
|
// const images = results.images ?? [];
|
|
75
108
|
// if (images.length) {
|
|
76
109
|
// addSection('Image Results');
|
|
77
|
-
// images.
|
|
78
|
-
//
|
|
79
|
-
//
|
|
80
|
-
//
|
|
81
|
-
//
|
|
82
|
-
//
|
|
83
|
-
//
|
|
84
|
-
// });
|
|
110
|
+
// const imageLines = images.map((img, i) => [
|
|
111
|
+
// `Anchor: \ue202turn0image${i}`,
|
|
112
|
+
// `Title: ${img.title ?? '(no title)'}`,
|
|
113
|
+
// `Image URL: ${img.imageUrl}`,
|
|
114
|
+
// ''
|
|
115
|
+
// ].join('\n'));
|
|
116
|
+
// outputLines.push(imageLines.join('\n'));
|
|
85
117
|
// }
|
|
86
118
|
// Knowledge Graph
|
|
87
119
|
if (results.knowledgeGraph != null) {
|
|
88
120
|
addSection('Knowledge Graph');
|
|
89
|
-
|
|
121
|
+
const kgLines = [
|
|
90
122
|
`**Title:** ${results.knowledgeGraph.title ?? '(no title)'}`,
|
|
91
123
|
results.knowledgeGraph.type != null
|
|
92
124
|
? `**Type:** ${results.knowledgeGraph.type}`
|
|
@@ -110,14 +142,13 @@ function formatResultsForLLM(turn, results) {
|
|
|
110
142
|
? `**Attributes:**\n\`\`\`json\n${JSON.stringify(results.knowledgeGraph.attributes, null, 2)}\n\`\`\``
|
|
111
143
|
: '',
|
|
112
144
|
'',
|
|
113
|
-
]
|
|
114
|
-
|
|
115
|
-
.join('\n\n');
|
|
145
|
+
].filter(Boolean);
|
|
146
|
+
outputLines.push(kgLines.join('\n\n'));
|
|
116
147
|
}
|
|
117
148
|
// Answer Box
|
|
118
149
|
if (results.answerBox != null) {
|
|
119
150
|
addSection('Answer Box');
|
|
120
|
-
|
|
151
|
+
const abLines = [
|
|
121
152
|
results.answerBox.title != null
|
|
122
153
|
? `**Title:** ${results.answerBox.title}`
|
|
123
154
|
: '',
|
|
@@ -133,29 +164,29 @@ function formatResultsForLLM(turn, results) {
|
|
|
133
164
|
? `**Link:** ${results.answerBox.link}`
|
|
134
165
|
: '',
|
|
135
166
|
'',
|
|
136
|
-
]
|
|
137
|
-
|
|
138
|
-
.join('\n\n');
|
|
167
|
+
].filter(Boolean);
|
|
168
|
+
outputLines.push(abLines.join('\n\n'));
|
|
139
169
|
}
|
|
140
170
|
// People also ask
|
|
141
171
|
const peopleAlsoAsk = results.peopleAlsoAsk ?? [];
|
|
142
172
|
if (peopleAlsoAsk.length) {
|
|
143
173
|
addSection('People Also Ask');
|
|
174
|
+
const paaLines = [];
|
|
144
175
|
peopleAlsoAsk.forEach((p, i) => {
|
|
145
|
-
|
|
176
|
+
const questionLines = [
|
|
146
177
|
`### Question ${i + 1}:`,
|
|
147
178
|
`"${p.question}"`,
|
|
148
|
-
`${p.snippet != null && p.snippet ? `Snippet: ${p.snippet}
|
|
179
|
+
`${p.snippet != null && p.snippet ? `Snippet: ${p.snippet}` : ''}`,
|
|
149
180
|
`${p.title != null && p.title ? `Title: ${p.title}` : ''}`,
|
|
150
181
|
`${p.link != null && p.link ? `Link: ${p.link}` : ''}`,
|
|
151
182
|
'',
|
|
152
|
-
]
|
|
153
|
-
|
|
154
|
-
.join('\n\n');
|
|
183
|
+
].filter(Boolean);
|
|
184
|
+
paaLines.push(questionLines.join('\n\n'));
|
|
155
185
|
});
|
|
186
|
+
outputLines.push(paaLines.join(''));
|
|
156
187
|
}
|
|
157
188
|
return {
|
|
158
|
-
output:
|
|
189
|
+
output: outputLines.join('\n').trim(),
|
|
159
190
|
references,
|
|
160
191
|
};
|
|
161
192
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.mjs","sources":["../../../../src/tools/search/format.ts"],"sourcesContent":["import type * as t from './types';\nimport { getDomainName } from './utils';\n\nexport function formatResultsForLLM(\n turn: number,\n results: t.SearchResultData\n): { output: string; references: t.ResultReference[] } {\n let output = '';\n\n const addSection = (title: string): void => {\n output += `\\n=== ${title} ===\\n`;\n };\n\n const references: t.ResultReference[] = [];\n // Organic (web) results\n if (results.organic?.length != null && results.organic.length > 0) {\n addSection(`Web Results, Turn ${turn}`);\n for (let i = 0; i < results.organic.length; i++) {\n const r = results.organic[i];\n output += [\n `# Source ${i}: \"${r.title ?? '(no title)'}\"`,\n `Anchor: \\\\ue202turn${turn}search${i}`,\n `URL: ${r.link}`,\n r.snippet != null ? `Summary: ${r.snippet}` : '',\n r.date != null ? `Date: ${r.date}` : '',\n r.attribution != null ? `Source: ${r.attribution}` : '',\n '',\n '\\n## Highlights\\n\\n',\n '',\n '',\n ]\n .filter(Boolean)\n .join('\\n');\n\n (r.highlights ?? [])\n .filter((h) => h.text.trim().length > 0)\n .forEach((h, hIndex) => {\n output += `### Highlight ${hIndex + 1} [Relevance: ${h.score.toFixed(2)}]\\n\\n`;\n output += '```text\\n' + h.text.trim() + '\\n```\\n\\n';\n\n if (h.references != null && h.references.length) {\n output += 'Core References:\\n';\n output += h.references\n .map((ref) => {\n references.push({\n link: ref.reference.originalUrl,\n attribution: getDomainName(ref.reference.originalUrl),\n title: (\n ((ref.reference.title ?? '') || ref.reference.text) ??\n ''\n ).split('\\n')[0],\n });\n return `- ${ref.type}#${ref.originalIndex + 1}: ${ref.reference.originalUrl}\\n\\t- Anchor: \\\\ue202turn${turn}ref${references.length - 1}`;\n })\n .join('\\n');\n output += '\\n\\n';\n }\n\n if (hIndex < (r.highlights?.length ?? 0) - 1) {\n output += '---\\n\\n';\n }\n });\n\n delete results.organic[i].highlights;\n output += '\\n';\n }\n }\n\n // Ignoring these sections for now\n // // Top stories (news)\n // const topStores = results.topStories ?? [];\n // if (topStores.length) {\n // addSection('News Results');\n // topStores.forEach((r, i) => {\n // output += [\n // `Anchor: \\ue202turn0news${i}`,\n // `Title: ${r.title ?? '(no title)'}`,\n // `URL: ${r.link}`,\n // r.snippet != null ? `Snippet: ${r.snippet}` : '',\n // r.date != null ? `Date: ${r.date}` : '',\n // r.attribution != null ? `Source: ${r.attribution}` : '',\n // ''\n // ].filter(Boolean).join('\\n');\n // });\n // }\n\n // // Images\n // const images = results.images ?? [];\n // if (images.length) {\n // addSection('Image Results');\n // images.forEach((img, i) => {\n // output += [\n // `Anchor: \\ue202turn0image${i}`,\n // `Title: ${img.title ?? '(no title)'}`,\n // `Image URL: ${img.imageUrl}`,\n // ''\n // ].join('\\n');\n // });\n // }\n\n // Knowledge Graph\n if (results.knowledgeGraph != null) {\n addSection('Knowledge Graph');\n output += [\n `**Title:** ${results.knowledgeGraph.title ?? '(no title)'}`,\n results.knowledgeGraph.type != null\n ? `**Type:** ${results.knowledgeGraph.type}`\n : '',\n results.knowledgeGraph.description != null\n ? `**Description:** ${results.knowledgeGraph.description}`\n : '',\n results.knowledgeGraph.descriptionSource != null\n ? `**Description Source:** ${results.knowledgeGraph.descriptionSource}`\n : '',\n results.knowledgeGraph.descriptionLink != null\n ? `**Description Link:** ${results.knowledgeGraph.descriptionLink}`\n : '',\n results.knowledgeGraph.imageUrl != null\n ? `**Image URL:** ${results.knowledgeGraph.imageUrl}`\n : '',\n results.knowledgeGraph.website != null\n ? `**Website:** ${results.knowledgeGraph.website}`\n : '',\n results.knowledgeGraph.attributes != null\n ? `**Attributes:**\\n\\`\\`\\`json\\n${JSON.stringify(\n results.knowledgeGraph.attributes,\n null,\n 2\n )}\\n\\`\\`\\``\n : '',\n '',\n ]\n .filter(Boolean)\n .join('\\n\\n');\n }\n\n // Answer Box\n if (results.answerBox != null) {\n addSection('Answer Box');\n output += [\n results.answerBox.title != null\n ? `**Title:** ${results.answerBox.title}`\n : '',\n results.answerBox.snippet != null\n ? `**Snippet:** ${results.answerBox.snippet}`\n : '',\n results.answerBox.snippetHighlighted != null\n ? `**Snippet Highlighted:** ${results.answerBox.snippetHighlighted\n .map((s) => `\\`${s}\\``)\n .join(' ')}`\n : '',\n results.answerBox.link != null\n ? `**Link:** ${results.answerBox.link}`\n : '',\n '',\n ]\n .filter(Boolean)\n .join('\\n\\n');\n }\n\n // People also ask\n const peopleAlsoAsk = results.peopleAlsoAsk ?? [];\n if (peopleAlsoAsk.length) {\n addSection('People Also Ask');\n peopleAlsoAsk.forEach((p, i) => {\n output += [\n `### Question ${i + 1}:`,\n `\"${p.question}\"`,\n `${p.snippet != null && p.snippet ? `Snippet: ${p.snippet}}` : ''}`,\n `${p.title != null && p.title ? `Title: ${p.title}` : ''}`,\n `${p.link != null && p.link ? `Link: ${p.link}` : ''}`,\n '',\n ]\n .filter(Boolean)\n .join('\\n\\n');\n });\n }\n return {\n output: output.trim(),\n references,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"format.mjs","sources":["../../../../src/tools/search/format.ts"],"sourcesContent":["import type * as t from './types';\nimport { getDomainName } from './utils';\n\nfunction addHighlightSection(): string[] {\n return ['\\n## Highlights', ''];\n}\n\n// Helper function to format a source (organic or top story)\nfunction formatSource(\n source: t.ValidSource,\n index: number,\n turn: number,\n sourceType: 'search' | 'news',\n references: t.ResultReference[]\n): string {\n /** Array of all lines to include in the output */\n const outputLines: string[] = [];\n\n // Add the title\n outputLines.push(\n `# ${sourceType.charAt(0).toUpperCase() + sourceType.slice(1)} ${index}: ${source.title != null && source.title ? `\"${source.title}\"` : '(no title)'}`\n );\n outputLines.push(`\\nAnchor: \\\\ue202turn${turn}${sourceType}${index}`);\n outputLines.push(`URL: ${source.link}`);\n\n // Add optional fields\n if ('snippet' in source && source.snippet != null) {\n outputLines.push(`Summary: ${source.snippet}`);\n }\n\n if (source.date != null) {\n outputLines.push(`Date: ${source.date}`);\n }\n\n if (source.attribution != null) {\n outputLines.push(`Source: ${source.attribution}`);\n }\n\n // Add highlight section or empty line\n if ((source.highlights?.length ?? 0) > 0) {\n outputLines.push(...addHighlightSection());\n } else {\n outputLines.push('');\n }\n\n // Process highlights if they exist\n (source.highlights ?? [])\n .filter((h) => h.text.trim().length > 0)\n .forEach((h, hIndex) => {\n outputLines.push(\n `### Highlight ${hIndex + 1} [Relevance: ${h.score.toFixed(2)}]`\n );\n outputLines.push('');\n outputLines.push('```text');\n outputLines.push(h.text.trim());\n outputLines.push('```');\n outputLines.push('');\n\n if (h.references != null && h.references.length) {\n let hasHeader = false;\n const refLines: string[] = [];\n\n for (let j = 0; j < h.references.length; j++) {\n const ref = h.references[j];\n references.push({\n type: ref.type,\n link: ref.reference.originalUrl,\n attribution: getDomainName(ref.reference.originalUrl),\n title: (\n ((ref.reference.title ?? '') || ref.reference.text) ??\n ''\n ).split('\\n')[0],\n });\n\n if (ref.type !== 'link') {\n continue;\n }\n\n if (!hasHeader) {\n refLines.push('Core References:');\n hasHeader = true;\n }\n\n refLines.push(\n `- ${ref.type}#${ref.originalIndex + 1}: ${ref.reference.originalUrl}`\n );\n refLines.push(\n `\\t- Anchor: \\\\ue202turn${turn}ref${references.length - 1}`\n );\n }\n\n if (hasHeader) {\n outputLines.push(...refLines);\n outputLines.push('');\n }\n }\n\n if (hIndex < (source.highlights?.length ?? 0) - 1) {\n outputLines.push('---');\n outputLines.push('');\n }\n });\n\n outputLines.push('');\n return outputLines.join('\\n');\n}\n\nexport function formatResultsForLLM(\n turn: number,\n results: t.SearchResultData\n): { output: string; references: t.ResultReference[] } {\n /** Array to collect all output lines */\n const outputLines: string[] = [];\n\n const addSection = (title: string): void => {\n outputLines.push('');\n outputLines.push(`=== ${title} ===`);\n outputLines.push('');\n };\n\n const references: t.ResultReference[] = [];\n\n // Organic (web) results\n if (results.organic?.length != null && results.organic.length > 0) {\n addSection(`Web Results, Turn ${turn}`);\n for (let i = 0; i < results.organic.length; i++) {\n const r = results.organic[i];\n outputLines.push(formatSource(r, i, turn, 'search', references));\n delete results.organic[i].highlights;\n }\n }\n\n // Top stories (news)\n const topStories = results.topStories ?? [];\n if (topStories.length) {\n addSection('News Results');\n for (let i = 0; i < topStories.length; i++) {\n const r = topStories[i];\n outputLines.push(formatSource(r, i, turn, 'news', references));\n if (results.topStories?.[i]?.highlights) {\n delete results.topStories[i].highlights;\n }\n }\n }\n\n // // Images\n // const images = results.images ?? [];\n // if (images.length) {\n // addSection('Image Results');\n // const imageLines = images.map((img, i) => [\n // `Anchor: \\ue202turn0image${i}`,\n // `Title: ${img.title ?? '(no title)'}`,\n // `Image URL: ${img.imageUrl}`,\n // ''\n // ].join('\\n'));\n // outputLines.push(imageLines.join('\\n'));\n // }\n\n // Knowledge Graph\n if (results.knowledgeGraph != null) {\n addSection('Knowledge Graph');\n const kgLines = [\n `**Title:** ${results.knowledgeGraph.title ?? '(no title)'}`,\n results.knowledgeGraph.type != null\n ? `**Type:** ${results.knowledgeGraph.type}`\n : '',\n results.knowledgeGraph.description != null\n ? `**Description:** ${results.knowledgeGraph.description}`\n : '',\n results.knowledgeGraph.descriptionSource != null\n ? `**Description Source:** ${results.knowledgeGraph.descriptionSource}`\n : '',\n results.knowledgeGraph.descriptionLink != null\n ? `**Description Link:** ${results.knowledgeGraph.descriptionLink}`\n : '',\n results.knowledgeGraph.imageUrl != null\n ? `**Image URL:** ${results.knowledgeGraph.imageUrl}`\n : '',\n results.knowledgeGraph.website != null\n ? `**Website:** ${results.knowledgeGraph.website}`\n : '',\n results.knowledgeGraph.attributes != null\n ? `**Attributes:**\\n\\`\\`\\`json\\n${JSON.stringify(\n results.knowledgeGraph.attributes,\n null,\n 2\n )}\\n\\`\\`\\``\n : '',\n '',\n ].filter(Boolean);\n\n outputLines.push(kgLines.join('\\n\\n'));\n }\n\n // Answer Box\n if (results.answerBox != null) {\n addSection('Answer Box');\n const abLines = [\n results.answerBox.title != null\n ? `**Title:** ${results.answerBox.title}`\n : '',\n results.answerBox.snippet != null\n ? `**Snippet:** ${results.answerBox.snippet}`\n : '',\n results.answerBox.snippetHighlighted != null\n ? `**Snippet Highlighted:** ${results.answerBox.snippetHighlighted\n .map((s) => `\\`${s}\\``)\n .join(' ')}`\n : '',\n results.answerBox.link != null\n ? `**Link:** ${results.answerBox.link}`\n : '',\n '',\n ].filter(Boolean);\n\n outputLines.push(abLines.join('\\n\\n'));\n }\n\n // People also ask\n const peopleAlsoAsk = results.peopleAlsoAsk ?? [];\n if (peopleAlsoAsk.length) {\n addSection('People Also Ask');\n\n const paaLines: string[] = [];\n peopleAlsoAsk.forEach((p, i) => {\n const questionLines = [\n `### Question ${i + 1}:`,\n `\"${p.question}\"`,\n `${p.snippet != null && p.snippet ? `Snippet: ${p.snippet}` : ''}`,\n `${p.title != null && p.title ? `Title: ${p.title}` : ''}`,\n `${p.link != null && p.link ? `Link: ${p.link}` : ''}`,\n '',\n ].filter(Boolean);\n\n paaLines.push(questionLines.join('\\n\\n'));\n });\n\n outputLines.push(paaLines.join(''));\n }\n\n return {\n output: outputLines.join('\\n').trim(),\n references,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -38,7 +38,7 @@ const chunker = {
|
|
|
38
38
|
return Promise.all(promises);
|
|
39
39
|
},
|
|
40
40
|
};
|
|
41
|
-
|
|
41
|
+
function createSourceUpdateCallback(sourceMap) {
|
|
42
42
|
return (link, update) => {
|
|
43
43
|
const source = sourceMap.get(link);
|
|
44
44
|
if (source) {
|
|
@@ -48,7 +48,7 @@ const createSourceUpdateCallback = (sourceMap) => {
|
|
|
48
48
|
});
|
|
49
49
|
}
|
|
50
50
|
};
|
|
51
|
-
}
|
|
51
|
+
}
|
|
52
52
|
const getHighlights = async ({ query, content, reranker, topResults = 5, }) => {
|
|
53
53
|
if (!content) {
|
|
54
54
|
console.warn('No content provided for highlights');
|
|
@@ -223,11 +223,12 @@ const createSourceProcessor = (config = {}, scraperInstance) => {
|
|
|
223
223
|
reranker, } = config;
|
|
224
224
|
const firecrawlScraper = scraperInstance;
|
|
225
225
|
const webScraper = {
|
|
226
|
-
scrapeMany: async ({ query, links, }) => {
|
|
226
|
+
scrapeMany: async ({ query, links, onGetHighlights, }) => {
|
|
227
227
|
console.log(`Scraping ${links.length} links with Firecrawl`);
|
|
228
228
|
const promises = [];
|
|
229
229
|
try {
|
|
230
|
-
for (
|
|
230
|
+
for (let i = 0; i < links.length; i++) {
|
|
231
|
+
const currentLink = links[i];
|
|
231
232
|
const promise = firecrawlScraper
|
|
232
233
|
.scrapeUrl(currentLink, {})
|
|
233
234
|
.then(([url, response]) => {
|
|
@@ -245,7 +246,7 @@ const createSourceProcessor = (config = {}, scraperInstance) => {
|
|
|
245
246
|
url,
|
|
246
247
|
attribution,
|
|
247
248
|
error: true,
|
|
248
|
-
content:
|
|
249
|
+
content: '',
|
|
249
250
|
};
|
|
250
251
|
})
|
|
251
252
|
.then(async (result) => {
|
|
@@ -261,6 +262,9 @@ const createSourceProcessor = (config = {}, scraperInstance) => {
|
|
|
261
262
|
reranker,
|
|
262
263
|
content: result.content,
|
|
263
264
|
});
|
|
265
|
+
if (onGetHighlights) {
|
|
266
|
+
onGetHighlights(result.url);
|
|
267
|
+
}
|
|
264
268
|
return {
|
|
265
269
|
...result,
|
|
266
270
|
highlights,
|
|
@@ -278,7 +282,7 @@ const createSourceProcessor = (config = {}, scraperInstance) => {
|
|
|
278
282
|
return {
|
|
279
283
|
url: currentLink,
|
|
280
284
|
error: true,
|
|
281
|
-
content:
|
|
285
|
+
content: '',
|
|
282
286
|
};
|
|
283
287
|
});
|
|
284
288
|
promises.push(promise);
|
|
@@ -291,10 +295,14 @@ const createSourceProcessor = (config = {}, scraperInstance) => {
|
|
|
291
295
|
}
|
|
292
296
|
},
|
|
293
297
|
};
|
|
294
|
-
const fetchContents = async ({ links, query, target, onContentScraped, }) => {
|
|
298
|
+
const fetchContents = async ({ links, query, target, onGetHighlights, onContentScraped, }) => {
|
|
295
299
|
const initialLinks = links.slice(0, target);
|
|
296
300
|
// const remainingLinks = links.slice(target).reverse();
|
|
297
|
-
const results = await webScraper.scrapeMany({
|
|
301
|
+
const results = await webScraper.scrapeMany({
|
|
302
|
+
query,
|
|
303
|
+
links: initialLinks,
|
|
304
|
+
onGetHighlights,
|
|
305
|
+
});
|
|
298
306
|
for (const result of results) {
|
|
299
307
|
if (result.error === true) {
|
|
300
308
|
continue;
|
|
@@ -308,7 +316,7 @@ const createSourceProcessor = (config = {}, scraperInstance) => {
|
|
|
308
316
|
});
|
|
309
317
|
}
|
|
310
318
|
};
|
|
311
|
-
const processSources = async (result, numElements, query, proMode =
|
|
319
|
+
const processSources = async ({ result, numElements, query, proMode = true, onGetHighlights, }) => {
|
|
312
320
|
try {
|
|
313
321
|
if (!result.data) {
|
|
314
322
|
return {
|
|
@@ -332,6 +340,7 @@ const createSourceProcessor = (config = {}, scraperInstance) => {
|
|
|
332
340
|
await fetchContents({
|
|
333
341
|
query,
|
|
334
342
|
target: 1,
|
|
343
|
+
onGetHighlights,
|
|
335
344
|
onContentScraped,
|
|
336
345
|
links: [wikiSources[0].link],
|
|
337
346
|
});
|
|
@@ -348,38 +357,44 @@ const createSourceProcessor = (config = {}, scraperInstance) => {
|
|
|
348
357
|
return result.data;
|
|
349
358
|
}
|
|
350
359
|
const sourceMap = new Map();
|
|
351
|
-
const
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
if (allLinks.length === 0) {
|
|
360
|
+
const organicLinksSet = new Set();
|
|
361
|
+
// Collect organic links
|
|
362
|
+
const organicLinks = collectLinks(result.data.organic, sourceMap, organicLinksSet);
|
|
363
|
+
// Collect top story links, excluding any that are already in organic links
|
|
364
|
+
const topStories = result.data.topStories ?? [];
|
|
365
|
+
const topStoryLinks = collectLinks(topStories, sourceMap, organicLinksSet);
|
|
366
|
+
if (organicLinks.length === 0 && topStoryLinks.length === 0) {
|
|
359
367
|
return result.data;
|
|
360
368
|
}
|
|
361
369
|
const onContentScraped = createSourceUpdateCallback(sourceMap);
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
result.data.organic[i] = {
|
|
373
|
-
...source,
|
|
374
|
-
...updatedSource,
|
|
375
|
-
};
|
|
376
|
-
}
|
|
370
|
+
const promises = [];
|
|
371
|
+
// Process organic links
|
|
372
|
+
if (organicLinks.length > 0) {
|
|
373
|
+
promises.push(fetchContents({
|
|
374
|
+
query,
|
|
375
|
+
onGetHighlights,
|
|
376
|
+
onContentScraped,
|
|
377
|
+
links: organicLinks,
|
|
378
|
+
target: numElements,
|
|
379
|
+
}));
|
|
377
380
|
}
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
.
|
|
381
|
-
|
|
382
|
-
|
|
381
|
+
// Process top story links
|
|
382
|
+
if (topStoryLinks.length > 0) {
|
|
383
|
+
promises.push(fetchContents({
|
|
384
|
+
query,
|
|
385
|
+
onGetHighlights,
|
|
386
|
+
onContentScraped,
|
|
387
|
+
links: topStoryLinks,
|
|
388
|
+
target: numElements,
|
|
389
|
+
}));
|
|
390
|
+
}
|
|
391
|
+
await Promise.all(promises);
|
|
392
|
+
// Update sources with scraped content
|
|
393
|
+
if (result.data.organic.length > 0) {
|
|
394
|
+
updateSourcesWithContent(result.data.organic, sourceMap);
|
|
395
|
+
}
|
|
396
|
+
if (topStories.length > 0) {
|
|
397
|
+
updateSourcesWithContent(topStories, sourceMap);
|
|
383
398
|
}
|
|
384
399
|
return result.data;
|
|
385
400
|
}
|
|
@@ -400,6 +415,37 @@ const createSourceProcessor = (config = {}, scraperInstance) => {
|
|
|
400
415
|
topResults,
|
|
401
416
|
};
|
|
402
417
|
};
|
|
418
|
+
/** Helper function to collect links and update sourceMap */
|
|
419
|
+
function collectLinks(sources, sourceMap, existingLinksSet) {
|
|
420
|
+
const links = [];
|
|
421
|
+
for (const source of sources) {
|
|
422
|
+
if (source.link) {
|
|
423
|
+
// For topStories, only add if not already in organic links
|
|
424
|
+
if (existingLinksSet && existingLinksSet.has(source.link)) {
|
|
425
|
+
continue;
|
|
426
|
+
}
|
|
427
|
+
links.push(source.link);
|
|
428
|
+
if (existingLinksSet) {
|
|
429
|
+
existingLinksSet.add(source.link);
|
|
430
|
+
}
|
|
431
|
+
sourceMap.set(source.link, source);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
return links;
|
|
435
|
+
}
|
|
436
|
+
/** Helper function to update sources with scraped content */
|
|
437
|
+
function updateSourcesWithContent(sources, sourceMap) {
|
|
438
|
+
for (let i = 0; i < sources.length; i++) {
|
|
439
|
+
const source = sources[i];
|
|
440
|
+
const updatedSource = sourceMap.get(source.link);
|
|
441
|
+
if (updatedSource) {
|
|
442
|
+
sources[i] = {
|
|
443
|
+
...source,
|
|
444
|
+
...updatedSource,
|
|
445
|
+
};
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
}
|
|
403
449
|
|
|
404
450
|
export { createSearchAPI, createSourceProcessor };
|
|
405
451
|
//# sourceMappingURL=search.mjs.map
|