This commit is contained in:
yumoqing 2026-04-01 18:54:10 +08:00
parent cf5c7cec4c
commit 19b05d5d29
3 changed files with 102 additions and 1 deletions

View File

@ -16,6 +16,101 @@ from ahserver.filestorage import FileStorage
from .accounting import llm_accounting, llm_charging from .accounting import llm_accounting, llm_charging
from .utils import * 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): async def get_today_asynctask_list(userid):
env = ServerEnv() env = ServerEnv()
async with get_sor_context(env, 'llmage') as sor: 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) await sor.U('llmusage', r)
debug(f'llmuasage update to {r}') debug(f'llmuasage update to {r}')
return return
else:
exception(f'add_new_llmusage_output({luid}, {newd}) llmusage not found')
return
exception(f'add_new_llmusage_output({luid}, {newd}) Error') exception(f'add_new_llmusage_output({luid}, {newd}) Error')
def get_llmusage_last_output(r): def get_llmusage_last_output(r):

View File

@ -26,6 +26,7 @@ from .accounting import (
from .asyncinference import ( from .asyncinference import (
get_asynctask_status, get_asynctask_status,
grab_task_status,
query_task_status, query_task_status,
get_today_asynctask_list get_today_asynctask_list
) )
@ -39,6 +40,7 @@ def load_llmage():
env.get_asynctask_status = get_asynctask_status env.get_asynctask_status = get_asynctask_status
env.query_task_status = query_task_status env.query_task_status = query_task_status
env.get_llm = get_llm env.get_llm = get_llm
env.grab_task_status = grab_task_status
env.b64media2url = b64media2url env.b64media2url = b64media2url
env.hex2base64 = hex2base64 env.hex2base64 = hex2base64
env.inference = inference env.inference = inference

View File

@ -3,7 +3,7 @@ userid = await get_user()
if userid is None: if userid is None:
return openai_403 return openai_403
s = await get_asynctask_status(taskid) s = await grab_task_status(taskid)
return { return {
'status': 'ok', 'status': 'ok',
'data': { 'data': {