# QQ Bot for Agents

通过 QQ 群调用 Agents 系统的桥接程序。

## 功能特性

- ✅ 支持通过 @ 机器人触发对话
- ✅ 支持创建/切换/查看对话
- ✅ 支持停止运行中的任务
- ✅ 实时推送工具调用信息和模型输出
- ✅ 支持发送工作区文件到 QQ 群（图片/普通文件）

## 系统要求

- Python 3.9+
- NapCat（已配置 HTTP Server）
- Agents 系统（Web 模式运行）
- aiohttp 库

## 安装依赖

```bash
pip install aiohttp
```

## 配置

### 1. NapCat 配置

确保 NapCat 已启用 HTTP Server，配置文件示例：

```json
{
  "network": {
    "httpServers": [
      {
        "name": "HttpServer",
        "enable": true,
        "host": "0.0.0.0",
        "port": 3000,
        "token": "your-token-here",
        "messagePostFormat": "array"
      }
    ]
  }
}
```

### 2. Agents 系统配置

确保 Agents Web 服务器正在运行：

```bash
cd /Users/jojo/Desktop/agents/正在修复中/agents
python web_server.py --port 8091
```

确保已创建 qqbot 用户：
- 用户名: qqbot
- 邮箱: qqbot@qq.com
- 密码: 12345678

### 3. 环境变量（可选）

可以通过环境变量覆盖默认配置：

```bash
export NAPCAT_HOST="http://localhost:3000"
export NAPCAT_TOKEN="your-token"
export AGENTS_HOST="http://localhost:8091"
export AGENTS_EMAIL="qqbot@qq.com"
export AGENTS_PASSWORD="12345678"
export TARGET_GROUP_ID="1092770403"
export LOG_LEVEL="INFO"
```

## 运行

```bash
cd /Users/jojo/Desktop/agents/正在修复中/agents
python -m scripts.qq_bot.main
```

或者：

```bash
cd /Users/jojo/Desktop/agents/正在修复中/agents/scripts/qq_bot
python main.py
```

## 使用方法

### 基本指令

在 QQ 群中 @ 机器人并发送以下指令：

#### 创建新对话
```
@机器人 /new
```

#### 查看最近对话
```
@机器人 /resume 10
```
获取最近 10 条对话的标题和 ID。

#### 切换对话
```
@机器人 /switch conv_20260315_162256_599
```

#### 停止当前任务
```
@机器人 /stop
```
只能在任务运行期间使用。

### 发送消息

直接 @ 机器人并发送消息：

```
@机器人 英伟达今天的股票价格是多少？
```

如果没有当前对话，会自动创建一个新对话。

### 发送文件

模型可以使用 `send_qq_file` 工具发送工作区内的文件：

```
@机器人 生成一张图表并发送给我
```

模型会调用工具生成图表，然后使用 `send_qq_file` 工具将图片发送到群里。

## 消息格式

### 工具调用

当模型调用工具时，会发送格式化的工具信息：

```
[工具] run_command
参数: ls -la

[工具] web_search
参数: 英伟达2026年3月15日股价
```

### 模型输出

模型的文本输出会直接发送到群里，不包含思考过程和工具结果。

## 架构说明

```
scripts/qq_bot/
├── __init__.py           # 包初始化
├── main.py              # 主程序入口
├── config.py            # 配置管理
├── napcat_client.py     # NapCat API 客户端
├── web_api_client.py    # Agents Web API 客户端
├── message_handler.py   # 消息处理器
├── state_manager.py     # 状态管理
├── poller.py            # HTTP 轮询器
└── README.md            # 本文档
```

### 工作流程

1. **消息接收**: HTTP 轮询器定期获取群消息
2. **消息解析**: 检测 @ 机器人的消息，解析指令或普通消息
3. **任务创建**: 通过 Web API 发送消息到 Agents 系统
4. **事件轮询**: 轮询任务状态，获取工具调用和模型输出
5. **消息推送**: 将工具调用和模型输出发送到 QQ 群

## 自定义工具

### send_qq_file

位置：`data/custom_tools/send_qq_file/`

功能：发送工作区内的文件到 QQ 群

参数：
- `file_path`: 文件相对路径（必填）
- `description`: 文件描述（可选）

示例：
```python
# 模型会这样调用
send_qq_file(file_path="output/chart.png", description="这是生成的图表")
```

## 注意事项

1. **单群模式**: 当前只支持一个群（TARGET_GROUP_ID）
2. **任务互斥**: 同一时间只能运行一个任务
3. **Docker 隔离**: qqbot 用户必须使用 Docker 模式，不能使用 host 模式
4. **文件路径**: send_qq_file 工具只能访问工作区内的文件
5. **消息轮询**: 使用 HTTP 轮询方式获取消息，可能有 1-2 秒延迟

## 故障排查

### 机器人无响应

1. 检查 NapCat 是否正常运行
2. 检查 Agents Web 服务器是否运行
3. 检查日志文件 `qq_bot.log`
4. 确认机器人 QQ 号是否正确

### 登录失败

1. 确认 qqbot 用户已创建
2. 检查邮箱和密码是否正确
3. 查看 Agents 日志确认登录请求

### 文件发送失败

1. 确认文件路径正确（相对于工作区）
2. 检查文件是否存在
3. 确认 NapCat 支持该文件类型
4. 查看日志了解详细错误信息

## 开发

### 添加新指令

在 `message_handler.py` 的 `_handle_command` 方法中添加新的指令处理：

```python
elif cmd == "/your_command":
    await self._cmd_your_command(args)
```

### 修改消息格式

在 `message_handler.py` 的 `_handle_tool_start` 和 `_handle_text_end` 方法中修改。

### 调整轮询间隔

修改 `config.py` 中的 `POLL_INTERVAL` 变量。

## 许可证

与 Agents 项目保持一致。
