fix: move refund to uapi_request except, remove gen() try/except that re-raised causing 500

gen() try/except re-raised internal errors from uapi_request → 500 response.
Moved refund_balance to uapi_request's except block where errors are properly
handled (yield error, normal generator exit).
This commit is contained in:
yumoqing 2026-07-31 16:39:43 +08:00
parent 9da343b2e1
commit 670325e8eb
2 changed files with 17 additions and 17 deletions

View File

@ -93,6 +93,15 @@ async def uapi_request(request, llm, callerid, callerorgid, params_kw=None):
llmusage.accounting_status = 'created' llmusage.accounting_status = 'created'
await write_llmusage(llmusage) await write_llmusage(llmusage)
except Exception as e: except Exception as e:
# Refund balance reservation on failure
try:
from .balance import refund_balance
from ahserver.serverenv import ServerEnv
reserve_luid = params_kw.get('_luid') if params_kw else None
if reserve_luid:
await refund_balance(ServerEnv(), reserve_luid)
except:
pass
exception(f'{e=},{format_exc()}') exception(f'{e=},{format_exc()}')
estr = erase_apikey(e) estr = erase_apikey(e)
ed = {"error": f"ERROR:{estr}", "status": "FAILED" ,"llmusageid": luid} ed = {"error": f"ERROR:{estr}", "status": "FAILED" ,"llmusageid": luid}

View File

@ -1,19 +1,13 @@
async def gen(): async def gen():
env = request._run_ns.copy() env = request._run_ns.copy()
f = partial(inference_generator, request, params_kw=params_kw) f = partial(inference_generator, request, params_kw=params_kw)
try: if params_kw.stream:
if params_kw.stream: async for l in f():
async for l in f(): yield f'data: {l}\\n'
yield f'data: {l}\n' yield 'data: [DONE]\\n\\n'
yield 'data: [DONE]\n\n' else:
else: async for l in f():
async for l in f(): yield l
yield l
except Exception as e:
luid = params_kw.get('_luid')
if luid:
await env.refund_balance(luid)
raise
debug_params('params_kw', params_kw) debug_params('params_kw', params_kw)
catelogid = params_kw.catelogid or 't2t' catelogid = params_kw.catelogid or 't2t'
@ -43,8 +37,7 @@ params_kw.llmid = llmid
params_kw.llmcatelogid = catelogid params_kw.llmcatelogid = catelogid
debug(f'{params_kw.llmid=}') debug(f'{params_kw.llmid=}')
import uuid luid = getID()
luid = str(uuid.uuid4())
reserved = await env.reserve_balance(params_kw.llmid, userorgid, luid) reserved = await env.reserve_balance(params_kw.llmid, userorgid, luid)
if not reserved.get('ok'): if not reserved.get('ok'):
debug(f'{userid=} balance not enough: {reserved}') debug(f'{userid=} balance not enough: {reserved}')
@ -55,6 +48,4 @@ f = await checkCustomerBalance(params_kw.llmid, userid, userorgid)
if not f and reserved.get('no_redis'): if not f and reserved.get('no_redis'):
debug(f'{userid=} balance not enough (DB fallback)') debug(f'{userid=} balance not enough (DB fallback)')
return openai_429() return openai_429()
# debug(f'{tools=}, {request._run_ns.tools=}')
return await env.stream_response(request, gen, content_type='application/json') return await env.stream_response(request, gen, content_type='application/json')