34 KiB
Agent模式低延迟响应升级规划
1. 背景
当前项目里的 Agent模式 已经具备以下能力:
- 能做意图分析
- 能做 Planner + Specialist 路由
- 能做修图 / 生图 / 视频 / 画布等执行
- 能在部分链路里把结果同步回无限画布
但当前用户体感仍然存在两个明显问题:
-
首响应偏慢
很多请求要先完成 Agent 分析、规划、模型路由,用户才看到第一句回复。 -
Agent模式下经常出现“双模型串行”
典型现象是:doubao-seed-2-0-mini-260215先负责分析 / 规划- 再由另一个模型(例如
Gemini-3.1-pro)负责最终回复
这会导致重复算力、延迟增大、体验不稳定。
本规划目标是把 Agent模式 升级成更接近 Gemini / 豆包官方产品体验的“立即首响应 + 后台继续分析 / 执行”的编排模型。
2. 当前架构现状
2.1 Agent Graph
当前自动链路位于:
lib/ai/auto-agent-graph.ts
现有节点结构:
analyzeplanprepareExecutionoptimizerouteModel
当前问题:
runAutoAgentGraph()先完整执行一轮图,再把结果交给聊天接口- 用户首条可见回复往往晚于 Agent 分析完成
2.1.1 当前 Graph 的真实节点职责
当前 lib/ai/auto-agent-graph.ts 中的链路是:
analyzeplanprepareExecutionoptimizerouteModel
其中职责分别是:
analyze- 调用
smart-analyzer做意图分析 - 输入包含:
- 文本
- 当前图片 / 历史图片
- 画布上下文
- 历史消息
- 调用
plan- 根据
analysis和当前可用工具生成执行计划 - 已接入
Skill Router + Specialist
- 根据
prepareExecution- 把
plan归一化为执行层可消费的数据结构 - 产出
shouldApplyImagePipeline / shouldApplyVideoPipeline / shouldStayConversational
- 把
optimize- 执行类任务才走提示词优化
- 视频生成会额外生成 storyboard 规划
routeModel- 调用
routeToModel()选择最终回复或执行模型
- 调用
当前最关键的问题是:
- 这是一条完整前置型链路
- 即使用户只是普通聊天或看图问答,也要先经过整套分析 / 规划 / 路由,才能真正开始回复
2.2 Model Router
当前聊天 / 识图 / 修图 / 生图 / 视频路由位于:
lib/ai/model-router.ts
当前问题:
chat和vision仍会进入统一routeToModel()逻辑- 对于
Agent模式下的respond / analyze_image,最终回复模型并未被锁定为 Agent 默认模型
2.2.1 当前聊天路由为什么会选到 Gemini
当前 lib/ai/model-router.ts 中:
chat.providerTypes = ["alibaba", "zhipu", "openai", "custom", "local", "gemini", "huanke-gemini", "volcano-multimodal"]vision.providerTypes = ["alibaba", "zhipu", "openai", "custom", "gemini", "huanke-gemini", "volcano-multimodal"]
这意味着:
- 挂在
openaiprovider 下的多模态模型 - 会优先于挂在
customprovider 下的多模态模型被选中
当前线上现象:
Gemini-3.1-pro挂在openaidoubao-seed-2-0-mini-260215挂在custom
所以在 chat / vision 路由阶段:
Gemini-3.1-pro会先被挑中
另外,当前 routeToModel() 会优先剔除带 agentAutoModel 标记的模型,这也进一步放大了“Agent 默认模型只负责分析,不负责最终回复”的问题。
2.3 Chat API
当前主请求入口位于:
app/(chat)/api/chat/route.ts
当前问题:
Smart Auto Mode的首响应依赖完整 Agent 分析结果- 对执行型任务虽然已有直连 executor,但没有统一的“立即确认”层
selectedChatModel = "auto"时,用户理解是“Agent模式”,而系统实际行为是“自动路由模式”
2.3.1 当前 Agent模式 的真实执行语义
在前端:
selectedChatModel = "auto"被展示为Agent模式
但在后端:
auto的真实语义是“允许后端自动分析并路由”- 并不等于“强制使用 Agent 默认模型”
因此当前会出现:
- Agent 默认模型负责分析 / 规划
routeToModel(chat/vision)再次挑选最终回复模型- 最终回复模型可能变成另一个模型
这也是用户感知上“明明选了 Agent 模式,为什么回复的是 Gemini”的根因。
2.3.2 当前首响应为什么慢
app/(chat)/api/chat/route.ts 中,Smart Auto Mode 在真正输出前要做:
- 历史消息装载
- 目标图解析
runAutoAgentGraph()- 分析结果、计划、推荐参数、路由结果整理
所以用户在很多情况下要等这一整段完成,才会看到第一句消息。
2.4 Specialist Executor
当前 specialist 能力已接入:
lib/ai/skill-router.tslib/ai/specialists/index.ts
当前优点:
conversation / vision / image_edit / image_generate / video_generate / canvas已能收敛计划- 修图、生图、视频已具备直接执行入口
当前缺口:
respond / analyze_image场景还没有“锁定 Agent 默认模型”的最终回复约束
2.4.1 当前已落地的可执行能力
目前 Specialist 已经不只是“会判断”,而是具备以下确定性执行能力:
removeBackgroundresizeImageextendImageboxCutoutgenerateImagegenerateVideopublishToCanvas
这部分意味着:
- 执行型任务已经具备基础能力
- 当前最该补的是响应编排,不是再扩执行工具数量
2.5 Smart Analyzer 当前行为
当前 lib/ai/smart-analyzer.ts 不是“先规则后 LLM,规则命中就结束”的结构。
真实行为是:
quickKeywordMatch()目前固定返回低置信度0.3- 这会强制大多数请求进入 LLM analyzer
- analyzer 再结合图片与上下文生成:
intentsubIntentconversationalReplyclarifyingQuestions
这带来的影响是:
- 即使是简单聊天,也很容易先走一轮 LLM 分析
- 首响应进一步变慢
这也是后续要加入 preResponseClassifier 的原因之一。
2.6 Agent 默认模型当前真实角色
当前 Agent 默认模型主要承担:
- Analyzer
- Planner
- Strategy / Prompt 生成
但在当前实现里,它不是最终回复模型的强约束来源。
这是体验和成本问题的关键根因。
2.7 当前前端对话渲染架构
当前聊天渲染并不是纯文本直出,已经具备一部分富文本能力。
2.7.1 当前渲染链路
主要文件:
components/message.tsxcomponents/elements/response.tsxcomponents/elements/code-block.tsx
当前行为:
Message层按message.parts分发不同内容类型- 文本内容进入
Response Response基于Streamdown渲染 Markdown- 代码块进入
CodeBlock - 图片和视频使用专用预览组件渲染
2.7.2 当前已经具备的能力
当前前端已经具备以下基础能力:
- Markdown 渲染
- 标题、列表、引用、加粗
- fenced code block
- 代码复制按钮
- 图片 / 视频专用渲染
- 局部折叠式“图片分析”卡片
- tool result 专用渲染
这说明我们不是“完全没有结构化对话能力”,而是缺少稳定的输出协议与按内容类型分层的前端呈现。
2.7.3 当前缺口
和 Gemini / 豆包官方体验相比,当前主要缺口是:
-
模型输出协议不稳定
同一类回答有时是散文、有时是 Markdown、有时是结构块混排。 -
所有文本基本走同一个
Response渲染器
聊天、识图、执行说明、代码、表格没有做 profile 分层。 -
代码仍主要表现为聊天消息中的代码块
还没有升级成真正的文件 / 工件 / 模块级展示。 -
表格虽可被 Markdown 渲染,但没有专门做交互层增强
例如:- 表格横向滚动优化
- 单元格复制
- 表头固定样式
- 数据块折叠
-
执行型消息和普通对话消息共用同一套结构
这也是为什么生图模式和普通对话模式很容易互相影响展示体验。
2.8 新增“前置模型”标签的配置建议
建议把“前置模型”作为模型标签落到模型能力字段中,而不是单独硬编码在 provider 上。
推荐存储方式:
capabilities.presenterModel = true
原因:
- 与现有:
multimodalModelagentAutoModel的能力标记路线一致
- 不绑定特定 provider
- 便于未来支持多个前置模型候选
前端配置入口建议:
- 系统设置
- AI 模型设置
- 模型标签区域新增:
前置模型
运行时选择规则:
- 优先
presenterModel = true - 再要求模型启用
- 再要求支持当前场景所需能力
- 多个候选时,优先:
isDefault = true- 更小的
sortOrder
3. 核心问题定义
3.1 为什么官方产品看起来“秒回”
核心不是模型瞬间完成了全部思考,而是响应被拆成了多层:
- 先输出一句极短确认
- 同时启动流式输出
- 把重分析、工具执行、图片理解放到后台继续做
- 再分阶段把结果逐步渲染给用户
3.2 当前项目慢在哪里
当前大量请求是这条顺序:
- 先 Agent 分析
- 再 Planner
- 再路由模型
- 再开始真正回复或执行
这意味着:
- 首 token 被前置分析阻塞
- 普通聊天 / 看图问答也走重链路
Agent默认模型 + 最终回复模型两段式造成重复开销
补充一条当前非常关键的现状:
- 当前并不是“Agent 模型不够快”
- 而是“系统把首响应交给了完整链路”
所以第一优先级不应该是“先换更快模型”,而应该是:
- 先把首响应从重链路里拆出来
3.3 当前 Agent模式 的语义不清晰
对用户来说:
Agent模式应该意味着“由后台配置的 Agent 默认模型来智能处理”
但对系统来说:
selectedChatModel = "auto"只是“后端自动路由”- 所以最终回复模型可能不是 Agent 默认模型
这会造成用户感知和系统行为不一致。
3.4 当前是否需要先引入一个火山引擎快速模型做前置对话
结论:
- 不是第一优先级
- 但可以作为 Phase 3 之后的可选增强项
原因:
-
首确认消息本身不应该依赖任何模型
最快的方案应该是:- 规则判断
- 直接输出短确认
- 不消耗模型推理时间
-
当前的主要瓶颈不是模型本体,而是编排方式
在现状下,即使换一个更快的火山模型:- 仍然会先经历 Analyzer / Planner / Route
- 仍然可能有二次模型切换
- 所以收益不会最大
-
真正值得引入“快速前置模型”的场景是
在完成 Phase 1 和 Phase 2 后,如果:respond / analyze_image的 P95 延迟仍偏高- 当前 Agent 默认模型无法在体验上达到目标 才考虑增加一个:
- 更轻量
- 支持 vision
- OpenAI-compatible 的火山快速模型,用于“首段实质性回复”
推荐原则:
- 首确认消息:不能是空模板,应至少体现对象 / 动作 / 目标
- 首段真实分析内容:优先继续用当前 Agent 默认模型
- 只有测下来仍慢:再考虑引入更快火山模型
3.4.1 为什么不能做“纯假首确认”
如果首确认只是固定模板,例如:
收到我先看看正在分析
这种做法虽然快,但会明显损伤体验:
- 用户会一眼看出这是“假动作”
- 不体现对象、动作、目标,无法建立“系统真的理解我了”的信任感
- 对长对话和多模态任务尤其突兀
因此本规划不建议做“纯模板 Fast Ack”,而应该做两类更合理的前置响应:
-
轻量语义确认
- 通过轻量规则先抽出:
- 对象:图片 / 海报 / 书柜 / 视频
- 动作:识别 / 修改 / 生成 / 分析
- 目标:看内容 / 保留风格 / 替换背景 / 生成方案
- 再拼成一条短而真实的确认句
- 通过轻量规则先抽出:
-
主持人模型首句
- 用极快的前置模型生成 1 句短确认
- 严格限制字数、预算和职责
- 这条消息只负责“真实理解确认”,不负责完整分析
3.4.2 “主持人模型”在本项目里的合理定位
如果确定要引入一个火山引擎快速模型,最合理的定位不是替代 Agent 默认模型,而是:
- 前台主持人
- 后台 Agent 默认模型继续做深分析 / 规划 / 工具执行
推荐增加一个新的模型标签:
前置模型
用途:
- 被设置为该标签的模型,进入“主持人模型候选池”
主要主持人模型选择规则建议:
-
优先选择同时满足:
- 已启用
- 带
前置模型标签 - 非图片生成模型
- 支持当前场景所需能力
-
如果候选不止一个,优先级为:
isDefault = true的前置模型sortOrder更靠前的前置模型- 最后按创建顺序或名称稳定排序
-
如果不存在前置模型:
- 回退到“轻量语义确认”
- 不阻塞主 Agent 链路
职责分工建议:
-
主持人模型
- 目标:在
300ms ~ 1200ms内输出一条短确认 - 职责:
- 复述用户意图
- 提示当前处理方向
- 不做完整规划
- 不做工具决策
- 目标:在
-
Agent 默认模型
- 目标:完成真正的理解、规划、识图、工具编排
- 职责:
- 深度分析
- 长上下文和工作记忆整合
- Specialist 计划生成
respond / analyze_image最终回复
3.4.3 火山引擎快速模型为什么值得作为候选
根据火山引擎官方资料,当前可考虑的方向包括:
-
Doubao-Seed-1.6-flash
- 火山引擎开发者社区资料中强调:
- 极致速度
- 多模态
- 256K 上下文
- TPOT 约 10ms
来源:Doubao-Seed-1.6-flash 介绍
- 火山引擎开发者社区资料中强调:
-
Prefill
- 火山引擎官方文档明确说明:
Prefill: true可显著降低首字延迟
- 对支持深度思考的模型,建议关闭 thinking,避免回复延迟过高
来源:配置大模型 LLM
- 火山引擎官方文档明确说明:
这意味着,如果我们要做“主持人模型”路线,火山引擎确实是合理候选。
3.4.4 但为什么它仍然不是短期第一步
即使有更快模型,如果以下问题不先处理:
respond / analyze_image仍然二次路由- 首响应仍被前置完整 Agent 链路阻塞
- 执行型任务没有前置确认层
那么只加一个更快模型,收益仍然会被结构性延迟抵消。
因此:
- 短期:先修编排,再上主持人模型
- 中期:主持人模型接入为增强项
4. 升级目标
4.1 用户体验目标
- 首响应时间控制在
300ms ~ 1500ms 聊天 / 识图场景下,明显减少等待空窗- 执行类任务先出现“已收到、正在处理”的即时反馈
- 保留无限画布、占位图、工具执行、结果回传能力
4.2 技术目标
respond / analyze_image单模型直出edit_image / generate_image / generate_video多模型协同执行- 将“Agent默认多模态模型”从“仅分析模型”升级为“聊天 / 识图场景的最终回复模型”
- 保持现有 Specialist Executor 结构不推翻重来
- 让
Agent模式的用户语义与系统语义重新一致 - 对话输出升级为“结构化 Markdown + 专用渲染器”
- 对话体验升级不能破坏生图模式现有图片结果结构
- 预留“火山主持人模型”前置能力,但不取代 Agent 默认模型
- 增加模型标签
前置模型,用于选择主持人模型 - 建立主持人模型与 Agent 模型的平滑交接协议,避免语义重复与输出冲突
5. 目标行为定义
5.1 聊天 / 识图
当 nextAction 为:
respondanalyze_image
且 Agent 默认模型具备所需能力时:
- 直接锁定最终回复模型为后台配置的 Agent 默认模型
- 不再走
routeToModel(chat/vision)的二次挑选
目标效果:
doubao-seed-2-0-mini-260215既做分析,也做最终回复- 避免出现“豆包分析 + Gemini回复”的双模型串行
- 避免在
auto模式下再次被openaiprovider 下的 Gemini 抢走
5.2 修图 / 生图 / 视频
当 nextAction 为:
edit_imagegenerate_imagegenerate_video
目标行为:
- 先立即发确认消息
- 再显示状态占位
- 后台继续跑 Specialist Executor
- 最终把结果补回消息流和画布
补充说明:
- 这类任务仍然保留多模型协作
- 因为真正的价值在执行模型能力,而不是聊天首响应速度
5.3 超长规划型请求
例如:
- 长提示词分析
- 多阶段方案规划
- 大量上下文组合任务
目标行为:
- 先发极短确认
- 后台完成 Planner
- 再增量补出结构化结果
5.4 结构化对话输出
当场景为:
- 普通聊天
- 识图分析
- 方案建议
- 代码输出
- 数据表格
目标行为:
- 模型输出遵循稳定结构协议
- 前端按内容类型使用专用渲染
- 代码 / 表格 / 分析块具备清晰交互
5.5 生图模式不受影响
升级原则:
- 生图 / 修图结果仍然保持当前图片卡片和占位图机制
- 结构化对话升级只增强:
- 聊天文本
- 识图分析
- 执行计划
- 代码 / 表格 / 数据类内容
不改变:
- 图片 Markdown 结果协议
- 图片结果回画布机制
- 图片占位图和状态流
5.6 主持人模型接管协议
当系统启用“主持人模型”时,必须遵守以下行为约束:
A. 主持人模型只负责前台第一段响应
主持人模型只允许做:
- 复述用户当前目标
- 告知正在处理的方向
- 给出非常短的过渡性说明
主持人模型禁止做:
- 最终结论
- 详细方案
- 工具决策说明
- 最终代码 / 表格 / 执行报告
- 与 Agent 最终结果语义重叠的大段内容
B. Agent 模型负责真正的最终内容
Agent 默认模型负责:
- 深度理解
- 长上下文整合
- Specialist 路由
- 工具执行决策
- 最终可持久化回复
C. 主持人输出默认视为“瞬时前言”
为避免重复和冲突,主持人模型的输出默认不直接持久化为最终聊天记录,而是:
- 作为 SSE / 流式的临时前言展示
- Agent 最终回复准备好后,被替换或无缝续接
- 只有当 Agent 超时或失败时,才将主持人前言作为兜底消息保留
这样可以避免:
- 两条助手消息重复
- 先说一遍、后面又完整重复一遍
- 数据库存入大量低价值“前言消息”
D. 必须建立平滑交接边界
主持人模型在说话过程中,要持续监控 Agent 模型是否已经准备完毕。
一旦 Agent 已经具备输出条件,主持人模型应:
- 在句末自然收束
- 停止继续扩写
- 把话语权移交给 Agent 最终结果
交接必须满足:
- 在自然停顿点结束
- 不截断半句话
- 不和 Agent 内容重叠
推荐的收束边界:
- 一句话结束后停止
- 或一个很短的两句确认后停止
E. 语义必须分层,避免重复
建议做两层语义协议:
-
主持人语义层
- 只说“我理解你要做什么 / 我接下来会先做什么”
-
Agent 语义层
- 不再重复“收到 / 我先看看 / 我来帮你”
- 直接进入:
- 分析
- 方案
- 结果
- 执行说明
实现上建议:
- 将主持人前言摘要作为隐藏上下文传给 Agent
- 增加约束:
不要重复前言已表达的确认语从新的信息开始输出
6. 升级方案
6.1 Phase 1:锁定聊天 / 识图最终回复模型
目标
先解决最直接的成本和体验问题:
respond / analyze_image不再二次选模型
具体改动
A. 扩展 AgentPreparedExecution
文件:
lib/ai/auto-agent-graph.ts
新增字段建议:
lockFinalReplyToAgentModel: booleanfastAckType: "chat" | "analyze" | "edit" | "image" | "video" | "clarify"requiresHeavyPlanner: booleanskipIntentRouterForReply: boolean
B. 在 Specialist 中标注 conversation / vision 为“单模型直出”
文件:
lib/ai/specialists/index.ts
规则:
conversation->lockFinalReplyToAgentModel = truevision->lockFinalReplyToAgentModel = true
C. 在 Chat API 中跳过 chat / vision 二次路由
文件:
app/(chat)/api/chat/route.ts
逻辑:
当满足:
selectedChatModel === "auto"execution.lockFinalReplyToAgentModel === true- Agent 默认模型可用
则:
finalModelId = preferredAgentModelId || configuredAgentModelId- 不再根据
chat / vision走routeToModel() - 只在 Agent 默认模型不可用时才 fallback 到其它候选
预期收益
- 降低聊天 / 识图延迟
- 避免双模型消耗
- 保持 Agent 模式与用户认知一致
- 明确把
Agent模式从“自动选模型”升级成“以 Agent 默认模型为核心的编排模式”
6.2 Phase 2:增加 Fast Ack 首确认层
目标
让用户在极短时间内看到第一句反馈。
具体改动
A. 新增 preResponseClassifier
文件建议:
app/(chat)/api/chat/route.ts
作用:
- 不调用大模型
- 只做轻量规则判断
- 快速分类为:
chatanalyze_imageedit_imagegenerate_imagegenerate_video
clarify
补充:
- 当前
smart-analyzer由于quickKeywordMatch()被故意压到低置信度,无法承担“快速首响应判断” - 所以需要单独新增一个真正轻量级的前置分类器
B. 新增 emitImmediateAck()
复用现有:
createUIMessageStreamwriteAssistantTextChunkwriteImageGenerationStatusChunk
建议文案:
- 聊天:
我在,正在看你的问题。 - 识图:
我先看一下这张图。 - 修图:
收到,我先处理这张图。 - 生图:
收到,正在开始生成。 - 视频:
收到,正在开始生成视频。
C. 与现有执行链整合
执行类任务先发:
即时确认占位状态
然后后台继续跑:
runAutoAgentGraph()Specialist Executor
注意:
- 这里不是推翻现有 Agent Graph
- 而是在它前面增加一个“低成本前置层”
预期收益
- 用户不会看到无反馈空窗
- 生图 / 修图 / 视频体验更接近官方产品
6.3 Phase 3:分阶段流式渲染
目标
把输出拆成 3 段:
- 首确认
- 分析/处理中状态
- 最终结果
具体改动
A. respond / analyze_image
策略:
- 首确认后,立即由 Agent 默认模型开始流式回复
- 不中间插额外模型
B. edit / image / video
策略:
- 首确认消息立即输出
- 前端显示:
- 图片生成占位
- 视频处理中状态
- 画布处理中提示
- 执行完成后写入最终消息和画布节点
C. 结构化内容延迟补出
对于“需求理解 / 图片分析 / 执行计划”这类结构化块:
- 不要求首屏一次全出
- 可以作为第二阶段内容追加
6.3.1 Phase 3A:引入火山“主持人模型”
目标
让系统在真正的 Agent 深分析开始前,先用一个极快模型给出“短而真实”的首句确认,为后台 Agent 赢得准备时间。
定位
主持人模型不是新的主 Agent,也不是最终回复模型的替代者。
它的角色是:
- 抢首响应
- 降低用户等待空窗
- 把“我理解你要做什么”这一步前移
而不是:
- 完整规划
- 长推理
- 工具决策
- 产出最终复杂结果
适用范围
仅用于:
selectedChatModel = "auto"- 非固定模型场景
- 首响应阶段
不用于:
- 用户显式选定固定模型后的直出场景
- 已经进入 Specialist Executor 的最终结果阶段
推荐模型候选
优先评估:
- 火山引擎
Doubao-Seed-1.6-flash
推荐配合:
Prefill: true- 关闭深度思考 / thinking
- 严格限制输出 token
输出约束
主持人模型输出必须满足:
- 单句或两句
- 20 到 60 个字以内
- 必须体现用户当前对象和动作
- 禁止进入完整分析结构
- 禁止做最终结论承诺
与后台 Agent 的并行关系
建议时序:
- 用户发消息
- 主持人模型立即返回短确认
- 后台同时启动:
- 目标图解析
- 长记忆 / 上下文装载
- Agent Graph
- Specialist Executor
- 再由 Agent 默认模型或执行模型输出真正结果
运行时状态机
建议新增一组明确状态:
prelude_pendingprelude_streamingagent_planninghandoff_readyfinal_streamingcompletedfallback_prelude_only
风险控制
- 主持人模型不能和最终回复模型抢语义主导权
- 主持人模型内容必须短,不可提前输出错误结论
- 如果主持人模型不可用,应自动回退到轻量规则确认
- 如果 Agent 已进入
handoff_ready,主持人模型必须在自然句末停止 - 如果主持人模型已经结束,Agent 最终回复不得从“收到 / 我来帮你”重新开始
6.4 Phase 4:结构化对话渲染升级
目标
把当前“统一 Markdown 渲染”升级成“结构化内容协议 + 多渲染器前端”。
具体改动
A. 统一输出协议
为以下场景定义稳定的 Markdown 约定:
- 普通聊天
- 识图分析
- 执行报告
- 代码输出
- 表格报告
建议约定:
- 标题:模块边界
- 列表:要点
- 表格:对比 / 参数 / 方案
- fenced code block:代码
- blockquote:注意事项 / 引用
B. 增加 responseProfile
建议新增前端响应 profile:
conversationanalysisexecution_reportcode_artifacttable_reportimage_resultvideo_result
不同 profile 使用不同渲染策略,而不是所有文本都走同一个 Response。
C. 升级代码类输出
当前已有 CodeBlock + CopyButton,但仍偏“聊天消息内嵌代码”。
建议逐步升级为:
- 多代码块目录
- 文件名 / 模块名显示
- 复制文件内容
- 长代码折叠
- 发送到文档 / 工件面板
D. 升级表格类输出
建议增加:
- Markdown 表格专用样式
- 小屏幕横向滚动
- 表头固定视觉层级
- 单元格复制
- 大表格折叠 / 展开
E. 升级分析类输出
当前只有“图片分析”有专门折叠卡片。
建议扩展为统一 section card:
需求理解图片分析执行计划输出设置风险提示
F. 升级 Artifact / Workbench 路线
未来建议把复杂输出从“聊天气泡”升级成“聊天 + 工件”:
- 代码输出 -> 文档 / 编辑器
- 表格输出 -> 结构化工作台
- 分析规划 -> 侧栏 / 面板 / 画布节点
7. 代码触点清单
必改
app/(chat)/api/chat/route.tslib/ai/auto-agent-graph.tslib/ai/specialists/index.tslib/db/ai-model-flags.tsapp/api/admin/ai-models/route.tsapp/(admin)/settings/admin-settings-client.tsx
可能调整
lib/ai/model-router.tscomponents/canvas/CanvasChatPanel.tsxcomponents/multimodal-input.tsxcomponents/message.tsxcomponents/elements/response.tsxcomponents/elements/code-block.tsx
8. 验收标准
8.1 聊天 / 识图
Agent模式下,respond / analyze_image只使用 Agent 默认模型完成最终回复- 日志中不再出现:
- Agent 默认模型分析
- 再路由到
Gemini-3.1-pro回答
8.2 首响应
- 普通聊天请求在
300ms ~ 1500ms内看到确认消息 - 修图 / 生图 / 视频任务在
1500ms内看到“正在处理”反馈
8.3 执行类任务
- 修图 / 生图 / 视频仍能正常执行
- 结果仍能回到:
- 聊天气泡
- 无限画布
8.4 结构化对话
- 代码类回复必须具备稳定的代码块渲染和复制交互
- 表格类回复必须可读、可滚动、不破版
- 分析类回复必须按 section 呈现,而不是纯长段落
- 生图模式的图片结果结构不能被文本升级破坏
9. 风险与注意事项
- 需要避免“首确认”和“最终结果”消息重复或顺序错乱
selectedChatModel = auto与“固定模型”模式要严格区分- 如果 Agent 默认模型暂时不可用,仍需有 fallback 机制
- 执行类任务失败时,需要把“处理中”状态转成明确失败态
- 结构化协议升级后,要兼容旧消息显示
- 对话渲染升级必须与图片 Markdown 结果协议兼容
10. 推荐实施顺序
Step 1
先做:
respond / analyze_image锁定 Agent 默认模型
原因:
- 改动最小
- 收益最大
- 先解决双模型和双份算力问题
- 也是当前“为什么 Agent 模式最后跑到 Gemini”问题的直接修复点
Step 2
再做:
emitImmediateAck()- 执行类首确认与占位状态
Step 3
最后做:
- 前置轻量分类
- 后台完整分析并行
- 分阶段流式渲染
- 如有必要,再评估是否增加火山快速前置模型
Step 4
最后再做:
- 结构化对话协议
- section card 统一样式
- 代码 / 表格专用渲染
- Artifact / Workbench 路线
11. 最终建议
按照当前项目情况,最合理的实现不是推倒重来,而是在现有架构上做三件事:
聊天 / 识图单模型直出执行任务立即确认 + 后台执行Agent模式从“自动选模型”升级成“以 Agent 默认模型为核心的编排模式”- 对话渲染从“统一 Markdown 渲染”升级成“结构协议 + 专用渲染器”
这会同时提升:
- 用户体感速度
- Agent 模式一致性
- 识图 / 对话成本控制
- 执行类任务的可理解性
13. 我们与 Gemini 官方对话的主要差异
13.1 响应编排差异
Gemini 官方:
- 首确认快
- 流式明显
- 大任务分阶段输出
我们当前:
- 首响应经常等待完整 Agent 链路完成
13.2 输出协议差异
Gemini 官方:
- 标题、列表、代码、表格的结构一致性高
我们当前:
- 虽已有 Markdown 渲染,但输出协议不稳定
13.3 工件能力差异
Gemini 官方:
- 复杂内容常以工件、文件、代码面板形式呈现
我们当前:
- 多数复杂结果仍堆在聊天气泡里
13.4 多渲染器差异
Gemini 官方:
- 代码、表格、分析、引用、工具结果往往各有不同展示层
我们当前:
- 文本主路径仍主要共用一个
Response
14. 未来升级建议
14.1 短期
- 先完成 Phase 1
- 再完成 Fast Ack
- 先解决体验和成本上的主矛盾
- 不急着让主持人模型取代 Agent 默认模型
14.2 中期
- 增加
responseProfile - 分析类消息卡片化
- 代码类输出接入工件面板
- 接入火山主持人模型,并和 Agent 模型做平滑交接
14.3 长期
- 建立统一
Agent Response Schema - 把 Planner 结果与前端展示协议解耦
- 让聊天、画布、详情生成共享同一套结构化响应层
15. 参考能力来源
可作为后续设计参考的能力来源包括:
- Gemini 模型能力页
- Gemini 3 指南
- Gemini Structured Output
- Gemini Code Execution
- Gemini OpenAI Compatibility
它们共同说明:官方强体验的关键是“模型能力 + 输出协议 + 前端渲染器”的组合,而不是只换一个更快的模型。
参考链接:
12. 关于“是否需要火山快速模型先和用户对话”的最终建议
当前决策调整为:
- 短期:先修编排
- 中期:明确引入火山主持人模型
短期仍然先修编排的原因:
- 先锁定
respond / analyze_image到doubao-seed-2-0-mini-260215 - 先补
Fast Ack首确认层 - 这两步做完,体感延迟通常就会明显下降
在此基础上,中期明确增加:
- 一个火山引擎快速模型作为“主持人模型”
它承担的职责是:
- 非执行类请求的第一段实质性响应
- 在后台 Agent 深分析开始时,降低用户感知等待
不建议的做法:
- 一上来先换模型
- 但编排方式完全不改
因为这样通常只会:
- 稍微降低部分推理耗时
- 却保留整个“前置重链路”的结构性延迟
推荐落地顺序:
- Phase 1:锁定
respond / analyze_image到 Agent 默认模型 - Phase 2:增加首确认与分阶段流式
- Phase 3A:接入火山主持人模型
3.5 为什么 Gemini / 豆包官方对话体验更强
3.5.1 关键不在单个模型,而在“模型 + 协议 + 渲染器”
Gemini / 豆包官方产品之所以看起来“更会说、排版更整齐、代码更像模块、表格更清晰”,核心并不是模型天然输出了 UI,而是它们通常具备以下组合:
- 流式输出
- 多模态输入
- Thinking / reasoning
- 结构化输出或稳定 Markdown 约定
- 工具调用 / 外部能力
- 前端专用渲染器
也就是说,它们走的是:
- 模型能力层
- 响应协议层
- 前端呈现层
联合优化路线。
3.5.2 Gemini 官方路线的能力来源
Gemini 官方公开支持以下能力:
- 多模态输入
- Thinking
- Structured Output
- Code Execution
- OpenAI-compatible 接口
这些能力让 Gemini 官方产品更容易实现:
- 标题 + 列表 + 结构块
- 可执行代码工作台
- 工具结果和正文分层展示
- 表格化结果输出
3.5.3 豆包官方路线的合理推断
对于豆包官方产品,更合理的技术推断是:
- 模型输出的是 Markdown 或结构片段
- 客户端按内容类型进行专用渲染
- 代码、表格、结构块并不是“单靠模型本身生成的 UI”,而是“模型输出 + 前端 renderer”
3.5.4 对我们最重要的结论
如果我们想接近 Gemini / 豆包官方体验,真正该升级的是:
- 响应编排
- 结构化输出协议
- 多渲染器前端
而不是只改模型选择。