chore: commit workspace updates
This commit is contained in:
@@ -9,13 +9,18 @@ description: 影策后端核心持久化表与状态边界
|
||||
|
||||
## 结构迁移与版本
|
||||
|
||||
### 云端 Agent 运行时
|
||||
|
||||
每轮 Agent 存为 `tasks` 中 `operation = cloud_agent` 的 `canvas_text` 任务,任务 `input_json.cloudAgent` 保存版本 1 的已校验请求、父轮 ID、请求指纹和技能快照;历史从服务端父轮结果构造。任务 ID 由用户与幂等键确定,利用现有主键、任务 admission 和积分预留事务防止重复提交重复扣费。Agent 的模型循环、工具调用、审批、子任务和事件写入 `cloud_agent_executions.state_json`,任务 Worker 只负责推进状态,不依赖浏览器连接。公共任务创建与重试接口禁止绕过 Agent admission;删除任务会影响该轮继续对话与回放。
|
||||
|
||||
| 表 | 用途 | 关键边界 |
|
||||
| --- | --- | --- |
|
||||
| `schema_migrations` | 保存已成功应用的结构版本、名称、校验和与时间 | 已应用版本的校验和发生变化时拒绝启动;数据库版本高于当前二进制支持版本时拒绝旧程序连接 |
|
||||
| `cloud_agent_executions` | 保存 Agent 每轮的持久化执行状态、修订号和运行状态 | `(id, user_id)` 归属受服务端校验;状态通过 revision CAS 更新;`state_json` 包含技能快照、工具调用、审批、活动子任务和事件,不保存浏览器密钥 |
|
||||
|
||||
容器内命令 `migrate-schema up` 应用缺失迁移,`migrate-schema status` 输出当前和期望版本,`migrate-schema verify` 只检查兼容性。`CANVAS_AUTO_MIGRATE=true` 仅用于开发和旧部署兼容;受管生产部署设置为 `false`,并由 Compose 的一次性 `migrate` 服务先完成迁移。后续迁移必须新增版本,不得修改已经发布迁移的实现或校验和。
|
||||
|
||||
当前结构版本为 10。版本 2 为 `schema_migrations.applied_at` 增加 `idx_schema_migrations_applied_at` 索引;版本 3 `asset_taxonomy_candidate_identity` 为资产候选增加规范化名称和来源,收敛资产分类,并为待确认候选建立项目内部分唯一索引;版本 4 `resource_upload_key` 为资源上传幂等补充 `resources.upload_key` 列和用户维度唯一索引;版本 5 `payment_topup` 创建积分充值、支付通知和对账所需结构;版本 6 `resource_playback_variant` 增加资源播放副本状态;版本 7 `asset_library_folders` 增加用户素材自定义分类及 `assets.folder_id`;版本 8 `logical_model_active_code` 将前台模型 code 的唯一约束限定为未归档记录;版本 9 `channel_presentation` 为渠道添加 `public_alias`(默认空字符串)与 `sort_order`(默认 0),为渠道模型添加 `sort_order`(默认 0),不重写既有凭据、价格或能力配置;版本 10 `creation_runtime` 创建创作运行与提交表,并为任务增加可空且唯一的 `creation_submission_id`,旧任务无需伪造提交标识即可继续使用。
|
||||
当前结构版本为 12。版本 2 为 `schema_migrations.applied_at` 增加 `idx_schema_migrations_applied_at` 索引;版本 3 `asset_taxonomy_candidate_identity` 为资产候选增加规范化名称和来源,收敛资产分类,并为待确认候选建立项目内部分唯一索引;版本 4 `resource_upload_key` 为资源上传幂等补充 `resources.upload_key` 列和用户维度唯一索引;版本 5 `payment_topup` 创建积分充值、支付通知和对账所需结构;版本 6 `resource_playback_variant` 增加资源播放副本状态;版本 7 `asset_library_folders` 增加用户素材自定义分类及 `assets.folder_id`;版本 8 `logical_model_active_code` 将前台模型 code 的唯一约束限定为未归档记录;版本 9 `channel_presentation` 为渠道添加 `public_alias`(默认空字符串)与 `sort_order`(默认 0),为渠道模型添加 `sort_order`(默认 0),不重写既有凭据、价格或能力配置;版本 10 `creation_runtime` 创建创作运行与提交表,并为任务增加可空且唯一的 `creation_submission_id`,旧任务无需伪造提交标识即可继续使用;版本 11 `cloud_agent_runtime` 创建 `cloud_agent_executions`,保存 Agent 的 durable runtime 状态和 revision CAS 信息;版本 12 `agent_token_charge_limit` 为账单增加可空语义的 `charge_limit_microcredits`,仅 Agent Token 任务写入非零值,将服务端预授权报价固化为最终用户扣费上限。
|
||||
|
||||
历史发布曾使用版本 6 `asset_library_folders`,之后合并引入了上述 6/7 顺序冲突。迁移器仅在该历史记录的名称和校验和均精确匹配时选择历史顺序:保留版本 6 的素材目录记录及时间,在版本 7 应用 `resource_playback_variant`,再继续版本 8。新数据库及已采用“6 播放副本、7 素材目录”的数据库保持原顺序;状态检查与启动校验采用同一套识别规则。未知名称、被改动的校验和或冲突的版本 7 记录仍会拒绝迁移,不通过删除、改名或伪造已应用记录绕过检查。
|
||||
|
||||
@@ -147,17 +152,6 @@ description: 影策后端核心持久化表与状态边界
|
||||
|
||||
有效状态由服务端计算为 `platform_available AND user_enabled`。官方应用插件没有平台状态记录时默认可用;用户没有个人记录时默认停用,历史上全局启用的工作流插件在用户首次保存个人选择前沿用旧状态。管理员上传包的来源和作用域由宿主覆盖,不能通过 Manifest 提权。
|
||||
|
||||
## ComfyUI Bridge
|
||||
|
||||
| 表 | 用途 | 关键边界 |
|
||||
| --- | --- | --- |
|
||||
| `comfy_bridges` | 保存用户注册的 Bridge 身份、Token 摘要、启用状态和心跳能力 | Token 明文只在注册时返回一次;查询和日志只使用摘要 |
|
||||
| `comfy_bridge_requests` | 保存云端任务交给本地 Bridge 的请求、领取状态和完成结果 | `id` 同时作为任务的 `provider_request_id`;状态按 `queued -> claimed -> succeeded/failed/cancelled` 单向流转 |
|
||||
|
||||
`comfy_bridge_requests` 是 Bridge 交接的真相源。后端进程重启后,未领取请求继续从数据库投递;已领取请求的迟到结果先落库,任务 worker 恢复后使用原请求 ID 读取结果,不会创建第二次本地工作流执行。请求有效期当前为两小时,过期的排队或执行记录会转为失败。
|
||||
|
||||
请求表保存工作流执行 payload 和结果,但不保存 Bridge Token。任务取消时,未领取请求可以确定取消;已经领取的本机工作流无法可靠中止,迟到结果会被丢弃并进入费用核对流程。
|
||||
|
||||
## 系统公告
|
||||
|
||||
| 表 | 用途 | 关键边界 |
|
||||
@@ -182,6 +176,6 @@ description: 影策后端核心持久化表与状态边界
|
||||
|
||||
个人画布中的图片、视频和音频采用 `Asset -> Resource` 所有权约束:前端先提交素材,再提交带 `assetId` 的画布节点或时间线直连媒体;后端保存画布前校验资源属于当前用户、状态为 `ready`、素材存在且引用同一资源。素材更新、全量替换和删除也会反向检查已有画布,不能把仍在使用的资源从素材库中移除或替换成其他资源。登录历史账号时,前端会按资源键补建缺失素材并回写 `assetId`。这项修复复用现有表和 Outbox,不新增结构迁移。
|
||||
|
||||
账号文件容量只统计 `ready` 资源,并按 Provider、Endpoint、Bucket、ObjectKey 对同一物理对象去重;上传中或失败记录不占用已存储容量,`session_files` 仍按实际大小计入。后台每小时检查资源生命周期:超过 1 小时的 `pending/failed` 记录,以及超过 24 小时仍没有任何素材、画布、任务或其他业务引用的 `ready` 记录,会在再次校验引用后删除数据库记录并写入 `resource_deletion_jobs`,由幂等 Worker 清理物理对象。
|
||||
账号文件容量只统计 `ready` 资源,并按 Provider、Endpoint、Bucket、ObjectKey 对同一物理对象去重。上传中或失败记录不占用已存储容量。后台每小时检查资源生命周期:超过 1 小时的 `pending/failed` 记录,以及超过 24 小时仍没有任何素材、画布、任务或其他业务引用的 `ready` 记录,会在再次校验引用后删除数据库记录并写入 `resource_deletion_jobs`,由幂等 Worker 清理物理对象。
|
||||
|
||||
素材状态为 `archived` 时进入回收站。后台按“资源与请求策略”中的 `recycleBinRetentionDays` 定期扫描过期项;`0` 表示永久保留。自动清理与用户手动彻底删除复用同一 service 引用校验和 `resource_deletion_jobs` Outbox,仍被画布、项目、任务或其他业务记录引用的素材不会被删除。
|
||||
|
||||
@@ -9,6 +9,8 @@ description: 从产品功能快速定位主要代码入口
|
||||
|
||||
## 前端页面
|
||||
|
||||
云端 Agent:`web/src/components/canvas/canvas-cloud-agent-panel.tsx` 协调对话、Skills 和审批,`services/api/agent.ts` 适配运行快照与事件流;后端 `handler/agent.go` 负责 HTTP 合同,`app/cloud_agent.go` 负责权限、幂等、可信历史与画布摘要,`app/cloud_agent_runtime.go` 负责持久化模型循环,`app/cloud_agent_tools.go` 负责技能快照、画布工具和生成工具,`app/task_creation.go` 执行预算 admission,运行沿用任务 Worker。协议见 HTTP API 专题,未确认的真实登录态与上游联调见待测试清单。
|
||||
|
||||
| 功能 | 页面入口 | 主要协作模块 |
|
||||
| --- | --- | --- |
|
||||
| 首页与导航 | `web/src/pages/home/`、`web/src/layouts/user-layout.tsx` | `components/layout/`、`router.tsx` |
|
||||
@@ -32,7 +34,7 @@ description: 从产品功能快速定位主要代码入口
|
||||
| 项目恢复、持久化和项目级动作 | `web/src/pages/canvas/use-canvas-project-lifecycle.ts` |
|
||||
| Patch 历史、生成任务和重试控制 | `web/src/pages/canvas/use-canvas-history.ts`、`use-canvas-generation.ts`、`use-canvas-generation-executor.ts`、`use-canvas-generation-retry.ts` |
|
||||
| 文本、图片、视频和音频生成执行 | `web/src/pages/canvas/canvas-*-generation-executor*.ts` |
|
||||
| Agent、助手面板、导演台和全局快捷键控制 | `web/src/pages/canvas/use-canvas-agent-operations.ts`、`use-canvas-assistant-visibility.ts`、`use-canvas-director.ts`、`use-canvas-keyboard.ts`;面板容器 `components/canvas/canvas-assistant-panel.tsx`,展示层 `canvas-assistant-panel-views.tsx`,在线工具 `canvas-assistant-online-tools.ts`,影视续写 `canvas-cinematic-continuation.ts` |
|
||||
| 云端 Agent、助手面板、导演台和全局快捷键控制 | `web/src/components/canvas/canvas-cloud-agent-panel.tsx`、`web/src/pages/canvas/use-canvas-assistant-visibility.ts`、`use-canvas-director.ts`、`use-canvas-keyboard.ts`;画布操作契约在 `web/src/lib/canvas/canvas-operation-contract.ts` |
|
||||
| 选择拖拽与连线控制 | `web/src/pages/canvas/use-canvas-selection-controller.ts`、`use-canvas-connection-controller.ts` |
|
||||
| 上传、素材插入、媒体工具和短剧编排 | `web/src/pages/canvas/use-canvas-upload.ts`、`use-canvas-timeline-asset-insert.ts`、`use-canvas-media-tools.ts`、`use-canvas-storyboard.ts`、`use-canvas-generation-batches.ts`、`use-canvas-short-drama.ts` |
|
||||
| 节点操作、节点编辑和视口导航 | `web/src/pages/canvas/use-canvas-node-operations.ts`、`use-canvas-node-editor.ts`、`use-canvas-viewport-controller.ts` |
|
||||
@@ -50,8 +52,9 @@ description: 从产品功能快速定位主要代码入口
|
||||
| 布局和连线算法 | `web/src/lib/canvas/canvas-layout.ts`、`canvas-frame.ts` |
|
||||
| 任务结果回填 | `web/src/lib/canvas/canvas-generation-task-sync.ts` |
|
||||
| 本地持久化状态 | `web/src/stores/canvas/use-canvas-store.ts` |
|
||||
| Agent 会话状态 | `web/src/stores/canvas/use-canvas-agent-store.ts` |
|
||||
| 官方提示词目录与客户端起始稿 | `backend/internal/prompts/`、`web/src/lib/prompts/`、`web/src/lib/canvas/canvas-agent-protocol.ts` |
|
||||
| 云端 Agent 运行与事件 API | `web/src/services/api/agent.ts`、`web/src/components/canvas/canvas-cloud-agent-panel.tsx` |
|
||||
| Agent 画布上下文、操作与历史 | `web/src/lib/canvas/canvas-context-discovery.ts`、`canvas-operation-contract.ts`、`web/src/pages/canvas/use-canvas-operation-history.ts` |
|
||||
| 官方提示词目录与客户端起始稿 | `backend/internal/prompts/`、`web/src/lib/prompts/` |
|
||||
|
||||
## 前端 HTTP 与产品壳
|
||||
|
||||
@@ -112,8 +115,7 @@ HTTP 请求 -> handler -> service(稳定导入面 / 别名)-> app(组合
|
||||
|
||||
## 其他入口
|
||||
|
||||
- `canvas-agent/src/`:本地 Agent、MCP 工具和当前画布会话桥接。
|
||||
- `plugins/infinite-canvas/`:Codex App 插件清单与技能。
|
||||
- 旧版 `canvas-agent/` 和 Codex App/MCP 插件已删除;Agent 运行统一由后端云端控制面承载。
|
||||
- `docs/content/docs/`:产品、操作、开发和进度文档。
|
||||
- `docker-compose.local.yml`:本地前后端编排;`nginx.conf`:生产静态资源和 API 代理。
|
||||
|
||||
|
||||
@@ -1,112 +0,0 @@
|
||||
---
|
||||
title: 智能创作会话与执行
|
||||
description: 第一期在线创作的问答、审批、任务幂等与画布提交边界
|
||||
---
|
||||
|
||||
# 智能创作会话与执行
|
||||
|
||||
画布沿用原 `CanvasAssistantPanel` 的会话、输入框、模型选择、素材引用、Skills 和在线工具循环。`creative_respond` 是原工具目录中的新能力:模型自主判断是否需要补问或方案,同批出现该工具时直接形成等待屏障,不执行其余工具。普通对话可以直接输出文字,原画布读写工具继续保留。
|
||||
|
||||
`CanvasCreativeInteraction` 只渲染原助手消息中的交互卡片,没有独立输入框或会话列表。`CreativeAgentController.presentInteraction` 接收原 Agent 已返回的内容,负责校验、保存、批准和媒体执行,不再次请求模型。用户提交回答后回到原 Agent 工具循环,结合已确认需求继续规划。
|
||||
|
||||
首页独立“智能创作”入口已撤回;结构化创作从原画布助手使用。画布里的批准作用于当前真实画布。首页原会话通过下述接续入口进入画布。
|
||||
|
||||
## 首页会话接续
|
||||
|
||||
首页/创作页沿用原文本与媒体创作逻辑,新增工具栏“画布中继续”,原媒体结果入口也接到同一流程。`creation-canvas-conversation.ts` 将当前对话转换为画布原 `CanvasAssistantSession`,保留用户/助手消息、生成状态、任务 ID、模型规格及资料/技能引用目录;内部事实只写入 detail,并在后续模型请求中提供,不向用户展示大段协议 JSON。
|
||||
|
||||
来源会话记录 `canvasId`,画布 session 和来源消息使用稳定 ID。重复进入加载已关联画布,更新来源消息并保留画布中新增的对话与执行状态。首次进入把会话作为初始画布内容保存,源会话与画布均使用已有账号隔离存储;云端同步失败时明确提示仅本机保存。来源绑定目前随首页本机历史保存,不宣称跨设备双向同步或统一服务端任务 run。
|
||||
|
||||
媒体结果及可匹配的上传参考图/视频复用原 asset handoff,在画布页面加载后插入,已有 assetId 不重复插入。生成尚未完成时要求完成或停止;生成结果尚未对应到已保存资产时明确等待。音频和文件保留资料目录,此次不新增对应节点导入能力。会话合并是单向接续,画布中新对话不会反向复制首页。
|
||||
|
||||
画布通过 `conversation` 查询参数选择已保存的会话并打开原在线助手;参数只携带 ID,消费后移除,不自动发送模型请求、批准方案或重放任务。首页没有引入任何画布操作工具;需要继续执行时在画布原输入框输入要求。后续可在此基础上接电商工作台及更完整的角色上下文。
|
||||
|
||||
## 简化交互
|
||||
|
||||
模型根据相邻明确建议理解“可以/好的”,在当前任务范围内承接用户授权;常规创意选择、读取、已授权编辑和技术纠错不重复询问。请求上下文携带实际工具确认开关:关闭时直接调用授权范围内的普通画布工具,开启时交给原工具确认 UI,不增加前置口头确认。继续创作入口发送继续执行语义,默认回复简短。结构化方案及具体费用仍以程序批准记录为准,当前没有把自然语言自动转换为这两类批准。
|
||||
|
||||
前端仅传递 `input.agentRequests.canonical`,其中包括标准 `messages`、`tools`、`toolChoice`、`systemPrompt`。后端完成真实模型路由与资源归属检查、素材读取后,才转换实际供应商协议。普通内建协议只构造所选请求;声明式插件所需的四套字段仅在执行内存中展开,不写回任务正文。工具选择降级仍沿用原路径。
|
||||
|
||||
初始上下文只提供图片目录;模型通过只读 `canvas_inspect_image` 读取当前画布真实图片节点。构图预览最长边不超过 1600 像素、单图不超过 256 KiB;`original` 使用原图,`crop` 按归一化区域读取原始像素 PNG。单轮图片总预算为 6 MiB,超出则要求分批或缩小局部,不能悄悄降低细节精度。工具历史保存节点和读取方式,像素仅加入模型请求,新一批看图时释放上一批像素。原素材不变,读取事实不等于模型已完成视觉判断。
|
||||
|
||||
看图派生的预览与裁剪结果先上传资源存储,以内容摘要作为上传幂等键;原图复用已有账号资源。标准消息的图片地址只允许 `resource:` 引用,任务准备入口从这些引用生成去重的 `referenceImages` 清单。后端按当前用户校验资源归属和就绪状态,执行时才将引用替换为供应商需要的图片数据或临时地址;任务持久化正文不包含 Base64。上传失败时明确返回工具错误,不继续发送缺失素材的模型请求。
|
||||
|
||||
初始文本上下文按 192 KiB / 粗估 48,000 token 预算组织;当前要求、系统指令和已确认需求不截断,旧对话按完整会话组省略并告知模型。已落地方案使用结构摘要,待确认/失败修正方案保留原文。实时工具调用与结果保持配对,不做截断;包含工具目录的完整文本交换另有 384 KiB / 粗估 96,000 token 上限。估算不等于供应商 tokenizer 或真实模型窗口,达到预算时保留执行事实并提示缩小范围。完整工具任务发送前检查 15 MiB,后端 `/tasks` 的 16 MiB 限制不变。
|
||||
|
||||
当前消息自动恢复执行租约,连接异常后在后台重试,不再要求用户反复点击接管。历史消息只读,不竞争执行权;方案批准和具体费用批准仍保留,自动恢复连接不会自动批准或重新生成。
|
||||
|
||||
历史问答、已确认方案和报价默认折叠。当前阶段突出一个主操作,修改放在旁边,作品重做等低频操作收进“更多”;报价明细按需展开。布局沿用系统主题、间距和控件 token。点击修改回到原输入框,当前方案修改会撤销未消费的批准;已提交生成须先同步结果再调整。停止只阻止后续制作,画布撤销沿用原助手的撤销能力,不取消生成任务或退费。过期报价点击确认时先更新价格,仍须再次确认。
|
||||
|
||||
通用 Agent 根据所在页面提供角色、技能与素材上下文;本次只调整画布助手,不新增首页或其他工作台入口。
|
||||
|
||||
后端入口为 `handler/creation.go`,业务和权限在 `service/creation.go`、`creation_canvas.go`、`creation_agent_references.go`,持久化在 `repository/creation.go`。两张创作表和 Task 的提交关联见[数据库说明](backend-database.mdx)。
|
||||
|
||||
## 正式场景配置
|
||||
|
||||
内置场景统一维护在 `web/src/lib/creation/creative-scenarios.ts`,由 `creativeScenarioPrompt` 注入原在线 Agent 请求,模型自动识别场景,无需另选“智能创作”。当前属于随应用版本发布的内置策略,不是后台在线编辑器。已提交或已报价的请求保留原快照,发布配置后新的规划请求才采用新规则。
|
||||
|
||||
| 场景 | 主要业务 | 关键配置 |
|
||||
| --- | --- | --- |
|
||||
| 通用创作 | 咨询、文字创作、跨行业创作与场景识别 | 交付目标、受众、平台、素材、数量与必要规格;按主要目标选择行业 |
|
||||
| 短剧创作 | 原创故事、剧本改编、单集片段与预告 | 剧情、题材、角色、场景、道具、对白、时长与画幅;输出完整剧情和视听时序 |
|
||||
| 营销创作 | 品牌海报、社交种草、促销文案与单段广告视频 | 商品、受众、卖点、钩子、品牌、真实优惠、文案、数量与视频时长 |
|
||||
| 电商创作 | 商品主图、详情图、场景图、搭配展示与商品视频 | 商品/服装/模特素材角色、外观保留、展示角度、真实规格、数量和视频时长 |
|
||||
|
||||
每个场景包含 `instruction`(角色与目标)、`fields`(需求字段白名单)、`questionGuides`(补问条件、问法和候选选项)、`proposalSections`(方案内容要求)及 `workflowRules`(节点和引用规则)。短剧展示名更新,持久化标识仍为 `short-film`。
|
||||
|
||||
模型先读取已知信息,再按条件选问,默认每轮 1~3 题,必要时最多 6 题;推荐选项须根据当前需求和真实模型能力调整。场景字段仅作为参考,允许通过安全字段校验的自定义需求;需求字段不能赋予审批或执行权限。用户已明确的题材、数量、比例、时长等不再询问。用户授权自主创意时可直接提方案,建议不能伪装成用户已确认信息。
|
||||
|
||||
`creative_respond.plan` 可以描述最多 12 个动态步骤及调整原因;`creative-plan.ts` 将其关联到真实问答、方案、画布与媒体状态,不接受模型填写完成状态。计划保存在原消息 state,并在下一轮保留已观察完成的步骤。未返回动态计划的旧消息继续采用原进度展示。专业指导可以跨场景组合,当前仍按原批准与媒体依赖执行,不等同于新任务级调度器。
|
||||
|
||||
已完成或暂停的交互提供“让助手分析结果与下一步”,用户点击后发起原文本模型请求,携带最近执行记录与当前画布。此操作不自动重跑媒体;新方案继续要求批准。结果是否可视觉检查取决于实际输入和模型能力,任务成功不等于画面质量检查通过。
|
||||
|
||||
`creative-agent-recovery.ts` 在原模型首轮与后续工具回复呈现前校验交互。错误及原始工具参数回到模型,最多两次自动修正,只开放创作交互工具;不能执行同批夹带的画布操作。模型可修正方案或提出动态问题;持续无效时展示恢复选择,原错误保留诊断日志。自动修正属于文本推理请求,沿用文本计费,不代表免费,也不替代媒体费用批准。取消时不再启动后续修正。
|
||||
|
||||
短剧只按真实内容需要生成缺失角色/场景/道具图;营销的海报版本分别体现不同传播角度;电商明确商品主体与可变背景。已有图片作为引用节点,不进入重复收费的生成项。只要文案时不自动附加媒体任务;缺少真实商品素材时不以虚构商品冒充实物。独立配音、合成和精确试衣不由场景提示词凭空赋予。
|
||||
|
||||
### 模型、素材与技能设置
|
||||
|
||||
场景不绑定固定模型或价格。部署中需要配置可用的系统受管文本模型;问答和方案使用工具调用,有图片资料时文本模型还需支持视觉理解。图片模型需配置真实支持的尺寸和参考图数量;视频模型需配置真实支持的时长、比例、参考图数量及声音能力。生成报价仍走现有模型计费,不能使用场景推荐值作为价格或能力依据。
|
||||
|
||||
用户继续通过原助手的模型选择、选中画布素材和技能入口提供上下文。Skills 仍由原在线 Agent 按现有运行时装载,不自动安装插件或绑定不存在的技能。没有额外行业 Skill 也会加载内置场景策略。
|
||||
|
||||
### 原历史会话中的持久化
|
||||
|
||||
交互存入 `CanvasAssistantMessage.detail`,标记为 `creative-interaction`,包含原模型输入、服务端 runId、结构化需求、问题与已提交答案、方案及版本、报价与批准摘要、执行状态和产物资源引用。它随原 `chatSessions` 进入已有账号隔离的画布存储与云同步,不建立第二套聊天历史。
|
||||
|
||||
每条结构化回复拥有稳定的提交身份,刷新按 runId 读取服务端运行事实;回看旧卡片不会自动批准或重放任务。未提交答案按账号、原会话和消息暂存本机。已提交答案进入原会话,并作为下一次原 Agent 请求的上下文。报价历史保留金额与批准摘要,账务仍以服务端为准。
|
||||
|
||||
在使用过程中调整补问方式修改 `questionGuides`,调整方案内容修改 `proposalSections`,调整素材依赖和产物组织修改 `workflowRules`;发布后对新的规划请求生效。已批准方案和费用不会因场景配置变动而自动扩大执行范围。
|
||||
|
||||
## API 合同
|
||||
|
||||
以下路径均以 `/api/creation-runs` 为前缀,使用现有登录 Cookie 和统一业务响应。对象归属由 service 校验。
|
||||
|
||||
| 请求 | 用途 |
|
||||
| --- | --- |
|
||||
| `POST /`、`GET /`、`GET /:id` | 按 clientKey 幂等创建、列表和恢复 run/submissions |
|
||||
| `PATCH /:id` | 用 revision 保存结构化会话和状态 |
|
||||
| `POST /:id/claim` | 用 expectedEpoch 接管执行,更新 owner 和 epoch |
|
||||
| `POST /:id/heartbeat`、`release` | 续租与释放执行权 |
|
||||
| `POST /:id/proposal-approve`、`proposal-invalidate` | 批准具体版本和操作范围,或使原批准失效 |
|
||||
| `POST /:id/canvas` | 批准后绑定稳定画布,不提前建草稿节点 |
|
||||
| `POST /:id/submissions/prepare` | 按 itemKey 准备具体请求和报价,不扣费、不提交 Task |
|
||||
| `POST /:id/submissions/approve` | 批准列出的提交,核对报价有效性 |
|
||||
| `POST /:id/submissions/refresh` | 从原请求生成后继报价,撤销未消费旧项,等待新批准 |
|
||||
| `POST /:id/execute` | 使用已批准提交进入原 Task/账务事务,幂等返回任务 |
|
||||
| `GET /:id/canvas-snapshot` | 获取当前画布和 snapshotHash |
|
||||
| `POST /:id/canvas-commit` | 检查 epoch、批准范围与 snapshotHash 后提交画布 |
|
||||
|
||||
写请求携带 `owner`、`executionEpoch`;会话和方案写入还携带 `revision`。服务端批准字段独立于页面 state JSON;修改 state 不能自行授权。execute 返回 Task,不修改 run revision,刷新依 submission.taskId 对账,不以超时作为重复生成依据。
|
||||
|
||||
图片在会话中使用 `resource:` 标识,后端检查资源归属和模型视觉能力,执行时转换为相应供应商输入;不把带签名 URL 或 data URL 持久化进规划。图片生成先进入现有素材库再回写节点 assetId,引用下游生成时使用真实已就绪资源。
|
||||
|
||||
结构化方案的媒体提交仅支持受管模型,单次输出 count 为 1,媒体生成单独报价批准。原在线 Agent 的对话与工具推理沿用既有文本请求和计费方式,不再使用被撤回独立界面的分析报价入口。估算价格按实际用量结算,不代表消费上限。修改模型、参数、提示词或引用需重新批准具体提交;原任务仍运行或账务不明确时不能重做收费。
|
||||
|
||||
## 恢复与限制
|
||||
|
||||
关闭浏览器不会取消已提交的后端任务,后续编排需要重新打开会话并取得执行权。方案批准、费用批准和结果回写分别持久化;重做保留原节点及成功产物,新一轮使用新的提交标识。失败不得自动创建第二个收费任务。
|
||||
|
||||
画布写入只在对应画布适配器就绪时发生,服务端按批准范围限制改动。当前标签页通过现有远端同步队列串行化提交;这不是全站协作协议,旧页面跨标签或设备保存仍需避免同时编辑同一画布。既有直接生成和本机 Agent 不因此获得新审批规则。
|
||||
|
||||
实际短片、UI 与 PostgreSQL 联调状态见[待测试](../progress/pending-test.mdx)。
|
||||
@@ -9,6 +9,38 @@ description: 信封、错误码与 OpenAPI
|
||||
|
||||
机器可读规范:运行中的 `GET /api/openapi.yaml`,源文件 `backend/internal/handler/openapi.yaml`。前端 TypeScript 仍走 `web/src/services/api` 的 `http`,不从 OpenAPI 生成客户端。
|
||||
|
||||
## 云端 Agent
|
||||
|
||||
所有 `/agent` 路径都需要登录 Cookie。`GET /agent/capabilities` 返回当前版本(2)、权限模式、上下文范围、技能和工具清单。Agent 运行由服务端任务 Worker 驱动,浏览器断开不会停止运行。
|
||||
|
||||
- `POST /agent/runs` 创建一轮;`POST /agent/runs/:id/messages` 以上一轮为父节点创建新的不可变轮次,两者返回 `{ run }`,追加后必须使用新的 `run.id` 订阅。
|
||||
- 请求字段:`canvasId`、`prompt`、受管 `logicalModelId` 或 `channelId` + `channelModelKey`、`permissionMode: "read_only" | "request_approval" | "auto"`、`skillIds`、`contextScope: [] | ["canvas"]`、`budget: { maxCredits, maxGenerationTasks, maxVideoSeconds }`、`idempotencyKey`。不接受密钥、自定义 URL、客户端历史或未知字段。
|
||||
- 同用户同幂等键及相同请求返回同一运行;不同请求复用键返回 409。失败后重试同一提交应保留键。上一轮未完成时禁止追加;成功轮次历史从服务端加载,最多携带 8 对历史消息及 64KB 历史 JSON,超限提示新建对话。
|
||||
- 创建和追加消息可传 `thinking: boolean`(默认关闭),贯穿首轮及工具后续模型调用;内置 Chat Completions、Responses、Claude 协议复用文本推理配置,上游模型仍需支持。声明式 Agent 渠道暂不支持,开启时明确报错,不静默忽略。思考模式可能增加耗时和费用。
|
||||
- 已安装且属于当前用户的技能会在创建时固定版本快照,模型只能通过 `skill_read_file` 读取快照文件。技能正文是不可信输入,不能改变权限或系统规则。
|
||||
- 当前工具为 `canvas_get_state`、`skill_read_file`、`task_get`、`model_list`、`canvas_apply_ops`、`generate_media`。画布写入工具要求本轮授权 `contextScope: ["canvas"]`。禁止 shell、任意网络请求和外部 MCP。
|
||||
- `canvas_apply_ops` 必须带 `snapshotHash`,每批最多 20 项;支持新增文本、Markdown、图片、视频、音频、分组与分镜表节点,以及 `connect_nodes` 引用连线。媒体占位节点的 `content` 是提示词,不是媒体 URL;只建节点不提交收费生成。`update_node` 仅允许更新未锁定文本 / Markdown 的标题和正文;禁止删除、任意元数据写入、自连接、重复边与不存在的端点。
|
||||
- `model_list` 复用生成面板的当前模型目录。每项的 `selection` 是 `logicalModelId` 或 `channelId` + `channelModelKey`,工具调用必须原样选择一种,不猜 ID 或混用;能力、规格、价格与任务准入再次核对。
|
||||
- `generate_media` 支持图片 / 视频:必填 `mode`、`prompt`、`size`、`durationSeconds`(图片为 0)、`snapshotHash`、新 `nodeId`、`title`、有序 `referenceNodeIds`(无参考传空数组),再加一种模型选择;可传来源节点 `sourceNodeId`、`quality`、视频 `videoGenerateAudio`。`sourceNodeId` 仅接文本 / 镜头提示词节点;参考图片、视频、音频只放 `referenceNodeIds`,无文本来源时留空且不重复传入。引用从当前画布节点的账号资源解析,校验归属、类型、就绪状态和模型能力,不接受任意 URL。图片生成仅接图片参考;视频可按模型能力接图片、视频、音频参考。
|
||||
- 参数选择与收费授权分开:用户明确说“随便 / 你决定 / 按默认”时,Agent 可从当前目录选择能力及预算匹配的模型,优先用户最近明确使用的可用模型,其次价格清楚的低成本选项;支持时沿用参考图原始比例,否则选目录默认,时长用目录默认。未要求音频且模型不支持时用默片。用户接受已推荐方案后不再要求特定确认口令;仅真正缺失或冲突的阻塞项一次性询问。本轮已有目录结果应复用。以上是 Agent 的参数选择策略,服务端仍强校验具体规格,不提供绕过预算 / 能力校验的默认兜底,也不绕过独立收费审批。
|
||||
- 媒体参数先进行无任务、无预留账单的准入校验,再在同一事务创建草稿节点、来源 / 资产连线及待审批检查点;`approval_requested` 和运行中的 `approval` 携带目录真实 `modelName`。用户批准后才在事务中绑定任务、创建预留账单并更新检查点;拒绝或取消保留未生成草稿,不提交媒体任务。草稿仅允许原运行认领,不能覆盖其他节点。已明确审批的规格不得被模型默认值静默替换。媒体终态回写原节点;已删除或已换任务的节点不自动复活,结果仍可从任务中心查看。
|
||||
- Agent 的 `snapshotHash` 忽略顶层 `viewport`、`updatedAt`,避免平移 / 聚焦自动保存使审批失效;节点、连线、标题等内容改动仍需重新读取并审批,数据库写入仍使用完整快照 CAS。客户端刷新同样区分视口和真实内容编辑,并保留本地视口。
|
||||
- `read_only` 只允许读取;`request_approval` 对写画布和媒体生成暂停为 `waiting_approval`;`auto` 可在预算内执行已授权画布操作,但图片 / 视频生成始终独立审批,不能绕过。每轮最多 8 次模型调用、8 个生成任务和 120 秒视频,实际报价在创建任务及预留积分前校验。失败事件保留具体错误和已有任务的 `taskId`、`nodeId`、`status`;媒体结果的 `phase` 区分 `admission` 与 `completion`,`taskSubmitted` 表达是否已提交。模型应报告错误,不能自行删减提示词或自动重试收费生成。
|
||||
- 必须有当前用户已保存的画布。首轮摘要最多取前 80 个节点;`canvas_get_state` 可按 `offset` 每页读取 40 个节点、资产可引用状态及相关连线,按 `nodeIds` 精读最多 8 个节点(正文每字段最多 16000 字符),通过 `hasMore` / `nextOffset` 和字段 `Truncated` 判断是否完整。分镜表包含镜头、角色节点与资产绑定;摘要每页最多 20 行,精读每次 1 行,可用 `storyboardOffset` 翻页;单行叙事文本累计最多 24000 字符,角色 / 绑定各最多 16 项。上下文不含媒体 URL、任意元数据或未同步修改;节点名称不等于图像视觉识别。普通任务重试接口不能重试 Agent 任务。
|
||||
- `GET /agent/runs/:id` 返回运行信息;`POST /agent/runs/:id/cancel` 取消当前运行及活动子任务;`POST /agent/runs/:id/approvals/:approvalId/decision` 接受 `{"decision":"approve"|"reject","reason":"..."}`,审批决定幂等且服务端校验归属。
|
||||
- `GET /agent/runs/:id/events` 返回 `agent_event` 和首次 / 状态版本变化时的紧凑 `run_snapshot` SSE;无变化时只发送 heartbeat。事件 `Seq` 在运行内递增;支持 `?after=` / `Last-Event-ID`,游标不是运行 ID。`cleanupPending: true` 时即使运行已进入终态也会继续推送,直到后台收尾完成。前端应以快照恢复状态,代理只对这一精确路径关闭缓冲。
|
||||
- `generation_task_created` 携带 `canvasId`、`nodeId`、`taskId`、`title`、`mode`、`referenceNodeIds`。草稿、提交、画布工具写入,以及媒体成功 / 失败 / 取消的真实节点变更,均在画布写入与运行检查点的同一事务持久化 `canvas_updated`。节点已删除或换任务时不伪造更新;`run_failed` 本身不代表节点媒体任务失败。
|
||||
- `canvas_updated` 包含 `canvasId`、`operation`、`callId`、`actions` 和 `canvasPatch`。`canvasPatch` 为 `{ canvasId, updatedAt, nodes: [{ before, after }], connections: [{ before, after }] }`;新增对象的 `before` 为 `null`,仅包含有变化的节点和连线。当前工具不开放删除。`actions` 固定保存操作类型、节点 ID、标题、类型,引用操作还带目标节点 ID,供历史消息显示和点击定位;`callId` 用于合并同一画布操作的工具完成消息。
|
||||
- 前端对增量按 40ms 窗口合批,三方合并远端基线、当前 Store 和编辑器,正常完成 / 失败无需全量 GET;保留无关节点编辑、拖动与视口,同字段冲突、删除或新任务绑定不强行覆盖。只有事件缺口、断流、增量冲突或没有增量的事件源需要全量校准,同一画布协调器最多每秒发起一次,单请求在途,期间重复通知合并为一次尾随校准。已识别增量协议后,相邻 `tool_failed` / `run_failed` 不重复触发整图刷新。
|
||||
- Agent 创建 / 续聊请求在客户端先持久化完整正文、幂等键、父运行和消息 ID,再提交;网络超时或响应丢失只允许用同一正文和 key 有界重放,不能换 key 生成新收费轮次。待确认记录损坏时对话暂停发送,不把它当成“从未提交”。
|
||||
- 生成按钮与提交入口共用节点任务状态:排队 / 运行中不可重复生成,终态解除任务锁,历史 `taskId` 不永久禁用。聊天留痕保留节点名、引用与失败任务 ID,点击使用现有画布聚焦;已删除节点只提示,不自动重建。聊天缓存不重复保存增量中的完整节点正文。
|
||||
|
||||
Agent 的聊天列表缓存只负责 UI 恢复;运行、技能快照、审批、工具调用、子任务和事件均以服务端持久化状态为准。提交响应丢失时,客户端应使用同一幂等键重试,不生成新的提交。
|
||||
|
||||
Skills 的 `tool_completed` / `tool_failed` 事件附带 `skillId`、`skillName`(已启用技能)和 `path`;空路径表示列目录,不表示已读取文件。目录结果中的 `files` 为本轮固定快照的可读路径,空数组时应使用已加载正文继续。同一运行内同技能同路径只允许请求一次(包括不存在的路径),重复请求返回工具失败和继续执行指引,状态随运行持久化。模型初始上下文包含技能 ID 和可读文件清单。
|
||||
|
||||
模型任务失败的 `run_failed` 事件保留 `taskId`,并提供安全分类 `reason`:`model_connection_reset`、`model_request_timeout`、`model_connection_refused` 或 `model_task_failed`。`text` 不透传原始上游错误,避免泄露地址和凭证;前端用事件类型而非摘要关键词判断工具成功 / 失败。失败不会触发自动付费重试。
|
||||
|
||||
## 管理员支付订单
|
||||
|
||||
`GET /api/admin/payments/orders` 需要管理员权限,支持 `status`、`keyword`、`page`、`pageSize`。关键词匹配订单号、渠道交易号、用户名称、用户名或邮箱,也支持完整用户 ID 精确匹配。用户名和邮箱搜索忽略大小写;状态过滤同时生效,返回匹配总数和当前页订单。
|
||||
|
||||
@@ -54,7 +54,7 @@ bun install --frozen-lockfile
|
||||
bun run dev
|
||||
```
|
||||
|
||||
`web/` 与 `canvas-agent/` 只使用 `bun.lock`。不要用 pnpm 或 npm 往同一套 `node_modules` 里再装一遍。
|
||||
`web/` 只使用 `bun.lock`。不要用 pnpm 或 npm 往同一套 `node_modules` 里再装一遍。
|
||||
|
||||
前端默认监听 `0.0.0.0:3000`,Vite 将 `/api` 和 OAuth 回调代理到 `127.0.0.1:8080`。如需修改代理目标,可设置 `VITE_API_PROXY_TARGET`。
|
||||
|
||||
|
||||
@@ -1,703 +0,0 @@
|
||||
---
|
||||
title: 通用创作 Agent 需求与设计
|
||||
description: 复用现有在线助手、画布、插件和生成任务,实现跨场景问答、确认、辅助编辑、自定义业务节点与生成交付的增量设计
|
||||
---
|
||||
|
||||
# 通用创作 Agent 需求与设计
|
||||
|
||||
> 文档状态:需求与设计评审稿。产品边界依据已确认的讨论整理;标注为“设计建议”的接口、字段和文件拆分仍需在实现时对照调用方细化。本文不代表相关功能已经实现或通过运行验收。
|
||||
|
||||
第一期的媒体复核、页面状态、交互细节和代码改动边界见[第一期体验与实现设计](../../../design/creative-agent-phase-one.mdx),另附[交互原型](../../../design/creative-agent-phase-one-prototype.html)。第一期发布包含首页同会话接续和真实单段短片产出;画布内部闭环只是开发里程碑。
|
||||
|
||||
## 1. 产品目标与最终决策
|
||||
|
||||
影策提供通用创作助手,用户输入目标并提供素材,Agent 理解上下文、补问缺失信息、给出大纲和执行方案;用户确认后,Agent 实际创建画布节点、连接流程、提交获批的生成任务,并把真实结果写回画布。用户可以在过程中对话、修改方案、手工编辑画布和选择局部重做。
|
||||
|
||||
底层能力支持创作、影视与短剧、营销、电商等场景。行业差异通过场景配置、自定义提示词、Skills 和现有插件/工具实现,不为每个场景复制一套 Agent。
|
||||
|
||||
Agent 同时承担已有画布的辅助编辑:修改内容和参数、调整节点布局与连线、局部重做;还可以在已接入的执行能力范围内提出新的业务节点定义并编排流程。分镜、视频拉片/抽帧、角色/场景/道具替换是重点用例。新节点定义不能自动产生系统尚未接入的算法或模型能力。
|
||||
|
||||
### 1.1 已确认的约束
|
||||
|
||||
| 编号 | 最终决策 | 实现含义 |
|
||||
| --- | --- | --- |
|
||||
| D01 | 不接入 Harness | 沿用现有在线模型调用和浏览器工具循环,不引入新的 Agent 引擎或运行服务 |
|
||||
| D02 | 不建设完整服务端画布 MCP | 在线助手继续通过前端函数调用画布;接口保持清晰,但不为未来 MCP 提前重构 |
|
||||
| D03 | 画布仍是独立功能 | 画布可由人直接使用,Agent 经明确操作接口使用画布,不绕过校验直接改内部状态 |
|
||||
| D04 | 不增加草稿节点 | 方案先在对话中展示,用户确认后才创建或修改对应画布节点 |
|
||||
| D05 | 问答结合上下文动态生成 | 支持场景模板、模型自主提问及混合模式;已明确的信息不重复问 |
|
||||
| D06 | 确认控制实际执行 | 方案批准与费用授权有明确范围,模型不能自行批准或跳过收费门槛 |
|
||||
| D07 | 计划面板按任务出现 | 普通聊天不展示;多步骤任务展示;结束后收起并保留历史 |
|
||||
| D08 | 增量调整,优先复用 | 不按概念清单全面拆模块,不复制行业页面,不建立平行生成/计费/素材系统 |
|
||||
| D09 | 新增共性能力适度封装 | 问答、方案卡和计划展示可独立封装;现有逻辑只在出现真实共享需求时提取 |
|
||||
| D10 | 前端执行边界如实展示 | 关闭网页后不承诺 Agent 继续推进;后端已接受的任务按其现有运行方式继续 |
|
||||
| D11 | 支持已有节点辅助编辑 | 明确的小修改复用现有工具,不强制长问答;复杂调整说明范围,收费生成另行授权 |
|
||||
| D12 | 支持组合已有能力定义业务节点 | Agent 生成结构化节点定义,由系统校验输入、参数、输出和执行绑定,确认后创建实例 |
|
||||
| D13 | 插件扩展真实能力 | 当前项目节点可保存为模板;需要分发、专用界面或新执行器时复用插件体系,不为每个节点都开发插件 |
|
||||
|
||||
本次不要求删除本机 Codex、影策 MCP 插件或本机渠道。它们不是新链路的必需依赖,是否保留入口按已有产品功能处理,不连带删除 Dreamina、ComfyUI Bridge 等能力。
|
||||
|
||||
### 1.2 不纳入本轮的能力
|
||||
|
||||
- 服务端常驻通用 Agent、按用户创建 Harness 容器、自动多 Agent 团队。
|
||||
- 关闭浏览器后继续发起下一阶段、无人值守跨日执行。
|
||||
- 任意生成 React 组件、任意代码节点或在服务器自由安装插件。
|
||||
- 仅凭节点名称或任意 metadata 自动获得新算法;把当前插件字段展示器视为已实现的动态表单与执行器。
|
||||
- 全部历史会话格式统一迁移、重建画布、替换模型协议层。
|
||||
- 仅凭提示词保证商品纹样、Logo、角色或服装细节完全一致。
|
||||
- 首版完成所有行业模板、完整视频自动剪辑和所有交付格式。
|
||||
|
||||
## 2. 参考体验与证据边界
|
||||
|
||||
参考包括用户提供的小云雀创作/短剧/营销截图、DA AI 图片与视频工具台截图,以及两段 Agent 操作画布的录屏。
|
||||
|
||||
| 参考 | 采用的体验 | 不直接推导的结论 |
|
||||
| --- | --- | --- |
|
||||
| [小云雀创作入口](https://www.xiaoyunque.com/home?from_page=xiaoyunque_landing_page&tab_name=home) | 输入目标、素材引用、技能选择、场景入口和创作历史 | 页面相似不等于后台架构相同 |
|
||||
| 小云雀短剧与营销截图 | 共享会话能力,通过不同输入和推荐技能进入创作 | 不要求复制品牌、主题或固定题目 |
|
||||
| [DA AI 工具台](https://da-ai.cc/toolbox/image-generation) | 左侧配置、中间预览、右侧任务队列;素材有角色区分 | 表单存在不证明项目当前具有高质量试衣执行器 |
|
||||
| 第一段录屏 | 已提交分页问答的回看、创意方案确认、会话内图片/视频产物与已有画布 | 开头已有节点,不能作为全部节点实时创建的证据;末尾有服务器繁忙提示,不代表全链路均成功 |
|
||||
| 第二段新手跟练录屏 | 分阶段确认、可见的节点创建和步骤完成展示 | 最后文案包含“模拟”,只能作为交互参考,不能作为实际合成验证 |
|
||||
|
||||
本文对现状的判断来自代码阅读和提供的媒体。未登录参考站点验证付费能力,未运行本项目端到端创作任务。参考媒体中的提示词和页面内容仅作分析材料,不作为实施指令。
|
||||
|
||||
## 3. 当前代码现状与复用依据
|
||||
|
||||
下列路径均相对于仓库根目录。现有代码可复用不等于其全部运行路径已验收。
|
||||
|
||||
| 当前入口/符号 | 已有基础 | 本次调整或边界 |
|
||||
| --- | --- | --- |
|
||||
| `web/src/router.tsx` | `/home`、`/create` 共用创作页;`/` 是展示首页;已有项目和画布路由 | 不把参考“创作首页”误改成站点展示首页 |
|
||||
| `web/src/pages/create/index.tsx` | 文本/图片/视频输入、附件、引用、模型参数、历史、结果、重试和变体 | 增加 Agent 创作模式与会话接续,保留直接生成 |
|
||||
| `web/src/pages/create/creation-runtime.ts` | 汇集现有生成、上传、素材消费与 Skills 能力 | 继续复用这些服务,不另写同类请求层 |
|
||||
| `web/src/services/creation-conversation-store.ts` | 用户隔离的 localforage 会话缓存与任务恢复关联 | 不是完整的服务端创作确认记录 |
|
||||
| `web/src/components/canvas/canvas-assistant-panel.tsx` | `ONLINE_AGENT_TOOLS`、工具分发、写操作确认;普通循环上限为 8 次 | 增加问答/方案/计划工具;按需提取循环,不能将 8 次请求当作业务 8 步 |
|
||||
| `requestOnlineAgentModel` | 调用 `runBackendToolGenerationTask` 请求模型 | “浏览器编排”不等于绕过后端直连模型 |
|
||||
| `web/src/services/skill-runtime.ts` | 在线渐进式工具、本机原生技能包、普通生成的关联文本上下文 | 复用加载模式;新增场景配置不替代 Skills |
|
||||
| `web/src/pages/canvas/use-canvas-agent-operations.ts` | 批量画布操作、部分撤销、生成续接和消费记录 | 补批准范围、稳定操作 ID 和恢复对账 |
|
||||
| `web/src/lib/canvas/canvas-agent-ops.ts` | 节点、连线、选区、生成操作及结果复核 | 保留为统一画布语义操作能力 |
|
||||
| `web/src/lib/canvas/canvas-asset-handoff.ts` | 创作结果转入画布 | 结果转入不等于会话、方案和计划一起接续 |
|
||||
| `web/src/services/api/project-agent-tools.ts` | 项目上下文、资产候选、镜头与工作流等工具 | 在现有权限与业务范围内复用,不只做页面跳转 |
|
||||
| `web/src/pages/projects/detail/workflow-production-workbench.tsx` | 分镜图、预演、镜头视频和素材引用 | 保留专业生产流程,不复制新的短剧系统 |
|
||||
| `backend/internal/service/task_creation.go` | 任务校验、模型路由、并发额度、任务与计费入口 | 新费用授权需要在实际收费入口闭合校验 |
|
||||
| `backend/internal/service/task_billing.go` | 结算、退款、状态不确定时的重试门槛 | 不以本轮新授权替代现有账务核对 |
|
||||
| `backend/internal/service/task_render.go` | 已有 FFmpeg 时间线渲染 | 不声称缺少全部合成能力;需要补 Agent 到已有渲染的调用链 |
|
||||
| `workflow-stage-views.tsx` 的 `DeliveryStage` | 交付状态展示 | 当前交付包按钮仍标注后端未接入 |
|
||||
| `web/src/lib/plugins/`、`web/src/services/plugin-host.ts` | 应用插件清单、注册、权限、UI/协议贡献 | 插件启用不自动等于 Agent 获得相应工具 |
|
||||
| `web/src/lib/plugins/plugin-types.ts` 的 `PluginCanvasNodeContribution` | `contributes.canvasNodes` 声明名称、默认尺寸、schema、renderer、输入类别和输出连接点 | 尚缺角色化多端口、节点执行绑定等完整合同 |
|
||||
| `web/src/lib/canvas/node-registry/` | 内置/插件节点共用注册表;`CanvasNodeTypeId` 容纳插件类型 | 复用注册与查询,补类型冲突保护、版本与作用域;Agent 的创建操作仍需对齐动态类型 |
|
||||
| `web/src/components/canvas/canvas-node-content.tsx` | 通用声明式插件节点读取 `pluginData` 并展示字段;内置专用节点可单独渲染 | 通用 schema 当前不自动生成编辑表单;sandbox 仍显示等待隔离运行时 |
|
||||
| `web/src/lib/canvas/canvas-video-frame.ts`、`web/src/pages/canvas/use-canvas-media-tools.ts` | 按时间点截取视频画面、保存并创建图片节点 | 复用抽帧,不把现有按钮能力当成已经暴露给 Agent 的工具或完整拉片能力 |
|
||||
| `web/src/constant/canvas.ts`、`web/src/components/canvas/canvas-script-node.tsx` | 已有分镜脚本节点、结构化镜头行及生产操作入口 | 优先补 Agent 对已有分镜数据的受控编辑,不另造同义节点 |
|
||||
|
||||
当前在线助手是 Tool Calling 加前端函数分发,不经过 MCP。本机 Codex 路径才通过影策 MCP 和本机 Canvas Agent 桥接,二者不可混写。
|
||||
|
||||
## 4. 用户入口与场景要求
|
||||
|
||||
### 4.1 创作首页
|
||||
|
||||
- 复用现有创作输入、附件、素材引用、模型选择、Skills、结果和历史。
|
||||
- 支持普通生成与 Agent 创作。普通咨询、直接生成不强制走长流程。
|
||||
- Agent 模式支持通用创作、短剧、营销、电商等场景入口;用户可显式选择,模型也可提出场景建议。
|
||||
- 选择场景只影响本次任务的提示与默认配置,不清空用户已输入的素材和要求。
|
||||
- 历史记录可恢复对话、待回答卡片、已批准方案及真实任务状态。
|
||||
|
||||
### 4.2 短剧入口
|
||||
|
||||
- 支持上传或粘贴剧本、辅助创作和进入已有项目,接续现有章节、资产、分镜工作台。
|
||||
- 文件上传成功不等于正文解析成功;TXT、DOCX、PDF 的提取能力逐格式验证,扫描 PDF 等不能默认为可读。
|
||||
- 用户已给题材、时长、比例和风格时,直接复用,不固定再问同样问题。
|
||||
- 大纲、剧本与镜头方案确认后才创建本阶段画布内容,付费生成另按批准范围执行。
|
||||
|
||||
### 4.3 营销入口
|
||||
|
||||
- 输入支持商品、角色/模特等角色化素材及卖点、渠道、受众、创意方向。
|
||||
- 创意、Hook、风格和推荐 Skills 使用场景配置;模型按已有信息补问。
|
||||
- 输出可以是文案、海报、系列图或广告视频,不能默认所有营销任务都生成视频。
|
||||
|
||||
### 4.4 电商工具台
|
||||
|
||||
- 采用配置、预览、任务队列的布局,复用现有生成与素材能力。
|
||||
- 直接操作和 Agent 辅助共存,例如“帮我写提示词”“帮我规划一组商品图”。
|
||||
- 商品、模特、上装、下装等素材角色具有明确标识、数量与必选关系。
|
||||
- 服装上身需验证专用能力或多图编辑效果;不能仅改输入框就对外承诺精确试衣。
|
||||
- 队列默认筛选当前工具/会话相关任务,保留跳转全局任务中心的入口,不再维护一份任务真相。
|
||||
|
||||
## 5. 核心用户流程
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[输入目标与素材] --> B[结合场景与上下文判断]
|
||||
B --> C{需要多步骤创作吗}
|
||||
C -->|否| D[普通回答或已有直接操作]
|
||||
C -->|是| E[建立任务计划并补齐必要信息]
|
||||
E --> F[对话展示需求摘要与大纲方案]
|
||||
F --> G{用户确认方案}
|
||||
G -->|修改| E
|
||||
G -->|确认| H[创建或更新本阶段节点及连线]
|
||||
H --> I{是否需要收费调用}
|
||||
I -->|是| J[展示真实报价并等待授权]
|
||||
J -->|批准| K[提交生成任务]
|
||||
I -->|否| K
|
||||
K --> L[真实状态和产物回写]
|
||||
L --> M{后续阶段或修改}
|
||||
M -->|已有批准覆盖的下一步| H
|
||||
M -->|方案或费用范围变化| F
|
||||
M -->|完成| N[交付并收起计划]
|
||||
```
|
||||
|
||||
上图表示创作阶段关系,不表示任何文本模型调用免费。若首次理解、提问或方案生成需要计费,必须先取得相应的文本调用授权,见费用设计。
|
||||
|
||||
### 5.1 正常链路
|
||||
|
||||
1. 用户提交需求;关联素材和当前选择的场景配置版本。
|
||||
2. Agent 读取当前需求、历史答案、可用素材、相关技能和真实模型能力。
|
||||
3. 仅对缺失、冲突或显著影响执行的信息提问。信息足够时可直接给方案。
|
||||
4. 需求摘要可独立确认,也可与方案一起展示;不为了形式重复增加点击。
|
||||
5. 方案在对话中展示,并明确将新增/修改的内容、阶段和预期产物。
|
||||
6. 用户确认后才对画布执行本阶段操作;需要时创建空白画布容器并打开,容器创建也应在该确认之后。
|
||||
7. 收费生成先报价并取得授权;在已有批准范围内不反复弹同样确认。
|
||||
8. 任务排队、运行、失败和资源就绪状态写回原节点、计划和会话。
|
||||
9. 用户可修改、局部重做、进入专业工作台编辑或下载已有产物。
|
||||
|
||||
### 5.2 简单任务与普通对话
|
||||
|
||||
“这张图是什么风格”不建立制作计划;“把标题改成夏日限定”在明确请求范围内执行既有编辑;“做一套营销素材”才进入多步骤链路。用户直接提出的明确编辑指令可作为该操作的授权,不强制再生成大纲,但删除、覆盖和费用仍按影响范围处理。
|
||||
|
||||
## 6. 场景配置与 Skills
|
||||
|
||||
### 6.1 配置职责
|
||||
|
||||
场景配置确定关注的信息、默认策略和可用范围;Skills 提供领域方法、模板和参考资料;系统规则负责权限、计费和能力约束。三者不能相互替代。
|
||||
|
||||
| 配置 | 内容 | 使用方 |
|
||||
| --- | --- | --- |
|
||||
| 基本信息 | 场景 ID、名称、简介、版本、启用状态 | 页面与会话 |
|
||||
| 场景提示词 | 角色、目标、交付风格、提问原则 | 模型 |
|
||||
| 需求字段 | 稳定 key、数据类型、说明、来源与依赖 | 模型与校验器 |
|
||||
| 必要条件 | 在规划前或具体执行前需要哪些素材/参数 | 模型与执行校验 |
|
||||
| 问答策略 | 模板/动态/混合、每批上限、自定义与跳过规则 | 模型与面板 |
|
||||
| 默认值 | 可自动采用、需提示、需用户确认的默认值 | 模型与需求状态 |
|
||||
| 参考内容 | 示例问题、建议选项、推荐 Skills | 模型与入口推荐 |
|
||||
| 能力约束 | 支持的产物与工具类别 | 工具分发与真实能力接口 |
|
||||
|
||||
首版不建设拖拽式问卷编辑器。采用内置配置加简单后台表单/JSON 校验编辑;首个开发阶段可先用版本化配置验证,发布面向运营使用前补启停、保存校验和版本记录。
|
||||
|
||||
### 6.2 同一份规则供模型和程序使用
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "ecommerce-marketing",
|
||||
"version": 1,
|
||||
"questionMode": "hybrid",
|
||||
"questionPolicy": {
|
||||
"maxQuestionsPerBatch": 3,
|
||||
"skipKnownFields": true,
|
||||
"allowCustomAnswer": true
|
||||
},
|
||||
"fields": [
|
||||
{ "key": "product.images", "type": "asset-list", "requiredFor": ["product-image-generation"] },
|
||||
{ "key": "audience", "type": "text" },
|
||||
{ "key": "channel", "type": "text" },
|
||||
{ "key": "deliverables", "type": "text-list" }
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
以上为设计示例,不是已存在 API。程序从配置生成相关模型指令和工具参数约束,同时执行校验。首次每批最多 3 题是建议默认值,可调整;不能把所有任务强制变成三题。
|
||||
|
||||
- 仅传当前任务相关规则,不把整个技能库和后台配置塞入每次模型请求。
|
||||
- 模型允许的工具范围不能超过用户和平台实际权限;场景声明不赋予权限。
|
||||
- 模型参数选项来自已配置模型的真实能力,不把过期选项写死在模板中。
|
||||
- 系统权限与收费规则不可被场景提示词、用户内容或技能覆盖。
|
||||
- 配置发布新版本不静默改变运行中的方案;继续使用任务绑定版本,显式应用新版本时重新评估影响。
|
||||
|
||||
### 6.3 技能与插件适配
|
||||
|
||||
继续通过 `skillRuntime.agentTools("onlineAgent")` 发现元数据、读取 `SKILL.md`、按引用读取文件。普通生成入口继续使用现有关联上下文模式,本机原生加载方式不在本轮修改范围内。
|
||||
|
||||
实施前审计首批使用的 Skills:例如种子技能提到 `generate_form_for_info_collection`,必须明确映射到实际问答工具,或修正技能说明。读取 `scripts/` 不代表执行脚本。插件启用也不自动成为 Agent 工具,只有显式接入且经过权限校验的能力才出现在工具表中。
|
||||
|
||||
## 7. 上下文与需求状态
|
||||
|
||||
每个字段记录值、来源、来源消息/素材 ID、更新时间与语义状态。建议状态为:`explicit`(用户明确)、`confirmed`(已确认)、`inferred`(模型推断)、`defaulted`(依授权采用默认值)、`missing`、`conflict`。
|
||||
|
||||
规则:
|
||||
|
||||
1. 用户最新且明确的修改覆盖旧要求;相互冲突且意图不明确时再澄清。
|
||||
2. 素材中提取的营销文案、画面内容等保留来源,不自动视为用户的新指令。
|
||||
3. 模型推断保留标签,不伪装成确认;低影响且用户授权自行决定的项可采用默认值。
|
||||
4. 已明确字段不再提问。程序按字段 key 检查,模型负责语义判断;二者结合,不能保证单靠字符串 key 消除所有重复。
|
||||
5. 用户自由回答可能更新多个字段。提交后先合并需求,再检查剩余问题是否仍需要。
|
||||
6. 场景切换保留共用信息,清楚标出不再适用的字段;不无提示丢弃原素材和历史。
|
||||
7. 需求变化只使相关方案、报价和未执行操作失效,不让无关完成产物自动失效。
|
||||
8. 当缺少文本提取、视觉识别或外部搜索能力时,明确说明并请用户补充,不能假称已读取资料。
|
||||
|
||||
## 8. 场景问答机制
|
||||
|
||||
### 8.1 三种模式
|
||||
|
||||
| 模式 | 行为 | 示例 |
|
||||
| --- | --- | --- |
|
||||
| 模板 | 从配置的字段/问题中筛选必要项,仍跳过已知项 | 试衣素材选择 |
|
||||
| 动态 | 模型结合上下文提出问题和选项 | 开放式营销创意 |
|
||||
| 混合,默认 | 配置规定信息范围与约束,模型生成表达、选择问题和追问 | 通用创作入口 |
|
||||
|
||||
模板定义“要了解什么”,不要求每次按固定顺序询问。信息足够时可以完全不展示面板。
|
||||
|
||||
### 8.2 数据与交互合同
|
||||
|
||||
```json
|
||||
{
|
||||
"questions": [
|
||||
{
|
||||
"id": "selling-point",
|
||||
"field": "product.sellingPoint",
|
||||
"question": "这组海报重点突出哪个卖点?",
|
||||
"type": "single",
|
||||
"options": [
|
||||
{ "id": "comfort", "label": "轻便舒适" },
|
||||
{ "id": "cushion", "label": "运动缓震" }
|
||||
],
|
||||
"allowCustom": true,
|
||||
"required": false
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
服务端或会话管理层分配 request ID、版本和状态,模型不能指定可信批准状态。首版控件支持单选、多选、自由输入、素材选择;数值、比例等先使用受校验的现有控件,不开放任意表单代码。
|
||||
|
||||
- 多题可前后切换,显示当前题/总题数;允许自定义答案,不能只要求输入数字序号。
|
||||
- “选中”仅编辑答案,“提交”才推进;不要将默认勾选当成用户提交。
|
||||
- 可跳过非必要问题;必要素材可延后补充,但相关执行必须阻塞。
|
||||
- 支持修改、取消和刷新恢复未提交答案;草稿答案不等于已确认需求。
|
||||
- 动态新增、删除后续问题时保留其他答案,不突然清空已填写内容。
|
||||
- 前端渲染结构化数据,不执行模型返回的 HTML、JavaScript 或 React 组件。
|
||||
|
||||
### 8.3 工具循环衔接
|
||||
|
||||
模型调用 `ask_user_question` 后,持久化该请求及原始工具调用 ID,将会话置为等待回答。回答提交先校验版本和字段,再作为同一工具调用的结果进入上下文,恢复原任务,而非创建无关联的新会话。
|
||||
|
||||
等待期间不反复请求模型或消耗工具轮次。若问题均已被新上下文回答,返回已有答案并继续;如果用户取消,记录取消结果,不补写虚假的答案。同一请求只能成功提交一次,重复请求返回同一结果。
|
||||
|
||||
## 9. 大纲与方案确认
|
||||
|
||||
### 9.1 方案内容
|
||||
|
||||
方案包含需求摘要、核心创意/大纲、拟使用素材、预期产物、规格、步骤,以及将创建或修改的画布内容。可以先有完整计划,再按阶段细化和批准,避免要求所有细节一次确定。
|
||||
|
||||
| 场景 | 方案重点 |
|
||||
| --- | --- |
|
||||
| 短剧 | 剧情、角色/场景、分镜、镜头与视听要求 |
|
||||
| 营销 | 受众、卖点、创意方向、文案、视觉与渠道产物 |
|
||||
| 电商 | 商品、输入素材角色、主图/详情图/试穿图等制作规格 |
|
||||
|
||||
方案展示可用 Markdown 加结构化摘要;执行内容单独做结构化校验。不能仅凭一段自由文本确认就允许模型生成任意后续写操作。
|
||||
|
||||
### 9.2 批准范围
|
||||
|
||||
- 按钮“确认方案,创建节点”:批准该阶段方案对应的节点和连线操作,不提交收费生成。
|
||||
- 按钮“确认并生成”:仅在操作和报价已经确定时提供,清晰显示总量、费用和范围,一次记录方案与费用两类批准。
|
||||
- 未确认时不创建本轮方案的节点,不创建隐藏占位草稿;已有画布和已有素材读取不受影响。
|
||||
- 文本框输入明确的“确认上述方案”等也可触发确认流程,但必须对应唯一待确认版本;歧义时不自动批准。费用授权首版使用明确费用卡提交。
|
||||
- 新增创作内容、变更输出、删除或覆盖已有内容超出范围时重新确认。
|
||||
- 仅自动布局或命名等方案内执行细节,在已批准范围内不逐工具再次弹窗。
|
||||
|
||||
方案有版本,批准有对应版本和内容指纹。批准后不得静默修改待执行内容;用户修改方案后,保留旧版本和已完成结果,明确新的执行差异。
|
||||
|
||||
## 10. 按需任务计划面板
|
||||
|
||||
计划是业务任务的可见步骤,不是模型内部思考过程,也不是工具调用日志。比如两张海报可以有“理解商品、确认创意、生成、筛选”四步,但某一步可能包含多个模型请求和工具调用。
|
||||
|
||||
| 状态 | 面板行为 |
|
||||
| --- | --- |
|
||||
| 普通聊天、简单明确编辑 | 不显示计划 |
|
||||
| 多步骤创作任务 | Agent 创建计划后出现 |
|
||||
| 等待回答、方案或费用批准 | 保留面板,当前步骤明确显示等待原因 |
|
||||
| 执行中 | 更新真实完成数、当前项与任务链接 |
|
||||
| 暂停、失败 | 保留进度,支持继续、重试或取消 |
|
||||
| 完成、取消 | 自动收起,保留在会话历史中,用户可再次展开 |
|
||||
|
||||
- 面板独立于正文但可折叠;具体停靠位置沿用现有画布浮层约定,在 UI 阶段验证,不强制长期占据一列。
|
||||
- 步骤 ID 稳定,允许调整后续步骤;增加/删除步骤后显示计划已更新,不冒充原总数一直未变。
|
||||
- 串行展示“当前第 2/6 步”;并行展示“已完成 2/6,运行中 2 项”,不要虚构严格串行。
|
||||
- 业务步骤建议使用 `pending`、`running`、`waiting_user`、`waiting_task`、`succeeded`、`failed`、`cancelled`、`skipped`;跳过不标成成功。
|
||||
- 模型提出计划和修改建议,程序依据方案保存、画布回执和后端任务更新受约束状态。
|
||||
- 创建完成依据真实节点/连线存在,生成完成依据任务成功且资源可用,交付完成依据实际输出文件可访问。
|
||||
- “生成中”的图片占位和空播放器不能作为完成证据;生成失败与资源回写失败分开展示。
|
||||
|
||||
## 11. Agent 操作画布
|
||||
|
||||
### 11.1 增量接入方式
|
||||
|
||||
继续使用 `CanvasAgentOp`、`applyCanvasAgentOps`、`verifyCanvasAgentOps` 和 `useCanvasAgentOperations`。先在现有画布助手增加新工具和确认状态,不提前迁出全部循环;首页需要共享时再提取无 JSX 的控制逻辑。
|
||||
|
||||
适配接口仅需要覆盖:读取当前快照、检查操作、执行一批操作、查询执行结果、定位相关节点。它是前端边界,不是新的 MCP 服务或通用插件执行平台。
|
||||
|
||||
新增业务节点沿用这条画布边界;定义发现、模板保存和执行能力绑定按第 11.5~11.8 节增补。界面和 Agent 共用字段校验与执行入口,避免两套行为。
|
||||
|
||||
### 11.2 写入合同
|
||||
|
||||
1. 执行批次关联会话、方案版本、批准记录、目标画布和稳定 operation ID。
|
||||
2. 提交前核对真实节点/素材 ID、输入能力、引用关系及批准范围。
|
||||
3. 创建节点时预分配稳定 ID,并把批次 ID 与结果映射持久化;遇到重复提交先查询,不重复分配新节点。
|
||||
4. 执行前校验当前 revision/stateHash,冲突则重新读取。仅布局变化可重新计算布局,内容或引用变化必须重新评估。
|
||||
5. 新节点和连接写入后执行结果复核,并区分“已显示”“本地已缓存”和“服务端已保存”。
|
||||
6. 将步骤与节点、连接、任务关联。定位按钮可聚焦本阶段内容,避免生成期间不断抢走用户视口。
|
||||
7. 用户删除或编辑正在生成的目标节点时,不强行恢复或覆盖;结果保存在任务/素材系统,提供手动放回画布的操作。
|
||||
|
||||
已存在撤销栈可复用,但撤销画布变化不等于取消上游生成或退费。手工编辑后的撤销边界遵循现有保护,不能把整个旧快照覆盖回去。
|
||||
|
||||
### 11.3 部分成功与异常窗口
|
||||
|
||||
浏览器画布操作与后端生成不在同一个事务中,不能承诺跨二者的原子执行。批次中部分节点已创建、任务未提交时,保留成功部分,标出失败项,只恢复缺失部分。
|
||||
|
||||
若操作已在浏览器执行但未收到保存回执,状态为“待核对”,重新打开后以批次 ID、稳定节点 ID 和服务端画布数据核对。未确认前不盲目重放。页面退出导致仅本地有改动时,显示本地恢复提示,不声称云端已经保存。
|
||||
|
||||
### 11.4 已有节点的辅助编辑
|
||||
|
||||
| 操作 | 示例 | 执行约束 |
|
||||
| --- | --- | --- |
|
||||
| 内容与名称更新 | 缩短文案、修改分镜描述、更新提示词、节点改名 | 先读真实节点,只更新允许编辑的字段 |
|
||||
| 布局与辅助节点 | 调整位置和尺寸、整理连线、增补说明文本、调整背板 | 复用已有节点类型与布局算法,保留用户手工编辑 |
|
||||
| 输入与生成参数 | 更换参考素材、调整模型或输出规格 | 校验素材角色、模型能力与下游影响;修改参数不自动提交生成 |
|
||||
| 流程调整 | 增删节点、修改连接、插入一个处理步骤 | 校验端口与依赖,复杂或超出批准范围的调整先确认 |
|
||||
| 局部重做 | 仅重做第二张海报或某个镜头 | 保留其他产物,收费任务按范围授权,失败只重试必要部分 |
|
||||
|
||||
当前已有 `canvas_update_node`、`canvas_update_node_text` 和底层 `update_node` 等能力,但通用 patch 不代表每类节点的业务校验均已完整。新增接入对内置节点和插件节点分别建立可写字段约束,禁止模型修改节点身份、归属、可信任务终态或批准状态。
|
||||
|
||||
“把这个节点改名”属于明确授权的小操作,不强制出大纲或计划。“优化整套分镜并替换主角”先展示影响范围。仅修改提示词时,旧产物仍可保留并标注与当前参数不一致;下游已完成结果不自动删除或重新收费运行。
|
||||
|
||||
### 11.5 自定义节点的三种形态
|
||||
|
||||
| 形态 | 定义来源 | 使用方式 |
|
||||
| --- | --- | --- |
|
||||
| 现有节点配置/组合 | 内置节点、现有插件节点和工作流 | Agent 修改参数或组合节点,足以完成任务时不新增类型 |
|
||||
| 项目自定义业务节点 | Agent 或用户提供结构化定义,绑定已接入能力 | 在当前项目确认后创建,可保存为个人模板复用 |
|
||||
| 插件提供的节点类型 | 开发者或平台提供插件清单及所需执行/界面能力 | 通过现有插件注册机制扩展;需要新算法时先接入真实执行器 |
|
||||
|
||||
节点定义描述一种可复用能力;节点实例保存本次的素材、参数、位置与运行关联。多个实例可以共享定义,但不能共享可变参数或误用彼此的任务结果。
|
||||
|
||||
项目定义提案先保存在会话方案中,未确认时不创建画布实例、不向全局注册表注入临时类型。这是对话中的结构化方案,不新增草稿画布或草稿节点。确认后保存项目可用定义并创建真实实例;保存个人模板、发布共享插件是独立操作,不因创建一个节点自动发生。
|
||||
|
||||
### 11.6 现有插件注册协议与扩展合同
|
||||
|
||||
现有调用链为:插件清单 `contributes.canvasNodes` → `registerPlugin` → `registerPluginCanvasNodes` → `canvasNodeDefinitionFromPlugin` → 节点注册表 → 画布菜单与内容渲染。它注册的是类型知识,不自动绑定生成执行器。
|
||||
|
||||
下面是符合当前 `PluginCanvasNodeContribution` 字段结构的贡献片段,需要放入完整插件清单的 `contributes`;不是已经发布的角色替换插件,也不能单独执行:
|
||||
|
||||
```json
|
||||
{
|
||||
"canvasNodes": [
|
||||
{
|
||||
"id": "creative.character-replace",
|
||||
"label": "角色替换",
|
||||
"defaultTitle": "角色替换",
|
||||
"defaultSize": { "width": 480, "height": 360 },
|
||||
"renderer": "declarative",
|
||||
"acceptsInputKind": "image",
|
||||
"showOutputConnection": true,
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"instruction": { "type": "string", "title": "替换要求" },
|
||||
"count": { "type": "integer", "title": "生成数量", "minimum": 1 }
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
当前实例的通用插件字段存入 `metadata.pluginData`。通用渲染器展示字段和值,不自动实现 JSON Schema 全量校验、素材选择、执行按钮或结果图库;`renderer: "sandbox"` 目前为占位,不能作为首版执行路径。现有专用插件界面不能推导为任意插件都可动态渲染同样的交互。
|
||||
|
||||
建议在现有注册体系上补以下结构;具体字段名在实施时细化,不要求另建插件平台或修改不相关插件:
|
||||
|
||||
| 合同 | 最少信息 | 程序责任 |
|
||||
| --- | --- | --- |
|
||||
| 身份与版本 | 类型 ID、版本、定义归属、项目或模板作用域 | 防止覆盖内置/其他插件类型;不同账号和项目隔离 |
|
||||
| 输入端口 | 稳定端口 ID、素材角色、类型、数量、必填条件 | 区分原图/角色图/蒙版,校验资源可访问性与连接兼容性 |
|
||||
| 参数 schema | 字段 key、类型、默认值、范围、可编辑性 | 同一规则用于用户表单、Agent 参数和执行前校验 |
|
||||
| UI 配置 | 受支持控件、字段顺序、帮助文案、预览方式 | 使用现有设计系统渲染;不执行模型生成的界面代码 |
|
||||
| 执行绑定 | 已注册能力或工作流 ID、版本、输入/参数/输出映射 | 解析真实执行器,经原有权限、授权、任务和计费链路调用 |
|
||||
| 输出端口 | 稳定 ID、结果类型与数量、任务/资源映射 | 让真实产物进入素材引用与下游输入,不以描述文字冒充媒体 |
|
||||
| Agent 元数据 | 作用、适用条件、必需输入、可编辑字段 | 提供可发现且可校验的调用说明,不能授予额外权限 |
|
||||
|
||||
当前 `acceptsInputKind` 仅约束一种媒体类别,`showOutputConnection` 仅控制是否显示连接点。多角色、多端口及多结果需要同步端口渲染、连线校验、资源引用解析、容量计算与执行参数映射,不能只在 schema 增加字段。
|
||||
|
||||
执行绑定只允许引用已注册且当前可用的能力,不接受模型提供的任意脚本、请求 URL 或可信后端函数名。定义内不保存密钥、Cookie 或临时媒体下载凭证;素材保存资源引用,执行时按用户权限解析。
|
||||
|
||||
### 11.7 Agent 定义、创建和运行节点
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[用户描述业务节点] --> B[发现现有节点及可用执行能力]
|
||||
B --> C{现有配置或组合能否满足}
|
||||
C -->|能| D[复用现有节点或提出业务节点定义]
|
||||
C -->|不能| E[说明缺少的执行能力或插件]
|
||||
D --> F[系统校验端口 参数 执行绑定与范围]
|
||||
F --> G[在会话中展示并等待确认]
|
||||
G --> H[保存项目定义并创建真实节点]
|
||||
H --> I[根据实际输入准备执行和费用授权]
|
||||
I --> J[调用现有任务或媒体处理能力]
|
||||
J --> K[回写真实产物与步骤状态]
|
||||
```
|
||||
|
||||
节点可以绑定单个执行器,也可以绑定组合流程。首版组合采用可检查的有限依赖图,校验引用存在、输入输出匹配及无循环;不开放任意代码或无上限循环。每个内部步骤有稳定 ID 和执行回执,复用创作计划与任务关联,不为自定义节点建立平行任务队列。
|
||||
|
||||
组合节点需要时展开内部步骤,普通单步节点不强制展示独立计划。收费步骤在执行前进入同一授权门槛,不能因包在一个节点里而隐藏内部调用、重试或费用。上游变化先标出受影响的待执行步骤;已生成结果保留,重新执行仍遵守范围与费用授权。
|
||||
|
||||
实例绑定定义版本或可恢复快照;刷新恢复时先加载有权限的定义,再渲染实例和对账任务。模板升级不静默改变旧实例,显式升级时展示差异并重新校验受影响的方案与报价。插件被停用或执行能力不可用时,保留参数、连线和已有产物,显示不可执行原因,不删除节点或自动切换收费模型。
|
||||
|
||||
项目级定义不直接混入全局无作用域的注册表;先解析当前用户、项目和版本,再加载相应定义。类型重复时明确拒绝或走显式版本更新,不能依赖当前 Map 写入覆盖作为冲突策略。
|
||||
|
||||
### 11.8 首批业务节点与复用优先级
|
||||
|
||||
| 业务需求 | 输入与输出 | 复用与缺口 |
|
||||
| --- | --- | --- |
|
||||
| 分镜编辑与生成 | 剧本/镜头资料 → 分镜行、分镜图或视频 | 已有分镜脚本节点,优先补字段级工具、资产引用和局部生产,不重复实现分镜表格 |
|
||||
| 视频抽帧 | 视频、时间点或间隔 → 带时间信息的图片列表 | 复用 `captureVideoFrames` 与保存逻辑,补 Agent 入口、参数校验、取消与结果映射;现有函数按时间点截取,不等于自动镜头检测 |
|
||||
| 视频拉片 | 视频、分析要求 → 镜头表、关键帧、分析报告 | 组合抽帧、可用视觉分析和结构化整理;间隔抽样不保证覆盖全部镜头,准确切镜需独立验证检测能力 |
|
||||
| 角色替换 | 原图/视频、角色参考、可选蒙版 → 候选媒体 | 图片先验证现有编辑模型;视频需要专门能力与时序一致性验证,不能直接沿用图片效果承诺 |
|
||||
| 场景替换 | 原素材、目标场景、保留主体要求 → 候选媒体 | 可复用同一替换节点定义的场景模式,校验背景与主体输入关系 |
|
||||
| 道具替换 | 原素材、目标道具参考、位置/区域要求 → 候选媒体 | 复用元素编辑与蒙版能力;具体模型是否支持及保真效果独立验证 |
|
||||
|
||||
角色、场景、道具若共享真实执行器与界面,优先定义一个“元素替换”节点加不同模式/模板,保留便于用户发现的名称和预设;只有执行或交互确实不同才拆节点类型。首批顺序建议为:已有分镜辅助编辑、抽帧、图片元素替换,随后扩展拉片分析和视频替换。
|
||||
|
||||
## 12. 生成报价、批准与计费
|
||||
|
||||
### 12.1 两类模型费用
|
||||
|
||||
| 类型 | 授权方式 |
|
||||
| --- | --- |
|
||||
| 理解需求、提问、规划等文本模型调用 | 首次发送前展示计费口径并批准本次任务有限调用/费用范围;后续在范围内继续,超额再确认 |
|
||||
| 图片、视频、音频及收费处理任务 | 按明确批次展示报价,批准后执行 |
|
||||
|
||||
文本授权必须在首次收费请求前完成,不能等模型已经收费分析后才问。固定价格展示确定金额;按 token 或浮动用量计费展示估算和可强制执行的上限,不能伪造准确总价。若所选计费方式无法限制授权范围,应收窄调用规模或阻塞执行。
|
||||
|
||||
用户自定义渠道可能不扣平台积分但产生外部费用。显示“外部渠道计费,平台无法准确报价”,明确批准操作与数量;不可显示“免费”或承诺平台能限制第三方最终账单。本机渠道和不可校验费用路径首版按现有能力单独标识,不自动纳入统一计费承诺。
|
||||
|
||||
### 12.2 批次授权合同
|
||||
|
||||
批准记录至少绑定用户、会话/任务、方案版本、规范化操作摘要、模型/规格/数量、报价版本及有效期、费用范围、幂等键和已消费项目。
|
||||
|
||||
- 金额由后端基于真实能力和计价规则计算,模型不能提交可信金额或 `approved=true`。
|
||||
- 用户批准后,后端重新验证参数、版本、资源归属、额度和插件启用状态。
|
||||
- 授权与子任务提交需具备事务/唯一约束或等价的一致性控制;重复 HTTP、双击、跨标签页不能重复消耗授权或产生订单。
|
||||
- 一批多项生成应记录每一项的提交结果;恢复时只提交未成功创建的子任务,不重做整个批次。
|
||||
- 新增付费重试、模型升级、数量增加或超出原范围时重新确认;状态不确定的账务先核对,不能简单再次扣费。
|
||||
- “自动执行工具”偏好不能关闭费用门槛,也不能扩大方案批准范围。
|
||||
- 仅增加可选 `approvalId` 且允许缺省收费不足以形成保证。必须梳理 Agent 实际可达的文本、媒体和插件收费入口,统一验证消费授权。
|
||||
- 后端无法仅凭不可信的 `source: agent` 区分手工/Agent 调用。受保护任务使用后端记录的执行上下文和统一授权入口;手工生成保留原交互,但接入同样可验证的用户确认语义。
|
||||
|
||||
首版复用现有报价、订单、计费状态和任务创建,不重写账务系统。前端已有 `runGenerationOperationOnce` 是内存并发合并,不等价于跨刷新、跨设备或后端扣费幂等。
|
||||
|
||||
## 13. 对现有代码的增量设计
|
||||
|
||||
### 13.1 优先原地调整
|
||||
|
||||
| 位置 | 改动 |
|
||||
| --- | --- |
|
||||
| `canvas-assistant-panel.tsx` | 接入场景上下文、问答/方案/计划工具,保留现有模型请求和工具分发 |
|
||||
| `types/canvas.ts` 中助手类型 | 对新增结构化消息和关联数据做明确类型定义,避免全部塞入不可验证的 `detail: unknown` |
|
||||
| `skill-runtime.ts` | 增加场景推荐/显式选择的衔接,维持渐进读取原则 |
|
||||
| `use-canvas-agent-operations.ts` | 增加执行上下文与回执,复用原有操作及生成续接 |
|
||||
| `web/src/lib/canvas/node-registry/`、`web/src/lib/plugins/plugin-types.ts` | 增补声明式业务节点合同、归属/版本校验;复用现有插件注册,不直接把项目提案全局注册 |
|
||||
| `canvas-node-content.tsx` 及相关节点/连线组件 | 扩展受支持的编辑控件、端口和结果展示,保留专用节点实现 |
|
||||
| `web/src/lib/canvas/canvas-agent-ops.ts` 与在线工具 schema | 对齐动态类型、可写字段、注册表默认值和操作复核,不能仅把类型强转为内置枚举 |
|
||||
| `use-canvas-media-tools.ts` 与资源/生成适配 | 按需提取抽帧等已有功能的可调用入口,界面和 Agent 复用保存、任务和错误处理 |
|
||||
| `pages/create/index.tsx` | 在第二阶段接入同会话 Agent 入口,保留直接生成和当前结果展示 |
|
||||
| 生成任务/报价/计费服务 | 增补批准和幂等校验,不创建平行 Provider 请求层 |
|
||||
| 短剧页面 | 接续现有项目上下文、镜头与素材,不复制业务流程 |
|
||||
|
||||
### 13.2 适合新增的少量边界
|
||||
|
||||
- 问答合同、场景配置和校验纯函数,可放在 `web/src/lib/creation/`;初期页面专用的逻辑仍就近放置。
|
||||
- 问答卡、方案卡、费用确认卡和按需计划面板,跨入口复用后放到 `web/src/components/creation/`。
|
||||
- 创作执行记录的业务 API 客户端放 `web/src/services/api/`,使用现有 `apiClient` 和 `request<T>`。
|
||||
- 首页与画布真正共享循环时,再提取到 `web/src/services/` 或共享 hook;不要先建立可插拔 Agent 平台。
|
||||
- 后端新增场景配置和执行记录相关逻辑遵循既有 handler → service → repository/model 分层。类名、表名和路由以实现前的数据模型检查为准。
|
||||
- 声明式业务节点的 schema、端口与映射校验放在现有画布/插件边界附近;动态表单仅在真实复用后提取。节点执行适配调用已有媒体或生成服务,不在节点组件内拼接 Provider 请求。
|
||||
|
||||
不新增独立微服务,不引入新队列,不迁移无关历史,不为概念上的九个职责强行建九个模块。
|
||||
|
||||
### 13.3 工具提案
|
||||
|
||||
| 工具 | 输入与作用 | 输出与等待 |
|
||||
| --- | --- | --- |
|
||||
| `update_creation_brief` | 更新需求字段并保留来源 | 校验后的需求版本,不允许伪造用户确认 |
|
||||
| `ask_user_question` | 结构化问题与字段关联 | 已知答案或持久待回答请求 |
|
||||
| `present_creation_proposal` | 大纲、产物和执行范围 | 方案版本与待确认状态 |
|
||||
| `update_creation_plan` | 建立/调整步骤与依赖 | 校验后的计划,不允许伪造生成成功 |
|
||||
| 节点/能力发现工具(新增) | 查询当前用户和项目可用的节点定义、端口、参数和执行能力 | 返回真实能力与不可用原因,供模型选择或组合 |
|
||||
| 业务节点定义提案工具(新增) | 提交结构化定义、版本与执行映射 | 校验结果及待确认方案;未确认不注册类型或创建实例 |
|
||||
| 现有画布读写工具 | 已批准范围内的真实操作 | 节点/连线回执及复核结果 |
|
||||
| 现有生成工具加授权适配 | 规范化生成请求 | 系统生成的报价卡或已提交任务 ID |
|
||||
|
||||
定义获批后的创建/更新尽量扩展现有画布工具;声明式节点执行通过明确适配入口调度既有能力,输入输出合同保持一致。保存个人模板或发布插件不与节点创建工具捆绑。
|
||||
|
||||
工具名为建议。费用卡也可在生成工具准备提交时由程序直接触发;必须有程序门槛,不依赖模型自觉调用某个“申请授权”工具。
|
||||
|
||||
## 14. 状态、持久化与接口设计
|
||||
|
||||
### 14.1 最小逻辑数据
|
||||
|
||||
以下为逻辑记录,不要求一条记录对应一张新表。先检查现有 Session、Message、Task 和账务结构,决定可扩展字段与必须独立持久化的批准/执行记录。
|
||||
|
||||
| 对象 | 关键内容 | 权威来源 |
|
||||
| --- | --- | --- |
|
||||
| 创作执行 `CreationRun` | 用户、会话、场景版本、可选画布与业务项目关联、状态、revision | 后端执行记录 |
|
||||
| 需求 `Brief` | 字段、来源、语义状态、版本 | 已保存的用户信息和校验后的提取结果 |
|
||||
| 问答 `QuestionRequest` | 工具调用 ID、问题、答案草稿、提交结果、版本 | 已提交结果由后端确认 |
|
||||
| 方案 `Proposal` | 内容、结构化执行范围、版本、批准结果 | 后端保存及确认 |
|
||||
| 计划 `Plan` | 步骤、依赖、关联任务/节点、更新记录 | 程序依据真实事件投影 |
|
||||
| 批准 `Approval` | 方案/生成批准类型、范围、价格、额度、有效期 | 后端,不接受模型自行设置 |
|
||||
| 操作回执 `OperationReceipt` | operation ID、稳定节点 ID、状态、执行/保存结果 | 校验后的画布和任务记录 |
|
||||
| 产物 `ArtifactRef` | 资源 ID、task ID、node ID、用途 | 现有资源/素材/任务系统 |
|
||||
| 业务节点定义(新增逻辑记录) | 类型 ID、版本、归属/作用域、schema、端口、执行映射与内容指纹 | 校验并确认后的项目定义或有权限的模板/插件 |
|
||||
| 节点执行关联(扩展现有记录) | 节点实例、定义版本、输入/参数版本、内部步骤、批准与任务/资源 ID | 既有创作执行及操作回执,不建立另一套任务状态真相 |
|
||||
|
||||
不能混用现有画布 `projectId` 与短剧业务 `domainProjectId`。新增边界显式区分画布、业务项目和会话,不使用空 ID、默认用户或默认项目兜底。
|
||||
|
||||
首版普通聊天历史可维持现有存储;新增创作执行、批准和待处理交互必须可服务端恢复。不把旧影视会话接口强行变成所有场景的通用循环,也不全面迁移全部历史。
|
||||
|
||||
自定义节点阶段补项目定义/个人模板的持久化,实例保存定义引用及可恢复版本,当前参数仍就近复用节点元数据。schema 变更采用显式版本处理,不强制迁移无关历史。费用批准同时绑定所用定义与执行映射版本,防止批准后替换内部工作流而扩大费用范围。
|
||||
|
||||
### 14.2 会话状态
|
||||
|
||||
建议使用:`idle`、`running`、`waiting_answer`、`waiting_proposal`、`waiting_payment`、`waiting_canvas`、`waiting_task`、`paused`、`completed`、`failed`、`cancelled`。这些是创作执行状态,不能直接替换现有生成 Task 的状态枚举。
|
||||
|
||||
模型请求结束不等于整个创作完成;前端等待、用户批准和外部任务终态分别触发后续转换。阻塞交互时释放请求资源,不保留一个永不结束的浏览器 Promise 作为唯一状态。
|
||||
|
||||
### 14.3 接口原则
|
||||
|
||||
建议提供:场景配置读取/管理、创作执行创建/查询、版本化更新、问答提交、方案确认、报价准备、费用批准、操作回执查询与提交、执行控制权获取/续期。具体 URL 在实现前与现有路由校准,不在本文伪称已有接口。
|
||||
|
||||
自定义节点阶段按实际复用增补定义/能力查询、项目定义确认保存、个人模板读取与保存;插件发布沿用现有管理边界。动态定义不能通过前端声称已校验来绕过后端执行、权限与费用校验。
|
||||
|
||||
- 业务接口继续返回 `{ code, data, msg }`,失败采用真实 HTTP 与业务错误。
|
||||
- 写入携带预期 revision 与幂等键。相同键相同请求返回原结果,不同请求冲突返回明确错误。
|
||||
- 所有读取、写入、批准和订阅在 service 校验用户与资源归属。
|
||||
- 原有文本任务 SSE 沿用事件游标和续传语义,不把任务 ID 当游标。
|
||||
- 不为每个卡片创建独立 WebSocket;优先复用现有请求、任务订阅和恢复接口。
|
||||
- 持久化结构变化时同步后端数据库专题文档;本文只是设计,不在本轮新增数据库迁移。
|
||||
|
||||
## 15. 运行恢复、并发与资源边界
|
||||
|
||||
### 15.1 刷新、关闭和重新进入
|
||||
|
||||
1. 保存会话、待交互请求、方案和执行回执;文本流可复用现有任务持久化。
|
||||
2. 关闭页面后 Agent 不再发起新工具调用。已接受的服务端任务可继续,本机渠道按各自连接能力处理。
|
||||
3. 重新进入先查询后端状态与画布快照,对账已提交任务和已执行操作,再恢复界面。
|
||||
4. 等待用户的状态继续等待;等待任务的状态可以继续观察。首版对中断中的主动执行显示“继续任务”,不在刷新后静默新增未核对的操作。
|
||||
5. 继续使用有效授权,不因刷新重新扣费;授权过期或参数变化再确认。查询失败时保留待核对状态,不把“没查到”当成“没执行”。
|
||||
|
||||
### 15.2 多标签页与多用户
|
||||
|
||||
- 同一创作执行只允许一个活动执行方;后端采用带过期时间的控制权/租约或等效机制,浏览器通知仅优化体验。
|
||||
- 接管产生新的执行代次,过期页面后续提交被拒绝;前端每次副作用前检查自己仍持有控制权。
|
||||
- 跨标签页的浏览器本地节点修改仍需画布保存版本校验和对账,租约不等于消除全部本地瞬时冲突。
|
||||
- 其他页面可以查看状态。账号切换清理用户 scope 下的 Query、会话和资源引用。
|
||||
- 复用后端已有用户任务并发限制;多业务步骤不意味着无限并行请求。
|
||||
|
||||
### 15.3 停止、失败与重试
|
||||
|
||||
“暂停 Agent”停止后续规划和提交,不等于上游任务已取消。对已提交任务显示单独取消状态;若供应商不支持取消,明确仍可能完成和计费。
|
||||
|
||||
失败分类至少包括:模型请求、问答校验、方案过期、画布冲突、保存失败、费用不足/报价失效、任务生成失败、资源回写失败。仅重做必要部分;生成已成功但资源回写失败时重试资源处理,不重新生成。
|
||||
|
||||
### 15.4 工具循环预算
|
||||
|
||||
现有 8 次循环先保持为保护,不简单删除上限。按“当前连续执行段”和“整个创作任务”分别记录请求、token/金额、任务数及失败次数;用户回答或任务完成后可开启新的执行段,但不能借此无限重置总预算。等待不消耗循环请求。
|
||||
|
||||
连续失败达到限制时记录原因并暂停,不能盲重试。业务计划可以多于或少于模型请求次数;面板不能用循环计数冒充制作进度。
|
||||
|
||||
## 16. UI 与交互约束
|
||||
|
||||
- 保留现有主题、布局与三层 token,不复制参考产品品牌和全局 CSS。
|
||||
- 面板优先嵌入现有助手空间,任务出现时按需显示;桌面可折叠、窄屏使用抽屉或底部展开,避免遮挡主要画布。
|
||||
- 支持键盘操作、焦点恢复、中文输入法、可见选中状态与减少动效设置。
|
||||
- 问答卡提交中禁重复提交;后端失败保留输入并允许重试,不清空答案。
|
||||
- 引导问题、用户选择和费用批准在历史中可追溯,不能只用短暂 toast 表示。
|
||||
- 节点状态、计划和任务队列使用相同 task ID,不各自维护相互矛盾的完成状态。
|
||||
- “已创建”“正在保存”“已保存”“生成中”“资源不可用”等文案对应真实阶段。
|
||||
- 自定义节点输入端口标明素材角色,编辑参数与执行按钮分开;输出列表能预览、引用和定位。缺少插件或能力时保留内容并展示原因,不出现无法解释的空白节点。
|
||||
|
||||
## 17. 分阶段交付
|
||||
|
||||
| 阶段 | 交付范围 | 完成标准 |
|
||||
| --- | --- | --- |
|
||||
| P0:合同与小范围接入 | 对齐首批场景字段、工具、技能、计费入口与数据关联;盘点分镜/抽帧/替换能力,定义最低持久化和授权合同 | 同一营销例子能映射到真实工具,区分已存在节点、可组合节点与缺失执行器 |
|
||||
| P1:画布助手内闭环(内部里程碑) | 动态问答、方案确认、计划显示、确认后节点操作、已有节点辅助编辑、费用门槛、实际生成与回写 | 完成图像生成及局部修改;小编辑不强制计划;不得开放无授权收费,尚不能称为第一期完整交付 |
|
||||
| P2:首页接续与短片交付(第一期发布) | 首页 Agent 入口、同会话转画布、刷新恢复、操作对账、单执行方控制、参考图到单段视频及预览;按需提取共享逻辑 | 主用例完成真实短片,营销海报作为跨场景回归;首页到画布不丢上下文,重复操作不重复提交,恢复不覆盖手工修改 |
|
||||
| P3a:业务节点接入 | 复用节点注册,补声明式表单、角色化端口、执行绑定、Agent 发现/校验与定义持久化;接入抽帧和已验证的图片替换能力 | 一个自定义节点能确认创建、真实执行、刷新恢复并向下游提供结果;定义不能覆盖其他类型或绕过费用授权 |
|
||||
| P3b:场景与模板扩展 | 营销场景、电商工具台、后台场景编辑、个人节点模板与有限组合流程;接续短剧工作台和拉片能力 | 多场景复用协议与循环;模板实例相互隔离,组合步骤按真实执行回执恢复 |
|
||||
| P4:交付增强 | 基于已有时间线渲染补合成调用、字幕/配音关联和交付包 | 真实文件可预览下载;以实际执行器支持范围定义交付能力 |
|
||||
|
||||
每阶段按最小充分范围验证再扩大。具体工期与数据库拆分在实施前估算,不用未经验证的复用百分比或用户容量作承诺。
|
||||
|
||||
P1/P2 共同构成第一期体验,不依赖完成所有自定义节点;详细设计中的 I0~I4 是这一范围内的开发顺序。单段短片生成与 P4 的时间线合成/交付包分别验收。P3a 先以单执行器和真实抽帧验证,再扩到 P3b 的组合流程。视频角色/场景/道具替换需能力验证后纳入具体阶段,不以完成节点注册作为交付依据。
|
||||
|
||||
## 18. 验收清单
|
||||
|
||||
| 编号 | 场景 | 可验证结果 |
|
||||
| --- | --- | --- |
|
||||
| A01 | 用户说明商品、平台、数量、受众 | 不再询问相同字段,仅补必要信息 |
|
||||
| A02 | 用户信息完整或授权自行决定 | 可直接出方案,不强制问卷 |
|
||||
| A03 | 自定义回答同时说明风格和渠道 | 更新两项需求,后续重复问题跳过 |
|
||||
| A04 | 必要素材缺失或解析失败 | 明确阻塞原因,不编造已读取内容 |
|
||||
| A05 | 切换场景或修改时长 | 保留共用信息,只更新相关方案及报价 |
|
||||
| A06 | 尚未确认方案 | 本轮没有新增/修改画布节点,不产生隐藏草稿 |
|
||||
| A07 | 确认“创建节点” | 仅创建批准范围节点/连线,不提交收费生成 |
|
||||
| A08 | 确认并生成 | 展示明确范围和真实费用,批准记录同时覆盖对应动作 |
|
||||
| A09 | 普通聊天或单一编辑 | 不出现多步骤计划,不强制大纲 |
|
||||
| A10 | 多步骤任务、等待确认、完成 | 面板按需出现、真实等待、完成后收起且历史可展开 |
|
||||
| A11 | 模型错误声称生成完成 | 真实任务未成功或资源不可用时不能显示成功 |
|
||||
| A12 | 改模型、数量、规格或报价失效 | 原授权不可越界使用,重新报价确认 |
|
||||
| A13 | 双击、重发、刷新、两标签页 | 不重复建节点、创建任务、扣费或恢复过期执行 |
|
||||
| A14 | 一批两项仅一项提交成功 | 恢复只处理未提交项,已提交任务继续观察 |
|
||||
| A15 | 用户在等待时编辑/删除节点 | 不覆盖或复活用户内容,产物仍可从任务/素材中找回 |
|
||||
| A16 | 生成成功但节点写回失败 | 重试回写,不重新生成或收费 |
|
||||
| A17 | 账务状态不确定 | 先核对,不自动发起新的付费重试 |
|
||||
| A18 | 关闭页面再进入 | 已有任务结果可恢复,未批准步骤不自动执行 |
|
||||
| A19 | 首页进入画布 | 同一会话、需求、方案、批准和任务映射保留 |
|
||||
| A20 | 停止 Agent | 后续提交停止,上游任务取消情况单独如实显示 |
|
||||
| A21 | 不同账号/无权限项目 | 读写、批准和订阅均拒绝越权,不泄露素材或凭证 |
|
||||
| A22 | 深浅主题、窄屏、键盘、长问题 | 卡片可操作,焦点与画布滚动边界正常 |
|
||||
| A23 | 插件/技能要求不存在的工具 | 给出不支持或替代方案,不伪造执行日志 |
|
||||
| A24 | 电商试衣与短剧合成 | 只展示已验证能力;模板和模拟界面不能标为真实交付 |
|
||||
| A25 | 修改名称、提示词、布局或辅助文本节点 | 按明确指令修改指定字段;不强制计划、不自动触发生成,不改变身份/归属/可信状态 |
|
||||
| A26 | 编辑已有分镜或重新连接参考素材 | 校验真实镜头、资产和连接关系,只影响目标范围;旧产物保留并标注参数变化 |
|
||||
| A27 | 提出尚不存在的业务节点 | 查找可用执行能力,结构化提案通过校验后展示;未确认无新画布实例或全局临时类型 |
|
||||
| A28 | 缺少分析/替换模型或使用未知执行 ID | 明确不可执行原因,不用节点名称、提示词或任意 URL 伪造能力 |
|
||||
| A29 | 注册插件/项目节点 | 名称、尺寸、字段和端口正确;重复类型 ID、跨归属覆盖或越权定义被拒绝 |
|
||||
| A30 | 原图、角色图、蒙版连接与表单编辑 | 素材角色和数量校验有效;用户与 Agent 遵守同一参数规则,不能互换输入含义 |
|
||||
| A31 | 自定义节点收费执行与重试 | 报价覆盖真实执行映射;批准后变更定义/范围需重新评估授权,重复提交不重复收费 |
|
||||
| A32 | 抽帧节点执行 | 依据获批时间点/数量输出真实图片并保留来源时间,结果可供下游引用,取消/失败如实显示 |
|
||||
| A33 | 组合拉片节点某步骤失败 | 保留已抽帧结果,仅恢复缺失步骤;抽样分析不声称完整切镜检测 |
|
||||
| A34 | 保存模板并创建两个实例 | 定义可复用,素材、参数和任务相互独立;模板保存/共享不随节点创建自动发生 |
|
||||
| A35 | 刷新、定义升级或插件停用 | 恢复对应版本;升级不静默改实例;停用后保留节点/产物并阻止新执行 |
|
||||
| A36 | 修改节点参数或上游素材 | 标出受影响的后续步骤,不自动删除成功产物、不自动重新收费运行 |
|
||||
|
||||
## 19. 验证与文档维护
|
||||
|
||||
实施时为状态转换、重复问题过滤、版本失效、收费授权、幂等、权限和断点对账编写有意义的专项测试。UI 验证覆盖关键入口、问答与确认、节点创建、真实任务联动以及明暗/窄屏,不用静态 diff 代替运行验证。
|
||||
|
||||
收费路径先用可控 Provider 和计费测试验证,再在明确授权额度内做真实端到端验证。用同一份商品资料完成“补问 → 两张海报方案 → 确认 → 建节点 → 批准生成 → 单张重做”,记录完成率、额外提问、重复执行、费用与恢复结果。
|
||||
|
||||
自定义节点阶段补端口兼容、输入映射、schema 受支持子集、定义归属与版本、输出资源引用及组合步骤恢复验证。采用“视频抽帧 → 拉片报告”和“原图/角色图 → 图片替换 → 结果引用”作为两条独立样例;只有实际模型能力验证通过才验收对应替换效果。节点能显示、注册成功或生成了 JSON 不代表执行链路验收通过。
|
||||
|
||||
数据库或 API 改动实施后同步对应专题;已实现但未由用户确认的内容写入待测试清单。当前仅编写需求设计文档,不把本设计写入“已实现功能”或“已完成测试”。
|
||||
|
||||
## 20. 评审时需要细化、但不改变目标的事项
|
||||
|
||||
- 首批电商工具选哪一种真实执行能力:商品主图/场景图可优先,试衣需单独验证。
|
||||
- 文本 Agent 调用的具体计费展示、默认批准预算及外部渠道费用提示。
|
||||
- 计划面板停靠位置、展开交互与窄屏行为。
|
||||
- 首批场景配置编辑采用哪些表单字段,哪些高级规则保留结构化编辑。
|
||||
- 会话与批准记录实际落在哪些已有/新增表、哪些接口需扩展,以及原有收费入口的授权接入范围。
|
||||
- 首批节点参数 schema 与控件子集、端口数量与输出列表约定、项目定义和个人模板的实际持久化位置。
|
||||
- 图片替换模型的实际输入能力与质量标准;拉片采用抽样分析还是额外接入切镜检测;视频替换单独评估。
|
||||
|
||||
这些是实施前需要落实的工程与产品细节,不是重新选择 Agent 框架或全面改造架构的理由。本需求的固定方向是:复用当前代码,先完成问答、确认、辅助编辑和真实生成闭环,再让 Agent 基于已接入能力定义业务节点、保存模板并编排可恢复的跨场景创作流程。
|
||||
@@ -5,6 +5,10 @@ description: 当前项目已实现的核心工作台能力与使用入口
|
||||
|
||||
# 功能清单
|
||||
|
||||
## 云端 Agent(只读阶段,待真实环境验收)
|
||||
|
||||
浮窗支持移动、调整大小和浏览器偏好恢复;聊天发送后跟随到底部,上翻阅读时暂停跟随。后端已接入持久化的逐轮对话、可信历史、取消和文本事件回放,可分析已保存画布的有限摘要。每条消息独立检查固定计价预算;审批、Skills、MCP、画布写入及媒体生成尚未开放,不应按完整工具 Agent 使用。
|
||||
|
||||
## 画布智能引用
|
||||
|
||||
节点提示词面板提供“智能引用”入口,支持 AutoLink 开关和“一键引用全文”。输入已连接素材的名称、标签或素材栏序号后,按 Tab 或点击光标旁的候选项插入引用;全文引用会批量转换匹配到的指代,没有可转换内容时按钮禁用。
|
||||
@@ -83,7 +87,7 @@ SEO 标题、描述、可选关键词会投影到浏览器 metadata、Open Graph
|
||||
|
||||
当前操作包括:章节资产提取、分镜规划/修复、分镜首帧、分镜视频、角色卡提取、角色三视图、短剧大纲、技能草稿。短剧一句话生成和技能库 AI 草稿只提交 `promptTemplateOperation` 与变量,占位 prompt 不会成为模型看到的正文。
|
||||
|
||||
画布内置预设、反推提示词、工作流起步稿、文本改写包装、视频操作包装、字幕高亮指令和在线 Agent 协议提示词属于客户端目录 `web/src/lib/prompts` 与 `web/src/lib/canvas/canvas-agent-protocol.ts`。Agent 系统提示词是产品契约,不开放运营改写,避免把工具权限改坏。
|
||||
画布内置预设、反推提示词、工作流起步稿、文本改写包装、视频操作包装和字幕高亮指令属于客户端目录 `web/src/lib/prompts`。云端 Agent 的系统提示词、工具权限和计费规则由后端运行时统一控制,不由浏览器覆盖。
|
||||
|
||||
### 相关实现
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ description: 面向图片创作的 AI 视觉分析、问题定位和修改建议
|
||||
|
||||
> 状态:MVP 已实现,当前审美标准为 `2026-08-v1`。
|
||||
|
||||
执行入口已统一到 `art-critique-execution`:手动分析和 Agent 发起分析共用原插件面板。各阶段先取得后台真实报价,用户确认当前费用卡后才提交;后续阶段按已有结果另行报价。原图使用资源引用,一轮最多 9 个不同模型阶段。节点记录报价运行、模型及阶段任务 ID,图片和模型未变时可“继续上次分析”,复用已提交任务和结果,不自动付费重试失败阶段。停止观察不等于取消后台任务;关页后尚未提交的阶段不会自动运行。Agent 可通过 `canvas_start_art_critique` 准备报价,通过 `canvas_read_plugin_node` 读取报告;完整合同见[Agent 能力接入](../../../design/agent-capabilities.mdx)。
|
||||
执行入口已统一到 `art-critique-execution`:手动分析和云端 Agent 发起分析共用原插件面板。各阶段先取得后台真实报价,用户确认当前费用卡后才提交;后续阶段按已有结果另行报价。原图使用资源引用,一轮最多 9 个不同模型阶段。节点记录报价运行、模型及阶段任务 ID,图片和模型未变时可“继续上次分析”,复用已提交任务和结果,不自动付费重试失败阶段。停止观察不等于取消后台任务;关页后尚未提交的阶段不会自动运行。云端 Agent 可通过 `canvas_start_art_critique` 准备报价,通过 `canvas_read_plugin_node` 读取报告;完整合同见[Agent 能力接入](../../../design/agent-capabilities.mdx)。
|
||||
|
||||
## 1. 先说结论
|
||||
|
||||
@@ -393,7 +393,7 @@ web/src/pages/canvas/project.tsx
|
||||
- 无限 reviewer 或复杂后台编排。
|
||||
- 一开始就接入新的任务队列、SSE 或数据库表。
|
||||
- 把它做成可上传的任意第三方 React 插件。
|
||||
- 把 Codex MCP 插件当成画布节点的核心实现。
|
||||
- 把外部连接插件当成画布节点的核心实现。
|
||||
|
||||
## 11. 分阶段实现
|
||||
|
||||
|
||||
@@ -81,9 +81,9 @@ Eagle 插件属于此类,具体方案见第 8 节。
|
||||
|
||||
扩展剧本、分镜、提示词、素材包、JSON、Markdown、PDF 等格式的导入或导出。
|
||||
|
||||
### 4.6 Agent / MCP 插件
|
||||
### 4.6 云端 Agent 能力
|
||||
|
||||
为 Codex、Claude 或其他 Agent 暴露画布工具。这一类与网页插件可以协同,但仍使用独立的 Agent / MCP 安全边界。
|
||||
云端 Agent 通过后端受控工具合同读取和修改画布。插件只能通过版本化的宿主贡献点提供技能或能力声明,不能注入本地进程、MCP 连接或浏览器私有状态。
|
||||
|
||||
## 5. 插件包与清单
|
||||
|
||||
|
||||
@@ -5,6 +5,64 @@ description: 当前项目已实现功能的手工验证清单与未确认边界
|
||||
|
||||
# 待测试
|
||||
|
||||
## Agent 增量联动与可点击操作留痕
|
||||
|
||||
- 服务端将草稿、提交和媒体成功 / 失败 / 取消的节点增量与运行检查点一起持久化;前端 40ms 合批投影,不按每条完成 / 失败事件全量刷新。缺口、断流或冲突才单请求校准,发起间隔至少 1 秒,期间重复通知仅保留一次尾随校准。
|
||||
- 按钮与提交入口共用节点任务状态,排队 / 运行中禁用,终态解锁;旧事件不能覆盖已换任务的节点。无关拖动、提示词编辑和视口保留,同字段冲突明确提示,不静默覆盖。
|
||||
- 参数选择允许用户授权的目录默认值,已接受推荐方案不再追加文字确认;图生视频参考图只进 `referenceNodeIds`,校验错误说明可执行修正方法。独立收费审批、能力和预算校验保持不变,失败不自动重提收费任务。
|
||||
- 聊天保存创建 / 更新 / 引用的节点名和节点 ID,点击复用画布聚焦,同一画布操作按工具调用 ID 去重;失败显示节点名、任务 ID、短摘要及可展开的完整错误。
|
||||
- [x] 96 项前端专项测试通过,覆盖 50 个不同节点完成的一次 Store / 编辑器投影、零全量 GET,50 条事件合批、限频 / 单请求、乱序 / 幂等、新任务隔离及冲突保护。后端 `TestCloudAgent` 专项覆盖失败 / 取消终态、画布删除后的失败检查点和审批边界;前端构建、文档类型检查通过,仍有既有大分块提示。
|
||||
- [x] 复用现有开发服务的隔离组件浏览器验证通过:创建 / 引用记录可点击,键盘可聚焦操作,模拟失败后共享任务状态解除按钮禁用,失败记录保留节点名且完整错误可展开。该验证使用真实工具卡组件与增量 / 聚焦函数,不等于完整画布路由或真实后端联调;未调用生成接口、未重启服务。隔离浏览器的开发热更新 WebSocket 受本地网络检查阻止,不影响这些组件断言。
|
||||
- [ ] 真实登录态验收多节点同时生成、SSE 断线重连、切换会话 / 画布及失败后的节点展示;核实实际模型遵循默认参数策略。未调用真实收费模型,附件中 MiniMax 上游协议失败仍需独立渠道排查,不能视为供应商问题已解决。
|
||||
|
||||
## Agent 导出、媒体审批与文本引用
|
||||
|
||||
- [ ] Agent 顶部下载按钮导出当前对话消息、当前运行的服务端事件、工具参数、审批和错误为 JSON;服务端读取失败仍导出本地记录并附错误。凭证、签名 URL 参数及内嵌媒体已尽力过滤,提示词和对话仍可能含隐私,分享前需检查。历史轮次未缓存的原始事件不在本次导出范围内。
|
||||
- [ ] 图片 / 视频遵守用户指定规格,明确授权默认时按上节选择;创建草稿及引用连线后显示独立审批,卡片展示真实模型名和规格。自动模式也必须等批准;拒绝 / 取消保留草稿,不创建媒体任务或预留媒体账单。聊天本身的文本模型费用不属于媒体生成审批。
|
||||
- [ ] 视频提示词输入 `@` 可选择全画布未连线文本,选中后建立真实引用连线、使用正确编号并将正文带入生成;已有引用编号、Config 输入、自引用、循环及锁定保护保持正确。
|
||||
- [ ] 仅平移 / 缩放 / 自动聚焦不会阻塞 Agent 同步或使审批快照失效;增量与本地无关字段编辑可合并,同字段冲突保留本地内容。审批仍对真实节点 / 连线变更进行快照校验。
|
||||
- [ ] 工具失败行直接显示具体错误及已有任务 ID,不必悬停;区分未提交任务与任务完成后回写失败。旧日志缺失的上游错误无法追溯补齐,需新导出记录验证实际渠道问题。
|
||||
- [x] 95 项前端专项测试、类型检查与生产构建通过(仍有大分块提示);后端 Agent、任务准入和模型能力相关测试通过,覆盖自动模式审批、拒绝 / 取消无任务无媒体账单、重复审批幂等、草稿归属、视口保存后批准、真实快照冲突及错误详情保留。尚未进行本轮浏览器交互或真实模型生成验收,未启动 / 重启服务或操作真实画布数据。
|
||||
|
||||
## 分镜表节点提示词面板
|
||||
|
||||
- [ ] 新建、连线创建、复制、粘贴和定位分镜表节点时不打开通用提示词面板,并关闭之前节点残留的面板;单击和拖动继续保持不弹出。分镜表内部编辑、生成与图片 / 视频节点提示词面板不变,待真实浏览器确认。
|
||||
- [x] 4 项入口源码回归检查及前端类型检查 / 生产构建通过;构建仍有大分块提示,未进行浏览器交互验证。
|
||||
|
||||
## Agent 运行闭环
|
||||
|
||||
- [ ] 画布 Agent 媒体闭环:`model_list` 使用与生成面板一致的生效目录;支持读取节点 / 分镜表 / 角色资产绑定,审批时展示参考数量、画幅、质量、时长和音频。先创建图片 / 视频草稿和来源 / 资产连线,审批通过后原子绑定任务和账单;SSE 同步编辑器并聚焦新增节点,生成成功 / 失败 / 取消回写原节点。需使用真实已上传资产和模型渠道验证完整生成,不把测试数据库中的结果回写等同于真实出片。
|
||||
- [x] 媒体闭环专项:后端 63 个顶层测试通过(Agent、任务准入、模型选择和能力相关),包含双图有序引用、图片生成、审批拒绝、快照过期、跨账号 / 未就绪资源、事务失败无媒体任务和账单、模型错误可恢复、结果 / 失败 / 取消回写及分镜分页。前端 22 项测试通过,包含审批规格、媒体节点与连线刷新、结果回写、聚焦及冲突保护。前端类型检查与生产构建通过(仍有大分块提示)。本次未启动 / 重启开发服务、未调用真实收费模型、未读写用户画布;发布后需新发起一轮 Agent 请求以获取新工具合同,旧失败轮次不自动续跑。
|
||||
- [ ] 工具成功行取消重复的右侧“已完成”,参考路径允许换行;审批期间停止正文流式动效。模型选择器收窄至 144px,新增思考开关;真实模型兼容性、明暗主题和窄屏待浏览器验收。
|
||||
- [ ] Agent 写入后同步持久化 Store 与打开的编辑器节点 / 连线;新增节点时选中并平滑聚焦本批节点,优先保持缩放,范围过大才缩小,尽量避开可移动 Agent 浮窗。不新增节点及相同快照重放不抢视口;未提交的本地编辑仍拒绝覆盖并显示冲突。窄屏浮窗遮满画布时回退全画布居中,需收起浮窗查看。待真实审批、连续写入、浮窗换位及断线重放验收。
|
||||
- [ ] 节点标题增加明确拖动手柄,正文编辑 / 滚动与名称单击编辑保持不变;锁定节点显示锁定提示且不可拖动,只读画布不开放拖动。补齐 HTML / SVG 沙箱 iframe 吞掉拖动事件的问题:手柄捕获指针,拖动期间屏蔽画布内 iframe 命中,结束后恢复;全局手势监听保持稳定,避免重渲染中断拖动。待用户原画布节点、组合选择与解锁后拖动验收。
|
||||
- [x] 聚焦与拖动专项 11 项测试通过,覆盖视口几何、浮窗避让、拖动入口与 iframe 保护静态约束、刷新冲突和重复事件;前端类型检查与生产构建通过(仍有大分块提示)。复用现有开发服务,在隔离 Chromium 中挂载真实节点组件和手势控制器:合成 HTML 节点从 `(100,100)` 拖至 `(300,268)`,松手后停止;结束与失焦取消后 iframe 的 pointer-events 恢复为 auto;锁定 / 只读手柄禁用。未读写用户画布数据、未启动或重启服务,真实审批联调仍待验收。
|
||||
- [x] 本轮自动回归:前端 16 项测试通过,覆盖成功 / 失败工具行、长参考路径、编辑器刷新通知、本地冲突和重复事件;前端类型检查与生产构建通过(仍有大分块提示)。后端 `TestCloudAgent|TestRunAgentToolTask` 通过,覆盖审批写入、首轮及工具续轮思考配置、上游请求携带推理参数。未启动开发服务、未重启后端、未进行真实付费模型或浏览器验收。
|
||||
|
||||
- [ ] Agent 工具调用后的下一轮模型请求:Chat Completions 的 `tool_calls` 补齐 `type: "function"`,Claude 保留 `tool_use`;真实渠道连续调用与失败任务重新发起待验收。
|
||||
- [ ] 后端重启窗口内读取已加入 Skills:对 5xx 做最多 3 次有限重试,恢复后清除旧错误卡;裸代理 502 不再展示 Axios 英文错误。需在重启后端期间打开 Agent 面板确认自动恢复且不污染对话。
|
||||
- [ ] Skills 工具回归:空目录显示“无可读参考文件”,实际读取显示技能名与路径;失败事件不再出现成功摘要。同一轮同技能同路径的重复请求被拒绝,并引导使用历史结果 / 已加载正文;刷新恢复后仍保留去重状态。
|
||||
- [ ] 模型断连回归:连接重置、超时、拒绝连接显示安全分类和模型任务 ID,未知错误仍引导任务中心排查;不向聊天面板暴露原始上游地址或密钥。不自动重试或恢复旧失败运行。
|
||||
- [x] Skills 反馈专项:前端 19 项工具摘要 / 错误语义 / 审批与布局测试通过,前端构建通过;后端 `TestCloudAgent` 专项通过,覆盖空目录、重复路径持久化、不同技能与文件隔离、缺失文件反馈,以及模型失败事件与脱敏。未调用真实模型或重启现有服务,真实浏览器验收仍待完成。
|
||||
- `/api/agent` 已注册能力、创建、追加消息、读取、取消、审批与事件流路由;一条消息对应一个持久化 `canvas_text` 任务,`cloud_agent_executions` 保存模型循环、工具、审批和事件状态,复用现有 Worker 与扣费事务。
|
||||
- 服务端校验画布 / 运行归属、幂等键、三档权限、用户技能快照、有限画布上下文与每轮预算;已开放 `canvas_get_state`、`skill_read_file`、`task_get`、`model_list`、受限 `canvas_apply_ops` 和 `generate_media`。禁止 shell、任意网络请求和外部 MCP。
|
||||
- [x] 专项测试覆盖请求校验、越权、预算拒绝、重复提交、可信连续对话、公共任务入口隔离;4 个并发请求仅产生一条任务 / 账单 / 预留流水;模拟上游经真实 Worker 得到并持久化回复。
|
||||
- [x] 隔离浏览器通过模拟 Agent 接口完成发送 → 事件流 → 回复 → 已完成;不代表真实模型渠道或登录态联调通过。
|
||||
- [ ] 真实登录态验证首轮 / 连续对话 / 取消 / 刷新恢复 / 审批 / SSE 断线重连;压力验证 PostgreSQL 扣费回滚。提交幂等键已按画布和会话持久化,仍需真实浏览器验证响应丢失后的同键恢复。
|
||||
- [ ] 原本运行中的旧后端需重新构建或重启加载新路由;本次未重启用户服务、未调用付费上游。
|
||||
|
||||
## Agent 浮窗与设置布局
|
||||
|
||||
- 聊天列表增加底部跟随:发送后回到底部,内容或窗口尺寸改变时跟随;主动上翻阅读时暂停跟随。相同错误仅合并连续提示,不再吞掉后续发送的失败反馈。
|
||||
- [x] 前阶段隔离浏览器模拟 404 连续发送 7 次及上翻后再发送:每次失败可见,最终距底部均为 0;前端构建通过。后端实现的验收边界见上节。
|
||||
- 入口改为静态简洁按钮;桌面端支持拖动标题移动、上边缘 / 左边缘 / 左上角调整大小,位置与尺寸保存为浏览器 UI 偏好。窄屏使用全宽布局。
|
||||
- 设置与 Skills 子页收缩边界、长文换行和内部滚动已调整;修正技能搜索及全选,模型选择仅保留一个图标,输入框移除聚焦位移。
|
||||
- MCP 不再显示未经验证的连接成功状态。Agent 错误按 HTTP 状态呈现,不再根据错误文案断言系统模型渠道仍启用。
|
||||
- [x] 专项测试:窗口几何与恢复、错误语义、会话缓存、资源引用输入,共 23 项通过。
|
||||
- [x] 隔离组件浏览器验证:拖动 / 缩放 / 刷新恢复、Skills 搜索全选、明暗主题和 375px 窄屏无横向溢出、输入聚焦不位移。使用模拟接口,不代表后端联调通过。
|
||||
- [ ] 登录真实画布验收入口、设置、详情、输入及窗口偏好;检查画布缩放和快捷键不干扰浮窗。
|
||||
- [ ] 真实 Agent 运行、工具写入、媒体生成与 SSE 重连待联调;当前专项测试使用模拟模型和本地数据库,不替代真实上游验收。
|
||||
|
||||
## 画布图片资源缓存链路优化
|
||||
|
||||
消除首屏满屏转圈与"一直在下载":后端图片资源改 30 天磁盘强缓存(`Cache-Control: max-age=2592000`),前端内存防抖 IndexedDB 元数据写入、O(1) 淘汰预检、并发下载 4→16,视口内远程图片直链首帧上屏(走原生磁盘缓存秒开),Blob 缓存后台平滑升级。已编译通过,需浏览器最终确认:
|
||||
@@ -1680,3 +1738,51 @@ v2(用户反馈首版难看后重做):菜单改用 antd Dropdown(placeme
|
||||
- [ ] 有画布图片(含视频封面)时从画布添加/搜索/多选参考图,图生模式强制单选;缩略图加载后不再停留骨架态,失败图显示「加载失败」。
|
||||
- [ ] 确认生成与图片直出两条路径行为与旧版一致(配置字段、连线、提示词),⌘↵ 快捷提交可用;「复制完整提示词」内容正确。
|
||||
- [ ] 680px 弹窗在窄屏(`<768px`)无横向溢出,全景类型卡片换为单列;选图器覆盖层可独立关闭,不误关整个弹窗。
|
||||
|
||||
## 云端 Agent Skills 选择与 Token 预算(2026-09-13)
|
||||
|
||||
Skills 选择器已扩大为固定高度面板,增加宽松留白、自定义多选状态、250ms 搜索防抖和服务端分页的滚动续载;Agent 输入恢复画布节点 `@` 候选,`/` 选择技能后保留可读技能名,不再显示内部 skill ID 或残留斜杠。Token 计费模型现可进入 Agent,账单会把预授权报价固化为最终扣费上限。前端生产构建、ESLint、29 项相关测试,以及后端 app/repository/database 测试通过,需浏览器和真实计费渠道验收:
|
||||
|
||||
- [ ] 在明暗主题、窄窗口和低高度窗口打开 Skills,确认面板尺寸稳定、列表独立滚动、空态不缩高、选中态与焦点清晰。
|
||||
- [ ] 在“发现 Skills”连续滚动并搜索,确认每页只请求 20 条、无重复项或并发重复翻页,加入后可立即勾选。
|
||||
- [ ] 输入 `@` 选择任意画布节点,再输入 `/` 选择技能,确认编辑器显示节点引用和不带 `/` 的 Skill 标签,提交请求同时携带正确节点上下文与 skillId。
|
||||
- [ ] 使用 Token 计费文本模型运行 Agent,确认不再报“仅支持按次定价”,实际 usage 超过预授权估值时最终扣费不超过本轮报价和总预算。
|
||||
|
||||
## 云端 Agent 已完成轮次事件流恢复(2026-09-13)
|
||||
|
||||
成功任务会按存储配额策略压缩 `tasks.input_json`,旧读取逻辑却依赖其中的 `cloudAgent` 字段校验运行,导致完成后的 `/api/agent/runs/:id/events`、查询及续聊返回 404。现从同一用户的持久化 `cloud_agent_executions.state_json` 恢复并校验运行身份;新轮次持久化幂等指纹与历史,旧轮次可读取和续聊(旧记录缺少指纹时不接受复用幂等键)。后端专项测试覆盖压缩后的查询、隔离、幂等与续聊。需更新后端进程并验收:
|
||||
|
||||
- [ ] 对已完成的 Agent 轮次重新打开会话,`GET /api/agent/runs/:id` 和 `GET /api/agent/runs/:id/events` 不再返回 404,事件流正常结束。
|
||||
- [ ] 在该轮次后继续发送消息,可接续原对话且不重复创建画布任务;跨账号读取仍被拒绝。
|
||||
|
||||
## 云端 Agent Skill 引用展示修复(2026-09-13)
|
||||
|
||||
`/` 仅作为 Skill 选择命令,不再渲染到编辑器 Skill 标签;发送后的用户消息将 `@[skill:<id>]` 映射为图标 + Skill 名称标签,历史标题也不会暴露内部 Skill ID。请求体仍保留稳定 token,供后端按 `skillId` 固定版本。需浏览器验收:
|
||||
|
||||
- [ ] 输入 `/` 选择 Skill,编辑器和发送后的消息均显示图标 + 名称,不显示 `/`、内部 ID 或乱码;刷新会话后显示保持一致。
|
||||
|
||||
## 云端 Agent 工具消息用户化(2026-09-13)
|
||||
|
||||
工具事件在聊天中改为结果摘要:`skills_load` 显示「已成功加载 N 个 Skills 技能」,画布读取、Skill 资料读取、画布更新和生成任务分别显示自然语言结果;隐藏内部工具名、蓝色扳手时间线、重复状态文案和 JSON 展开入口。处理中状态改为紧凑的脉冲提示。需浏览器验收:
|
||||
|
||||
- [ ] 运行包含 Skill 和画布读取的 Agent,确认只显示用户可理解的成功摘要,不出现 `skills_load`、`canvas_get_state`、`工具调用`、`工具执行成功` 或 JSON 展开内容;工具列表间距紧凑且明暗主题可读。
|
||||
|
||||
## 云端 Agent 审批卡片与提交反馈(2026-09-13)
|
||||
|
||||
审批卡片改为无左侧竖杠的中性确认面板:根据待审批参数摘要展示新增/修改节点数量和标题,不展示内部工具名或正文;“同意执行”使用蓝色主按钮,拒绝理由默认收起。审批使用独立提交状态,不再被整轮消息的 `busy` 锁住;请求 15 秒超时后读取服务端决定以辨别成功或保留可重试状态,SSE 刷新不再覆盖输入中的拒绝理由。前端构建、摘要测试及后端压缩任务输入后的审批专项测试通过,需浏览器验收:
|
||||
|
||||
- [ ] 在真实待审批轮次点击“同意执行”,按钮可立即响应,后端接受后卡片消失、画布修改发生;快速重复点击不重复执行。
|
||||
- [ ] 拒绝理由输入期间 SSE 刷新不清空文字;拒绝可提交;接口超时或失败时按钮恢复可点击并给出明确错误,不无限转圈。
|
||||
- [ ] 明暗主题及窄面板下卡片无左侧竖杠,蓝色按钮、节点摘要、焦点与禁用态可辨识。
|
||||
|
||||
## 云端 Agent 可靠性第一阶段收尾(待生产等价容量验收)
|
||||
|
||||
本轮补齐了 Agent 运行控制字段和后台收尾:取消 / 失败不再依赖大段运行 JSON 才能落库,`cleanupPending` 会由相同的 HTTP 与 Worker 收尾路径恢复;迁移 v14 会按 100 条批量回填旧运行,遇到损坏运行记录会中止并回滚,不静默遗留不可恢复任务。调度改为带游标的公平分页,避免前 50 条长期等待时后续就绪运行完全饥饿。
|
||||
|
||||
SSE 现在按 revision 变化发送紧凑快照,无变化只 heartbeat;客户端具备游标去重、确定性 4xx 立即停止、429 `Retry-After`、建连 / 心跳超时、抖动退避和有限失败预算。Agent admission 请求先保存原正文和幂等键,响应不确定时只重放同一请求;收费 provider create 不做盲目 HTTP 重试。聊天续聊会保留失败轮次的用户目标与真实工具事实,并把画布操作记录做成可聚焦节点的消息留痕。
|
||||
|
||||
已验证:后端 `internal/app`、`internal/repository`、`internal/database`、`internal/handler` 测试通过;前端 Agent 协议、pending 恢复与相关画布测试通过;前端 build 和 TypeScript 检查通过。新增测试使用临时 SQLite / mock fetch,不调用收费模型,不代表真实容量。
|
||||
|
||||
仍待:隔离 PostgreSQL + Redis + mock 上游的 50/100/500 活跃运行压测、多实例断线重连、worker kill/restart、DB/Redis 短暂不可用、接单后响应丢失,以及取消落库后账务 / 上游取消收尾窗口的端到端验收。当前默认 Agent worker 并发和渠道并发仍需按线上资源、模型额度和连接池共同压测,不能据本轮单测承诺 500 用户可接受的 p95 或队列时延。
|
||||
|
||||
迁移 v14 发布前备份数据库并先在副本演练;新程序写入的 pending 控制字段不保证旧程序理解,回滚旧程序前必须确认没有待收尾运行。若迁移因损坏运行中止,应先导出并核对该运行及关联任务,再修复或人工处理,禁止跳过校验强行上线。
|
||||
|
||||
Reference in New Issue
Block a user