@compresr/sdk 1.5.4 → 1.6.0
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/README.md +35 -0
- package/dist/cjs/agents/engine.d.ts +30 -0
- package/dist/cjs/agents/engine.d.ts.map +1 -1
- package/dist/cjs/agents/engine.js +126 -8
- package/dist/cjs/agents/engine.js.map +1 -1
- package/dist/cjs/agents/research/agent.d.ts +80 -0
- package/dist/cjs/agents/research/agent.d.ts.map +1 -0
- package/dist/cjs/agents/research/agent.js +329 -0
- package/dist/cjs/agents/research/agent.js.map +1 -0
- package/dist/cjs/agents/research/facade.d.ts +22 -0
- package/dist/cjs/agents/research/facade.d.ts.map +1 -0
- package/dist/cjs/agents/research/facade.js +90 -0
- package/dist/cjs/agents/research/facade.js.map +1 -0
- package/dist/cjs/agents/research/index.d.ts +16 -0
- package/dist/cjs/agents/research/index.d.ts.map +1 -0
- package/dist/cjs/agents/research/index.js +19 -0
- package/dist/cjs/agents/research/index.js.map +1 -0
- package/dist/cjs/agents/research/parser.d.ts +9 -0
- package/dist/cjs/agents/research/parser.d.ts.map +1 -0
- package/dist/cjs/agents/research/parser.js +42 -0
- package/dist/cjs/agents/research/parser.js.map +1 -0
- package/dist/cjs/agents/research/prompts.d.ts +6 -0
- package/dist/cjs/agents/research/prompts.d.ts.map +1 -0
- package/dist/cjs/agents/research/prompts.js +36 -0
- package/dist/cjs/agents/research/prompts.js.map +1 -0
- package/dist/cjs/agents/research/types.d.ts +32 -0
- package/dist/cjs/agents/research/types.d.ts.map +1 -0
- package/dist/cjs/agents/research/types.js +4 -0
- package/dist/cjs/agents/research/types.js.map +1 -0
- package/dist/cjs/clients/compression.d.ts +22 -0
- package/dist/cjs/clients/compression.d.ts.map +1 -1
- package/dist/cjs/clients/compression.js +32 -0
- package/dist/cjs/clients/compression.js.map +1 -1
- package/dist/esm/agents/engine.d.ts +30 -0
- package/dist/esm/agents/engine.d.ts.map +1 -1
- package/dist/esm/agents/engine.js +126 -8
- package/dist/esm/agents/engine.js.map +1 -1
- package/dist/esm/agents/research/agent.d.ts +80 -0
- package/dist/esm/agents/research/agent.d.ts.map +1 -0
- package/dist/esm/agents/research/agent.js +292 -0
- package/dist/esm/agents/research/agent.js.map +1 -0
- package/dist/esm/agents/research/facade.d.ts +22 -0
- package/dist/esm/agents/research/facade.d.ts.map +1 -0
- package/dist/esm/agents/research/facade.js +53 -0
- package/dist/esm/agents/research/facade.js.map +1 -0
- package/dist/esm/agents/research/index.d.ts +16 -0
- package/dist/esm/agents/research/index.d.ts.map +1 -0
- package/dist/esm/agents/research/index.js +12 -0
- package/dist/esm/agents/research/index.js.map +1 -0
- package/dist/esm/agents/research/parser.d.ts +9 -0
- package/dist/esm/agents/research/parser.d.ts.map +1 -0
- package/dist/esm/agents/research/parser.js +39 -0
- package/dist/esm/agents/research/parser.js.map +1 -0
- package/dist/esm/agents/research/prompts.d.ts +6 -0
- package/dist/esm/agents/research/prompts.d.ts.map +1 -0
- package/dist/esm/agents/research/prompts.js +33 -0
- package/dist/esm/agents/research/prompts.js.map +1 -0
- package/dist/esm/agents/research/types.d.ts +32 -0
- package/dist/esm/agents/research/types.d.ts.map +1 -0
- package/dist/esm/agents/research/types.js +3 -0
- package/dist/esm/agents/research/types.js.map +1 -0
- package/dist/esm/clients/compression.d.ts +22 -0
- package/dist/esm/clients/compression.d.ts.map +1 -1
- package/dist/esm/clients/compression.js +32 -0
- package/dist/esm/clients/compression.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../../src/agents/research/agent.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAY,cAAc,EAAuB,MAAM,YAAY,CAAC;AAEhF,UAAU,kBAAkB;IAC1B,QAAQ,CAAC,IAAI,EAAE;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,oBAAoB,CAAC,EAAE,MAAM,CAAC;KAC/B,GAAG,OAAO,CAAC;QACV,IAAI,CAAC,EAAE;YAAE,iBAAiB,CAAC,EAAE,MAAM,CAAC;YAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KACpE,CAAC,CAAC;CACJ;AAED,UAAU,aAAa;IACrB,SAAS,CACP,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,EAC7B,OAAO,EAAE;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,GAC/B;QAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC;CACtD;AAED,UAAU,cAAc;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACzD;AAED,UAAU,cAAc;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtC,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACzD,QAAQ,CAAC,eAAe,EAAE,kBAAkB,CAAC;IAC7C,QAAQ,CAAC,kBAAkB,EAAE;QAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;QAC1B,QAAQ,CAAC,GAAG,EAAE,IAAI,GAAG,IAAI,CAAC;QAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;KAC9B,CAAC;CACH;AAwBD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,cAAc,CAAC;IACvB,UAAU,EAAE,cAAc,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA6CD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAU;IAC3C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;gBAE9B,OAAO,EAAE,oBAAoB;IAWnC,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAE,kBAAuB,GAAG,OAAO,CAAC,cAAc,CAAC;IAyFzF;;;OAGG;IACH,OAAO,CAAC,iBAAiB;YAmCX,YAAY;YAcZ,QAAQ;IAiBtB,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,cAAc;IA+BtB,OAAO,CAAC,gBAAgB;CAazB"}
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ResearchAgent` — strict-output ReAct loop with per-snippet compression.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the Python implementation in `compresr/agents/research/agent.py`.
|
|
5
|
+
* Bypasses `_Engine.run` so we can set `tool_choice` per step and compress
|
|
6
|
+
* each tool result before it enters the conversation.
|
|
7
|
+
*/
|
|
8
|
+
import { parseResearchOutput } from './parser.js';
|
|
9
|
+
import { DEFAULT_RESEARCH_SYSTEM_PROMPT } from './prompts.js';
|
|
10
|
+
const DEFAULT_MAX_CONTEXT_TOKENS = 120_000;
|
|
11
|
+
const DEFAULT_MAX_STEPS = 10;
|
|
12
|
+
const DEFAULT_MIN_COMPRESS_TOKENS = 100;
|
|
13
|
+
const CACHE_READ_ALIASES = [
|
|
14
|
+
'cached_tokens',
|
|
15
|
+
'cache_read',
|
|
16
|
+
'priority_cache_read',
|
|
17
|
+
'flex_cache_read',
|
|
18
|
+
'cached_content_token_count',
|
|
19
|
+
];
|
|
20
|
+
function estimateTokens(text) {
|
|
21
|
+
return Math.max(1, Math.floor(text.length / 4));
|
|
22
|
+
}
|
|
23
|
+
function stringifyContent(content) {
|
|
24
|
+
if (typeof content === 'string')
|
|
25
|
+
return content;
|
|
26
|
+
if (Array.isArray(content)) {
|
|
27
|
+
const parts = [];
|
|
28
|
+
for (const block of content) {
|
|
29
|
+
if (block && typeof block === 'object' && 'text' in block) {
|
|
30
|
+
const t = block.text;
|
|
31
|
+
if (typeof t === 'string')
|
|
32
|
+
parts.push(t);
|
|
33
|
+
}
|
|
34
|
+
else if (typeof block === 'string') {
|
|
35
|
+
parts.push(block);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return parts.join('');
|
|
39
|
+
}
|
|
40
|
+
if (content == null)
|
|
41
|
+
return '';
|
|
42
|
+
if (typeof content === 'number' || typeof content === 'boolean')
|
|
43
|
+
return String(content);
|
|
44
|
+
return JSON.stringify(content);
|
|
45
|
+
}
|
|
46
|
+
function readCacheTokens(details) {
|
|
47
|
+
if (!details)
|
|
48
|
+
return { read: 0, create: 0 };
|
|
49
|
+
let read = 0;
|
|
50
|
+
for (const alias of CACHE_READ_ALIASES) {
|
|
51
|
+
const v = details[alias];
|
|
52
|
+
if (typeof v === 'number')
|
|
53
|
+
read += v;
|
|
54
|
+
}
|
|
55
|
+
// langchain-anthropic zeros ``cache_creation`` when ttl-specific keys are set.
|
|
56
|
+
const ttl5 = typeof details['ephemeral_5m_input_tokens'] === 'number'
|
|
57
|
+
? (details['ephemeral_5m_input_tokens']) : 0;
|
|
58
|
+
const ttl1 = typeof details['ephemeral_1h_input_tokens'] === 'number'
|
|
59
|
+
? (details['ephemeral_1h_input_tokens']) : 0;
|
|
60
|
+
const gen = typeof details['cache_creation'] === 'number'
|
|
61
|
+
? (details['cache_creation']) : 0;
|
|
62
|
+
const create = ttl5 + ttl1 > 0 ? ttl5 + ttl1 : gen;
|
|
63
|
+
return { read, create };
|
|
64
|
+
}
|
|
65
|
+
export class ResearchAgent {
|
|
66
|
+
engine;
|
|
67
|
+
searchTool;
|
|
68
|
+
maxSteps;
|
|
69
|
+
systemPrompt;
|
|
70
|
+
compressSnippets;
|
|
71
|
+
compressionModel;
|
|
72
|
+
minCompressTokens;
|
|
73
|
+
maxContextTokens;
|
|
74
|
+
constructor(options) {
|
|
75
|
+
this.engine = options.engine;
|
|
76
|
+
this.searchTool = options.searchTool;
|
|
77
|
+
this.maxSteps = Math.max(1, options.maxSteps ?? DEFAULT_MAX_STEPS);
|
|
78
|
+
this.systemPrompt = options.systemPrompt ?? DEFAULT_RESEARCH_SYSTEM_PROMPT;
|
|
79
|
+
this.compressSnippets = options.compressSnippets ?? true;
|
|
80
|
+
this.compressionModel = options.compressionModel ?? 'latte_v1';
|
|
81
|
+
this.minCompressTokens = options.minCompressTokens ?? DEFAULT_MIN_COMPRESS_TOKENS;
|
|
82
|
+
this.maxContextTokens = options.maxContextTokens ?? DEFAULT_MAX_CONTEXT_TOKENS;
|
|
83
|
+
}
|
|
84
|
+
async run(question, runOptions = {}) {
|
|
85
|
+
const { SystemMessage, HumanMessage, ToolMessage } = await import('@langchain/core/messages');
|
|
86
|
+
const modelName = this.engine._resolveModel(runOptions.model);
|
|
87
|
+
const chat = await this.engine._getChatModel(modelName);
|
|
88
|
+
const messages = [
|
|
89
|
+
new SystemMessage(this.systemPrompt),
|
|
90
|
+
new HumanMessage(question),
|
|
91
|
+
];
|
|
92
|
+
const aiHistory = [];
|
|
93
|
+
const trajectory = [];
|
|
94
|
+
let lastAi = null;
|
|
95
|
+
for (let stepIdx = 0; stepIdx < this.maxSteps; stepIdx++) {
|
|
96
|
+
this.maybeTruncate(messages);
|
|
97
|
+
const toolChoice = stepIdx === this.maxSteps - 1 ? 'none' : 'auto';
|
|
98
|
+
const bound = chat.bindTools([this.searchTool], { tool_choice: toolChoice });
|
|
99
|
+
const invokeMessages = this.applyCacheControl(messages);
|
|
100
|
+
const t0 = Date.now();
|
|
101
|
+
let response;
|
|
102
|
+
try {
|
|
103
|
+
response = (await bound.invoke(invokeMessages));
|
|
104
|
+
}
|
|
105
|
+
catch (exc) {
|
|
106
|
+
trajectory.push({
|
|
107
|
+
type: 'error',
|
|
108
|
+
text: exc instanceof Error ? exc.message : String(exc),
|
|
109
|
+
latencyS: (Date.now() - t0) / 1000,
|
|
110
|
+
});
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
const stepLatencyS = (Date.now() - t0) / 1000;
|
|
114
|
+
aiHistory.push(response);
|
|
115
|
+
lastAi = response;
|
|
116
|
+
messages.push(response);
|
|
117
|
+
const toolCalls = response.tool_calls ?? [];
|
|
118
|
+
if (toolCalls.length === 0) {
|
|
119
|
+
trajectory.push({
|
|
120
|
+
type: 'answer',
|
|
121
|
+
text: stringifyContent(response.content),
|
|
122
|
+
latencyS: stepLatencyS,
|
|
123
|
+
});
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
for (const tc of toolCalls) {
|
|
127
|
+
const args = tc.args ?? {};
|
|
128
|
+
const query = typeof args['query'] === 'string' ? (args['query']) : undefined;
|
|
129
|
+
trajectory.push({ type: 'search', query, latencyS: stepLatencyS });
|
|
130
|
+
const rawResult = await this.invokeSearch(args);
|
|
131
|
+
const finalResult = this.compressSnippets
|
|
132
|
+
? await this.compress(rawResult, query ?? question)
|
|
133
|
+
: rawResult;
|
|
134
|
+
trajectory.push({ type: 'tool_result', chars: finalResult.length, text: finalResult });
|
|
135
|
+
messages.push(new ToolMessage({
|
|
136
|
+
content: finalResult,
|
|
137
|
+
tool_call_id: tc.id ?? '',
|
|
138
|
+
name: this.searchTool.name ?? 'search_web',
|
|
139
|
+
}));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
const usage = this.aggregateUsage(aiHistory);
|
|
143
|
+
const finalText = lastAi ? stringifyContent(lastAi.content) : '';
|
|
144
|
+
const parsed = parseResearchOutput(finalText);
|
|
145
|
+
const citations = this.collectCitations(parsed.citationUrls, trajectory);
|
|
146
|
+
return {
|
|
147
|
+
answer: parsed.answer,
|
|
148
|
+
explanation: parsed.explanation,
|
|
149
|
+
confidence: parsed.confidence,
|
|
150
|
+
text: finalText,
|
|
151
|
+
citations,
|
|
152
|
+
trajectory,
|
|
153
|
+
usage,
|
|
154
|
+
raw: lastAi,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Mirrors AnthropicPromptCachingMiddleware for the bypass path — research
|
|
159
|
+
* doesn't go through createAgent so we stamp cache_control manually.
|
|
160
|
+
*/
|
|
161
|
+
applyCacheControl(messages) {
|
|
162
|
+
if (this.engine.provider !== 'anthropic')
|
|
163
|
+
return messages;
|
|
164
|
+
const cfg = this.engine._promptCacheConfig;
|
|
165
|
+
if (!cfg?.enabled)
|
|
166
|
+
return messages;
|
|
167
|
+
if (messages.length < cfg.minMessages)
|
|
168
|
+
return messages;
|
|
169
|
+
const marker = { type: 'ephemeral', ttl: cfg.ttl };
|
|
170
|
+
const last = messages[messages.length - 1];
|
|
171
|
+
const content = last?.content;
|
|
172
|
+
let newContent;
|
|
173
|
+
if (typeof content === 'string') {
|
|
174
|
+
newContent = [{ type: 'text', text: content, cache_control: marker }];
|
|
175
|
+
}
|
|
176
|
+
else if (Array.isArray(content) && content.length > 0) {
|
|
177
|
+
newContent = [...content];
|
|
178
|
+
const tail = newContent[newContent.length - 1];
|
|
179
|
+
if (tail !== null && typeof tail === 'object') {
|
|
180
|
+
newContent[newContent.length - 1] = {
|
|
181
|
+
...tail,
|
|
182
|
+
cache_control: marker,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
const tailText = typeof tail === 'string' ? tail : '';
|
|
187
|
+
newContent.push({ type: 'text', text: tailText, cache_control: marker });
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
return messages;
|
|
192
|
+
}
|
|
193
|
+
const Ctor = last.constructor;
|
|
194
|
+
const patched = new Ctor({ content: newContent });
|
|
195
|
+
return [...messages.slice(0, -1), patched];
|
|
196
|
+
}
|
|
197
|
+
async invokeSearch(args) {
|
|
198
|
+
try {
|
|
199
|
+
const out = await this.searchTool.invoke(args);
|
|
200
|
+
if (typeof out === 'string')
|
|
201
|
+
return out;
|
|
202
|
+
if (out == null)
|
|
203
|
+
return '';
|
|
204
|
+
return JSON.stringify(out);
|
|
205
|
+
}
|
|
206
|
+
catch (exc) {
|
|
207
|
+
const msg = exc instanceof Error ? exc.message : String(exc);
|
|
208
|
+
// eslint-disable-next-line no-console
|
|
209
|
+
console.warn(`[compresr.research] search tool raised: ${msg}; continuing.`);
|
|
210
|
+
return `Search error: ${msg}`;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
async compress(text, query) {
|
|
214
|
+
if (!text || estimateTokens(text) < this.minCompressTokens)
|
|
215
|
+
return text;
|
|
216
|
+
const client = this.engine._compresrClient;
|
|
217
|
+
if (!client?.compress)
|
|
218
|
+
return text;
|
|
219
|
+
try {
|
|
220
|
+
const resp = await client.compress({
|
|
221
|
+
context: text,
|
|
222
|
+
query,
|
|
223
|
+
compressionModelName: this.compressionModel,
|
|
224
|
+
});
|
|
225
|
+
const cc = resp?.data?.compressedContext ?? resp?.data?.compressed_context;
|
|
226
|
+
return typeof cc === 'string' && cc.length > 0 ? cc : text;
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
return text;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
maybeTruncate(messages) {
|
|
233
|
+
if (!this.maxContextTokens)
|
|
234
|
+
return;
|
|
235
|
+
const total = () => messages.reduce((acc, m) => acc + estimateTokens(stringifyContent(m?.content)), 0);
|
|
236
|
+
let cur = total();
|
|
237
|
+
if (cur <= this.maxContextTokens)
|
|
238
|
+
return;
|
|
239
|
+
let guard = 0;
|
|
240
|
+
while (cur > this.maxContextTokens && messages.length >= 4 && guard < 4) {
|
|
241
|
+
messages.splice(2, 2);
|
|
242
|
+
cur = total();
|
|
243
|
+
guard++;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
aggregateUsage(aiMessages) {
|
|
247
|
+
const totals = {
|
|
248
|
+
input_tokens: 0,
|
|
249
|
+
output_tokens: 0,
|
|
250
|
+
cache_read_tokens: 0,
|
|
251
|
+
cache_creation_tokens: 0,
|
|
252
|
+
};
|
|
253
|
+
for (const m of aiMessages) {
|
|
254
|
+
const um = m?.usage_metadata ?? {};
|
|
255
|
+
const inTok = typeof um['input_tokens'] === 'number' ? (um['input_tokens']) : 0;
|
|
256
|
+
totals['output_tokens'] += typeof um['output_tokens'] === 'number'
|
|
257
|
+
? (um['output_tokens']) : 0;
|
|
258
|
+
const details = um['input_token_details'];
|
|
259
|
+
const { read, create } = readCacheTokens(details);
|
|
260
|
+
totals['cache_read_tokens'] += read;
|
|
261
|
+
totals['cache_creation_tokens'] += create;
|
|
262
|
+
// langchain-anthropic 1.x inflates input_tokens to fresh+read+create.
|
|
263
|
+
const overcount = read + create;
|
|
264
|
+
totals['input_tokens'] += Math.max(0, inTok - overcount);
|
|
265
|
+
}
|
|
266
|
+
return {
|
|
267
|
+
input_tokens: totals['input_tokens'],
|
|
268
|
+
output_tokens: totals['output_tokens'],
|
|
269
|
+
cache_read_tokens: totals['cache_read_tokens'],
|
|
270
|
+
cache_creation_tokens: totals['cache_creation_tokens'],
|
|
271
|
+
calls: aiMessages.length,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
collectCitations(parsedUrls, trajectory) {
|
|
275
|
+
const urls = [];
|
|
276
|
+
for (const u of parsedUrls)
|
|
277
|
+
if (!urls.includes(u))
|
|
278
|
+
urls.push(u);
|
|
279
|
+
const urlRe = /https?:\/\/[^\s,;<>"')]+/g;
|
|
280
|
+
for (const step of trajectory) {
|
|
281
|
+
if (step.type !== 'tool_result' || !step.text)
|
|
282
|
+
continue;
|
|
283
|
+
let m;
|
|
284
|
+
while ((m = urlRe.exec(step.text)) !== null) {
|
|
285
|
+
if (!urls.includes(m[0]))
|
|
286
|
+
urls.push(m[0]);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
return urls.map((url) => ({ url }));
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../../src/agents/research/agent.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,8BAA8B,EAAE,MAAM,cAAc,CAAC;AAgD9D,MAAM,0BAA0B,GAAG,OAAO,CAAC;AAC3C,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,2BAA2B,GAAG,GAAG,CAAC;AAExC,MAAM,kBAAkB,GAAG;IACzB,eAAe;IACf,YAAY;IACZ,qBAAqB;IACrB,iBAAiB;IACjB,4BAA4B;CACpB,CAAC;AAiBX,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAgB;IACxC,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;gBAC1D,MAAM,CAAC,GAAI,KAA4B,CAAC,IAAI,CAAC;gBAC7C,IAAI,OAAO,CAAC,KAAK,QAAQ;oBAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3C,CAAC;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACrC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;IACD,IAAI,OAAO,IAAI,IAAI;QAAE,OAAO,EAAE,CAAC;IAC/B,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC;IACxF,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,eAAe,CACtB,OAA4C;IAE5C,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAC5C,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,KAAK,IAAI,kBAAkB,EAAE,CAAC;QACvC,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,IAAI,IAAI,CAAC,CAAC;IACvC,CAAC;IACD,+EAA+E;IAC/E,MAAM,IAAI,GAAG,OAAO,OAAO,CAAC,2BAA2B,CAAC,KAAK,QAAQ;QACnE,CAAC,CAAC,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,OAAO,OAAO,CAAC,2BAA2B,CAAC,KAAK,QAAQ;QACnE,CAAC,CAAC,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,OAAO,OAAO,CAAC,gBAAgB,CAAC,KAAK,QAAQ;QACvD,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IACnD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,OAAO,aAAa;IACP,MAAM,CAAiB;IACvB,UAAU,CAAiB;IAC3B,QAAQ,CAAS;IACjB,YAAY,CAAS;IACrB,gBAAgB,CAAU;IAC1B,gBAAgB,CAAS;IACzB,iBAAiB,CAAS;IAC1B,gBAAgB,CAAS;IAE1C,YAAY,OAA6B;QACvC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,IAAI,iBAAiB,CAAC,CAAC;QACnE,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,8BAA8B,CAAC;QAC3E,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,IAAI,CAAC;QACzD,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,UAAU,CAAC;QAC/D,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,2BAA2B,CAAC;QAClF,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,0BAA0B,CAAC;IACjF,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,QAAgB,EAAE,aAAiC,EAAE;QAC7D,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAC/D,0BAA0B,CAC3B,CAAC;QAEF,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC9D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAExD,MAAM,QAAQ,GAAc;YAC1B,IAAI,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC;YACpC,IAAI,YAAY,CAAC,QAAQ,CAAC;SAC3B,CAAC;QACF,MAAM,SAAS,GAAoB,EAAE,CAAC;QACtC,MAAM,UAAU,GAAW,EAAE,CAAC;QAC9B,IAAI,MAAM,GAAyB,IAAI,CAAC;QAExC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC;YACzD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC7B,MAAM,UAAU,GAAG,OAAO,KAAK,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;YACnE,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC;YAC7E,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YAExD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACtB,IAAI,QAAuB,CAAC;YAC5B,IAAI,CAAC;gBACH,QAAQ,GAAG,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAkB,CAAC;YACnE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;oBACtD,QAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI;iBACnC,CAAC,CAAC;gBACH,MAAM;YACR,CAAC;YACD,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC;YAE9C,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzB,MAAM,GAAG,QAAQ,CAAC;YAClB,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAExB,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC;YAE5C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC;oBACxC,QAAQ,EAAE,YAAY;iBACvB,CAAC,CAAC;gBACH,MAAM;YACR,CAAC;YAED,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;gBAC3B,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;gBAC3B,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC9E,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;gBAEnE,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBAChD,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB;oBACvC,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,IAAI,QAAQ,CAAC;oBACnD,CAAC,CAAC,SAAS,CAAC;gBACd,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;gBAEvF,QAAQ,CAAC,IAAI,CACX,IAAI,WAAW,CAAC;oBACd,OAAO,EAAE,WAAW;oBACpB,YAAY,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE;oBACzB,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,YAAY;iBAC3C,CAAC,CACH,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAC7C,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QAEzE,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,IAAI,EAAE,SAAS;YACf,SAAS;YACT,UAAU;YACV,KAAK;YACL,GAAG,EAAE,MAAM;SACZ,CAAC;IACJ,CAAC;IAED;;;OAGG;IACK,iBAAiB,CAAC,QAAmB;QAC3C,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,WAAW;YAAE,OAAO,QAAQ,CAAC;QAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;QAC3C,IAAI,CAAC,GAAG,EAAE,OAAO;YAAE,OAAO,QAAQ,CAAC;QACnC,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,WAAW;YAAE,OAAO,QAAQ,CAAC;QAEvD,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAGxC,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,CAAC;QAC9B,IAAI,UAAqB,CAAC;QAC1B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,UAAU,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC;QACxE,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxD,UAAU,GAAG,CAAC,GAAI,OAAqB,CAAC,CAAC;YACzC,MAAM,IAAI,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC/C,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC9C,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG;oBAClC,GAAI,IAAgC;oBACpC,aAAa,EAAE,MAAM;iBACtB,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,QAAQ,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtD,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,WAA2D,CAAC;QAC9E,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,IAA6B;QACtD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC/C,IAAI,OAAO,GAAG,KAAK,QAAQ;gBAAE,OAAO,GAAG,CAAC;YACxC,IAAI,GAAG,IAAI,IAAI;gBAAE,OAAO,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,sCAAsC;YACtC,OAAO,CAAC,IAAI,CAAC,2CAA2C,GAAG,eAAe,CAAC,CAAC;YAC5E,OAAO,iBAAiB,GAAG,EAAE,CAAC;QAChC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,KAAa;QAChD,IAAI,CAAC,IAAI,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,iBAAiB;YAAE,OAAO,IAAI,CAAC;QACxE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;QAC3C,IAAI,CAAC,MAAM,EAAE,QAAQ;YAAE,OAAO,IAAI,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;gBACjC,OAAO,EAAE,IAAI;gBACb,KAAK;gBACL,oBAAoB,EAAE,IAAI,CAAC,gBAAgB;aAC5C,CAAC,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,iBAAiB,IAAI,IAAI,EAAE,IAAI,EAAE,kBAAkB,CAAC;YAC3E,OAAO,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,QAAmB;QACvC,IAAI,CAAC,IAAI,CAAC,gBAAgB;YAAE,OAAO;QACnC,MAAM,KAAK,GAAG,GAAG,EAAE,CACjB,QAAQ,CAAC,MAAM,CACb,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,cAAc,CAAC,gBAAgB,CAAE,CAA2B,EAAE,OAAO,CAAC,CAAC,EACzF,CAAC,CACF,CAAC;QACJ,IAAI,GAAG,GAAG,KAAK,EAAE,CAAC;QAClB,IAAI,GAAG,IAAI,IAAI,CAAC,gBAAgB;YAAE,OAAO;QACzC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,OAAO,GAAG,GAAG,IAAI,CAAC,gBAAgB,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACxE,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACtB,GAAG,GAAG,KAAK,EAAE,CAAC;YACd,KAAK,EAAE,CAAC;QACV,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,UAA2B;QAChD,MAAM,MAAM,GAA2B;YACrC,YAAY,EAAE,CAAC;YACf,aAAa,EAAE,CAAC;YAChB,iBAAiB,EAAE,CAAC;YACpB,qBAAqB,EAAE,CAAC;SACzB,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,MAAM,EAAE,GAAG,CAAC,EAAE,cAAc,IAAI,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC,cAAc,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAChF,MAAM,CAAC,eAAe,CAAC,IAAI,OAAO,EAAE,CAAC,eAAe,CAAC,KAAK,QAAQ;gBAChE,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAE9B,MAAM,OAAO,GAAG,EAAE,CAAC,qBAAqB,CAAwC,CAAC;YACjF,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;YAClD,MAAM,CAAC,mBAAmB,CAAC,IAAI,IAAI,CAAC;YACpC,MAAM,CAAC,uBAAuB,CAAC,IAAI,MAAM,CAAC;YAE1C,sEAAsE;YACtE,MAAM,SAAS,GAAG,IAAI,GAAG,MAAM,CAAC;YAChC,MAAM,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO;YACL,YAAY,EAAE,MAAM,CAAC,cAAc,CAAC;YACpC,aAAa,EAAE,MAAM,CAAC,eAAe,CAAC;YACtC,iBAAiB,EAAE,MAAM,CAAC,mBAAmB,CAAC;YAC9C,qBAAqB,EAAE,MAAM,CAAC,uBAAuB,CAAC;YACtD,KAAK,EAAE,UAAU,CAAC,MAAM;SACzB,CAAC;IACJ,CAAC;IAEO,gBAAgB,CAAC,UAAiC,EAAE,UAAkB;QAC5E,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,KAAK,MAAM,CAAC,IAAI,UAAU;YAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,2BAA2B,CAAC;QAC1C,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,IAAI,CAAC,IAAI,CAAC,IAAI;gBAAE,SAAS;YACxD,IAAI,CAAyB,CAAC;YAC9B,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC5C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACtC,CAAC;CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** `client.research` facade — thin wrapper over `ResearchAgent`. */
|
|
2
|
+
import type { ResearchAgentOptions } from './agent.js';
|
|
3
|
+
import type { ResearchResult } from './types.js';
|
|
4
|
+
export interface ResearchRunOptions {
|
|
5
|
+
search?: string | ResearchAgentOptions['searchTool'];
|
|
6
|
+
maxSteps?: number;
|
|
7
|
+
model?: string;
|
|
8
|
+
compressSnippets?: boolean;
|
|
9
|
+
compressionModel?: string;
|
|
10
|
+
minCompressTokens?: number;
|
|
11
|
+
maxContextTokens?: number;
|
|
12
|
+
systemPrompt?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare class ResearchFacade {
|
|
15
|
+
private readonly engine;
|
|
16
|
+
constructor(engine: ResearchAgentOptions['engine']);
|
|
17
|
+
run(question: string, options?: ResearchRunOptions): Promise<ResearchResult>;
|
|
18
|
+
/** Single-shot: one search + forced answer (`maxSteps=2`). */
|
|
19
|
+
search(question: string, options?: Omit<ResearchRunOptions, 'maxSteps'>): Promise<ResearchResult>;
|
|
20
|
+
private resolveSearchTool;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=facade.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"facade.d.ts","sourceRoot":"","sources":["../../../../src/agents/research/facade.ts"],"names":[],"mappings":"AAAA,oEAAoE;AAGpE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAOjD,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,GAAG,oBAAoB,CAAC,YAAY,CAAC,CAAC;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;gBAE5C,MAAM,EAAE,oBAAoB,CAAC,QAAQ,CAAC;IAI5C,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,cAAc,CAAC;IAetF,8DAA8D;IACxD,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,CAAM,GAAG,OAAO,CAAC,cAAc,CAAC;YAI7F,iBAAiB;CA0BhC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/** `client.research` facade — thin wrapper over `ResearchAgent`. */
|
|
2
|
+
import { ResearchAgent } from './agent.js';
|
|
3
|
+
const SEARCH_PROVIDER_ENV = {
|
|
4
|
+
tavily: ['TAVILY_API_KEY'],
|
|
5
|
+
brave: ['BRAVE_SEARCH_API_KEY', 'BRAVE_API_KEY'],
|
|
6
|
+
};
|
|
7
|
+
export class ResearchFacade {
|
|
8
|
+
engine;
|
|
9
|
+
constructor(engine) {
|
|
10
|
+
this.engine = engine;
|
|
11
|
+
}
|
|
12
|
+
async run(question, options = {}) {
|
|
13
|
+
const tool = await this.resolveSearchTool(options.search ?? 'tavily');
|
|
14
|
+
const agent = new ResearchAgent({
|
|
15
|
+
engine: this.engine,
|
|
16
|
+
searchTool: tool,
|
|
17
|
+
maxSteps: options.maxSteps ?? 10,
|
|
18
|
+
...(options.systemPrompt !== undefined ? { systemPrompt: options.systemPrompt } : {}),
|
|
19
|
+
compressSnippets: options.compressSnippets ?? true,
|
|
20
|
+
compressionModel: options.compressionModel ?? 'latte_v1',
|
|
21
|
+
minCompressTokens: options.minCompressTokens ?? 100,
|
|
22
|
+
maxContextTokens: options.maxContextTokens ?? 120_000,
|
|
23
|
+
});
|
|
24
|
+
return agent.run(question, options.model !== undefined ? { model: options.model } : {});
|
|
25
|
+
}
|
|
26
|
+
/** Single-shot: one search + forced answer (`maxSteps=2`). */
|
|
27
|
+
async search(question, options = {}) {
|
|
28
|
+
return this.run(question, { ...options, maxSteps: 2 });
|
|
29
|
+
}
|
|
30
|
+
async resolveSearchTool(search) {
|
|
31
|
+
if (typeof search !== 'string')
|
|
32
|
+
return search;
|
|
33
|
+
const provider = search.toLowerCase();
|
|
34
|
+
if (!(provider in SEARCH_PROVIDER_ENV)) {
|
|
35
|
+
throw new Error(`unsupported search provider '${search}'; expected one of ${Object.keys(SEARCH_PROVIDER_ENV).join(', ')} or a LangChain tool`);
|
|
36
|
+
}
|
|
37
|
+
const { WebSearchTool } = await import('../tools/web-search.js');
|
|
38
|
+
let apiKey;
|
|
39
|
+
for (const env of SEARCH_PROVIDER_ENV[provider]) {
|
|
40
|
+
const v = process.env[env];
|
|
41
|
+
if (v) {
|
|
42
|
+
apiKey = v;
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const opts = apiKey !== undefined ? { apiKey } : {};
|
|
47
|
+
const tool = provider === 'tavily'
|
|
48
|
+
? await WebSearchTool.tavily(opts)
|
|
49
|
+
: await WebSearchTool.brave(opts);
|
|
50
|
+
return tool;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=facade.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"facade.js","sourceRoot":"","sources":["../../../../src/agents/research/facade.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compresr research agent — multi-step web search with per-snippet compression.
|
|
3
|
+
*
|
|
4
|
+
* Public entry: `client.research.run(question)`.
|
|
5
|
+
* Loop structure adapted from Perplexity `search_evals` (MIT,
|
|
6
|
+
* https://github.com/perplexityai/search_evals).
|
|
7
|
+
*/
|
|
8
|
+
export { ResearchAgent } from './agent.js';
|
|
9
|
+
export type { ResearchAgentOptions, ResearchRunOptions as ResearchAgentRunOptions } from './agent.js';
|
|
10
|
+
export { ResearchFacade } from './facade.js';
|
|
11
|
+
export type { ResearchRunOptions } from './facade.js';
|
|
12
|
+
export { parseResearchOutput } from './parser.js';
|
|
13
|
+
export type { ParsedResearch } from './parser.js';
|
|
14
|
+
export { DEFAULT_RESEARCH_SYSTEM_PROMPT } from './prompts.js';
|
|
15
|
+
export type { Citation, ResearchResult, ResearchUsage, Step, StepKind, } from './types.js';
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/agents/research/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,YAAY,EAAE,oBAAoB,EAAE,kBAAkB,IAAI,uBAAuB,EAAE,MAAM,YAAY,CAAC;AACtG,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,8BAA8B,EAAE,MAAM,cAAc,CAAC;AAC9D,YAAY,EACV,QAAQ,EACR,cAAc,EACd,aAAa,EACb,IAAI,EACJ,QAAQ,GACT,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compresr research agent — multi-step web search with per-snippet compression.
|
|
3
|
+
*
|
|
4
|
+
* Public entry: `client.research.run(question)`.
|
|
5
|
+
* Loop structure adapted from Perplexity `search_evals` (MIT,
|
|
6
|
+
* https://github.com/perplexityai/search_evals).
|
|
7
|
+
*/
|
|
8
|
+
export { ResearchAgent } from './agent.js';
|
|
9
|
+
export { ResearchFacade } from './facade.js';
|
|
10
|
+
export { parseResearchOutput } from './parser.js';
|
|
11
|
+
export { DEFAULT_RESEARCH_SYSTEM_PROMPT } from './prompts.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/agents/research/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAAE,8BAA8B,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Parse the strict-format final response into structured fields. */
|
|
2
|
+
export interface ParsedResearch {
|
|
3
|
+
readonly answer: string;
|
|
4
|
+
readonly explanation: string;
|
|
5
|
+
readonly confidence: number | null;
|
|
6
|
+
readonly citationUrls: ReadonlyArray<string>;
|
|
7
|
+
}
|
|
8
|
+
export declare function parseResearchOutput(text: string): ParsedResearch;
|
|
9
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../../src/agents/research/parser.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAErE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC9C;AAcD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CA6BhE"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/** Parse the strict-format final response into structured fields. */
|
|
2
|
+
const FIELD_PATTERNS = {
|
|
3
|
+
explanation: /^\s*explanation\s*:\s*([\s\S]+?)(?=^\s*(?:exact\s+answer|confidence|citations)\s*:|\s*$)/im,
|
|
4
|
+
answer: /^\s*exact\s+answer\s*:\s*([\s\S]+?)(?=^\s*(?:explanation|confidence|citations)\s*:|\s*$)/im,
|
|
5
|
+
confidence: /^\s*confidence\s*:\s*([\s\S]+?)(?=^\s*(?:explanation|exact\s+answer|citations)\s*:|\s*$)/im,
|
|
6
|
+
citations: /^\s*citations\s*:\s*([\s\S]+?)\s*$/im,
|
|
7
|
+
};
|
|
8
|
+
function grab(text, name) {
|
|
9
|
+
const m = FIELD_PATTERNS[name].exec(text);
|
|
10
|
+
return m ? m[1].trim() : '';
|
|
11
|
+
}
|
|
12
|
+
export function parseResearchOutput(text) {
|
|
13
|
+
if (!text) {
|
|
14
|
+
return { answer: '', explanation: '', confidence: null, citationUrls: [] };
|
|
15
|
+
}
|
|
16
|
+
const answer = grab(text, 'answer');
|
|
17
|
+
const explanation = grab(text, 'explanation');
|
|
18
|
+
const confidenceRaw = grab(text, 'confidence');
|
|
19
|
+
const citationsRaw = grab(text, 'citations');
|
|
20
|
+
let confidence = null;
|
|
21
|
+
if (confidenceRaw) {
|
|
22
|
+
const m = /(\d+(?:\.\d+)?)/.exec(confidenceRaw);
|
|
23
|
+
if (m) {
|
|
24
|
+
const v = parseFloat(m[1]);
|
|
25
|
+
confidence = v > 1 ? v / 100 : v;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const citationUrls = [];
|
|
29
|
+
if (citationsRaw) {
|
|
30
|
+
const urlRe = /https?:\/\/[^\s,;<>"')]+/g;
|
|
31
|
+
let m;
|
|
32
|
+
while ((m = urlRe.exec(citationsRaw)) !== null) {
|
|
33
|
+
if (!citationUrls.includes(m[0]))
|
|
34
|
+
citationUrls.push(m[0]);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return { answer, explanation, confidence, citationUrls };
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../../src/agents/research/parser.ts"],"names":[],"mappings":"AAAA,qEAAqE;AASrE,MAAM,cAAc,GAA2B;IAC7C,WAAW,EAAE,4FAA4F;IACzG,MAAM,EAAE,4FAA4F;IACpG,UAAU,EAAE,4FAA4F;IACxG,SAAS,EAAE,sCAAsC;CAClD,CAAC;AAEF,SAAS,IAAI,CAAC,IAAY,EAAE,IAAY;IACtC,MAAM,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;IAC7E,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACpC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAC9C,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC/C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAE7C,IAAI,UAAU,GAAkB,IAAI,CAAC;IACrC,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAChD,IAAI,CAAC,EAAE,CAAC;YACN,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3B,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,2BAA2B,CAAC;QAC1C,IAAI,CAAyB,CAAC;QAC9B,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC/C,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default system prompt — adapted from Perplexity `search_evals` (MIT,
|
|
3
|
+
* https://github.com/perplexityai/search_evals/blob/main/search_evals/agents/deep_research.py).
|
|
4
|
+
*/
|
|
5
|
+
export declare const DEFAULT_RESEARCH_SYSTEM_PROMPT = "You are a research agent. The user will ask you a specific question whose answer cannot be reliably produced from your internal weights (hallucination risk is high), and that takes several steps of web research to resolve.\n\n## Tool\nsearch_web(query: str) \u2014 Search the web with a single query. Returns titles, URLs, and snippets.\n\n## Query format\nWrite queries for a modern keyword/semantic search engine, not for an LLM:\n- Keep them focused \u2014 search is a limited budget.\n- Do not rely on quotes, brackets, or special syntax.\n- Natural language is fine; keyword strings are fine too.\n\n## Solution strategy\nYou have a hard search budget. At each step, decrement the counter and plan ahead how you will spend what is left. Ask yourself: did this SERP bring me closer to the answer? If not, and rephrasing didn't help, explicitly say you're switching hypothesis and pursue a different direction.\n\n## General web-search recommendations\n- One query at a time.\n- Cross-verify across sources before committing.\n- If sources conflict, search more to resolve the conflict.\n- Never assert a claim you don't have a source for.\n\n## Response format (mandatory)\nWhen you are done researching, end your response with exactly these fields in this order:\n\nExplanation: <your research process and the key findings from each source>\nExact Answer: <the precise final answer, or \"I don't know\" if you couldn't find it>\nConfidence: <0-100%>\nCitations: <comma-separated list of URLs you actually relied on>\n";
|
|
6
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../../src/agents/research/prompts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,8BAA8B,u/CA2B1C,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default system prompt — adapted from Perplexity `search_evals` (MIT,
|
|
3
|
+
* https://github.com/perplexityai/search_evals/blob/main/search_evals/agents/deep_research.py).
|
|
4
|
+
*/
|
|
5
|
+
export const DEFAULT_RESEARCH_SYSTEM_PROMPT = `You are a research agent. The user will ask you a specific question whose answer cannot be reliably produced from your internal weights (hallucination risk is high), and that takes several steps of web research to resolve.
|
|
6
|
+
|
|
7
|
+
## Tool
|
|
8
|
+
search_web(query: str) — Search the web with a single query. Returns titles, URLs, and snippets.
|
|
9
|
+
|
|
10
|
+
## Query format
|
|
11
|
+
Write queries for a modern keyword/semantic search engine, not for an LLM:
|
|
12
|
+
- Keep them focused — search is a limited budget.
|
|
13
|
+
- Do not rely on quotes, brackets, or special syntax.
|
|
14
|
+
- Natural language is fine; keyword strings are fine too.
|
|
15
|
+
|
|
16
|
+
## Solution strategy
|
|
17
|
+
You have a hard search budget. At each step, decrement the counter and plan ahead how you will spend what is left. Ask yourself: did this SERP bring me closer to the answer? If not, and rephrasing didn't help, explicitly say you're switching hypothesis and pursue a different direction.
|
|
18
|
+
|
|
19
|
+
## General web-search recommendations
|
|
20
|
+
- One query at a time.
|
|
21
|
+
- Cross-verify across sources before committing.
|
|
22
|
+
- If sources conflict, search more to resolve the conflict.
|
|
23
|
+
- Never assert a claim you don't have a source for.
|
|
24
|
+
|
|
25
|
+
## Response format (mandatory)
|
|
26
|
+
When you are done researching, end your response with exactly these fields in this order:
|
|
27
|
+
|
|
28
|
+
Explanation: <your research process and the key findings from each source>
|
|
29
|
+
Exact Answer: <the precise final answer, or "I don't know" if you couldn't find it>
|
|
30
|
+
Confidence: <0-100%>
|
|
31
|
+
Citations: <comma-separated list of URLs you actually relied on>
|
|
32
|
+
`;
|
|
33
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../../src/agents/research/prompts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2B7C,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/** Public types returned by `ResearchAgent.run(...)`. */
|
|
2
|
+
export interface Citation {
|
|
3
|
+
readonly url: string;
|
|
4
|
+
readonly title?: string;
|
|
5
|
+
readonly snippet?: string;
|
|
6
|
+
}
|
|
7
|
+
export type StepKind = 'search' | 'tool_result' | 'answer' | 'error';
|
|
8
|
+
export interface Step {
|
|
9
|
+
readonly type: StepKind;
|
|
10
|
+
readonly query?: string;
|
|
11
|
+
readonly text?: string;
|
|
12
|
+
readonly chars?: number;
|
|
13
|
+
readonly latencyS?: number;
|
|
14
|
+
}
|
|
15
|
+
export interface ResearchUsage {
|
|
16
|
+
readonly input_tokens: number;
|
|
17
|
+
readonly output_tokens: number;
|
|
18
|
+
readonly cache_read_tokens: number;
|
|
19
|
+
readonly cache_creation_tokens: number;
|
|
20
|
+
readonly calls: number;
|
|
21
|
+
}
|
|
22
|
+
export interface ResearchResult {
|
|
23
|
+
readonly answer: string;
|
|
24
|
+
readonly explanation: string;
|
|
25
|
+
readonly confidence: number | null;
|
|
26
|
+
readonly text: string;
|
|
27
|
+
readonly citations: ReadonlyArray<Citation>;
|
|
28
|
+
readonly trajectory: ReadonlyArray<Step>;
|
|
29
|
+
readonly usage: ResearchUsage;
|
|
30
|
+
readonly raw: unknown;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/agents/research/types.ts"],"names":[],"mappings":"AAAA,yDAAyD;AAEzD,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAC;AAErE,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC5C,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;CACvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/agents/research/types.ts"],"names":[],"mappings":"AAAA,yDAAyD"}
|