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线程中异步执行,支持工具调用的循环推理

相关推荐
徐114 小时前
自动化检测系统投资回报分析:思看科技如何助力企业降本增效
python·科技·物联网·自动化
q_35488851534 小时前
机器学习:Python地铁人流量数据分析与预测系统 基于python地铁数据分析系统+可视化 时间序列预测算法 ✅
大数据·人工智能·python·算法·机器学习·信息可视化·数据分析
rgb2gray5 小时前
AI 的“诚实”指南:一文详解 Conformal Prediction (共形预测) 与 Split Conformal
人工智能·python·机器学习·数据分析·可解释·共性预测·一致性预测
hakesashou5 小时前
python 如何使数组中的元素不重复
开发语言·python
Filotimo_5 小时前
JWT的概念
java·开发语言·python
Agilex松灵机器人5 小时前
持续更新|从零到玩转Moveit机械臂控制(一)
人工智能·python·机器人·学习方法
喵手5 小时前
《Python爬虫工程化实战》专栏导读|从“脚本能跑”到“系统能交付”:零基础也能做出可部署的 Python 爬虫!
爬虫·python·网络爬虫·爬虫实战·python爬虫·python爬虫工程化·爬虫实战教学
子午5 小时前
【2026原创】卫星遥感图像识别系统+Python+深度学习+人工智能+算法模型+TensorFlow
人工智能·python·深度学习