@compresr/sdk 1.5.4 → 1.6.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/README.md +35 -0
- package/dist/cjs/agents/engine.d.ts +67 -0
- package/dist/cjs/agents/engine.d.ts.map +1 -1
- package/dist/cjs/agents/engine.js +262 -9
- package/dist/cjs/agents/engine.js.map +1 -1
- package/dist/cjs/agents/research/agent.d.ts +112 -0
- package/dist/cjs/agents/research/agent.d.ts.map +1 -0
- package/dist/cjs/agents/research/agent.js +342 -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 +67 -0
- package/dist/esm/agents/engine.d.ts.map +1 -1
- package/dist/esm/agents/engine.js +259 -8
- package/dist/esm/agents/engine.js.map +1 -1
- package/dist/esm/agents/research/agent.d.ts +112 -0
- package/dist/esm/agents/research/agent.d.ts.map +1 -0
- package/dist/esm/agents/research/agent.js +305 -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,112 @@
|
|
|
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 type { ResearchResult, Step } from './types.js';
|
|
9
|
+
interface CompresrClientLike {
|
|
10
|
+
compress(opts: {
|
|
11
|
+
context: string;
|
|
12
|
+
query?: string;
|
|
13
|
+
compressionModelName?: string;
|
|
14
|
+
}): Promise<{
|
|
15
|
+
data?: {
|
|
16
|
+
compressedContext?: string;
|
|
17
|
+
compressed_context?: string;
|
|
18
|
+
};
|
|
19
|
+
}>;
|
|
20
|
+
}
|
|
21
|
+
export interface ChatModelLike {
|
|
22
|
+
bindTools(tools: ReadonlyArray<unknown>, options: {
|
|
23
|
+
tool_choice: string;
|
|
24
|
+
}): {
|
|
25
|
+
invoke(messages: unknown[]): Promise<unknown>;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export interface SearchToolLike {
|
|
29
|
+
name?: string;
|
|
30
|
+
invoke(args: Record<string, unknown>): Promise<unknown>;
|
|
31
|
+
}
|
|
32
|
+
export interface ResearchEngine {
|
|
33
|
+
readonly provider: string;
|
|
34
|
+
readonly defaultModelName?: string;
|
|
35
|
+
_resolveModel(model?: string): string;
|
|
36
|
+
_getChatModel(modelName: string): Promise<ChatModelLike>;
|
|
37
|
+
readonly _compresrClient: CompresrClientLike;
|
|
38
|
+
readonly _promptCacheConfig: {
|
|
39
|
+
readonly enabled: boolean;
|
|
40
|
+
readonly ttl: '5m' | '1h';
|
|
41
|
+
readonly minMessages: number;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
interface AIMessageLike {
|
|
45
|
+
content?: unknown;
|
|
46
|
+
tool_calls?: ReadonlyArray<{
|
|
47
|
+
id?: string;
|
|
48
|
+
name?: string;
|
|
49
|
+
args?: Record<string, unknown>;
|
|
50
|
+
}>;
|
|
51
|
+
usage_metadata?: Record<string, unknown>;
|
|
52
|
+
}
|
|
53
|
+
export interface ResearchAgentOptions {
|
|
54
|
+
engine: ResearchEngine;
|
|
55
|
+
searchTool: SearchToolLike;
|
|
56
|
+
maxSteps?: number;
|
|
57
|
+
systemPrompt?: string;
|
|
58
|
+
compressSnippets?: boolean;
|
|
59
|
+
compressionModel?: string;
|
|
60
|
+
minCompressTokens?: number;
|
|
61
|
+
maxContextTokens?: number;
|
|
62
|
+
}
|
|
63
|
+
export interface ResearchRunOptions {
|
|
64
|
+
model?: string;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Internal result of {@link ResearchAgent._runLoop}.
|
|
68
|
+
*
|
|
69
|
+
* Exposed to the engine's solo-WebSearchTool fast-path so it can feed the
|
|
70
|
+
* raw message chain to {@link CompresrEngine._normalize}, while {@link ResearchAgent.run}
|
|
71
|
+
* keeps producing a typed {@link ResearchResult}.
|
|
72
|
+
*/
|
|
73
|
+
export interface ResearchLoopState {
|
|
74
|
+
messages: unknown[];
|
|
75
|
+
aiHistory: AIMessageLike[];
|
|
76
|
+
trajectory: Step[];
|
|
77
|
+
lastAi: AIMessageLike | null;
|
|
78
|
+
}
|
|
79
|
+
export declare class ResearchAgent {
|
|
80
|
+
private readonly engine;
|
|
81
|
+
private readonly searchTool;
|
|
82
|
+
private readonly maxSteps;
|
|
83
|
+
private readonly systemPrompt;
|
|
84
|
+
private readonly compressSnippets;
|
|
85
|
+
private readonly compressionModel;
|
|
86
|
+
private readonly minCompressTokens;
|
|
87
|
+
private readonly maxContextTokens;
|
|
88
|
+
constructor(options: ResearchAgentOptions);
|
|
89
|
+
run(question: string, runOptions?: ResearchRunOptions): Promise<ResearchResult>;
|
|
90
|
+
/**
|
|
91
|
+
* Execute the strict-output ReAct loop and return raw state.
|
|
92
|
+
*
|
|
93
|
+
* Shared by {@link run} (which parses ``ResearchResult``) and the engine's
|
|
94
|
+
* solo-WebSearchTool fast-path (which feeds ``state.messages`` into
|
|
95
|
+
* the engine's normalizer).
|
|
96
|
+
*
|
|
97
|
+
* @internal — public for the engine's fast-path; not a stable surface.
|
|
98
|
+
*/
|
|
99
|
+
_runLoop(question: string, runOptions?: ResearchRunOptions): Promise<ResearchLoopState>;
|
|
100
|
+
/**
|
|
101
|
+
* Mirrors AnthropicPromptCachingMiddleware for the bypass path — research
|
|
102
|
+
* doesn't go through createAgent so we stamp cache_control manually.
|
|
103
|
+
*/
|
|
104
|
+
private applyCacheControl;
|
|
105
|
+
private invokeSearch;
|
|
106
|
+
private compress;
|
|
107
|
+
private maybeTruncate;
|
|
108
|
+
private aggregateUsage;
|
|
109
|
+
private collectCitations;
|
|
110
|
+
}
|
|
111
|
+
export {};
|
|
112
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../../src/agents/research/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `ResearchAgent` — strict-output ReAct loop with per-snippet compression.
|
|
4
|
+
*
|
|
5
|
+
* Mirrors the Python implementation in `compresr/agents/research/agent.py`.
|
|
6
|
+
* Bypasses `_Engine.run` so we can set `tool_choice` per step and compress
|
|
7
|
+
* each tool result before it enters the conversation.
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
26
|
+
var ownKeys = function(o) {
|
|
27
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
28
|
+
var ar = [];
|
|
29
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
30
|
+
return ar;
|
|
31
|
+
};
|
|
32
|
+
return ownKeys(o);
|
|
33
|
+
};
|
|
34
|
+
return function (mod) {
|
|
35
|
+
if (mod && mod.__esModule) return mod;
|
|
36
|
+
var result = {};
|
|
37
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
38
|
+
__setModuleDefault(result, mod);
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
})();
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.ResearchAgent = void 0;
|
|
44
|
+
const parser_js_1 = require("./parser.js");
|
|
45
|
+
const prompts_js_1 = require("./prompts.js");
|
|
46
|
+
const DEFAULT_MAX_CONTEXT_TOKENS = 120_000;
|
|
47
|
+
const DEFAULT_MAX_STEPS = 10;
|
|
48
|
+
const DEFAULT_MIN_COMPRESS_TOKENS = 100;
|
|
49
|
+
const CACHE_READ_ALIASES = [
|
|
50
|
+
'cached_tokens',
|
|
51
|
+
'cache_read',
|
|
52
|
+
'priority_cache_read',
|
|
53
|
+
'flex_cache_read',
|
|
54
|
+
'cached_content_token_count',
|
|
55
|
+
];
|
|
56
|
+
function estimateTokens(text) {
|
|
57
|
+
return Math.max(1, Math.floor(text.length / 4));
|
|
58
|
+
}
|
|
59
|
+
function stringifyContent(content) {
|
|
60
|
+
if (typeof content === 'string')
|
|
61
|
+
return content;
|
|
62
|
+
if (Array.isArray(content)) {
|
|
63
|
+
const parts = [];
|
|
64
|
+
for (const block of content) {
|
|
65
|
+
if (block && typeof block === 'object' && 'text' in block) {
|
|
66
|
+
const t = block.text;
|
|
67
|
+
if (typeof t === 'string')
|
|
68
|
+
parts.push(t);
|
|
69
|
+
}
|
|
70
|
+
else if (typeof block === 'string') {
|
|
71
|
+
parts.push(block);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return parts.join('');
|
|
75
|
+
}
|
|
76
|
+
if (content == null)
|
|
77
|
+
return '';
|
|
78
|
+
if (typeof content === 'number' || typeof content === 'boolean')
|
|
79
|
+
return String(content);
|
|
80
|
+
return JSON.stringify(content);
|
|
81
|
+
}
|
|
82
|
+
function readCacheTokens(details) {
|
|
83
|
+
if (!details)
|
|
84
|
+
return { read: 0, create: 0 };
|
|
85
|
+
let read = 0;
|
|
86
|
+
for (const alias of CACHE_READ_ALIASES) {
|
|
87
|
+
const v = details[alias];
|
|
88
|
+
if (typeof v === 'number')
|
|
89
|
+
read += v;
|
|
90
|
+
}
|
|
91
|
+
// langchain-anthropic zeros ``cache_creation`` when ttl-specific keys are set.
|
|
92
|
+
const ttl5 = typeof details['ephemeral_5m_input_tokens'] === 'number'
|
|
93
|
+
? (details['ephemeral_5m_input_tokens']) : 0;
|
|
94
|
+
const ttl1 = typeof details['ephemeral_1h_input_tokens'] === 'number'
|
|
95
|
+
? (details['ephemeral_1h_input_tokens']) : 0;
|
|
96
|
+
const gen = typeof details['cache_creation'] === 'number'
|
|
97
|
+
? (details['cache_creation']) : 0;
|
|
98
|
+
const create = ttl5 + ttl1 > 0 ? ttl5 + ttl1 : gen;
|
|
99
|
+
return { read, create };
|
|
100
|
+
}
|
|
101
|
+
class ResearchAgent {
|
|
102
|
+
engine;
|
|
103
|
+
searchTool;
|
|
104
|
+
maxSteps;
|
|
105
|
+
systemPrompt;
|
|
106
|
+
compressSnippets;
|
|
107
|
+
compressionModel;
|
|
108
|
+
minCompressTokens;
|
|
109
|
+
maxContextTokens;
|
|
110
|
+
constructor(options) {
|
|
111
|
+
this.engine = options.engine;
|
|
112
|
+
this.searchTool = options.searchTool;
|
|
113
|
+
this.maxSteps = Math.max(1, options.maxSteps ?? DEFAULT_MAX_STEPS);
|
|
114
|
+
this.systemPrompt = options.systemPrompt ?? prompts_js_1.DEFAULT_RESEARCH_SYSTEM_PROMPT;
|
|
115
|
+
this.compressSnippets = options.compressSnippets ?? true;
|
|
116
|
+
this.compressionModel = options.compressionModel ?? 'latte_v1';
|
|
117
|
+
this.minCompressTokens = options.minCompressTokens ?? DEFAULT_MIN_COMPRESS_TOKENS;
|
|
118
|
+
this.maxContextTokens = options.maxContextTokens ?? DEFAULT_MAX_CONTEXT_TOKENS;
|
|
119
|
+
}
|
|
120
|
+
async run(question, runOptions = {}) {
|
|
121
|
+
const state = await this._runLoop(question, runOptions);
|
|
122
|
+
const usage = this.aggregateUsage(state.aiHistory);
|
|
123
|
+
const finalText = state.lastAi ? stringifyContent(state.lastAi.content) : '';
|
|
124
|
+
const parsed = (0, parser_js_1.parseResearchOutput)(finalText);
|
|
125
|
+
const citations = this.collectCitations(parsed.citationUrls, state.trajectory);
|
|
126
|
+
return {
|
|
127
|
+
answer: parsed.answer,
|
|
128
|
+
explanation: parsed.explanation,
|
|
129
|
+
confidence: parsed.confidence,
|
|
130
|
+
text: finalText,
|
|
131
|
+
citations,
|
|
132
|
+
trajectory: state.trajectory,
|
|
133
|
+
usage,
|
|
134
|
+
raw: state.lastAi,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Execute the strict-output ReAct loop and return raw state.
|
|
139
|
+
*
|
|
140
|
+
* Shared by {@link run} (which parses ``ResearchResult``) and the engine's
|
|
141
|
+
* solo-WebSearchTool fast-path (which feeds ``state.messages`` into
|
|
142
|
+
* the engine's normalizer).
|
|
143
|
+
*
|
|
144
|
+
* @internal — public for the engine's fast-path; not a stable surface.
|
|
145
|
+
*/
|
|
146
|
+
async _runLoop(question, runOptions = {}) {
|
|
147
|
+
const { SystemMessage, HumanMessage, ToolMessage } = await Promise.resolve().then(() => __importStar(require('@langchain/core/messages')));
|
|
148
|
+
const modelName = this.engine._resolveModel(runOptions.model);
|
|
149
|
+
const chat = await this.engine._getChatModel(modelName);
|
|
150
|
+
const messages = [
|
|
151
|
+
new SystemMessage(this.systemPrompt),
|
|
152
|
+
new HumanMessage(question),
|
|
153
|
+
];
|
|
154
|
+
const aiHistory = [];
|
|
155
|
+
const trajectory = [];
|
|
156
|
+
let lastAi = null;
|
|
157
|
+
for (let stepIdx = 0; stepIdx < this.maxSteps; stepIdx++) {
|
|
158
|
+
this.maybeTruncate(messages);
|
|
159
|
+
const toolChoice = stepIdx === this.maxSteps - 1 ? 'none' : 'auto';
|
|
160
|
+
const bound = chat.bindTools([this.searchTool], { tool_choice: toolChoice });
|
|
161
|
+
const invokeMessages = this.applyCacheControl(messages);
|
|
162
|
+
const t0 = Date.now();
|
|
163
|
+
let response;
|
|
164
|
+
try {
|
|
165
|
+
response = (await bound.invoke(invokeMessages));
|
|
166
|
+
}
|
|
167
|
+
catch (exc) {
|
|
168
|
+
trajectory.push({
|
|
169
|
+
type: 'error',
|
|
170
|
+
text: exc instanceof Error ? exc.message : String(exc),
|
|
171
|
+
latencyS: (Date.now() - t0) / 1000,
|
|
172
|
+
});
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
const stepLatencyS = (Date.now() - t0) / 1000;
|
|
176
|
+
aiHistory.push(response);
|
|
177
|
+
lastAi = response;
|
|
178
|
+
messages.push(response);
|
|
179
|
+
const toolCalls = response.tool_calls ?? [];
|
|
180
|
+
if (toolCalls.length === 0) {
|
|
181
|
+
trajectory.push({
|
|
182
|
+
type: 'answer',
|
|
183
|
+
text: stringifyContent(response.content),
|
|
184
|
+
latencyS: stepLatencyS,
|
|
185
|
+
});
|
|
186
|
+
break;
|
|
187
|
+
}
|
|
188
|
+
for (const tc of toolCalls) {
|
|
189
|
+
const args = tc.args ?? {};
|
|
190
|
+
const query = typeof args['query'] === 'string' ? (args['query']) : undefined;
|
|
191
|
+
trajectory.push({ type: 'search', query, latencyS: stepLatencyS });
|
|
192
|
+
const rawResult = await this.invokeSearch(args);
|
|
193
|
+
const finalResult = this.compressSnippets
|
|
194
|
+
? await this.compress(rawResult, query ?? question)
|
|
195
|
+
: rawResult;
|
|
196
|
+
trajectory.push({ type: 'tool_result', chars: finalResult.length, text: finalResult });
|
|
197
|
+
messages.push(new ToolMessage({
|
|
198
|
+
content: finalResult,
|
|
199
|
+
tool_call_id: tc.id ?? '',
|
|
200
|
+
name: this.searchTool.name ?? 'search_web',
|
|
201
|
+
}));
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return { messages, aiHistory, trajectory, lastAi };
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Mirrors AnthropicPromptCachingMiddleware for the bypass path — research
|
|
208
|
+
* doesn't go through createAgent so we stamp cache_control manually.
|
|
209
|
+
*/
|
|
210
|
+
applyCacheControl(messages) {
|
|
211
|
+
if (this.engine.provider !== 'anthropic')
|
|
212
|
+
return messages;
|
|
213
|
+
const cfg = this.engine._promptCacheConfig;
|
|
214
|
+
if (!cfg?.enabled)
|
|
215
|
+
return messages;
|
|
216
|
+
if (messages.length < cfg.minMessages)
|
|
217
|
+
return messages;
|
|
218
|
+
const marker = { type: 'ephemeral', ttl: cfg.ttl };
|
|
219
|
+
const last = messages[messages.length - 1];
|
|
220
|
+
const content = last?.content;
|
|
221
|
+
let newContent;
|
|
222
|
+
if (typeof content === 'string') {
|
|
223
|
+
newContent = [{ type: 'text', text: content, cache_control: marker }];
|
|
224
|
+
}
|
|
225
|
+
else if (Array.isArray(content) && content.length > 0) {
|
|
226
|
+
newContent = [...content];
|
|
227
|
+
const tail = newContent[newContent.length - 1];
|
|
228
|
+
if (tail !== null && typeof tail === 'object') {
|
|
229
|
+
newContent[newContent.length - 1] = {
|
|
230
|
+
...tail,
|
|
231
|
+
cache_control: marker,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
const tailText = typeof tail === 'string' ? tail : '';
|
|
236
|
+
newContent.push({ type: 'text', text: tailText, cache_control: marker });
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
return messages;
|
|
241
|
+
}
|
|
242
|
+
const Ctor = last.constructor;
|
|
243
|
+
const patched = new Ctor({ content: newContent });
|
|
244
|
+
return [...messages.slice(0, -1), patched];
|
|
245
|
+
}
|
|
246
|
+
async invokeSearch(args) {
|
|
247
|
+
try {
|
|
248
|
+
const out = await this.searchTool.invoke(args);
|
|
249
|
+
if (typeof out === 'string')
|
|
250
|
+
return out;
|
|
251
|
+
if (out == null)
|
|
252
|
+
return '';
|
|
253
|
+
return JSON.stringify(out);
|
|
254
|
+
}
|
|
255
|
+
catch (exc) {
|
|
256
|
+
const msg = exc instanceof Error ? exc.message : String(exc);
|
|
257
|
+
// eslint-disable-next-line no-console
|
|
258
|
+
console.warn(`[compresr.research] search tool raised: ${msg}; continuing.`);
|
|
259
|
+
return `Search error: ${msg}`;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
async compress(text, query) {
|
|
263
|
+
if (!text || estimateTokens(text) < this.minCompressTokens)
|
|
264
|
+
return text;
|
|
265
|
+
const client = this.engine._compresrClient;
|
|
266
|
+
if (!client?.compress)
|
|
267
|
+
return text;
|
|
268
|
+
try {
|
|
269
|
+
const resp = await client.compress({
|
|
270
|
+
context: text,
|
|
271
|
+
query,
|
|
272
|
+
compressionModelName: this.compressionModel,
|
|
273
|
+
});
|
|
274
|
+
const cc = resp?.data?.compressedContext ?? resp?.data?.compressed_context;
|
|
275
|
+
return typeof cc === 'string' && cc.length > 0 ? cc : text;
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
return text;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
maybeTruncate(messages) {
|
|
282
|
+
if (!this.maxContextTokens)
|
|
283
|
+
return;
|
|
284
|
+
const total = () => messages.reduce((acc, m) => acc + estimateTokens(stringifyContent(m?.content)), 0);
|
|
285
|
+
let cur = total();
|
|
286
|
+
if (cur <= this.maxContextTokens)
|
|
287
|
+
return;
|
|
288
|
+
let guard = 0;
|
|
289
|
+
while (cur > this.maxContextTokens && messages.length >= 4 && guard < 4) {
|
|
290
|
+
messages.splice(2, 2);
|
|
291
|
+
cur = total();
|
|
292
|
+
guard++;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
aggregateUsage(aiMessages) {
|
|
296
|
+
const totals = {
|
|
297
|
+
input_tokens: 0,
|
|
298
|
+
output_tokens: 0,
|
|
299
|
+
cache_read_tokens: 0,
|
|
300
|
+
cache_creation_tokens: 0,
|
|
301
|
+
};
|
|
302
|
+
for (const m of aiMessages) {
|
|
303
|
+
const um = m?.usage_metadata ?? {};
|
|
304
|
+
const inTok = typeof um['input_tokens'] === 'number' ? (um['input_tokens']) : 0;
|
|
305
|
+
totals['output_tokens'] += typeof um['output_tokens'] === 'number'
|
|
306
|
+
? (um['output_tokens']) : 0;
|
|
307
|
+
const details = um['input_token_details'];
|
|
308
|
+
const { read, create } = readCacheTokens(details);
|
|
309
|
+
totals['cache_read_tokens'] += read;
|
|
310
|
+
totals['cache_creation_tokens'] += create;
|
|
311
|
+
// langchain-anthropic 1.x inflates input_tokens to fresh+read+create.
|
|
312
|
+
const overcount = read + create;
|
|
313
|
+
totals['input_tokens'] += Math.max(0, inTok - overcount);
|
|
314
|
+
}
|
|
315
|
+
return {
|
|
316
|
+
input_tokens: totals['input_tokens'],
|
|
317
|
+
output_tokens: totals['output_tokens'],
|
|
318
|
+
cache_read_tokens: totals['cache_read_tokens'],
|
|
319
|
+
cache_creation_tokens: totals['cache_creation_tokens'],
|
|
320
|
+
calls: aiMessages.length,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
collectCitations(parsedUrls, trajectory) {
|
|
324
|
+
const urls = [];
|
|
325
|
+
for (const u of parsedUrls)
|
|
326
|
+
if (!urls.includes(u))
|
|
327
|
+
urls.push(u);
|
|
328
|
+
const urlRe = /https?:\/\/[^\s,;<>"')]+/g;
|
|
329
|
+
for (const step of trajectory) {
|
|
330
|
+
if (step.type !== 'tool_result' || !step.text)
|
|
331
|
+
continue;
|
|
332
|
+
let m;
|
|
333
|
+
while ((m = urlRe.exec(step.text)) !== null) {
|
|
334
|
+
if (!urls.includes(m[0]))
|
|
335
|
+
urls.push(m[0]);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
return urls.map((url) => ({ url }));
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
exports.ResearchAgent = ResearchAgent;
|
|
342
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../../src/agents/research/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** `client.research` facade — thin wrapper over `ResearchAgent`. */
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.ResearchFacade = void 0;
|
|
38
|
+
const agent_js_1 = require("./agent.js");
|
|
39
|
+
const SEARCH_PROVIDER_ENV = {
|
|
40
|
+
tavily: ['TAVILY_API_KEY'],
|
|
41
|
+
brave: ['BRAVE_SEARCH_API_KEY', 'BRAVE_API_KEY'],
|
|
42
|
+
};
|
|
43
|
+
class ResearchFacade {
|
|
44
|
+
engine;
|
|
45
|
+
constructor(engine) {
|
|
46
|
+
this.engine = engine;
|
|
47
|
+
}
|
|
48
|
+
async run(question, options = {}) {
|
|
49
|
+
const tool = await this.resolveSearchTool(options.search ?? 'tavily');
|
|
50
|
+
const agent = new agent_js_1.ResearchAgent({
|
|
51
|
+
engine: this.engine,
|
|
52
|
+
searchTool: tool,
|
|
53
|
+
maxSteps: options.maxSteps ?? 10,
|
|
54
|
+
...(options.systemPrompt !== undefined ? { systemPrompt: options.systemPrompt } : {}),
|
|
55
|
+
compressSnippets: options.compressSnippets ?? true,
|
|
56
|
+
compressionModel: options.compressionModel ?? 'latte_v1',
|
|
57
|
+
minCompressTokens: options.minCompressTokens ?? 100,
|
|
58
|
+
maxContextTokens: options.maxContextTokens ?? 120_000,
|
|
59
|
+
});
|
|
60
|
+
return agent.run(question, options.model !== undefined ? { model: options.model } : {});
|
|
61
|
+
}
|
|
62
|
+
/** Single-shot: one search + forced answer (`maxSteps=2`). */
|
|
63
|
+
async search(question, options = {}) {
|
|
64
|
+
return this.run(question, { ...options, maxSteps: 2 });
|
|
65
|
+
}
|
|
66
|
+
async resolveSearchTool(search) {
|
|
67
|
+
if (typeof search !== 'string')
|
|
68
|
+
return search;
|
|
69
|
+
const provider = search.toLowerCase();
|
|
70
|
+
if (!(provider in SEARCH_PROVIDER_ENV)) {
|
|
71
|
+
throw new Error(`unsupported search provider '${search}'; expected one of ${Object.keys(SEARCH_PROVIDER_ENV).join(', ')} or a LangChain tool`);
|
|
72
|
+
}
|
|
73
|
+
const { WebSearchTool } = await Promise.resolve().then(() => __importStar(require('../tools/web-search.js')));
|
|
74
|
+
let apiKey;
|
|
75
|
+
for (const env of SEARCH_PROVIDER_ENV[provider]) {
|
|
76
|
+
const v = process.env[env];
|
|
77
|
+
if (v) {
|
|
78
|
+
apiKey = v;
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const opts = apiKey !== undefined ? { apiKey } : {};
|
|
83
|
+
const tool = provider === 'tavily'
|
|
84
|
+
? await WebSearchTool.tavily(opts)
|
|
85
|
+
: await WebSearchTool.brave(opts);
|
|
86
|
+
return tool;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
exports.ResearchFacade = ResearchFacade;
|
|
90
|
+
//# 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,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Compresr research agent — multi-step web search with per-snippet compression.
|
|
4
|
+
*
|
|
5
|
+
* Public entry: `client.research.run(question)`.
|
|
6
|
+
* Loop structure adapted from Perplexity `search_evals` (MIT,
|
|
7
|
+
* https://github.com/perplexityai/search_evals).
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.DEFAULT_RESEARCH_SYSTEM_PROMPT = exports.parseResearchOutput = exports.ResearchFacade = exports.ResearchAgent = void 0;
|
|
11
|
+
var agent_js_1 = require("./agent.js");
|
|
12
|
+
Object.defineProperty(exports, "ResearchAgent", { enumerable: true, get: function () { return agent_js_1.ResearchAgent; } });
|
|
13
|
+
var facade_js_1 = require("./facade.js");
|
|
14
|
+
Object.defineProperty(exports, "ResearchFacade", { enumerable: true, get: function () { return facade_js_1.ResearchFacade; } });
|
|
15
|
+
var parser_js_1 = require("./parser.js");
|
|
16
|
+
Object.defineProperty(exports, "parseResearchOutput", { enumerable: true, get: function () { return parser_js_1.parseResearchOutput; } });
|
|
17
|
+
var prompts_js_1 = require("./prompts.js");
|
|
18
|
+
Object.defineProperty(exports, "DEFAULT_RESEARCH_SYSTEM_PROMPT", { enumerable: true, get: function () { return prompts_js_1.DEFAULT_RESEARCH_SYSTEM_PROMPT; } });
|
|
19
|
+
//# 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,uCAA2C;AAAlC,yGAAA,aAAa,OAAA;AAEtB,yCAA6C;AAApC,2GAAA,cAAc,OAAA;AAEvB,yCAAkD;AAAzC,gHAAA,mBAAmB,OAAA;AAE5B,2CAA8D;AAArD,4HAAA,8BAA8B,OAAA"}
|
|
@@ -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
|