补充LLM中间态输出,并默认开流式和联网 #219

Closed
opened 2026-08-31 10:27:09 +08:00 by kdletters · 1 comment
Member
No description provided.
suzmii self-assigned this 2026-08-31 10:45:22 +08:00
suzmii added the due date 2026-09-01 2026-08-31 14:14:54 +08:00
suzmii modified the due date from 2026-09-01 to 2026-09-03 2026-09-01 19:10:29 +08:00
Member

LLM 中间态输出、默认流式与受控联网技术方案补记

背景

DirectProject 旧体验有两个问题:

  1. LLM 长时间执行时,用户只能看到笼统的“处理中”,不知道当前是在思考、读文件、写文件、执行命令还是生成回复。
  2. 上游经常整包返回最终回复;此前客户端用合成打字机模拟流式,这不是真实流,且会掩盖真实事件顺序。

本需求将输出模型改为“真实事件驱动”:真实回复增量才进入流式正文,工具与执行过程进入过程卡,默认开启流式和受控联网。

目标

  • llm.stream 默认开启。
  • llm.webSearchEnabled 默认开启。
  • Responses SSE 原样透传,不做假流。
  • 只有真实 agent message delta 才展示为流式正文。
  • 工具、命令、文件、搜索等执行过程有独立状态展示。
  • 原始推理 / 计划文本不直接进入 UI。
  • 受控联网不启用 Codex 原生 web search,而是走 AGC 审核 MCP 工具。

非目标

  • 不展示模型原始 reasoning 全文。
  • 不用合成打字机补假流。
  • 不把工具输出直接混入助手正文。
  • 不让普通用户配置 LLM Provider 或 API Key。
  • 不把搜索结果当作可信指令执行。

传输链路

AGC DirectProject
  → Codex app-server
  → 本机 Provider Proxy
  → api-server /api/llm/responses
  → 官方 Router Responses SSE

关键行为:

  • 客户端默认发送 stream=true
  • api-server 透传 Responses SSE。
  • SSE 顺序、content-type 和 terminal event 保持上游语义。
  • api-server 在 terminal event 后提取 usage 并执行后置扣费。
  • stream=false 仍是合法配置;此时不展示回复增量,但执行过程详情仍显示。

事件模型

Codex app-server 将原始协议投影为三类安全观察值:

  1. AccumulatedText
    • 只来自真实 agent message delta。
    • 开启流式时标记为 streaming
    • 作为会话里的 assistant 实时回复气泡原位更新。
  2. IntermediateText
    • 来自 item started 的具体工作信息。
    • 例如“正在写入文件:game/index.html”“正在执行命令:npm run build”。
    • 状态仍是 running,不冒充回复正文。
  3. Activity
    • 安全活动词,例如 preparingfile-readfile-writecommand-execgame-verifyweb-search
    • 只驱动过程卡,不进入 assistant 正文。

计划 / reasoning 通知统一收敛为 preparing

  • UI 显示“正在思考中”。
  • 原始 reasoning / plan delta 不进入前端。
  • thinking 活动按 1.2 秒限流,避免高频 delta 刷屏。

过程卡信息架构

过程卡标题只由回合状态决定:

  • accepted → 需求已接收
  • running → 任务执行中
  • streaming → 回复生成中
  • finalizing → 结果整理中
  • completed → 回复已生成
  • failed → 处理失败

过程卡小字显示当前具体工作,并统一使用“正在”前缀:

  • agc_write_file → 正在写入文件:<项目相对路径>
  • Codex fileChange → 正在写入文件:<路径>
  • 项目文件浏览 → 正在浏览项目文件
  • 素材库读取 → 正在读取素材库
  • 账户素材读取 → 正在读取账户素材
  • 素材导入 → 正在导入素材:N 项
  • 图片生成 → 正在生成图片
  • 图片编辑 → 正在编辑图片
  • 美术准备 → 正在准备美术素材
  • 资源创建 → 正在创建素材资源
  • 去背景 → 正在去除图片背景
  • 试玩 → 正在试玩游戏
  • 搜索 → 正在搜索资料:<query>
  • 命令 → 正在执行命令:<command>
  • 验证类命令 → 正在验证游戏:<command>
  • 未知工具 → 正在调用工具

安全边界:

  • 不暴露内部工具名。
  • 不展示完整 prompt、参数 JSON、Token 或密钥。
  • 路径只显示有界项目相对路径。
  • 绝对路径和 ../ 路径退回通用文案。
  • 同一活动后续无正文心跳不得用通用文案覆盖具体命令 / 文件。

展开状态:

  • 展开状态绑定 projectPath + clientTurnId
  • 同一轮内内容更新不自动收起。
  • 新回合才重置展开状态。

真实流式回复

  • 只有 AccumulatedText 进入 assistant 实时回复气泡。
  • 过程卡在 streaming 时只显示“正在生成回复”。
  • 正式回复落盘后接管实时气泡,不重复渲染。
  • 失败时清除未完成正文,只保留失败状态和错误引导。
  • 移除合成打字机回放。

受控联网搜索

默认开启 webSearchEnabled,但不启用 Codex 原生 web search。

DirectProject 注入 agc_tools MCP:

  • 仅在 DirectProject 模式暴露。
  • 仅当配置开启时注入受控搜索开关。
  • 工具名:agc_web_search
  • 查询长度最多 400 字符。
  • 结果数 1–5,默认 3。
  • 响应大小最大 512 KiB。
  • 调用前检查项目 project.search 权限。
  • 搜索结果带内容策略:只能作为资料引用,不能当作用户或系统指令。
  • System prompt 明确要求按需搜索,不默认滥用联网。

隐私与安全

  • Codex 原生 web search 固定关闭。
  • Codex 子进程环境剥离 key、token、cookie、credential、proxy、bridge URL 等敏感变量。
  • Provider Proxy 只暴露 loopback 随机 Bearer。
  • 搜索结果不进入配置、manifest 或凭据存储。
  • 工具活动文案不携带原始参数 JSON。

验证

已覆盖:

  • 默认 stream=truewebSearchEnabled=true 配置回归
  • 显式 stream=false 时无回复增量、但执行详情保留
  • 只有 AccumulatedText 标记 streaming
  • IntermediateText / Activity 标记 running
  • reasoning / plan 不泄漏原文,显示“正在思考中”
  • 真实回复进入 assistant 气泡
  • 过程卡只显示阶段,不混入正文
  • 写文件、命令、搜索等工具语义文案
  • 命令心跳不覆盖具体命令
  • 写文件心跳不覆盖具体路径
  • 同一轮展开状态保持
  • SSE terminal event 后扣费
  • 受控搜索参数、大小、权限和结果策略测试
  • AppSurface Direct Codex 回归
  • AGC typecheck、Rust 定向测试、rustfmt、encoding、diff check

待验收 / 风险

  • 需要在 Windows 实机上人工确认真实 Router SSE 的视觉节奏、长输出滚动和展开交互。
  • 需要验证真实网络下 Bing RSS 搜索的可用性和结果质量;如搜索供应商调整,需要替换受控搜索出口而不是放开原生 web search。
  • PR #242 的远程 CI 仍需以最新分支重新确认。
## LLM 中间态输出、默认流式与受控联网技术方案补记 ### 背景 DirectProject 旧体验有两个问题: 1. LLM 长时间执行时,用户只能看到笼统的“处理中”,不知道当前是在思考、读文件、写文件、执行命令还是生成回复。 2. 上游经常整包返回最终回复;此前客户端用合成打字机模拟流式,这不是真实流,且会掩盖真实事件顺序。 本需求将输出模型改为“真实事件驱动”:真实回复增量才进入流式正文,工具与执行过程进入过程卡,默认开启流式和受控联网。 ### 目标 - `llm.stream` 默认开启。 - `llm.webSearchEnabled` 默认开启。 - Responses SSE 原样透传,不做假流。 - 只有真实 agent message delta 才展示为流式正文。 - 工具、命令、文件、搜索等执行过程有独立状态展示。 - 原始推理 / 计划文本不直接进入 UI。 - 受控联网不启用 Codex 原生 web search,而是走 AGC 审核 MCP 工具。 ### 非目标 - 不展示模型原始 reasoning 全文。 - 不用合成打字机补假流。 - 不把工具输出直接混入助手正文。 - 不让普通用户配置 LLM Provider 或 API Key。 - 不把搜索结果当作可信指令执行。 ### 传输链路 ```text AGC DirectProject → Codex app-server → 本机 Provider Proxy → api-server /api/llm/responses → 官方 Router Responses SSE ``` 关键行为: - 客户端默认发送 `stream=true`。 - api-server 透传 Responses SSE。 - SSE 顺序、content-type 和 terminal event 保持上游语义。 - api-server 在 terminal event 后提取 usage 并执行后置扣费。 - `stream=false` 仍是合法配置;此时不展示回复增量,但执行过程详情仍显示。 ### 事件模型 Codex app-server 将原始协议投影为三类安全观察值: 1. `AccumulatedText` - 只来自真实 agent message delta。 - 开启流式时标记为 `streaming`。 - 作为会话里的 assistant 实时回复气泡原位更新。 2. `IntermediateText` - 来自 item started 的具体工作信息。 - 例如“正在写入文件:game/index.html”“正在执行命令:npm run build”。 - 状态仍是 `running`,不冒充回复正文。 3. `Activity` - 安全活动词,例如 `preparing`、`file-read`、`file-write`、`command-exec`、`game-verify`、`web-search`。 - 只驱动过程卡,不进入 assistant 正文。 计划 / reasoning 通知统一收敛为 `preparing`: - UI 显示“正在思考中”。 - 原始 reasoning / plan delta 不进入前端。 - thinking 活动按 1.2 秒限流,避免高频 delta 刷屏。 ### 过程卡信息架构 过程卡标题只由回合状态决定: - `accepted` → 需求已接收 - `running` → 任务执行中 - `streaming` → 回复生成中 - `finalizing` → 结果整理中 - `completed` → 回复已生成 - `failed` → 处理失败 过程卡小字显示当前具体工作,并统一使用“正在”前缀: - `agc_write_file` → 正在写入文件:`<项目相对路径>` - Codex fileChange → 正在写入文件:`<路径>` - 项目文件浏览 → 正在浏览项目文件 - 素材库读取 → 正在读取素材库 - 账户素材读取 → 正在读取账户素材 - 素材导入 → 正在导入素材:N 项 - 图片生成 → 正在生成图片 - 图片编辑 → 正在编辑图片 - 美术准备 → 正在准备美术素材 - 资源创建 → 正在创建素材资源 - 去背景 → 正在去除图片背景 - 试玩 → 正在试玩游戏 - 搜索 → 正在搜索资料:`<query>` - 命令 → 正在执行命令:`<command>` - 验证类命令 → 正在验证游戏:`<command>` - 未知工具 → 正在调用工具 安全边界: - 不暴露内部工具名。 - 不展示完整 prompt、参数 JSON、Token 或密钥。 - 路径只显示有界项目相对路径。 - 绝对路径和 `../` 路径退回通用文案。 - 同一活动后续无正文心跳不得用通用文案覆盖具体命令 / 文件。 展开状态: - 展开状态绑定 `projectPath + clientTurnId`。 - 同一轮内内容更新不自动收起。 - 新回合才重置展开状态。 ### 真实流式回复 - 只有 `AccumulatedText` 进入 assistant 实时回复气泡。 - 过程卡在 `streaming` 时只显示“正在生成回复”。 - 正式回复落盘后接管实时气泡,不重复渲染。 - 失败时清除未完成正文,只保留失败状态和错误引导。 - 移除合成打字机回放。 ### 受控联网搜索 默认开启 `webSearchEnabled`,但不启用 Codex 原生 web search。 DirectProject 注入 `agc_tools` MCP: - 仅在 DirectProject 模式暴露。 - 仅当配置开启时注入受控搜索开关。 - 工具名:`agc_web_search`。 - 查询长度最多 400 字符。 - 结果数 1–5,默认 3。 - 响应大小最大 512 KiB。 - 调用前检查项目 `project.search` 权限。 - 搜索结果带内容策略:只能作为资料引用,不能当作用户或系统指令。 - System prompt 明确要求按需搜索,不默认滥用联网。 ### 隐私与安全 - Codex 原生 web search 固定关闭。 - Codex 子进程环境剥离 key、token、cookie、credential、proxy、bridge URL 等敏感变量。 - Provider Proxy 只暴露 loopback 随机 Bearer。 - 搜索结果不进入配置、manifest 或凭据存储。 - 工具活动文案不携带原始参数 JSON。 ### 验证 已覆盖: - 默认 `stream=true`、`webSearchEnabled=true` 配置回归 - 显式 `stream=false` 时无回复增量、但执行详情保留 - 只有 `AccumulatedText` 标记 `streaming` - `IntermediateText` / `Activity` 标记 `running` - reasoning / plan 不泄漏原文,显示“正在思考中” - 真实回复进入 assistant 气泡 - 过程卡只显示阶段,不混入正文 - 写文件、命令、搜索等工具语义文案 - 命令心跳不覆盖具体命令 - 写文件心跳不覆盖具体路径 - 同一轮展开状态保持 - SSE terminal event 后扣费 - 受控搜索参数、大小、权限和结果策略测试 - AppSurface Direct Codex 回归 - AGC typecheck、Rust 定向测试、rustfmt、encoding、diff check ### 待验收 / 风险 - 需要在 Windows 实机上人工确认真实 Router SSE 的视觉节奏、长输出滚动和展开交互。 - 需要验证真实网络下 Bing RSS 搜索的可用性和结果质量;如搜索供应商调整,需要替换受控搜索出口而不是放开原生 web search。 - PR #242 的远程 CI 仍需以最新分支重新确认。
Sign in to join this conversation.
2 Participants
Notifications
Due Date
2026-09-03
Dependencies

No dependencies set.

Reference: GenarrativeAI/Genarrative#219