klaus-agent 0.2.0 → 0.2.2

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.
Files changed (47) hide show
  1. package/README.md +37 -11
  2. package/README.zh-CN.md +709 -0
  3. package/dist/core/agent-loop.d.ts +2 -1
  4. package/dist/core/agent-loop.js +5 -1
  5. package/dist/core/agent-loop.js.map +1 -1
  6. package/dist/core/agent.js +1 -0
  7. package/dist/core/agent.js.map +1 -1
  8. package/dist/index.d.ts +3 -4
  9. package/dist/index.js +2 -3
  10. package/dist/index.js.map +1 -1
  11. package/dist/llm/provider.js +5 -11
  12. package/dist/llm/provider.js.map +1 -1
  13. package/dist/llm/types.d.ts +17 -0
  14. package/dist/providers/index.d.ts +1 -0
  15. package/dist/providers/index.js +1 -0
  16. package/dist/providers/index.js.map +1 -1
  17. package/dist/providers/openai-codex.d.ts +8 -0
  18. package/dist/providers/openai-codex.js +334 -0
  19. package/dist/providers/openai-codex.js.map +1 -0
  20. package/dist/providers/openai-responses-shared.d.ts +36 -0
  21. package/dist/providers/openai-responses-shared.js +74 -0
  22. package/dist/providers/openai-responses-shared.js.map +1 -0
  23. package/dist/providers/openai-responses.d.ts +7 -0
  24. package/dist/providers/openai-responses.js +128 -0
  25. package/dist/providers/openai-responses.js.map +1 -0
  26. package/dist/providers/openai.js +1 -10
  27. package/dist/providers/openai.js.map +1 -1
  28. package/dist/providers/shared.d.ts +5 -1
  29. package/dist/providers/shared.js +21 -0
  30. package/dist/providers/shared.js.map +1 -1
  31. package/dist/types.d.ts +2 -2
  32. package/package.json +1 -1
  33. package/src/core/agent-loop.ts +6 -1
  34. package/src/core/agent.ts +1 -0
  35. package/src/index.ts +4 -3
  36. package/src/llm/provider.ts +5 -12
  37. package/src/llm/types.ts +19 -0
  38. package/src/providers/openai-codex.ts +399 -0
  39. package/src/providers/openai-responses-shared.ts +97 -0
  40. package/src/providers/openai-responses.ts +152 -0
  41. package/src/providers/openai.ts +1 -8
  42. package/src/providers/shared.ts +20 -1
  43. package/src/types.ts +4 -0
  44. package/src/providers/index.ts +0 -6
  45. package/src/providers/kimi.ts +0 -12
  46. package/src/providers/minimax.ts +0 -12
  47. package/src/providers/volcengine.ts +0 -12
@@ -0,0 +1,709 @@
1
+ # @klaus-ai/agent
2
+
3
+ 通用 Agent 框架 SDK。注入 tools、skills、systemPrompt 即可构建 agent,无需再包一层。
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ npm install @klaus-ai/agent
9
+ ```
10
+
11
+ ## 快速开始
12
+
13
+ ```typescript
14
+ import { createAgent } from "@klaus-ai/agent";
15
+ import { Type } from "@sinclair/typebox";
16
+
17
+ const agent = createAgent({
18
+ model: { provider: "anthropic", model: "claude-sonnet-4-20250514", maxContextTokens: 200000 },
19
+ systemPrompt: "You are a helpful assistant.",
20
+ tools: [
21
+ {
22
+ name: "echo",
23
+ label: "Echo",
24
+ description: "Echo back the input",
25
+ parameters: Type.Object({ text: Type.String() }),
26
+ async execute(_id, params) {
27
+ return { content: [{ type: "text", text: params.text }] };
28
+ },
29
+ },
30
+ ],
31
+ approval: { yolo: true },
32
+ });
33
+
34
+ // 订阅流式事件
35
+ agent.subscribe((event) => {
36
+ if (event.type === "message_update" && event.event.type === "text") {
37
+ process.stdout.write(event.event.text);
38
+ }
39
+ });
40
+
41
+ const messages = await agent.prompt("Say hello");
42
+ ```
43
+
44
+ ## 架构
45
+
46
+ 单包架构,14 个模块,零包装层。所有能力内置,通过 config 按需启用。
47
+
48
+ ```
49
+ src/
50
+ ├── core/ Agent + AgentLoop(嵌套双循环运行时)
51
+ ├── llm/ Provider 注册中心 + 抽象层
52
+ ├── providers/ 5 个内置协议 Provider(Anthropic、OpenAI、OpenAI Responses、OpenAI Codex、Gemini)
53
+ ├── tools/ 工具执行器(顺序/并行)+ MCP 适配器
54
+ ├── approval/ 基于队列的审批系统
55
+ ├── session/ JSONL 树形持久化,支持分支
56
+ ├── compaction/ Token 估算 + LLM 摘要压缩
57
+ ├── checkpoint/ 检查点 + D-Mail 时间旅行
58
+ ├── injection/ 动态上下文注入 + 历史消息规范化
59
+ ├── multi-agent/ LaborMarket 子 Agent 注册 + TaskExecutor
60
+ ├── extensions/ 事件驱动的插件系统
61
+ ├── skills/ Markdown 技能发现 + 模板渲染
62
+ ├── wire/ 类型化异步事件通道,支持回放缓冲
63
+ ├── background/ 进程内异步任务管理器
64
+ └── utils/ ID 生成 + JSONL 工具
65
+ ```
66
+
67
+ ## 模块
68
+
69
+ ### 核心 — Agent 循环
70
+
71
+ 嵌套双循环执行引擎:
72
+
73
+ - 内循环:LLM 调用 → 工具执行 → steering 消息 → 重复直到没有工具调用
74
+ - 外循环:follow-up 消息 → 重新进入内循环
75
+
76
+ 每一步集成:检查点 → 压缩检查 → 动态注入 → 历史规范化 → 扩展 context hook → LLM 流式调用 → 工具执行 → D-Mail 检查 → steering。
77
+
78
+ ```typescript
79
+ const agent = createAgent({
80
+ model: { provider: "anthropic", model: "claude-sonnet-4-20250514", maxContextTokens: 200000 },
81
+ systemPrompt: "You are a helpful assistant.",
82
+ tools: [...],
83
+ maxStepsPerTurn: 50, // 内循环最大迭代次数(默认 50)
84
+ toolExecution: "parallel", // "sequential" | "parallel"(默认 "parallel")
85
+ });
86
+
87
+ // 发送 prompt
88
+ const messages = await agent.prompt("Hello");
89
+
90
+ // 无新输入继续执行
91
+ const more = await agent.continue();
92
+
93
+ // 运行中注入消息
94
+ agent.steer({ role: "user", content: "Focus on X" }); // 当前工具执行完成后注入
95
+ agent.followUp({ role: "user", content: "Also do Y" }); // 内循环结束后注入
96
+
97
+ // 中止
98
+ agent.abort();
99
+
100
+ // 清理资源
101
+ await agent.dispose();
102
+ ```
103
+
104
+ ### LLM Provider
105
+
106
+ Provider 无关的抽象层,内置 5 个协议 Provider。所有 Provider 支持流式输出、重试(3 次,指数退避)和扩展思考。通过自定义 `baseUrl` 即可接入任何兼容服务。
107
+
108
+ 内置 Provider:`anthropic`、`openai`、`openai-responses`、`openai-codex`、`google`
109
+
110
+ ```typescript
111
+ // 使用内置 Provider
112
+ const agent = createAgent({
113
+ model: { provider: "openai", model: "gpt-4", maxContextTokens: 128000 },
114
+ ...
115
+ });
116
+
117
+ // 通过自定义 baseUrl 接入兼容服务
118
+ const agent2 = createAgent({
119
+ model: { provider: "openai", model: "my-model", maxContextTokens: 128000, baseUrl: "https://my-service/v1" },
120
+ ...
121
+ });
122
+
123
+ // 注册完全自定义的 Provider
124
+ import { registerProvider } from "@klaus-ai/agent";
125
+ registerProvider("my-provider", (config) => new MyProvider(config.apiKey, config.baseUrl));
126
+ ```
127
+
128
+ Provider 接口:
129
+
130
+ ```typescript
131
+ interface LLMProvider {
132
+ stream(options: LLMRequestOptions): AsyncIterable<AssistantMessageEvent>;
133
+ }
134
+
135
+ // 流式事件类型:text | tool_call_start | tool_call_delta | thinking | done | error
136
+ ```
137
+
138
+ 成本追踪 — 通过 `ModelConfig.cost` 提供每百万 token 的单价,agent 会在每次 `message_end` 事件中自动计算实际成本:
139
+
140
+ ```typescript
141
+ const agent = createAgent({
142
+ model: {
143
+ provider: "anthropic",
144
+ model: "claude-sonnet-4-20250514",
145
+ maxContextTokens: 200000,
146
+ cost: { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 3.75 },
147
+ },
148
+ ...
149
+ });
150
+
151
+ agent.subscribe((event) => {
152
+ if (event.type === "message_end" && event.usage?.cost) {
153
+ console.log(`请求成本: $${event.usage.cost.total.toFixed(6)}`);
154
+ }
155
+ });
156
+ ```
157
+
158
+ ### 标准消息格式
159
+
160
+ 框架内部使用的 Provider 无关消息类型:
161
+
162
+ ```typescript
163
+ type Message = UserMessage | AssistantMessage | ToolResultMessage;
164
+
165
+ interface UserMessage {
166
+ role: "user";
167
+ content: string | ContentBlock[]; // ContentBlock = TextContent | ImageContent
168
+ }
169
+
170
+ interface AssistantMessage {
171
+ role: "assistant";
172
+ content: AssistantContentBlock[]; // TextBlock | ToolCallBlock | ThinkingBlock
173
+ }
174
+
175
+ interface ToolResultMessage {
176
+ role: "tool_result";
177
+ toolCallId: string;
178
+ content: string | ContentBlock[];
179
+ isError?: boolean;
180
+ }
181
+ ```
182
+
183
+ 可通过 `CustomAgentMessages` 接口扩展自定义消息类型。
184
+
185
+ ### 工具
186
+
187
+ 工具使用 TypeBox schema 进行参数校验。执行器支持顺序和并行模式,带审批拦截。
188
+
189
+ ```typescript
190
+ import { Type } from "@sinclair/typebox";
191
+ import type { AgentTool } from "@klaus-ai/agent";
192
+
193
+ const readFile: AgentTool = {
194
+ name: "read_file",
195
+ label: "Read File",
196
+ description: "Read a file from disk",
197
+ parameters: Type.Object({
198
+ path: Type.String({ description: "File path" }),
199
+ }),
200
+ approvalAction: "file:read", // 非 yolo 模式下触发审批
201
+
202
+ async execute(toolCallId, params, context) {
203
+ // context.signal — AbortSignal
204
+ // context.onUpdate — 流式推送部分结果
205
+ // context.approval — 审批接口
206
+ // context.agentName — 父 Agent 名称
207
+ const text = await fs.readFile(params.path, "utf-8");
208
+ return { content: [{ type: "text", text }] };
209
+ },
210
+ };
211
+ ```
212
+
213
+ 并行模式:审批和 beforeToolCall hook 顺序执行(预检),然后所有已批准的工具并发执行。
214
+
215
+ ### 审批
216
+
217
+ 基于队列的审批系统,三种模式:
218
+
219
+ ```typescript
220
+ const agent = createAgent({
221
+ approval: {
222
+ yolo: true, // 自动批准所有操作
223
+ autoApproveActions: ["file:read"], // 自动批准指定操作
224
+ },
225
+ ...
226
+ });
227
+
228
+ // UI 集成 — 拉取待审批请求并处理
229
+ const request = await agent.approval.fetchRequest();
230
+ // request: { id, toolCallId, sender, action, description }
231
+ agent.approval.resolve(request.id, "approve"); // 单次批准
232
+ agent.approval.resolve(request.id, "approve_for_session"); // 本次会话内自动批准该操作
233
+ agent.approval.resolve(request.id, "reject");
234
+
235
+ // 子 Agent 通过 approval.share() 共享 yolo/autoApproveActions 状态
236
+ ```
237
+
238
+ ### 扩展思考
239
+
240
+ 六级扩展思考预算:
241
+
242
+ ```typescript
243
+ const agent = createAgent({
244
+ thinkingLevel: "medium", // "off" | "minimal" | "low" | "medium" | "high" | "xhigh"
245
+ model: {
246
+ provider: "anthropic",
247
+ model: "claude-sonnet-4-20250514",
248
+ maxContextTokens: 200000,
249
+ capabilities: { thinking: true },
250
+ },
251
+ ...
252
+ });
253
+
254
+ // 运行时修改
255
+ agent.setThinkingLevel("high");
256
+ ```
257
+
258
+ Token 预算:minimal=1024、low=4096、medium=10240、high=20480、xhigh=40960。
259
+
260
+ ### 会话持久化
261
+
262
+ 基于 JSONL 的树形会话存储,支持分支和恢复。
263
+
264
+ ```typescript
265
+ const agent = createAgent({
266
+ session: {
267
+ persist: true,
268
+ directory: "./sessions",
269
+ sessionId: "my-session", // 可选,省略时自动生成
270
+ },
271
+ ...
272
+ });
273
+
274
+ // 访问会话树
275
+ const tree = agent.session.getTree();
276
+ const branch = agent.session.getBranch();
277
+
278
+ // 从指定条目创建分支
279
+ agent.session.branch(entryId);
280
+
281
+ // 条目类型:message | compaction | branch_summary | model_change |
282
+ // thinking_level_change | checkpoint | custom
283
+ ```
284
+
285
+ 会话文件格式:首行为 header `{ type: "session", version: 1, id, timestamp }`,后续每行一个 JSON 条目,包含 `{ type, id, parentId, timestamp, ... }`。
286
+
287
+ ### 压缩
288
+
289
+ Token 数超过阈值时自动压缩上下文。
290
+
291
+ ```typescript
292
+ const agent = createAgent({
293
+ compaction: {
294
+ enabled: true,
295
+ maxContextTokens: 200000, // 默认使用 model.maxContextTokens
296
+ reserveTokens: 16384, // 为输出预留的 token 数
297
+ keepRecentTokens: 20000, // 保留最近消息的 token 数
298
+ customSummarizer: mySummarizer, // 可选自定义摘要器
299
+ },
300
+ ...
301
+ });
302
+ ```
303
+
304
+ 流程:估算 token → 检查阈值 → 找到切割点(尊重 tool_result 边界)→ 通过 LLM 摘要被丢弃的消息 → 替换为 `<compaction-summary>` → 持久化到会话。
305
+
306
+ 内置 `LLMSummarizer` 使用同一 Provider 生成摘要,支持基于 `previousSummary` 的增量摘要。
307
+
308
+ ### 检查点 + D-Mail
309
+
310
+ 通过 Steins;Gate 风格的 D-Mail 机制实现时间旅行。每个 Agent 循环步骤前自动创建检查点。
311
+
312
+ ```typescript
313
+ const agent = createAgent({
314
+ session: { persist: true, directory: "./sessions" },
315
+ checkpoint: { enabled: true, enableDMail: true },
316
+ ...
317
+ });
318
+
319
+ // 发送 D-Mail — 将会话树分支回目标检查点
320
+ agent.checkpoints.denwaRenji.sendDMail("Try a different approach", checkpointId);
321
+
322
+ // Agent 循环自动处理:
323
+ // 1. 工具执行后检测待处理的 D-Mail
324
+ // 2. 将会话树分支到目标检查点
325
+ // 3. 注入 D-Mail 内容作为 <dmail> 消息
326
+ // 4. 从该点继续执行
327
+ ```
328
+
329
+ ### 动态注入
330
+
331
+ 在每次 LLM 调用前向消息流注入上下文,不修改持久化历史。
332
+
333
+ ```typescript
334
+ const agent = createAgent({
335
+ injection: [
336
+ {
337
+ async getInjections(history) {
338
+ return [
339
+ { type: "memory", content: "User prefers TypeScript" },
340
+ { type: "context", content: `Current time: ${new Date().toISOString()}` },
341
+ ];
342
+ },
343
+ },
344
+ ],
345
+ ...
346
+ });
347
+ ```
348
+
349
+ 注入内容包装为 `<system-reminder type="...">` user 消息。历史规范化会合并相邻的 user 消息以维持合法的消息交替。
350
+
351
+ ### 多 Agent
352
+
353
+ LaborMarket 注册中心,支持固定和动态子 Agent。LLM 通过内置 `delegate_task` 工具进行委派。
354
+
355
+ ```typescript
356
+ const agent = createAgent({
357
+ subagents: {
358
+ researcher: {
359
+ name: "researcher",
360
+ systemPrompt: "You are a research assistant.",
361
+ description: "Handles research tasks",
362
+ tools: [searchTool],
363
+ },
364
+ writer: {
365
+ name: "writer",
366
+ systemPrompt: "You are a writing assistant.",
367
+ description: "Handles writing tasks",
368
+ },
369
+ },
370
+ ...
371
+ });
372
+
373
+ // 运行时动态注册子 Agent
374
+ agent.laborMarket.addDynamic("analyst", analystAgent, "Data analysis");
375
+ agent.laborMarket.removeDynamic("analyst");
376
+ ```
377
+
378
+ 子 Agent 共享父 Agent 的审批状态(yolo、autoApproveActions),但拥有独立的审批队列。子 Agent 事件会转发到父 Agent 的事件流。
379
+
380
+ ### 扩展
381
+
382
+ 事件驱动的插件系统,覆盖 Agent 生命周期、工具执行、LLM 请求、上下文、压缩、会话和后台任务共 18 种事件类型。
383
+
384
+ ```typescript
385
+ import type { ExtensionFactory } from "@klaus-ai/agent";
386
+
387
+ const myExtension: ExtensionFactory = (api) => {
388
+ // 注册事件处理器
389
+ api.on("before_agent_start", (event) => {
390
+ return { systemPrompt: event.systemPrompt + "\nExtra instructions." };
391
+ });
392
+
393
+ api.on("tool_call", (event) => {
394
+ if (event.toolName === "dangerous_tool") {
395
+ return { block: true, reason: "Not allowed" };
396
+ }
397
+ });
398
+
399
+ api.on("before_provider_request", (event) => {
400
+ return { messages: event.messages }; // 修改 LLM 请求
401
+ });
402
+
403
+ api.on("context", (event) => {
404
+ return { messages: [...event.messages, extraMsg] };
405
+ });
406
+
407
+ api.on("before_compact", (event) => {
408
+ return { skip: true }; // 或提供自定义摘要
409
+ });
410
+
411
+ // 注册工具
412
+ api.registerTool(myTool);
413
+
414
+ // 注册命令
415
+ api.registerCommand("my-command", async (args) => { ... });
416
+
417
+ // 向对话注入消息
418
+ api.sendMessage({ role: "user", content: "Injected by extension" });
419
+ };
420
+
421
+ const agent = createAgent({ extensions: [myExtension], ... });
422
+ ```
423
+
424
+ 可拦截事件(返回值可修改行为):`before_agent_start`、`before_provider_request`、`tool_call`、`tool_result`、`context`、`before_compact`。
425
+
426
+ 通知事件(仅触发):`agent_start`、`agent_end`、`turn_start`、`turn_end`、`message_start`、`message_end`、`after_compact`、`session_start`、`session_switch`、`session_fork`、`task_started`、`task_completed`、`task_failed`。
427
+
428
+ ### Skills
429
+
430
+ 基于 Markdown 的技能发现,支持 frontmatter 解析和模板渲染。
431
+
432
+ ```typescript
433
+ const agent = createAgent({
434
+ skills: [{ directory: "./skills", pattern: ".md" }],
435
+ ...
436
+ });
437
+ ```
438
+
439
+ 技能文件格式(`./skills/review.md`):
440
+
441
+ ```markdown
442
+ ---
443
+ name: review
444
+ description: Code review checklist
445
+ ---
446
+
447
+ Review the code for:
448
+ - Security: {{focus_area}}
449
+ - Performance issues
450
+ - Code style
451
+ ```
452
+
453
+ LLM 通过内置 `invoke_skill` 工具调用技能,支持可选的模板变量。
454
+
455
+ ### MCP(Model Context Protocol)
456
+
457
+ 连接 MCP 服务器,将其工具暴露给 Agent。
458
+
459
+ ```typescript
460
+ const agent = createAgent({
461
+ mcp: {
462
+ servers: [
463
+ {
464
+ name: "filesystem",
465
+ transport: { type: "stdio", command: "mcp-server-fs", args: ["--root", "/tmp"] },
466
+ timeout: 30000,
467
+ },
468
+ {
469
+ name: "web",
470
+ transport: { type: "sse", url: "http://localhost:3001/sse" },
471
+ },
472
+ ],
473
+ clientFactory: (config) => new MyMCPClient(config),
474
+ },
475
+ ...
476
+ });
477
+
478
+ // 检查服务器状态
479
+ const statuses = agent.mcpAdapter.getStatuses();
480
+ // [{ name: "filesystem", status: "connected", tools: [...] }]
481
+ ```
482
+
483
+ MCP 工具命名空间为 `{serverName}__{toolName}`,需通过 `mcp:{serverName}:{toolName}` action 审批。
484
+
485
+ ### Wire(事件通道)
486
+
487
+ 类型化异步发布/订阅事件通道,支持可选的回放缓冲。所有 Agent 事件自动发布到 Wire。
488
+
489
+ ```typescript
490
+ const agent = createAgent({
491
+ wire: { bufferSize: 100 }, // 缓冲最近 100 条消息供后续订阅者回放
492
+ ...
493
+ });
494
+
495
+ // 订阅特定事件类型
496
+ agent.wire.on("tool_execution_end", (msg) => {
497
+ console.log(`Tool ${msg.payload.toolName} completed`);
498
+ });
499
+
500
+ // 订阅所有事件
501
+ agent.wire.subscribe((msg) => {
502
+ console.log(msg.type, msg.payload);
503
+ }, { replay: true }); // 回放缓冲消息
504
+
505
+ // 发布自定义事件
506
+ agent.wire.publish("custom_event", { data: "hello" });
507
+ ```
508
+
509
+ ### 后台任务
510
+
511
+ 进程内异步任务执行,带生命周期事件。LLM 通过内置工具管理任务。
512
+
513
+ ```typescript
514
+ const agent = createAgent({
515
+ backgroundTasks: {
516
+ factories: {
517
+ build: async (args, signal) => {
518
+ // 支持中止信号的长时间任务
519
+ return { success: true };
520
+ },
521
+ },
522
+ },
523
+ ...
524
+ });
525
+
526
+ // 编程式访问
527
+ const handle = agent.backgroundTasks.spawn("my-task", async (signal) => {
528
+ return await doWork(signal);
529
+ });
530
+
531
+ console.log(handle.status); // "running" | "completed" | "failed"
532
+ handle.abort();
533
+ ```
534
+
535
+ 内置工具:`start_background_task`、`check_task_status`、`get_task_result`。
536
+
537
+ ### Hooks
538
+
539
+ 用户级 hook,用于转换上下文和拦截工具调用:
540
+
541
+ ```typescript
542
+ const agent = createAgent({
543
+ hooks: {
544
+ // 发送给 LLM 前转换消息
545
+ transformContext: async (messages) => {
546
+ return messages.filter(m => ...);
547
+ },
548
+ // 自定义消息格式转换
549
+ convertToLlm: (messages) => {
550
+ return messages.filter(m => m.role === "user" || m.role === "assistant" || m.role === "tool_result");
551
+ },
552
+ // 工具执行前/后拦截
553
+ beforeToolCall: async (ctx) => {
554
+ // return { block: true, reason: "..." } 可阻止执行
555
+ },
556
+ afterToolCall: async (ctx) => {
557
+ // return { content, details, isError } 可修改结果
558
+ },
559
+ },
560
+ ...
561
+ });
562
+ ```
563
+
564
+ ## 事件
565
+
566
+ 订阅 Agent 事件流获取实时更新:
567
+
568
+ ```typescript
569
+ agent.subscribe((event) => {
570
+ switch (event.type) {
571
+ case "agent_start":
572
+ case "agent_end": // { messages }
573
+ case "turn_start":
574
+ case "turn_end": // { message, toolResults }
575
+ case "message_start": // { message }
576
+ case "message_update": // { message, event: text|tool_call_start|tool_call_delta|thinking|done }
577
+ case "message_end": // { message, usage }
578
+ case "tool_execution_start": // { toolCallId, toolName, args }
579
+ case "tool_execution_update": // { toolCallId, toolName, partialResult }
580
+ case "tool_execution_end": // { toolCallId, toolName, result, isError }
581
+ case "approval_request": // { request }
582
+ case "approval_response": // { requestId, response }
583
+ case "compaction_start":
584
+ case "compaction_end": // { summary }
585
+ case "checkpoint": // { id }
586
+ case "dmail_received": // { checkpoint, content }
587
+ case "task_started": // { taskId, taskName }
588
+ case "task_completed": // { taskId, taskName }
589
+ case "task_failed": // { taskId, taskName, error }
590
+ case "error": // { error }
591
+ }
592
+ });
593
+ ```
594
+
595
+ ## 完整示例
596
+
597
+ ```typescript
598
+ import { createAgent } from "@klaus-ai/agent";
599
+ import { Type } from "@sinclair/typebox";
600
+
601
+ const agent = createAgent({
602
+ model: {
603
+ provider: "anthropic",
604
+ model: "claude-sonnet-4-20250514",
605
+ maxContextTokens: 200000,
606
+ capabilities: { vision: true, thinking: true },
607
+ },
608
+ systemPrompt: "You are a coding assistant.",
609
+ tools: [readFileTool, writeFileTool, searchTool],
610
+ thinkingLevel: "medium",
611
+ toolExecution: "parallel",
612
+ maxStepsPerTurn: 30,
613
+
614
+ approval: { autoApproveActions: ["file:read", "search"] },
615
+
616
+ session: { persist: true, directory: "./sessions" },
617
+ compaction: { enabled: true, reserveTokens: 16384, keepRecentTokens: 20000 },
618
+ checkpoint: { enabled: true, enableDMail: true },
619
+
620
+ injection: [memoryProvider, contextProvider],
621
+ extensions: [loggingExtension, guardExtension],
622
+
623
+ subagents: {
624
+ researcher: {
625
+ name: "researcher",
626
+ systemPrompt: "You research topics thoroughly.",
627
+ description: "Research assistant",
628
+ tools: [searchTool],
629
+ },
630
+ },
631
+
632
+ skills: [{ directory: "./skills" }],
633
+
634
+ mcp: {
635
+ servers: [{ name: "fs", transport: { type: "stdio", command: "mcp-fs" } }],
636
+ clientFactory: (config) => new MCPClient(config),
637
+ },
638
+
639
+ wire: { bufferSize: 100 },
640
+ backgroundTasks: { factories: { build: buildTaskFactory } },
641
+
642
+ hooks: {
643
+ transformContext: async (msgs) => msgs,
644
+ beforeToolCall: async (ctx) => {},
645
+ afterToolCall: async (ctx) => {},
646
+ },
647
+ });
648
+
649
+ agent.subscribe((event) => {
650
+ if (event.type === "message_update" && event.event.type === "text") {
651
+ process.stdout.write(event.event.text);
652
+ }
653
+ });
654
+
655
+ await agent.prompt("Help me refactor the auth module");
656
+ await agent.dispose();
657
+ ```
658
+
659
+ ## API 参考
660
+
661
+ ### `createAgent(config): Agent`
662
+
663
+ | 配置项 | 类型 | 必填 | 默认值 | 说明 |
664
+ |--------|------|------|--------|------|
665
+ | `model` | `ModelConfig` | 是 | — | Provider、模型 ID、maxContextTokens、capabilities |
666
+ | `systemPrompt` | `string \| () => string` | 是 | — | 静态或动态系统提示词 |
667
+ | `tools` | `AgentTool[]` | 是 | — | 使用 TypeBox schema 的工具定义 |
668
+ | `approval` | `ApprovalConfig` | 否 | `{}` | yolo、autoApproveActions |
669
+ | `thinkingLevel` | `ThinkingLevel` | 否 | `"off"` | 扩展思考预算 |
670
+ | `toolExecution` | `"sequential" \| "parallel"` | 否 | `"parallel"` | 工具执行模式 |
671
+ | `maxStepsPerTurn` | `number` | 否 | `50` | 内循环最大迭代次数 |
672
+ | `hooks` | `AgentHooks` | 否 | — | transformContext、convertToLlm、beforeToolCall、afterToolCall |
673
+ | `session` | `SessionConfig` | 否 | — | persist、directory、sessionId |
674
+ | `compaction` | `CompactionConfig` | 否 | — | enabled、reserveTokens、keepRecentTokens、customSummarizer |
675
+ | `checkpoint` | `CheckpointConfig` | 否 | — | enabled、enableDMail |
676
+ | `injection` | `DynamicInjectionProvider[]` | 否 | — | 动态上下文 Provider |
677
+ | `extensions` | `ExtensionFactory[]` | 否 | — | 插件工厂 |
678
+ | `subagents` | `Record<string, SubagentConfig>` | 否 | — | 命名子 Agent 配置 |
679
+ | `skills` | `SkillSource[]` | 否 | — | 技能目录 |
680
+ | `mcp` | `{ servers, clientFactory }` | 否 | — | MCP 服务器配置 |
681
+ | `wire` | `{ bufferSize }` | 否 | `{ bufferSize: 0 }` | 事件通道配置 |
682
+ | `backgroundTasks` | `{ factories }` | 否 | — | 后台任务工厂 |
683
+ | `provider` | `LLMProvider` | 否 | — | 自定义 LLM Provider(绕过注册中心) |
684
+
685
+ ### `Agent` 实例
686
+
687
+ | 方法 / 属性 | 说明 |
688
+ |-------------|------|
689
+ | `prompt(input)` | 发送输入并运行 Agent 循环,返回所有消息。 |
690
+ | `continue()` | 无新输入重新进入循环。 |
691
+ | `steer(message)` | 当前工具执行完成后注入消息。 |
692
+ | `followUp(message)` | 内循环结束后注入消息。 |
693
+ | `abort()` | 中止当前运行。 |
694
+ | `subscribe(fn)` | 订阅事件,返回取消订阅函数。 |
695
+ | `dispose()` | 清理所有资源。 |
696
+ | `state` | 当前 `AgentState`(systemPrompt、model、tools、messages、isRunning)。 |
697
+ | `approval` | `Approval` 实例。 |
698
+ | `session` | `SessionManager`(需配置)。 |
699
+ | `checkpoints` | `CheckpointManager`(需配置)。 |
700
+ | `extensions` | `ExtensionRunner`(需配置)。 |
701
+ | `injections` | `InjectionManager`(需配置)。 |
702
+ | `laborMarket` | `LaborMarket`(需配置子 Agent)。 |
703
+ | `mcpAdapter` | `MCPAdapter`(需配置 MCP)。 |
704
+ | `wire` | `Wire` 事件通道(始终可用)。 |
705
+ | `backgroundTasks` | `BackgroundTaskManager`(需配置)。 |
706
+ | `setSystemPrompt(prompt)` | 更新系统提示词。 |
707
+ | `setModel(model)` | 更新模型配置。 |
708
+ | `setTools(tools)` | 替换工具(运行中不可调用)。 |
709
+ | `setThinkingLevel(level)` | 更新思考级别(运行中不可调用)。 |