diff --git a/pipeline_service/llm_bridge.py b/pipeline_service/llm_bridge.py index 7f6695c..527e0e1 100644 --- a/pipeline_service/llm_bridge.py +++ b/pipeline_service/llm_bridge.py @@ -197,7 +197,10 @@ async def llm_call_msgs(messages: list, model: str = None, temperature: float = payload["_timeout"] = int(timeout) if session_id: payload["_session_id"] = session_id + # 客户端等待须覆盖端点侧预算 + 余量(同 llm_infer 模式),否则客户端先断连、 + # 报模糊 TimeoutError 而非端点的结构化错误 data = await _http_chat(payload, org_id or '0', user_id or '', model or '', + timeout=(int(timeout) + 60 if timeout else 0), project_id=project_id or '') try: return data["choices"][0]["message"]["content"] @@ -225,6 +228,14 @@ async def llm_call_msgs_native(messages: list, tools: list = None, model: str = payload["tool_choice"] = "auto" if purpose: payload["_purpose"] = purpose + if timeout: + # 端点侧上游预算必须随调用方透传(2026-09-15 pbls design 三连超时根因): + # 原来 native 只把 timeout 用作客户端等待,payload 不带 _timeout → 端点按 + # 供应商端点配置(百炼 timeout=120)掐断上游,而 design 收尾大请求天然 + # 72~115s,一半概率 120s 被杀 → 内部 3 重试全灭 → 任务 failed。 + # 端点预算 = 客户端等待 - 60s 余量:让端点先掐并返回结构化错误(可分类 + # 重试),而不是客户端 aiohttp 断连报模糊 TimeoutError。 + payload["_timeout"] = max(int(timeout) - 60, 60) if session_id: payload["_session_id"] = session_id data = await _http_chat(payload, org_id or '0', user_id or '', model or '',