Files
yingqing/docs/agents_todo/平台套图Agent_协同引入实施方案.md

1036 lines
34 KiB
Markdown
Raw Permalink 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.
# 平台套图 Agent 协同引入实施方案
> 目标:在复用现有图片工作台、AITask、积分、Celery、Provider、Asset 和 TOS 的前提下,把当前“固定平台模板 + 按序批量生图”升级为能规划套图、选择参考素材、并行生成、逐图质检、定向补图并由用户采用的平台套图 Agent。
> 架构原则:松耦合、高内聚、可复用、精简化、可扩展。
> 代码基线审阅时间:2026-07-17。
## 1. 结论先行
平台套图 Agent 最适合做 AirShelf 的第一个视觉 Agent,但首期不应让多个视觉模型自由讨论。推荐采用:
```text
一个平台套图协调器
+ 确定性商品/平台上下文收集
+ 轻量套图规划节点
+ 参考图选择器
+ 提示词编译器
+ 现有图片生成工具
+ 独立视觉质检器
+ 失败槽位最多一次定向补图
+ 套图版本和人工采用
```
与当前链路相比,真正新增的 Agent 能力是:
1. 先形成完整套图计划,而不是按 index 固定轮换;
2. 检查真实商品参考图是否足够,不足时暂停而不是静默纯文生图;
3. 为每个槽位声明目标、参考图、构图、文字政策和验收规则;
4. 观察每张生成结果,结构化识别失败原因;
5. 只重试失败槽位,不整批重跑;
6. 保存套图版本、槽位关系和质检报告;
7. 用户确认后采用,不自动覆盖现有资产。
## 2. 当前代码基线与主要问题
### 2.1 当前链路
```text
ai-tools.tsx 选择商品、平台、张数、比例、模型、prompt
→ POST /api/ai/generate-image/ mode=cover
→ GenerateImageView
→ enqueue_standalone_images 创建 N 个 AITask
→ Celery run_standalone_image_task
→ 读取最多 3 张商品真实图
→ build_platform_cover_prompt_refs
→ index % 6 选择固定槽位
→ Seedream/GPT-Image 单张调用
→ Asset(category=platform_kit)
→ 前端轮询
```
### 2.2 当前缺口
1. 无真实商品参考图时会退到裸文生图,平台模板也可能没有进入最终 prompt;
2. 4/8/12 张是六槽位循环,不是针对商品和平台制定的内容计划;
3. 每张图彼此独立,不知道整套图是否重复或缺某类内容;
4. 生成成功只代表拿到图片,没有 OCR、商品一致性、平台规则和构图质检;
5. `Asset.metadata` 当前没有完整保存 platform_id、slot、plan、attempt
6. 平台归属主要在 `AITask.request_payload`,资产脱离任务后可追溯性不足;
7. 页面选择的模型和最终 provider 在部分场景可能不完全一致;
8. 纯文本分支未明确把 ratio 对应尺寸传给 provider
9. 批次只有 batch_id,不是可采用、可版本化的业务套图实体;
10. 重跑缺少基于失败原因的定向修复。
## 3. 改造边界
### 3.1 必须复用
| 能力 | 当前代码 | 新 Agent 用法 |
| --- | --- | --- |
| 商品与图片 | Product、ProductImage、cover_asset | 通过工具读取真实参考图和快照 |
| 平台规则 | `_PLATFORM_NAMES``_PLATFORM_COVER_BLOCKS` | 抽成版本化规则服务 |
| 槽位规则 | `_COVER_SLOTS` | 作为默认策略,不再直接由 index 决定 |
| 提示词基础 | `build_platform_cover_prompt_refs()` | 拆成可测试的 PromptCompiler |
| 图片模型路由 | `resolve_image_model()`、ModelConfig | 包装成 capability router |
| 单图任务 | `enqueue_standalone_images()``AITask` | 提供单槽位生成工具,保留计费 |
| Worker | `run_standalone_image_task()` | 继续负责 Provider、TOS、Asset 和退款 |
| 图片资产 | Asset、AssetFile | 保存每个槽位的候选图 |
| 会话/页面 | ImageConversation、ai-tools.tsx | 保留入口和历史,增加套图运行视图 |
| 异步基础 | Celery、轮询、僵尸回收 | 继续复用 |
### 3.2 本次不做
- 不自动发布到淘宝、抖音等外部平台;
- 不自动修改商品事实、价格和认证;
- 不无限生成到“满意为止”;
- 不把图片二进制或长 Base64 保存进 Agent 表;
- 不重新实现图片 Provider、资产库、积分和对象存储;
- 不让视觉 Agent 直接执行 ORM 或任意外部请求;
- 不用同一个生成模型无约束地给自己打高分;
- 首期不做跨平台营销效果预测。
## 4. 五项架构原则如何落地
| 原则 | 落地方式 | 禁止做法 |
| --- | --- | --- |
| 松耦合 | 协调器依赖工具和 `PlatformKitPlan` 契约;生成器、OCR、视觉评估可替换 | 在 Coordinator 中直接 import Seedream Provider |
| 高内聚 | 平台计划、槽位、规则、提示词、评估都在 platform_kit 领域模块 | 把视觉规则继续堆进通用 `services.py` |
| 可复用 | AgentRun/Step、预算、路由、工具、并发、事件与脚本 Agent 共用 | 平台套图复制一套 Agent 基础设施 |
| 精简化 | 固定 DAG,计划一次、每槽生成一次、失败槽最多补一次 | 首期上通用多 Agent 对话框架 |
| 可扩展 | 平台规则、计划、提示词、rubric 全部有版本 | 通过 if/else 隐式依赖页面文案 |
## 5. 推荐代码结构
公共 `apps/agents` 基础设施与脚本 Agent 复用,只新增平台领域目录:
```text
core/backend/apps/agents/
├─ models.py / runtime.py / registry.py / policies.py
├─ routing.py / permissions.py / events.py
├─ tools/
│ ├─ product.py
│ ├─ assets.py
│ ├─ models.py
│ ├─ billing.py
│ └─ image_generation.py
├─ schemas/
│ ├─ common.py
│ └─ platform_kit.py
└─ platform_kit/
├─ coordinator.py # 固定 DAG/状态机
├─ context.py # 商品、平台、参考图快照
├─ rules.py # 从 services.py 抽出的平台规则
├─ planner.py # 生成 PlatformKitPlan
├─ plan_validator.py # 数量、平台、文字政策、槽位覆盖
├─ reference_selector.py # 每槽参考图选择
├─ prompt_compiler.py # PlanSlot → ImageGenerationSpec
├─ generator.py # 调用受控单图工具
├─ evaluator.py # OCR + 视觉评估 + 规则汇总
├─ repair.py # issue_code → 定向补图 spec
├─ handoff.py # 套图版本/结果交接
└─ prompt_versions.py
```
平台套图是独立业务产物,建议在图片/资产领域增加:
```text
core/backend/apps/assets/
├─ models.py # PlatformKitVersion / PlatformKitItem
├─ serializers.py
└─ services/platform_kit.py # 保存、采用、版本查询
```
前端:
```text
core/frontend/src/
├─ routes/ai-tools.tsx # 保留入口,接 AgentRun
└─ components/platform-kit-agent/
├─ kit-plan.tsx # 套图计划与槽位
├─ slot-card.tsx # 单槽进度/候选/问题
├─ evaluation-badge.tsx # 质检状态
├─ repair-confirm.tsx # 补图报价和确认
└─ kit-review.tsx # 整套采用
```
## 6. 为什么需要独立套图领域实体
AgentRun 表示“执行过程”,Asset 表示“单张图片”,两者都不适合作为一套平台图的长期业务真相源。建议新增:
### 6.1 PlatformKitVersion
```text
id
team_id
product_id
platform_id
version
status draft / ready / adopted / rejected
requested_count
ratio
plan_schema_version
plan_snapshot
platform_rule_version
product_snapshot_hash
agent_run_id
created_by_id
is_adopted
created_at/updated_at
```
### 6.2 PlatformKitItem
```text
id
kit_version_id
slot_id 稳定业务 ID,例如 hero-01
slot_type hero/scene/selling/detail/multi/promo/custom
order
goal
status planned/generating/evaluating/passed/
warning/failed/retrying/rejected
selected_asset_id 最终候选,可空
generation_task_id 当前 AITask,可空
attempt_count
prompt_snapshot
reference_snapshot
evaluation_report
created_at/updated_at
```
一个 Item 可通过 AgentArtifact 关联多个候选 Asset`selected_asset_id` 指向最终保留图。这样可以:
- 精确知道整套图还缺哪个槽位;
- 只补失败项;
- 保留同槽位多个版本;
- 一键采用完整套图;
- 未来供商品详情页、导出、投放和分析直接消费;
- Agent 运行结束后仍保留业务结构。
## 7. 输入契约
### 7.1 `PlatformKitAgentRequest/v1`
```json
{
"schema_version": "platform-kit-agent-request/v1",
"product_id": "uuid",
"platform_id": "douyin",
"count": 4,
"ratio": "1:1",
"instruction": "整体真实自然,突出轻便和易清洗",
"selected_selling_point_ids": ["uuid"],
"reference_asset_ids": [],
"text_policy": "minimal | no_text | short_labels",
"model_policy": {
"mode": "explicit | auto",
"model_config_id": null,
"quality": "production",
"cost_ceiling_points": 120
},
"repair_policy": {
"max_attempts_per_slot": 2,
"auto_repair_below_points": 15
},
"idempotency_key": "uuid"
}
```
前端继续提供现有 4/8/12 快捷数量,但后端契约不应依赖页面文案;允许范围由策略配置决定。首期为降低复杂度可先只开放 4 张,稳定后再恢复 8/12 张的智能规划。
### 7.2 `PlatformKitContextSnapshot/v1`
```json
{
"product": {
"id": "...",
"updated_at": "...",
"title": "...",
"brand": "...",
"category": "...",
"facts": ["..."],
"selected_selling_points": ["..."],
"reference_assets": [
{
"asset_id": "...",
"url": "...",
"source": "upload",
"is_ai_generated": false,
"view": "front",
"width": 1600,
"height": 1600,
"checksum": "..."
}
]
},
"platform": {
"id": "douyin",
"name": "抖音",
"rule_version": "douyin/v1",
"layout_policy": {},
"forbidden": []
},
"generation": {
"count": 4,
"ratio": "1:1",
"text_policy": "minimal"
}
}
```
参考图必须冻结 asset_id、文件 URL、checksum 和来源。执行期间资产被替换或删除时,运行应停止/标记 stale,不能静默改用其他图。
## 8. 协作节点与职责
| 节点 | 类型 | 输入 | 输出 | 模型调用 |
| --- | --- | --- | --- | --- |
| PlatformKitCoordinator | 状态机 | AgentRun | 下一步骤和并发控制 | 否 |
| ContextCollector | 工具组合 | request | ContextSnapshot、缺失项 | 否 |
| ReferenceInspector | 规则/可选视觉 | 参考资产 | 可用性和角色 | 首期规则,可选视觉 |
| KitPlanner | 规划器 | 商品事实、平台规则 | PlatformKitPlan | 可规则或文本模型一次 |
| PlanValidator | 规则引擎 | Plan、规则 | 错误/警告 | 否 |
| ReferenceSelector | 规则引擎 | slot、候选图 | 每槽参考图列表 | 否 |
| PromptCompiler | 领域服务 | slot、上下文 | ImageGenerationSpec | 否 |
| ImageGenerator | 业务工具 | spec | AITask/Asset | 图片模型,每槽一次 |
| ImageEvaluator | OCR/视觉评估 | Asset、rubric | EvaluationReport | OCR + 可选视觉模型 |
| RepairPlanner | 规则引擎 | issue codes、原 spec | RepairSpec | 首期否 |
| KitPersister | 领域服务 | plan/items | PlatformKitVersion | 否 |
| HandoffBuilder | 领域服务 | adopted kit | PlatformKitHandoff | 否 |
节点之间只传结构化 ID 和小型 JSON;图片通过 Asset ID/URL 引用,不把图片内容塞进 AgentStep。
## 9. 固定协同 DAG
```mermaid
flowchart TD
A[收集商品/平台/模型上下文] --> B{真实商品参考图足够?}
B -- 否 --> C[等待用户补图]
C --> A
B -- 是 --> D[形成套图计划]
D --> E[确定性校验计划]
E -- 不通过 --> F[修正规划或等待用户]
F --> D
E -- 通过 --> G[报价与预算确认]
G --> H[为每个槽位选择参考图并编译 spec]
H --> I[受控并行生成各槽位]
I --> J[逐图 OCR/视觉质检]
J --> K{所有必需槽位可用?}
K -- 是 --> L[保存 ready 套图版本]
K -- 否且可修复/有预算 --> M[仅失败槽位生成 RepairSpec]
M --> N[失败槽位补图一次]
N --> J
K -- 否且达上限 --> O[带问题进入人工审核]
L --> P[用户采用/替换单槽]
O --> P
P --> Q[生成平台套图交接包]
```
这里不是自由循环:每个槽位默认 1 次生成,最多 1 次自动补图;到上限立即停止并展示问题。
## 10. 上下文和参考图策略
### 10.1 参考图硬门槛
平台套图的核心是商品真实一致性,因此 Agent 模式必须取消当前“无商品图退到纯文生图”的静默降级:
```text
无可用真实商品图
→ waiting_user
→ 提示上传正面/侧面/细节图
→ 不创建付费图片任务
```
可配置最小要求:
- 普通包装/单品:至少 1 张清晰正面图;
- 有背面信息:建议正反 2 张;
- 服装/立体商品:建议正面 + 侧面/细节;
- 参考图必须排除 AI 生成图或明确标记为低可信辅助图。
### 10.2 参考图角色
```json
{
"asset_id": "...",
"role": "identity_lock | detail_reference | angle_reference | style_reference",
"priority": 1,
"allowed_slots": ["hero", "detail"],
"must_preserve": ["包装形状", "品牌文字", "主色", "Logo"]
}
```
首期由元数据和用户选择确定角色;视觉识别成熟后可辅助判断角度和清晰度,但不能自动认定 AI 图为真实商品事实。
## 11. 平台规则服务
把当前 `services.py` 中以下常量迁移/封装为 `PlatformRuleProvider`
- `_PLATFORM_NAMES`
- `_PLATFORM_COVER_BLOCKS`
- `_COVER_SLOTS`
- `_COVER_LOW_DENSITY`
- `_COVER_BG_CONTRAST`
- `_COVER_NEGATIVE`
接口:
```python
class PlatformRuleProvider:
def get(self, platform_id: str, version: str | None = None) -> PlatformRule:
...
```
`PlatformRule/v1`
```json
{
"platform_id": "douyin",
"version": "douyin/v1",
"visual_tone": ["强视觉抓力", "短视频封面感"],
"composition_rules": ["主体清晰", "信息密度低"],
"text_policy": {"max_short_labels": 2, "allow_price": false},
"required_checks": ["product_identity", "text_accuracy", "logo_safety"],
"forbidden": ["二维码", "虚假价格", "平台 Logo", "绝对化功效"]
}
```
首期规则仍可存在 Python 配置中,但必须通过 Provider 接口读取并记录版本。以后迁数据库或管理后台,不影响 Planner/Compiler。
## 12. 套图规划契约
### 12.1 `PlatformKitPlan/v1`
```json
{
"schema_version": "platform-kit-plan/v1",
"platform_id": "douyin",
"platform_rule_version": "douyin/v1",
"product_snapshot_hash": "...",
"creative_direction": "真实家庭场景,突出轻便和易清洗",
"global_constraints": {
"ratio": "1:1",
"product_area_percent": [60, 80],
"text_policy": "minimal",
"identity_fields": ["shape", "color", "material", "logo", "label_text"]
},
"slots": [
{
"slot_id": "hero-01",
"slot_type": "hero",
"order": 1,
"goal": "一眼看清商品并建立品牌记忆",
"selling_point_ids": [],
"composition": "正面主视觉,商品居中,背景简洁",
"reference_roles": ["identity_lock"],
"text_policy": "no_text",
"acceptance": ["主体完整", "Logo 不变", "无多余商品"]
},
{
"slot_id": "selling-01",
"slot_type": "selling",
"order": 2,
"goal": "表达易清洗",
"selling_point_ids": ["uuid"],
"composition": "使用前后场景,但不做拼贴详情页",
"reference_roles": ["identity_lock", "detail_reference"],
"text_policy": "short_labels",
"acceptance": ["只表达有事实来源的卖点"]
}
]
}
```
### 12.2 Planner 的首期实现
为了精简和稳定,建议两级策略:
- **MVP:确定性 Planner。**根据数量、平台和卖点从可配置槽位模板中选取,避免 LLM 费用;
- **增强版:文本 Planner。**只负责创意方向和槽位组合,输出 Plan JSONPlanValidator 必须检查并修正硬规则。
即使启用文本 Planner,也不能直接生成图片或更改商品事实。
### 12.3 PlanValidator
- platform_id 和规则版本有效;
- slot 数量等于请求 count
- slot_id 唯一、order 连续;
- hero 等必需槽位存在;
- selling slot 使用的卖点 ID 来自快照;
- 文字政策不超过平台规则;
- ratio 被模型能力支持;
- 每个槽位有参考角色和 acceptance
- 禁止多个槽位完全重复目标和构图;
- 8/12 张不得简单复制六槽位文本。
## 13. 提示词编译器
当前 `build_platform_cover_prompt_refs()` 应拆成纯函数:
```python
compile_platform_image_spec(
context: PlatformKitContextSnapshot,
plan: PlatformKitPlan,
slot: PlatformKitSlot,
references: list[ReferenceSpec],
model_capabilities: ModelCapabilities,
) -> ImageGenerationSpec
```
### 13.1 `ImageGenerationSpec/v1`
```json
{
"schema_version": "image-generation-spec/v1",
"agent_run_id": "...",
"kit_version_id": "...",
"slot_id": "selling-01",
"attempt": 1,
"capability": {
"multi_reference": true,
"ratio": "1:1",
"quality": "production"
},
"reference_asset_ids": ["...", "..."],
"reference_roles": ["identity_lock", "detail_reference"],
"prompt": "编译后的最终提示词",
"negative_constraints": ["禁止二维码", "禁止虚假价格"],
"acceptance_rubric": ["product_identity", "text_accuracy", "slot_goal"],
"idempotency_key": "run:slot:attempt"
}
```
### 13.2 最终 prompt 分层
```text
[输入数据声明]
参考图是同一真实商品,只用于商品身份和细节事实。
[身份锁定]
形状、颜色、材质、包装、Logo、标签文字、结构不可改变。
[平台规则]
来自 PlatformRule/version。
[整套方向]
来自 PlatformKitPlan.global_constraints。
[本槽位目标]
slot.goal + composition + selling points。
[文字政策]
no_text/minimal/short_labels;文字只能来自事实快照。
[背景与构图]
主体比例、对比、镜头、光线。
[用户补充]
可影响创意,但不能覆盖事实和禁止项。
[负面约束]
平台禁用项、商品畸变、重复主体、乱码等。
```
PromptCompiler 只做编译,不调用模型、不查数据库,便于单元测试和复用于补图。
## 14. 模型路由与禁止静默降级
Agent 声明需求:
```json
{
"capability": "image",
"requires": {
"multi_reference": true,
"reference_count": 3,
"ratio": "1:1",
"image_edit_or_reference_generation": true
},
"preferences": {
"quality": "production",
"cost_ceiling_points_per_image": 20
}
}
```
路由器:
1. 读取启用的 ModelConfig
2. 过滤不支持参考图、数量、比例的模型;
3. 检查团队权限、余额、并发和 provider 健康;
4. 用户明确模型时验证能力,不满足则报错;
5. 自动模式按质量、历史通过率、延迟和价格排序;
6. 返回实际模型、调用方式、预计费用和决策摘要。
严格禁止:
- 需要真实商品参考却回退纯文生图;
- ratio 不支持时静默用默认比例;
- 用户明确选模型却无提示切换;
- 多参考接口失败后丢掉部分参考图继续生成;
- 高质量档静默降为低能力模型仍标记成功。
## 15. 生成工具适配
建议在不破坏现有 API 的前提下,从 `enqueue_standalone_images()` 拆出更细粒度服务:
```python
enqueue_standalone_image_spec(
team,
user,
spec: ImageGenerationSpec,
model_config,
) -> AITask
```
它继续复用:
- quote/reserve
- AITask
- Celery `generate_standalone_image_task`
- Provider 调用;
- TOS
- Asset/AssetFile
- 成功扣费与失败退款;
- 僵尸任务回收。
Worker 读取已经编译好的 prompt 和 reference_asset_ids,不再在执行时根据 mode/index 重新猜平台槽位。这样规划与执行解耦,重试可以精确复现输入。
输出 Asset metadata 至少增加:
```json
{
"mode": "cover",
"product_id": "...",
"platform_id": "douyin",
"batch_id": "...",
"agent_run_id": "...",
"kit_version_id": "...",
"slot_id": "selling-01",
"slot_type": "selling",
"attempt": 1,
"plan_version": "platform-kit-plan/v1",
"platform_rule_version": "douyin/v1"
}
```
## 16. 并发策略
平台套图内部可以并行,但必须受控:
- 先为整套完成报价和预算确认;
- 每个槽位一个 AITask
- 同一 Run 最大图片并发建议 2–3;
- 同团队仍受全局图片并发限制;
- 计划、参考选择和 PromptCompiler 完成后才 fan-out
- fan-in 等待所有必需槽位达到终态;
- 某槽失败不取消其他成功槽;
- 恢复时查询原 task_id,不重复 enqueue
- 补图只创建失败槽的新 attempt。
## 17. 视觉质检协同
### 17.1 质检分层
```text
第 1 层:确定性文件检查
→ 文件可读、尺寸、比例、空图、重复文件
第 2 层:OCR/文字规则
→ 乱码、虚假价格、平台 Logo、二维码、文字数量、已知品牌文字
第 3 层:视觉评估模型
→ 商品身份、颜色/形状、Logo、主体完整、构图、槽位目标、平台风格
第 4 层:整套规则
→ 槽位覆盖、重复度、视觉一致性、缺图
第 5 层:人工采用
```
生成模型和视觉评估模型应尽量解耦;至少使用不同提示角色和确定性规则共同裁决,不能只相信“模型给自己 95 分”。
### 17.2 `ImageEvaluationReport/v1`
```json
{
"schema_version": "image-evaluation/v1",
"asset_id": "...",
"slot_id": "selling-01",
"passed": false,
"score": 68,
"dimensions": {
"product_identity": 2,
"composition": 4,
"text_accuracy": 5,
"platform_fit": 4,
"slot_goal": 3
},
"issues": [
{
"code": "PRODUCT_COLOR_CHANGED",
"severity": "error",
"repairable": true,
"evidence": "商品主体由浅蓝变为深蓝",
"repair_hint": "强化参考图1颜色锁定,禁止改变主色"
}
],
"evaluator": {
"rules_version": "platform-kit-rubric/v1",
"model_config_id": "可选",
"ocr_engine": "..."
}
}
```
标准失败码建议:
```text
PRODUCT_IDENTITY_MISMATCH
PRODUCT_COLOR_CHANGED
PRODUCT_SHAPE_CHANGED
LOGO_OR_LABEL_CHANGED
EXTRA_PRODUCT
PRODUCT_CROPPED
TEXT_GARBLED
UNSUPPORTED_CLAIM
QR_OR_PLATFORM_LOGO
WRONG_RATIO
SLOT_GOAL_MISSED
PLATFORM_RULE_VIOLATION
DUPLICATE_COMPOSITION
LOW_VISUAL_QUALITY
```
## 18. 定向补图
`RepairPlanner` 根据 issue_code 修改 spec,而不是让模型笼统“重新生成更好”:
| issue_code | 修复动作 |
| --- | --- |
| PRODUCT_COLOR_CHANGED | 提升 identity reference 优先级,加入精确颜色锁定 |
| LOGO_OR_LABEL_CHANGED | 强化标签不可重绘;必要时改为 no_text 场景 |
| EXTRA_PRODUCT | 明确单主体、禁止复制 |
| PRODUCT_CROPPED | 调整商品占比和安全边距 |
| TEXT_GARBLED | 删除生成文字或只允许短事实标签 |
| WRONG_RATIO | 修正 size,并要求 provider 能力确认 |
| SLOT_GOAL_MISSED | 保持商品锁定,只改构图和槽位描述 |
| DUPLICATE_COMPOSITION | 指定不同镜头/场景,保留整套方向 |
补图规则:
- 默认每槽最多 2 个 attempt
- 仅错误级问题触发自动补图,警告可交给用户;
- 自动补图费用低于阈值才执行,否则 waiting_approval
- 新图必须重新完整质检;
- 原图不删除,作为候选和审计保留;
- 第二次仍失败则停止,不递归。
## 19. 整套质检与采用
单图通过后还需检查:
- 必需槽位是否齐全;
- 是否有多个槽位构图高度重复;
- 商品颜色、包装和 Logo 是否跨图一致;
- 平台规则和全局文字政策是否统一;
- 每个选定卖点是否至少有一个槽位承接;
- 整套比例、视觉方向和数量是否一致。
用户可:
- 采用整套;
- 替换某槽候选;
- 手动保留带 warning 的图;
- 请求单槽补图;
- 拒绝整个版本。
采用通过 `assets/services/platform_kit.py` 完成事务:旧版本取消 adopted,新版本 adoptedItem 的 selected_asset 固定。Agent 无权直接更新这些字段。
## 20. API 设计
```http
POST /api/platform-kit-agent-runs/
GET /api/agent-runs/{run_id}/
GET /api/agent-runs/{run_id}/steps/
GET /api/platform-kits/{kit_version_id}/
POST /api/agent-runs/{run_id}/actions/
POST /api/platform-kits/{kit_version_id}/adopt/
```
创建请求使用 `PlatformKitAgentRequest/v1`
动作:
```json
{"action": "provide_references", "asset_ids": ["..."]}
{"action": "approve_budget"}
{"action": "approve_repair", "slot_ids": ["selling-01"]}
{"action": "retry_slot", "slot_id": "hero-01", "instruction": "..."}
{"action": "select_candidate", "slot_id": "hero-01", "asset_id": "..."}
{"action": "cancel"}
```
`/api/ai/generate-image/ mode=cover` 保留为普通批量生成回退;Agent 入口使用独立 API,避免给旧请求强加复杂状态。
## 21. 前端交互
不把平台套图页改成纯聊天。推荐三栏/三阶段信息:
1. **输入与计划**:商品、平台、参考图、卖点、套图方向、槽位列表、报价;
2. **执行过程**:每槽计划 → 生成 → 质检 → 补图的真实状态;
3. **结果审核**:每槽候选、问题证据、费用、整套采用。
必须展示:
- 实际调用模型,不只展示用户初始选择;
- 参考图不足时明确阻塞;
- 每张图属于哪个槽位;
- 失败是生成失败还是质检失败;
- 补图只补哪张、预计增加多少积分;
- warning 图由用户决定是否采用。
## 22. AgentRun/AgentStep 映射
示例:
```text
AgentRun(platform_kit)
├─ Step 1 collect_context
├─ Step 2 inspect_references
├─ Step 3 plan_kit
├─ Step 4 validate_plan
├─ Step 5 quote
├─ Step 6 persist_kit_version
├─ Step 7 generate_slot:hero-01 → AITask A
├─ Step 8 generate_slot:selling-01 → AITask B
├─ Step 9 evaluate_slot:hero-01 → 可关联评估 AITask C
├─ Step 10 evaluate_slot:selling-01 → 可关联评估 AITask D
├─ Step 11 repair_slot:selling-01 → AITask E
├─ Step 12 evaluate_repair
├─ Step 13 validate_kit
└─ Step 14 human_review/handoff
```
图片套图的步骤数随槽位变化,因此公共 policy 不能沿用脚本 Agent 固定的 8 步;平台 Agent 应设置“协调步骤上限 + 每槽尝试上限 + 总任务上限”。
## 23. 预算策略
```json
{
"max_coordination_steps": 20,
"max_slots": 12,
"max_attempts_per_slot": 2,
"max_planner_calls": 1,
"max_evaluator_calls_per_asset": 1,
"max_total_image_tasks": 24,
"max_total_points": 300,
"auto_repair_points_per_slot": 15,
"require_human_adoption": true
}
```
报价至少拆分显示:
- 套图规划费用;
- 首轮生成预计费用;
- 视觉评估预计费用;
- 自动补图最大预留费用;
- 总预算上限。
未使用的补图预算不预先扣成实际费用;每个 AITask 仍单独 reserve/charge/release。
## 24. 幂等、恢复与一致性
- `(team_id, idempotency_key)` 防重复创建运行;
- `slot_id + attempt` 形成图片任务幂等键;
- PlatformKitItem 记录当前 task_id,恢复时不重建;
- Coordinator 使用数据库锁更新 Run/Item
- fan-out 任务独立成功/失败,fan-in 只读取终态;
- Asset 创建后通过事务写回 Item 和 AgentArtifact
- 用户中途删除参考图,未开始槽位停止,运行标记 stale;
- 商品关键字段变化后,采用前提示重新验证;
- 用户取消后不再创建新任务,已在 provider 执行的任务按现有机制处理;
- 质检 Worker 重复投递不能重复收费或重复生成补图。
## 25. 权限与安全
- 所有商品、参考资产、模型、套图版本必须限定当前 team;
- 用户 prompt、商品描述和资产名称属于数据区,不能覆盖平台规则和工具权限;
- Planner 输出中的卖点 ID 必须存在于 Snapshot
- OCR 发现价格、认证、功效时必须能映射商品事实,否则标错;
- Agent 不能发布外部平台;
- Agent 不能删除用户资产;
- 采用必须由有权限的用户触发;
- 日志只保存 URL/ID 和摘要,不保存敏感图片二进制;
- Provider 错误对用户返回标准错误码,详细响应保留在受限 AITask 中。
## 26. 错误分类与降级
| 错误 | 状态与处理 |
| --- | --- |
| `NO_REAL_PRODUCT_REFERENCE` | waiting_user,不生成 |
| `REFERENCE_NOT_READY` | waiting_user/waiting_task |
| `PLAN_INVALID` | 规则 Planner 重建一次或人工修改 |
| `MODEL_CAPABILITY_MISMATCH` | waiting_user/approval,禁止纯文降级 |
| `BUDGET_EXCEEDED` | waiting_approval/budget_exhausted |
| `GENERATION_FAILED` | 单槽失败;按 provider 错误决定是否允许一次重试 |
| `EVALUATION_FAILED` | 保留图片,标 warning,允许人工审核 |
| `QUALITY_REJECTED` | 生成 RepairSpec 或停止 |
| `INPUT_STALE` | 禁止采用,要求刷新计划 |
| `PARTIAL_SUCCESS` | 展示成功槽位和缺失槽位,不整批作废 |
普通批量生图入口可作为用户主动选择的回退,但 Agent 不会无提示切换过去。
## 27. 测试方案
### 27.1 单元测试
- PlatformKitRequest/Context/Plan/Spec/Report Schema
- 平台 ID 映射和规则版本;
- 参考图真实来源筛选与角色;
- 计划数量、必需槽位、卖点、文字政策;
- PromptCompiler 快照测试;
- ratio → provider size
- 模型能力过滤和禁止降级;
- issue_code → RepairSpec
- 整套重复度和槽位覆盖规则;
- 工具团队权限和幂等。
### 27.2 集成测试
- 参考图不足 → waiting_user,零图片费用;
- 4/8/12 槽位计划正确且不简单复制;
- Seedream/GPT-Image 不同 capability 路由;
- 多槽 fan-out 和部分失败;
- 质检通过直接 ready
- 单槽失败只补该槽;
- 补图达到上限停止;
- provider 失败退款;
- 浏览器断开后恢复;
- 重复 Celery 投递不重复生成/扣费;
- 采用事务和旧版本取消采用;
- Asset metadata/platform/slot 可追溯;
- legacy cover 模式不受新 Agent 影响。
### 27.3 评估数据集
至少准备覆盖:
- 不同颜色和包装文字商品;
- 透明、反光、纯白、纯黑商品;
- 服装、食品、家居、数码等品类;
- 商品图只有正面/多角度/低清晰度;
- 有 Logo、密集标签、易乱码包装;
- 十个平台规则;
- no_text/minimal/short_labels 三种文字政策;
- 常见失败:变色、变形、重复商品、裁切、错字、二维码、虚假价格。
### 27.4 验收指标
- 首轮整套通过率;
- 商品身份一致性通过率;
- OCR 错字/乱码率;
- 平台规则通过率;
- 单槽补图成功率;
- 平均每槽生成次数;
- 用户整套直接采用率;
- 用户替换单槽比例;
- 每套平均积分、耗时;
- 失败原因分布;
- 无真实图误生成率必须为 0。
## 28. 分阶段实施
### 阶段 A:复用公共 Agent 基础设施
- AgentRun/Step/Artifact、工具注册、预算、恢复、取消;
- 若脚本 Agent 已完成,平台套图直接复用,不重复建设。
### 阶段 B:领域解耦但保持旧行为
- 抽出 PlatformRuleProvider
- 抽出 PromptCompiler
- 拆出单图 spec enqueue
- 增加 platform/slot/ratio metadata
- 旧 cover API 继续使用默认 Plan 适配器,结果不变。
### 阶段 C:平台套图 Agent MVP
- PlatformKitVersion/Item
- 真实参考图硬门槛;
- 确定性套图 Plan
- 按槽位受控并行生成;
- 人工逐槽/整套采用;
- 暂不做模型视觉质检和自动补图。
### 阶段 D:视觉质检和定向补图
- OCR
- 视觉评估模型;
- 结构化 issue codes
- 最多一次定向补图;
- 整套一致性检查;
- 补图报价和人工确认。
### 阶段 E:智能规划和灰度优化
- 可选文本 KitPlanner
- 基于历史采用数据优化槽位策略;
- 多平台计划复用;
- 与项目导演/脚本 Handoff 协同;
- 仍不自动外部发布。
## 29. 一人串行开发工作量参考
以下基于现有生图、资产、计费和 Worker 可复用,使用编码工具辅助,且不包含自研 OCR/视觉模型训练:
| 工作 | 参考工期 |
| --- | ---: |
| 公共 Agent 基础设施 | 34 天 |
| 平台规则/PromptCompiler/单图 spec 解耦 | 23 天 |
| PlatformKitVersion/Item 与 API | 23 天 |
| 确定性 Planner、参考图门槛和能力路由 | 2–3 天 |
| 前端槽位计划、进度、候选和采用 | 3–4 天 |
| OCR/视觉评估与结构化报告 | 3–5 天 |
| 定向补图、预算、幂等与恢复 | 2–3 天 |
| 测试数据、集成测试和灰度修正 | 3–4 天 |
合计约 **2029 人天**。如果公共 Agent 基础设施已由脚本 Agent 建好,平台套图自身约 **1625 人天**。只做 MVP(确定性计划 + 按槽位生成 + 人工采用,不含视觉质检和自动补图)约 **1116 人天**,公共基础设施已存在时约 **812 人天**
## 30. 与脚本 Agent 的协同边界
平台套图 Agent 不直接读取脚本 Agent 聊天记录。未来视频项目需要平台宣发图时,只接收结构化 Handoff:
```json
{
"source": "script_handoff/v1",
"project_id": "...",
"script_version_id": "...",
"product_id": "...",
"must_show_selling_point_ids": ["..."],
"visual_direction": "真实通勤场景",
"forbidden_claims": ["..."],
"approved": true
}
```
平台套图 Agent 再基于平台规则和商品真实图形成自己的 `PlatformKitPlan`。两者通过版本化业务契约协同,不互相调用内部函数,这正是松耦合。
## 31. 最终落地形态
```text
用户选商品、平台、数量和目标
→ Platform Kit Agent 冻结商品和真实参考图
→ 检查素材是否足够
→ 形成版本化套图计划
→ 每槽选择参考图并编译生成 spec
→ 能力路由、报价、受控并行生成
→ OCR + 视觉 + 整套规则质检
→ 对失败槽位最多定向补图一次
→ 保存 PlatformKitVersion 和候选 Asset
→ 用户逐槽确认或整套采用
→ 输出可供导出/投放/项目导演读取的 Handoff
```
实现后,平台套图不再只是固定模板批量出图,而是一个能“规划—执行—观察—有限修复—交付”的受控视觉 Agent;同时所有付费生成、资产、计费和 Provider 仍沿用 AirShelf 现有基础设施,不形成第二套平行系统。