# 平台套图 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 JSON;PlanValidator 必须检查并修正硬规则。 即使启用文本 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,新版本 adopted,Item 的 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 基础设施 | 3–4 天 | | 平台规则/PromptCompiler/单图 spec 解耦 | 2–3 天 | | PlatformKitVersion/Item 与 API | 2–3 天 | | 确定性 Planner、参考图门槛和能力路由 | 2–3 天 | | 前端槽位计划、进度、候选和采用 | 3–4 天 | | OCR/视觉评估与结构化报告 | 3–5 天 | | 定向补图、预算、幂等与恢复 | 2–3 天 | | 测试数据、集成测试和灰度修正 | 3–4 天 | 合计约 **20–29 人天**。如果公共 Agent 基础设施已由脚本 Agent 建好,平台套图自身约 **16–25 人天**。只做 MVP(确定性计划 + 按槽位生成 + 人工采用,不含视觉质检和自动补图)约 **11–16 人天**,公共基础设施已存在时约 **8–12 人天**。 ## 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 现有基础设施,不形成第二套平行系统。