@ruixutong.manee/agent-framework 1.0.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 +407 -0
- package/dist/agent/decorators/index.d.ts +10 -0
- package/dist/agent/index.d.ts +75 -0
- package/dist/agent/schema.d.ts +3 -0
- package/dist/agent/types.d.ts +223 -0
- package/dist/index.cjs +18 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +881 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/base/index.d.ts +73 -0
- package/dist/llm/base/types.d.ts +15 -0
- package/dist/llm/chat/index.d.ts +63 -0
- package/dist/llm/chat/types.d.ts +162 -0
- package/dist/llm/index.d.ts +6 -0
- package/dist/llm/openai-schema.d.ts +3 -0
- package/dist/llm/responses/index.d.ts +66 -0
- package/dist/llm/responses/types.d.ts +218 -0
- package/package.json +49 -0
package/README.md
ADDED
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
# @manee/agent-framework
|
|
2
|
+
|
|
3
|
+
面向 Node.js 的 TypeScript AI Agent 编排框架。它的核心目标是把 Agent 编排逻辑与模型协议解耦:`Agent<P>` 管任务循环、上下文、工具、事件和子代理;`Model<P>` 管协议消息、工具 wire structure、工具调用解析和实际模型请求。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @manee/agent-framework zod
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
要求:
|
|
12
|
+
|
|
13
|
+
- Node.js >= 22
|
|
14
|
+
- TypeScript 项目
|
|
15
|
+
- 使用 `@Tool(...)` 时,构建链需要支持 2023-11 decorators
|
|
16
|
+
- API key 使用环境变量注入,不要硬编码到源码或提交历史中
|
|
17
|
+
|
|
18
|
+
## 能力概览
|
|
19
|
+
|
|
20
|
+
- `Agent<P>`:协议无关的任务循环、上下文、系统提示词、技能、工具、事件和子代理编排器。
|
|
21
|
+
- `Model<P>`:协议适配抽象,负责 builder、parser 和 `generate()`。
|
|
22
|
+
- `OpenAIResponsesModel`:OpenAI-compatible Responses API 适配器,附带 Files 上传能力。
|
|
23
|
+
- `OpenAIChatModel`:OpenAI-compatible Chat Completions API 适配器。
|
|
24
|
+
- `Tool`:基于 2023-11 decorators 的工具声明。
|
|
25
|
+
- Zod 参数校验:工具参数在本地执行前会先通过 schema 校验。
|
|
26
|
+
- 事件系统:可观察模型响应、工具调用、工具错误、Agent 状态和 Agent 错误。
|
|
27
|
+
- Skills:以索引化手册形式指导模型调用内置 `get-skill`。
|
|
28
|
+
- Sub-agents:通过内置 `agent` 工具调度同协议子代理。
|
|
29
|
+
|
|
30
|
+
## 快速开始
|
|
31
|
+
|
|
32
|
+
```ts
|
|
33
|
+
import {
|
|
34
|
+
Agent,
|
|
35
|
+
OpenAIResponsesModel,
|
|
36
|
+
Tool,
|
|
37
|
+
type OpenAIResponsesProtocol,
|
|
38
|
+
} from '@manee/agent-framework';
|
|
39
|
+
import { z } from 'zod';
|
|
40
|
+
|
|
41
|
+
class NotesAgent extends Agent<OpenAIResponsesProtocol> {
|
|
42
|
+
@Tool({
|
|
43
|
+
name: 'save-note',
|
|
44
|
+
description: '保存一条笔记。',
|
|
45
|
+
parameters: z.object({
|
|
46
|
+
text: z.string().min(1),
|
|
47
|
+
}),
|
|
48
|
+
})
|
|
49
|
+
#saveNote(parameters: unknown): string {
|
|
50
|
+
const { text } = parameters as { text: string };
|
|
51
|
+
return `saved:${text}`;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const model = new OpenAIResponsesModel({
|
|
56
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
57
|
+
model: 'gpt-4.1',
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
const agent = new NotesAgent({
|
|
61
|
+
llm: model,
|
|
62
|
+
systemPrompts: ['你是一个会按需调用工具的助手。'],
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
agent.init();
|
|
66
|
+
|
|
67
|
+
const context = await agent.agent('请保存一条笔记:今天完成 README。');
|
|
68
|
+
console.log(context);
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
`init()` 是显式配置校验入口。调用 `agent()` 或 `toolCall()` 前必须先调用它;如果之后修改了 `agent.tools` 或 `agent.subAgents`,需要再次调用 `init()`。
|
|
72
|
+
|
|
73
|
+
## Agent 与 Model
|
|
74
|
+
|
|
75
|
+
`Agent<P>` 不直接生成某个模型 API 的消息结构。它只使用协议无关的基础语义:
|
|
76
|
+
|
|
77
|
+
- 文本任务交给 `llm.buildUserMessage()`。
|
|
78
|
+
- 内部约束、技能提示和用户 system prompt 交给 `llm.buildSystemMessage()`。
|
|
79
|
+
- 本地工具结果交给 `llm.buildToolCallOutputMessage()`。
|
|
80
|
+
- 工具定义交给 `llm.buildToolMessage()`。
|
|
81
|
+
- 模型输出交给 `llm.parseToolCalls()` 提取本地工具调用。
|
|
82
|
+
|
|
83
|
+
`Model<P>` 是协议边界:
|
|
84
|
+
|
|
85
|
+
```ts
|
|
86
|
+
abstract class Model<P extends AgentProtocol> {
|
|
87
|
+
abstract generate(request: ModelGenerateRequest<P>): Promise<ModelGenerateResult<P>>;
|
|
88
|
+
abstract buildUserMessage(input: AgentBaseUserMessage | UserMessageOf<P>): ContextOf<P>;
|
|
89
|
+
abstract buildSystemMessage(input: AgentBaseSystemMessage | SystemMessageOf<P>): ContextOf<P>;
|
|
90
|
+
abstract buildToolCallOutputMessage(
|
|
91
|
+
input: AgentBaseToolCallOutputMessage | ToolCallOutputMessageOf<P>,
|
|
92
|
+
): ContextOf<P>;
|
|
93
|
+
abstract buildToolMessage(input: AgentToolDefinitionInput): ToolOf<P>;
|
|
94
|
+
abstract parseToolCalls(context: readonly ContextOf<P>[]): readonly AgentToolCall<P>[];
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
完整抽象还包括 `parseUserMessages()`、`parseSystemMessages()`、`parseAssistantMessages()` 和 `parseToolCallOutputMessages()`。parser 接收混合 context,只返回匹配类型,并保留 `sourceMessage`;工具调用额外保留 `sourceCall`。
|
|
99
|
+
|
|
100
|
+
## 工具系统
|
|
101
|
+
|
|
102
|
+
### 装饰器工具
|
|
103
|
+
|
|
104
|
+
```ts
|
|
105
|
+
class BillingAgent extends Agent<OpenAIResponsesProtocol> {
|
|
106
|
+
@Tool({
|
|
107
|
+
name: 'lookup-invoice',
|
|
108
|
+
description: '查询账单摘要。',
|
|
109
|
+
parameters: z.object({
|
|
110
|
+
invoiceId: z.string().min(1),
|
|
111
|
+
}),
|
|
112
|
+
})
|
|
113
|
+
#lookupInvoice(parameters: unknown): Record<string, unknown> {
|
|
114
|
+
const { invoiceId } = parameters as { invoiceId: string };
|
|
115
|
+
|
|
116
|
+
return {
|
|
117
|
+
invoiceId,
|
|
118
|
+
amount: 128.5,
|
|
119
|
+
status: 'paid',
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
`@Tool` 会做两件事:
|
|
126
|
+
|
|
127
|
+
- 把工具定义写入类级 metadata,使 `Agent.toolsDefinition` 可在不实例化时读取。
|
|
128
|
+
- 在实例初始化阶段把绑定后的 handler 加入 `agent.tools`,private method 也可以安全执行。
|
|
129
|
+
|
|
130
|
+
### 运行时工具
|
|
131
|
+
|
|
132
|
+
```ts
|
|
133
|
+
agent.tools.push({
|
|
134
|
+
name: 'runtime-state-report',
|
|
135
|
+
description: '返回当前上下文长度。',
|
|
136
|
+
strict: false,
|
|
137
|
+
parameters: z.object({}),
|
|
138
|
+
handler: () => ({
|
|
139
|
+
contextMessages: agent.getContext().length,
|
|
140
|
+
}),
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
agent.init();
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
工具定义字段:
|
|
147
|
+
|
|
148
|
+
- `name`:工具名,同一个 Agent 实例中必须唯一。
|
|
149
|
+
- `description`:字符串或动态函数;动态函数会在每次构建模型请求时执行。
|
|
150
|
+
- `parameters`:Zod object schema;省略时使用空对象 schema。
|
|
151
|
+
- `strict`:可选透传值;不设置时请求工具中不包含该字段。
|
|
152
|
+
- `handler`:运行时工具函数,接收校验后的参数对象。
|
|
153
|
+
|
|
154
|
+
工具 handler 可以返回字符串、对象或 Promise。非字符串结果会被序列化为字符串工具结果。参数 JSON 解析失败、Zod 校验失败和工具本体异常不会直接终止 Agent,而是写成工具结果交给模型处理,并触发错误事件。
|
|
155
|
+
|
|
156
|
+
## 事件系统
|
|
157
|
+
|
|
158
|
+
```ts
|
|
159
|
+
const unsubscribe = agent.onModelResponse((messages) => {
|
|
160
|
+
console.log('模型消息写入 context 前:', messages);
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
agent.onBeforeToolCall(
|
|
164
|
+
'lookup-invoice',
|
|
165
|
+
async (parameters, call) => {
|
|
166
|
+
console.log(parameters, call.name);
|
|
167
|
+
},
|
|
168
|
+
{ await: true, errorCancel: true },
|
|
169
|
+
);
|
|
170
|
+
|
|
171
|
+
agent.onAfterToolCall('lookup-invoice', (_parameters, _call, result) => {
|
|
172
|
+
console.log('工具结果已写入 context:', result);
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
agent.onToolCallError((name, triggerType, error, parameters, call, result) => {
|
|
176
|
+
console.log(name, triggerType, error, parameters, call, result);
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
agent.onAgentStatusChanged('ended', (_history, context) => {
|
|
180
|
+
console.log(context.length);
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
agent.onAgentError((error) => {
|
|
184
|
+
console.log(error.message);
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
unsubscribe();
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
事件语义:
|
|
191
|
+
|
|
192
|
+
- `onModelResponse`:模型消息写入 context 前触发。
|
|
193
|
+
- `onBeforeToolCall`:工具 handler 执行前触发。
|
|
194
|
+
- `onAfterToolCall`:工具结果已经写入 context 后触发。
|
|
195
|
+
- `onToolCallError`:`before`、`calling`、`after` 任一阶段发生错误时触发。
|
|
196
|
+
- `onAgentStatusChanged`:进入指定状态后触发。
|
|
197
|
+
- `onAgentError`:`agent()` 抛错时触发。
|
|
198
|
+
|
|
199
|
+
`before` listener 如果希望异步异常取消真实工具调用,必须同时设置 `{ await: true, errorCancel: true }`。`after` listener 异常只会上报,不会中断 Agent 主循环。
|
|
200
|
+
|
|
201
|
+
## 上下文与历史
|
|
202
|
+
|
|
203
|
+
Agent 维护两份上下文:
|
|
204
|
+
|
|
205
|
+
- `getContext()`:当前模型请求使用的 active context。
|
|
206
|
+
- `getHistory()`:完整 raw history。
|
|
207
|
+
|
|
208
|
+
二者返回的都是数组浅拷贝。系统提示词、内部结束约束和技能提示词只在请求模型时临时前置,不写入持久上下文。
|
|
209
|
+
|
|
210
|
+
```ts
|
|
211
|
+
const initContext = [
|
|
212
|
+
{
|
|
213
|
+
role: 'user',
|
|
214
|
+
content: [{ type: 'input_text', text: '上一轮用户请求。' }],
|
|
215
|
+
},
|
|
216
|
+
] as const;
|
|
217
|
+
|
|
218
|
+
const agent = new Agent<OpenAIResponsesProtocol>({
|
|
219
|
+
llm: model,
|
|
220
|
+
initContext,
|
|
221
|
+
initRawContext: [
|
|
222
|
+
...initContext,
|
|
223
|
+
{
|
|
224
|
+
type: 'message',
|
|
225
|
+
role: 'assistant',
|
|
226
|
+
id: 'msg_previous',
|
|
227
|
+
status: 'completed',
|
|
228
|
+
content: [{ type: 'output_text', text: '上一轮回答。', annotations: [] }],
|
|
229
|
+
},
|
|
230
|
+
],
|
|
231
|
+
});
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
需要手动插入协议消息时,可以使用 `appendContext()`:
|
|
235
|
+
|
|
236
|
+
```ts
|
|
237
|
+
agent.appendContext(
|
|
238
|
+
model.buildUserMessage({
|
|
239
|
+
content: [{ type: 'text', text: '补充一条用户上下文。' }],
|
|
240
|
+
}),
|
|
241
|
+
);
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
## 系统提示词与 Skills
|
|
245
|
+
|
|
246
|
+
用户 system prompt 可通过构造函数或 `addSystemPrompts()` 添加:
|
|
247
|
+
|
|
248
|
+
```ts
|
|
249
|
+
agent.addSystemPrompts('回复要简洁,必要时调用工具。');
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
Skills 是给模型读取的结构化手册。框架会在内部 system prompt 中列出技能索引;模型匹配到任务时,应调用内置 `get-skill` 获取完整手册。
|
|
253
|
+
|
|
254
|
+
```ts
|
|
255
|
+
agent.addSkill({
|
|
256
|
+
name: '账单处理手册',
|
|
257
|
+
description: '当用户询问账单、退款或抵扣时使用。',
|
|
258
|
+
systemContent: '处理账单问题时必须先查事实,再给结论。',
|
|
259
|
+
sops: [
|
|
260
|
+
{
|
|
261
|
+
description: '处理重复计费',
|
|
262
|
+
content: '1. 查询账单。\n2. 核对重复项。\n3. 生成用户可读回复。',
|
|
263
|
+
},
|
|
264
|
+
],
|
|
265
|
+
});
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
## 子代理
|
|
269
|
+
|
|
270
|
+
子代理必须与父代理使用同一个协议规格。父代理通过内置 `agent` 工具按子代理类名调度子代理,子代理通过运行时注入的 `agent-result` 工具汇报结果。
|
|
271
|
+
|
|
272
|
+
```ts
|
|
273
|
+
class ReviewAgent extends Agent<OpenAIResponsesProtocol> {
|
|
274
|
+
static description = '审查文本质量并输出修改建议。';
|
|
275
|
+
|
|
276
|
+
@Tool({
|
|
277
|
+
name: 'score-writing',
|
|
278
|
+
description: '给文本质量打分。',
|
|
279
|
+
parameters: z.object({
|
|
280
|
+
text: z.string().min(1),
|
|
281
|
+
}),
|
|
282
|
+
})
|
|
283
|
+
#scoreWriting(parameters: unknown): Record<string, unknown> {
|
|
284
|
+
const { text } = parameters as { text: string };
|
|
285
|
+
return {
|
|
286
|
+
length: text.length,
|
|
287
|
+
score: 8,
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
const parent = new Agent<OpenAIResponsesProtocol>({
|
|
293
|
+
llm: model,
|
|
294
|
+
subAgents: [ReviewAgent],
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
parent.init();
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
## Responses API
|
|
301
|
+
|
|
302
|
+
`OpenAIResponsesModel` 使用 Responses API 的 `input` / `tools` / `output` 语义。模型返回的 output item 会作为协议 context 原样保存和回传;Agent 只识别 `function_call` 来执行本地工具。
|
|
303
|
+
|
|
304
|
+
```ts
|
|
305
|
+
const model = new OpenAIResponsesModel({
|
|
306
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
307
|
+
model: 'gpt-4.1',
|
|
308
|
+
defaultParams: {
|
|
309
|
+
temperature: 0.2,
|
|
310
|
+
},
|
|
311
|
+
});
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
Responses 多模态适合使用 Files 上传:
|
|
315
|
+
|
|
316
|
+
```ts
|
|
317
|
+
const file = await model.uploadFile('/absolute/path/image.png');
|
|
318
|
+
|
|
319
|
+
agent.appendContext(
|
|
320
|
+
model.buildUserMessage({
|
|
321
|
+
content: [
|
|
322
|
+
{ type: 'input_image', file_id: file.id, detail: 'high' },
|
|
323
|
+
{ type: 'text', text: '请判断这张图片中的信息。' },
|
|
324
|
+
],
|
|
325
|
+
}),
|
|
326
|
+
);
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
已声明的 Responses 内容块包括 `input_text`、`input_image`、`input_file`、`input_video` 和 `input_audio`。`uploadFile()` 默认使用 `purpose: "user_data"`。
|
|
330
|
+
|
|
331
|
+
## Chat Completions API
|
|
332
|
+
|
|
333
|
+
`OpenAIChatModel` 使用 Chat Completions 的 `messages` 和 function tools。Chat parser 会从 assistant message 的 `tool_calls[]` 中按原始顺序展开本地 function tool call。
|
|
334
|
+
|
|
335
|
+
```ts
|
|
336
|
+
import { Agent, OpenAIChatModel, type OpenAIChatProtocol } from '@manee/agent-framework';
|
|
337
|
+
|
|
338
|
+
const chatModel = new OpenAIChatModel({
|
|
339
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
340
|
+
model: 'gpt-4.1',
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
const chatAgent = new Agent<OpenAIChatProtocol>({
|
|
344
|
+
llm: chatModel,
|
|
345
|
+
});
|
|
346
|
+
|
|
347
|
+
chatAgent.appendContext(
|
|
348
|
+
chatModel.buildUserMessage({
|
|
349
|
+
content: [
|
|
350
|
+
{ type: 'text', text: '请读取这张图片。' },
|
|
351
|
+
{
|
|
352
|
+
type: 'image_url',
|
|
353
|
+
image_url: {
|
|
354
|
+
url: imageDataUrl,
|
|
355
|
+
detail: 'high',
|
|
356
|
+
},
|
|
357
|
+
},
|
|
358
|
+
],
|
|
359
|
+
}),
|
|
360
|
+
);
|
|
361
|
+
|
|
362
|
+
chatAgent.init();
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
当前 Chat 协议只保留新版 `tool_calls[]` / `tool` role 工具闭环,不包含 deprecated `function_call` 或 `function` role。
|
|
366
|
+
|
|
367
|
+
## 自定义 Model
|
|
368
|
+
|
|
369
|
+
可以通过继承 `Model<P>` 接入任意协议。核心要求是:
|
|
370
|
+
|
|
371
|
+
- 定义一个 `AgentProtocol`,明确 context、tool、userMessage、systemMessage、assistantMessage、toolCallOutputMessage、rawToolCall、rawResponse。
|
|
372
|
+
- 实现 builder,把 Agent 基础结构转成协议结构。
|
|
373
|
+
- 实现 parser,从混合 context 中筛选目标消息,其他类型直接跳过。
|
|
374
|
+
- 实现 `generate()`,返回需要写入 context/history 的协议消息。
|
|
375
|
+
|
|
376
|
+
```ts
|
|
377
|
+
class MyModel extends Model<MyProtocol> {
|
|
378
|
+
async generate(
|
|
379
|
+
request: ModelGenerateRequest<MyProtocol>,
|
|
380
|
+
): Promise<ModelGenerateResult<MyProtocol>> {
|
|
381
|
+
// 调用你的模型服务,并返回协议消息。
|
|
382
|
+
return { messages: [] };
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
// 继续实现 buildUserMessage、buildSystemMessage、buildToolMessage、parser 等方法。
|
|
386
|
+
}
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
## 生命周期与错误处理
|
|
390
|
+
|
|
391
|
+
- `agent(input)` 会先把输入构建为 user message,再进入循环。
|
|
392
|
+
- Agent 默认不设置迭代次数上限;可通过 `maxIterations` 设置保护。
|
|
393
|
+
- 内置 `end-agent` 是唯一正常结束条件。
|
|
394
|
+
- 成功响应但没有消息时会重试 3 次;网络/API 异常不重试。
|
|
395
|
+
- 并发调用第二个 `agent()` 会抛出 `Agent is already running.`,但不会把正在运行的任务标记为失败。
|
|
396
|
+
- `stream=true` 当前不支持,会抛出错误。
|
|
397
|
+
|
|
398
|
+
## 发布内容
|
|
399
|
+
|
|
400
|
+
npm 包包含:
|
|
401
|
+
|
|
402
|
+
- `dist/index.js`
|
|
403
|
+
- `dist/index.cjs`
|
|
404
|
+
- `dist/index.d.ts`
|
|
405
|
+
- `README.md`
|
|
406
|
+
|
|
407
|
+
声明文件会保留中文 TSDoc,便于在 IDE 中查看 API 用法。
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ToolDefinition } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* 将 Agent 方法声明为可被模型调用的工具。
|
|
4
|
+
*
|
|
5
|
+
* 装饰器在类级 metadata 中记录 `toolsDefinition` 静态定义,并为每个实例
|
|
6
|
+
* 注册绑定后的运行时 handler。
|
|
7
|
+
*/
|
|
8
|
+
export declare function Tool(definition: ToolDefinition): (value: unknown, context: ClassMethodDecoratorContext) => void;
|
|
9
|
+
/** 获取类构造器的静态工具定义浅拷贝,避免外部修改内部定义数组。 */
|
|
10
|
+
export declare function getToolDefinitions(target: object): ToolDefinition[];
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Tool } from './decorators';
|
|
2
|
+
import type { AfterToolCallCallback, AgentConstructor, AgentErrorCallback, AgentOptions, AgentProtocol, AgentSkill, AgentStatus, AgentStatusChangedCallback, AgentToolCall, BeforeToolCallCallback, ContextOf, ModelResponseCallback, ToolCallErrorCallback, ToolDefinition, ToolEventOptions, ToolRuntimeDefinition, Unsubscribe, UserMessageOf } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* 运行于 Node.js 的 Agent 主执行器。
|
|
5
|
+
*
|
|
6
|
+
* Agent 管理由模型协议泛型指定的上下文、工具、技能、子代理与生命周期事件。
|
|
7
|
+
* 协议消息的生成和工具调用解析由 `Model<P>` 提供;配置完运行时工具或子代理后,
|
|
8
|
+
* 必须先调用 `init()`,再调用 `agent()` 或 `toolCall()`。
|
|
9
|
+
*/
|
|
10
|
+
export declare class Agent<P extends AgentProtocol> {
|
|
11
|
+
#private;
|
|
12
|
+
/**
|
|
13
|
+
* 当前 Agent 实例可调用的运行时工具集合。
|
|
14
|
+
*
|
|
15
|
+
* 装饰器工具会在实例构造阶段自动注册;也可以在 `init()` 前追加仅在本实例
|
|
16
|
+
* 生效的工具。
|
|
17
|
+
*/
|
|
18
|
+
get tools(): ToolRuntimeDefinition[];
|
|
19
|
+
/** 替换当前实例工具集合;替换后需要重新调用 `init()` 进行重复名校验。 */
|
|
20
|
+
set tools(tools: ToolRuntimeDefinition[]);
|
|
21
|
+
/** 该类作为子代理暴露时使用的人类可读说明。 */
|
|
22
|
+
static description?: string;
|
|
23
|
+
/** 可由内置 `agent` 工具调度的子代理类集合。 */
|
|
24
|
+
subAgents: AgentConstructor<P>[];
|
|
25
|
+
/** 当前类及其父类通过装饰器声明的静态工具定义。 */
|
|
26
|
+
static get toolsDefinition(): readonly ToolDefinition[];
|
|
27
|
+
/** 使用模型适配器及可选运行配置创建 Agent 实例。 */
|
|
28
|
+
constructor(options: AgentOptions<P>);
|
|
29
|
+
/** 获取完整历史记录;返回的数组为浅拷贝。 */
|
|
30
|
+
getHistory(): readonly ContextOf<P>[];
|
|
31
|
+
/** 获取模型请求使用的活动上下文,不包含临时注入的内部系统提示词。 */
|
|
32
|
+
getContext(): readonly ContextOf<P>[];
|
|
33
|
+
/**
|
|
34
|
+
* 校验运行时配置并将 Agent 标记为已初始化。
|
|
35
|
+
*
|
|
36
|
+
* 修改 `tools` 或 `subAgents` 后应重新调用本方法;重复调用只重新校验配置,
|
|
37
|
+
* 不会清空历史或事件监听。
|
|
38
|
+
*/
|
|
39
|
+
init(): this;
|
|
40
|
+
/** 追加非空系统提示词;请求模型时它们排在框架内部提示词之后。 */
|
|
41
|
+
addSystemPrompts(...prompts: string[]): this;
|
|
42
|
+
/** 追加技能手册;新增技能会从下一次模型请求开始对模型可见。 */
|
|
43
|
+
addSkill(...skills: AgentSkill[]): this;
|
|
44
|
+
/** 向完整历史和活动上下文同时追加文本或多模态消息。 */
|
|
45
|
+
appendContext(message: ContextOf<P>): this;
|
|
46
|
+
/** 在任一模型返回消息写入上下文前,监听该轮完整消息数组。 */
|
|
47
|
+
onModelResponse(callback: ModelResponseCallback<P>): Unsubscribe;
|
|
48
|
+
/** 监听指定工具的调用前阶段;可通过 options 等待回调或在异常时取消调用。 */
|
|
49
|
+
onBeforeToolCall(toolName: string, callback: BeforeToolCallCallback<P>, options?: ToolEventOptions): Unsubscribe;
|
|
50
|
+
/** 监听指定工具处理器返回后的阶段;回调异常会上报,但不会中断主流程。 */
|
|
51
|
+
onAfterToolCall(toolName: string, callback: AfterToolCallCallback<P>, options?: ToolEventOptions): Unsubscribe;
|
|
52
|
+
/** 监听工具在 `before`、`calling` 或 `after` 阶段发生的异常。 */
|
|
53
|
+
onToolCallError(callback: ToolCallErrorCallback<P>): Unsubscribe;
|
|
54
|
+
/** 监听 Agent 进入指定状态的事件。 */
|
|
55
|
+
onAgentStatusChanged(status: AgentStatus, callback: AgentStatusChangedCallback<P>): Unsubscribe;
|
|
56
|
+
/** 监听 `agent()` 抛出的错误;listener 自身异常不会影响 Agent 状态。 */
|
|
57
|
+
onAgentError(callback: AgentErrorCallback): Unsubscribe;
|
|
58
|
+
/**
|
|
59
|
+
* 执行一个已解析的模型函数调用,并返回本地结果 item。
|
|
60
|
+
*
|
|
61
|
+
* 成功结果会先由 Model 构建并写入上下文,再触发 after listener,使 listener
|
|
62
|
+
* 追加的消息排在对应工具结果之后。
|
|
63
|
+
*/
|
|
64
|
+
toolCall(callInfo: AgentToolCall<P>): Promise<ContextOf<P>>;
|
|
65
|
+
/**
|
|
66
|
+
* 启动 Agent 任务循环。
|
|
67
|
+
*
|
|
68
|
+
* 每轮先原样保存模型返回的协议消息,再执行 Model 反解析出的工具调用。
|
|
69
|
+
* 只有内置 `end-agent` 工具把状态改为 `ended` 后任务才结束;当前版本
|
|
70
|
+
* 尚不支持流式调用。
|
|
71
|
+
*/
|
|
72
|
+
agent(input: string | UserMessageOf<P>, stream?: boolean): Promise<ContextOf<P>[]>;
|
|
73
|
+
}
|
|
74
|
+
export { Tool };
|
|
75
|
+
export type * from './types';
|