Agent-Chat 模式对话流程分析
路由入口
**路径**: `/apps/<uuid:app_id>/chat-messages`
**控制器**: `ChatMessageApi.post()` (api/controllers/console/app/completion.py:129)
核心流程概览
1. 请求处理入口
```
ChatMessageApi.post()
↓
AppGenerateService.generate()
↓
AgentChatAppGenerator.generate()
```
2. 数据初始化与保存
2.1 初始化生成记录
**位置**: `MessageBasedAppGenerator._init_generate_records()`
**保存内容**:
-
**Conversation** (如果不存在则创建):
-
`app_id`, `app_model_config_id`
-
`mode` = "agent-chat"
-
`name` = 对话名称(基于query前20字符)
-
`inputs` = 用户输入变量
-
`invoke_from` = "debugger"
-
**Message** (总是创建新消息):
-
`conversation_id` = 关联的对话ID
-
`query` = 用户查询
-
`inputs` = 用户输入变量
-
`answer` = "" (初始为空,后续更新)
-
`message` = "" (初始为空,后续保存完整prompt)
-
`parent_message_id` = 父消息ID(如果有)
-
**MessageFile** (如果有上传文件):
-
关联到message_id
-
保存文件类型、URL、transfer_method等
**关键点**:
-
消息在生成前就创建并保存到数据库
-
`answer`字段初始为空,流式生成过程中逐步更新
3. 异步生成线程
3.1 启动工作线程
**位置**: `AgentChatAppGenerator._generate_worker()`
**流程**:
```
主线程: 创建worker线程 → 立即返回响应生成器
↓
Worker线程: AgentChatAppRunner.run()
↓
执行Agent逻辑(工具调用、LLM调用)
↓
通过QueueManager发布事件
```
3.2 Agent执行流程
**位置**: `AgentChatAppRunner.run()`
**步骤**:
- **准备Prompt消息**
-
组织prompt template
-
合并inputs、query、files
-
加载历史对话memory(如果有conversation_id)
- **内容审核** (Moderation)
-
检查用户输入是否违规
-
如违规,直接返回审核结果
- **选择Agent策略**
-
**Function Calling**: 如果模型支持工具调用
-
**Chain of Thought**: 如果模型不支持工具调用
- **执行Agent Runner**
-
`FunctionCallAgentRunner.run()` 或
-
`CotChatAgentRunner.run()`
4. 大模型调用流程
4.1 Function Calling Agent流程
**位置**: `FunctionCallAgentRunner.run()`
**循环执行**:
```
- 调用LLM (model_instance.invoke_llm)
↓
- 检查是否有tool_calls
↓
- 如果有工具调用:
-
创建AgentThought记录
-
执行工具调用 (ToolEngine.agent_invoke)
-
保存工具执行结果
-
将工具结果加入prompt_messages
-
继续循环
↓
- 如果没有工具调用:
-
返回最终答案
-
结束循环
```
**LLM调用**:
-
使用 `model_instance.invoke_llm()`
-
支持流式返回 (`stream=True`)
-
每次调用产生 `LLMResultChunk` 或 `LLMResult`
4.2 流式响应处理
**位置**: `FunctionCallAgentRunner.run()`
**流式chunk处理**:
-
每个chunk包含: `delta.message.content` (文本增量)
-
通过 `QueueLLMChunkEvent` 或 `QueueAgentMessageEvent` 发布
-
实时累加到 `final_answer`
5. SSE流式调度
5.1 响应生成器
**位置**: `AgentChatAppGenerator._handle_response()`
**流程**:
```
创建 EasyUIBasedGenerateTaskPipeline
↓
调用 process()
↓
返回流式响应生成器
```
5.2 事件监听与转换
**位置**: `EasyUIBasedGenerateTaskPipeline._process_stream_response()`
**事件类型**:
-
`QueueLLMChunkEvent`: LLM文本chunk → `MessageStreamResponse`
-
`QueueAgentMessageEvent`: Agent消息 → `AgentMessageStreamResponse`
-
`QueueAgentThoughtEvent`: Agent思考过程 → `AgentThoughtStreamResponse`
-
`QueueMessageEndEvent`: 消息结束 → `MessageEndStreamResponse`
-
`QueueErrorEvent`: 错误 → `ErrorStreamResponse`
**SSE格式转换**:
```python
位置: BaseAppGenerator.convert_to_event_stream()
for message in generator:
if isinstance(message, dict):
yield f"data: {json.dumps(message)}\n\n"
else:
yield f"event: {message}\n\n"
```
5.3 响应格式
**位置**: `AgentChatAppGenerateResponseConverter.convert_stream_full_response()`
**SSE事件格式**:
```json
{
"event": "message" | "agent_thought" | "message_end" | "error",
"conversation_id": "...",
"message_id": "...",
"created_at": 1234567890,
"answer": "文本内容", // 仅message事件
"task_id": "...", // 仅message_end事件
"metadata": {...} // 仅message_end事件
}
```
6. 数据保存更新
6.1 消息更新时机
**位置**: `EasyUIBasedGenerateTaskPipeline._save_message()`
**触发条件**: 收到 `QueueMessageEndEvent` 时
**更新内容**:
```python
message.message = prompt_messages_to_prompt_for_saving(...) # 完整prompt
message.message_tokens = usage.prompt_tokens
message.answer = llm_result.message.content.strip() # 最终答案
message.answer_tokens = usage.completion_tokens
message.total_price = usage.total_price
message.provider_response_latency = 响应延迟
message.message_metadata = metadata JSON
```
6.2 Agent思考记录
**位置**: `BaseAgentRunner.save_agent_thought()`
**保存时机**:
-
每次LLM调用后
-
每次工具调用后
**保存内容**:
-
`MessageAgentThought` 表:
-
`thought`: LLM的思考内容
-
`tool_name`: 调用的工具名
-
`tool_input`: 工具输入参数
-
`observation`: 工具执行结果
-
`answer`: LLM的回复
-
`answer_token`: token使用量
7. 完整时序图
```
客户端请求
↓
ChatMessageApi.post()
↓
AppGenerateService.generate()
↓
AgentChatAppGenerator.generate()
├─ 创建Conversation和Message (DB保存)
├─ 启动worker线程
└─ 返回响应生成器
↓
EasyUIBasedGenerateTaskPipeline.process()
↓
监听QueueManager事件
├─ QueueLLMChunkEvent → SSE推送文本chunk
├─ QueueAgentThoughtEvent → SSE推送思考过程
├─ QueueAgentMessageEvent → SSE推送Agent消息
└─ QueueMessageEndEvent → 保存完整消息到DB + SSE推送结束事件
Worker线程 (异步)
↓
AgentChatAppRunner.run()
↓
FunctionCallAgentRunner.run()
├─ 循环:
│ ├─ invoke_llm() → 调用大模型
│ ├─ 检查tool_calls
│ ├─ 执行工具调用
│ └─ 发布事件到QueueManager
└─ 发布QueueMessageEndEvent
```
关键数据表
-
**Conversation**: 对话记录
-
**Message**: 消息记录 (query + answer)
-
**MessageAgentThought**: Agent思考过程记录
-
**MessageFile**: 消息关联的文件
核心组件
-
**AppGenerateService**: 服务入口,路由到不同模式的Generator
-
**AgentChatAppGenerator**: Agent模式生成器,负责初始化和线程管理
-
**AgentChatAppRunner**: Agent执行器,组织prompt和选择策略
-
**FunctionCallAgentRunner**: Function Calling策略实现
-
**EasyUIBasedGenerateTaskPipeline**: 流式响应处理管道
-
**MessageBasedAppQueueManager**: 事件队列管理器
-
**AgentChatAppGenerateResponseConverter**: 响应格式转换器
总结
-
**数据保存**: 消息在生成前创建,生成完成后更新answer字段
-
**SSE流式**: 通过QueueManager事件机制,实时推送chunk到客户端
-
**大模型调用**: 在worker线程中异步执行,支持工具调用的循环推理