fix(inference): 超时根因双修——报错用repr(TimeoutError空str)+重试print进应用日志;chat_inference支持_timeout单次超时覆盖(上限900秒,长文档提取用)
This commit is contained in:
parent
f965e4b4d6
commit
f9b5b60c68
@ -318,12 +318,16 @@ async def _call_upstream_chat(ctx, payload):
|
|||||||
return data
|
return data
|
||||||
except (asyncio.TimeoutError, aiohttp.ClientError) as e:
|
except (asyncio.TimeoutError, aiohttp.ClientError) as e:
|
||||||
last = 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:
|
if attempt < _MAX_ATTEMPTS - 1:
|
||||||
logger.warning("inference: 瞬时错误重试 %d/%d: %s",
|
|
||||||
attempt + 1, _MAX_ATTEMPTS, e)
|
|
||||||
await asyncio.sleep(2 * (attempt + 1))
|
await asyncio.sleep(2 * (attempt + 1))
|
||||||
continue
|
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('上游调用失败')
|
raise last if last else ValueError('上游调用失败')
|
||||||
|
|
||||||
|
|
||||||
@ -346,12 +350,16 @@ async def chat_inference(org_id, user_id, payload, model_name='', task_ref=''):
|
|||||||
|
|
||||||
# 用途标记(辅助任务走辅助模型链):取出后从 payload 剥离,不透传给上游
|
# 用途标记(辅助任务走辅助模型链):取出后从 payload 剥离,不透传给上游
|
||||||
purpose = (payload.pop('_purpose', '') or '')
|
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)
|
est = max(_texts_len(payload.get('messages')) // EST_TOKENS_PER_CHAR, 200)
|
||||||
db, dbname = _get_db()
|
db, dbname = _get_db()
|
||||||
async with db.sqlorContext(dbname) as sor:
|
async with db.sqlorContext(dbname) as sor:
|
||||||
ctx = await _resolve_call(
|
ctx = await _resolve_call(
|
||||||
sor, org_id, user_id or '', model_name, 't2t', est, task_ref, purpose)
|
sor, org_id, user_id or '', model_name, 't2t', est, task_ref, purpose)
|
||||||
|
if req_timeout > 0:
|
||||||
|
ctx['timeout'] = min(req_timeout, 900)
|
||||||
try:
|
try:
|
||||||
data = await _call_upstream_chat(ctx, payload)
|
data = await _call_upstream_chat(ctx, payload)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user