# 工具集成

工具（Tools）让助手能够执行外部操作，如查询天气、搜索信息、调用 API 等。

## 概述

工具是助手能力的扩展。当用户的请求需要外部数据或操作时，助手会调用相应的工具。

## 内置工具

| 工具 | 说明 | 参数 |
|------|------|------|
| `search` | 网络搜索 | query: 搜索关键词 |
| `weather` | 天气查询 | city: 城市名称 |
| `calculator` | 数学计算 | expression: 计算表达式 |
| `knowledge` | 知识库检索 | query: 查询内容 |

### 启用内置工具

在助手配置的 **工具** 标签页：

1. 勾选需要启用的工具
2. 配置工具参数（如有）
3. 保存配置

## 自定义工具

支持通过 HTTP 回调实现自定义工具。

### 定义工具

```json
{
  "name": "query_order",
  "description": "查询用户订单信息",
  "parameters": {
    "type": "object",
    "properties": {
      "order_id": {
        "type": "string",
        "description": "订单编号"
      }
    },
    "required": ["order_id"]
  },
  "endpoint": {
    "url": "https://api.example.com/orders",
    "method": "GET",
    "headers": {
      "Authorization": "Bearer {{api_key}}"
    }
  }
}
```

### 工具字段说明

| 字段 | 说明 |
|------|------|
| name | 工具名称（英文标识符） |
| description | 工具描述（LLM 用于理解工具用途） |
| parameters | 参数定义（JSON Schema 格式） |
| endpoint | HTTP 调用配置 |

### 参数映射

工具参数自动映射到 HTTP 请求：

- **GET 请求**：参数作为 query string
- **POST 请求**：参数作为 JSON body

## 客户端工具

某些工具需要在客户端执行（如获取地理位置）。

### 工作流程

1. 助手返回 `assistant.tool_call` 事件
2. 客户端执行工具并获取结果
3. 客户端发送 `tool_call.results` 消息
4. 助手继续生成回复

### 服务端事件

```json
{
  "type": "assistant.tool_call",
  "data": {
    "tool_call_id": "call_abc123",
    "tool_name": "get_location",
    "arguments": {}
  }
}
```

### 客户端响应

```json
{
  "type": "tool_call.results",
  "results": [
    {
      "tool_call_id": "call_abc123",
      "name": "get_location",
      "output": {
        "latitude": 39.9042,
        "longitude": 116.4074,
        "city": "北京"
      },
      "status": {
        "code": 200,
        "message": "ok"
      }
    }
  ]
}
```

## 工具调用示例

### 天气查询

用户："北京今天天气怎么样？"

助手调用工具：
```json
{
  "tool_name": "weather",
  "arguments": {
    "city": "北京"
  }
}
```

工具返回：
```json
{
  "temperature": 25,
  "condition": "晴",
  "humidity": 40
}
```

助手回复："北京今天天气晴朗，气温 25 度，湿度 40%。"

### 订单查询

用户："帮我查一下订单 12345"

助手调用工具：
```json
{
  "tool_name": "query_order",
  "arguments": {
    "order_id": "12345"
  }
}
```

工具返回：
```json
{
  "order_id": "12345",
  "status": "已发货",
  "tracking": "SF1234567890"
}
```

助手回复："您的订单 12345 已发货，快递单号是 SF1234567890。"

## 工具配置最佳实践

### 1. 清晰的描述

工具描述应该让 LLM 准确理解何时使用：

```
好的描述：
"查询指定城市的实时天气信息，包括温度、天气状况和湿度"

不好的描述：
"天气工具"
```

### 2. 完整的参数定义

```json
{
  "parameters": {
    "type": "object",
    "properties": {
      "city": {
        "type": "string",
        "description": "城市名称，如 '北京'、'上海'"
      },
      "date": {
        "type": "string",
        "description": "日期，格式 YYYY-MM-DD，可选，默认今天"
      }
    },
    "required": ["city"]
  }
}
```

### 3. 错误处理

工具应返回清晰的错误信息：

```json
{
  "status": {
    "code": 404,
    "message": "未找到该城市的天气数据"
  }
}
```

## 安全注意事项

1. **验证输入** - 不要直接信任用户输入
2. **限制权限** - 工具只应有必要的权限
3. **审计日志** - 记录所有工具调用
4. **速率限制** - 防止滥用

## 下一步

- [知识库配置](knowledge-base.md) - 让助手具备专业知识
- [工作流编排](workflows.md) - 复杂对话流程
