Files
AnyImage/openspec/changes/unify-ai-input-validation/design.md
nan 489003c2cc Add new tests and functionality for image processing and geometry handling
- Introduced color_image.py for preparing standalone color images for tests.
- Added hdr_image.py to create HDR textures for testing.
- Implemented test_image_depth_panorama.py to evaluate panorama topology, UVs, and depth discontinuities.
- Created test_shadeless.py to validate the opacity and HDR color endpoints of the Shadeless group.
- Developed moge3_export.py for exporting dynamic MoGe-3 backbone and ONNX graphs.
- Added material.py to inherit material slots onto generated geometry.
- Built image_depth_panorama.py to construct a quad panorama with depth separation and sampling.
2026-09-10 14:42:17 +08:00

84 lines
6.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## Context
以当前工作区调用链为依据:
| 位置 | 发现 | 处理方向 |
| --- | --- | --- |
| `common/ai.py` | BEN2 专属扩展名与后端重复,Upscale 只检查路径存在 | 统一公共预检 |
| `server/media/input.py` | 扩展名提示混排;目录过滤后仅提示没有帧 | 按错误原因和媒体类别提示 |
| `server/models/ben2.py` | 单帧校验使用第三套提示 | 复用图片格式校验 |
| `common/image.py` | 路径文案限定 Image Empty;序列直接复制;packed 导出失败可能留下目录 | 使用 source 文案、复制前校验、准备失败释放资源 |
| Remove BG、Depth/Relief Plane | 内部 Operator 调用位于异常处理之外 | 捕获同步调用错误并取消 |
| `operators/ai_setup.py`、`invoke_ai_setup_if_needed()` | 下载、安装与设置入口嵌套调用 | 在公共准备入口和设置 Operator 内处理失败 |
| Panorama | 已捕获嵌套调用错误并清理 | 回归现有行为 |
BlendJob 的 `request()` 错误会被转换为 ERROR report 和 CANCELLED;Blender 的 `bpy.ops` 调用仍可能将该 report 抛为 RuntimeError。异步 Job 失败已有集中处理。前后端可以共享 `server` 内纯 Python 模块,已有 resolution 模块采用这一依赖方向;后端保持可独立加载。
## Goals / Non-Goals
统一 AI 输入校验、用户可读的错误原因、失败取消状态和临时输入生命周期。支持格式保持 JPG/JPEG/PNG/WEBP 与现有九种视频扩展名;各 Operator 继续表达自己的静态图、尺寸与比例限制。自动转码、扩展格式支持和 BlendJob 框架重构作为独立需求处理。
## Decisions
### 1. 公共媒体模块维护格式规则与提示
在 `server/media/input.py` 提供轻量路径/格式校验,按图片、视频或帧目录识别输入,图片模型使用相同规则的图片子集。模块加载和预检仅依赖标准库。
`common/ai.py` 的 `require_input_path()` 负责 Blender 路径解析并调用该规则;删除 BEN2 专属校验及扩展名常量。`prepare_input()` 在后端再次执行校验,应对独立 Job 请求和提交后源文件变化。前端和后端使用同一消息生成位置,比只在后端检查更早反馈,也避免复制列表。
```mermaid
flowchart TD
Source[Blender 源图片] --> Prepare[解析路径与准备输入]
Prepare --> Validate[公共媒体校验]
Validate --> Submit[提交 Job]
Submit --> Recheck[后端公共媒体校验]
Recheck --> Decode[读取图片或视频帧]
Decode --> Model[模型处理]
Validate --> Error[普通错误提示与取消]
Recheck --> Error
Decode --> Error
```
### 2. 提示由原因决定,格式按类别列出
保留当前英文 UI 语言,示例模板:
- `Source image file does not exist: {path}` / `Source video file does not exist: {path}`。
- `Unsupported input format: {suffix}. Supported images: {images}. Supported videos: {videos}.` 扩展名排序且小写;无扩展名使用 `(no extension)`。
- `No supported image frames found in: {path}. Supported images: {images}.`。
- `Unable to read image: {path}` / `Unable to read video: {path}`,底层原因保留异常链供诊断。
只将路径检查、文件读取与解码边界的预期异常转换为输入提示,模型推理或资源错误保留实际原因。通用输入阶段保持图片与视频类别一致;BEN2 单帧模型内部使用图片子集提示。
### 3. 明确目录与 Blender 序列的差别
Blender SEQUENCE 在创建临时目录前验证源扩展名属于支持的图片格式,不支持时直接报格式错误。已识别的同名序列按原排序和帧区间处理。
通用目录仍仅选择支持格式的图片文件并忽略其他文件;预检与后端使用同一收集规则。全无有效图片时报告目录及支持图片格式。这一提案修复 Blender 序列被误报为空目录的问题,混合目录按筛选契约验收。
格式校验针对实际提交文件。packed 图片和像素裁剪输出使用现有 PNG 导出路径,普通文件继续使用原始文件;测试应明确两条路径的预期,避免把源名称当作实际编码。`IMAGE_NAME_SUFFIXES` 是命名识别列表,继续按命名职责维护。
### 4. 在拥有调用与资源的边界处理失败
Remove BG、Depth/Relief Plane、AI Environment 的嵌套 `bpy.ops` 调用捕获预期 RuntimeError;涉及输入准备的边界同时处理 OSError/ValueError。通过已有 report 出口返回 CANCELLED,规范 Blender 添加的首个 `Error: ` 前缀与尾部换行,保留实际原因。公共 AI setup 入口复用同一报错约定;异步 Job 仍由 BlendJob 管理。
临时输入在准备完成前由准备函数拥有;Job 成功接管后由 Job cleanup 拥有。准备失败、同步调用抛错、返回 CANCELLED 和异步失败分别验证释放责任。packed 导出失败应清理整个临时目录。清理只能触及本次操作创建的输入,不影响用户原文件和源图片引用。
优先在现有公共函数与直接调用处落实职责;复用消息格式化即可,保持各业务 Operator 的调用和资源归属可见。
## Risks / Trade-offs
- 前后端文件状态可能变化 → 后端复核并提供同一原因分类。
- 测试 mock 不会自动模拟 Blender report 抛错 → 单元测试注入 RuntimeError,补充真实 Blender 入口验证。
- 调用层次多可能重复 report → 以最终用户提示无重复前缀、无 Python traceback 为验收点,检查 Blender UI 实际输出。
- 解码错误与推理错误容易混淆 → 只在读取边界包装解码异常。
- 其他未归档变更修改相关入口 → 以实施时工作区为基线,保留 Undo、源图共享引用及 Panorama 行为。
## Migration Plan
依次落地公共校验、消费者接入、调用边界与清理,再运行相关及全量测试。删除旧 BEN2 校验入口并检查引用。变更不涉及持久数据迁移;必要时可整体回退本变更代码与测试。
## Open Questions
无实施前置问题。真实 Blender 下 report 的重复展示情况列为实施验收项。