工具调用管理

📎 引用文件

本文引用的文件 - frontend/src/stores/agent.ts - frontend/src/types/agent.ts - frontend/src/pages/Agent.tsx - agent/cli/_legacy.py - agent/src/tools/mcp.py - agent/src/agent/trace.py - agent/tests/test_agent_loop_dsml_tool_calls.py - agent/tests/test_mcp_client_adapter.py

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考量
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本文件面向 Vibe-Trading 研究页面的“工具调用管理系统”,聚焦前端状态管理与后端事件流如何协作,完成工具调用的全生命周期管理。文档涵盖: - ToolCallEntry 数据结构与字段语义 - 工具调用生命周期(创建、运行、进度、完成、错误) - 运行状态管理与并发处理策略 - addToolCall、updateToolCall、updateRunningToolCall 等核心方法的实现逻辑 - 状态同步、错误恢复机制 - 工具调用追踪、性能监控、调试工具使用指南 - 自定义工具调用的集成方法与最佳实践

项目结构

围绕工具调用管理的代码主要分布在以下位置: - 前端状态管理:Zustand store 维护 toolCalls 列表与活动态 activity - 前端页面:SSE 事件处理器将后端事件映射为 store 更新 - 类型定义:ToolCallEntry 描述单次工具调用的完整信息 - 后端 CLI 与 MCP:负责工具执行、心跳、结果上报与标准化 - 追踪系统:记录每次工具调用的结果与预览,便于审计与排障

graph TB subgraph "前端" A["Agent.tsx<br/>SSE 事件处理"] --> B["stores/agent.ts<br/>toolCalls/activity 状态"] B --> C["types/agent.ts<br/>ToolCallEntry 类型"] end subgraph "后端" D["cli/_legacy.py<br/>CLI 时间线与活跃工具跟踪"] E["tools/mcp.py<br/>MCP 工具调用封装与归一化"] F["agent/trace.py<br/>工具结果追踪与离线存储"] end A <-- SSE --> D A <-- SSE --> E E --> F

图表来源 - frontend/src/pages/Agent.tsx:705-784 - frontend/src/stores/agent.ts:167-222 - frontend/src/types/agent.ts:60-81 - agent/cli/_legacy.py:593-685 - agent/src/tools/mcp.py:439-473 - agent/src/agent/trace.py:153-179

章节来源 - frontend/src/stores/agent.ts:1-115 - frontend/src/types/agent.ts:1-82 - frontend/src/pages/Agent.tsx:700-899 - agent/cli/_legacy.py:593-685 - agent/src/tools/mcp.py:439-473 - agent/src/agent/trace.py:153-179

核心组件

章节来源 - frontend/src/types/agent.ts:60-81 - frontend/src/stores/agent.ts:167-222 - frontend/src/pages/Agent.tsx:705-784 - agent/src/tools/mcp.py:439-473 - agent/src/agent/trace.py:153-179

架构总览

下图展示了从后端工具执行到前端状态更新的端到端流程,包括心跳、进度聚合与最终结果落库。

sequenceDiagram participant LLM as "LLM/Agent" participant Backend as "后端工具执行(MCP/CLI)" participant Trace as "追踪系统" participant Frontend as "前端 Agent.tsx" participant Store as "Zustand Store" LLM->>Backend : 发起工具调用 Backend-->>Frontend : SSE event : tool_call Frontend->>Store : addToolCall({status : "running"}) Note over Frontend,Store : 新增一条 running 的工具调用条目 loop 长耗时工具 Backend-->>Frontend : SSE event : tool_heartbeat Frontend->>Store : updateRunningToolCall({elapsed_s}) end loop 结构化进度 Backend-->>Frontend : SSE event : tool_progress Frontend->>Frontend : 合并同次调度的 progress Frontend->>Store : updateRunningToolCall({progress}) end Backend->>Trace : 记录 tool_result(含 preview) Backend-->>Frontend : SSE event : tool_result Frontend->>Store : updateRunningToolCall({status, elapsed_ms, preview}) Note over Store : 若为 run_swarm,额外 upsertSwarmStatus

图表来源 - frontend/src/pages/Agent.tsx:705-784 - frontend/src/stores/agent.ts:167-222 - agent/src/agent/trace.py:153-179

详细组件分析

ToolCallEntry 数据结构

该结构贯穿前后端,是工具调用追踪与 UI 渲染的核心载体。

章节来源 - frontend/src/types/agent.ts:60-81

工具调用生命周期

flowchart TD Start(["开始"]) --> OnToolCall["收到 tool_call<br/>addToolCall(status=running)"] OnToolCall --> Heartbeat{"收到 tool_heartbeat?"} Heartbeat --> |是| UpdateElapsed["updateRunningToolCall(elapsed_s)"] Heartbeat --> |否| Progress{"收到 tool_progress?"} UpdateElapsed --> Progress Progress --> |是| Coalesce["合并进度<br/>requestAnimationFrame 批量更新"] Coalesce --> Result{"收到 tool_result?"} Progress --> |否| Result Result --> |是| Finalize["updateRunningToolCall(status, elapsed_ms, preview)"] Result --> |否| Heartbeat Finalize --> End(["结束/归档"])

图表来源 - frontend/src/pages/Agent.tsx:705-784 - frontend/src/stores/agent.ts:167-222

章节来源 - frontend/src/pages/Agent.tsx:705-899 - frontend/src/stores/agent.ts:167-222

核心方法实现逻辑

这些方法保证在并发工具调用下,UI 能正确区分不同调用并实时更新状态。

章节来源 - frontend/src/stores/agent.ts:167-222

并发处理与状态同步

classDiagram class Store { +addToolCall(entry) +updateToolCall(id, update) +updateRunningToolCall(callId, tool, update) +updateOldestRunningToolCall(tool, update) } class SSEHandler { +tool_call(d) +tool_heartbeat(d) +tool_progress(d) +tool_result(d) } Store <.. SSEHandler : "事件驱动更新"

图表来源 - frontend/src/stores/agent.ts:167-222 - frontend/src/pages/Agent.tsx:705-784

章节来源 - frontend/src/stores/agent.ts:167-222 - frontend/src/pages/Agent.tsx:705-784

错误恢复机制

章节来源 - agent/src/tools/mcp.py:439-473 - agent/cli/_legacy.py:593-685 - agent/tests/test_mcp_client_adapter.py:50-94

工具调用追踪与性能监控

章节来源 - agent/src/agent/trace.py:153-179 - agent/cli/_legacy.py:661-685

自定义工具调用的集成方法与最佳实践

章节来源 - frontend/src/pages/Agent.tsx:705-784 - agent/src/tools/mcp.py:439-473

依赖关系分析

graph LR Types["types/agent.ts"] --> Store["stores/agent.ts"] Store --> Page["pages/Agent.tsx"] Page --> MCP["tools/mcp.py"] MCP --> Trace["agent/trace.py"] Page --> CLI["_legacy.py"]

图表来源 - frontend/src/types/agent.ts:60-81 - frontend/src/stores/agent.ts:167-222 - frontend/src/pages/Agent.tsx:705-784 - agent/src/tools/mcp.py:439-473 - agent/src/agent/trace.py:153-179 - agent/cli/_legacy.py:593-685

章节来源 - frontend/src/types/agent.ts:60-81 - frontend/src/stores/agent.ts:167-222 - frontend/src/pages/Agent.tsx:705-784 - agent/src/tools/mcp.py:439-473 - agent/src/agent/trace.py:153-179 - agent/cli/_legacy.py:593-685

性能考量

[本节为通用性能指导,不直接分析具体文件]

故障排查指南

章节来源 - agent/cli/_legacy.py:593-685 - frontend/src/pages/Agent.tsx:757-784 - frontend/src/stores/agent.ts:189-222

结论

Vibe-Trading 的工具调用管理系统通过清晰的数据结构、稳健的状态管理与完善的事件契约,实现了高并发、可追踪、易调试的工具执行流程。前端通过 Zustand store 与 SSE 事件处理器协同工作,后端通过 MCP 封装与 CLI 时间线保障执行稳定性与可观测性。遵循本文档的最佳实践,可高效集成自定义工具并提升用户体验。

[本节为总结性内容,不直接分析具体文件]

附录

[本节为补充说明,不直接分析具体文件]