@huyooo/ai-chat-core 0.2.44 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapter/index.d.ts +11 -0
- package/dist/adapter/index.d.ts.map +1 -0
- package/dist/adapter/model-adapter.d.ts +25 -0
- package/dist/adapter/model-adapter.d.ts.map +1 -0
- package/dist/adapter/model-options.d.ts +53 -0
- package/dist/adapter/model-options.d.ts.map +1 -0
- package/dist/adapter/types.d.ts +28 -0
- package/dist/adapter/types.d.ts.map +1 -0
- package/dist/chat-runtime.d.ts +96 -0
- package/dist/chat-runtime.d.ts.map +1 -0
- package/dist/constants.d.ts +12 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/events.d.ts +605 -1
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +1 -1
- package/dist/extension/index.d.ts +9 -0
- package/dist/extension/index.d.ts.map +1 -0
- package/dist/extension/types.d.ts +46 -0
- package/dist/extension/types.d.ts.map +1 -0
- package/dist/families/index.d.ts +11 -0
- package/dist/families/index.d.ts.map +1 -0
- package/dist/families/presets.d.ts +31 -0
- package/dist/families/presets.d.ts.map +1 -0
- package/dist/families/resolver.d.ts +11 -0
- package/dist/families/resolver.d.ts.map +1 -0
- package/dist/families/types.d.ts +29 -0
- package/dist/families/types.d.ts.map +1 -0
- package/dist/governance/command-safety.d.ts +34 -0
- package/dist/governance/command-safety.d.ts.map +1 -0
- package/dist/governance/governance.d.ts +19 -0
- package/dist/governance/governance.d.ts.map +1 -0
- package/dist/governance/index.d.ts +12 -0
- package/dist/governance/index.d.ts.map +1 -0
- package/dist/governance/types.d.ts +29 -0
- package/dist/governance/types.d.ts.map +1 -0
- package/dist/index.d.ts +72 -804
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -1
- package/dist/internal/management-args.d.ts +13 -0
- package/dist/internal/management-args.d.ts.map +1 -0
- package/dist/internal/management-results.d.ts +21 -0
- package/dist/internal/management-results.d.ts.map +1 -0
- package/dist/llm-config.d.ts +108 -0
- package/dist/llm-config.d.ts.map +1 -0
- package/dist/logger/core.d.ts +31 -0
- package/dist/logger/core.d.ts.map +1 -0
- package/dist/logger/index.d.ts +9 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/orchestrator/compression-handler.d.ts +29 -0
- package/dist/orchestrator/compression-handler.d.ts.map +1 -0
- package/dist/orchestrator/context-compressor.d.ts +51 -0
- package/dist/orchestrator/context-compressor.d.ts.map +1 -0
- package/dist/orchestrator/context-summarizer.d.ts +41 -0
- package/dist/orchestrator/context-summarizer.d.ts.map +1 -0
- package/dist/orchestrator/index.d.ts +12 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/orchestrator.d.ts +46 -0
- package/dist/orchestrator/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator/types.d.ts +58 -0
- package/dist/orchestrator/types.d.ts.map +1 -0
- package/dist/parts/index.d.ts +13 -0
- package/dist/parts/index.d.ts.map +1 -0
- package/dist/parts/registry.d.ts +11 -0
- package/dist/parts/registry.d.ts.map +1 -0
- package/dist/parts/summaries.d.ts +9 -0
- package/dist/parts/summaries.d.ts.map +1 -0
- package/dist/parts/types.d.ts +61 -0
- package/dist/parts/types.d.ts.map +1 -0
- package/dist/platform.d.ts +17 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +1 -0
- package/dist/protocols/anthropic.d.ts +20 -0
- package/dist/protocols/anthropic.d.ts.map +1 -0
- package/dist/protocols/ark.d.ts +36 -0
- package/dist/protocols/ark.d.ts.map +1 -0
- package/dist/protocols/deepseek.d.ts +24 -0
- package/dist/protocols/deepseek.d.ts.map +1 -0
- package/dist/protocols/error-utils.d.ts +14 -0
- package/dist/protocols/error-utils.d.ts.map +1 -0
- package/dist/protocols/gemini.d.ts +24 -0
- package/dist/protocols/gemini.d.ts.map +1 -0
- package/dist/protocols/glm.d.ts +20 -0
- package/dist/protocols/glm.d.ts.map +1 -0
- package/dist/protocols/grok.d.ts +20 -0
- package/dist/protocols/grok.d.ts.map +1 -0
- package/dist/protocols/index.d.ts +31 -0
- package/dist/protocols/index.d.ts.map +1 -0
- package/dist/protocols/minimax.d.ts +38 -0
- package/dist/protocols/minimax.d.ts.map +1 -0
- package/dist/protocols/moonshot.d.ts +20 -0
- package/dist/protocols/moonshot.d.ts.map +1 -0
- package/dist/protocols/openai-sse.d.ts +33 -0
- package/dist/protocols/openai-sse.d.ts.map +1 -0
- package/dist/protocols/openai.d.ts +19 -0
- package/dist/protocols/openai.d.ts.map +1 -0
- package/dist/protocols/qwen.d.ts +26 -0
- package/dist/protocols/qwen.d.ts.map +1 -0
- package/dist/protocols/responses-sse.d.ts +30 -0
- package/dist/protocols/responses-sse.d.ts.map +1 -0
- package/dist/protocols/sse-reader.d.ts +23 -0
- package/dist/protocols/sse-reader.d.ts.map +1 -0
- package/dist/protocols/tool-arguments.d.ts +8 -0
- package/dist/protocols/tool-arguments.d.ts.map +1 -0
- package/dist/protocols/types.d.ts +148 -0
- package/dist/protocols/types.d.ts.map +1 -0
- package/dist/protocols/vercel-gateway.d.ts +15 -0
- package/dist/protocols/vercel-gateway.d.ts.map +1 -0
- package/dist/runtime.d.ts +151 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +1 -0
- package/dist/skills/index.d.ts +14 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/management/admin.d.ts +10 -0
- package/dist/skills/management/admin.d.ts.map +1 -0
- package/dist/skills/management/index.d.ts +11 -0
- package/dist/skills/management/index.d.ts.map +1 -0
- package/dist/skills/management/inputs.d.ts +44 -0
- package/dist/skills/management/inputs.d.ts.map +1 -0
- package/dist/skills/management/operations.d.ts +78 -0
- package/dist/skills/management/operations.d.ts.map +1 -0
- package/dist/skills/management/types.d.ts +70 -0
- package/dist/skills/management/types.d.ts.map +1 -0
- package/dist/skills/registry.d.ts +37 -0
- package/dist/skills/registry.d.ts.map +1 -0
- package/dist/skills/summaries.d.ts +9 -0
- package/dist/skills/summaries.d.ts.map +1 -0
- package/dist/skills/types.d.ts +61 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/test-utils/mock-sse.d.ts +13 -0
- package/dist/test-utils/mock-sse.d.ts.map +1 -0
- package/dist/tool-manager/define-tool.d.ts +35 -0
- package/dist/tool-manager/define-tool.d.ts.map +1 -0
- package/dist/tool-manager/formats.d.ts +46 -0
- package/dist/tool-manager/formats.d.ts.map +1 -0
- package/dist/tool-manager/identity.d.ts +18 -0
- package/dist/tool-manager/identity.d.ts.map +1 -0
- package/dist/tool-manager/in-process-provider.d.ts +15 -0
- package/dist/tool-manager/in-process-provider.d.ts.map +1 -0
- package/dist/tool-manager/index.d.ts +18 -0
- package/dist/tool-manager/index.d.ts.map +1 -0
- package/dist/tool-manager/manager.d.ts +18 -0
- package/dist/tool-manager/manager.d.ts.map +1 -0
- package/dist/tool-manager/mcp-provider.d.ts +21 -0
- package/dist/tool-manager/mcp-provider.d.ts.map +1 -0
- package/dist/tool-manager/summaries.d.ts +39 -0
- package/dist/tool-manager/summaries.d.ts.map +1 -0
- package/dist/tool-manager/types.d.ts +314 -0
- package/dist/tool-manager/types.d.ts.map +1 -0
- package/dist/types.d.ts +663 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +26 -15
- package/src/adapter/index.ts +25 -0
- package/src/adapter/model-adapter.ts +196 -0
- package/src/adapter/model-options.ts +143 -0
- package/src/adapter/types.ts +41 -0
- package/src/chat-runtime.ts +515 -0
- package/src/constants.ts +9 -102
- package/src/events.ts +364 -150
- package/src/extension/index.ts +24 -0
- package/src/extension/types.ts +49 -0
- package/src/families/index.ts +28 -0
- package/src/families/presets.ts +124 -0
- package/src/families/resolver.ts +22 -0
- package/src/families/types.ts +55 -0
- package/src/governance/command-safety.ts +224 -0
- package/src/governance/governance.ts +125 -0
- package/src/governance/index.ts +38 -0
- package/src/governance/types.ts +44 -0
- package/src/index.ts +250 -145
- package/src/internal/management-args.ts +39 -0
- package/src/internal/management-results.ts +60 -0
- package/src/llm-config.ts +137 -0
- package/src/logger/core.ts +96 -0
- package/src/logger/index.ts +8 -0
- package/src/orchestrator/compression-handler.ts +137 -0
- package/src/{providers → orchestrator}/context-compressor.ts +79 -47
- package/src/orchestrator/context-summarizer.ts +123 -0
- package/src/orchestrator/index.ts +20 -0
- package/src/orchestrator/orchestrator.ts +1002 -0
- package/src/orchestrator/types.ts +70 -0
- package/src/parts/index.ts +20 -0
- package/src/parts/registry.ts +95 -0
- package/src/parts/summaries.ts +40 -0
- package/src/parts/types.ts +63 -0
- package/src/platform.ts +73 -0
- package/src/protocols/anthropic.ts +377 -0
- package/src/protocols/ark.ts +300 -0
- package/src/protocols/deepseek.ts +192 -0
- package/src/{providers/protocols → protocols}/error-utils.ts +17 -20
- package/src/protocols/gemini.ts +352 -0
- package/src/protocols/glm.ts +212 -0
- package/src/protocols/grok.ts +98 -0
- package/src/protocols/index.ts +48 -0
- package/src/protocols/minimax.ts +308 -0
- package/src/protocols/moonshot.ts +186 -0
- package/src/protocols/openai-sse.ts +156 -0
- package/src/protocols/openai.ts +97 -0
- package/src/protocols/qwen.ts +358 -0
- package/src/protocols/responses-sse.ts +224 -0
- package/src/protocols/sse-reader.ts +54 -0
- package/src/protocols/tool-arguments.ts +32 -0
- package/src/{providers/protocols → protocols}/types.ts +46 -37
- package/src/protocols/vercel-gateway.ts +391 -0
- package/src/runtime.ts +167 -0
- package/src/skills/index.ts +29 -0
- package/src/skills/management/admin.ts +170 -0
- package/src/skills/management/index.ts +27 -0
- package/src/skills/management/inputs.ts +79 -0
- package/src/skills/management/operations.ts +256 -0
- package/src/skills/management/types.ts +57 -0
- package/src/skills/registry.ts +120 -0
- package/src/skills/summaries.ts +48 -0
- package/src/skills/types.ts +65 -0
- package/src/test-utils/mock-sse.ts +3 -3
- package/src/tool-manager/define-tool.ts +201 -0
- package/src/tool-manager/formats.ts +146 -0
- package/src/tool-manager/identity.ts +80 -0
- package/src/tool-manager/in-process-provider.ts +164 -0
- package/src/tool-manager/index.ts +63 -0
- package/src/tool-manager/manager.ts +562 -0
- package/src/tool-manager/mcp-provider.ts +509 -0
- package/src/tool-manager/summaries.ts +136 -0
- package/src/tool-manager/types.ts +389 -0
- package/src/types.ts +750 -191
- package/dist/events-CU5D5ray.d.ts +0 -1128
- package/src/agent.ts +0 -409
- package/src/internal/update-plan.ts +0 -2
- package/src/internal/web-search.ts +0 -77
- package/src/mcp/client-manager.ts +0 -302
- package/src/mcp/index.ts +0 -2
- package/src/mcp/types.ts +0 -43
- package/src/providers/context-summarizer.ts +0 -70
- package/src/providers/index.ts +0 -125
- package/src/providers/model-registry.ts +0 -466
- package/src/providers/orchestrator.ts +0 -839
- package/src/providers/protocols/anthropic.ts +0 -406
- package/src/providers/protocols/ark.ts +0 -362
- package/src/providers/protocols/deepseek.ts +0 -344
- package/src/providers/protocols/gemini.ts +0 -350
- package/src/providers/protocols/index.ts +0 -36
- package/src/providers/protocols/openai.ts +0 -420
- package/src/providers/protocols/qwen.ts +0 -315
- package/src/providers/types.ts +0 -264
- package/src/providers/unified-adapter.ts +0 -367
- package/src/router.ts +0 -72
- package/src/tools.ts +0 -162
- package/src/utils.ts +0 -86
|
@@ -1,302 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP Client Manager
|
|
3
|
-
*
|
|
4
|
-
* 管理多个 MCP Server 连接,自动发现工具并转换为 Tool 接口。
|
|
5
|
-
*
|
|
6
|
-
* 职责:
|
|
7
|
-
* 1. 连接管理:根据配置连接/断开 MCP Server
|
|
8
|
-
* 2. 工具发现:通过 MCP 协议自动发现 Server 提供的工具
|
|
9
|
-
* 3. 工具适配:将 MCP 工具转换为我们的 Tool 接口
|
|
10
|
-
* 4. 生命周期:优雅关闭所有连接
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
14
|
-
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
15
|
-
import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
|
|
16
|
-
import type { Tool, JsonSchemaObject, JsonSchemaProperty } from '../types';
|
|
17
|
-
import type { McpServerConfig, McpConnectionInfo, McpConnectionStatus } from './types';
|
|
18
|
-
import { DebugLogger } from '../utils';
|
|
19
|
-
|
|
20
|
-
const logger = DebugLogger.module('MCP');
|
|
21
|
-
|
|
22
|
-
/** 单个 MCP Server 连接 */
|
|
23
|
-
interface McpConnection {
|
|
24
|
-
config: McpServerConfig;
|
|
25
|
-
client: Client;
|
|
26
|
-
transport: StdioClientTransport | SSEClientTransport;
|
|
27
|
-
status: McpConnectionStatus;
|
|
28
|
-
tools: Tool[];
|
|
29
|
-
error?: string;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* MCP Client Manager
|
|
34
|
-
*
|
|
35
|
-
* 使用方式:
|
|
36
|
-
* ```typescript
|
|
37
|
-
* const manager = new McpClientManager();
|
|
38
|
-
* await manager.connectAll(configs);
|
|
39
|
-
* const tools = manager.getAllTools(); // 返回 Tool[] 直接注册到 Agent
|
|
40
|
-
* // ... 使用完毕
|
|
41
|
-
* await manager.disconnectAll();
|
|
42
|
-
* ```
|
|
43
|
-
*/
|
|
44
|
-
export class McpClientManager {
|
|
45
|
-
private connections = new Map<string, McpConnection>();
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* 连接到所有配置的 MCP Server
|
|
49
|
-
*
|
|
50
|
-
* 并行连接,单个失败不影响其他。
|
|
51
|
-
*/
|
|
52
|
-
async connectAll(configs: McpServerConfig[]): Promise<void> {
|
|
53
|
-
const results = await Promise.allSettled(
|
|
54
|
-
configs.map(config => this.connect(config))
|
|
55
|
-
);
|
|
56
|
-
|
|
57
|
-
// 记录连接结果
|
|
58
|
-
for (let i = 0; i < results.length; i++) {
|
|
59
|
-
const result = results[i];
|
|
60
|
-
const name = configs[i].name;
|
|
61
|
-
if (result.status === 'rejected') {
|
|
62
|
-
logger.error(`[${name}] 连接失败:`, result.reason);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* 连接单个 MCP Server
|
|
69
|
-
*/
|
|
70
|
-
async connect(config: McpServerConfig): Promise<void> {
|
|
71
|
-
const { name } = config;
|
|
72
|
-
|
|
73
|
-
// 如果已连接,先断开
|
|
74
|
-
if (this.connections.has(name)) {
|
|
75
|
-
await this.disconnect(name);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
logger.info(`[${name}] 正在连接...`);
|
|
79
|
-
|
|
80
|
-
const client = new Client(
|
|
81
|
-
{ name: 'ai-chat-mcp-client', version: '1.0.0' },
|
|
82
|
-
);
|
|
83
|
-
|
|
84
|
-
let transport: StdioClientTransport | SSEClientTransport;
|
|
85
|
-
|
|
86
|
-
if (config.transport === 'stdio') {
|
|
87
|
-
if (!config.command) {
|
|
88
|
-
throw new Error(`[${name}] stdio 模式必须指定 command`);
|
|
89
|
-
}
|
|
90
|
-
transport = new StdioClientTransport({
|
|
91
|
-
command: config.command,
|
|
92
|
-
args: config.args,
|
|
93
|
-
env: config.env,
|
|
94
|
-
cwd: config.cwd,
|
|
95
|
-
});
|
|
96
|
-
} else if (config.transport === 'sse') {
|
|
97
|
-
if (!config.url) {
|
|
98
|
-
throw new Error(`[${name}] sse 模式必须指定 url`);
|
|
99
|
-
}
|
|
100
|
-
transport = new SSEClientTransport(new URL(config.url));
|
|
101
|
-
} else {
|
|
102
|
-
throw new Error(`[${name}] 不支持的传输方式: ${config.transport}`);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
const connection: McpConnection = {
|
|
106
|
-
config,
|
|
107
|
-
client,
|
|
108
|
-
transport,
|
|
109
|
-
status: 'connecting',
|
|
110
|
-
tools: [],
|
|
111
|
-
};
|
|
112
|
-
|
|
113
|
-
this.connections.set(name, connection);
|
|
114
|
-
|
|
115
|
-
try {
|
|
116
|
-
await client.connect(transport);
|
|
117
|
-
connection.status = 'connected';
|
|
118
|
-
logger.info(`[${name}] 已连接`);
|
|
119
|
-
|
|
120
|
-
// 发现工具
|
|
121
|
-
const tools = await this.discoverTools(connection);
|
|
122
|
-
connection.tools = tools;
|
|
123
|
-
logger.info(`[${name}] 发现 ${tools.length} 个工具:`, tools.map(t => t.name));
|
|
124
|
-
} catch (error) {
|
|
125
|
-
connection.status = 'error';
|
|
126
|
-
connection.error = error instanceof Error ? error.message : String(error);
|
|
127
|
-
logger.error(`[${name}] 连接失败:`, connection.error);
|
|
128
|
-
throw error;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* 从 MCP Server 发现工具并转换为 Tool 接口
|
|
134
|
-
*/
|
|
135
|
-
private async discoverTools(connection: McpConnection): Promise<Tool[]> {
|
|
136
|
-
const { client, config } = connection;
|
|
137
|
-
const { tools: mcpTools } = await client.listTools();
|
|
138
|
-
|
|
139
|
-
return mcpTools.map(mcpTool => this.adaptTool(mcpTool, config.name, client));
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* 将 MCP 工具转换为我们的 Tool 接口
|
|
144
|
-
*
|
|
145
|
-
* 关键转换:
|
|
146
|
-
* - MCP inputSchema → 我们的 parameters (JsonSchemaObject)
|
|
147
|
-
* - MCP callTool() → 我们的 execute()
|
|
148
|
-
*/
|
|
149
|
-
private adaptTool(
|
|
150
|
-
mcpTool: { name: string; description?: string; inputSchema: Record<string, unknown> },
|
|
151
|
-
serverName: string,
|
|
152
|
-
client: Client
|
|
153
|
-
): Tool {
|
|
154
|
-
// 转换 inputSchema 为我们的 JsonSchemaObject
|
|
155
|
-
const parameters = this.convertSchema(mcpTool.inputSchema);
|
|
156
|
-
|
|
157
|
-
return {
|
|
158
|
-
name: mcpTool.name,
|
|
159
|
-
description: mcpTool.description || `MCP tool from ${serverName}`,
|
|
160
|
-
parameters,
|
|
161
|
-
execute: async (args: Record<string, unknown>) => {
|
|
162
|
-
const result = await client.callTool({
|
|
163
|
-
name: mcpTool.name,
|
|
164
|
-
arguments: args,
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
// MCP 返回 content 数组,拼接为字符串
|
|
168
|
-
const texts: string[] = [];
|
|
169
|
-
if (Array.isArray(result.content)) {
|
|
170
|
-
for (const item of result.content) {
|
|
171
|
-
if (typeof item === 'object' && item !== null) {
|
|
172
|
-
const content = item as Record<string, unknown>;
|
|
173
|
-
if (content.type === 'text' && typeof content.text === 'string') {
|
|
174
|
-
texts.push(content.text);
|
|
175
|
-
} else if (content.type === 'image') {
|
|
176
|
-
texts.push(`[image: ${content.mimeType || 'unknown'}]`);
|
|
177
|
-
} else if (content.type === 'resource') {
|
|
178
|
-
texts.push(JSON.stringify(content));
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
const text = texts.join('\n') || JSON.stringify(result.content);
|
|
185
|
-
return { text };
|
|
186
|
-
},
|
|
187
|
-
};
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* 将 MCP inputSchema 转换为 JsonSchemaObject
|
|
192
|
-
*/
|
|
193
|
-
private convertSchema(inputSchema: Record<string, unknown>): JsonSchemaObject {
|
|
194
|
-
const properties: Record<string, JsonSchemaProperty> = {};
|
|
195
|
-
const required: string[] = [];
|
|
196
|
-
|
|
197
|
-
const schemaProperties = inputSchema.properties as Record<string, Record<string, unknown>> | undefined;
|
|
198
|
-
if (schemaProperties) {
|
|
199
|
-
for (const [key, value] of Object.entries(schemaProperties)) {
|
|
200
|
-
properties[key] = this.convertProperty(value);
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
if (Array.isArray(inputSchema.required)) {
|
|
205
|
-
required.push(...inputSchema.required.filter((r): r is string => typeof r === 'string'));
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
return {
|
|
209
|
-
type: 'object',
|
|
210
|
-
properties,
|
|
211
|
-
required: required.length > 0 ? required : undefined,
|
|
212
|
-
};
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
/**
|
|
216
|
-
* 递归转换 JSON Schema 属性
|
|
217
|
-
*/
|
|
218
|
-
private convertProperty(prop: Record<string, unknown>): JsonSchemaProperty {
|
|
219
|
-
const result: JsonSchemaProperty = {
|
|
220
|
-
type: typeof prop.type === 'string' ? prop.type : 'string',
|
|
221
|
-
};
|
|
222
|
-
|
|
223
|
-
if (typeof prop.description === 'string') {
|
|
224
|
-
result.description = prop.description;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
if (Array.isArray(prop.enum)) {
|
|
228
|
-
result.enum = prop.enum;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
// 递归处理 items(数组类型)
|
|
232
|
-
if (prop.items && typeof prop.items === 'object') {
|
|
233
|
-
result.items = this.convertProperty(prop.items as Record<string, unknown>);
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
// 递归处理 properties(对象类型)
|
|
237
|
-
if (prop.properties && typeof prop.properties === 'object') {
|
|
238
|
-
result.properties = {};
|
|
239
|
-
for (const [key, value] of Object.entries(prop.properties as Record<string, Record<string, unknown>>)) {
|
|
240
|
-
result.properties[key] = this.convertProperty(value);
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
if (Array.isArray(prop.required)) {
|
|
245
|
-
result.required = prop.required.filter((r): r is string => typeof r === 'string');
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
return result;
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
/**
|
|
252
|
-
* 获取所有已连接 Server 的工具
|
|
253
|
-
*/
|
|
254
|
-
getAllTools(): Tool[] {
|
|
255
|
-
const tools: Tool[] = [];
|
|
256
|
-
for (const connection of this.connections.values()) {
|
|
257
|
-
if (connection.status === 'connected') {
|
|
258
|
-
tools.push(...connection.tools);
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
return tools;
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
/**
|
|
265
|
-
* 获取所有连接状态
|
|
266
|
-
*/
|
|
267
|
-
getConnectionInfos(): McpConnectionInfo[] {
|
|
268
|
-
return Array.from(this.connections.values()).map(conn => ({
|
|
269
|
-
name: conn.config.name,
|
|
270
|
-
status: conn.status,
|
|
271
|
-
toolCount: conn.tools.length,
|
|
272
|
-
error: conn.error,
|
|
273
|
-
}));
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
/**
|
|
277
|
-
* 断开单个 Server
|
|
278
|
-
*/
|
|
279
|
-
async disconnect(name: string): Promise<void> {
|
|
280
|
-
const connection = this.connections.get(name);
|
|
281
|
-
if (!connection) return;
|
|
282
|
-
|
|
283
|
-
try {
|
|
284
|
-
await connection.client.close();
|
|
285
|
-
logger.info(`[${name}] 已断开`);
|
|
286
|
-
} catch (error) {
|
|
287
|
-
logger.error(`[${name}] 断开失败:`, error);
|
|
288
|
-
} finally {
|
|
289
|
-
connection.status = 'disconnected';
|
|
290
|
-
connection.tools = [];
|
|
291
|
-
this.connections.delete(name);
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
/**
|
|
296
|
-
* 断开所有连接
|
|
297
|
-
*/
|
|
298
|
-
async disconnectAll(): Promise<void> {
|
|
299
|
-
const names = Array.from(this.connections.keys());
|
|
300
|
-
await Promise.allSettled(names.map(name => this.disconnect(name)));
|
|
301
|
-
}
|
|
302
|
-
}
|
package/src/mcp/index.ts
DELETED
package/src/mcp/types.ts
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP (Model Context Protocol) 相关类型定义
|
|
3
|
-
*
|
|
4
|
-
* 支持两种传输方式:
|
|
5
|
-
* - stdio: 启动本地子进程,通过 stdin/stdout 通信(操作本地文件、命令、应用)
|
|
6
|
-
* - sse: 连接远程 HTTP 服务器(调用远程 API/服务)
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
/** MCP Server 配置 */
|
|
10
|
-
export interface McpServerConfig {
|
|
11
|
-
/** 服务器唯一标识(用于日志和工具命名空间) */
|
|
12
|
-
name: string;
|
|
13
|
-
|
|
14
|
-
/** 传输方式 */
|
|
15
|
-
transport: 'stdio' | 'sse';
|
|
16
|
-
|
|
17
|
-
/** stdio 模式:启动命令(如 "npx", "python3", "/usr/local/bin/my-server") */
|
|
18
|
-
command?: string;
|
|
19
|
-
/** stdio 模式:命令参数 */
|
|
20
|
-
args?: string[];
|
|
21
|
-
/** stdio 模式:环境变量 */
|
|
22
|
-
env?: Record<string, string>;
|
|
23
|
-
/** stdio 模式:工作目录 */
|
|
24
|
-
cwd?: string;
|
|
25
|
-
|
|
26
|
-
/** sse 模式:服务器 URL */
|
|
27
|
-
url?: string;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/** MCP 连接状态 */
|
|
31
|
-
export type McpConnectionStatus = 'connecting' | 'connected' | 'disconnected' | 'error';
|
|
32
|
-
|
|
33
|
-
/** 单个 MCP 连接信息 */
|
|
34
|
-
export interface McpConnectionInfo {
|
|
35
|
-
/** 服务器名称 */
|
|
36
|
-
name: string;
|
|
37
|
-
/** 连接状态 */
|
|
38
|
-
status: McpConnectionStatus;
|
|
39
|
-
/** 提供的工具数量 */
|
|
40
|
-
toolCount: number;
|
|
41
|
-
/** 错误信息(status === 'error' 时) */
|
|
42
|
-
error?: string;
|
|
43
|
-
}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Context Summarizer — 专用上下文总结模块
|
|
3
|
-
*
|
|
4
|
-
* 当对话历史超过当前模型的 context window 时,通过外部注入的 summarize 回调执行 AI 总结。
|
|
5
|
-
* 回调由宿主提供(如 smart-finder 走 ai-server 的 toolAI),ai-chat-core 不关心具体调用方式。
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import type { StandardMessage } from './types';
|
|
9
|
-
import {
|
|
10
|
-
buildSummarizeRequest,
|
|
11
|
-
applySummary,
|
|
12
|
-
estimateTotalTokens,
|
|
13
|
-
type CompactConfig,
|
|
14
|
-
} from './context-compressor';
|
|
15
|
-
import { DebugLogger } from '../utils';
|
|
16
|
-
|
|
17
|
-
const logger = DebugLogger.module('ContextSummarizer');
|
|
18
|
-
|
|
19
|
-
// ==================== 类型 ====================
|
|
20
|
-
|
|
21
|
-
/** 外部注入的 AI 总结函数 */
|
|
22
|
-
export type SummarizeFn = (systemPrompt: string, userPrompt: string) => Promise<string>;
|
|
23
|
-
|
|
24
|
-
export interface SummarizeResult {
|
|
25
|
-
messages: StandardMessage[];
|
|
26
|
-
success: boolean;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
// ==================== 核心函数 ====================
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* 使用 AI 总结对话历史
|
|
33
|
-
*
|
|
34
|
-
* 1. 用 buildSummarizeRequest 分离「待总结的中间历史」和「保留的最近消息」
|
|
35
|
-
* 2. 调用外部注入的 summarizeFn 执行总结(走 ai-server 等)
|
|
36
|
-
* 3. 用 applySummary 组装压缩后的消息列表
|
|
37
|
-
*/
|
|
38
|
-
export async function summarizeHistory(
|
|
39
|
-
summarizeFn: SummarizeFn,
|
|
40
|
-
messages: StandardMessage[],
|
|
41
|
-
config: CompactConfig,
|
|
42
|
-
): Promise<SummarizeResult> {
|
|
43
|
-
const { summarizeMessages, keepMessages } = buildSummarizeRequest(messages, config);
|
|
44
|
-
|
|
45
|
-
if (summarizeMessages.length === 0) {
|
|
46
|
-
logger.info('中间历史太短,跳过 AI 总结');
|
|
47
|
-
return { messages, success: true };
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const systemPrompt = summarizeMessages[0].content;
|
|
51
|
-
const userPrompt = summarizeMessages[1].content;
|
|
52
|
-
|
|
53
|
-
logger.info(`开始 AI 总结: ~${estimateTotalTokens(summarizeMessages)} tokens, ${messages.length} 条消息`);
|
|
54
|
-
|
|
55
|
-
try {
|
|
56
|
-
const summary = await summarizeFn(systemPrompt, userPrompt);
|
|
57
|
-
|
|
58
|
-
if (!summary.trim()) {
|
|
59
|
-
logger.warn('AI 总结返回空内容');
|
|
60
|
-
return { messages, success: false };
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
const compressed = applySummary(messages, summary, keepMessages);
|
|
64
|
-
logger.info(`AI 总结完成: ${messages.length} → ${compressed.length} 条消息, ~${estimateTotalTokens(compressed)} tokens`);
|
|
65
|
-
return { messages: compressed, success: true };
|
|
66
|
-
} catch (err) {
|
|
67
|
-
logger.error('AI 总结异常:', err);
|
|
68
|
-
return { messages, success: false };
|
|
69
|
-
}
|
|
70
|
-
}
|
package/src/providers/index.ts
DELETED
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Provider 模块导出
|
|
3
|
-
*
|
|
4
|
-
* 新架构(v2):
|
|
5
|
-
* - ModelRegistry: 模型注册表,管理所有模型配置(Protocol + Family)
|
|
6
|
-
* - ChatOrchestrator: 统一处理工具调用循环、消息历史、事件发射
|
|
7
|
-
* - ProviderAdapter: 只负责 API 格式转换,不处理业务逻辑
|
|
8
|
-
*
|
|
9
|
-
* 设计优势:
|
|
10
|
-
* 1. Protocol + Family 分离:同协议不同行为的模型可复用协议层
|
|
11
|
-
* 2. 所有 Provider 共享相同的工具调用逻辑
|
|
12
|
-
* 3. 修改 Orchestrator = 修改所有 Provider 行为
|
|
13
|
-
* 4. 每个 Adapter 只关心自己的 API 格式转换
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
// ==================== 模型注册表 ====================
|
|
17
|
-
|
|
18
|
-
export {
|
|
19
|
-
// 家族配置
|
|
20
|
-
MODEL_FAMILIES,
|
|
21
|
-
DOUBAO_FAMILY,
|
|
22
|
-
DEEPSEEK_FAMILY,
|
|
23
|
-
QWEN_FAMILY,
|
|
24
|
-
GEMINI_FAMILY,
|
|
25
|
-
GPT_FAMILY,
|
|
26
|
-
CLAUDE_FAMILY,
|
|
27
|
-
|
|
28
|
-
// 模型注册表
|
|
29
|
-
MODEL_REGISTRY,
|
|
30
|
-
|
|
31
|
-
// 查询函数
|
|
32
|
-
getModelEntry,
|
|
33
|
-
getModelFamily,
|
|
34
|
-
getModelProtocol,
|
|
35
|
-
getVisibleModels,
|
|
36
|
-
getModelsByFamily,
|
|
37
|
-
getModelsByProtocol,
|
|
38
|
-
modelSupportsThinking,
|
|
39
|
-
modelSupportsNativeSearch,
|
|
40
|
-
getModelSearchStrategy,
|
|
41
|
-
} from './model-registry';
|
|
42
|
-
|
|
43
|
-
export type {
|
|
44
|
-
ModelFamilyId,
|
|
45
|
-
ProtocolId,
|
|
46
|
-
ThinkingFormat,
|
|
47
|
-
SearchStrategy,
|
|
48
|
-
ToolCallFormat,
|
|
49
|
-
ModelFamilyConfig,
|
|
50
|
-
ModelRegistryEntry,
|
|
51
|
-
} from './model-registry';
|
|
52
|
-
|
|
53
|
-
// ==================== 核心类型 ====================
|
|
54
|
-
|
|
55
|
-
export type {
|
|
56
|
-
// 流式响应
|
|
57
|
-
StreamChunk,
|
|
58
|
-
StreamChunkType,
|
|
59
|
-
ToolCallRequest,
|
|
60
|
-
SearchResultItem,
|
|
61
|
-
|
|
62
|
-
// 标准化消息
|
|
63
|
-
StandardMessage,
|
|
64
|
-
|
|
65
|
-
// Adapter 接口
|
|
66
|
-
ProviderAdapter,
|
|
67
|
-
AdapterConfig,
|
|
68
|
-
StreamOnceOptions,
|
|
69
|
-
SimpleToolDefinition,
|
|
70
|
-
|
|
71
|
-
// Orchestrator 类型
|
|
72
|
-
ToolExecutor,
|
|
73
|
-
OrchestratorConfig,
|
|
74
|
-
OrchestratorContext,
|
|
75
|
-
OrchestratorOptions,
|
|
76
|
-
} from './types';
|
|
77
|
-
|
|
78
|
-
// ==================== Orchestrator ====================
|
|
79
|
-
|
|
80
|
-
export { ChatOrchestrator, createOrchestrator } from './orchestrator';
|
|
81
|
-
|
|
82
|
-
// ==================== Context 压缩与总结 ====================
|
|
83
|
-
|
|
84
|
-
export { summarizeHistory } from './context-summarizer';
|
|
85
|
-
export type { SummarizeFn, SummarizeResult } from './context-summarizer';
|
|
86
|
-
|
|
87
|
-
// ==================== UnifiedAdapter(新架构) ====================
|
|
88
|
-
|
|
89
|
-
export { UnifiedAdapter, createUnifiedAdapter } from './unified-adapter';
|
|
90
|
-
export type { UnifiedAdapterConfig, StreamOptions } from './unified-adapter';
|
|
91
|
-
|
|
92
|
-
// ==================== Protocol Layer ====================
|
|
93
|
-
|
|
94
|
-
export {
|
|
95
|
-
// Protocol 实现
|
|
96
|
-
ArkProtocol,
|
|
97
|
-
createArkProtocol,
|
|
98
|
-
DeepSeekProtocol,
|
|
99
|
-
createDeepSeekProtocol,
|
|
100
|
-
QwenProtocol,
|
|
101
|
-
createQwenProtocol,
|
|
102
|
-
GeminiProtocol,
|
|
103
|
-
createGeminiProtocol,
|
|
104
|
-
OpenAIProtocol,
|
|
105
|
-
createOpenAIProtocol,
|
|
106
|
-
AnthropicProtocol,
|
|
107
|
-
createAnthropicProtocol,
|
|
108
|
-
} from './protocols';
|
|
109
|
-
|
|
110
|
-
export type {
|
|
111
|
-
// Protocol 类型
|
|
112
|
-
Protocol,
|
|
113
|
-
ProtocolConfig,
|
|
114
|
-
ProtocolFactory,
|
|
115
|
-
ProtocolMessage,
|
|
116
|
-
ProtocolToolDefinition,
|
|
117
|
-
ProtocolToolCall,
|
|
118
|
-
ProtocolRequestOptions,
|
|
119
|
-
RawEvent,
|
|
120
|
-
RawEventType,
|
|
121
|
-
RawToolCall,
|
|
122
|
-
RawSearchResult,
|
|
123
|
-
} from './protocols';
|
|
124
|
-
|
|
125
|
-
// Legacy Adapters 已删除,使用 UnifiedAdapter + Protocol 新架构
|