From 19b05d5d29f398128fa88c5af3004c9a9525aa74 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Wed, 1 Apr 2026 18:54:10 +0800 Subject: [PATCH] bugfix --- llmage/asyncinference.py | 99 ++++++++++++++++++++++++++++++++++++++++ llmage/init.py | 2 + wwwroot/tasks/index.dspy | 2 +- 3 files changed, 102 insertions(+), 1 deletion(-) diff --git a/llmage/asyncinference.py b/llmage/asyncinference.py index f32894e..45e6778 100644 --- a/llmage/asyncinference.py +++ b/llmage/asyncinference.py @@ -16,6 +16,101 @@ from ahserver.filestorage import FileStorage from .accounting import llm_accounting, llm_charging from .utils import * +async def grab_task_status(request, taskid): + env = ServerEnv() + llm = llmusage = None + async with get_sor_context(env, 'llmage') as sor: + recs = await sor.R('llmusage', {'taskid': taskid}) + if len(recs) == 0: + exception(f'{taskid=} not found in llmusage') + return None + r = recs[0] + if r.status == 'SUCCEEDED': + io = json.loads(r.ioinfo) + return io['output'][-1] + llmusage = r + recs = await sor.R('llm', {'id': r.llmid}) + if len(recs) == 0: + exception(f'id={r.llmid} not found in llm') + return None + llm = recs[0] + + async with get_sor_context(env, 'llmage') as sor: + uapi = UAPI(request, sor) + apinames = llm.apiname.split(',') + apiname = apinames[0] + userid = await get_owner_userid(sor, llm) + changed = None + ns = {'taskid': taskid} + d = None + try: + b = await uapi.call(llm.upappid, apiname, userid, params=ns) + if isinstance(b, bytes): + b = b.decode('utf-8') + d = json.loads(b) + changed = DictObject(**{ + 'status': d['status'], + 'output': d + }) + if changed.status == 'SUCCEEDED' and len(apinames) > 1: + while True: + if changed.output.video: + break; + x = await uapi.call(llm.upappid, apiname[1], userid, params=d) + g = json.load(x) + if g.get('video'): + changed.output.video = g.get('video') + break + await asyncio.sleep(0.2) + + except Exception as e: + exception(f'{e}, {b=}') + changed = { + 'status': 'FAILED', + 'output': {'status': 'FAILED', 'error': str(e)} + } + await add_new_llmusage_output(llmusage.id, changed) + return + if changed.status == 'SUCCEEDED': + llmusage.usage = changed.output.usage + if llm.ppid: + try: + charging = await llm_charging(sor, + llm.ppid, llmusage) + if charging: + changed.amount = charging.amount + changed.cost = charging.cost + debug(f'{changed=},{charging=}') + else: + changed.amount = cost = 0.0 + except Exception as e: + e1 = Exception(f'{llm.ppid} charging error{e}, {llm.ppid}, {llmusage=}') + exception(f'{e}') + changed.amount = changed.cost = 0 + else: + changed.amount = 0 + changed.cost = 0 + llmusage.amount = changed.amount + llmusage.cost = changed.cost + if len(apinames) > 1: + while True: + x = await uapi.call(llm.upappid, apiname[1], userid, params=d) + g = json.load(x) + if g.get('video'): + changed + await add_new_llmusage_output(llmusage.id, changed) + if changed.status == 'FAILED': + return changed.output + if changed.status == 'SUCCEEDED': + if llmusage.accounting_status != 'accounted' \ + and changed.amount > 0.00001: + try: + await llm_accounting(request, llmusage) + except Exception as e: + debug(f'{changed=} accounting failed,{e=} ') + return changed.output + return changed.output + async def get_today_asynctask_list(userid): env = ServerEnv() async with get_sor_context(env, 'llmage') as sor: @@ -139,6 +234,10 @@ async def add_new_llmusage_output(luid, newd): await sor.U('llmusage', r) debug(f'llmuasage update to {r}') return + else: + exception(f'add_new_llmusage_output({luid}, {newd}) llmusage not found') + return + exception(f'add_new_llmusage_output({luid}, {newd}) Error') def get_llmusage_last_output(r): diff --git a/llmage/init.py b/llmage/init.py index d14e0b3..bf00de1 100644 --- a/llmage/init.py +++ b/llmage/init.py @@ -26,6 +26,7 @@ from .accounting import ( from .asyncinference import ( get_asynctask_status, + grab_task_status, query_task_status, get_today_asynctask_list ) @@ -39,6 +40,7 @@ def load_llmage(): env.get_asynctask_status = get_asynctask_status env.query_task_status = query_task_status env.get_llm = get_llm + env.grab_task_status = grab_task_status env.b64media2url = b64media2url env.hex2base64 = hex2base64 env.inference = inference diff --git a/wwwroot/tasks/index.dspy b/wwwroot/tasks/index.dspy index 1417c0b..89d4910 100644 --- a/wwwroot/tasks/index.dspy +++ b/wwwroot/tasks/index.dspy @@ -3,7 +3,7 @@ userid = await get_user() if userid is None: return openai_403 -s = await get_asynctask_status(taskid) +s = await grab_task_status(taskid) return { 'status': 'ok', 'data': {