.agents/design/core/ai/auxiliary-generation.md
状态:已实现
最后核对:2026-08-03
辅助生成用于不经过 Workflow Dispatcher、但需要复用 Chat 身份、SSE、计费、停止和 Agent Loop 的生成场景。目前的核心调用方是 Chat Agent Helper。
它不是第二套 Workflow runtime,也不负责:
目录:packages/service/core/ai/auxiliaryGeneration
| 文件 | 职责 |
|---|---|
service.ts | 编排一次辅助生成的完整生命周期 |
agentLoop.ts | 将无业务工具的生成接入统一 Agent Loop |
stream.ts | 创建 SSE、心跳、错误、结束事件和断流续传 mirror |
usage.ts | 余额检查、usage 记录创建和用量推送 |
stop.ts | 读取并清理统一停止标记 |
type.ts | processor、用户上下文和运行结果协议 |
API route
|-- parse input and auth source
|-- load histories / files
`-- runAuxiliaryGeneration
|-- create SSE and resume mirror
|-- check balance and create usage record
|-- clear stale stop flag
|-- call business processor
| `-- optional runAuxiliaryGenerationAgentLoop
|-- emit done
`-- clear timer and stop flag
runAuxiliaryGeneration 只编排公共生命周期,业务差异通过 processor 注入。processor 接收 query、files、data、histories、stream writer、停止检查、usage sink 和已鉴权用户信息。
runAuxiliaryGenerationAgentLoop 复用 Agent Loop,约束如下:
plan、Sandbox、文件读取或知识库系统工具。ask_user 系统工具;暂停和恢复完全遵循 Agent Loop 的 providerState + userAnswer 协议。generate_config。status、pause 和 providerState,业务层只负责转换展示和持久化,不自行判断暂停条件。如果新场景需要业务工具,必须通过 runtime tool catalog 和 executor 显式注入,不能依赖 processor 读取 Workflow runtime。
模型调用 ask_user
-> Agent Loop 返回 paused + ask + providerState
-> Chat Agent Helper 保存 interactive、ask tool call 和 providerState memory
-> 用户提交与 Workflow Agent 相同的 { answers: string[] } 原始结构
-> 调用方传回 providerState + userAnswer
-> Agent Loop 在原 ask tool call 后追加 tool response 并继续
-> 模型调用 generate_config
-> executor 校验并生成表单配置,返回 "Generate config success"
-> 模型自行结束,调用方清理 providerState memory
Chat Agent Helper 读取历史时使用 reserveTool: true。除 interactive 外,还需要持久化对应的 ask_user 和 generate_config tool call/response,否则历史转换无法恢复工具语义。
generate_config 是普通 runtime tool,不设置 stop。工具参数使用配置生成业务结构,不包含用于旧 JSON 路由的 phase 和 reasoning 字段;executor 使用 Zod 校验,并确认全部资源 ID 都在当前成员的可访问资源集合内,再转换为最终表单结构。参数错误作为 tool error 返回给模型修正,不再额外调用模型修复 JSON。
providerState 写入当前 AI ChatItem 的 memories。userAnswer 传入。done、error 和 aborted 都清除该 memory,避免后续普通消息恢复陈旧暂停点。saveChat 已支持 memories;辅助生成只扩展 processor 返回协议和 Chat Agent Helper 保存调用,不修改通用保存语义。teamId/sourceType/sourceId/chatId,与标准 Chat source 隔离规则一致。AuxiliaryGenerationEventEnum.error 返回,并复用统一 cookie 清理规则。[DONE]。onStreamContextReady 获取 stream context,在 processor 前后的异常路径写 error 并 flush resume。辅助生成读取 /v2/chat/stop 使用的 Redis key:
agent_runtime_stopping:<sourceType>:<sourceId>:<chatId>
运行期间定时刷新停止状态,连接关闭也会触发本地停止。开始和结束时都清理旧标记,避免一次停止污染下一次生成。
sourceType 将 sourceId 记为 appId 或 skillId。辅助生成不重新计算 Agent Loop 积分,也不重复调用用量写入。
runAuxiliaryGeneration,只新增 processor。sourceType/sourceId,不能恢复 App-only 的 appId 入口。