From 313f32dd7b20bdc00b787ffee298df792af21bd4 Mon Sep 17 00:00:00 2001 From: ymq Date: Tue, 15 Sep 2026 09:03:13 +0800 Subject: [PATCH] =?UTF-8?q?fix(llm=5Fbridge):=20native=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E9=80=8F=E4=BC=A0=5Ftimeout=E7=AB=AF=E7=82=B9=E9=A2=84?= =?UTF-8?q?=E7=AE=97=E2=80=94=E2=80=94pbls=20design=E4=B8=89=E8=BF=9E?= =?UTF-8?q?=E8=B6=85=E6=97=B6=E6=A0=B9=E5=9B=A0:llm=5Fcall=5Fmsgs=5Fnative?= =?UTF-8?q?=E5=8F=AA=E6=8A=8Atimeout=E7=94=A8=E4=BD=9C=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AF=E7=AD=89=E5=BE=85,payload=E6=97=A0=5Ftimeout=E2=86=92?= =?UTF-8?q?=E7=AB=AF=E7=82=B9=E6=8C=89=E4=BE=9B=E5=BA=94=E5=95=86=E7=AB=AF?= =?UTF-8?q?=E7=82=B9=E9=85=8D=E7=BD=AE(=E7=99=BE=E7=82=BC120s)=E6=8E=90?= =?UTF-8?q?=E4=B8=8A=E6=B8=B8,design=E6=94=B6=E5=B0=BE=E5=A4=A7=E8=AF=B7?= =?UTF-8?q?=E6=B1=82(17tools/60~125KB)=E5=A4=A9=E7=84=B672~115s,=E4=B8=80?= =?UTF-8?q?=E5=8D=8A=E6=A6=82=E7=8E=87120s=E8=A2=AB=E6=9D=80=E2=86=92?= =?UTF-8?q?=E5=86=85=E9=83=A83=E9=87=8D=E8=AF=95=E5=85=A8=E7=81=AD?= =?UTF-8?q?=E2=86=92=E4=BB=BB=E5=8A=A1failed=E6=9A=82=E5=81=9C=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE;native=E8=A1=A5=5Ftimeout=3D=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AF-60s=E4=BD=99=E9=87=8F(=E7=AB=AF=E7=82=B9=E5=85=88?= =?UTF-8?q?=E6=8E=90=E8=BF=94=E7=BB=93=E6=9E=84=E5=8C=96=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E5=8F=AF=E5=88=86=E7=B1=BB=E9=87=8D=E8=AF=95),llm=5Fcall=5Fmsg?= =?UTF-8?q?s=E5=AE=A2=E6=88=B7=E7=AB=AF=E7=AD=89=E5=BE=85=E6=94=B9timeout+?= =?UTF-8?q?60=E5=AF=B9=E9=BD=90llm=5Finfer=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pipeline_service/llm_bridge.py | 11 +++++++++++ 1 file changed, 11 insertions(+) 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 '',