diff --git a/backend/python/app/api/chat.py b/backend/python/app/api/chat.py index cf29f07..a962cb8 100644 --- a/backend/python/app/api/chat.py +++ b/backend/python/app/api/chat.py @@ -125,13 +125,30 @@ def _html_escape(s: str) -> str: def _outbound_proxy() -> str: - """出网代理地址。容器内直连 apihub.agnes-ai.com 会被对端重置 - (httpx RemoteProtocolError: Server disconnected without sending a response), - 必须经 172.18.0.1:7890 智能路由代理(其对国内 AGNES 域名走直连)。""" + """出网代理地址(兜底)。默认经 172.18.0.1:7890 智能路由代理; + 运行时若未注入代理环境变量则回退到该地址。""" import os return os.environ.get("HTTPS_PROXY") or os.environ.get("HTTP_PROXY") or "http://172.18.0.1:7890" +def _proxy_for_url(url: str) -> str | None: + """按目标域名选择是否走代理。 + + 实测(2026-07-15):apihub.agnes-ai.com / platform-outputs.agnes-ai.space 为国内域名, + 容器内直连稳定返回 200;而经智能路由代理 172.18.0.1:7890 当前返回 502,导致 + httpx 报 "Server disconnected without sending a response"。 + 因此对 AGNES 等国内域名返回 None(直连),其余域名才走 _outbound_proxy()。 + + 注意:httpx 默认 trust_env=True 会忽略 proxy=None 而改用环境变量 HTTP_PROXY, + 故调用方必须同时传 trust_env=False 才能真正直连。 + """ + from urllib.parse import urlparse + host = (urlparse(url).hostname or "").lower() + if "agnes-ai.com" in host or "agnes-ai.space" in host: + return None + return _outbound_proxy() + + async def _generate_media(db, ai_model, prompt: str, user_id: str = None) -> str: """图像/视频生成模型统一入口:按 capabilities 调用 AGNES 等媒体生成 API。 返回可直接在 AI 聊天中渲染的富文本(含 /