fix(media): AGNES 图像/视频生成加韧性层——指数退避重试+友好错误翻译+Bot解析加固

根因(实测复现): AGNES 外部服务不稳定, 非平台代码问题:
- 视频创建常返 500 publish_video_queue_failed / context deadline exceeded
- 连接偶发重置 Server disconnected
- 视频硬限频 每分钟 1 次 (429 rate limit)

改动:
1. chat.py 新增 _agnes_post_json(): 对 5xx/连接中断做 3 次指数退避重试(2/4s);
   4xx(参数错误)不重试直接返回
2. 新增 _friendly_media_err(): 把 AGNES 原始 HTTP/JSON 错误
   转译为对用户友好的中文(限频/连接失败/队列繁忙), 不再透传原始报错
3. _generate_media 图像/视频分支改用上述重试+友好错误
4. im_llm.py Bot 媒体结果解析加固: strip 后判 <img>/<video>,
   成功返回干净链接; 失败透传友好中文, 绝不把原始提示词/标签甩给用户

验证(容器内实测):
- WEB_IMG OK / WEB_VID OK / BOT_IMG OK (均返回真实 png/mp4)
- 429/断开/队列三类错误均正确转译为友好中文
This commit is contained in:
deploy committed 2026-07-15 19:58:06 +08:00
1 parent b88f883d44
commit ccc5f799e1
2 files changed
+109 -51

No files matched your search

+10 -4
View File
@@ -78,11 +78,17 @@ def _call_real_llm(db: Session, user=None, prompt: str = "", platform: str = "im
result = f"(媒体生成失败:{e})"
if result:
# IM 不渲染 HTML,把 <img>/<video> 还原为纯文本链接返回
if result.startswith("<img") or result.startswith("<video"):
m = _re.search(r'src="([^"]+)"', result)
s = result.strip()
if s.startswith("<img") or s.startswith("<video"):
m = _re.search(r'src="([^"]+)"', s)
url = m.group(1) if m else ""
label = "图片" if result.startswith("<img") else "视频"
return f"已为你生成{label}:{url}" if url else result
label = "图片" if s.startswith("<img") else "视频"
return f"已为你生成{label}:{url}" if url else "(生成完成,但未能提取媒体地址)"
# 媒体生成失败:_generate_media 已返回友好中文(如限频/队列繁忙),
# 直接透传,绝不把原始提示词/标签/JSON 透传给用户
if s.startswith("⚠️") or s.startswith("(媒体"):
return s
return "(媒体生成未能返回有效内容,请重试)"
return result
# ===== 2) 文本回复 + 技能自动发现(Issue 8)=====