@n0ts123/mcplink-core 0.0.3 → 0.0.5
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 +274 -0
- package/dist/index.d.ts +8 -5
- package/dist/index.js +50 -20
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -208,11 +208,285 @@ interface MCPLinkConfig {
|
|
|
208
208
|
*/
|
|
209
209
|
enableThinkingPhase?: boolean
|
|
210
210
|
|
|
211
|
+
/**
|
|
212
|
+
* 思考阶段提示词(可选)
|
|
213
|
+
* 自定义 AI 在调用工具前的思考分析提示
|
|
214
|
+
* 不配置则使用内置的默认提示词
|
|
215
|
+
*/
|
|
216
|
+
thinkingPhasePrompt?: string
|
|
217
|
+
|
|
211
218
|
/** 即时结果匹配器,匹配时触发 IMMEDIATE_RESULT 事件 */
|
|
212
219
|
immediateResultMatchers?: Array<Record<string, unknown>>
|
|
213
220
|
}
|
|
214
221
|
```
|
|
215
222
|
|
|
223
|
+
### 配置项详解
|
|
224
|
+
|
|
225
|
+
#### 1. `systemPrompt` - 系统提示词
|
|
226
|
+
|
|
227
|
+
定义 AI 的角色和行为规范:
|
|
228
|
+
|
|
229
|
+
```typescript
|
|
230
|
+
import { MCPLink, DEFAULT_SYSTEM_PROMPT } from '@n0ts123/mcplink-core'
|
|
231
|
+
|
|
232
|
+
const agent = new MCPLink({
|
|
233
|
+
model: openai('gpt-4o'),
|
|
234
|
+
// 完全自定义
|
|
235
|
+
systemPrompt: `你是一个电商客服助手。
|
|
236
|
+
|
|
237
|
+
## 你的职责
|
|
238
|
+
- 帮助用户查询订单
|
|
239
|
+
- 解答产品问题
|
|
240
|
+
- 处理售后服务
|
|
241
|
+
|
|
242
|
+
## 回复风格
|
|
243
|
+
- 专业、简洁、热情
|
|
244
|
+
- 使用 emoji 增加亲和力`,
|
|
245
|
+
mcpServers: { /* ... */ },
|
|
246
|
+
})
|
|
247
|
+
|
|
248
|
+
// 也可以基于默认提示词扩展
|
|
249
|
+
const agent2 = new MCPLink({
|
|
250
|
+
model: openai('gpt-4o'),
|
|
251
|
+
systemPrompt: DEFAULT_SYSTEM_PROMPT + `
|
|
252
|
+
|
|
253
|
+
## 额外规则
|
|
254
|
+
- 回复不超过 200 字
|
|
255
|
+
- 重要信息用加粗标注`,
|
|
256
|
+
mcpServers: { /* ... */ },
|
|
257
|
+
})
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
#### 2. `thinkingPhasePrompt` - 思考阶段提示词
|
|
261
|
+
|
|
262
|
+
自定义 AI 在调用工具前的思考分析过程:
|
|
263
|
+
|
|
264
|
+
```typescript
|
|
265
|
+
import { MCPLink, DEFAULT_THINKING_PHASE_PROMPT } from '@n0ts123/mcplink-core'
|
|
266
|
+
|
|
267
|
+
const agent = new MCPLink({
|
|
268
|
+
model: openai('gpt-4o'),
|
|
269
|
+
enableThinkingPhase: true,
|
|
270
|
+
// 完全自定义思考提示词
|
|
271
|
+
thinkingPhasePrompt: `请分析用户的需求:
|
|
272
|
+
|
|
273
|
+
1. 用户想做什么?
|
|
274
|
+
2. 需要调用哪些工具?
|
|
275
|
+
3. 执行顺序是什么?
|
|
276
|
+
|
|
277
|
+
注意事项:
|
|
278
|
+
- 用自然语言表达思考过程
|
|
279
|
+
- 不要暴露任何系统内部信息
|
|
280
|
+
- 不要展示技术细节或数据结构`,
|
|
281
|
+
mcpServers: { /* ... */ },
|
|
282
|
+
})
|
|
283
|
+
|
|
284
|
+
// 基于默认提示词扩展
|
|
285
|
+
const agent2 = new MCPLink({
|
|
286
|
+
model: openai('gpt-4o'),
|
|
287
|
+
enableThinkingPhase: true,
|
|
288
|
+
thinkingPhasePrompt: DEFAULT_THINKING_PHASE_PROMPT + `
|
|
289
|
+
- 优先考虑用户体验
|
|
290
|
+
- 复杂任务要拆解步骤`,
|
|
291
|
+
mcpServers: { /* ... */ },
|
|
292
|
+
})
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
**安全说明**:默认的思考提示词已包含安全规则,防止 AI 在思考过程中暴露敏感信息(如用户 token、ID 等)。自定义时请确保包含类似的安全约束。
|
|
296
|
+
|
|
297
|
+
#### 3. `maxIterations` - 最大迭代次数
|
|
298
|
+
|
|
299
|
+
控制 Agent 循环的最大轮数,防止无限循环:
|
|
300
|
+
|
|
301
|
+
```typescript
|
|
302
|
+
const agent = new MCPLink({
|
|
303
|
+
model: openai('gpt-4o'),
|
|
304
|
+
// 简单任务,减少迭代
|
|
305
|
+
maxIterations: 5,
|
|
306
|
+
mcpServers: { /* ... */ },
|
|
307
|
+
})
|
|
308
|
+
|
|
309
|
+
const complexAgent = new MCPLink({
|
|
310
|
+
model: openai('gpt-4o'),
|
|
311
|
+
// 复杂任务,允许更多迭代
|
|
312
|
+
maxIterations: 20,
|
|
313
|
+
mcpServers: { /* ... */ },
|
|
314
|
+
})
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
#### 4. `parallelToolCalls` - 并行工具调用
|
|
318
|
+
|
|
319
|
+
控制是否同时执行多个独立的工具调用:
|
|
320
|
+
|
|
321
|
+
```typescript
|
|
322
|
+
const agent = new MCPLink({
|
|
323
|
+
model: openai('gpt-4o'),
|
|
324
|
+
// 启用并行调用(默认)- 多个独立工具同时执行
|
|
325
|
+
parallelToolCalls: true,
|
|
326
|
+
mcpServers: { /* ... */ },
|
|
327
|
+
})
|
|
328
|
+
|
|
329
|
+
const serialAgent = new MCPLink({
|
|
330
|
+
model: openai('gpt-4o'),
|
|
331
|
+
// 禁用并行 - 工具依次执行,适合有依赖关系的场景
|
|
332
|
+
parallelToolCalls: false,
|
|
333
|
+
mcpServers: { /* ... */ },
|
|
334
|
+
})
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
#### 5. `enableThinkingPhase` - 启用思考阶段
|
|
338
|
+
|
|
339
|
+
控制是否在工具调用前进行思考分析:
|
|
340
|
+
|
|
341
|
+
```typescript
|
|
342
|
+
const agent = new MCPLink({
|
|
343
|
+
model: openai('gpt-4o'),
|
|
344
|
+
// 启用思考阶段(默认)- 提高准确性
|
|
345
|
+
enableThinkingPhase: true,
|
|
346
|
+
mcpServers: { /* ... */ },
|
|
347
|
+
})
|
|
348
|
+
|
|
349
|
+
const fastAgent = new MCPLink({
|
|
350
|
+
model: openai('gpt-4o'),
|
|
351
|
+
// 禁用思考阶段 - 减少延迟,适合简单任务
|
|
352
|
+
enableThinkingPhase: false,
|
|
353
|
+
mcpServers: { /* ... */ },
|
|
354
|
+
})
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
#### 6. `immediateResultMatchers` - 即时结果匹配器
|
|
358
|
+
|
|
359
|
+
定义哪些工具返回结果需要立即推送给前端:
|
|
360
|
+
|
|
361
|
+
```typescript
|
|
362
|
+
const agent = new MCPLink({
|
|
363
|
+
model: openai('gpt-4o'),
|
|
364
|
+
immediateResultMatchers: [
|
|
365
|
+
{ type: 'card' }, // 匹配 { type: "card", ... }
|
|
366
|
+
{ type: 'product_list' }, // 匹配 { type: "product_list", ... }
|
|
367
|
+
{ format: 'table' }, // 匹配 { format: "table", ... }
|
|
368
|
+
{ action: 'redirect' }, // 匹配 { action: "redirect", url: "..." }
|
|
369
|
+
],
|
|
370
|
+
mcpServers: { /* ... */ },
|
|
371
|
+
})
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
#### 7. `usePromptBasedTools` - 强制模式选择
|
|
375
|
+
|
|
376
|
+
强制指定使用原生或 Prompt-Based 模式:
|
|
377
|
+
|
|
378
|
+
```typescript
|
|
379
|
+
// 自动检测(默认)
|
|
380
|
+
const autoAgent = new MCPLink({
|
|
381
|
+
model: openai('gpt-4o'),
|
|
382
|
+
usePromptBasedTools: 'auto',
|
|
383
|
+
mcpServers: { /* ... */ },
|
|
384
|
+
})
|
|
385
|
+
|
|
386
|
+
// 强制使用 Prompt-Based 模式
|
|
387
|
+
const promptAgent = new MCPLink({
|
|
388
|
+
model: openai('gpt-4o'),
|
|
389
|
+
usePromptBasedTools: true,
|
|
390
|
+
mcpServers: { /* ... */ },
|
|
391
|
+
})
|
|
392
|
+
|
|
393
|
+
// 强制使用原生 Function Calling
|
|
394
|
+
const nativeAgent = new MCPLink({
|
|
395
|
+
model: openai('gpt-4o'),
|
|
396
|
+
usePromptBasedTools: false,
|
|
397
|
+
mcpServers: { /* ... */ },
|
|
398
|
+
})
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
### 完整配置示例
|
|
402
|
+
|
|
403
|
+
```typescript
|
|
404
|
+
import {
|
|
405
|
+
MCPLink,
|
|
406
|
+
createOpenAI,
|
|
407
|
+
DEFAULT_SYSTEM_PROMPT,
|
|
408
|
+
DEFAULT_THINKING_PHASE_PROMPT
|
|
409
|
+
} from '@n0ts123/mcplink-core'
|
|
410
|
+
|
|
411
|
+
const openai = createOpenAI({
|
|
412
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
413
|
+
baseURL: 'https://api.openai.com/v1',
|
|
414
|
+
})
|
|
415
|
+
|
|
416
|
+
const agent = new MCPLink({
|
|
417
|
+
// 必填:AI 模型
|
|
418
|
+
model: openai('gpt-4o'),
|
|
419
|
+
|
|
420
|
+
// 可选:模型名称(用于自动检测能力)
|
|
421
|
+
modelName: 'gpt-4o',
|
|
422
|
+
|
|
423
|
+
// 可选:系统提示词
|
|
424
|
+
systemPrompt: `你是一个智能客服助手。
|
|
425
|
+
|
|
426
|
+
## 职责
|
|
427
|
+
- 帮助用户查询和管理订单
|
|
428
|
+
- 解答产品相关问题
|
|
429
|
+
- 提供专业的购物建议
|
|
430
|
+
|
|
431
|
+
## 回复规范
|
|
432
|
+
- 简洁明了,重点突出
|
|
433
|
+
- 使用列表展示多条信息
|
|
434
|
+
- 金额用 ¥ 符号标注`,
|
|
435
|
+
|
|
436
|
+
// 可选:思考阶段提示词
|
|
437
|
+
thinkingPhasePrompt: `分析用户需求:
|
|
438
|
+
1. 用户的核心诉求是什么?
|
|
439
|
+
2. 需要获取哪些信息?
|
|
440
|
+
3. 应该调用什么工具?
|
|
441
|
+
|
|
442
|
+
规则:
|
|
443
|
+
- 不要暴露任何内部信息
|
|
444
|
+
- 用自然语言表达
|
|
445
|
+
- 专注于解决用户问题`,
|
|
446
|
+
|
|
447
|
+
// 可选:最大迭代次数
|
|
448
|
+
maxIterations: 10,
|
|
449
|
+
|
|
450
|
+
// 可选:并行工具调用
|
|
451
|
+
parallelToolCalls: true,
|
|
452
|
+
|
|
453
|
+
// 可选:启用思考阶段
|
|
454
|
+
enableThinkingPhase: true,
|
|
455
|
+
|
|
456
|
+
// 可选:模式选择
|
|
457
|
+
usePromptBasedTools: 'auto',
|
|
458
|
+
|
|
459
|
+
// 可选:即时结果匹配器
|
|
460
|
+
immediateResultMatchers: [
|
|
461
|
+
{ type: 'card' },
|
|
462
|
+
{ type: 'product_list' },
|
|
463
|
+
],
|
|
464
|
+
|
|
465
|
+
// MCP 服务器配置
|
|
466
|
+
mcpServers: {
|
|
467
|
+
// stdio 模式 - 本地进程
|
|
468
|
+
business: {
|
|
469
|
+
type: 'stdio',
|
|
470
|
+
command: 'node',
|
|
471
|
+
args: ['./mcp-server.js'],
|
|
472
|
+
env: { DEBUG: 'true' },
|
|
473
|
+
},
|
|
474
|
+
// SSE 模式 - 远程服务
|
|
475
|
+
remote: {
|
|
476
|
+
type: 'sse',
|
|
477
|
+
url: 'http://localhost:8080/mcp',
|
|
478
|
+
headers: { 'Authorization': 'Bearer token' },
|
|
479
|
+
},
|
|
480
|
+
// Streamable HTTP 模式
|
|
481
|
+
streamable: {
|
|
482
|
+
type: 'streamable-http',
|
|
483
|
+
url: 'http://localhost:8080/mcp/stream',
|
|
484
|
+
headers: { 'X-API-Key': 'key' },
|
|
485
|
+
},
|
|
486
|
+
},
|
|
487
|
+
})
|
|
488
|
+
```
|
|
489
|
+
|
|
216
490
|
### MCP 服务器配置
|
|
217
491
|
|
|
218
492
|
```typescript
|
package/dist/index.d.ts
CHANGED
|
@@ -369,6 +369,11 @@ declare class MCPManager {
|
|
|
369
369
|
* 这只是用户自定义的部分,核心工具调用逻辑已内置到代码中
|
|
370
370
|
*/
|
|
371
371
|
declare const DEFAULT_SYSTEM_PROMPT = "\u4F60\u662F\u4E00\u4E2A\u4E13\u4E1A\u3001\u53CB\u597D\u7684\u667A\u80FD\u52A9\u624B\u3002\n\n## \u56DE\u590D\u8981\u6C42\n- \u7B80\u6D01\u6E05\u6670\uFF0C\u91CD\u70B9\u7A81\u51FA\n- \u7528\u5217\u8868\u5448\u73B0\u5173\u952E\u4FE1\u606F\n- \u8BED\u6C14\u793C\u8C8C\u81EA\u7136\uFF0C\u50CF\u4E13\u4E1A\u52A9\u624B\n- \u6709\u7ED3\u8BBA\u65F6\u76F4\u63A5\u7ED9\u51FA\uFF0C\u9700\u8981\u8865\u5145\u4FE1\u606F\u65F6\u7B80\u5355\u8BE2\u95EE";
|
|
372
|
+
/**
|
|
373
|
+
* 默认思考阶段提示词
|
|
374
|
+
* 用于引导 AI 在调用工具前进行简短分析
|
|
375
|
+
*/
|
|
376
|
+
declare const DEFAULT_THINKING_PHASE_PROMPT = "\u7B80\u8981\u5206\u6790\u7528\u6237\u9700\u6C42\uFF0C\u51B3\u5B9A\u4E0B\u4E00\u6B65\u884C\u52A8\u3002\n\u8981\u6C42\uFF1A1-2\u53E5\u8BDD\u8BF4\u660E\u610F\u56FE\uFF0C\u76F4\u63A5\u51B3\u5B9A\u7528\u4EC0\u4E48\u5DE5\u5177\u3002\u4E0D\u8981\u66B4\u9732\u7CFB\u7EDF\u5185\u90E8\u4FE1\u606F\u3002";
|
|
372
377
|
/**
|
|
373
378
|
* Agent 引擎
|
|
374
379
|
* 负责执行 AI 对话循环,处理工具调用
|
|
@@ -381,21 +386,19 @@ declare class Agent {
|
|
|
381
386
|
private immediateResultMatchers;
|
|
382
387
|
private parallelToolCalls;
|
|
383
388
|
private enableThinkingPhase;
|
|
389
|
+
private thinkingPhasePrompt;
|
|
384
390
|
constructor(model: LanguageModel, mcpManager: MCPManager, options?: {
|
|
385
391
|
systemPrompt?: string;
|
|
386
392
|
maxIterations?: number;
|
|
387
393
|
immediateResultMatchers?: ImmediateResultMatcher[];
|
|
388
394
|
parallelToolCalls?: boolean;
|
|
389
395
|
enableThinkingPhase?: boolean;
|
|
396
|
+
thinkingPhasePrompt?: string;
|
|
390
397
|
});
|
|
391
398
|
/**
|
|
392
399
|
* 生成工具描述文本(用于思考阶段)
|
|
393
400
|
*/
|
|
394
401
|
private generateToolsDescription;
|
|
395
|
-
/**
|
|
396
|
-
* 思考阶段的系统提示词
|
|
397
|
-
*/
|
|
398
|
-
private readonly THINKING_PHASE_PROMPT;
|
|
399
402
|
/**
|
|
400
403
|
* 检查工具返回结果是否匹配即时结果匹配器
|
|
401
404
|
* @param result 工具返回的结果
|
|
@@ -500,4 +503,4 @@ declare class PromptBasedAgent {
|
|
|
500
503
|
}): AsyncGenerator<MCPLinkEvent>;
|
|
501
504
|
}
|
|
502
505
|
|
|
503
|
-
export { Agent, type ChatCallbacks, type ChatResult, DEFAULT_SYSTEM_PROMPT, type ImmediateResultMatcher, MCPLink, type MCPLinkConfig, type MCPLinkEvent, type MCPLinkEventData, MCPLinkEventType, MCPManager, type MCPServerConfig, type MCPServerConfigSSE, type MCPServerConfigStdio, type MCPServerStatus, type MCPTool, type Message, type MessageRole, PromptBasedAgent, type ToolCall, type ToolResult };
|
|
506
|
+
export { Agent, type ChatCallbacks, type ChatResult, DEFAULT_SYSTEM_PROMPT, DEFAULT_THINKING_PHASE_PROMPT, type ImmediateResultMatcher, MCPLink, type MCPLinkConfig, type MCPLinkEvent, type MCPLinkEventData, MCPLinkEventType, MCPManager, type MCPServerConfig, type MCPServerConfigSSE, type MCPServerConfigStdio, type MCPServerStatus, type MCPTool, type Message, type MessageRole, PromptBasedAgent, type ToolCall, type ToolResult };
|
package/dist/index.js
CHANGED
|
@@ -277,6 +277,8 @@ var DEFAULT_SYSTEM_PROMPT = `\u4F60\u662F\u4E00\u4E2A\u4E13\u4E1A\u3001\u53CB\u5
|
|
|
277
277
|
- \u7528\u5217\u8868\u5448\u73B0\u5173\u952E\u4FE1\u606F
|
|
278
278
|
- \u8BED\u6C14\u793C\u8C8C\u81EA\u7136\uFF0C\u50CF\u4E13\u4E1A\u52A9\u624B
|
|
279
279
|
- \u6709\u7ED3\u8BBA\u65F6\u76F4\u63A5\u7ED9\u51FA\uFF0C\u9700\u8981\u8865\u5145\u4FE1\u606F\u65F6\u7B80\u5355\u8BE2\u95EE`;
|
|
280
|
+
var DEFAULT_THINKING_PHASE_PROMPT = `\u7B80\u8981\u5206\u6790\u7528\u6237\u9700\u6C42\uFF0C\u51B3\u5B9A\u4E0B\u4E00\u6B65\u884C\u52A8\u3002
|
|
281
|
+
\u8981\u6C42\uFF1A1-2\u53E5\u8BDD\u8BF4\u660E\u610F\u56FE\uFF0C\u76F4\u63A5\u51B3\u5B9A\u7528\u4EC0\u4E48\u5DE5\u5177\u3002\u4E0D\u8981\u66B4\u9732\u7CFB\u7EDF\u5185\u90E8\u4FE1\u606F\u3002`;
|
|
280
282
|
var Agent = class {
|
|
281
283
|
model;
|
|
282
284
|
mcpManager;
|
|
@@ -285,6 +287,7 @@ var Agent = class {
|
|
|
285
287
|
immediateResultMatchers;
|
|
286
288
|
parallelToolCalls;
|
|
287
289
|
enableThinkingPhase;
|
|
290
|
+
thinkingPhasePrompt;
|
|
288
291
|
constructor(model, mcpManager, options = {}) {
|
|
289
292
|
this.model = model;
|
|
290
293
|
this.mcpManager = mcpManager;
|
|
@@ -293,6 +296,7 @@ var Agent = class {
|
|
|
293
296
|
this.immediateResultMatchers = options.immediateResultMatchers || [];
|
|
294
297
|
this.parallelToolCalls = options.parallelToolCalls ?? true;
|
|
295
298
|
this.enableThinkingPhase = options.enableThinkingPhase ?? true;
|
|
299
|
+
this.thinkingPhasePrompt = options.thinkingPhasePrompt || DEFAULT_THINKING_PHASE_PROMPT;
|
|
296
300
|
}
|
|
297
301
|
/**
|
|
298
302
|
* 生成工具描述文本(用于思考阶段)
|
|
@@ -321,20 +325,6 @@ var Agent = class {
|
|
|
321
325
|
}
|
|
322
326
|
return description;
|
|
323
327
|
}
|
|
324
|
-
/**
|
|
325
|
-
* 思考阶段的系统提示词
|
|
326
|
-
*/
|
|
327
|
-
THINKING_PHASE_PROMPT = `\u4F60\u6B63\u5728\u601D\u8003\u5982\u4F55\u5E2E\u52A9\u7528\u6237\u3002\u8BF7\u7528\u81EA\u7136\u8BED\u8A00\u5206\u6790\uFF1A
|
|
328
|
-
|
|
329
|
-
1. \u7528\u6237\u60F3\u8981\u4EC0\u4E48\uFF1F
|
|
330
|
-
2. \u6211\u76EE\u524D\u638C\u63E1\u4E86\u54EA\u4E9B\u4FE1\u606F\uFF1F
|
|
331
|
-
3. \u8FD8\u9700\u8981\u505A\u4EC0\u4E48\u624D\u80FD\u56DE\u7B54\u7528\u6237\uFF1F
|
|
332
|
-
|
|
333
|
-
\u8981\u6C42\uFF1A
|
|
334
|
-
- \u50CF\u5185\u5FC3\u72EC\u767D\u4E00\u6837\u81EA\u7136\u8868\u8FBE
|
|
335
|
-
- \u4F53\u73B0\u4F60\u8BA4\u771F\u5206\u6790\u4E86\u95EE\u9898
|
|
336
|
-
- \u8BF4\u6E05\u695A\u63A5\u4E0B\u6765\u7684\u8BA1\u5212
|
|
337
|
-
- \u4E0D\u8981\u8F93\u51FA\u7ED9\u7528\u6237\u770B\u7684\u6B63\u5F0F\u56DE\u590D\uFF08\u5982\u4EA7\u54C1\u5217\u8868\u3001\u7ED3\u8BBA\u7B49\uFF09"`;
|
|
338
328
|
/**
|
|
339
329
|
* 检查工具返回结果是否匹配即时结果匹配器
|
|
340
330
|
* @param result 工具返回的结果
|
|
@@ -344,10 +334,21 @@ var Agent = class {
|
|
|
344
334
|
if (!this.immediateResultMatchers.length) {
|
|
345
335
|
return false;
|
|
346
336
|
}
|
|
347
|
-
|
|
337
|
+
let resultObj = null;
|
|
338
|
+
if (typeof result === "string") {
|
|
339
|
+
try {
|
|
340
|
+
const parsed = JSON.parse(result);
|
|
341
|
+
if (typeof parsed === "object" && parsed !== null) {
|
|
342
|
+
resultObj = parsed;
|
|
343
|
+
}
|
|
344
|
+
} catch {
|
|
345
|
+
}
|
|
346
|
+
} else if (typeof result === "object" && result !== null) {
|
|
347
|
+
resultObj = result;
|
|
348
|
+
}
|
|
349
|
+
if (!resultObj) {
|
|
348
350
|
return false;
|
|
349
351
|
}
|
|
350
|
-
const resultObj = result;
|
|
351
352
|
for (const matcher of this.immediateResultMatchers) {
|
|
352
353
|
let matched = true;
|
|
353
354
|
for (const [key, value] of Object.entries(matcher)) {
|
|
@@ -610,7 +611,7 @@ var Agent = class {
|
|
|
610
611
|
const thinkingMessages = [
|
|
611
612
|
{
|
|
612
613
|
role: "system",
|
|
613
|
-
content: `${this.
|
|
614
|
+
content: `${this.thinkingPhasePrompt}
|
|
614
615
|
|
|
615
616
|
## \u53EF\u7528\u5DE5\u5177
|
|
616
617
|
${toolsDescription}`
|
|
@@ -896,6 +897,7 @@ ${thinkingContent}`
|
|
|
896
897
|
}
|
|
897
898
|
};
|
|
898
899
|
}
|
|
900
|
+
let hasImmediateResult = false;
|
|
899
901
|
if (this.parallelToolCalls && toolCalls.length > 1) {
|
|
900
902
|
const executePromises = toolCalls.map(async (toolCall) => {
|
|
901
903
|
const toolStartTime = Date.now();
|
|
@@ -931,6 +933,7 @@ ${thinkingContent}`
|
|
|
931
933
|
}
|
|
932
934
|
};
|
|
933
935
|
if (!r.isError && this.matchImmediateResult(r.result)) {
|
|
936
|
+
hasImmediateResult = true;
|
|
934
937
|
yield {
|
|
935
938
|
type: "immediate_result" /* IMMEDIATE_RESULT */,
|
|
936
939
|
timestamp: Date.now(),
|
|
@@ -982,6 +985,7 @@ ${thinkingContent}`
|
|
|
982
985
|
}
|
|
983
986
|
};
|
|
984
987
|
if (!isError && this.matchImmediateResult(result)) {
|
|
988
|
+
hasImmediateResult = true;
|
|
985
989
|
yield {
|
|
986
990
|
type: "immediate_result" /* IMMEDIATE_RESULT */,
|
|
987
991
|
timestamp: Date.now(),
|
|
@@ -1007,6 +1011,14 @@ ${thinkingContent}`
|
|
|
1007
1011
|
});
|
|
1008
1012
|
}
|
|
1009
1013
|
}
|
|
1014
|
+
if (hasImmediateResult) {
|
|
1015
|
+
yield {
|
|
1016
|
+
type: "iteration_end" /* ITERATION_END */,
|
|
1017
|
+
timestamp: Date.now(),
|
|
1018
|
+
data: { iteration }
|
|
1019
|
+
};
|
|
1020
|
+
break;
|
|
1021
|
+
}
|
|
1010
1022
|
messages.push({
|
|
1011
1023
|
role: "assistant",
|
|
1012
1024
|
content: [
|
|
@@ -1076,10 +1088,21 @@ var PromptBasedAgent = class {
|
|
|
1076
1088
|
if (!this.immediateResultMatchers.length) {
|
|
1077
1089
|
return false;
|
|
1078
1090
|
}
|
|
1079
|
-
|
|
1091
|
+
let resultObj = null;
|
|
1092
|
+
if (typeof result === "string") {
|
|
1093
|
+
try {
|
|
1094
|
+
const parsed = JSON.parse(result);
|
|
1095
|
+
if (typeof parsed === "object" && parsed !== null) {
|
|
1096
|
+
resultObj = parsed;
|
|
1097
|
+
}
|
|
1098
|
+
} catch {
|
|
1099
|
+
}
|
|
1100
|
+
} else if (typeof result === "object" && result !== null) {
|
|
1101
|
+
resultObj = result;
|
|
1102
|
+
}
|
|
1103
|
+
if (!resultObj) {
|
|
1080
1104
|
return false;
|
|
1081
1105
|
}
|
|
1082
|
-
const resultObj = result;
|
|
1083
1106
|
for (const matcher of this.immediateResultMatchers) {
|
|
1084
1107
|
let matched = true;
|
|
1085
1108
|
for (const [key, value] of Object.entries(matcher)) {
|
|
@@ -1461,6 +1484,13 @@ ${this.BUILT_IN_PROMPT}`;
|
|
|
1461
1484
|
immediateResult: result
|
|
1462
1485
|
}
|
|
1463
1486
|
};
|
|
1487
|
+
yield { type: "iteration_end" /* ITERATION_END */, timestamp: Date.now(), data: { iteration } };
|
|
1488
|
+
yield {
|
|
1489
|
+
type: "complete" /* COMPLETE */,
|
|
1490
|
+
timestamp: Date.now(),
|
|
1491
|
+
data: { totalDuration: Date.now() - startTime, totalIterations: iteration }
|
|
1492
|
+
};
|
|
1493
|
+
return;
|
|
1464
1494
|
}
|
|
1465
1495
|
messages.push({ role: "assistant", content: fullResponse });
|
|
1466
1496
|
const resultStr = typeof result === "string" ? result : JSON.stringify(result, null, 2);
|
|
@@ -1726,6 +1756,6 @@ var MCPLink = class {
|
|
|
1726
1756
|
}
|
|
1727
1757
|
};
|
|
1728
1758
|
|
|
1729
|
-
export { Agent, DEFAULT_SYSTEM_PROMPT, MCPLink, MCPLinkEventType, MCPManager, PromptBasedAgent };
|
|
1759
|
+
export { Agent, DEFAULT_SYSTEM_PROMPT, DEFAULT_THINKING_PHASE_PROMPT, MCPLink, MCPLinkEventType, MCPManager, PromptBasedAgent };
|
|
1730
1760
|
//# sourceMappingURL=index.js.map
|
|
1731
1761
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/MCPManager.ts","../src/types.ts","../src/Agent.ts","../src/PromptBasedAgent.ts","../src/MCPLink.ts"],"names":["MCPLinkEventType","duration","streamText"],"mappings":"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","file":"index.js","sourcesContent":["import { Client } from '@modelcontextprotocol/sdk/client/index.js'\r\nimport { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js'\r\nimport { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js'\r\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'\r\nimport type { MCPServerConfig, MCPServerConfigStdio, MCPServerConfigSSE, MCPServerConfigStreamableHTTP, MCPTool, MCPServerStatus } from './types.js'\r\n\r\n/**\r\n * MCP 服务器实例\r\n */\r\ninterface MCPServerInstance {\r\n id: string\r\n config: MCPServerConfig\r\n client: Client\r\n transport: StdioClientTransport | SSEClientTransport | StreamableHTTPClientTransport\r\n tools: MCPTool[]\r\n status: 'stopped' | 'starting' | 'running' | 'error'\r\n error?: string\r\n}\r\n\r\n/**\r\n * MCP 管理器\r\n * 负责管理多个 MCP 服务器的连接、工具发现和调用\r\n */\r\nexport class MCPManager {\r\n private servers: Map<string, MCPServerInstance> = new Map()\r\n\r\n /**\r\n * 添加 MCP 服务器配置\r\n */\r\n addServer(id: string, config: MCPServerConfig): void {\r\n if (this.servers.has(id)) {\r\n throw new Error(`MCP server \"${id}\" already exists`)\r\n }\r\n\r\n // 创建 Client\r\n const client = new Client({ name: 'mcplink', version: '0.0.1' }, { capabilities: {} })\r\n\r\n // 创建 Transport\r\n let transport: StdioClientTransport | SSEClientTransport | StreamableHTTPClientTransport\r\n\r\n if (config.type === 'sse') {\r\n const sseConfig = config as MCPServerConfigSSE\r\n transport = new SSEClientTransport(new URL(sseConfig.url))\r\n } else if (config.type === 'streamable-http') {\r\n const httpConfig = config as MCPServerConfigStreamableHTTP\r\n transport = new StreamableHTTPClientTransport(new URL(httpConfig.url))\r\n } else {\r\n const stdioConfig = config as MCPServerConfigStdio\r\n // 合并当前进程的环境变量和配置的环境变量\r\n // 过滤掉 undefined 值\r\n const processEnv: Record<string, string> = {}\r\n for (const [key, value] of Object.entries(process.env)) {\r\n if (value !== undefined) {\r\n processEnv[key] = value\r\n }\r\n }\r\n const mergedEnv = {\r\n ...processEnv,\r\n ...stdioConfig.env,\r\n }\r\n\r\n // Windows 兼容性处理\r\n // 在 Windows 上,npx/npm 等命令实际上是 .cmd 文件,需要通过 shell 执行\r\n const isWindows = process.platform === 'win32'\r\n let command = stdioConfig.command\r\n let args = stdioConfig.args || []\r\n\r\n if (isWindows) {\r\n // 对于 npx, npm, node 等命令,在 Windows 上需要通过 cmd /c 执行\r\n const windowsCommands = ['npx', 'npm', 'node', 'pnpm', 'yarn', 'bunx']\r\n if (windowsCommands.includes(command.toLowerCase())) {\r\n args = ['/c', command, ...args]\r\n command = 'cmd'\r\n }\r\n }\r\n\r\n transport = new StdioClientTransport({\r\n command,\r\n args,\r\n env: mergedEnv,\r\n })\r\n }\r\n\r\n this.servers.set(id, {\r\n id,\r\n config,\r\n client,\r\n transport,\r\n tools: [],\r\n status: 'stopped',\r\n })\r\n }\r\n\r\n /**\r\n * 启动 MCP 服务器\r\n */\r\n async startServer(id: string): Promise<void> {\r\n const server = this.servers.get(id)\r\n if (!server) {\r\n throw new Error(`MCP server \"${id}\" not found`)\r\n }\r\n\r\n if (server.status === 'running') {\r\n return\r\n }\r\n\r\n server.status = 'starting'\r\n server.error = undefined\r\n\r\n // 打印启动信息\r\n const config = server.config\r\n if (config.type === 'stdio') {\r\n const stdioConfig = config as MCPServerConfigStdio\r\n const isWindows = process.platform === 'win32'\r\n const windowsCommands = ['npx', 'npm', 'node', 'pnpm', 'yarn', 'bunx']\r\n let displayCmd = stdioConfig.command\r\n let displayArgs = stdioConfig.args || []\r\n\r\n if (isWindows && windowsCommands.includes(stdioConfig.command.toLowerCase())) {\r\n displayCmd = 'cmd'\r\n displayArgs = ['/c', stdioConfig.command, ...displayArgs]\r\n }\r\n\r\n console.log(`\\n🔧 [MCP] 正在启动服务器 \"${id}\"...`)\r\n console.log(` 命令: ${displayCmd} ${displayArgs.join(' ')}`)\r\n if (stdioConfig.env && Object.keys(stdioConfig.env).length > 0) {\r\n console.log(` 环境变量: ${Object.keys(stdioConfig.env).join(', ')}`)\r\n }\r\n } else if (config.type === 'sse') {\r\n const sseConfig = config as MCPServerConfigSSE\r\n console.log(`\\n🔧 [MCP] 正在连接 SSE 服务器 \"${id}\"...`)\r\n console.log(` URL: ${sseConfig.url}`)\r\n } else if (config.type === 'streamable-http') {\r\n const httpConfig = config as MCPServerConfigStreamableHTTP\r\n console.log(`\\n🔧 [MCP] 正在连接 Streamable HTTP 服务器 \"${id}\"...`)\r\n console.log(` URL: ${httpConfig.url}`)\r\n }\r\n\r\n try {\r\n // 连接到服务器\r\n await server.client.connect(server.transport)\r\n\r\n // 获取工具列表\r\n const toolsResult = await server.client.listTools()\r\n server.tools = toolsResult.tools.map((tool) => ({\r\n name: tool.name,\r\n description: tool.description || '',\r\n inputSchema: tool.inputSchema as MCPTool['inputSchema'],\r\n }))\r\n\r\n server.status = 'running'\r\n console.log(`✅ [MCP] 服务器 \"${id}\" 启动成功,发现 ${server.tools.length} 个工具`)\r\n if (server.tools.length > 0) {\r\n console.log(` 工具: ${server.tools.map((t) => t.name).join(', ')}`)\r\n }\r\n } catch (error) {\r\n server.status = 'error'\r\n\r\n // 提供更详细的错误信息\r\n let errorMessage = error instanceof Error ? error.message : String(error)\r\n\r\n if (errorMessage.includes('Connection closed')) {\r\n if (config.type === 'stdio') {\r\n const stdioConfig = config as MCPServerConfigStdio\r\n errorMessage =\r\n `MCP 服务器启动失败: 进程立即退出。\\n` +\r\n `命令: ${stdioConfig.command} ${(stdioConfig.args || []).join(' ')}\\n` +\r\n `可能原因:\\n` +\r\n `1. 命令 \"${stdioConfig.command}\" 不存在或不在 PATH 中\\n` +\r\n `2. 如果使用 Docker,请确保 Docker 正在运行\\n` +\r\n `3. 检查环境变量是否正确配置\\n` +\r\n `4. 尝试在终端手动运行命令查看具体错误`\r\n }\r\n }\r\n\r\n // 打印错误到控制台\r\n console.error(`❌ [MCP] 服务器 \"${id}\" 启动失败:`)\r\n console.error(` ${errorMessage.split('\\n').join('\\n ')}`)\r\n\r\n server.error = errorMessage\r\n throw new Error(errorMessage)\r\n }\r\n }\r\n\r\n /**\r\n * 停止 MCP 服务器\r\n */\r\n async stopServer(id: string): Promise<void> {\r\n const server = this.servers.get(id)\r\n if (!server) {\r\n throw new Error(`MCP server \"${id}\" not found`)\r\n }\r\n\r\n if (server.status === 'stopped') {\r\n return\r\n }\r\n\r\n console.log(`🔧 [MCP] 正在停止服务器 \"${id}\"...`)\r\n\r\n try {\r\n await server.client.close()\r\n console.log(`✅ [MCP] 服务器 \"${id}\" 已停止`)\r\n } catch (error) {\r\n console.error(`⚠️ [MCP] 停止服务器 \"${id}\" 时出错:`, error)\r\n } finally {\r\n server.status = 'stopped'\r\n server.tools = []\r\n }\r\n }\r\n\r\n /**\r\n * 启动所有已配置的服务器\r\n */\r\n async startAll(): Promise<void> {\r\n const startPromises = Array.from(this.servers.keys()).map((id) =>\r\n this.startServer(id).catch((error) => {\r\n console.error(`Failed to start MCP server \"${id}\":`, error)\r\n })\r\n )\r\n await Promise.all(startPromises)\r\n }\r\n\r\n /**\r\n * 停止所有服务器\r\n */\r\n async stopAll(): Promise<void> {\r\n const stopPromises = Array.from(this.servers.keys()).map((id) =>\r\n this.stopServer(id).catch((error) => {\r\n console.error(`Failed to stop MCP server \"${id}\":`, error)\r\n })\r\n )\r\n await Promise.all(stopPromises)\r\n }\r\n\r\n /**\r\n * 获取所有可用的工具\r\n */\r\n getAllTools(): MCPTool[] {\r\n const tools: MCPTool[] = []\r\n for (const server of this.servers.values()) {\r\n if (server.status === 'running') {\r\n tools.push(...server.tools)\r\n }\r\n }\r\n return tools\r\n }\r\n\r\n /**\r\n * 调用工具\r\n */\r\n async callTool(toolName: string, args: Record<string, unknown>): Promise<unknown> {\r\n // 找到提供该工具的服务器\r\n for (const server of this.servers.values()) {\r\n if (server.status !== 'running') continue\r\n\r\n const tool = server.tools.find((t) => t.name === toolName)\r\n if (tool) {\r\n const result = await server.client.callTool({\r\n name: toolName,\r\n arguments: args,\r\n })\r\n\r\n // 处理结果\r\n if (result.content && Array.isArray(result.content)) {\r\n // 如果是文本内容,拼接返回\r\n const textContents = result.content\r\n .filter((c): c is { type: 'text'; text: string } => c.type === 'text')\r\n .map((c) => c.text)\r\n\r\n if (textContents.length > 0) {\r\n const textResult = textContents.join('\\n')\r\n // 检查是否是错误结果\r\n if (result.isError) {\r\n throw new Error(textResult || '工具执行失败')\r\n }\r\n return textResult\r\n }\r\n }\r\n\r\n // 检查是否是错误结果\r\n if (result.isError) {\r\n const errorContent = result.content\r\n throw new Error(\r\n typeof errorContent === 'string'\r\n ? errorContent\r\n : JSON.stringify(errorContent) || '工具执行失败'\r\n )\r\n }\r\n\r\n return result.content\r\n }\r\n }\r\n\r\n throw new Error(`Tool \"${toolName}\" not found in any running MCP server`)\r\n }\r\n\r\n /**\r\n * 获取所有服务器状态\r\n */\r\n getServerStatuses(): MCPServerStatus[] {\r\n return Array.from(this.servers.values()).map((server) => ({\r\n id: server.id,\r\n name: server.id,\r\n config: server.config,\r\n status: server.status,\r\n tools: server.tools,\r\n error: server.error,\r\n }))\r\n }\r\n\r\n /**\r\n * 移除服务器\r\n */\r\n async removeServer(id: string): Promise<void> {\r\n await this.stopServer(id)\r\n this.servers.delete(id)\r\n }\r\n}\r\n","import type { LanguageModel } from 'ai'\r\n\r\n// ============ 配置类型 ============\r\n\r\n/** MCP 服务器配置 - stdio 模式 */\r\nexport interface MCPServerConfigStdio {\r\n type?: 'stdio'\r\n /** 启动命令 */\r\n command: string\r\n /** 命令参数 */\r\n args?: string[]\r\n /** 环境变量 */\r\n env?: Record<string, string>\r\n}\r\n\r\n/** MCP 服务器配置 - SSE 模式 */\r\nexport interface MCPServerConfigSSE {\r\n type: 'sse'\r\n /** SSE 服务地址 */\r\n url: string\r\n /** 请求头 */\r\n headers?: Record<string, string>\r\n}\r\n\r\n/** MCP 服务器配置 - Streamable HTTP 模式 */\r\nexport interface MCPServerConfigStreamableHTTP {\r\n type: 'streamable-http'\r\n /** HTTP 服务地址 */\r\n url: string\r\n /** 请求头 */\r\n headers?: Record<string, string>\r\n}\r\n\r\n/** MCP 服务器配置 */\r\nexport type MCPServerConfig = MCPServerConfigStdio | MCPServerConfigSSE | MCPServerConfigStreamableHTTP\r\n\r\n/**\r\n * 即时结果匹配器\r\n * 用于检测 MCP 工具返回的特殊格式数据\r\n * 当工具返回的 JSON 包含匹配器中所有的 key-value 时,会立即发送 IMMEDIATE_RESULT 事件\r\n * \r\n * @example\r\n * // 匹配包含 { type: \"card\" } 的返回结果\r\n * { type: \"card\" }\r\n * \r\n * // 匹配包含 { type: \"product_list\", isCard: true } 的返回结果\r\n * { type: \"product_list\", isCard: true }\r\n */\r\nexport type ImmediateResultMatcher = Record<string, unknown>\r\n\r\n/** MCPLink 配置 */\r\nexport interface MCPLinkConfig {\r\n /** AI 模型实例 (Vercel AI SDK) */\r\n model: LanguageModel\r\n /** 模型名称(用于自动检测是否支持原生工具调用) */\r\n modelName?: string\r\n /** MCP 服务器配置 */\r\n mcpServers?: Record<string, MCPServerConfig>\r\n /** 系统提示词 */\r\n systemPrompt?: string\r\n /** 最大迭代次数 (防止无限循环) */\r\n maxIterations?: number\r\n /** 是否允许并行工具调用 */\r\n parallelToolCalls?: boolean\r\n /**\r\n * 是否使用基于 Prompt 的工具调用\r\n * - true: 使用 prompt 让模型输出特定格式来调用工具(支持所有模型)\r\n * - false: 使用原生 function calling(需要模型支持)\r\n * - 'auto': 自动检测(默认)\r\n */\r\n usePromptBasedTools?: boolean | 'auto'\r\n /**\r\n * 即时结果匹配器列表\r\n * 当 MCP 工具返回的结果匹配任意一个匹配器时,会立即发送 IMMEDIATE_RESULT 事件\r\n * 匹配规则:结果 JSON 中包含匹配器的所有 key 且对应的 value 相等\r\n * \r\n * @example\r\n * immediateResultMatchers: [\r\n * { type: \"card\" }, // 匹配 { type: \"card\", ... }\r\n * { type: \"product_list\" }, // 匹配 { type: \"product_list\", ... }\r\n * ]\r\n */\r\n immediateResultMatchers?: ImmediateResultMatcher[]\r\n /**\r\n * 是否启用思考阶段(两阶段调用)\r\n * - true: 每次迭代先让 AI 思考分析,再执行工具调用(默认,推荐)\r\n * - false: 直接调用 AI 并执行工具(更快但可能不够准确)\r\n * \r\n * 启用后的流程:\r\n * 1. 思考阶段:AI 分析需求,输出思考过程,决定调用什么工具\r\n * 2. 执行阶段:根据思考结果执行工具调用\r\n * \r\n * 优点:\r\n * - 任何模型都能看到思考过程\r\n * - Chain-of-Thought 效应,显著提高复杂任务准确性\r\n * \r\n * 缺点:\r\n * - 每次迭代多一次 API 调用,增加延迟和成本\r\n * \r\n * @default true\r\n */\r\n enableThinkingPhase?: boolean\r\n}\r\n\r\n// ============ 消息类型 ============\r\n\r\n/** 工具调用 */\r\nexport interface ToolCall {\r\n id: string\r\n name: string\r\n arguments: Record<string, unknown>\r\n}\r\n\r\n/** 工具结果 */\r\nexport interface ToolResult {\r\n toolCallId: string\r\n toolName: string\r\n result: unknown\r\n isError?: boolean\r\n duration?: number\r\n}\r\n\r\n/** 消息角色 */\r\nexport type MessageRole = 'system' | 'user' | 'assistant' | 'tool'\r\n\r\n/** 消息 */\r\nexport interface Message {\r\n role: MessageRole\r\n content: string\r\n toolCalls?: ToolCall[]\r\n toolResults?: ToolResult[]\r\n}\r\n\r\n// ============ 事件类型 ============\r\n\r\n/** 事件类型 */\r\nexport enum MCPLinkEventType {\r\n /** AI 开始思考 */\r\n THINKING_START = 'thinking_start',\r\n /** AI 思考内容 (流式) */\r\n THINKING_DELTA = 'thinking_delta',\r\n /** AI 思考结束 */\r\n THINKING_END = 'thinking_end',\r\n /** AI 思考内容(完整,用于工具调用时展示) */\r\n THINKING_CONTENT = 'thinking_content',\r\n\r\n /** AI 开始回复 */\r\n TEXT_START = 'text_start',\r\n /** AI 回复内容 (流式) */\r\n TEXT_DELTA = 'text_delta',\r\n /** AI 回复结束 */\r\n TEXT_END = 'text_end',\r\n\r\n /** 开始调用工具 */\r\n TOOL_CALL_START = 'tool_call_start',\r\n /** 工具参数 (流式) */\r\n TOOL_CALL_DELTA = 'tool_call_delta',\r\n /** 工具正在执行 */\r\n TOOL_EXECUTING = 'tool_executing',\r\n /** 工具返回结果 */\r\n TOOL_RESULT = 'tool_result',\r\n /** 工具返回的即时结果(匹配 immediateResultMatchers 时触发) */\r\n IMMEDIATE_RESULT = 'immediate_result',\r\n\r\n /** 开始新一轮迭代 */\r\n ITERATION_START = 'iteration_start',\r\n /** 迭代结束 */\r\n ITERATION_END = 'iteration_end',\r\n\r\n /** 全部完成 */\r\n COMPLETE = 'complete',\r\n /** 发生错误 */\r\n ERROR = 'error',\r\n}\r\n\r\n/** 事件数据 */\r\nexport interface MCPLinkEventData {\r\n content?: string\r\n toolName?: string\r\n toolArgs?: Record<string, unknown>\r\n toolResult?: unknown\r\n toolCallId?: string\r\n duration?: number\r\n iteration?: number\r\n maxIterations?: number\r\n totalIterations?: number\r\n totalDuration?: number\r\n argsTextDelta?: string\r\n isError?: boolean\r\n error?: Error\r\n /** 即时结果数据(原封不动的工具返回结果) */\r\n immediateResult?: unknown\r\n}\r\n\r\n/** 事件 */\r\nexport interface MCPLinkEvent {\r\n type: MCPLinkEventType\r\n timestamp: number\r\n data: MCPLinkEventData\r\n}\r\n\r\n// ============ 回调类型 ============\r\n\r\n/** 对话回调选项 */\r\nexport interface ChatCallbacks {\r\n /** AI 思考内容 */\r\n onThinking?: (content: string) => void\r\n /** 开始调用工具 */\r\n onToolCallStart?: (toolName: string, args: Record<string, unknown>) => void\r\n /** 工具返回结果 */\r\n onToolResult?: (toolName: string, result: unknown, duration: number) => void\r\n /** AI 输出文本 (流式) */\r\n onTextDelta?: (delta: string) => void\r\n /** 迭代开始 */\r\n onIterationStart?: (iteration: number) => void\r\n /** 迭代结束 */\r\n onIterationEnd?: (iteration: number) => void\r\n /** 发生错误 */\r\n onError?: (error: Error) => void\r\n}\r\n\r\n// ============ 返回类型 ============\r\n\r\n/** 对话结果 */\r\nexport interface ChatResult {\r\n /** 最终回复内容 */\r\n content: string\r\n /** 执行过的工具调用记录 */\r\n toolCalls: Array<{\r\n name: string\r\n arguments: Record<string, unknown>\r\n result: unknown\r\n duration: number\r\n }>\r\n /** 完整消息历史 */\r\n messages: Message[]\r\n /** Token 使用量 */\r\n usage: {\r\n promptTokens: number\r\n completionTokens: number\r\n totalTokens: number\r\n }\r\n /** 总迭代次数 */\r\n iterations: number\r\n /** 总耗时 (ms) */\r\n duration: number\r\n}\r\n\r\n// ============ MCP 工具类型 ============\r\n\r\n/** MCP 工具定义 */\r\nexport interface MCPTool {\r\n name: string\r\n description: string\r\n inputSchema: {\r\n type: 'object'\r\n properties?: Record<string, unknown>\r\n required?: string[]\r\n }\r\n}\r\n\r\n/** MCP 服务器状态 */\r\nexport interface MCPServerStatus {\r\n id: string\r\n name: string\r\n config: MCPServerConfig\r\n status: 'stopped' | 'starting' | 'running' | 'error'\r\n tools: MCPTool[]\r\n error?: string\r\n}\r\n","import { generateText, streamText, type LanguageModel, type CoreMessage, type CoreTool } from 'ai'\r\nimport { z } from 'zod'\r\nimport type { MCPManager } from './MCPManager.js'\r\nimport {\r\n MCPLinkEventType,\r\n type MCPTool,\r\n type ChatCallbacks,\r\n type ChatResult,\r\n type MCPLinkEvent,\r\n type ToolResult,\r\n type ImmediateResultMatcher,\r\n} from './types.js'\r\n\r\n/** \r\n * 默认用户提示词\r\n * 这只是用户自定义的部分,核心工具调用逻辑已内置到代码中\r\n */\r\nexport const DEFAULT_SYSTEM_PROMPT = `你是一个专业、友好的智能助手。\r\n\r\n## 回复要求\r\n- 简洁清晰,重点突出\r\n- 用列表呈现关键信息\r\n- 语气礼貌自然,像专业助手\r\n- 有结论时直接给出,需要补充信息时简单询问`\r\n\r\n/**\r\n * Agent 引擎\r\n * 负责执行 AI 对话循环,处理工具调用\r\n */\r\nexport class Agent {\r\n private model: LanguageModel\r\n private mcpManager: MCPManager\r\n private systemPrompt: string\r\n private maxIterations: number\r\n private immediateResultMatchers: ImmediateResultMatcher[]\r\n private parallelToolCalls: boolean\r\n private enableThinkingPhase: boolean\r\n\r\n constructor(\r\n model: LanguageModel,\r\n mcpManager: MCPManager,\r\n options: {\r\n systemPrompt?: string\r\n maxIterations?: number\r\n immediateResultMatchers?: ImmediateResultMatcher[]\r\n parallelToolCalls?: boolean\r\n enableThinkingPhase?: boolean\r\n } = {}\r\n ) {\r\n this.model = model\r\n this.mcpManager = mcpManager\r\n this.systemPrompt = options.systemPrompt || DEFAULT_SYSTEM_PROMPT\r\n this.maxIterations = options.maxIterations || 10\r\n this.immediateResultMatchers = options.immediateResultMatchers || []\r\n this.parallelToolCalls = options.parallelToolCalls ?? true // 默认并行执行\r\n this.enableThinkingPhase = options.enableThinkingPhase ?? true // 默认开启,提高准确性\r\n }\r\n\r\n /**\r\n * 生成工具描述文本(用于思考阶段)\r\n */\r\n private generateToolsDescription(tools: MCPTool[]): string {\r\n if (tools.length === 0) {\r\n return '当前没有可用的工具。'\r\n }\r\n\r\n let description = ''\r\n for (const tool of tools) {\r\n description += `### ${tool.name}\\n`\r\n description += `描述: ${tool.description}\\n`\r\n if (tool.inputSchema.properties) {\r\n description += `参数:\\n`\r\n for (const [key, prop] of Object.entries(tool.inputSchema.properties)) {\r\n const propInfo = prop as { type?: string; description?: string }\r\n const required = tool.inputSchema.required?.includes(key) ? '必填' : '可选'\r\n description += ` - ${key} (${propInfo.type || 'any'}, ${required}): ${propInfo.description || ''}\\n`\r\n }\r\n }\r\n description += '\\n'\r\n }\r\n return description\r\n }\r\n\r\n /**\r\n * 思考阶段的系统提示词\r\n */\r\n private readonly THINKING_PHASE_PROMPT = `你正在思考如何帮助用户。请用自然语言分析:\r\n\r\n1. 用户想要什么?\r\n2. 我目前掌握了哪些信息?\r\n3. 还需要做什么才能回答用户?\r\n\r\n要求:\r\n- 像内心独白一样自然表达\r\n- 体现你认真分析了问题\r\n- 说清楚接下来的计划\r\n- 不要输出给用户看的正式回复(如产品列表、结论等)\"`\r\n\r\n /**\r\n * 检查工具返回结果是否匹配即时结果匹配器\r\n * @param result 工具返回的结果\r\n * @returns 如果匹配返回 true,否则返回 false\r\n */\r\n private matchImmediateResult(result: unknown): boolean {\r\n if (!this.immediateResultMatchers.length) {\r\n return false\r\n }\r\n\r\n // 结果必须是对象类型\r\n if (typeof result !== 'object' || result === null) {\r\n return false\r\n }\r\n\r\n const resultObj = result as Record<string, unknown>\r\n\r\n // 检查是否匹配任意一个匹配器\r\n for (const matcher of this.immediateResultMatchers) {\r\n let matched = true\r\n for (const [key, value] of Object.entries(matcher)) {\r\n if (resultObj[key] !== value) {\r\n matched = false\r\n break\r\n }\r\n }\r\n if (matched) {\r\n return true\r\n }\r\n }\r\n\r\n return false\r\n }\r\n\r\n /**\r\n * 将 MCP 工具转换为 Vercel AI SDK 格式\r\n */\r\n private convertMCPToolsToAITools(mcpTools: MCPTool[]): Record<string, CoreTool> {\r\n const tools: Record<string, CoreTool> = {}\r\n\r\n for (const mcpTool of mcpTools) {\r\n // 将 JSON Schema 转换为 Zod Schema\r\n const zodSchema = this.jsonSchemaToZod(mcpTool.inputSchema)\r\n\r\n tools[mcpTool.name] = {\r\n description: mcpTool.description,\r\n parameters: zodSchema,\r\n }\r\n }\r\n\r\n return tools\r\n }\r\n\r\n /**\r\n * JSON Schema 到 Zod 的完整递归转换\r\n * 支持嵌套对象、对象数组、枚举等所有常见类型\r\n */\r\n private jsonSchemaToZod(schema: MCPTool['inputSchema']): z.ZodType {\r\n return this.convertSchemaToZod(schema, schema.required || [])\r\n }\r\n\r\n /**\r\n * 递归转换 JSON Schema 节点为 Zod 类型\r\n */\r\n private convertSchemaToZod(\r\n schema: Record<string, unknown>,\r\n parentRequired: string[] = [],\r\n key?: string\r\n ): z.ZodType {\r\n const type = schema.type as string | undefined\r\n const description = schema.description as string | undefined\r\n const enumValues = schema.enum as unknown[] | undefined\r\n\r\n let zodType: z.ZodType\r\n\r\n // 处理枚举类型\r\n if (enumValues && enumValues.length > 0) {\r\n if (enumValues.every((v) => typeof v === 'string')) {\r\n zodType = z.enum(enumValues as [string, ...string[]])\r\n } else if (enumValues.every((v) => typeof v === 'number')) {\r\n // 数字枚举:用 union of literals\r\n const literals = enumValues.map((v) => z.literal(v as number))\r\n zodType = literals.length === 1 \r\n ? literals[0] \r\n : z.union([literals[0], literals[1], ...literals.slice(2)] as [z.ZodTypeAny, z.ZodTypeAny, ...z.ZodTypeAny[]])\r\n } else {\r\n // 混合枚举或其他类型:降级为 unknown\r\n zodType = z.unknown()\r\n }\r\n } else {\r\n switch (type) {\r\n case 'string':\r\n zodType = z.string()\r\n break\r\n\r\n case 'number':\r\n zodType = z.number()\r\n break\r\n\r\n case 'integer':\r\n zodType = z.number().int()\r\n break\r\n\r\n case 'boolean':\r\n zodType = z.boolean()\r\n break\r\n\r\n case 'null':\r\n zodType = z.null()\r\n break\r\n\r\n case 'object': {\r\n const properties = schema.properties as Record<string, Record<string, unknown>> | undefined\r\n const required = (schema.required as string[]) || []\r\n\r\n if (properties) {\r\n const shape: Record<string, z.ZodType> = {}\r\n for (const [propKey, propSchema] of Object.entries(properties)) {\r\n let propZod = this.convertSchemaToZod(propSchema, required, propKey)\r\n\r\n // 处理 optional\r\n if (!required.includes(propKey)) {\r\n propZod = propZod.optional()\r\n }\r\n\r\n shape[propKey] = propZod\r\n }\r\n zodType = z.object(shape)\r\n } else {\r\n // 没有 properties 定义的对象,允许任意键值\r\n zodType = z.record(z.unknown())\r\n }\r\n break\r\n }\r\n\r\n case 'array': {\r\n const items = schema.items as Record<string, unknown> | undefined\r\n if (items) {\r\n const itemsRequired = (items.required as string[]) || []\r\n zodType = z.array(this.convertSchemaToZod(items, itemsRequired))\r\n } else {\r\n zodType = z.array(z.unknown())\r\n }\r\n break\r\n }\r\n\r\n default:\r\n // 未知类型或没有类型定义\r\n zodType = z.unknown()\r\n }\r\n }\r\n\r\n // 添加描述\r\n if (description) {\r\n zodType = zodType.describe(description)\r\n }\r\n\r\n return zodType\r\n }\r\n\r\n /**\r\n * 执行对话\r\n */\r\n async chat(userMessage: string, callbacks?: ChatCallbacks): Promise<ChatResult> {\r\n const startTime = Date.now()\r\n const toolCallRecords: ChatResult['toolCalls'] = []\r\n let totalPromptTokens = 0\r\n let totalCompletionTokens = 0\r\n\r\n // 构建消息历史\r\n const messages: CoreMessage[] = [\r\n { role: 'system', content: this.systemPrompt },\r\n { role: 'user', content: userMessage },\r\n ]\r\n\r\n // 获取所有可用工具\r\n const mcpTools = this.mcpManager.getAllTools()\r\n const tools = this.convertMCPToolsToAITools(mcpTools)\r\n\r\n let iteration = 0\r\n let finalContent = ''\r\n\r\n while (iteration < this.maxIterations) {\r\n iteration++\r\n callbacks?.onIterationStart?.(iteration)\r\n\r\n // 调用 AI\r\n const response = await generateText({\r\n model: this.model,\r\n messages,\r\n tools: Object.keys(tools).length > 0 ? tools : undefined,\r\n maxSteps: 1, // 每次只执行一步,方便我们控制流程\r\n })\r\n\r\n // 累计 token 使用\r\n if (response.usage) {\r\n totalPromptTokens += response.usage.promptTokens\r\n totalCompletionTokens += response.usage.completionTokens\r\n }\r\n\r\n // 检查是否有工具调用\r\n const toolCalls = response.toolCalls || []\r\n\r\n if (toolCalls.length === 0) {\r\n // 没有工具调用,说明 AI 完成了任务\r\n finalContent = response.text || ''\r\n callbacks?.onTextDelta?.(finalContent)\r\n callbacks?.onIterationEnd?.(iteration)\r\n break\r\n }\r\n\r\n // 有工具调用,处理它们\r\n const toolResults: ToolResult[] = []\r\n\r\n for (const toolCall of toolCalls) {\r\n const toolName = toolCall.toolName\r\n const toolArgs = toolCall.args as Record<string, unknown>\r\n const toolCallId = toolCall.toolCallId\r\n\r\n callbacks?.onToolCallStart?.(toolName, toolArgs)\r\n\r\n const toolStartTime = Date.now()\r\n let result: unknown\r\n let isError = false\r\n\r\n try {\r\n result = await this.mcpManager.callTool(toolName, toolArgs)\r\n } catch (error) {\r\n result = error instanceof Error ? error.message : String(error)\r\n isError = true\r\n }\r\n\r\n const duration = Date.now() - toolStartTime\r\n\r\n callbacks?.onToolResult?.(toolName, result, duration)\r\n\r\n toolResults.push({\r\n toolCallId,\r\n toolName,\r\n result,\r\n isError,\r\n duration,\r\n })\r\n\r\n toolCallRecords.push({\r\n name: toolName,\r\n arguments: toolArgs,\r\n result,\r\n duration,\r\n })\r\n }\r\n\r\n // 将 AI 的回复和工具调用添加到消息历史\r\n messages.push({\r\n role: 'assistant' as const,\r\n content: [\r\n { type: 'text' as const, text: response.text || '' },\r\n ...toolCalls.map((tc) => ({\r\n type: 'tool-call' as const,\r\n toolCallId: tc.toolCallId,\r\n toolName: tc.toolName,\r\n args: tc.args as Record<string, unknown>,\r\n })),\r\n ],\r\n })\r\n\r\n // 将工具结果添加到消息历史\r\n for (const tr of toolResults) {\r\n messages.push({\r\n role: 'tool' as const,\r\n content: [\r\n {\r\n type: 'tool-result' as const,\r\n toolCallId: tr.toolCallId,\r\n toolName: tr.toolName,\r\n result: tr.result,\r\n },\r\n ],\r\n })\r\n }\r\n\r\n callbacks?.onIterationEnd?.(iteration)\r\n }\r\n\r\n const duration = Date.now() - startTime\r\n\r\n return {\r\n content: finalContent,\r\n toolCalls: toolCallRecords,\r\n messages: messages.map((m) => ({\r\n role: m.role as 'system' | 'user' | 'assistant' | 'tool',\r\n content: typeof m.content === 'string' ? m.content : JSON.stringify(m.content),\r\n })),\r\n usage: {\r\n promptTokens: totalPromptTokens,\r\n completionTokens: totalCompletionTokens,\r\n totalTokens: totalPromptTokens + totalCompletionTokens,\r\n },\r\n iterations: iteration,\r\n duration,\r\n }\r\n }\r\n\r\n /**\r\n * 流式对话 - 返回事件生成器\r\n * @param userMessage 用户消息\r\n * @param options 可选参数\r\n * @param options.allowedTools 允许使用的工具名称列表,为空或不传则使用所有工具\r\n * @param options.history 历史消息列表\r\n */\r\n async *chatStream(\r\n userMessage: string,\r\n options?: {\r\n allowedTools?: string[]\r\n history?: Array<{ role: 'user' | 'assistant'; content: string }>\r\n }\r\n ): AsyncGenerator<MCPLinkEvent> {\r\n const startTime = Date.now()\r\n const toolCallRecords: ChatResult['toolCalls'] = []\r\n\r\n // 构建消息历史\r\n const messages: CoreMessage[] = [{ role: 'system', content: this.systemPrompt }]\r\n\r\n // 添加历史消息\r\n if (options?.history && options.history.length > 0) {\r\n for (const msg of options.history) {\r\n messages.push({\r\n role: msg.role,\r\n content: msg.content,\r\n })\r\n }\r\n }\r\n\r\n // 添加当前用户消息\r\n messages.push({ role: 'user', content: userMessage })\r\n\r\n // 获取所有可用工具\r\n let mcpTools = this.mcpManager.getAllTools()\r\n\r\n // 如果指定了允许的工具列表,则进行过滤\r\n if (options?.allowedTools && options.allowedTools.length > 0) {\r\n mcpTools = mcpTools.filter((tool) => options.allowedTools!.includes(tool.name))\r\n }\r\n\r\n const tools = this.convertMCPToolsToAITools(mcpTools)\r\n const hasTools = Object.keys(tools).length > 0\r\n\r\n let iteration = 0\r\n\r\n while (iteration < this.maxIterations) {\r\n iteration++\r\n\r\n yield {\r\n type: MCPLinkEventType.ITERATION_START,\r\n timestamp: Date.now(),\r\n data: { iteration, maxIterations: this.maxIterations },\r\n }\r\n\r\n // ============ 思考阶段(如果启用)============\r\n if (this.enableThinkingPhase && hasTools) {\r\n yield {\r\n type: MCPLinkEventType.THINKING_START,\r\n timestamp: Date.now(),\r\n data: {},\r\n }\r\n\r\n // 构建思考阶段的消息(使用独立提示词,不混入用户的回复要求)\r\n const toolsDescription = this.generateToolsDescription(mcpTools)\r\n const thinkingMessages: CoreMessage[] = [\r\n { \r\n role: 'system', \r\n content: `${this.THINKING_PHASE_PROMPT}\\n\\n## 可用工具\\n${toolsDescription}` \r\n },\r\n ...messages.slice(1), // 跳过原来的 system 消息,使用历史消息\r\n ]\r\n\r\n // 思考阶段调用(不带工具,强制输出文本)\r\n const thinkingStream = streamText({\r\n model: this.model,\r\n messages: thinkingMessages,\r\n // 不传 tools,强制 AI 输出文本思考\r\n })\r\n\r\n let thinkingContent = ''\r\n for await (const chunk of thinkingStream.fullStream) {\r\n if (chunk.type === 'text-delta') {\r\n thinkingContent += chunk.textDelta\r\n yield {\r\n type: MCPLinkEventType.THINKING_DELTA,\r\n timestamp: Date.now(),\r\n data: { content: chunk.textDelta },\r\n }\r\n }\r\n }\r\n\r\n yield {\r\n type: MCPLinkEventType.THINKING_END,\r\n timestamp: Date.now(),\r\n data: {},\r\n }\r\n\r\n // 将思考结果添加到消息历史,帮助 AI 更好地执行\r\n if (thinkingContent) {\r\n messages.push({\r\n role: 'assistant',\r\n content: `[内部决策]\\n${thinkingContent}`,\r\n })\r\n }\r\n }\r\n\r\n // ============ 执行阶段 ============\r\n // 使用 streamText 进行流式调用\r\n const stream = streamText({\r\n model: this.model,\r\n messages,\r\n tools: hasTools ? tools : undefined,\r\n maxSteps: 1,\r\n })\r\n\r\n // 收集流式结果\r\n let fullText = ''\r\n let reasoningText = ''\r\n const toolCalls: Array<{\r\n toolCallId: string\r\n toolName: string\r\n args: Record<string, unknown>\r\n }> = []\r\n let currentToolCall: {\r\n toolCallId: string\r\n toolName: string\r\n argsText: string\r\n } | null = null\r\n let hasStartedText = false\r\n let hasStartedReasoning = false\r\n\r\n // 已发送 TOOL_CALL_START 的工具 ID 集合\r\n const sentToolCallStarts = new Set<string>()\r\n\r\n // 用于解析 <think> 标签的状态\r\n let thinkBuffer = ''\r\n let isInsideThinkTag = false\r\n let textBuffer = ''\r\n\r\n // 流式处理\r\n for await (const chunk of stream.fullStream) {\r\n switch (chunk.type) {\r\n case 'reasoning':\r\n // 流式输出思考过程(Claude 等模型支持)\r\n if (!hasStartedReasoning) {\r\n hasStartedReasoning = true\r\n yield {\r\n type: MCPLinkEventType.THINKING_START,\r\n timestamp: Date.now(),\r\n data: {},\r\n }\r\n }\r\n reasoningText += chunk.textDelta\r\n yield {\r\n type: MCPLinkEventType.THINKING_DELTA,\r\n timestamp: Date.now(),\r\n data: { content: chunk.textDelta },\r\n }\r\n break\r\n\r\n case 'text-delta':\r\n // 流式输出文本 - 解析 <think> 标签\r\n const delta = chunk.textDelta\r\n textBuffer += delta\r\n\r\n // 处理 <think> 标签的开始\r\n if (!isInsideThinkTag) {\r\n // 检查是否有 <think> 开始标签\r\n const thinkStartMatch = textBuffer.match(/<think>/i)\r\n if (thinkStartMatch) {\r\n // 发送标签之前的文本\r\n const beforeThink = textBuffer.substring(0, thinkStartMatch.index)\r\n if (beforeThink.trim()) {\r\n if (!hasStartedText) {\r\n hasStartedText = true\r\n yield {\r\n type: MCPLinkEventType.TEXT_START,\r\n timestamp: Date.now(),\r\n data: {},\r\n }\r\n }\r\n fullText += beforeThink\r\n yield {\r\n type: MCPLinkEventType.TEXT_DELTA,\r\n timestamp: Date.now(),\r\n data: { content: beforeThink },\r\n }\r\n }\r\n // 进入思考模式\r\n isInsideThinkTag = true\r\n if (!hasStartedReasoning) {\r\n hasStartedReasoning = true\r\n yield {\r\n type: MCPLinkEventType.THINKING_START,\r\n timestamp: Date.now(),\r\n data: {},\r\n }\r\n }\r\n textBuffer = textBuffer.substring(thinkStartMatch.index! + 7) // 跳过 <think>\r\n thinkBuffer = ''\r\n } else if (!textBuffer.includes('<')) {\r\n // 没有潜在的标签,直接输出\r\n if (hasStartedReasoning && !hasStartedText) {\r\n yield {\r\n type: MCPLinkEventType.THINKING_END,\r\n timestamp: Date.now(),\r\n data: {},\r\n }\r\n }\r\n if (!hasStartedText) {\r\n hasStartedText = true\r\n yield {\r\n type: MCPLinkEventType.TEXT_START,\r\n timestamp: Date.now(),\r\n data: {},\r\n }\r\n }\r\n fullText += textBuffer\r\n yield {\r\n type: MCPLinkEventType.TEXT_DELTA,\r\n timestamp: Date.now(),\r\n data: { content: textBuffer },\r\n }\r\n textBuffer = ''\r\n }\r\n // 如果包含 '<' 但不是完整标签,继续缓冲\r\n } else {\r\n // 在思考标签内,检查结束标签\r\n const thinkEndMatch = textBuffer.match(/<\\/think>/i)\r\n if (thinkEndMatch) {\r\n // 发送结束前的思考内容\r\n const thinkContent = textBuffer.substring(0, thinkEndMatch.index)\r\n if (thinkContent) {\r\n thinkBuffer += thinkContent\r\n reasoningText += thinkContent\r\n yield {\r\n type: MCPLinkEventType.THINKING_DELTA,\r\n timestamp: Date.now(),\r\n data: { content: thinkContent },\r\n }\r\n }\r\n // 结束思考\r\n yield {\r\n type: MCPLinkEventType.THINKING_END,\r\n timestamp: Date.now(),\r\n data: {},\r\n }\r\n isInsideThinkTag = false\r\n textBuffer = textBuffer.substring(thinkEndMatch.index! + 8) // 跳过 </think>\r\n } else if (!textBuffer.includes('<')) {\r\n // 没有潜在的结束标签,直接输出思考内容\r\n thinkBuffer += textBuffer\r\n reasoningText += textBuffer\r\n yield {\r\n type: MCPLinkEventType.THINKING_DELTA,\r\n timestamp: Date.now(),\r\n data: { content: textBuffer },\r\n }\r\n textBuffer = ''\r\n }\r\n // 如果包含 '<' 但不是完整标签,继续缓冲\r\n }\r\n break\r\n\r\n case 'tool-call':\r\n // 非流式工具调用(大多数模型使用这种方式)\r\n // 直接发送完整的工具调用信息\r\n if (!sentToolCallStarts.has(chunk.toolCallId)) {\r\n yield {\r\n type: MCPLinkEventType.TOOL_CALL_START,\r\n timestamp: Date.now(),\r\n data: {\r\n toolName: chunk.toolName,\r\n toolCallId: chunk.toolCallId,\r\n toolArgs: chunk.args as Record<string, unknown>,\r\n },\r\n }\r\n sentToolCallStarts.add(chunk.toolCallId)\r\n // 只在首次收到时添加到工具调用列表,避免重复执行\r\n toolCalls.push({\r\n toolCallId: chunk.toolCallId,\r\n toolName: chunk.toolName,\r\n args: chunk.args as Record<string, unknown>,\r\n })\r\n }\r\n break\r\n\r\n case 'tool-call-streaming-start':\r\n // 流式工具调用开始(部分模型支持)\r\n currentToolCall = {\r\n toolCallId: chunk.toolCallId,\r\n toolName: chunk.toolName,\r\n argsText: '',\r\n }\r\n if (!sentToolCallStarts.has(chunk.toolCallId)) {\r\n yield {\r\n type: MCPLinkEventType.TOOL_CALL_START,\r\n timestamp: Date.now(),\r\n data: {\r\n toolName: chunk.toolName,\r\n toolCallId: chunk.toolCallId,\r\n },\r\n }\r\n sentToolCallStarts.add(chunk.toolCallId)\r\n }\r\n break\r\n\r\n case 'tool-call-delta':\r\n // 流式工具参数\r\n if (currentToolCall) {\r\n currentToolCall.argsText += chunk.argsTextDelta\r\n yield {\r\n type: MCPLinkEventType.TOOL_CALL_DELTA,\r\n timestamp: Date.now(),\r\n data: {\r\n toolCallId: currentToolCall.toolCallId,\r\n argsTextDelta: chunk.argsTextDelta,\r\n },\r\n }\r\n }\r\n break\r\n\r\n case 'finish':\r\n // 本轮生成结束\r\n // 处理剩余的缓冲内容\r\n if (textBuffer) {\r\n if (isInsideThinkTag) {\r\n // 仍在思考标签内,输出剩余内容作为思考\r\n reasoningText += textBuffer\r\n yield {\r\n type: MCPLinkEventType.THINKING_DELTA,\r\n timestamp: Date.now(),\r\n data: { content: textBuffer },\r\n }\r\n } else {\r\n // 输出剩余文本\r\n if (!hasStartedText) {\r\n hasStartedText = true\r\n yield {\r\n type: MCPLinkEventType.TEXT_START,\r\n timestamp: Date.now(),\r\n data: {},\r\n }\r\n }\r\n fullText += textBuffer\r\n yield {\r\n type: MCPLinkEventType.TEXT_DELTA,\r\n timestamp: Date.now(),\r\n data: { content: textBuffer },\r\n }\r\n }\r\n textBuffer = ''\r\n }\r\n // 如果有思考过程但还没结束,先结束它\r\n if (isInsideThinkTag || (hasStartedReasoning && !hasStartedText)) {\r\n yield {\r\n type: MCPLinkEventType.THINKING_END,\r\n timestamp: Date.now(),\r\n data: {},\r\n }\r\n isInsideThinkTag = false\r\n }\r\n if (hasStartedText) {\r\n yield {\r\n type: MCPLinkEventType.TEXT_END,\r\n timestamp: Date.now(),\r\n data: {},\r\n }\r\n }\r\n break\r\n\r\n case 'error':\r\n yield {\r\n type: MCPLinkEventType.ERROR,\r\n timestamp: Date.now(),\r\n data: { error: chunk.error as Error },\r\n }\r\n break\r\n }\r\n }\r\n\r\n // 检查是否有工具调用\r\n if (toolCalls.length === 0) {\r\n // 没有工具调用,结束迭代\r\n yield {\r\n type: MCPLinkEventType.ITERATION_END,\r\n timestamp: Date.now(),\r\n data: { iteration },\r\n }\r\n break\r\n }\r\n\r\n // 如果有思考文本,标记为思考过程\r\n if (fullText) {\r\n yield {\r\n type: MCPLinkEventType.THINKING_CONTENT,\r\n timestamp: Date.now(),\r\n data: { content: fullText },\r\n }\r\n }\r\n\r\n // 执行工具调用\r\n const toolResults: ToolResult[] = []\r\n\r\n // 先发送所有工具的执行中状态\r\n for (const toolCall of toolCalls) {\r\n yield {\r\n type: MCPLinkEventType.TOOL_EXECUTING,\r\n timestamp: Date.now(),\r\n data: { \r\n toolName: toolCall.toolName, \r\n toolCallId: toolCall.toolCallId, \r\n toolArgs: toolCall.args \r\n },\r\n }\r\n }\r\n\r\n // 根据配置决定是并行还是串行执行\r\n if (this.parallelToolCalls && toolCalls.length > 1) {\r\n // 并行执行所有工具\r\n const executePromises = toolCalls.map(async (toolCall) => {\r\n const toolStartTime = Date.now()\r\n let result: unknown\r\n let isError = false\r\n\r\n try {\r\n result = await this.mcpManager.callTool(toolCall.toolName, toolCall.args)\r\n } catch (error) {\r\n result = error instanceof Error ? error.message : String(error)\r\n isError = true\r\n }\r\n\r\n const duration = Date.now() - toolStartTime\r\n return {\r\n toolCallId: toolCall.toolCallId,\r\n toolName: toolCall.toolName,\r\n args: toolCall.args,\r\n result,\r\n isError,\r\n duration,\r\n }\r\n })\r\n\r\n const results = await Promise.all(executePromises)\r\n\r\n // 按顺序发送结果事件\r\n for (const r of results) {\r\n yield {\r\n type: MCPLinkEventType.TOOL_RESULT,\r\n timestamp: Date.now(),\r\n data: {\r\n toolName: r.toolName,\r\n toolResult: r.result,\r\n toolCallId: r.toolCallId,\r\n duration: r.duration,\r\n isError: r.isError,\r\n },\r\n }\r\n\r\n // 检查是否匹配即时结果\r\n if (!r.isError && this.matchImmediateResult(r.result)) {\r\n yield {\r\n type: MCPLinkEventType.IMMEDIATE_RESULT,\r\n timestamp: Date.now(),\r\n data: {\r\n toolName: r.toolName,\r\n toolCallId: r.toolCallId,\r\n immediateResult: r.result,\r\n },\r\n }\r\n }\r\n\r\n toolResults.push({\r\n toolCallId: r.toolCallId,\r\n toolName: r.toolName,\r\n result: r.result,\r\n isError: r.isError,\r\n duration: r.duration,\r\n })\r\n\r\n toolCallRecords.push({\r\n name: r.toolName,\r\n arguments: r.args,\r\n result: r.result,\r\n duration: r.duration,\r\n })\r\n }\r\n } else {\r\n // 串行执行工具\r\n for (const toolCall of toolCalls) {\r\n const toolName = toolCall.toolName\r\n const toolArgs = toolCall.args\r\n const toolCallId = toolCall.toolCallId\r\n\r\n const toolStartTime = Date.now()\r\n let result: unknown\r\n let isError = false\r\n\r\n try {\r\n result = await this.mcpManager.callTool(toolName, toolArgs)\r\n } catch (error) {\r\n result = error instanceof Error ? error.message : String(error)\r\n isError = true\r\n }\r\n\r\n const duration = Date.now() - toolStartTime\r\n\r\n yield {\r\n type: MCPLinkEventType.TOOL_RESULT,\r\n timestamp: Date.now(),\r\n data: {\r\n toolName,\r\n toolResult: result,\r\n toolCallId,\r\n duration,\r\n isError,\r\n },\r\n }\r\n\r\n // 检查是否匹配即时结果\r\n if (!isError && this.matchImmediateResult(result)) {\r\n yield {\r\n type: MCPLinkEventType.IMMEDIATE_RESULT,\r\n timestamp: Date.now(),\r\n data: {\r\n toolName,\r\n toolCallId,\r\n immediateResult: result,\r\n },\r\n }\r\n }\r\n\r\n toolResults.push({\r\n toolCallId,\r\n toolName,\r\n result,\r\n isError,\r\n duration,\r\n })\r\n\r\n toolCallRecords.push({\r\n name: toolName,\r\n arguments: toolArgs,\r\n result,\r\n duration,\r\n })\r\n }\r\n }\r\n\r\n // 更新消息历史\r\n messages.push({\r\n role: 'assistant' as const,\r\n content: [\r\n ...(fullText ? [{ type: 'text' as const, text: fullText }] : []),\r\n ...toolCalls.map((tc) => ({\r\n type: 'tool-call' as const,\r\n toolCallId: tc.toolCallId,\r\n toolName: tc.toolName,\r\n args: tc.args,\r\n })),\r\n ],\r\n })\r\n\r\n for (const tr of toolResults) {\r\n messages.push({\r\n role: 'tool' as const,\r\n content: [\r\n {\r\n type: 'tool-result' as const,\r\n toolCallId: tr.toolCallId,\r\n toolName: tr.toolName,\r\n result: tr.result,\r\n },\r\n ],\r\n })\r\n }\r\n\r\n yield {\r\n type: MCPLinkEventType.ITERATION_END,\r\n timestamp: Date.now(),\r\n data: { iteration },\r\n }\r\n }\r\n\r\n const totalDuration = Date.now() - startTime\r\n\r\n yield {\r\n type: MCPLinkEventType.COMPLETE,\r\n timestamp: Date.now(),\r\n data: {\r\n totalIterations: iteration,\r\n totalDuration,\r\n },\r\n }\r\n }\r\n}\r\n","import { streamText, type LanguageModel, type CoreMessage } from 'ai'\r\nimport type { MCPManager } from './MCPManager.js'\r\nimport { MCPLinkEventType, type MCPTool, type MCPLinkEvent, type ImmediateResultMatcher } from './types.js'\r\n\r\n/**\r\n * 基于 Prompt 的 Agent\r\n * 通过 prompt 工程让任意模型支持工具调用和思考过程\r\n * \r\n * 设计原则:\r\n * 1. 简洁 - 不做过多干预,让 AI 自己思考和决策\r\n * 2. 通用 - 支持任何模型,不依赖特定 API\r\n * 3. 可靠 - 稳定的状态机解析\r\n */\r\nexport class PromptBasedAgent {\r\n private model: LanguageModel\r\n private mcpManager: MCPManager\r\n private systemPrompt: string\r\n private maxIterations: number\r\n private immediateResultMatchers: ImmediateResultMatcher[]\r\n private parallelToolCalls: boolean\r\n // PromptBasedAgent 本身通过 prompt 实现思考,此配置保留以保持接口一致\r\n private enableThinkingPhase: boolean\r\n\r\n constructor(\r\n model: LanguageModel,\r\n mcpManager: MCPManager,\r\n options: {\r\n systemPrompt?: string\r\n maxIterations?: number\r\n immediateResultMatchers?: ImmediateResultMatcher[]\r\n parallelToolCalls?: boolean\r\n enableThinkingPhase?: boolean\r\n } = {}\r\n ) {\r\n this.model = model\r\n this.mcpManager = mcpManager\r\n this.systemPrompt = options.systemPrompt || ''\r\n this.maxIterations = options.maxIterations || 10\r\n this.immediateResultMatchers = options.immediateResultMatchers || []\r\n // PromptBasedAgent 每次只解析一个工具调用,此配置保留以保持接口一致\r\n this.parallelToolCalls = options.parallelToolCalls ?? true\r\n // PromptBasedAgent 本身就通过 prompt 实现思考,无需额外阶段\r\n this.enableThinkingPhase = options.enableThinkingPhase ?? false\r\n }\r\n\r\n /**\r\n * 检查工具返回结果是否匹配即时结果匹配器\r\n * @param result 工具返回的结果\r\n * @returns 如果匹配返回 true,否则返回 false\r\n */\r\n private matchImmediateResult(result: unknown): boolean {\r\n if (!this.immediateResultMatchers.length) {\r\n return false\r\n }\r\n\r\n // 结果必须是对象类型\r\n if (typeof result !== 'object' || result === null) {\r\n return false\r\n }\r\n\r\n const resultObj = result as Record<string, unknown>\r\n\r\n // 检查是否匹配任意一个匹配器\r\n for (const matcher of this.immediateResultMatchers) {\r\n let matched = true\r\n for (const [key, value] of Object.entries(matcher)) {\r\n if (resultObj[key] !== value) {\r\n matched = false\r\n break\r\n }\r\n }\r\n if (matched) {\r\n return true\r\n }\r\n }\r\n\r\n return false\r\n }\r\n\r\n /**\r\n * 生成工具列表描述\r\n */\r\n private generateToolsDescription(tools: MCPTool[]): string {\r\n if (tools.length === 0) {\r\n return '当前没有可用的工具。'\r\n }\r\n\r\n let description = ''\r\n for (const tool of tools) {\r\n description += `### ${tool.name}\\n`\r\n description += `描述: ${tool.description}\\n`\r\n description += `参数: ${JSON.stringify(tool.inputSchema, null, 2)}\\n\\n`\r\n }\r\n return description\r\n }\r\n\r\n /**\r\n * 内置系统提示词 - 强调格式约束\r\n */\r\n private readonly BUILT_IN_PROMPT = `\r\n## 工具调用格式(必须严格遵守)\r\n\r\n当你需要获取数据或执行操作时,**只能**使用以下格式:\r\n\r\n<tool_call>\r\n{\"name\": \"工具名称\", \"arguments\": {\"参数名\": \"值\"}}\r\n</tool_call>\r\n\r\n### 工作流程\r\n1. 分析用户需求\r\n2. 如需数据,输出 <tool_call>...</tool_call> 后**立即停止**\r\n3. 系统会执行工具并返回真实结果\r\n4. 收到结果后,用中文整理回复用户\r\n\r\n### 严格禁止\r\n- ❌ 自己编写工具返回结果(如 \\`结果:{...}\\` 或 \\`{\"code\":200...}\\`)\r\n- ❌ 模拟工具调用(如 \\`RPCCall:\\`、\\`FunctionCall:\\`)\r\n- ❌ 在没有真实工具结果的情况下编造数据\r\n- ❌ 一次输出中同时包含工具调用和最终回复\r\n\r\n### 正确示例\r\n用户: \"查询我的订单\"\r\n你的输出:\r\n<tool_call>\r\n{\"name\": \"get_orders\", \"arguments\": {\"token\": \"xxx\"}}\r\n</tool_call>\r\n\r\n(然后停止,等待系统返回真实结果)\r\n\r\n### 回复格式\r\n- 使用中文\r\n- 使用 Markdown 格式美化输出\r\n- 列表数据每项独占一行\r\n`\r\n\r\n /**\r\n * 构建完整的系统提示词\r\n */\r\n private buildSystemPrompt(tools: MCPTool[]): string {\r\n const toolsDescription = this.generateToolsDescription(tools)\r\n const userPrompt = this.systemPrompt || '你是一个智能助手。'\r\n\r\n return `${userPrompt}\r\n\r\n## 可用工具\r\n${toolsDescription}\r\n${this.BUILT_IN_PROMPT}`\r\n }\r\n\r\n /**\r\n * 解析工具调用\r\n */\r\n private parseToolCall(text: string): { name: string; arguments: Record<string, unknown> } | null {\r\n // 方式1: <tool_call> 标签\r\n const tagMatch = text.match(/<tool_call>\\s*([\\s\\S]*?)\\s*<\\/tool_call>/i)\r\n if (tagMatch) {\r\n try {\r\n const json = JSON.parse(tagMatch[1].trim())\r\n if (json.name) return { name: json.name, arguments: json.arguments || {} }\r\n } catch { /* ignore */ }\r\n }\r\n\r\n // 方式2: ```json 代码块\r\n const codeMatch = text.match(/```(?:json)?\\s*\\n?\\s*(\\{[\\s\\S]*?\"name\"[\\s\\S]*?\\})\\s*\\n?\\s*```/i)\r\n if (codeMatch) {\r\n try {\r\n const json = JSON.parse(codeMatch[1].trim())\r\n if (json.name) return { name: json.name, arguments: json.arguments || {} }\r\n } catch { /* ignore */ }\r\n }\r\n\r\n // 方式3: 裸 JSON\r\n const jsonMatch = text.match(/\\{\\s*\"name\"\\s*:\\s*\"([^\"]+)\"[\\s\\S]*?\"arguments\"\\s*:\\s*(\\{[\\s\\S]*?\\})\\s*\\}/i)\r\n if (jsonMatch) {\r\n try {\r\n const fullMatch = jsonMatch[0]\r\n const json = JSON.parse(fullMatch)\r\n if (json.name) return { name: json.name, arguments: json.arguments || {} }\r\n } catch { /* ignore */ }\r\n }\r\n\r\n return null\r\n }\r\n\r\n /**\r\n * 智能压缩历史消息\r\n * - 用户消息完整保留\r\n * - AI 回复保留关键信息(ID、名称、数量、价格等)\r\n * - 去除冗长的 JSON 原始数据\r\n */\r\n private compressHistory(history: Array<{ role: 'user' | 'assistant'; content: string }>): Array<{ role: 'user' | 'assistant'; content: string }> {\r\n const MAX_HISTORY_LENGTH = 20 // 最多保留 20 条历史消息\r\n const MAX_USER_MESSAGE_LENGTH = 500 // 用户消息最大长度\r\n const MAX_ASSISTANT_MESSAGE_LENGTH = 1500 // AI 回复最大长度\r\n\r\n // 只保留最近的消息\r\n const recentHistory = history.slice(-MAX_HISTORY_LENGTH)\r\n\r\n return recentHistory.map((msg) => {\r\n if (msg.role === 'user') {\r\n // 用户消息:保持完整(通常较短)\r\n if (msg.content.length <= MAX_USER_MESSAGE_LENGTH) {\r\n return msg\r\n }\r\n return {\r\n role: msg.role,\r\n content: msg.content.slice(0, MAX_USER_MESSAGE_LENGTH) + '...'\r\n }\r\n }\r\n\r\n // AI 回复:智能压缩\r\n let content = msg.content\r\n\r\n // 1. 移除大段的 JSON 代码块,但保留摘要\r\n content = content.replace(/```json\\n[\\s\\S]*?\\n```/g, '[工具返回数据]')\r\n \r\n // 2. 移除工具返回的原始数据标记\r\n content = content.replace(/## .*?\\(原始JSON\\)[\\s\\S]*?(?=##|$)/g, '')\r\n \r\n // 3. 保留表格(通常是整理后的关键信息)\r\n // 表格不压缩\r\n\r\n // 4. 如果仍然过长,截断\r\n if (content.length > MAX_ASSISTANT_MESSAGE_LENGTH) {\r\n // 尝试保留表格部分\r\n const tableMatch = content.match(/\\|[\\s\\S]*?\\|/g)\r\n if (tableMatch) {\r\n const tables = tableMatch.join('\\n')\r\n if (tables.length < MAX_ASSISTANT_MESSAGE_LENGTH) {\r\n content = content.slice(0, MAX_ASSISTANT_MESSAGE_LENGTH - tables.length) + '\\n' + tables\r\n }\r\n }\r\n content = content.slice(0, MAX_ASSISTANT_MESSAGE_LENGTH) + '...'\r\n }\r\n\r\n return { role: msg.role, content: content.trim() || msg.content.slice(0, 500) }\r\n })\r\n }\r\n\r\n /**\r\n * 流式对话\r\n */\r\n async *chatStream(\r\n userMessage: string,\r\n options?: {\r\n allowedTools?: string[]\r\n history?: Array<{ role: 'user' | 'assistant'; content: string }>\r\n }\r\n ): AsyncGenerator<MCPLinkEvent> {\r\n const startTime = Date.now()\r\n\r\n // 获取工具\r\n let mcpTools = this.mcpManager.getAllTools()\r\n if (options?.allowedTools?.length) {\r\n mcpTools = mcpTools.filter((t) => options.allowedTools!.includes(t.name))\r\n }\r\n\r\n // 构建消息\r\n const messages: CoreMessage[] = [\r\n { role: 'system', content: this.buildSystemPrompt(mcpTools) }\r\n ]\r\n\r\n // 添加历史(压缩后)\r\n if (options?.history?.length) {\r\n const compressedHistory = this.compressHistory(options.history)\r\n console.log(`[PromptBasedAgent] 📚 历史消息: ${options.history.length} 条 -> 压缩后: ${compressedHistory.length} 条`)\r\n for (const msg of compressedHistory) {\r\n messages.push({ role: msg.role, content: msg.content })\r\n }\r\n }\r\n\r\n // 添加当前消息\r\n messages.push({ role: 'user', content: userMessage })\r\n console.log(`[PromptBasedAgent] 📝 用户消息: \"${userMessage.slice(0, 50)}${userMessage.length > 50 ? '...' : ''}\"`)\r\n console.log(`[PromptBasedAgent] 📊 总消息数: ${messages.length}`)\r\n\r\n let iteration = 0\r\n\r\n while (iteration < this.maxIterations) {\r\n iteration++\r\n\r\n yield {\r\n type: MCPLinkEventType.ITERATION_START,\r\n timestamp: Date.now(),\r\n data: { iteration, maxIterations: this.maxIterations },\r\n }\r\n\r\n // 调用模型(带超时控制)\r\n console.log(`[PromptBasedAgent] 🤖 调用模型,迭代 ${iteration}/${this.maxIterations}...`)\r\n const modelStartTime = Date.now()\r\n \r\n const stream = streamText({ \r\n model: this.model, \r\n messages,\r\n // 设置请求超时\r\n experimental_telemetry: {\r\n isEnabled: false, // 禁用遥测以减少开销\r\n },\r\n })\r\n\r\n // 状态\r\n let fullResponse = ''\r\n let buffer = ''\r\n let inThinking = false\r\n let inToolCall = false\r\n let thinkingStarted = false\r\n let thinkingEnded = false\r\n let textStarted = false\r\n\r\n // 流式处理(带超时保护)\r\n let firstChunkReceived = false\r\n const FIRST_CHUNK_TIMEOUT = 120000 // 2分钟等待首个响应\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null\r\n \r\n // 设置超时\r\n const timeoutPromise = new Promise<never>((_, reject) => {\r\n timeoutId = setTimeout(() => {\r\n reject(new Error(`模型响应超时 (${FIRST_CHUNK_TIMEOUT / 1000}秒无响应)`))\r\n }, FIRST_CHUNK_TIMEOUT)\r\n })\r\n\r\n try {\r\n for await (const chunk of stream.fullStream) {\r\n // 收到第一个 chunk 后取消超时\r\n if (!firstChunkReceived) {\r\n firstChunkReceived = true\r\n if (timeoutId) {\r\n clearTimeout(timeoutId)\r\n timeoutId = null\r\n }\r\n console.log(`[PromptBasedAgent] ⚡ 首个 chunk 到达,耗时: ${Date.now() - modelStartTime}ms`)\r\n }\r\n // 原生 reasoning 支持\r\n if (chunk.type === 'reasoning') {\r\n if (!thinkingStarted) {\r\n thinkingStarted = true\r\n yield { type: MCPLinkEventType.THINKING_START, timestamp: Date.now(), data: {} }\r\n }\r\n if (chunk.textDelta) {\r\n yield { type: MCPLinkEventType.THINKING_DELTA, timestamp: Date.now(), data: { content: chunk.textDelta } }\r\n }\r\n continue\r\n }\r\n\r\n if (chunk.type === 'text-delta') {\r\n const delta = chunk.textDelta\r\n buffer += delta\r\n fullResponse += delta\r\n\r\n // 简单状态机解析\r\n while (buffer.length > 0) {\r\n if (!inThinking && !inToolCall) {\r\n // 检查 <think> 开始\r\n const thinkStart = buffer.indexOf('<think>')\r\n if (thinkStart !== -1) {\r\n // 输出 <think> 之前的文本\r\n if (thinkStart > 0) {\r\n const before = buffer.substring(0, thinkStart)\r\n if (before.trim() && thinkingEnded) {\r\n if (!textStarted) {\r\n textStarted = true\r\n yield { type: MCPLinkEventType.TEXT_START, timestamp: Date.now(), data: {} }\r\n }\r\n yield { type: MCPLinkEventType.TEXT_DELTA, timestamp: Date.now(), data: { content: before } }\r\n }\r\n }\r\n inThinking = true\r\n if (!thinkingStarted) {\r\n thinkingStarted = true\r\n yield { type: MCPLinkEventType.THINKING_START, timestamp: Date.now(), data: {} }\r\n }\r\n buffer = buffer.substring(thinkStart + 7)\r\n continue\r\n }\r\n\r\n // 检查 <tool_call> 开始\r\n const toolStart = buffer.indexOf('<tool_call>')\r\n if (toolStart !== -1) {\r\n if (toolStart > 0) {\r\n const before = buffer.substring(0, toolStart)\r\n if (before.trim() && thinkingEnded) {\r\n if (!textStarted) {\r\n textStarted = true\r\n yield { type: MCPLinkEventType.TEXT_START, timestamp: Date.now(), data: {} }\r\n }\r\n yield { type: MCPLinkEventType.TEXT_DELTA, timestamp: Date.now(), data: { content: before } }\r\n }\r\n }\r\n inToolCall = true\r\n buffer = buffer.substring(toolStart + 11)\r\n continue\r\n }\r\n\r\n // 没有特殊标签,检查是否可以安全输出\r\n if (!buffer.includes('<')) {\r\n if (buffer.trim() && (thinkingEnded || !thinkingStarted)) {\r\n // 如果没有思考过程,自动生成一个简短的\r\n if (!thinkingStarted && !thinkingEnded) {\r\n thinkingStarted = true\r\n thinkingEnded = true\r\n yield { type: MCPLinkEventType.THINKING_START, timestamp: Date.now(), data: {} }\r\n yield { type: MCPLinkEventType.THINKING_DELTA, timestamp: Date.now(), data: { content: '分析用户请求...' } }\r\n yield { type: MCPLinkEventType.THINKING_END, timestamp: Date.now(), data: {} }\r\n }\r\n if (!textStarted) {\r\n textStarted = true\r\n yield { type: MCPLinkEventType.TEXT_START, timestamp: Date.now(), data: {} }\r\n }\r\n yield { type: MCPLinkEventType.TEXT_DELTA, timestamp: Date.now(), data: { content: buffer } }\r\n }\r\n buffer = ''\r\n }\r\n break\r\n }\r\n\r\n if (inThinking) {\r\n const thinkEnd = buffer.indexOf('</think>')\r\n if (thinkEnd !== -1) {\r\n const content = buffer.substring(0, thinkEnd)\r\n if (content) {\r\n yield { type: MCPLinkEventType.THINKING_DELTA, timestamp: Date.now(), data: { content } }\r\n }\r\n yield { type: MCPLinkEventType.THINKING_END, timestamp: Date.now(), data: {} }\r\n thinkingEnded = true\r\n inThinking = false\r\n buffer = buffer.substring(thinkEnd + 8)\r\n continue\r\n }\r\n // 流式输出思考内容\r\n if (buffer.length > 10 && !buffer.includes('<')) {\r\n const safe = buffer.substring(0, buffer.length - 10)\r\n yield { type: MCPLinkEventType.THINKING_DELTA, timestamp: Date.now(), data: { content: safe } }\r\n buffer = buffer.substring(safe.length)\r\n }\r\n break\r\n }\r\n\r\n if (inToolCall) {\r\n const toolEnd = buffer.indexOf('</tool_call>')\r\n if (toolEnd !== -1) {\r\n inToolCall = false\r\n buffer = buffer.substring(toolEnd + 12)\r\n continue\r\n }\r\n break\r\n }\r\n\r\n break\r\n }\r\n }\r\n\r\n if (chunk.type === 'finish') {\r\n // 处理剩余内容\r\n if (buffer.trim()) {\r\n if (inThinking) {\r\n yield { type: MCPLinkEventType.THINKING_DELTA, timestamp: Date.now(), data: { content: buffer } }\r\n yield { type: MCPLinkEventType.THINKING_END, timestamp: Date.now(), data: {} }\r\n thinkingEnded = true\r\n } else if (!inToolCall) {\r\n if (!textStarted) {\r\n textStarted = true\r\n yield { type: MCPLinkEventType.TEXT_START, timestamp: Date.now(), data: {} }\r\n }\r\n yield { type: MCPLinkEventType.TEXT_DELTA, timestamp: Date.now(), data: { content: buffer } }\r\n }\r\n }\r\n if (textStarted) {\r\n yield { type: MCPLinkEventType.TEXT_END, timestamp: Date.now(), data: {} }\r\n }\r\n }\r\n }\r\n } finally {\r\n // 清理超时计时器\r\n if (timeoutId) {\r\n clearTimeout(timeoutId)\r\n }\r\n }\r\n\r\n // 检查工具调用\r\n const toolCall = this.parseToolCall(fullResponse)\r\n\r\n if (toolCall) {\r\n const toolCallId = `tool-${Date.now()}`\r\n\r\n // 发送工具调用事件\r\n yield {\r\n type: MCPLinkEventType.TOOL_CALL_START,\r\n timestamp: Date.now(),\r\n data: { toolName: toolCall.name, toolCallId, toolArgs: toolCall.arguments },\r\n }\r\n\r\n yield {\r\n type: MCPLinkEventType.TOOL_EXECUTING,\r\n timestamp: Date.now(),\r\n data: { toolName: toolCall.name, toolCallId, toolArgs: toolCall.arguments },\r\n }\r\n\r\n // 执行工具\r\n const toolStartTime = Date.now()\r\n let result: unknown\r\n let isError = false\r\n\r\n try {\r\n result = await this.mcpManager.callTool(toolCall.name, toolCall.arguments)\r\n } catch (error) {\r\n result = error instanceof Error ? error.message : String(error)\r\n isError = true\r\n }\r\n\r\n const duration = Date.now() - toolStartTime\r\n\r\n yield {\r\n type: MCPLinkEventType.TOOL_RESULT,\r\n timestamp: Date.now(),\r\n data: { toolName: toolCall.name, toolResult: result, toolCallId, duration, isError },\r\n }\r\n\r\n // 检查是否匹配即时结果,如果匹配则发送 IMMEDIATE_RESULT 事件\r\n if (!isError && this.matchImmediateResult(result)) {\r\n yield {\r\n type: MCPLinkEventType.IMMEDIATE_RESULT,\r\n timestamp: Date.now(),\r\n data: {\r\n toolName: toolCall.name,\r\n toolCallId,\r\n immediateResult: result,\r\n },\r\n }\r\n }\r\n\r\n // 更新消息历史\r\n messages.push({ role: 'assistant', content: fullResponse })\r\n\r\n const resultStr = typeof result === 'string' ? result : JSON.stringify(result, null, 2)\r\n messages.push({\r\n role: 'user',\r\n content: `工具 ${toolCall.name} 返回结果:\\n${resultStr}\\n\\n请根据结果用中文回复用户。`,\r\n })\r\n\r\n yield { type: MCPLinkEventType.ITERATION_END, timestamp: Date.now(), data: { iteration } }\r\n continue\r\n }\r\n\r\n console.log(`[PromptBasedAgent] ✅ 模型响应完成,耗时: ${Date.now() - modelStartTime}ms,响应长度: ${fullResponse.length}`)\r\n\r\n // 没有工具调用\r\n // 如果没有任何输出,尝试直接输出响应\r\n if (!textStarted && fullResponse.trim()) {\r\n // 清理标签后输出\r\n let cleanText = fullResponse\r\n .replace(/<think>[\\s\\S]*?<\\/think>/gi, '')\r\n .replace(/<tool_call>[\\s\\S]*?<\\/tool_call>/gi, '')\r\n .trim()\r\n\r\n if (cleanText) {\r\n yield { type: MCPLinkEventType.TEXT_START, timestamp: Date.now(), data: {} }\r\n yield { type: MCPLinkEventType.TEXT_DELTA, timestamp: Date.now(), data: { content: cleanText } }\r\n yield { type: MCPLinkEventType.TEXT_END, timestamp: Date.now(), data: {} }\r\n }\r\n }\r\n\r\n yield { type: MCPLinkEventType.ITERATION_END, timestamp: Date.now(), data: { iteration } }\r\n break\r\n }\r\n\r\n yield {\r\n type: MCPLinkEventType.COMPLETE,\r\n timestamp: Date.now(),\r\n data: { totalDuration: Date.now() - startTime, totalIterations: iteration },\r\n }\r\n }\r\n}\r\n","import type { LanguageModel } from 'ai'\r\nimport { MCPManager } from './MCPManager.js'\r\nimport { Agent } from './Agent.js'\r\nimport { PromptBasedAgent } from './PromptBasedAgent.js'\r\nimport type {\r\n MCPLinkConfig,\r\n MCPServerConfig,\r\n ChatCallbacks,\r\n ChatResult,\r\n MCPLinkEvent,\r\n MCPTool,\r\n MCPServerStatus,\r\n} from './types.js'\r\n\r\n/**\r\n * 支持原生 Function Calling(工具调用)的模型模式列表\r\n * 这些模型使用 Agent.ts(原生工具调用模式)\r\n * \r\n * 注意:某些\"思考模型\"(thinking models)虽然支持工具调用,\r\n * 但需要特殊的 API 处理(如 thought_signature),暂不支持\r\n */\r\nconst NATIVE_FUNCTION_CALLING_PATTERNS = [\r\n // OpenAI GPT 系列 - 支持原生 function calling\r\n /^gpt/i,\r\n // OpenAI o1/o3 需要特殊处理,暂用 PromptBased\r\n // /^o1/i,\r\n // /^o3/i,\r\n // Anthropic Claude - 支持原生 function calling\r\n /^claude/i,\r\n // Google Gemini 稳定版 - 支持原生 function calling\r\n // 注意:gemini-*-preview/thinking 版本需要特殊处理,不在此列表\r\n /^gemini-[\\d.]+-flash$/i,\r\n /^gemini-[\\d.]+-pro$/i,\r\n /^gemini-pro$/i,\r\n /^gemini-flash$/i,\r\n // Mistral - 支持原生 function calling\r\n /^mistral/i,\r\n /^mixtral/i,\r\n // Cohere Command-R - 支持原生 function calling\r\n /^command-r/i,\r\n]\r\n\r\n/**\r\n * 需要使用 Prompt-Based 方式的模型\r\n * 这些模型:\r\n * 1. 不支持原生 function calling\r\n * 2. 是\"思考模型\",需要特殊 API 处理(如 thought_signature)\r\n */\r\nconst PROMPT_BASED_PATTERNS = [\r\n // DeepSeek(不支持原生 function calling)\r\n /deepseek/i,\r\n // OpenAI o1/o3 思考模型\r\n /^o1/i,\r\n /^o3/i,\r\n // Gemini 思考/预览版本 - 需要 thought_signature,暂用 PromptBased\r\n /gemini.*preview/i,\r\n /gemini.*thinking/i,\r\n /gemini.*exp/i,\r\n // 开源模型(大多数不支持原生 function calling)\r\n /^llama/i,\r\n /^phi-/i,\r\n /^qwen/i,\r\n /^yi-/i,\r\n /^glm/i,\r\n /^baichuan/i,\r\n]\r\n\r\n/**\r\n * 检测模型是否支持原生 Function Calling\r\n * @param modelId 模型 ID\r\n * @returns true = 使用原生 Agent, false = 使用 PromptBasedAgent\r\n */\r\nfunction detectNativeToolSupport(modelId: string): boolean {\r\n console.log(`[MCPLink] 🔍 检测模型: \"${modelId}\"`)\r\n \r\n // 先检查是否明确需要 Prompt-Based(包括思考模型)\r\n for (const pattern of PROMPT_BASED_PATTERNS) {\r\n if (pattern.test(modelId)) {\r\n console.log(`[MCPLink] ✅ Model \"${modelId}\" -> PromptBasedAgent (matched: ${pattern})`)\r\n return false\r\n }\r\n }\r\n\r\n // 检查是否支持原生 function calling\r\n for (const pattern of NATIVE_FUNCTION_CALLING_PATTERNS) {\r\n if (pattern.test(modelId)) {\r\n console.log(`[MCPLink] ✅ Model \"${modelId}\" -> Agent (原生模式, matched: ${pattern})`)\r\n return true\r\n }\r\n }\r\n\r\n // 默认使用 Prompt-Based(更安全,兼容未知模型,提供思考过程)\r\n console.log(`[MCPLink] ⚠️ Model \"${modelId}\" -> PromptBasedAgent (未知模型,默认)`)\r\n return false\r\n}\r\n\r\n/**\r\n * MCPLink 主类\r\n * AI Agent 工具调用框架的入口\r\n */\r\nexport class MCPLink {\r\n private model: LanguageModel\r\n private mcpManager: MCPManager\r\n private agent: Agent\r\n private promptBasedAgent: PromptBasedAgent\r\n private config: MCPLinkConfig\r\n private initialized = false\r\n private detectedNativeSupport: boolean\r\n\r\n constructor(config: MCPLinkConfig) {\r\n this.config = config\r\n this.model = config.model\r\n this.mcpManager = new MCPManager()\r\n\r\n // 添加配置的 MCP 服务器\r\n if (config.mcpServers) {\r\n for (const [id, serverConfig] of Object.entries(config.mcpServers)) {\r\n this.mcpManager.addServer(id, serverConfig)\r\n }\r\n }\r\n\r\n // 创建 Agent\r\n this.agent = new Agent(this.model, this.mcpManager, {\r\n systemPrompt: config.systemPrompt,\r\n maxIterations: config.maxIterations,\r\n immediateResultMatchers: config.immediateResultMatchers,\r\n parallelToolCalls: config.parallelToolCalls,\r\n enableThinkingPhase: config.enableThinkingPhase,\r\n })\r\n\r\n // 创建 PromptBasedAgent\r\n this.promptBasedAgent = new PromptBasedAgent(this.model, this.mcpManager, {\r\n systemPrompt: config.systemPrompt,\r\n maxIterations: config.maxIterations,\r\n immediateResultMatchers: config.immediateResultMatchers,\r\n parallelToolCalls: config.parallelToolCalls,\r\n enableThinkingPhase: config.enableThinkingPhase,\r\n })\r\n\r\n // 自动检测模型是否支持原生工具调用\r\n // 如果用户强制指定了,则使用用户的设置\r\n if (config.usePromptBasedTools === true) {\r\n this.detectedNativeSupport = false\r\n } else if (config.usePromptBasedTools === false) {\r\n this.detectedNativeSupport = true\r\n } else {\r\n // 'auto' 或未指定:自动检测\r\n // 优先使用 modelName,其次使用 model.modelId\r\n const modelNameToCheck = config.modelName || config.model.modelId\r\n this.detectedNativeSupport = detectNativeToolSupport(modelNameToCheck)\r\n }\r\n }\r\n\r\n /**\r\n * 初始化 - 连接所有 MCP 服务器\r\n */\r\n async initialize(): Promise<void> {\r\n if (this.initialized) {\r\n return\r\n }\r\n\r\n await this.mcpManager.startAll()\r\n this.initialized = true\r\n }\r\n\r\n /**\r\n * 关闭 - 断开所有 MCP 服务器连接\r\n */\r\n async close(): Promise<void> {\r\n await this.mcpManager.stopAll()\r\n this.initialized = false\r\n }\r\n\r\n /**\r\n * 发起对话\r\n */\r\n async chat(message: string, callbacks?: ChatCallbacks): Promise<ChatResult> {\r\n if (!this.initialized) {\r\n await this.initialize()\r\n }\r\n\r\n return this.agent.chat(message, callbacks)\r\n }\r\n\r\n /**\r\n * 流式对话\r\n * @param message 用户消息\r\n * @param options 可选参数\r\n * @param options.allowedTools 允许使用的工具名称列表\r\n * @param options.history 历史消息列表\r\n */\r\n async *chatStream(\r\n message: string,\r\n options?: {\r\n allowedTools?: string[]\r\n history?: Array<{ role: 'user' | 'assistant'; content: string }>\r\n }\r\n ): AsyncGenerator<MCPLinkEvent> {\r\n if (!this.initialized) {\r\n await this.initialize()\r\n }\r\n\r\n // 根据检测结果选择 Agent\r\n if (this.detectedNativeSupport) {\r\n yield* this.agent.chatStream(message, options)\r\n } else {\r\n yield* this.promptBasedAgent.chatStream(message, options)\r\n }\r\n }\r\n\r\n /**\r\n * 获取当前使用的模式\r\n */\r\n getToolCallingMode(): 'native' | 'prompt-based' {\r\n return this.detectedNativeSupport ? 'native' : 'prompt-based'\r\n }\r\n\r\n // ============ MCP 服务器管理 ============\r\n\r\n /**\r\n * 添加 MCP 服务器\r\n */\r\n addMCPServer(id: string, config: MCPServerConfig): void {\r\n this.mcpManager.addServer(id, config)\r\n }\r\n\r\n /**\r\n * 移除 MCP 服务器\r\n */\r\n async removeMCPServer(id: string): Promise<void> {\r\n await this.mcpManager.removeServer(id)\r\n }\r\n\r\n /**\r\n * 启动指定 MCP 服务器\r\n */\r\n async startMCPServer(id: string): Promise<void> {\r\n await this.mcpManager.startServer(id)\r\n }\r\n\r\n /**\r\n * 停止指定 MCP 服务器\r\n */\r\n async stopMCPServer(id: string): Promise<void> {\r\n await this.mcpManager.stopServer(id)\r\n }\r\n\r\n /**\r\n * 获取所有 MCP 服务器状态\r\n */\r\n getMCPServerStatuses(): MCPServerStatus[] {\r\n return this.mcpManager.getServerStatuses()\r\n }\r\n\r\n /**\r\n * 获取所有可用工具\r\n */\r\n getTools(): MCPTool[] {\r\n return this.mcpManager.getAllTools()\r\n }\r\n\r\n /**\r\n * 手动调用工具\r\n */\r\n async callTool(toolName: string, args: Record<string, unknown>): Promise<unknown> {\r\n return this.mcpManager.callTool(toolName, args)\r\n }\r\n\r\n // ============ 配置管理 ============\r\n\r\n /**\r\n * 更新系统提示词\r\n */\r\n setSystemPrompt(prompt: string): void {\r\n this.config.systemPrompt = prompt\r\n // 重新创建 Agent\r\n this.agent = new Agent(this.model, this.mcpManager, {\r\n systemPrompt: prompt,\r\n maxIterations: this.config.maxIterations,\r\n immediateResultMatchers: this.config.immediateResultMatchers,\r\n parallelToolCalls: this.config.parallelToolCalls,\r\n enableThinkingPhase: this.config.enableThinkingPhase,\r\n })\r\n this.promptBasedAgent = new PromptBasedAgent(this.model, this.mcpManager, {\r\n systemPrompt: prompt,\r\n maxIterations: this.config.maxIterations,\r\n immediateResultMatchers: this.config.immediateResultMatchers,\r\n parallelToolCalls: this.config.parallelToolCalls,\r\n enableThinkingPhase: this.config.enableThinkingPhase,\r\n })\r\n }\r\n\r\n /**\r\n * 更新 AI 模型\r\n */\r\n setModel(model: LanguageModel): void {\r\n this.model = model\r\n this.config.model = model\r\n // 重新创建 Agent\r\n this.agent = new Agent(this.model, this.mcpManager, {\r\n systemPrompt: this.config.systemPrompt,\r\n maxIterations: this.config.maxIterations,\r\n immediateResultMatchers: this.config.immediateResultMatchers,\r\n parallelToolCalls: this.config.parallelToolCalls,\r\n enableThinkingPhase: this.config.enableThinkingPhase,\r\n })\r\n this.promptBasedAgent = new PromptBasedAgent(this.model, this.mcpManager, {\r\n systemPrompt: this.config.systemPrompt,\r\n maxIterations: this.config.maxIterations,\r\n immediateResultMatchers: this.config.immediateResultMatchers,\r\n parallelToolCalls: this.config.parallelToolCalls,\r\n enableThinkingPhase: this.config.enableThinkingPhase,\r\n })\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/MCPManager.ts","../src/types.ts","../src/Agent.ts","../src/PromptBasedAgent.ts","../src/MCPLink.ts"],"names":["MCPLinkEventType","duration","streamText"],"mappings":"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","file":"index.js","sourcesContent":["import { Client } from '@modelcontextprotocol/sdk/client/index.js'\r\nimport { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js'\r\nimport { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js'\r\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'\r\nimport type { MCPServerConfig, MCPServerConfigStdio, MCPServerConfigSSE, MCPServerConfigStreamableHTTP, MCPTool, MCPServerStatus } from './types.js'\r\n\r\n/**\r\n * MCP 服务器实例\r\n */\r\ninterface MCPServerInstance {\r\n id: string\r\n config: MCPServerConfig\r\n client: Client\r\n transport: StdioClientTransport | SSEClientTransport | StreamableHTTPClientTransport\r\n tools: MCPTool[]\r\n status: 'stopped' | 'starting' | 'running' | 'error'\r\n error?: string\r\n}\r\n\r\n/**\r\n * MCP 管理器\r\n * 负责管理多个 MCP 服务器的连接、工具发现和调用\r\n */\r\nexport class MCPManager {\r\n private servers: Map<string, MCPServerInstance> = new Map()\r\n\r\n /**\r\n * 添加 MCP 服务器配置\r\n */\r\n addServer(id: string, config: MCPServerConfig): void {\r\n if (this.servers.has(id)) {\r\n throw new Error(`MCP server \"${id}\" already exists`)\r\n }\r\n\r\n // 创建 Client\r\n const client = new Client({ name: 'mcplink', version: '0.0.1' }, { capabilities: {} })\r\n\r\n // 创建 Transport\r\n let transport: StdioClientTransport | SSEClientTransport | StreamableHTTPClientTransport\r\n\r\n if (config.type === 'sse') {\r\n const sseConfig = config as MCPServerConfigSSE\r\n transport = new SSEClientTransport(new URL(sseConfig.url))\r\n } else if (config.type === 'streamable-http') {\r\n const httpConfig = config as MCPServerConfigStreamableHTTP\r\n transport = new StreamableHTTPClientTransport(new URL(httpConfig.url))\r\n } else {\r\n const stdioConfig = config as MCPServerConfigStdio\r\n // 合并当前进程的环境变量和配置的环境变量\r\n // 过滤掉 undefined 值\r\n const processEnv: Record<string, string> = {}\r\n for (const [key, value] of Object.entries(process.env)) {\r\n if (value !== undefined) {\r\n processEnv[key] = value\r\n }\r\n }\r\n const mergedEnv = {\r\n ...processEnv,\r\n ...stdioConfig.env,\r\n }\r\n\r\n // Windows 兼容性处理\r\n // 在 Windows 上,npx/npm 等命令实际上是 .cmd 文件,需要通过 shell 执行\r\n const isWindows = process.platform === 'win32'\r\n let command = stdioConfig.command\r\n let args = stdioConfig.args || []\r\n\r\n if (isWindows) {\r\n // 对于 npx, npm, node 等命令,在 Windows 上需要通过 cmd /c 执行\r\n const windowsCommands = ['npx', 'npm', 'node', 'pnpm', 'yarn', 'bunx']\r\n if (windowsCommands.includes(command.toLowerCase())) {\r\n args = ['/c', command, ...args]\r\n command = 'cmd'\r\n }\r\n }\r\n\r\n transport = new StdioClientTransport({\r\n command,\r\n args,\r\n env: mergedEnv,\r\n })\r\n }\r\n\r\n this.servers.set(id, {\r\n id,\r\n config,\r\n client,\r\n transport,\r\n tools: [],\r\n status: 'stopped',\r\n })\r\n }\r\n\r\n /**\r\n * 启动 MCP 服务器\r\n */\r\n async startServer(id: string): Promise<void> {\r\n const server = this.servers.get(id)\r\n if (!server) {\r\n throw new Error(`MCP server \"${id}\" not found`)\r\n }\r\n\r\n if (server.status === 'running') {\r\n return\r\n }\r\n\r\n server.status = 'starting'\r\n server.error = undefined\r\n\r\n // 打印启动信息\r\n const config = server.config\r\n if (config.type === 'stdio') {\r\n const stdioConfig = config as MCPServerConfigStdio\r\n const isWindows = process.platform === 'win32'\r\n const windowsCommands = ['npx', 'npm', 'node', 'pnpm', 'yarn', 'bunx']\r\n let displayCmd = stdioConfig.command\r\n let displayArgs = stdioConfig.args || []\r\n\r\n if (isWindows && windowsCommands.includes(stdioConfig.command.toLowerCase())) {\r\n displayCmd = 'cmd'\r\n displayArgs = ['/c', stdioConfig.command, ...displayArgs]\r\n }\r\n\r\n console.log(`\\n🔧 [MCP] 正在启动服务器 \"${id}\"...`)\r\n console.log(` 命令: ${displayCmd} ${displayArgs.join(' ')}`)\r\n if (stdioConfig.env && Object.keys(stdioConfig.env).length > 0) {\r\n console.log(` 环境变量: ${Object.keys(stdioConfig.env).join(', ')}`)\r\n }\r\n } else if (config.type === 'sse') {\r\n const sseConfig = config as MCPServerConfigSSE\r\n console.log(`\\n🔧 [MCP] 正在连接 SSE 服务器 \"${id}\"...`)\r\n console.log(` URL: ${sseConfig.url}`)\r\n } else if (config.type === 'streamable-http') {\r\n const httpConfig = config as MCPServerConfigStreamableHTTP\r\n console.log(`\\n🔧 [MCP] 正在连接 Streamable HTTP 服务器 \"${id}\"...`)\r\n console.log(` URL: ${httpConfig.url}`)\r\n }\r\n\r\n try {\r\n // 连接到服务器\r\n await server.client.connect(server.transport)\r\n\r\n // 获取工具列表\r\n const toolsResult = await server.client.listTools()\r\n server.tools = toolsResult.tools.map((tool) => ({\r\n name: tool.name,\r\n description: tool.description || '',\r\n inputSchema: tool.inputSchema as MCPTool['inputSchema'],\r\n }))\r\n\r\n server.status = 'running'\r\n console.log(`✅ [MCP] 服务器 \"${id}\" 启动成功,发现 ${server.tools.length} 个工具`)\r\n if (server.tools.length > 0) {\r\n console.log(` 工具: ${server.tools.map((t) => t.name).join(', ')}`)\r\n }\r\n } catch (error) {\r\n server.status = 'error'\r\n\r\n // 提供更详细的错误信息\r\n let errorMessage = error instanceof Error ? error.message : String(error)\r\n\r\n if (errorMessage.includes('Connection closed')) {\r\n if (config.type === 'stdio') {\r\n const stdioConfig = config as MCPServerConfigStdio\r\n errorMessage =\r\n `MCP 服务器启动失败: 进程立即退出。\\n` +\r\n `命令: ${stdioConfig.command} ${(stdioConfig.args || []).join(' ')}\\n` +\r\n `可能原因:\\n` +\r\n `1. 命令 \"${stdioConfig.command}\" 不存在或不在 PATH 中\\n` +\r\n `2. 如果使用 Docker,请确保 Docker 正在运行\\n` +\r\n `3. 检查环境变量是否正确配置\\n` +\r\n `4. 尝试在终端手动运行命令查看具体错误`\r\n }\r\n }\r\n\r\n // 打印错误到控制台\r\n console.error(`❌ [MCP] 服务器 \"${id}\" 启动失败:`)\r\n console.error(` ${errorMessage.split('\\n').join('\\n ')}`)\r\n\r\n server.error = errorMessage\r\n throw new Error(errorMessage)\r\n }\r\n }\r\n\r\n /**\r\n * 停止 MCP 服务器\r\n */\r\n async stopServer(id: string): Promise<void> {\r\n const server = this.servers.get(id)\r\n if (!server) {\r\n throw new Error(`MCP server \"${id}\" not found`)\r\n }\r\n\r\n if (server.status === 'stopped') {\r\n return\r\n }\r\n\r\n console.log(`🔧 [MCP] 正在停止服务器 \"${id}\"...`)\r\n\r\n try {\r\n await server.client.close()\r\n console.log(`✅ [MCP] 服务器 \"${id}\" 已停止`)\r\n } catch (error) {\r\n console.error(`⚠️ [MCP] 停止服务器 \"${id}\" 时出错:`, error)\r\n } finally {\r\n server.status = 'stopped'\r\n server.tools = []\r\n }\r\n }\r\n\r\n /**\r\n * 启动所有已配置的服务器\r\n */\r\n async startAll(): Promise<void> {\r\n const startPromises = Array.from(this.servers.keys()).map((id) =>\r\n this.startServer(id).catch((error) => {\r\n console.error(`Failed to start MCP server \"${id}\":`, error)\r\n })\r\n )\r\n await Promise.all(startPromises)\r\n }\r\n\r\n /**\r\n * 停止所有服务器\r\n */\r\n async stopAll(): Promise<void> {\r\n const stopPromises = Array.from(this.servers.keys()).map((id) =>\r\n this.stopServer(id).catch((error) => {\r\n console.error(`Failed to stop MCP server \"${id}\":`, error)\r\n })\r\n )\r\n await Promise.all(stopPromises)\r\n }\r\n\r\n /**\r\n * 获取所有可用的工具\r\n */\r\n getAllTools(): MCPTool[] {\r\n const tools: MCPTool[] = []\r\n for (const server of this.servers.values()) {\r\n if (server.status === 'running') {\r\n tools.push(...server.tools)\r\n }\r\n }\r\n return tools\r\n }\r\n\r\n /**\r\n * 调用工具\r\n */\r\n async callTool(toolName: string, args: Record<string, unknown>): Promise<unknown> {\r\n // 找到提供该工具的服务器\r\n for (const server of this.servers.values()) {\r\n if (server.status !== 'running') continue\r\n\r\n const tool = server.tools.find((t) => t.name === toolName)\r\n if (tool) {\r\n const result = await server.client.callTool({\r\n name: toolName,\r\n arguments: args,\r\n })\r\n\r\n // 处理结果\r\n if (result.content && Array.isArray(result.content)) {\r\n // 如果是文本内容,拼接返回\r\n const textContents = result.content\r\n .filter((c): c is { type: 'text'; text: string } => c.type === 'text')\r\n .map((c) => c.text)\r\n\r\n if (textContents.length > 0) {\r\n const textResult = textContents.join('\\n')\r\n // 检查是否是错误结果\r\n if (result.isError) {\r\n throw new Error(textResult || '工具执行失败')\r\n }\r\n return textResult\r\n }\r\n }\r\n\r\n // 检查是否是错误结果\r\n if (result.isError) {\r\n const errorContent = result.content\r\n throw new Error(\r\n typeof errorContent === 'string'\r\n ? errorContent\r\n : JSON.stringify(errorContent) || '工具执行失败'\r\n )\r\n }\r\n\r\n return result.content\r\n }\r\n }\r\n\r\n throw new Error(`Tool \"${toolName}\" not found in any running MCP server`)\r\n }\r\n\r\n /**\r\n * 获取所有服务器状态\r\n */\r\n getServerStatuses(): MCPServerStatus[] {\r\n return Array.from(this.servers.values()).map((server) => ({\r\n id: server.id,\r\n name: server.id,\r\n config: server.config,\r\n status: server.status,\r\n tools: server.tools,\r\n error: server.error,\r\n }))\r\n }\r\n\r\n /**\r\n * 移除服务器\r\n */\r\n async removeServer(id: string): Promise<void> {\r\n await this.stopServer(id)\r\n this.servers.delete(id)\r\n }\r\n}\r\n","import type { LanguageModel } from 'ai'\r\n\r\n// ============ 配置类型 ============\r\n\r\n/** MCP 服务器配置 - stdio 模式 */\r\nexport interface MCPServerConfigStdio {\r\n type?: 'stdio'\r\n /** 启动命令 */\r\n command: string\r\n /** 命令参数 */\r\n args?: string[]\r\n /** 环境变量 */\r\n env?: Record<string, string>\r\n}\r\n\r\n/** MCP 服务器配置 - SSE 模式 */\r\nexport interface MCPServerConfigSSE {\r\n type: 'sse'\r\n /** SSE 服务地址 */\r\n url: string\r\n /** 请求头 */\r\n headers?: Record<string, string>\r\n}\r\n\r\n/** MCP 服务器配置 - Streamable HTTP 模式 */\r\nexport interface MCPServerConfigStreamableHTTP {\r\n type: 'streamable-http'\r\n /** HTTP 服务地址 */\r\n url: string\r\n /** 请求头 */\r\n headers?: Record<string, string>\r\n}\r\n\r\n/** MCP 服务器配置 */\r\nexport type MCPServerConfig = MCPServerConfigStdio | MCPServerConfigSSE | MCPServerConfigStreamableHTTP\r\n\r\n/**\r\n * 即时结果匹配器\r\n * 用于检测 MCP 工具返回的特殊格式数据\r\n * 当工具返回的 JSON 包含匹配器中所有的 key-value 时,会立即发送 IMMEDIATE_RESULT 事件\r\n * \r\n * @example\r\n * // 匹配包含 { type: \"card\" } 的返回结果\r\n * { type: \"card\" }\r\n * \r\n * // 匹配包含 { type: \"product_list\", isCard: true } 的返回结果\r\n * { type: \"product_list\", isCard: true }\r\n */\r\nexport type ImmediateResultMatcher = Record<string, unknown>\r\n\r\n/** MCPLink 配置 */\r\nexport interface MCPLinkConfig {\r\n /** AI 模型实例 (Vercel AI SDK) */\r\n model: LanguageModel\r\n /** 模型名称(用于自动检测是否支持原生工具调用) */\r\n modelName?: string\r\n /** MCP 服务器配置 */\r\n mcpServers?: Record<string, MCPServerConfig>\r\n /** 系统提示词 */\r\n systemPrompt?: string\r\n /** 最大迭代次数 (防止无限循环) */\r\n maxIterations?: number\r\n /** 是否允许并行工具调用 */\r\n parallelToolCalls?: boolean\r\n /**\r\n * 是否使用基于 Prompt 的工具调用\r\n * - true: 使用 prompt 让模型输出特定格式来调用工具(支持所有模型)\r\n * - false: 使用原生 function calling(需要模型支持)\r\n * - 'auto': 自动检测(默认)\r\n */\r\n usePromptBasedTools?: boolean | 'auto'\r\n /**\r\n * 即时结果匹配器列表\r\n * 当 MCP 工具返回的结果匹配任意一个匹配器时,会立即发送 IMMEDIATE_RESULT 事件\r\n * 匹配规则:结果 JSON 中包含匹配器的所有 key 且对应的 value 相等\r\n * \r\n * @example\r\n * immediateResultMatchers: [\r\n * { type: \"card\" }, // 匹配 { type: \"card\", ... }\r\n * { type: \"product_list\" }, // 匹配 { type: \"product_list\", ... }\r\n * ]\r\n */\r\n immediateResultMatchers?: ImmediateResultMatcher[]\r\n /**\r\n * 是否启用思考阶段(两阶段调用)\r\n * - true: 每次迭代先让 AI 思考分析,再执行工具调用(默认,推荐)\r\n * - false: 直接调用 AI 并执行工具(更快但可能不够准确)\r\n * \r\n * 启用后的流程:\r\n * 1. 思考阶段:AI 分析需求,输出思考过程,决定调用什么工具\r\n * 2. 执行阶段:根据思考结果执行工具调用\r\n * \r\n * 优点:\r\n * - 任何模型都能看到思考过程\r\n * - Chain-of-Thought 效应,显著提高复杂任务准确性\r\n * \r\n * 缺点:\r\n * - 每次迭代多一次 API 调用,增加延迟和成本\r\n * \r\n * @default true\r\n */\r\n enableThinkingPhase?: boolean\r\n}\r\n\r\n// ============ 消息类型 ============\r\n\r\n/** 工具调用 */\r\nexport interface ToolCall {\r\n id: string\r\n name: string\r\n arguments: Record<string, unknown>\r\n}\r\n\r\n/** 工具结果 */\r\nexport interface ToolResult {\r\n toolCallId: string\r\n toolName: string\r\n result: unknown\r\n isError?: boolean\r\n duration?: number\r\n}\r\n\r\n/** 消息角色 */\r\nexport type MessageRole = 'system' | 'user' | 'assistant' | 'tool'\r\n\r\n/** 消息 */\r\nexport interface Message {\r\n role: MessageRole\r\n content: string\r\n toolCalls?: ToolCall[]\r\n toolResults?: ToolResult[]\r\n}\r\n\r\n// ============ 事件类型 ============\r\n\r\n/** 事件类型 */\r\nexport enum MCPLinkEventType {\r\n /** AI 开始思考 */\r\n THINKING_START = 'thinking_start',\r\n /** AI 思考内容 (流式) */\r\n THINKING_DELTA = 'thinking_delta',\r\n /** AI 思考结束 */\r\n THINKING_END = 'thinking_end',\r\n /** AI 思考内容(完整,用于工具调用时展示) */\r\n THINKING_CONTENT = 'thinking_content',\r\n\r\n /** AI 开始回复 */\r\n TEXT_START = 'text_start',\r\n /** AI 回复内容 (流式) */\r\n TEXT_DELTA = 'text_delta',\r\n /** AI 回复结束 */\r\n TEXT_END = 'text_end',\r\n\r\n /** 开始调用工具 */\r\n TOOL_CALL_START = 'tool_call_start',\r\n /** 工具参数 (流式) */\r\n TOOL_CALL_DELTA = 'tool_call_delta',\r\n /** 工具正在执行 */\r\n TOOL_EXECUTING = 'tool_executing',\r\n /** 工具返回结果 */\r\n TOOL_RESULT = 'tool_result',\r\n /** 工具返回的即时结果(匹配 immediateResultMatchers 时触发) */\r\n IMMEDIATE_RESULT = 'immediate_result',\r\n\r\n /** 开始新一轮迭代 */\r\n ITERATION_START = 'iteration_start',\r\n /** 迭代结束 */\r\n ITERATION_END = 'iteration_end',\r\n\r\n /** 全部完成 */\r\n COMPLETE = 'complete',\r\n /** 发生错误 */\r\n ERROR = 'error',\r\n}\r\n\r\n/** 事件数据 */\r\nexport interface MCPLinkEventData {\r\n content?: string\r\n toolName?: string\r\n toolArgs?: Record<string, unknown>\r\n toolResult?: unknown\r\n toolCallId?: string\r\n duration?: number\r\n iteration?: number\r\n maxIterations?: number\r\n totalIterations?: number\r\n totalDuration?: number\r\n argsTextDelta?: string\r\n isError?: boolean\r\n error?: Error\r\n /** 即时结果数据(原封不动的工具返回结果) */\r\n immediateResult?: unknown\r\n}\r\n\r\n/** 事件 */\r\nexport interface MCPLinkEvent {\r\n type: MCPLinkEventType\r\n timestamp: number\r\n data: MCPLinkEventData\r\n}\r\n\r\n// ============ 回调类型 ============\r\n\r\n/** 对话回调选项 */\r\nexport interface ChatCallbacks {\r\n /** AI 思考内容 */\r\n onThinking?: (content: string) => void\r\n /** 开始调用工具 */\r\n onToolCallStart?: (toolName: string, args: Record<string, unknown>) => void\r\n /** 工具返回结果 */\r\n onToolResult?: (toolName: string, result: unknown, duration: number) => void\r\n /** AI 输出文本 (流式) */\r\n onTextDelta?: (delta: string) => void\r\n /** 迭代开始 */\r\n onIterationStart?: (iteration: number) => void\r\n /** 迭代结束 */\r\n onIterationEnd?: (iteration: number) => void\r\n /** 发生错误 */\r\n onError?: (error: Error) => void\r\n}\r\n\r\n// ============ 返回类型 ============\r\n\r\n/** 对话结果 */\r\nexport interface ChatResult {\r\n /** 最终回复内容 */\r\n content: string\r\n /** 执行过的工具调用记录 */\r\n toolCalls: Array<{\r\n name: string\r\n arguments: Record<string, unknown>\r\n result: unknown\r\n duration: number\r\n }>\r\n /** 完整消息历史 */\r\n messages: Message[]\r\n /** Token 使用量 */\r\n usage: {\r\n promptTokens: number\r\n completionTokens: number\r\n totalTokens: number\r\n }\r\n /** 总迭代次数 */\r\n iterations: number\r\n /** 总耗时 (ms) */\r\n duration: number\r\n}\r\n\r\n// ============ MCP 工具类型 ============\r\n\r\n/** MCP 工具定义 */\r\nexport interface MCPTool {\r\n name: string\r\n description: string\r\n inputSchema: {\r\n type: 'object'\r\n properties?: Record<string, unknown>\r\n required?: string[]\r\n }\r\n}\r\n\r\n/** MCP 服务器状态 */\r\nexport interface MCPServerStatus {\r\n id: string\r\n name: string\r\n config: MCPServerConfig\r\n status: 'stopped' | 'starting' | 'running' | 'error'\r\n tools: MCPTool[]\r\n error?: string\r\n}\r\n","import { generateText, streamText, type LanguageModel, type CoreMessage, type CoreTool } from 'ai'\r\nimport { z } from 'zod'\r\nimport type { MCPManager } from './MCPManager.js'\r\nimport {\r\n MCPLinkEventType,\r\n type MCPTool,\r\n type ChatCallbacks,\r\n type ChatResult,\r\n type MCPLinkEvent,\r\n type ToolResult,\r\n type ImmediateResultMatcher,\r\n} from './types.js'\r\n\r\n/** \r\n * 默认用户提示词\r\n * 这只是用户自定义的部分,核心工具调用逻辑已内置到代码中\r\n */\r\nexport const DEFAULT_SYSTEM_PROMPT = `你是一个专业、友好的智能助手。\r\n\r\n## 回复要求\r\n- 简洁清晰,重点突出\r\n- 用列表呈现关键信息\r\n- 语气礼貌自然,像专业助手\r\n- 有结论时直接给出,需要补充信息时简单询问`\r\n\r\n/**\r\n * 默认思考阶段提示词\r\n * 用于引导 AI 在调用工具前进行简短分析\r\n */\r\nexport const DEFAULT_THINKING_PHASE_PROMPT = `简要分析用户需求,决定下一步行动。\r\n要求:1-2句话说明意图,直接决定用什么工具。不要暴露系统内部信息。`\r\n\r\n/**\r\n * Agent 引擎\r\n * 负责执行 AI 对话循环,处理工具调用\r\n */\r\nexport class Agent {\r\n private model: LanguageModel\r\n private mcpManager: MCPManager\r\n private systemPrompt: string\r\n private maxIterations: number\r\n private immediateResultMatchers: ImmediateResultMatcher[]\r\n private parallelToolCalls: boolean\r\n private enableThinkingPhase: boolean\r\n private thinkingPhasePrompt: string\r\n\r\n constructor(\r\n model: LanguageModel,\r\n mcpManager: MCPManager,\r\n options: {\r\n systemPrompt?: string\r\n maxIterations?: number\r\n immediateResultMatchers?: ImmediateResultMatcher[]\r\n parallelToolCalls?: boolean\r\n enableThinkingPhase?: boolean\r\n thinkingPhasePrompt?: string\r\n } = {}\r\n ) {\r\n this.model = model\r\n this.mcpManager = mcpManager\r\n this.systemPrompt = options.systemPrompt || DEFAULT_SYSTEM_PROMPT\r\n this.maxIterations = options.maxIterations || 10\r\n this.immediateResultMatchers = options.immediateResultMatchers || []\r\n this.parallelToolCalls = options.parallelToolCalls ?? true // 默认并行执行\r\n this.enableThinkingPhase = options.enableThinkingPhase ?? true // 默认开启,提高准确性\r\n this.thinkingPhasePrompt = options.thinkingPhasePrompt || DEFAULT_THINKING_PHASE_PROMPT\r\n }\r\n\r\n /**\r\n * 生成工具描述文本(用于思考阶段)\r\n */\r\n private generateToolsDescription(tools: MCPTool[]): string {\r\n if (tools.length === 0) {\r\n return '当前没有可用的工具。'\r\n }\r\n\r\n let description = ''\r\n for (const tool of tools) {\r\n description += `### ${tool.name}\\n`\r\n description += `描述: ${tool.description}\\n`\r\n if (tool.inputSchema.properties) {\r\n description += `参数:\\n`\r\n for (const [key, prop] of Object.entries(tool.inputSchema.properties)) {\r\n const propInfo = prop as { type?: string; description?: string }\r\n const required = tool.inputSchema.required?.includes(key) ? '必填' : '可选'\r\n description += ` - ${key} (${propInfo.type || 'any'}, ${required}): ${propInfo.description || ''}\\n`\r\n }\r\n }\r\n description += '\\n'\r\n }\r\n return description\r\n }\r\n\r\n\r\n /**\r\n * 检查工具返回结果是否匹配即时结果匹配器\r\n * @param result 工具返回的结果\r\n * @returns 如果匹配返回 true,否则返回 false\r\n */\r\n private matchImmediateResult(result: unknown): boolean {\r\n if (!this.immediateResultMatchers.length) {\r\n return false\r\n }\r\n\r\n let resultObj: Record<string, unknown> | null = null\r\n\r\n // 如果是字符串,尝试解析为 JSON 对象\r\n if (typeof result === 'string') {\r\n try {\r\n const parsed = JSON.parse(result)\r\n if (typeof parsed === 'object' && parsed !== null) {\r\n resultObj = parsed\r\n }\r\n } catch {\r\n // 不是有效 JSON,忽略\r\n }\r\n } else if (typeof result === 'object' && result !== null) {\r\n resultObj = result as Record<string, unknown>\r\n }\r\n\r\n if (!resultObj) {\r\n return false\r\n }\r\n\r\n // 检查是否匹配任意一个匹配器\r\n for (const matcher of this.immediateResultMatchers) {\r\n let matched = true\r\n for (const [key, value] of Object.entries(matcher)) {\r\n if (resultObj[key] !== value) {\r\n matched = false\r\n break\r\n }\r\n }\r\n if (matched) {\r\n return true\r\n }\r\n }\r\n\r\n return false\r\n }\r\n\r\n /**\r\n * 将 MCP 工具转换为 Vercel AI SDK 格式\r\n */\r\n private convertMCPToolsToAITools(mcpTools: MCPTool[]): Record<string, CoreTool> {\r\n const tools: Record<string, CoreTool> = {}\r\n\r\n for (const mcpTool of mcpTools) {\r\n // 将 JSON Schema 转换为 Zod Schema\r\n const zodSchema = this.jsonSchemaToZod(mcpTool.inputSchema)\r\n\r\n tools[mcpTool.name] = {\r\n description: mcpTool.description,\r\n parameters: zodSchema,\r\n }\r\n }\r\n\r\n return tools\r\n }\r\n\r\n /**\r\n * JSON Schema 到 Zod 的完整递归转换\r\n * 支持嵌套对象、对象数组、枚举等所有常见类型\r\n */\r\n private jsonSchemaToZod(schema: MCPTool['inputSchema']): z.ZodType {\r\n return this.convertSchemaToZod(schema, schema.required || [])\r\n }\r\n\r\n /**\r\n * 递归转换 JSON Schema 节点为 Zod 类型\r\n */\r\n private convertSchemaToZod(\r\n schema: Record<string, unknown>,\r\n parentRequired: string[] = [],\r\n key?: string\r\n ): z.ZodType {\r\n const type = schema.type as string | undefined\r\n const description = schema.description as string | undefined\r\n const enumValues = schema.enum as unknown[] | undefined\r\n\r\n let zodType: z.ZodType\r\n\r\n // 处理枚举类型\r\n if (enumValues && enumValues.length > 0) {\r\n if (enumValues.every((v) => typeof v === 'string')) {\r\n zodType = z.enum(enumValues as [string, ...string[]])\r\n } else if (enumValues.every((v) => typeof v === 'number')) {\r\n // 数字枚举:用 union of literals\r\n const literals = enumValues.map((v) => z.literal(v as number))\r\n zodType = literals.length === 1 \r\n ? literals[0] \r\n : z.union([literals[0], literals[1], ...literals.slice(2)] as [z.ZodTypeAny, z.ZodTypeAny, ...z.ZodTypeAny[]])\r\n } else {\r\n // 混合枚举或其他类型:降级为 unknown\r\n zodType = z.unknown()\r\n }\r\n } else {\r\n switch (type) {\r\n case 'string':\r\n zodType = z.string()\r\n break\r\n\r\n case 'number':\r\n zodType = z.number()\r\n break\r\n\r\n case 'integer':\r\n zodType = z.number().int()\r\n break\r\n\r\n case 'boolean':\r\n zodType = z.boolean()\r\n break\r\n\r\n case 'null':\r\n zodType = z.null()\r\n break\r\n\r\n case 'object': {\r\n const properties = schema.properties as Record<string, Record<string, unknown>> | undefined\r\n const required = (schema.required as string[]) || []\r\n\r\n if (properties) {\r\n const shape: Record<string, z.ZodType> = {}\r\n for (const [propKey, propSchema] of Object.entries(properties)) {\r\n let propZod = this.convertSchemaToZod(propSchema, required, propKey)\r\n\r\n // 处理 optional\r\n if (!required.includes(propKey)) {\r\n propZod = propZod.optional()\r\n }\r\n\r\n shape[propKey] = propZod\r\n }\r\n zodType = z.object(shape)\r\n } else {\r\n // 没有 properties 定义的对象,允许任意键值\r\n zodType = z.record(z.unknown())\r\n }\r\n break\r\n }\r\n\r\n case 'array': {\r\n const items = schema.items as Record<string, unknown> | undefined\r\n if (items) {\r\n const itemsRequired = (items.required as string[]) || []\r\n zodType = z.array(this.convertSchemaToZod(items, itemsRequired))\r\n } else {\r\n zodType = z.array(z.unknown())\r\n }\r\n break\r\n }\r\n\r\n default:\r\n // 未知类型或没有类型定义\r\n zodType = z.unknown()\r\n }\r\n }\r\n\r\n // 添加描述\r\n if (description) {\r\n zodType = zodType.describe(description)\r\n }\r\n\r\n return zodType\r\n }\r\n\r\n /**\r\n * 执行对话\r\n */\r\n async chat(userMessage: string, callbacks?: ChatCallbacks): Promise<ChatResult> {\r\n const startTime = Date.now()\r\n const toolCallRecords: ChatResult['toolCalls'] = []\r\n let totalPromptTokens = 0\r\n let totalCompletionTokens = 0\r\n\r\n // 构建消息历史\r\n const messages: CoreMessage[] = [\r\n { role: 'system', content: this.systemPrompt },\r\n { role: 'user', content: userMessage },\r\n ]\r\n\r\n // 获取所有可用工具\r\n const mcpTools = this.mcpManager.getAllTools()\r\n const tools = this.convertMCPToolsToAITools(mcpTools)\r\n\r\n let iteration = 0\r\n let finalContent = ''\r\n\r\n while (iteration < this.maxIterations) {\r\n iteration++\r\n callbacks?.onIterationStart?.(iteration)\r\n\r\n // 调用 AI\r\n const response = await generateText({\r\n model: this.model,\r\n messages,\r\n tools: Object.keys(tools).length > 0 ? tools : undefined,\r\n maxSteps: 1, // 每次只执行一步,方便我们控制流程\r\n })\r\n\r\n // 累计 token 使用\r\n if (response.usage) {\r\n totalPromptTokens += response.usage.promptTokens\r\n totalCompletionTokens += response.usage.completionTokens\r\n }\r\n\r\n // 检查是否有工具调用\r\n const toolCalls = response.toolCalls || []\r\n\r\n if (toolCalls.length === 0) {\r\n // 没有工具调用,说明 AI 完成了任务\r\n finalContent = response.text || ''\r\n callbacks?.onTextDelta?.(finalContent)\r\n callbacks?.onIterationEnd?.(iteration)\r\n break\r\n }\r\n\r\n // 有工具调用,处理它们\r\n const toolResults: ToolResult[] = []\r\n\r\n for (const toolCall of toolCalls) {\r\n const toolName = toolCall.toolName\r\n const toolArgs = toolCall.args as Record<string, unknown>\r\n const toolCallId = toolCall.toolCallId\r\n\r\n callbacks?.onToolCallStart?.(toolName, toolArgs)\r\n\r\n const toolStartTime = Date.now()\r\n let result: unknown\r\n let isError = false\r\n\r\n try {\r\n result = await this.mcpManager.callTool(toolName, toolArgs)\r\n } catch (error) {\r\n result = error instanceof Error ? error.message : String(error)\r\n isError = true\r\n }\r\n\r\n const duration = Date.now() - toolStartTime\r\n\r\n callbacks?.onToolResult?.(toolName, result, duration)\r\n\r\n toolResults.push({\r\n toolCallId,\r\n toolName,\r\n result,\r\n isError,\r\n duration,\r\n })\r\n\r\n toolCallRecords.push({\r\n name: toolName,\r\n arguments: toolArgs,\r\n result,\r\n duration,\r\n })\r\n }\r\n\r\n // 将 AI 的回复和工具调用添加到消息历史\r\n messages.push({\r\n role: 'assistant' as const,\r\n content: [\r\n { type: 'text' as const, text: response.text || '' },\r\n ...toolCalls.map((tc) => ({\r\n type: 'tool-call' as const,\r\n toolCallId: tc.toolCallId,\r\n toolName: tc.toolName,\r\n args: tc.args as Record<string, unknown>,\r\n })),\r\n ],\r\n })\r\n\r\n // 将工具结果添加到消息历史\r\n for (const tr of toolResults) {\r\n messages.push({\r\n role: 'tool' as const,\r\n content: [\r\n {\r\n type: 'tool-result' as const,\r\n toolCallId: tr.toolCallId,\r\n toolName: tr.toolName,\r\n result: tr.result,\r\n },\r\n ],\r\n })\r\n }\r\n\r\n callbacks?.onIterationEnd?.(iteration)\r\n }\r\n\r\n const duration = Date.now() - startTime\r\n\r\n return {\r\n content: finalContent,\r\n toolCalls: toolCallRecords,\r\n messages: messages.map((m) => ({\r\n role: m.role as 'system' | 'user' | 'assistant' | 'tool',\r\n content: typeof m.content === 'string' ? m.content : JSON.stringify(m.content),\r\n })),\r\n usage: {\r\n promptTokens: totalPromptTokens,\r\n completionTokens: totalCompletionTokens,\r\n totalTokens: totalPromptTokens + totalCompletionTokens,\r\n },\r\n iterations: iteration,\r\n duration,\r\n }\r\n }\r\n\r\n /**\r\n * 流式对话 - 返回事件生成器\r\n * @param userMessage 用户消息\r\n * @param options 可选参数\r\n * @param options.allowedTools 允许使用的工具名称列表,为空或不传则使用所有工具\r\n * @param options.history 历史消息列表\r\n */\r\n async *chatStream(\r\n userMessage: string,\r\n options?: {\r\n allowedTools?: string[]\r\n history?: Array<{ role: 'user' | 'assistant'; content: string }>\r\n }\r\n ): AsyncGenerator<MCPLinkEvent> {\r\n const startTime = Date.now()\r\n const toolCallRecords: ChatResult['toolCalls'] = []\r\n\r\n // 构建消息历史\r\n const messages: CoreMessage[] = [{ role: 'system', content: this.systemPrompt }]\r\n\r\n // 添加历史消息\r\n if (options?.history && options.history.length > 0) {\r\n for (const msg of options.history) {\r\n messages.push({\r\n role: msg.role,\r\n content: msg.content,\r\n })\r\n }\r\n }\r\n\r\n // 添加当前用户消息\r\n messages.push({ role: 'user', content: userMessage })\r\n\r\n // 获取所有可用工具\r\n let mcpTools = this.mcpManager.getAllTools()\r\n\r\n // 如果指定了允许的工具列表,则进行过滤\r\n if (options?.allowedTools && options.allowedTools.length > 0) {\r\n mcpTools = mcpTools.filter((tool) => options.allowedTools!.includes(tool.name))\r\n }\r\n\r\n const tools = this.convertMCPToolsToAITools(mcpTools)\r\n const hasTools = Object.keys(tools).length > 0\r\n\r\n let iteration = 0\r\n\r\n while (iteration < this.maxIterations) {\r\n iteration++\r\n\r\n yield {\r\n type: MCPLinkEventType.ITERATION_START,\r\n timestamp: Date.now(),\r\n data: { iteration, maxIterations: this.maxIterations },\r\n }\r\n\r\n // ============ 思考阶段(如果启用)============\r\n if (this.enableThinkingPhase && hasTools) {\r\n yield {\r\n type: MCPLinkEventType.THINKING_START,\r\n timestamp: Date.now(),\r\n data: {},\r\n }\r\n\r\n // 构建思考阶段的消息(使用独立提示词,不混入用户的回复要求)\r\n const toolsDescription = this.generateToolsDescription(mcpTools)\r\n const thinkingMessages: CoreMessage[] = [\r\n { \r\n role: 'system', \r\n content: `${this.thinkingPhasePrompt}\\n\\n## 可用工具\\n${toolsDescription}` \r\n },\r\n ...messages.slice(1), // 跳过原来的 system 消息,使用历史消息\r\n ]\r\n\r\n // 思考阶段调用(不带工具,强制输出文本)\r\n const thinkingStream = streamText({\r\n model: this.model,\r\n messages: thinkingMessages,\r\n // 不传 tools,强制 AI 输出文本思考\r\n })\r\n\r\n let thinkingContent = ''\r\n for await (const chunk of thinkingStream.fullStream) {\r\n if (chunk.type === 'text-delta') {\r\n thinkingContent += chunk.textDelta\r\n yield {\r\n type: MCPLinkEventType.THINKING_DELTA,\r\n timestamp: Date.now(),\r\n data: { content: chunk.textDelta },\r\n }\r\n }\r\n }\r\n\r\n yield {\r\n type: MCPLinkEventType.THINKING_END,\r\n timestamp: Date.now(),\r\n data: {},\r\n }\r\n\r\n // 将思考结果添加到消息历史,帮助 AI 更好地执行\r\n if (thinkingContent) {\r\n messages.push({\r\n role: 'assistant',\r\n content: `[内部决策]\\n${thinkingContent}`,\r\n })\r\n }\r\n }\r\n\r\n // ============ 执行阶段 ============\r\n // 使用 streamText 进行流式调用\r\n const stream = streamText({\r\n model: this.model,\r\n messages,\r\n tools: hasTools ? tools : undefined,\r\n maxSteps: 1,\r\n })\r\n\r\n // 收集流式结果\r\n let fullText = ''\r\n let reasoningText = ''\r\n const toolCalls: Array<{\r\n toolCallId: string\r\n toolName: string\r\n args: Record<string, unknown>\r\n }> = []\r\n let currentToolCall: {\r\n toolCallId: string\r\n toolName: string\r\n argsText: string\r\n } | null = null\r\n let hasStartedText = false\r\n let hasStartedReasoning = false\r\n\r\n // 已发送 TOOL_CALL_START 的工具 ID 集合\r\n const sentToolCallStarts = new Set<string>()\r\n\r\n // 用于解析 <think> 标签的状态\r\n let thinkBuffer = ''\r\n let isInsideThinkTag = false\r\n let textBuffer = ''\r\n\r\n // 流式处理\r\n for await (const chunk of stream.fullStream) {\r\n switch (chunk.type) {\r\n case 'reasoning':\r\n // 流式输出思考过程(Claude 等模型支持)\r\n if (!hasStartedReasoning) {\r\n hasStartedReasoning = true\r\n yield {\r\n type: MCPLinkEventType.THINKING_START,\r\n timestamp: Date.now(),\r\n data: {},\r\n }\r\n }\r\n reasoningText += chunk.textDelta\r\n yield {\r\n type: MCPLinkEventType.THINKING_DELTA,\r\n timestamp: Date.now(),\r\n data: { content: chunk.textDelta },\r\n }\r\n break\r\n\r\n case 'text-delta':\r\n // 流式输出文本 - 解析 <think> 标签\r\n const delta = chunk.textDelta\r\n textBuffer += delta\r\n\r\n // 处理 <think> 标签的开始\r\n if (!isInsideThinkTag) {\r\n // 检查是否有 <think> 开始标签\r\n const thinkStartMatch = textBuffer.match(/<think>/i)\r\n if (thinkStartMatch) {\r\n // 发送标签之前的文本\r\n const beforeThink = textBuffer.substring(0, thinkStartMatch.index)\r\n if (beforeThink.trim()) {\r\n if (!hasStartedText) {\r\n hasStartedText = true\r\n yield {\r\n type: MCPLinkEventType.TEXT_START,\r\n timestamp: Date.now(),\r\n data: {},\r\n }\r\n }\r\n fullText += beforeThink\r\n yield {\r\n type: MCPLinkEventType.TEXT_DELTA,\r\n timestamp: Date.now(),\r\n data: { content: beforeThink },\r\n }\r\n }\r\n // 进入思考模式\r\n isInsideThinkTag = true\r\n if (!hasStartedReasoning) {\r\n hasStartedReasoning = true\r\n yield {\r\n type: MCPLinkEventType.THINKING_START,\r\n timestamp: Date.now(),\r\n data: {},\r\n }\r\n }\r\n textBuffer = textBuffer.substring(thinkStartMatch.index! + 7) // 跳过 <think>\r\n thinkBuffer = ''\r\n } else if (!textBuffer.includes('<')) {\r\n // 没有潜在的标签,直接输出\r\n if (hasStartedReasoning && !hasStartedText) {\r\n yield {\r\n type: MCPLinkEventType.THINKING_END,\r\n timestamp: Date.now(),\r\n data: {},\r\n }\r\n }\r\n if (!hasStartedText) {\r\n hasStartedText = true\r\n yield {\r\n type: MCPLinkEventType.TEXT_START,\r\n timestamp: Date.now(),\r\n data: {},\r\n }\r\n }\r\n fullText += textBuffer\r\n yield {\r\n type: MCPLinkEventType.TEXT_DELTA,\r\n timestamp: Date.now(),\r\n data: { content: textBuffer },\r\n }\r\n textBuffer = ''\r\n }\r\n // 如果包含 '<' 但不是完整标签,继续缓冲\r\n } else {\r\n // 在思考标签内,检查结束标签\r\n const thinkEndMatch = textBuffer.match(/<\\/think>/i)\r\n if (thinkEndMatch) {\r\n // 发送结束前的思考内容\r\n const thinkContent = textBuffer.substring(0, thinkEndMatch.index)\r\n if (thinkContent) {\r\n thinkBuffer += thinkContent\r\n reasoningText += thinkContent\r\n yield {\r\n type: MCPLinkEventType.THINKING_DELTA,\r\n timestamp: Date.now(),\r\n data: { content: thinkContent },\r\n }\r\n }\r\n // 结束思考\r\n yield {\r\n type: MCPLinkEventType.THINKING_END,\r\n timestamp: Date.now(),\r\n data: {},\r\n }\r\n isInsideThinkTag = false\r\n textBuffer = textBuffer.substring(thinkEndMatch.index! + 8) // 跳过 </think>\r\n } else if (!textBuffer.includes('<')) {\r\n // 没有潜在的结束标签,直接输出思考内容\r\n thinkBuffer += textBuffer\r\n reasoningText += textBuffer\r\n yield {\r\n type: MCPLinkEventType.THINKING_DELTA,\r\n timestamp: Date.now(),\r\n data: { content: textBuffer },\r\n }\r\n textBuffer = ''\r\n }\r\n // 如果包含 '<' 但不是完整标签,继续缓冲\r\n }\r\n break\r\n\r\n case 'tool-call':\r\n // 非流式工具调用(大多数模型使用这种方式)\r\n // 直接发送完整的工具调用信息\r\n if (!sentToolCallStarts.has(chunk.toolCallId)) {\r\n yield {\r\n type: MCPLinkEventType.TOOL_CALL_START,\r\n timestamp: Date.now(),\r\n data: {\r\n toolName: chunk.toolName,\r\n toolCallId: chunk.toolCallId,\r\n toolArgs: chunk.args as Record<string, unknown>,\r\n },\r\n }\r\n sentToolCallStarts.add(chunk.toolCallId)\r\n // 只在首次收到时添加到工具调用列表,避免重复执行\r\n toolCalls.push({\r\n toolCallId: chunk.toolCallId,\r\n toolName: chunk.toolName,\r\n args: chunk.args as Record<string, unknown>,\r\n })\r\n }\r\n break\r\n\r\n case 'tool-call-streaming-start':\r\n // 流式工具调用开始(部分模型支持)\r\n currentToolCall = {\r\n toolCallId: chunk.toolCallId,\r\n toolName: chunk.toolName,\r\n argsText: '',\r\n }\r\n if (!sentToolCallStarts.has(chunk.toolCallId)) {\r\n yield {\r\n type: MCPLinkEventType.TOOL_CALL_START,\r\n timestamp: Date.now(),\r\n data: {\r\n toolName: chunk.toolName,\r\n toolCallId: chunk.toolCallId,\r\n },\r\n }\r\n sentToolCallStarts.add(chunk.toolCallId)\r\n }\r\n break\r\n\r\n case 'tool-call-delta':\r\n // 流式工具参数\r\n if (currentToolCall) {\r\n currentToolCall.argsText += chunk.argsTextDelta\r\n yield {\r\n type: MCPLinkEventType.TOOL_CALL_DELTA,\r\n timestamp: Date.now(),\r\n data: {\r\n toolCallId: currentToolCall.toolCallId,\r\n argsTextDelta: chunk.argsTextDelta,\r\n },\r\n }\r\n }\r\n break\r\n\r\n case 'finish':\r\n // 本轮生成结束\r\n // 处理剩余的缓冲内容\r\n if (textBuffer) {\r\n if (isInsideThinkTag) {\r\n // 仍在思考标签内,输出剩余内容作为思考\r\n reasoningText += textBuffer\r\n yield {\r\n type: MCPLinkEventType.THINKING_DELTA,\r\n timestamp: Date.now(),\r\n data: { content: textBuffer },\r\n }\r\n } else {\r\n // 输出剩余文本\r\n if (!hasStartedText) {\r\n hasStartedText = true\r\n yield {\r\n type: MCPLinkEventType.TEXT_START,\r\n timestamp: Date.now(),\r\n data: {},\r\n }\r\n }\r\n fullText += textBuffer\r\n yield {\r\n type: MCPLinkEventType.TEXT_DELTA,\r\n timestamp: Date.now(),\r\n data: { content: textBuffer },\r\n }\r\n }\r\n textBuffer = ''\r\n }\r\n // 如果有思考过程但还没结束,先结束它\r\n if (isInsideThinkTag || (hasStartedReasoning && !hasStartedText)) {\r\n yield {\r\n type: MCPLinkEventType.THINKING_END,\r\n timestamp: Date.now(),\r\n data: {},\r\n }\r\n isInsideThinkTag = false\r\n }\r\n if (hasStartedText) {\r\n yield {\r\n type: MCPLinkEventType.TEXT_END,\r\n timestamp: Date.now(),\r\n data: {},\r\n }\r\n }\r\n break\r\n\r\n case 'error':\r\n yield {\r\n type: MCPLinkEventType.ERROR,\r\n timestamp: Date.now(),\r\n data: { error: chunk.error as Error },\r\n }\r\n break\r\n }\r\n }\r\n\r\n // 检查是否有工具调用\r\n if (toolCalls.length === 0) {\r\n // 没有工具调用,结束迭代\r\n yield {\r\n type: MCPLinkEventType.ITERATION_END,\r\n timestamp: Date.now(),\r\n data: { iteration },\r\n }\r\n break\r\n }\r\n\r\n // 如果有思考文本,标记为思考过程\r\n if (fullText) {\r\n yield {\r\n type: MCPLinkEventType.THINKING_CONTENT,\r\n timestamp: Date.now(),\r\n data: { content: fullText },\r\n }\r\n }\r\n\r\n // 执行工具调用\r\n const toolResults: ToolResult[] = []\r\n\r\n // 先发送所有工具的执行中状态\r\n for (const toolCall of toolCalls) {\r\n yield {\r\n type: MCPLinkEventType.TOOL_EXECUTING,\r\n timestamp: Date.now(),\r\n data: { \r\n toolName: toolCall.toolName, \r\n toolCallId: toolCall.toolCallId, \r\n toolArgs: toolCall.args \r\n },\r\n }\r\n }\r\n\r\n // 是否匹配到即时结果(匹配后直接结束,无需 AI 继续处理)\r\n let hasImmediateResult = false\r\n\r\n // 根据配置决定是并行还是串行执行\r\n if (this.parallelToolCalls && toolCalls.length > 1) {\r\n // 并行执行所有工具\r\n const executePromises = toolCalls.map(async (toolCall) => {\r\n const toolStartTime = Date.now()\r\n let result: unknown\r\n let isError = false\r\n\r\n try {\r\n result = await this.mcpManager.callTool(toolCall.toolName, toolCall.args)\r\n } catch (error) {\r\n result = error instanceof Error ? error.message : String(error)\r\n isError = true\r\n }\r\n\r\n const duration = Date.now() - toolStartTime\r\n return {\r\n toolCallId: toolCall.toolCallId,\r\n toolName: toolCall.toolName,\r\n args: toolCall.args,\r\n result,\r\n isError,\r\n duration,\r\n }\r\n })\r\n\r\n const results = await Promise.all(executePromises)\r\n\r\n // 按顺序发送结果事件\r\n for (const r of results) {\r\n yield {\r\n type: MCPLinkEventType.TOOL_RESULT,\r\n timestamp: Date.now(),\r\n data: {\r\n toolName: r.toolName,\r\n toolResult: r.result,\r\n toolCallId: r.toolCallId,\r\n duration: r.duration,\r\n isError: r.isError,\r\n },\r\n }\r\n\r\n // 检查是否匹配即时结果\r\n if (!r.isError && this.matchImmediateResult(r.result)) {\r\n hasImmediateResult = true\r\n yield {\r\n type: MCPLinkEventType.IMMEDIATE_RESULT,\r\n timestamp: Date.now(),\r\n data: {\r\n toolName: r.toolName,\r\n toolCallId: r.toolCallId,\r\n immediateResult: r.result,\r\n },\r\n }\r\n }\r\n\r\n toolResults.push({\r\n toolCallId: r.toolCallId,\r\n toolName: r.toolName,\r\n result: r.result,\r\n isError: r.isError,\r\n duration: r.duration,\r\n })\r\n\r\n toolCallRecords.push({\r\n name: r.toolName,\r\n arguments: r.args,\r\n result: r.result,\r\n duration: r.duration,\r\n })\r\n }\r\n } else {\r\n // 串行执行工具\r\n for (const toolCall of toolCalls) {\r\n const toolName = toolCall.toolName\r\n const toolArgs = toolCall.args\r\n const toolCallId = toolCall.toolCallId\r\n\r\n const toolStartTime = Date.now()\r\n let result: unknown\r\n let isError = false\r\n\r\n try {\r\n result = await this.mcpManager.callTool(toolName, toolArgs)\r\n } catch (error) {\r\n result = error instanceof Error ? error.message : String(error)\r\n isError = true\r\n }\r\n\r\n const duration = Date.now() - toolStartTime\r\n\r\n yield {\r\n type: MCPLinkEventType.TOOL_RESULT,\r\n timestamp: Date.now(),\r\n data: {\r\n toolName,\r\n toolResult: result,\r\n toolCallId,\r\n duration,\r\n isError,\r\n },\r\n }\r\n\r\n // 检查是否匹配即时结果\r\n if (!isError && this.matchImmediateResult(result)) {\r\n hasImmediateResult = true\r\n yield {\r\n type: MCPLinkEventType.IMMEDIATE_RESULT,\r\n timestamp: Date.now(),\r\n data: {\r\n toolName,\r\n toolCallId,\r\n immediateResult: result,\r\n },\r\n }\r\n }\r\n\r\n toolResults.push({\r\n toolCallId,\r\n toolName,\r\n result,\r\n isError,\r\n duration,\r\n })\r\n\r\n toolCallRecords.push({\r\n name: toolName,\r\n arguments: toolArgs,\r\n result,\r\n duration,\r\n })\r\n }\r\n }\r\n\r\n // 如果匹配到即时结果,直接结束迭代(无需 AI 继续思考处理)\r\n if (hasImmediateResult) {\r\n yield {\r\n type: MCPLinkEventType.ITERATION_END,\r\n timestamp: Date.now(),\r\n data: { iteration },\r\n }\r\n break\r\n }\r\n\r\n // 更新消息历史\r\n messages.push({\r\n role: 'assistant' as const,\r\n content: [\r\n ...(fullText ? [{ type: 'text' as const, text: fullText }] : []),\r\n ...toolCalls.map((tc) => ({\r\n type: 'tool-call' as const,\r\n toolCallId: tc.toolCallId,\r\n toolName: tc.toolName,\r\n args: tc.args,\r\n })),\r\n ],\r\n })\r\n\r\n for (const tr of toolResults) {\r\n messages.push({\r\n role: 'tool' as const,\r\n content: [\r\n {\r\n type: 'tool-result' as const,\r\n toolCallId: tr.toolCallId,\r\n toolName: tr.toolName,\r\n result: tr.result,\r\n },\r\n ],\r\n })\r\n }\r\n\r\n yield {\r\n type: MCPLinkEventType.ITERATION_END,\r\n timestamp: Date.now(),\r\n data: { iteration },\r\n }\r\n }\r\n\r\n const totalDuration = Date.now() - startTime\r\n\r\n yield {\r\n type: MCPLinkEventType.COMPLETE,\r\n timestamp: Date.now(),\r\n data: {\r\n totalIterations: iteration,\r\n totalDuration,\r\n },\r\n }\r\n }\r\n}\r\n","import { streamText, type LanguageModel, type CoreMessage } from 'ai'\r\nimport type { MCPManager } from './MCPManager.js'\r\nimport { MCPLinkEventType, type MCPTool, type MCPLinkEvent, type ImmediateResultMatcher } from './types.js'\r\n\r\n/**\r\n * 基于 Prompt 的 Agent\r\n * 通过 prompt 工程让任意模型支持工具调用和思考过程\r\n * \r\n * 设计原则:\r\n * 1. 简洁 - 不做过多干预,让 AI 自己思考和决策\r\n * 2. 通用 - 支持任何模型,不依赖特定 API\r\n * 3. 可靠 - 稳定的状态机解析\r\n */\r\nexport class PromptBasedAgent {\r\n private model: LanguageModel\r\n private mcpManager: MCPManager\r\n private systemPrompt: string\r\n private maxIterations: number\r\n private immediateResultMatchers: ImmediateResultMatcher[]\r\n private parallelToolCalls: boolean\r\n // PromptBasedAgent 本身通过 prompt 实现思考,此配置保留以保持接口一致\r\n private enableThinkingPhase: boolean\r\n\r\n constructor(\r\n model: LanguageModel,\r\n mcpManager: MCPManager,\r\n options: {\r\n systemPrompt?: string\r\n maxIterations?: number\r\n immediateResultMatchers?: ImmediateResultMatcher[]\r\n parallelToolCalls?: boolean\r\n enableThinkingPhase?: boolean\r\n } = {}\r\n ) {\r\n this.model = model\r\n this.mcpManager = mcpManager\r\n this.systemPrompt = options.systemPrompt || ''\r\n this.maxIterations = options.maxIterations || 10\r\n this.immediateResultMatchers = options.immediateResultMatchers || []\r\n // PromptBasedAgent 每次只解析一个工具调用,此配置保留以保持接口一致\r\n this.parallelToolCalls = options.parallelToolCalls ?? true\r\n // PromptBasedAgent 本身就通过 prompt 实现思考,无需额外阶段\r\n this.enableThinkingPhase = options.enableThinkingPhase ?? false\r\n }\r\n\r\n /**\r\n * 检查工具返回结果是否匹配即时结果匹配器\r\n * @param result 工具返回的结果\r\n * @returns 如果匹配返回 true,否则返回 false\r\n */\r\n private matchImmediateResult(result: unknown): boolean {\r\n if (!this.immediateResultMatchers.length) {\r\n return false\r\n }\r\n\r\n let resultObj: Record<string, unknown> | null = null\r\n\r\n // 如果是字符串,尝试解析为 JSON 对象\r\n if (typeof result === 'string') {\r\n try {\r\n const parsed = JSON.parse(result)\r\n if (typeof parsed === 'object' && parsed !== null) {\r\n resultObj = parsed\r\n }\r\n } catch {\r\n // 不是有效 JSON,忽略\r\n }\r\n } else if (typeof result === 'object' && result !== null) {\r\n resultObj = result as Record<string, unknown>\r\n }\r\n\r\n if (!resultObj) {\r\n return false\r\n }\r\n\r\n // 检查是否匹配任意一个匹配器\r\n for (const matcher of this.immediateResultMatchers) {\r\n let matched = true\r\n for (const [key, value] of Object.entries(matcher)) {\r\n if (resultObj[key] !== value) {\r\n matched = false\r\n break\r\n }\r\n }\r\n if (matched) {\r\n return true\r\n }\r\n }\r\n\r\n return false\r\n }\r\n\r\n /**\r\n * 生成工具列表描述\r\n */\r\n private generateToolsDescription(tools: MCPTool[]): string {\r\n if (tools.length === 0) {\r\n return '当前没有可用的工具。'\r\n }\r\n\r\n let description = ''\r\n for (const tool of tools) {\r\n description += `### ${tool.name}\\n`\r\n description += `描述: ${tool.description}\\n`\r\n description += `参数: ${JSON.stringify(tool.inputSchema, null, 2)}\\n\\n`\r\n }\r\n return description\r\n }\r\n\r\n /**\r\n * 内置系统提示词 - 强调格式约束\r\n */\r\n private readonly BUILT_IN_PROMPT = `\r\n## 工具调用格式(必须严格遵守)\r\n\r\n当你需要获取数据或执行操作时,**只能**使用以下格式:\r\n\r\n<tool_call>\r\n{\"name\": \"工具名称\", \"arguments\": {\"参数名\": \"值\"}}\r\n</tool_call>\r\n\r\n### 工作流程\r\n1. 分析用户需求\r\n2. 如需数据,输出 <tool_call>...</tool_call> 后**立即停止**\r\n3. 系统会执行工具并返回真实结果\r\n4. 收到结果后,用中文整理回复用户\r\n\r\n### 严格禁止\r\n- ❌ 自己编写工具返回结果(如 \\`结果:{...}\\` 或 \\`{\"code\":200...}\\`)\r\n- ❌ 模拟工具调用(如 \\`RPCCall:\\`、\\`FunctionCall:\\`)\r\n- ❌ 在没有真实工具结果的情况下编造数据\r\n- ❌ 一次输出中同时包含工具调用和最终回复\r\n\r\n### 正确示例\r\n用户: \"查询我的订单\"\r\n你的输出:\r\n<tool_call>\r\n{\"name\": \"get_orders\", \"arguments\": {\"token\": \"xxx\"}}\r\n</tool_call>\r\n\r\n(然后停止,等待系统返回真实结果)\r\n\r\n### 回复格式\r\n- 使用中文\r\n- 使用 Markdown 格式美化输出\r\n- 列表数据每项独占一行\r\n`\r\n\r\n /**\r\n * 构建完整的系统提示词\r\n */\r\n private buildSystemPrompt(tools: MCPTool[]): string {\r\n const toolsDescription = this.generateToolsDescription(tools)\r\n const userPrompt = this.systemPrompt || '你是一个智能助手。'\r\n\r\n return `${userPrompt}\r\n\r\n## 可用工具\r\n${toolsDescription}\r\n${this.BUILT_IN_PROMPT}`\r\n }\r\n\r\n /**\r\n * 解析工具调用\r\n */\r\n private parseToolCall(text: string): { name: string; arguments: Record<string, unknown> } | null {\r\n // 方式1: <tool_call> 标签\r\n const tagMatch = text.match(/<tool_call>\\s*([\\s\\S]*?)\\s*<\\/tool_call>/i)\r\n if (tagMatch) {\r\n try {\r\n const json = JSON.parse(tagMatch[1].trim())\r\n if (json.name) return { name: json.name, arguments: json.arguments || {} }\r\n } catch { /* ignore */ }\r\n }\r\n\r\n // 方式2: ```json 代码块\r\n const codeMatch = text.match(/```(?:json)?\\s*\\n?\\s*(\\{[\\s\\S]*?\"name\"[\\s\\S]*?\\})\\s*\\n?\\s*```/i)\r\n if (codeMatch) {\r\n try {\r\n const json = JSON.parse(codeMatch[1].trim())\r\n if (json.name) return { name: json.name, arguments: json.arguments || {} }\r\n } catch { /* ignore */ }\r\n }\r\n\r\n // 方式3: 裸 JSON\r\n const jsonMatch = text.match(/\\{\\s*\"name\"\\s*:\\s*\"([^\"]+)\"[\\s\\S]*?\"arguments\"\\s*:\\s*(\\{[\\s\\S]*?\\})\\s*\\}/i)\r\n if (jsonMatch) {\r\n try {\r\n const fullMatch = jsonMatch[0]\r\n const json = JSON.parse(fullMatch)\r\n if (json.name) return { name: json.name, arguments: json.arguments || {} }\r\n } catch { /* ignore */ }\r\n }\r\n\r\n return null\r\n }\r\n\r\n /**\r\n * 智能压缩历史消息\r\n * - 用户消息完整保留\r\n * - AI 回复保留关键信息(ID、名称、数量、价格等)\r\n * - 去除冗长的 JSON 原始数据\r\n */\r\n private compressHistory(history: Array<{ role: 'user' | 'assistant'; content: string }>): Array<{ role: 'user' | 'assistant'; content: string }> {\r\n const MAX_HISTORY_LENGTH = 20 // 最多保留 20 条历史消息\r\n const MAX_USER_MESSAGE_LENGTH = 500 // 用户消息最大长度\r\n const MAX_ASSISTANT_MESSAGE_LENGTH = 1500 // AI 回复最大长度\r\n\r\n // 只保留最近的消息\r\n const recentHistory = history.slice(-MAX_HISTORY_LENGTH)\r\n\r\n return recentHistory.map((msg) => {\r\n if (msg.role === 'user') {\r\n // 用户消息:保持完整(通常较短)\r\n if (msg.content.length <= MAX_USER_MESSAGE_LENGTH) {\r\n return msg\r\n }\r\n return {\r\n role: msg.role,\r\n content: msg.content.slice(0, MAX_USER_MESSAGE_LENGTH) + '...'\r\n }\r\n }\r\n\r\n // AI 回复:智能压缩\r\n let content = msg.content\r\n\r\n // 1. 移除大段的 JSON 代码块,但保留摘要\r\n content = content.replace(/```json\\n[\\s\\S]*?\\n```/g, '[工具返回数据]')\r\n \r\n // 2. 移除工具返回的原始数据标记\r\n content = content.replace(/## .*?\\(原始JSON\\)[\\s\\S]*?(?=##|$)/g, '')\r\n \r\n // 3. 保留表格(通常是整理后的关键信息)\r\n // 表格不压缩\r\n\r\n // 4. 如果仍然过长,截断\r\n if (content.length > MAX_ASSISTANT_MESSAGE_LENGTH) {\r\n // 尝试保留表格部分\r\n const tableMatch = content.match(/\\|[\\s\\S]*?\\|/g)\r\n if (tableMatch) {\r\n const tables = tableMatch.join('\\n')\r\n if (tables.length < MAX_ASSISTANT_MESSAGE_LENGTH) {\r\n content = content.slice(0, MAX_ASSISTANT_MESSAGE_LENGTH - tables.length) + '\\n' + tables\r\n }\r\n }\r\n content = content.slice(0, MAX_ASSISTANT_MESSAGE_LENGTH) + '...'\r\n }\r\n\r\n return { role: msg.role, content: content.trim() || msg.content.slice(0, 500) }\r\n })\r\n }\r\n\r\n /**\r\n * 流式对话\r\n */\r\n async *chatStream(\r\n userMessage: string,\r\n options?: {\r\n allowedTools?: string[]\r\n history?: Array<{ role: 'user' | 'assistant'; content: string }>\r\n }\r\n ): AsyncGenerator<MCPLinkEvent> {\r\n const startTime = Date.now()\r\n\r\n // 获取工具\r\n let mcpTools = this.mcpManager.getAllTools()\r\n if (options?.allowedTools?.length) {\r\n mcpTools = mcpTools.filter((t) => options.allowedTools!.includes(t.name))\r\n }\r\n\r\n // 构建消息\r\n const messages: CoreMessage[] = [\r\n { role: 'system', content: this.buildSystemPrompt(mcpTools) }\r\n ]\r\n\r\n // 添加历史(压缩后)\r\n if (options?.history?.length) {\r\n const compressedHistory = this.compressHistory(options.history)\r\n console.log(`[PromptBasedAgent] 📚 历史消息: ${options.history.length} 条 -> 压缩后: ${compressedHistory.length} 条`)\r\n for (const msg of compressedHistory) {\r\n messages.push({ role: msg.role, content: msg.content })\r\n }\r\n }\r\n\r\n // 添加当前消息\r\n messages.push({ role: 'user', content: userMessage })\r\n console.log(`[PromptBasedAgent] 📝 用户消息: \"${userMessage.slice(0, 50)}${userMessage.length > 50 ? '...' : ''}\"`)\r\n console.log(`[PromptBasedAgent] 📊 总消息数: ${messages.length}`)\r\n\r\n let iteration = 0\r\n\r\n while (iteration < this.maxIterations) {\r\n iteration++\r\n\r\n yield {\r\n type: MCPLinkEventType.ITERATION_START,\r\n timestamp: Date.now(),\r\n data: { iteration, maxIterations: this.maxIterations },\r\n }\r\n\r\n // 调用模型(带超时控制)\r\n console.log(`[PromptBasedAgent] 🤖 调用模型,迭代 ${iteration}/${this.maxIterations}...`)\r\n const modelStartTime = Date.now()\r\n \r\n const stream = streamText({ \r\n model: this.model, \r\n messages,\r\n // 设置请求超时\r\n experimental_telemetry: {\r\n isEnabled: false, // 禁用遥测以减少开销\r\n },\r\n })\r\n\r\n // 状态\r\n let fullResponse = ''\r\n let buffer = ''\r\n let inThinking = false\r\n let inToolCall = false\r\n let thinkingStarted = false\r\n let thinkingEnded = false\r\n let textStarted = false\r\n\r\n // 流式处理(带超时保护)\r\n let firstChunkReceived = false\r\n const FIRST_CHUNK_TIMEOUT = 120000 // 2分钟等待首个响应\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null\r\n \r\n // 设置超时\r\n const timeoutPromise = new Promise<never>((_, reject) => {\r\n timeoutId = setTimeout(() => {\r\n reject(new Error(`模型响应超时 (${FIRST_CHUNK_TIMEOUT / 1000}秒无响应)`))\r\n }, FIRST_CHUNK_TIMEOUT)\r\n })\r\n\r\n try {\r\n for await (const chunk of stream.fullStream) {\r\n // 收到第一个 chunk 后取消超时\r\n if (!firstChunkReceived) {\r\n firstChunkReceived = true\r\n if (timeoutId) {\r\n clearTimeout(timeoutId)\r\n timeoutId = null\r\n }\r\n console.log(`[PromptBasedAgent] ⚡ 首个 chunk 到达,耗时: ${Date.now() - modelStartTime}ms`)\r\n }\r\n // 原生 reasoning 支持\r\n if (chunk.type === 'reasoning') {\r\n if (!thinkingStarted) {\r\n thinkingStarted = true\r\n yield { type: MCPLinkEventType.THINKING_START, timestamp: Date.now(), data: {} }\r\n }\r\n if (chunk.textDelta) {\r\n yield { type: MCPLinkEventType.THINKING_DELTA, timestamp: Date.now(), data: { content: chunk.textDelta } }\r\n }\r\n continue\r\n }\r\n\r\n if (chunk.type === 'text-delta') {\r\n const delta = chunk.textDelta\r\n buffer += delta\r\n fullResponse += delta\r\n\r\n // 简单状态机解析\r\n while (buffer.length > 0) {\r\n if (!inThinking && !inToolCall) {\r\n // 检查 <think> 开始\r\n const thinkStart = buffer.indexOf('<think>')\r\n if (thinkStart !== -1) {\r\n // 输出 <think> 之前的文本\r\n if (thinkStart > 0) {\r\n const before = buffer.substring(0, thinkStart)\r\n if (before.trim() && thinkingEnded) {\r\n if (!textStarted) {\r\n textStarted = true\r\n yield { type: MCPLinkEventType.TEXT_START, timestamp: Date.now(), data: {} }\r\n }\r\n yield { type: MCPLinkEventType.TEXT_DELTA, timestamp: Date.now(), data: { content: before } }\r\n }\r\n }\r\n inThinking = true\r\n if (!thinkingStarted) {\r\n thinkingStarted = true\r\n yield { type: MCPLinkEventType.THINKING_START, timestamp: Date.now(), data: {} }\r\n }\r\n buffer = buffer.substring(thinkStart + 7)\r\n continue\r\n }\r\n\r\n // 检查 <tool_call> 开始\r\n const toolStart = buffer.indexOf('<tool_call>')\r\n if (toolStart !== -1) {\r\n if (toolStart > 0) {\r\n const before = buffer.substring(0, toolStart)\r\n if (before.trim() && thinkingEnded) {\r\n if (!textStarted) {\r\n textStarted = true\r\n yield { type: MCPLinkEventType.TEXT_START, timestamp: Date.now(), data: {} }\r\n }\r\n yield { type: MCPLinkEventType.TEXT_DELTA, timestamp: Date.now(), data: { content: before } }\r\n }\r\n }\r\n inToolCall = true\r\n buffer = buffer.substring(toolStart + 11)\r\n continue\r\n }\r\n\r\n // 没有特殊标签,检查是否可以安全输出\r\n if (!buffer.includes('<')) {\r\n if (buffer.trim() && (thinkingEnded || !thinkingStarted)) {\r\n // 如果没有思考过程,自动生成一个简短的\r\n if (!thinkingStarted && !thinkingEnded) {\r\n thinkingStarted = true\r\n thinkingEnded = true\r\n yield { type: MCPLinkEventType.THINKING_START, timestamp: Date.now(), data: {} }\r\n yield { type: MCPLinkEventType.THINKING_DELTA, timestamp: Date.now(), data: { content: '分析用户请求...' } }\r\n yield { type: MCPLinkEventType.THINKING_END, timestamp: Date.now(), data: {} }\r\n }\r\n if (!textStarted) {\r\n textStarted = true\r\n yield { type: MCPLinkEventType.TEXT_START, timestamp: Date.now(), data: {} }\r\n }\r\n yield { type: MCPLinkEventType.TEXT_DELTA, timestamp: Date.now(), data: { content: buffer } }\r\n }\r\n buffer = ''\r\n }\r\n break\r\n }\r\n\r\n if (inThinking) {\r\n const thinkEnd = buffer.indexOf('</think>')\r\n if (thinkEnd !== -1) {\r\n const content = buffer.substring(0, thinkEnd)\r\n if (content) {\r\n yield { type: MCPLinkEventType.THINKING_DELTA, timestamp: Date.now(), data: { content } }\r\n }\r\n yield { type: MCPLinkEventType.THINKING_END, timestamp: Date.now(), data: {} }\r\n thinkingEnded = true\r\n inThinking = false\r\n buffer = buffer.substring(thinkEnd + 8)\r\n continue\r\n }\r\n // 流式输出思考内容\r\n if (buffer.length > 10 && !buffer.includes('<')) {\r\n const safe = buffer.substring(0, buffer.length - 10)\r\n yield { type: MCPLinkEventType.THINKING_DELTA, timestamp: Date.now(), data: { content: safe } }\r\n buffer = buffer.substring(safe.length)\r\n }\r\n break\r\n }\r\n\r\n if (inToolCall) {\r\n const toolEnd = buffer.indexOf('</tool_call>')\r\n if (toolEnd !== -1) {\r\n inToolCall = false\r\n buffer = buffer.substring(toolEnd + 12)\r\n continue\r\n }\r\n break\r\n }\r\n\r\n break\r\n }\r\n }\r\n\r\n if (chunk.type === 'finish') {\r\n // 处理剩余内容\r\n if (buffer.trim()) {\r\n if (inThinking) {\r\n yield { type: MCPLinkEventType.THINKING_DELTA, timestamp: Date.now(), data: { content: buffer } }\r\n yield { type: MCPLinkEventType.THINKING_END, timestamp: Date.now(), data: {} }\r\n thinkingEnded = true\r\n } else if (!inToolCall) {\r\n if (!textStarted) {\r\n textStarted = true\r\n yield { type: MCPLinkEventType.TEXT_START, timestamp: Date.now(), data: {} }\r\n }\r\n yield { type: MCPLinkEventType.TEXT_DELTA, timestamp: Date.now(), data: { content: buffer } }\r\n }\r\n }\r\n if (textStarted) {\r\n yield { type: MCPLinkEventType.TEXT_END, timestamp: Date.now(), data: {} }\r\n }\r\n }\r\n }\r\n } finally {\r\n // 清理超时计时器\r\n if (timeoutId) {\r\n clearTimeout(timeoutId)\r\n }\r\n }\r\n\r\n // 检查工具调用\r\n const toolCall = this.parseToolCall(fullResponse)\r\n\r\n if (toolCall) {\r\n const toolCallId = `tool-${Date.now()}`\r\n\r\n // 发送工具调用事件\r\n yield {\r\n type: MCPLinkEventType.TOOL_CALL_START,\r\n timestamp: Date.now(),\r\n data: { toolName: toolCall.name, toolCallId, toolArgs: toolCall.arguments },\r\n }\r\n\r\n yield {\r\n type: MCPLinkEventType.TOOL_EXECUTING,\r\n timestamp: Date.now(),\r\n data: { toolName: toolCall.name, toolCallId, toolArgs: toolCall.arguments },\r\n }\r\n\r\n // 执行工具\r\n const toolStartTime = Date.now()\r\n let result: unknown\r\n let isError = false\r\n\r\n try {\r\n result = await this.mcpManager.callTool(toolCall.name, toolCall.arguments)\r\n } catch (error) {\r\n result = error instanceof Error ? error.message : String(error)\r\n isError = true\r\n }\r\n\r\n const duration = Date.now() - toolStartTime\r\n\r\n yield {\r\n type: MCPLinkEventType.TOOL_RESULT,\r\n timestamp: Date.now(),\r\n data: { toolName: toolCall.name, toolResult: result, toolCallId, duration, isError },\r\n }\r\n\r\n // 检查是否匹配即时结果,如果匹配则直接结束(无需 AI 继续思考处理)\r\n if (!isError && this.matchImmediateResult(result)) {\r\n yield {\r\n type: MCPLinkEventType.IMMEDIATE_RESULT,\r\n timestamp: Date.now(),\r\n data: {\r\n toolName: toolCall.name,\r\n toolCallId,\r\n immediateResult: result,\r\n },\r\n }\r\n // 直接结束迭代\r\n yield { type: MCPLinkEventType.ITERATION_END, timestamp: Date.now(), data: { iteration } }\r\n yield {\r\n type: MCPLinkEventType.COMPLETE,\r\n timestamp: Date.now(),\r\n data: { totalDuration: Date.now() - startTime, totalIterations: iteration },\r\n }\r\n return\r\n }\r\n\r\n // 更新消息历史\r\n messages.push({ role: 'assistant', content: fullResponse })\r\n\r\n const resultStr = typeof result === 'string' ? result : JSON.stringify(result, null, 2)\r\n messages.push({\r\n role: 'user',\r\n content: `工具 ${toolCall.name} 返回结果:\\n${resultStr}\\n\\n请根据结果用中文回复用户。`,\r\n })\r\n\r\n yield { type: MCPLinkEventType.ITERATION_END, timestamp: Date.now(), data: { iteration } }\r\n continue\r\n }\r\n\r\n console.log(`[PromptBasedAgent] ✅ 模型响应完成,耗时: ${Date.now() - modelStartTime}ms,响应长度: ${fullResponse.length}`)\r\n\r\n // 没有工具调用\r\n // 如果没有任何输出,尝试直接输出响应\r\n if (!textStarted && fullResponse.trim()) {\r\n // 清理标签后输出\r\n let cleanText = fullResponse\r\n .replace(/<think>[\\s\\S]*?<\\/think>/gi, '')\r\n .replace(/<tool_call>[\\s\\S]*?<\\/tool_call>/gi, '')\r\n .trim()\r\n\r\n if (cleanText) {\r\n yield { type: MCPLinkEventType.TEXT_START, timestamp: Date.now(), data: {} }\r\n yield { type: MCPLinkEventType.TEXT_DELTA, timestamp: Date.now(), data: { content: cleanText } }\r\n yield { type: MCPLinkEventType.TEXT_END, timestamp: Date.now(), data: {} }\r\n }\r\n }\r\n\r\n yield { type: MCPLinkEventType.ITERATION_END, timestamp: Date.now(), data: { iteration } }\r\n break\r\n }\r\n\r\n yield {\r\n type: MCPLinkEventType.COMPLETE,\r\n timestamp: Date.now(),\r\n data: { totalDuration: Date.now() - startTime, totalIterations: iteration },\r\n }\r\n }\r\n}\r\n","import type { LanguageModel } from 'ai'\r\nimport { MCPManager } from './MCPManager.js'\r\nimport { Agent } from './Agent.js'\r\nimport { PromptBasedAgent } from './PromptBasedAgent.js'\r\nimport type {\r\n MCPLinkConfig,\r\n MCPServerConfig,\r\n ChatCallbacks,\r\n ChatResult,\r\n MCPLinkEvent,\r\n MCPTool,\r\n MCPServerStatus,\r\n} from './types.js'\r\n\r\n/**\r\n * 支持原生 Function Calling(工具调用)的模型模式列表\r\n * 这些模型使用 Agent.ts(原生工具调用模式)\r\n * \r\n * 注意:某些\"思考模型\"(thinking models)虽然支持工具调用,\r\n * 但需要特殊的 API 处理(如 thought_signature),暂不支持\r\n */\r\nconst NATIVE_FUNCTION_CALLING_PATTERNS = [\r\n // OpenAI GPT 系列 - 支持原生 function calling\r\n /^gpt/i,\r\n // OpenAI o1/o3 需要特殊处理,暂用 PromptBased\r\n // /^o1/i,\r\n // /^o3/i,\r\n // Anthropic Claude - 支持原生 function calling\r\n /^claude/i,\r\n // Google Gemini 稳定版 - 支持原生 function calling\r\n // 注意:gemini-*-preview/thinking 版本需要特殊处理,不在此列表\r\n /^gemini-[\\d.]+-flash$/i,\r\n /^gemini-[\\d.]+-pro$/i,\r\n /^gemini-pro$/i,\r\n /^gemini-flash$/i,\r\n // Mistral - 支持原生 function calling\r\n /^mistral/i,\r\n /^mixtral/i,\r\n // Cohere Command-R - 支持原生 function calling\r\n /^command-r/i,\r\n]\r\n\r\n/**\r\n * 需要使用 Prompt-Based 方式的模型\r\n * 这些模型:\r\n * 1. 不支持原生 function calling\r\n * 2. 是\"思考模型\",需要特殊 API 处理(如 thought_signature)\r\n */\r\nconst PROMPT_BASED_PATTERNS = [\r\n // DeepSeek(不支持原生 function calling)\r\n /deepseek/i,\r\n // OpenAI o1/o3 思考模型\r\n /^o1/i,\r\n /^o3/i,\r\n // Gemini 思考/预览版本 - 需要 thought_signature,暂用 PromptBased\r\n /gemini.*preview/i,\r\n /gemini.*thinking/i,\r\n /gemini.*exp/i,\r\n // 开源模型(大多数不支持原生 function calling)\r\n /^llama/i,\r\n /^phi-/i,\r\n /^qwen/i,\r\n /^yi-/i,\r\n /^glm/i,\r\n /^baichuan/i,\r\n]\r\n\r\n/**\r\n * 检测模型是否支持原生 Function Calling\r\n * @param modelId 模型 ID\r\n * @returns true = 使用原生 Agent, false = 使用 PromptBasedAgent\r\n */\r\nfunction detectNativeToolSupport(modelId: string): boolean {\r\n console.log(`[MCPLink] 🔍 检测模型: \"${modelId}\"`)\r\n \r\n // 先检查是否明确需要 Prompt-Based(包括思考模型)\r\n for (const pattern of PROMPT_BASED_PATTERNS) {\r\n if (pattern.test(modelId)) {\r\n console.log(`[MCPLink] ✅ Model \"${modelId}\" -> PromptBasedAgent (matched: ${pattern})`)\r\n return false\r\n }\r\n }\r\n\r\n // 检查是否支持原生 function calling\r\n for (const pattern of NATIVE_FUNCTION_CALLING_PATTERNS) {\r\n if (pattern.test(modelId)) {\r\n console.log(`[MCPLink] ✅ Model \"${modelId}\" -> Agent (原生模式, matched: ${pattern})`)\r\n return true\r\n }\r\n }\r\n\r\n // 默认使用 Prompt-Based(更安全,兼容未知模型,提供思考过程)\r\n console.log(`[MCPLink] ⚠️ Model \"${modelId}\" -> PromptBasedAgent (未知模型,默认)`)\r\n return false\r\n}\r\n\r\n/**\r\n * MCPLink 主类\r\n * AI Agent 工具调用框架的入口\r\n */\r\nexport class MCPLink {\r\n private model: LanguageModel\r\n private mcpManager: MCPManager\r\n private agent: Agent\r\n private promptBasedAgent: PromptBasedAgent\r\n private config: MCPLinkConfig\r\n private initialized = false\r\n private detectedNativeSupport: boolean\r\n\r\n constructor(config: MCPLinkConfig) {\r\n this.config = config\r\n this.model = config.model\r\n this.mcpManager = new MCPManager()\r\n\r\n // 添加配置的 MCP 服务器\r\n if (config.mcpServers) {\r\n for (const [id, serverConfig] of Object.entries(config.mcpServers)) {\r\n this.mcpManager.addServer(id, serverConfig)\r\n }\r\n }\r\n\r\n // 创建 Agent\r\n this.agent = new Agent(this.model, this.mcpManager, {\r\n systemPrompt: config.systemPrompt,\r\n maxIterations: config.maxIterations,\r\n immediateResultMatchers: config.immediateResultMatchers,\r\n parallelToolCalls: config.parallelToolCalls,\r\n enableThinkingPhase: config.enableThinkingPhase,\r\n })\r\n\r\n // 创建 PromptBasedAgent\r\n this.promptBasedAgent = new PromptBasedAgent(this.model, this.mcpManager, {\r\n systemPrompt: config.systemPrompt,\r\n maxIterations: config.maxIterations,\r\n immediateResultMatchers: config.immediateResultMatchers,\r\n parallelToolCalls: config.parallelToolCalls,\r\n enableThinkingPhase: config.enableThinkingPhase,\r\n })\r\n\r\n // 自动检测模型是否支持原生工具调用\r\n // 如果用户强制指定了,则使用用户的设置\r\n if (config.usePromptBasedTools === true) {\r\n this.detectedNativeSupport = false\r\n } else if (config.usePromptBasedTools === false) {\r\n this.detectedNativeSupport = true\r\n } else {\r\n // 'auto' 或未指定:自动检测\r\n // 优先使用 modelName,其次使用 model.modelId\r\n const modelNameToCheck = config.modelName || config.model.modelId\r\n this.detectedNativeSupport = detectNativeToolSupport(modelNameToCheck)\r\n }\r\n }\r\n\r\n /**\r\n * 初始化 - 连接所有 MCP 服务器\r\n */\r\n async initialize(): Promise<void> {\r\n if (this.initialized) {\r\n return\r\n }\r\n\r\n await this.mcpManager.startAll()\r\n this.initialized = true\r\n }\r\n\r\n /**\r\n * 关闭 - 断开所有 MCP 服务器连接\r\n */\r\n async close(): Promise<void> {\r\n await this.mcpManager.stopAll()\r\n this.initialized = false\r\n }\r\n\r\n /**\r\n * 发起对话\r\n */\r\n async chat(message: string, callbacks?: ChatCallbacks): Promise<ChatResult> {\r\n if (!this.initialized) {\r\n await this.initialize()\r\n }\r\n\r\n return this.agent.chat(message, callbacks)\r\n }\r\n\r\n /**\r\n * 流式对话\r\n * @param message 用户消息\r\n * @param options 可选参数\r\n * @param options.allowedTools 允许使用的工具名称列表\r\n * @param options.history 历史消息列表\r\n */\r\n async *chatStream(\r\n message: string,\r\n options?: {\r\n allowedTools?: string[]\r\n history?: Array<{ role: 'user' | 'assistant'; content: string }>\r\n }\r\n ): AsyncGenerator<MCPLinkEvent> {\r\n if (!this.initialized) {\r\n await this.initialize()\r\n }\r\n\r\n // 根据检测结果选择 Agent\r\n if (this.detectedNativeSupport) {\r\n yield* this.agent.chatStream(message, options)\r\n } else {\r\n yield* this.promptBasedAgent.chatStream(message, options)\r\n }\r\n }\r\n\r\n /**\r\n * 获取当前使用的模式\r\n */\r\n getToolCallingMode(): 'native' | 'prompt-based' {\r\n return this.detectedNativeSupport ? 'native' : 'prompt-based'\r\n }\r\n\r\n // ============ MCP 服务器管理 ============\r\n\r\n /**\r\n * 添加 MCP 服务器\r\n */\r\n addMCPServer(id: string, config: MCPServerConfig): void {\r\n this.mcpManager.addServer(id, config)\r\n }\r\n\r\n /**\r\n * 移除 MCP 服务器\r\n */\r\n async removeMCPServer(id: string): Promise<void> {\r\n await this.mcpManager.removeServer(id)\r\n }\r\n\r\n /**\r\n * 启动指定 MCP 服务器\r\n */\r\n async startMCPServer(id: string): Promise<void> {\r\n await this.mcpManager.startServer(id)\r\n }\r\n\r\n /**\r\n * 停止指定 MCP 服务器\r\n */\r\n async stopMCPServer(id: string): Promise<void> {\r\n await this.mcpManager.stopServer(id)\r\n }\r\n\r\n /**\r\n * 获取所有 MCP 服务器状态\r\n */\r\n getMCPServerStatuses(): MCPServerStatus[] {\r\n return this.mcpManager.getServerStatuses()\r\n }\r\n\r\n /**\r\n * 获取所有可用工具\r\n */\r\n getTools(): MCPTool[] {\r\n return this.mcpManager.getAllTools()\r\n }\r\n\r\n /**\r\n * 手动调用工具\r\n */\r\n async callTool(toolName: string, args: Record<string, unknown>): Promise<unknown> {\r\n return this.mcpManager.callTool(toolName, args)\r\n }\r\n\r\n // ============ 配置管理 ============\r\n\r\n /**\r\n * 更新系统提示词\r\n */\r\n setSystemPrompt(prompt: string): void {\r\n this.config.systemPrompt = prompt\r\n // 重新创建 Agent\r\n this.agent = new Agent(this.model, this.mcpManager, {\r\n systemPrompt: prompt,\r\n maxIterations: this.config.maxIterations,\r\n immediateResultMatchers: this.config.immediateResultMatchers,\r\n parallelToolCalls: this.config.parallelToolCalls,\r\n enableThinkingPhase: this.config.enableThinkingPhase,\r\n })\r\n this.promptBasedAgent = new PromptBasedAgent(this.model, this.mcpManager, {\r\n systemPrompt: prompt,\r\n maxIterations: this.config.maxIterations,\r\n immediateResultMatchers: this.config.immediateResultMatchers,\r\n parallelToolCalls: this.config.parallelToolCalls,\r\n enableThinkingPhase: this.config.enableThinkingPhase,\r\n })\r\n }\r\n\r\n /**\r\n * 更新 AI 模型\r\n */\r\n setModel(model: LanguageModel): void {\r\n this.model = model\r\n this.config.model = model\r\n // 重新创建 Agent\r\n this.agent = new Agent(this.model, this.mcpManager, {\r\n systemPrompt: this.config.systemPrompt,\r\n maxIterations: this.config.maxIterations,\r\n immediateResultMatchers: this.config.immediateResultMatchers,\r\n parallelToolCalls: this.config.parallelToolCalls,\r\n enableThinkingPhase: this.config.enableThinkingPhase,\r\n })\r\n this.promptBasedAgent = new PromptBasedAgent(this.model, this.mcpManager, {\r\n systemPrompt: this.config.systemPrompt,\r\n maxIterations: this.config.maxIterations,\r\n immediateResultMatchers: this.config.immediateResultMatchers,\r\n parallelToolCalls: this.config.parallelToolCalls,\r\n enableThinkingPhase: this.config.enableThinkingPhase,\r\n })\r\n }\r\n}\r\n"]}
|