fix: add finally block to write_llmusage — recover from GeneratorExit on client disconnect

When client disconnects mid-stream, Python GC kills the generator with
GeneratorExit (BaseException subclass), which is NOT caught by except Exception.
write_llmusage at line 93 was never reached, causing ~16% usage records lost.
finally block ensures llmusage is written even on GeneratorExit.
This commit is contained in:
yumoqing 2026-07-30 10:49:06 +08:00
parent 06e14af6ab
commit 21bf30d2a6

View File

@ -27,6 +27,7 @@ async def uapi_request(request, llm, callerid, callerorgid, params_kw=None):
outlines = []
txt = ''
luid = getID()
llmusage = None
try:
start_timestamp = time.time()
responsed_seconds = None
@ -96,10 +97,18 @@ async def uapi_request(request, llm, callerid, callerorgid, params_kw=None):
estr = erase_apikey(e)
ed = {"error": f"ERROR:{estr}", "status": "FAILED" ,"llmusageid": luid}
s = json.dumps(ed, ensure_ascii=False)
s = ''.join(s.split('\n'))
s = ''.join(s.split('\\n'))
outlines.append(ed)
yield f'{s}\n'
yield f'{s}\\n'
return
finally:
# GeneratorExit / client disconnect — flush partial usage
if llmusage and llmusage.get('id') == luid:
try:
llmusage.status = llmusage.status or 'UNKNOWN'
await write_llmusage(llmusage)
except:
pass
async def inference_generator(request, *args, params_kw=None, **kw):
env = request._run_ns.copy()