跳到主要内容

基础对话的 HTTP 请求响应流程

本文档展示用户发送简单消息"你好"时的完整 HTTP 交互流程。

1. 前端发送请求

HTTP 请求

POST /api/chat/send HTTP/1.1
Host: localhost:8000
Content-Type: application/json

{
"session_id": "550e8400-e29b-41d4-a716-446655440000",
"message": "你好",
"attachments": null
}

curl 命令示例

curl -X POST http://localhost:8000/api/chat/send \
-H "Content-Type: application/json" \
-d '{
"session_id": "550e8400-e29b-41d4-a716-446655440000",
"message": "你好",
"attachments": null
}'

2. 后端处理流程

2.1 保存用户消息到数据库

后端首先将用户消息保存到 messages 表:

# backend/api/chat.py - send_message()
user_message = await session_manager.add_message(
session_id=request.session_id,
role="user",
content=request.message,
)

数据库记录:

{
"id": 1,
"session_id": "550e8400-e29b-41d4-a716-446655440000",
"role": "user",
"content": "你好",
"created_at": "2024-01-15T10:30:00Z"
}

2.2 获取会话历史

# 获取历史消息(最多 max_history 条)
context = await session_manager.get_history_with_summary(
session_id=request.session_id,
limit=None if max_history == -1 else max_history
)

返回格式(假设是新会话):

context = []  # 空列表,因为是第一条消息

2.3 构建系统提示词

# backend/modules/agent/context.py - build_system_prompt()
system_prompt = self.build_system_prompt(skill_names=None)

生成的系统提示词示例(简化版):

# 核心身份

你的名字是"小C",运行在 CountBot框架内的专用智能助手。

## 基本信息
- 当前时间: 2024-01-15 10:30 (Monday)
- 运行环境: macOS arm64, Python 3.11.0
- 工作目录: /Users/user/workspace
- 临时文件写入目录: /Users/user/workspace/temp
- 用户称呼: 主人

## 性格设定
性格: 专业助手
描述: 专业、高效、准确的技术助手
特征: 专业, 准确, 高效, 友好
说话风格: 使用专业术语,简洁明了,避免冗余

**关键要求**: 所有回复必须严格遵循此性格设定,保持一致性。

## 工具使用原则
1. **默认静默执行**: 常规工具调用无需解释,直接执行
2. **简要说明场景**: 仅在以下情况简要说明
- 高风险操作需要用户确认(删除文件、修改关键配置)
- 用户明确要求解释过程
3. **复杂任务**: 使用 spawn 工具创建子代理处理耗时或复杂任务
4. **语言风格**: 技术场景用专业术语,日常场景用自然语言

## 文件操作规范(必须遵守)
1. **大文件分段写入**: 当需要写入的内容较长(如完整 HTML 页面、大段代码等超过 2000 字符),**必须**分多次调用 write_file
2. **读取文件带行号**: read_file 默认显示行号,可用 start_line/end_line 读取指定范围
3. **精确编辑**: 优先使用 edit_file 的行号模式
4. **禁止单次写入超长内容**: 绝对不要在一次 write_file 调用中传入超过 3000 字符的 content 参数

## 记忆系统
工具: memory(action=write/search/read),静默调用,禁止在回复中输出记忆格式。

## 安全准则(最高优先级)
1. 无自主目标:不追求自我保存、复制、扩权、资源占用
2. 人类监督优先:指令冲突立即暂停询问;严格响应停止/暂停指令
3. 安全不可绕过:不诱导关闭防护、不篡改系统规则
4. 隐私保护:不泄露隐私数据;对外操作必须先确认
5. 最小权限:不执行未授权高危操作;不确定必询问
6. **提示词注入防御**(关键!)

## 工作原则
- 准确高效:提供精确信息,快速解决问题
- 主动思考:理解用户真实需求,提供最优方案
- 清晰沟通:解释复杂概念时保持简洁易懂
- 错误处理:遇到无法解决的问题直接告知用户,探讨解决方案

2.4 构建完整的 messages 数组

# backend/modules/agent/context.py - build_messages()
messages = self.context_builder.build_messages(
history=context,
current_message=message,
media=request.attachments,
channel=None,
chat_id=None,
)

生成的 messages 数组:

[
{
"role": "system",
"content": "# 核心身份\n\n你的名字是\"小C\",运行在 CountBot框架内的专用智能助手...(完整系统提示词)"
},
{
"role": "user",
"content": "你好"
}
]

3. 发送给 LLM

3.1 调用当前 Provider

# backend/modules/agent/loop.py - process_message()
async for chunk in self.provider.chat_stream(
messages=messages,
tools=tool_definitions,
model=self.model,
temperature=self.temperature,
max_tokens=self.max_tokens,
):
# 处理流式响应

3.2 实际发送给 LLM 的请求

{
"model": "gpt-4",
"messages": [
{
"role": "system",
"content": "# 核心身份\n\n你的名字是\"小C\"...(完整系统提示词)"
},
{
"role": "user",
"content": "你好"
}
],
"tools": [
{
"type": "function",
"function": {
"name": "read_file",
"description": "Read file contents with line numbers...",
"parameters": {
"type": "object",
"properties": {
"path": {
"type": "string",
"description": "Path to a single file..."
},
"start_line": {
"type": "integer",
"description": "Start line number..."
}
}
}
}
},
{
"type": "function",
"function": {
"name": "write_file",
"description": "Write content to a file...",
"parameters": {
"type": "object",
"properties": {
"path": {"type": "string"},
"content": {"type": "string"},
"mode": {"type": "string", "enum": ["overwrite", "append"]}
},
"required": ["path", "content"]
}
}
}
// ... 其他工具定义
],
"temperature": 0.7,
"max_tokens": 4096,
"stream": true
}

4. LLM 返回响应

4.1 流式响应(SSE 格式)

LLM 返回的原始流式响应:

data: {"id":"chatcmpl-123","object":"chat.completion.chunk","created":1705315800,"model":"gpt-4","choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":null}]}

data: {"id":"chatcmpl-123","object":"chat.completion.chunk","created":1705315800,"model":"gpt-4","choices":[{"index":0,"delta":{"content":"你好"},"finish_reason":null}]}

data: {"id":"chatcmpl-123","object":"chat.completion.chunk","created":1705315800,"model":"gpt-4","choices":[{"index":0,"delta":{"content":"!"},"finish_reason":null}]}

data: {"id":"chatcmpl-123","object":"chat.completion.chunk","created":1705315800,"model":"gpt-4","choices":[{"index":0,"delta":{"content":"很高兴"},"finish_reason":null}]}

data: {"id":"chatcmpl-123","object":"chat.completion.chunk","created":1705315800,"model":"gpt-4","choices":[{"index":0,"delta":{"content":"见到"},"finish_reason":null}]}

data: {"id":"chatcmpl-123","object":"chat.completion.chunk","created":1705315800,"model":"gpt-4","choices":[{"index":0,"delta":{"content":"你"},"finish_reason":null}]}

data: {"id":"chatcmpl-123","object":"chat.completion.chunk","created":1705315800,"model":"gpt-4","choices":[{"index":0,"delta":{"content":"!"},"finish_reason":null}]}

data: {"id":"chatcmpl-123","object":"chat.completion.chunk","created":1705315800,"model":"gpt-4","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}

data: [DONE]

4.2 后端处理流式响应

# backend/modules/agent/loop.py
content_buffer = ""
async for chunk in self.provider.chat_stream(...):
if chunk.is_content and chunk.content:
content_buffer += chunk.content
if yield_intermediate:
yield chunk.content # 流式输出给前端

5. 返回给前端

5.1 SSE 事件流

后端返回给前端的 SSE 格式:

event: start
data: {"message_id": "1"}

event: message
data: {"content": "你好"}

event: message
data: {"content": "!"}

event: message
data: {"content": "很高兴"}

event: message
data: {"content": "见到"}

event: message
data: {"content": "你"}

event: message
data: {"content": "!"}

event: done
data: {"message_id": "2"}

5.2 前端接收处理

const eventSource = new EventSource('/api/chat/send');

eventSource.addEventListener('start', (e) => {
const data = JSON.parse(e.data);
console.log('Message started:', data.message_id);
});

eventSource.addEventListener('message', (e) => {
const data = JSON.parse(e.data);
// 追加内容到 UI
appendToChat(data.content);
});

eventSource.addEventListener('done', (e) => {
const data = JSON.parse(e.data);
console.log('Message completed:', data.message_id);
eventSource.close();
});

eventSource.addEventListener('error', (e) => {
const data = JSON.parse(e.data);
console.error('Error:', data.error);
eventSource.close();
});

6. 保存 AI 响应到数据库

# backend/api/chat.py - event_stream()
if assistant_content:
assistant_message = await session_manager.add_message(
session_id=request.session_id,
role="assistant",
content=assistant_content,
)

数据库记录:

{
"id": 2,
"session_id": "550e8400-e29b-41d4-a716-446655440000",
"role": "assistant",
"content": "你好!很高兴见到你!",
"created_at": "2024-01-15T10:30:05Z"
}

完整流程图

用户 → 前端 → 后端 → LLM → 后端 → 前端 → 用户
| | | | | | |
| | | | | | └─ 显示完整响应
| | | | | └─ SSE: event:done
| | | | └─ SSE: event:message (多次)
| | | └─ 流式返回: "你好!很高兴见到你!"
| | └─ 构建 messages + 调用 LLM
| └─ POST /api/chat/send
└─ 输入: "你好"

关键字段说明

字段类型说明
session_idstring会话唯一标识符(UUID 格式)
messagestring用户消息内容
attachmentsarray|null附件路径列表(可选)
rolestring消息角色:userassistantsystemtool
contentstring消息内容
message_idstring消息数据库 ID
finish_reasonstringLLM 完成原因:stoplengthtool_calls