# 角色主形象 IP 审核失败兜底修复(2026-04-25) ## 1. 问题 自动生成草稿素材时,角色「艾瑞克」主形象连续 3 次失败,供应商返回: ```json { "code": "IPInfringementSuspect", "message": "Input data is suspected of being involved in IP infringement." } ``` 这类失败不是网络抖动。原样重试会把同一份包含角色姓名、长设定和可能触发审核的专名继续提交给 DashScope,容易稳定失败。 ## 2. 参考日志与文档 - 用户提供的失败日志:`request_id=a18fb05d-d3be-9b9c-8d37-e0427397789e`,`task_id=cb768c95-13b7-4790-9f18-35a8a8761b31`,`task_status=FAILED`,`code=IPInfringementSuspect`。该日志确认失败源于供应商 IP/内容审核,而不是 OSS、SpacetimeDB 或下载链路。 - `docs/audits/CHARACTER_ASSET_PROMPT_CHAIN_AUDIT_2026-04-20.md`:确认角色主形象正式模型 prompt 层由后端 prompt builder 编译,不能只改前端默认描述文本。 - `docs/technical/CUSTOM_WORLD_ASSET_PROMPT_DEFAULTS_2026-04-24.md`:确认当前主链已迁到 `server-rs/crates/api-server/src/custom_world_asset_prompts.rs` 与 `server-rs/crates/api-server/src/custom_world_ai.rs`,不再修改旧 `server-node`。 - `docs/technical/ASSET_EXTERNAL_GENERATION_MANUAL_VERIFICATION_RUNBOOK_2026-04-23.md`:确认角色主形象真实生成入口走 Rust `api-server`、DashScope、OSS 与资产绑定链路。 - `server-rs/crates/api-server/src/character_animation_assets.rs` 现有日志/代码经验:动作生成已经有审核失败时的安全兜底 prompt 策略,本次沿用到角色主形象。 ## 3. 修复方案 1. 在角色主图 prompt 层新增安全兜底 prompt: - 不携带角色姓名、作品名、长设定原文。 - 保留职业原型,如原创近战剑士、原创法术职业冒险者。 - 明确要求不参考现有动漫、游戏、影视、小说角色,不使用可识别 IP 元素。 2. 在 DashScope 角色主形象请求层识别审核类错误: - `IPInfringementSuspect` - `inappropriate` - `sensitive` - `risk` - 中文内容审核、疑似侵权、知识产权等关键词。 3. 首次提交遇到上述错误时,后端自动用安全兜底 prompt 再提交一次。 4. 非审核类错误仍按原错误返回,不隐藏模型、网络、OSS、超时等真实问题。 5. 错误映射保留 `raw` 字段,便于后续从日志直接看到供应商原始 `code/message/task_id`。 ## 4. 落地文件 - `server-rs/crates/api-server/src/prompt/character_visual.rs` - 新增 `build_fallback_moderation_safe_character_visual_prompt`。 - `server-rs/crates/api-server/src/custom_world_asset_prompts.rs` - 导出角色主图审核兜底 prompt builder。 - `server-rs/crates/api-server/src/character_visual_assets.rs` - 角色主形象 DashScope 请求增加审核兜底提交。 - `RequestModel` 阶段结构化日志增加 `moderationFallbackApplied`。 - DashScope 上游错误保留 `raw`。 ## 5. 验收口径 - 用户不需要手动改「艾瑞克」这个名字;后端遇到 `IPInfringementSuspect` 会自动切换到原创安全 prompt 再试一次。 - 若兜底 prompt 生成成功,后续 OSS 草稿、发布和资产绑定链路保持原样。 - 若兜底 prompt 仍失败,错误中仍能看到 DashScope 原始失败内容,方便继续定位具体触发项。