From bc5398894ea0d9dc9a58e410beeb6bf2fbb1cdd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Wed, 9 Sep 2026 14:29:38 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E5=88=86=E7=A6=BB=E6=A0=91?= =?UTF-8?q?=E4=B8=8E=E6=89=B9=E6=AC=A1=E7=AE=97=E6=B3=95=E7=BA=A6=E5=AE=9A?= =?UTF-8?q?=20=E6=98=8E=E7=A1=AE=E7=9C=9F=E5=AE=9E=E6=A0=B9=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E3=80=81=E9=80=BB=E8=BE=91=E5=8F=B6=E5=92=8C=E9=9D=9E?= =?UTF-8?q?=E9=87=8D=E5=8F=A0=E8=B4=AA=E5=BF=83=E9=80=89=E6=8B=A9=20?= =?UTF-8?q?=E8=A1=A5=E5=85=85=E7=88=B6=E8=8A=82=E7=82=B9=E7=B4=AB=E8=89=B2?= =?UTF-8?q?=E9=87=8D=E5=BB=BA=E4=B8=8E=E9=94=99=E8=AF=AF=E6=81=A2=E5=A4=8D?= =?UTF-8?q?=E8=BE=B9=E7=95=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...术方案】UI编辑器自动分离工作流-2026-09-08.md | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/docs/technical/【技术方案】UI编辑器自动分离工作流-2026-09-08.md b/docs/technical/【技术方案】UI编辑器自动分离工作流-2026-09-08.md index e967abc21..e4533dd58 100644 --- a/docs/technical/【技术方案】UI编辑器自动分离工作流-2026-09-08.md +++ b/docs/technical/【技术方案】UI编辑器自动分离工作流-2026-09-08.md @@ -17,24 +17,26 @@ ## Separation tree -- recognition 完成后由 UI tree 构造临时 separation tree。 -- 纯节点、纯 Text 节点和不需要切图的节点在构造时过滤;被过滤节点的可处理 children 向上透传。 -- separation tree 只保留真实待处理节点。 -- 一个 batch 是整页当前所有互不重叠叶节点。 +- recognition 完成后由 UI tree 构造临时 separation tree;每棵树保留原 UI tree 的 `src_ui_design` 与真实 `root`,不生成 synthetic root。 +- 非 root 的纯容器、纯 Text 节点和不需要切图的节点在构造时过滤,被过滤节点的 children 向上透传。真实 root 始终保留;`root_extractable` 表示 root 是否含未绑定图片组件并可作为候选。 +- 节点的 `children` 在整个 workflow 中始终保留,不能因处理成功或失败而从树上删除。节点终态由 `bound`、`problematic_nodes` 反查;两者均不存在时仍待处理,`rework_count` 仅记录视觉模型返工次数。 +- 逻辑叶必须是未终止、可处理且所有 children 都已终止的节点;root 在 `root_extractable=true` 时按普通节点参与,否则只递归其 children。 +- 候选按 DFS 和 children 原顺序遍历,使用简单贪心选择与已选矩形无正面积交集的节点组成 batch;边或角接触不算重叠,不做面积或偏差排序检查。正常树结构下有候选时至少选中一个。 +- 一个 batch 是当前树中整批互不重叠的逻辑叶节点。 - 一个 batch 的最小处理单元是:一次 image-edit + 一次 visual binding。 -- batch 成功后从 pending tree 移除对应叶节点,并把结果放入 bound 容器;失败节点移入 problematic 容器,流程继续消费剩余树。 +- batch 成功后只把结果追加到 bound 容器,失败节点在达到返工上限后追加到 problematic 容器;树拓扑不变,流程继续消费剩余树。 - 不额外维护节点状态枚举;节点是否仍在 pending tree、`rework_count` 和 problematic 容器共同表达状态。 ## 图片编辑与视觉绑定 -- image-edit 使用源 UI design 图片及由 Rust 生成的绿色标记/紫色重建输入。 +- image-edit 使用源 UI design 图片及由 Rust 生成的绿色标记/紫色重建输入。处理父节点时,紫色填充其 children 的矩形区域(包括已 problematic 的 children),再在父节点自身外围绘制绿色框;绿色框覆盖在紫色之上。叶节点只绘制绿色框,不填充自身。 - 请求尺寸始终使用源 UI design 尺寸;Raw GPT Image 2 API 保证返回相同尺寸,客户端不额外做尺寸拒绝检查。 - 标记图构建、处理图解码/写入和 cut 裁切属于本地 CPU/文件操作,放入独立的 `spawn_blocking` 任务;image-edit 与 visual binding 网络请求仍运行在 async future 中。 - 视觉 binding 输入源图与处理图,必须为当前 batch 每个节点恰好返回一次 `Ok` 或 `NeedRework`。 - `Ok` 返回 `NodeId + BindingArea`;Rust 仅校验 NodeId、区域边界和非零尺寸,不检查与原节点框的偏差,也不要求区域不重叠。 - `NeedRework` 携带短问题描述。结构化工具调用失败时使用可复用 repair harness,把错误反馈给模型并额外请求一次;image-edit 不使用该 harness。 -- 达到模块级重做常量后,节点移入 problematic;不中断整条工作流,最终统一通知用户。 +- 达到模块级重做常量后,节点移入 problematic;不中断整条工作流,最终统一通知用户。image-edit、图像写入或裁切失败保留当前 state 并返回错误,不自动把整批标记为 problematic。 - 父节点背景重建由 image-edit 模型完成,不由 Rust 硬编码重建算法完成。 ## 临时 sidecar @@ -42,7 +44,7 @@ - separation 状态不写入 UI JSON,也不进入 manifest。 - sidecar 目录按 UI manifest `asset_id` 生成,复用 `generated_file_stem(asset_id)` 的安全字符替换和 SHA-256 摘要规则,位于项目 `ui/` 下。 - 目录只保存一份当前 separation state,而不是每 batch 一个状态文件。 -- state 文件只保留 `schema_version`、pending tree、bound 结果和 problematic 节点,不重复保存 `projectId / assetId / uiStateRevision`。 +- state 文件只保留 `schema_version`、separation trees、bound 结果和 problematic 节点,不重复保存 `projectId / assetId / uiStateRevision`。 - sidecar 只在 separation 未完成期间存在;完成后删除 state JSON。 - 当前只持久化已经完成的 batch;正在执行 batch 的恢复语义列 TODO。 - 临时图片可跨重启保留。raw image-edit 返回图、绿色/紫色标记图、处理图和 cut 图片当前都保留用于 debug;理论上只应在内存中,清理/归档策略列 TODO。