Agent-Chat模式核心流程解析

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()`

**步骤**:

  1. **准备Prompt消息**
  • 组织prompt template

  • 合并inputs、query、files

  • 加载历史对话memory(如果有conversation_id)

  1. **内容审核** (Moderation)
  • 检查用户输入是否违规

  • 如违规,直接返回审核结果

  1. **选择Agent策略**
  • **Function Calling**: 如果模型支持工具调用

  • **Chain of Thought**: 如果模型不支持工具调用

  1. **执行Agent Runner**
  • `FunctionCallAgentRunner.run()` 或

  • `CotChatAgentRunner.run()`

4. 大模型调用流程

4.1 Function Calling Agent流程

**位置**: `FunctionCallAgentRunner.run()`

**循环执行**:

```

  1. 调用LLM (model_instance.invoke_llm)

  1. 检查是否有tool_calls

  1. 如果有工具调用:
  • 创建AgentThought记录

  • 执行工具调用 (ToolEngine.agent_invoke)

  • 保存工具执行结果

  • 将工具结果加入prompt_messages

  • 继续循环

  1. 如果没有工具调用:
  • 返回最终答案

  • 结束循环

```

**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

```


关键数据表

  1. **Conversation**: 对话记录

  2. **Message**: 消息记录 (query + answer)

  3. **MessageAgentThought**: Agent思考过程记录

  4. **MessageFile**: 消息关联的文件


核心组件

  • **AppGenerateService**: 服务入口,路由到不同模式的Generator

  • **AgentChatAppGenerator**: Agent模式生成器,负责初始化和线程管理

  • **AgentChatAppRunner**: Agent执行器,组织prompt和选择策略

  • **FunctionCallAgentRunner**: Function Calling策略实现

  • **EasyUIBasedGenerateTaskPipeline**: 流式响应处理管道

  • **MessageBasedAppQueueManager**: 事件队列管理器

  • **AgentChatAppGenerateResponseConverter**: 响应格式转换器


总结

  1. **数据保存**: 消息在生成前创建,生成完成后更新answer字段

  2. **SSE流式**: 通过QueueManager事件机制,实时推送chunk到客户端

  3. **大模型调用**: 在worker线程中异步执行,支持工具调用的循环推理

相关推荐
Java后端的Ai之路4 小时前
【Python 教程15】-Python和Web
python
冬奇Lab5 小时前
一天一个开源项目(第15篇):MapToPoster - 用代码将城市地图转换为精美的海报设计
python·开源
二十雨辰7 小时前
[python]-AI大模型
开发语言·人工智能·python
Yvonne爱编码7 小时前
JAVA数据结构 DAY6-栈和队列
java·开发语言·数据结构·python
前端摸鱼匠8 小时前
YOLOv8 环境配置全攻略:Python、PyTorch 与 CUDA 的和谐共生
人工智能·pytorch·python·yolo·目标检测
WangYaolove13148 小时前
基于python的在线水果销售系统(源码+文档)
python·mysql·django·毕业设计·源码
AALoveTouch8 小时前
大麦网协议分析
javascript·python
ZH15455891319 小时前
Flutter for OpenHarmony Python学习助手实战:自动化脚本开发的实现
python·学习·flutter
xcLeigh9 小时前
Python入门:Python3 requests模块全面学习教程
开发语言·python·学习·模块·python3·requests
xcLeigh9 小时前
Python入门:Python3 statistics模块全面学习教程
开发语言·python·学习·模块·python3·statistics