# 03. 工具体系和 Tool Handler

![工具体系和 Tool Handler](assets/03-tools.png)

## 1. 工具体系的职责

Tool 是执行层。模型只能“请求调用工具”，不能直接执行工具。
后端根据工具名找到 handler，校验参数，执行动作，并把结果写回 session。

工具适合承载：

- 稳定文件读写。
- Python 执行。
- Python 包安装。
- 数据格式转换和校验。
- review 状态机。
- 外部系统访问。
- 需要权限、取消、路径约束或审计的动作。

## 2. Tool registry 构成

入口：

```text
src/agent_tools.py:105 default_tool_registry()
```

它会合并多类工具：

```text
build_file_tools(...)
build_execution_tools(...)
LSP / web_fetch / search / account / config / task / team / workflow 等
Skill 工具
data_agent 工具
```

关键片段：

```text
src/agent_tools.py:107 build_file_tools
src/agent_tools.py:116 build_execution_tools
src/agent_tools.py:1012 AgentTool(name='Skill')
src/agent_tools.py:1033 build_data_agent_tools
```

返回结果是：

```python
return {tool.name: tool for tool in tools}
```

## 3. Tool spec 注入模型

在 Agent loop 中：

```text
src/agent_runtime.py:552
tool_specs = [tool.to_openai_tool() for tool in self.tool_registry.values()]
```

每个工具包含：

```text
name
description
parameters JSON schema
handler
```

模型看到的是 name、description、parameters。handler 不暴露给模型，只在后端执行。

## 4. Tool handler 执行路径

工具执行入口：

```text
src/agent_tools.py:60 execute_tool(...)
src/agent_tools.py:76 execute_tool_streaming(...)
```

执行逻辑：

```text
1. 从 tool_registry 取 tool。
2. 找不到则返回 Unknown tool。
3. bash 走 streaming。
4. 其他工具调用 tool.execute(arguments, context)。
5. 工具结果序列化回模型和前端。
```

## 5. 文件工具

定义位置：

```text
src/agent_tool_specs/files.py
```

主要工具：

- `list_dir`
- `read_file`
- `write_file`
- `edit_file`
- `notebook_edit`
- `glob_search`
- `grep_search`

### 5.1 `write_file` 的边界

`write_file` 当前明确定位为“小文件工具”：

```text
src/agent_tool_specs/files.py
  Write or append a SMALL UTF-8 file inside the workspace.
```

适合：

- 短 Markdown。
- 少量配置。
- 小 JSON。
- 少量 JSONL。
- 小 CSV。

不适合：

- 长 Python 脚本。
- 大 JSON。
- JSONL 数据集。
- 长 CSV。
- 大段包含引号和换行的内容。

原因是模型生成工具参数时，需要把内容嵌入 JSON 参数。长文本、引号、换行会显著增加非法 JSON 参数概率。

因此系统提示词也要求：

```text
复杂写文件优先用 python_exec 通过 pathlib/json/csv 写入。
```

## 6. Python 执行工具

定义位置：

```text
src/agent_tool_specs/execution.py
```

主要工具：

- `python_exec`
- `python_package`
- `bash`
- `sleep`

### 6.1 `python_exec`

定位：

```text
结构化文件分析、JSON/JSONL 处理、批量校验、数据抽样、快速计算。
```

支持两种模式：

```text
code
  一次性 Python 代码。

script_path
  调用项目或 Skill 内已有脚本。
```

重要约束：

- 不用 `bash python ...`。
- 不在 `python_exec.code` 里用 subprocess 二次调用 Python 脚本。
- 临时文件写入 `PYTHON_EXEC_SCRATCHPAD`。
- 交付产物写入 session/output。

### 6.2 `python_package`

定位：

```text
给当前用户独立 Python venv 安装缺失包。
```

典型场景：

- `pandas`
- `pyarrow`
- `openpyxl`
- `elasticsearch`
- `urllib3`

设计上避免安装到项目 `.venv` 或系统 Python。

### 6.3 `bash`

`bash` 是兜底工具，不是默认 Python 执行方式。

适合：

- git 只读检查。
- 系统命令。
- 进程控制。
- 用户确认后的依赖安装或服务管理。

不适合：

- Python 数据分析。
- JSON/CSV 转换。
- 包安装。

## 7. 路径解析和 session 路由

关键实现：

```text
src/agent_tools.py:1589 _data_agent_output_path(...)
src/agent_tools.py:1624 _data_agent_session_output_root(...)
src/agent_tools.py:1630 _resolve_path(...)
src/agent_tools.py:1658 _session_logical_path(...)
src/agent_tools.py:1685 _execution_cwd(...)
```

逻辑路径会被映射到当前 session：

```text
output/...     -> session/output/...
outputs/...    -> session/output/...
scratchpad/... -> session/scratchpad/...
scratch/...    -> session/scratchpad/...
input/...      -> session/input/...
inputs/...     -> session/input/...
```

`python_exec` 的执行 cwd 优先是当前会话 scratchpad：

```text
src/agent_tools.py:1685 _execution_cwd(...)
```

## 8. data_agent 工具

声明位置：

```text
src/agent_tool_specs/data_agent.py
```

handler 注册位置：

```text
src/agent_tools.py:1033 build_data_agent_tools(...)
```

主要工具分两类：

### 8.1 前链路和 review 状态机

- `data_agent_load_input_sources`
- `data_agent_render_source_context`
- `data_agent_extract_case_evidence`
- `data_agent_prepare_generation_goal`
- `data_agent_confirm_generation_goal`
- `data_agent_prepare_generation_plan`
- `data_agent_show_generation_plan`
- `data_agent_update_generation_plan`
- `data_agent_confirm_generation_plan`

这类工具当前仍属于平台工具，因为它们维护 pending/confirmed 状态，以及产品数据生成的 review 门禁。

### 8.2 历史格式转换工具

- `data_agent_normalize_dataset_draft`
- `data_agent_validate_dataset_records`
- `data_agent_export_dataset_records`
- `data_agent_export_training_jsonl`
- `data_agent_export_planning_eval_csv`

这部分能力已经逐步迁移到 `skills/product-data/scripts/`，平台工具更多是历史兼容和适配层。

## 9. 工具设计原则

当前工具体系的技术取舍：

```text
模型负责决策。
工具负责执行。
Skill 负责流程经验。
脚本负责可迁移确定性能力。
```

工具描述要足够明确，否则模型会选错工具；参数 schema 要尽量简单，否则不同模型后端可能不兼容。
