[任务规划完成]
让我先查看项目的路由配置和相关文件,确认接口的完整路径和请求参数格式。
[读取文件]
现在让我再看一下常量定义,确认 Header 的 key 名称:
[读取文件]
现在我掌握了所有信息。以下是完整的测试指南:


如何测试 Chat 接口

接口信息

从配置文件中可以看到:

配置
监听 IP 0.0.0.0
监听端口 8086
路由前缀 /openclaw/api
接口路径 POST /chat

所以完整的接口地址是:http://localhost:8086/openclaw/api/chat

请求参数说明

chat_controller.goChat 方法可以看到,请求分为两部分:

  1. HTTP Header(由 ParseHeaderToAidContext 解析):

    • User-Id:用户 ID(必填,校验逻辑会用到)
    • Env-Id:环境/会话 ID
    • Task-Id:任务 ID
    • Bot-Id:Bot ID
    • Request-Id:请求 ID
  2. JSON Body(由 tool.RequestParam 解析为 ChatRequest):

    • content:消息内容

用 curl 发送测试请求

1
2
3
4
5
6
7
8
9
curl -X POST http://localhost:8086/openclaw/api/chat \
-H "Content-Type: application/json" \
-H "User-Id: user_3c0a8d30ff7d4e9fa497e5c0ef737c59" \
-H "Env-Id: test_env_001" \
-H "Task-Id: test_task_001" \
-H "Bot-Id: openclaw_bot" \
-d '{
"content": "你好,请问现在使用的是什么模型?"
}'

预期响应

✅ 场景 1:用户在数据库中有 is_use=1 的记录

服务会返回空 JSON(异步模式),HTTP 200:

1
{}

然后在后台异步将消息转发给 OpenClaw 服务器。

❌ 场景 2:用户不在数据库中 / 没有启用的配置

会返回错误信息,类似:

1
2
3
4
{
"code": -1,
"msg": "用户 user_3c0a8d30ff7d4e9fa497e5c0ef737c59 没有可用的 OpenClaw 服务器配置,请先配置服务器地址"
}

❌ 场景 3:缺少 User-Id Header

1
2
3
4
# 不传 User-Id 测试
curl -X POST http://localhost:8086/openclaw/api/chat \
-H "Content-Type: application/json" \
-d '{"content": "hello"}'

会返回:

1
2
3
4
{
"code": -1,
"msg": "缺少 User-Id,无法处理请求"
}

测试步骤建议

第一步:先测试用户校验(不需要 OpenClaw 服务器也能测)

直接发送请求,因为数据库中可能还没有配置该用户的记录,所以会触发校验失败的错误,这说明整个链路(HTTP → Controller → Service → DAO → MySQL)是通的:

1
2
3
4
5
6
curl -v -X POST http://localhost:8086/openclaw/api/chat \
-H "Content-Type: application/json" \
-H "User-Id: user_3c0a8d30ff7d4e9fa497e5c0ef737c59" \
-H "Env-Id: test_env_001" \
-H "Task-Id: test_task_001" \
-d '{"content": "hello"}'

第二步:在数据库中插入一条测试数据

1
2
INSERT INTO openclaw_server_config (user_id, pod_ip, port, is_use)
VALUES ('user_3c0a8d30ff7d4e9fa497e5c0ef737c59', '127.0.0.1', 8888, 1);

第三步:再次发送请求,验证校验通过

1
2
3
4
5
6
curl -v -X POST http://localhost:8086/openclaw/api/chat \
-H "Content-Type: application/json" \
-H "User-Id: user_3c0a8d30ff7d4e9fa497e5c0ef737c59" \
-H "Env-Id: test_env_001" \
-H "Task-Id: test_task_001" \
-d '{"content": "你好"}'

此时如果数据库校验通过,会返回空响应 {},后台 goroutine 会尝试将消息转发给 OpenClaw 服务器(http://127.0.0.1:8888/metis/events)。

第四步:查看日志确认完整流程

日志配置为文件输出(log/openclaw_assistant.log),可以用 tail -f 实时查看:

1
tail -f log/openclaw_assistant.log

日志中你应该能看到类似的输出:

1
2
3
[Chat] 收到请求: {...}
[Chat] 用户 user_3c0a8d30ff7d4e9fa497e5c0ef737c59 的 OpenClaw 服务器: 127.0.0.1:8888
[processMessage] 开始处理, envId: test_env_001, ...

整体流程图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
sequenceDiagram
participant You as 你 (curl)
participant Server as Server (:8086)
participant DB as MySQL
participant OC as OpenClaw (:8888)

You->>Server: POST /openclaw/api/chat<br/>Header: User-Id, Env-Id, Task-Id<br/>Body: {"content": "你好"}
Server->>Server: ChatController 解析 Header + Body
Server->>DB: SelectByUserId(user_id)

alt 用户无配置
DB-->>Server: 空列表
Server-->>You: 返回错误 "没有可用的服务器配置"
else 用户有配置 (is_use=1)
DB-->>Server: 返回配置 [ip:port]
Server-->>You: 立即返回 {} (HTTP 200)
Server->>Server: 启动异步 goroutine
Server->>OC: POST /metis/events (Metis 事件)
OC-->>Server: 异步回调 /openclaw/api/messages
end