fix(inference): 超时根因双修——报错用repr(TimeoutError空str)+重试print进应用日志;chat_inference支持_timeout单次超时覆盖(上限900秒,长文档提取用)

This commit is contained in:
yumoqing 2026-09-05 10:24:44 +08:00
parent f965e4b4d6
commit f9b5b60c68

View File

@ -318,12 +318,16 @@ async def _call_upstream_chat(ctx, payload):
return data
except (asyncio.TimeoutError, aiohttp.ClientError) as e:
last = e
# TimeoutError 的 str() 是空串,用 repr 保证消息真实可行动
detail = repr(e) or type(e).__name__
# print 确保进应用日志(模块 logger 未接应用日志管道2026-09-04 实测)
print("[inference] 上游瞬时错误重试 %d/%d: %s (url=%s)" % (
attempt + 1, _MAX_ATTEMPTS, detail, url.split('?')[0]))
if attempt < _MAX_ATTEMPTS - 1:
logger.warning("inference: 瞬时错误重试 %d/%d: %s",
attempt + 1, _MAX_ATTEMPTS, e)
await asyncio.sleep(2 * (attempt + 1))
continue
raise ValueError('上游调用失败(重试 %d 次仍失败): %s' % (_MAX_ATTEMPTS, e))
raise ValueError('上游调用失败(重试 %d 次仍失败,%s: %s' % (
_MAX_ATTEMPTS, type(e).__name__, detail))
raise last if last else ValueError('上游调用失败')
@ -346,12 +350,16 @@ async def chat_inference(org_id, user_id, payload, model_name='', task_ref=''):
# 用途标记(辅助任务走辅助模型链):取出后从 payload 剥离,不透传给上游
purpose = (payload.pop('_purpose', '') or '')
# 单次调用超时覆盖(长文本提取等慢任务):剥离不透传,上限 900 秒
req_timeout = int(_fnum(payload.pop('_timeout', 0)) or 0)
est = max(_texts_len(payload.get('messages')) // EST_TOKENS_PER_CHAR, 200)
db, dbname = _get_db()
async with db.sqlorContext(dbname) as sor:
ctx = await _resolve_call(
sor, org_id, user_id or '', model_name, 't2t', est, task_ref, purpose)
if req_timeout > 0:
ctx['timeout'] = min(req_timeout, 900)
try:
data = await _call_upstream_chat(ctx, payload)
except Exception as e: