fix: v0.5.3 模型能力完整性修复 — MCP 工具动态同步 + maxTokens 模型上限钳制
背景:v0.5.2 工具调用失效修复后,对模型全能力矩阵(工具/思考/多模态/流式/ 压缩/摘要/记忆/故障转移/余额)做契约级核查,发现并修复两处同类时序/边界缺陷。 P1 MCP 工具运行中增删不同步引擎: - 症状:运行中添加/启用 MCP server 后,已打开会话拿不到新工具;断开 server 后已有引擎仍持有失效工具定义(模型发起调用才报 Unknown tool) - 根因:setToolsAll 仅在启动期与工具开关时调用,MCP 连接/断开路径缺失 (与 v0.5.2 修复的懒创建陷阱同类——"变更点 × 同步路径"未全覆盖) - 修复:MCPManager 新增 setOnToolsChanged 回调,connectServer 注册完成 / disconnectServer 注销完成后触发;main.ts 注入回调同步全部已存在引擎。 懒创建引擎由 createEngine 实时拉取(v0.5.2),三条路径(启动/懒创建/ 运行中变更)全覆盖。README"无需重启动态发现"的宣称至此真实成立。 P1 maxTokens 超模型上限直接 400: - 症状:引擎默认 maxTokens=63488,OpenAI gpt-4o(16384)/gpt-4.1(32768)、 Anthropic opus/haiku(32000)、MiMo standard(32768) 每次请求 400,等于不可用 - 修复:五个 adapter(DeepSeek/Agnes/MiMo/OpenAI/Anthropic)统一按 MODEL_INFO.maxOutputTokens 钳制;MiMo 保留 thinking 兜底 32768 语义; Anthropic thinking budget 在钳制后的 max_tokens 内二分,自动跟随 测试(224 → 236 用例): - 新增 maxTokens 钳制契约测试 ×9(max-tokens-clamp.test.ts):mock fetch 记录真实请求体断言——超限钳制(MiMo standard/OpenAI gpt-4o/Anthropic opus)/ 未超限原样传递(DeepSeek/Agnes/MiMo pro/o3-mini/sonnet)/ 推理模型字段名 / 未配置默认值安全性 - 新增 MCP 动态同步端到端测试 ×3(mcp-tools-sync.test.ts):mock MCP SDK + 真实 MCPManager/ToolRegistry/AgentEngineManager——先建引擎再连 server,断言同一会话请求的 tools 动态更新 / 断开后移除失效定义 / 回调异常不阻断 MCP 主流程 能力矩阵核查结论(无回归确认): 工具调用主链路 ✓(v0.5.2)/ SubAgent 工具 ✓(delegate 实时 resolveTools)/ thinking 热更新 ✓(baseConfig 合并 路径无懒创建陷阱)/ 多模态当轮 ✓ / 压缩与孤立 tool 消息配对 ✓ / 摘要分层 ✓ / 记忆注入 ✓ / 故障转移 ✓ / 余额 ✓(v0.5.2)。已知设计限制:历史轮图片不 回传(attachments 仅存缩略图,图片只在发送当轮注入上下文)。 验证: lint 0 / typecheck 双工程 0 / test:electron 236 全过 / build 成功
This commit is contained in:
@@ -219,12 +219,37 @@ class MCPToolAdapter implements IMetonaTool {
|
||||
|
||||
export class MCPManager {
|
||||
private servers = new Map<string, MCPServerState>();
|
||||
/**
|
||||
* 工具集合变更回调(v0.5.3)
|
||||
*
|
||||
* connectServer / disconnectServer 完成后触发,供调用方同步引擎工具列表。
|
||||
* 背景:setToolsAll 只作用于已存在的引擎;MCP 工具在运行中增删时,
|
||||
* 已打开会话的引擎不会自动感知 — 不回调同步则已有引擎持有失效工具定义
|
||||
* (调用报 Unknown tool)或缺失新工具(与 README"无需重启"的宣称不符)。
|
||||
* 懒创建引擎由 createEngine 从 registry 实时拉取(v0.5.2),无需此回调。
|
||||
*/
|
||||
private toolsChangedCallback: (() => void) | null = null;
|
||||
|
||||
constructor(
|
||||
private getDB: () => Database.Database,
|
||||
private toolRegistry: ToolRegistry,
|
||||
) {}
|
||||
|
||||
/** 注册工具集合变更回调(main.ts 在 AgentEngineManager 创建后注入) */
|
||||
setOnToolsChanged(callback: () => void): void {
|
||||
this.toolsChangedCallback = callback;
|
||||
}
|
||||
|
||||
/** 工具集合变更后的统一通知(连接注册完成 / 断开注销完成) */
|
||||
private notifyToolsChanged(): void {
|
||||
try {
|
||||
this.toolsChangedCallback?.();
|
||||
} catch (err) {
|
||||
// 回调失败不影响 MCP 主流程(仅引擎工具列表滞后,下轮 setToolsAll 兜底)
|
||||
log.warn('[MCPManager] toolsChanged callback failed:', err);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化:从数据库加载已启用的 MCP Server 并连接
|
||||
*
|
||||
@@ -342,6 +367,9 @@ export class MCPManager {
|
||||
this.toolRegistry.registerMCP(name, adapter);
|
||||
}
|
||||
|
||||
// v0.5.3: 工具集合已变化 — 通知调用方同步引擎工具列表(已存在引擎热更新)
|
||||
this.notifyToolsChanged();
|
||||
|
||||
// 更新状态
|
||||
const state = this.servers.get(name)!;
|
||||
state.status = 'connected';
|
||||
@@ -402,6 +430,9 @@ export class MCPManager {
|
||||
state.client = null;
|
||||
state.tools = [];
|
||||
|
||||
// v0.5.3: 工具集合已变化 — 通知调用方同步引擎(已有引擎需移除失效工具定义)
|
||||
this.notifyToolsChanged();
|
||||
|
||||
log.info(`MCP server "${name}" disconnected`);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user