工具调用跟踪

📎 引用文件

本文引用的文件 - agent/src/agent/loop.py - agent/src/agent/tools.py - agent/src/agent/trace.py - agent/src/live/classification.py - agent/cli/_legacy.py - agent/tests/test_tool_timeout.py - frontend/src/pages/Agent.tsx - frontend/src/stores/agent.ts - frontend/src/types/agent.ts

目录

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

简介

本文件面向 Vibe-Trading 研究页面的“工具调用跟踪系统”,系统性说明工具调用的生命周期管理、执行状态跟踪、结果聚合机制,以及活动动词推导、工具分类逻辑、时间线展示逻辑。同时覆盖去重、并发控制、超时处理、性能监控、错误诊断与日志分析方法,并给出自定义工具集成与扩展的最佳实践。

项目结构

围绕工具调用跟踪的关键代码分布在后端 AgentLoop、工具注册与追踪写入、前端事件消费与状态存储等模块: - 后端循环与执行:AgentLoop 负责 ReAct 主循环、工具批处理、心跳与进度事件、上下文压缩、运行清单与使用量统计。 - 工具基础设施:BaseTool/ToolRegistry 提供工具抽象与统一执行入口,保证返回 JSON 且捕获异常。 - 追踪持久化:TraceWriter 以 JSONL 形式记录 trace,支持大字段旁路落盘与原子替换,确保崩溃安全。 - 前端流式渲染:Agent.tsx 订阅 tool_call/tool_progress/tool_heartbeat/tool_result 等事件,维护运行中工具调用与进度;stores/agent.ts 负责活动动词推导与分类;types/agent.ts 定义 ToolCallEntry 数据结构。

graph TB subgraph "后端" A["AgentLoop<br/>循环/并发/心跳/压缩"] B["ToolRegistry<br/>工具注册/执行"] C["TraceWriter<br/>JSONL 追踪/旁路落盘"] end subgraph "前端" D["Agent.tsx<br/>事件订阅/时间线"] E["stores/agent.ts<br/>活动动词/分类"] F["types/agent.ts<br/>ToolCallEntry"] end A --> B A --> C A --> |SSE 事件| D D --> E D --> F

图表来源 - agent/src/agent/loop.py:502-800 - agent/src/agent/tools.py:13-95 - agent/src/agent/trace.py:64-180 - frontend/src/pages/Agent.tsx:722-786 - frontend/src/stores/agent.ts:1-34 - frontend/src/types/agent.ts:60-81

章节来源 - agent/src/agent/loop.py:502-800 - agent/src/agent/tools.py:13-95 - agent/src/agent/trace.py:64-180 - frontend/src/pages/Agent.tsx:722-786 - frontend/src/stores/agent.ts:1-34 - frontend/src/types/agent.ts:60-81

核心组件

章节来源 - agent/src/agent/loop.py:502-800 - agent/src/agent/tools.py:13-95 - agent/src/agent/trace.py:64-180 - frontend/src/pages/Agent.tsx:722-786 - frontend/src/stores/agent.ts:1-34

架构总览

下图展示了从 LLM 到工具执行、事件回传、前端渲染的端到端流程,包括心跳、进度与结果聚合。

sequenceDiagram participant LLM as "LLM" participant Loop as "AgentLoop" participant Reg as "ToolRegistry" participant Tr as "TraceWriter" participant FE as "前端 Agent.tsx" LLM->>Loop : "请求工具调用" Loop->>Reg : "execute(name, params)" Reg-->>Loop : "JSON 结果或错误" Loop->>Tr : "write_tool_result(...)" Loop->>FE : "tool_call / tool_progress / tool_heartbeat / tool_result" FE->>FE : "更新运行中调用/进度/时间线"

图表来源 - agent/src/agent/loop.py:502-800 - agent/src/agent/tools.py:72-84 - agent/src/agent/trace.py:142-179 - frontend/src/pages/Agent.tsx:722-786

详细组件分析

工具调用生命周期管理

flowchart TD Start(["开始"]) --> EmitCall["发射 tool_call"] EmitCall --> Exec["执行工具(可能并行)"] Exec --> Progress{"有进度?"} Progress -- 是 --> Heartbeat["发射 tool_heartbeat/tool_progress"] Progress -- 否 --> Wait["等待完成"] Heartbeat --> Wait Wait --> Done{"完成/超时/取消"} Done --> Persist["TraceWriter 写结果(旁路落盘)"] Persist --> UpdateFE["前端更新 status/elapsed/preview"] UpdateFE --> End(["结束"])

图表来源 - agent/src/agent/loop.py:502-800 - agent/src/agent/trace.py:142-179 - frontend/src/pages/Agent.tsx:722-786

章节来源 - agent/src/agent/loop.py:502-800 - agent/src/agent/tools.py:72-84 - agent/src/agent/trace.py:142-179 - frontend/src/pages/Agent.tsx:722-786

执行状态跟踪与结果聚合

classDiagram class ToolCallEntry { +string id +string tool +Record~string,string~ arguments +string status +string preview +number elapsed_ms +number elapsed_s +object progress +number timestamp } class AgentStore { +updateRunningToolCall(callId, tool, patch) +upsertSwarmStatus(status) } ToolCallEntry <.. AgentStore : "被更新/聚合"

图表来源 - frontend/src/types/agent.ts:60-81 - frontend/src/pages/Agent.tsx:722-786

章节来源 - agent/src/agent/trace.py:142-179 - frontend/src/pages/Agent.tsx:722-786 - frontend/src/types/agent.ts:60-81

活动动词推导算法

章节来源 - frontend/src/stores/agent.ts:1-34

工具分类逻辑

flowchart TD A["工具名 + 注解 + 白名单"] --> B{"是否在 curated map?"} B -- 是 --> C["返回 pinned 类别"] B -- 否 --> D{"是否有 readOnlyHint?"} D -- True --> E["READ"] D -- False --> F["WRITE"] D -- None --> G["UNKNOWN (按 WRITE 处理)"]

图表来源 - agent/src/live/classification.py:52-89

章节来源 - agent/src/live/classification.py:52-89

时间线展示逻辑

章节来源 - frontend/src/pages/Agent.tsx:530-562 - frontend/src/pages/Agent.tsx:722-786

去重、并发控制与超时处理

sequenceDiagram participant L as "AgentLoop" participant T as "ToolRegistry" participant W as "TraceWriter" L->>T : "execute(只读工具A, 参数)" L->>T : "execute(只读工具B, 参数)" Note over L,T : "只读工具并行执行" T-->>L : "结果A/B" L->>W : "写结果(旁路落盘)" L-->>L : "检查超时/心跳"

图表来源 - agent/src/agent/loop.py:502-800 - agent/tests/test_tool_timeout.py:42-99

章节来源 - agent/src/agent/loop.py:502-800 - agent/tests/test_tool_timeout.py:42-99

性能监控与日志分析

章节来源 - agent/src/agent/loop.py:156-205 - agent/src/agent/trace.py:302-370 - agent/cli/_legacy.py:593-689

依赖关系分析

graph LR Loop["AgentLoop"] --> Reg["ToolRegistry"] Loop --> Tr["TraceWriter"] Loop --> Ctx["ContextBuilder"] Loop --> GL["GroundingLedger"] FE["Agent.tsx"] --> Store["stores/agent.ts"] FE --> Types["types/agent.ts"] Loop --> Classify["live/classification.py"]

图表来源 - agent/src/agent/loop.py:502-800 - agent/src/agent/tools.py:13-95 - agent/src/agent/trace.py:64-180 - agent/src/live/classification.py:52-89 - frontend/src/pages/Agent.tsx:722-786 - frontend/src/stores/agent.ts:1-34 - frontend/src/types/agent.ts:60-81

章节来源 - agent/src/agent/loop.py:502-800 - agent/src/agent/tools.py:13-95 - agent/src/agent/trace.py:64-180 - agent/src/live/classification.py:52-89 - frontend/src/pages/Agent.tsx:722-786 - frontend/src/stores/agent.ts:1-34 - frontend/src/types/agent.ts:60-81

性能考量

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

故障排查指南

章节来源 - agent/tests/test_tool_timeout.py:42-99 - agent/src/agent/trace.py:286-300 - frontend/src/pages/Agent.tsx:722-786

结论

Vibe-Trading 的工具调用跟踪系统通过 AgentLoop 的统一编排、ToolRegistry 的安全执行、TraceWriter 的可靠持久化,以及前端的流式聚合与时间线展示,实现了从调用到可视化的全链路闭环。结合活动动词推导与工具分类逻辑,系统在用户体验与安全合规之间取得平衡。建议在生产环境中关注超时配置、并行度与大结果落盘策略,并结合日志与追踪数据进行持续优化。

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

附录

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