diff --git a/llmage/accounting.py b/llmage/accounting.py index c636c58..46d65c2 100644 --- a/llmage/accounting.py +++ b/llmage/accounting.py @@ -169,13 +169,8 @@ where a.llmid = b.id # debug(f'{sql=}, {ns=}, {len(recs)=}') for r in recs: if r.usages is None: - io = json.loads(r.ioinfo) - if len(io['output']) == 0: - llmusage.accounting_status = 'failed' - await sor.U('llmusage', {'id': llmusage.id, 'accounting_status': 'failed'}) - debug(f'{len(io["output"])} is 0') - continue - r.usages = json.dumps(io['output'][-1].get('usage')) + output = await get_lastoutput(r.ioinfo) + r.usages = output.get('usage') if r.usages is None: llmusage.accounting_status = 'failed' await sor.U('llmusage', {'id': llmusage.id, 'accounting_status': 'failed'}) diff --git a/llmage/asyncinference.py b/llmage/asyncinference.py index 161e330..aa7130a 100644 --- a/llmage/asyncinference.py +++ b/llmage/asyncinference.py @@ -35,11 +35,8 @@ async def get_asynctask_status(taskid): recs = await sor.R('llmusage', {'taskid': taskid}) if recs: r = recs[0] - io = json.loads(r.ioinfo) - d = io.get('output', {}) - if isinstance(d, list): - return d[-1] - return d + output = await get_lastoutput(r.ioinfo) + return output return { 'taskid': taskid, 'status': 'FAILED', @@ -129,14 +126,6 @@ async def modify_llmusage_status(llmusage): 'status': llmusage.status }) -def get_llmusage_last_output(r): - io = json.loads(r.ioinfo) - outs = io.get('output', []) - if len(outs) == 0: - return None - d = DictObject(**outs[-1]) - return d - async def get_llm_llmusage(luid): env = request._run_ns async with get_sor_context(env, 'llmage') as sor: @@ -165,7 +154,7 @@ async def query_task_status(request, upappid, apiname, luid, userid, taskid): for apiname in apinames: while True - lastoutout = get_llmusage_last_output(llmusage) + lastoutout = await get_lastoutput(llmusage.ioinfo) if lastoutout['status'] in ['FAILED', 'SUCCEEDED'] return ns = {'taskid': taskid} diff --git a/llmage/llmclient.py b/llmage/llmclient.py index 92abe37..ea67a86 100644 --- a/llmage/llmclient.py +++ b/llmage/llmclient.py @@ -84,10 +84,13 @@ async def uapi_request(request, llm, callerid, callerorgid, params_kw=None): llmusage.use_time = timestampstr() llmusage.userid = callerid llmusage.usages = json.dumps(usage, ensure_ascii=False) - llmusage.ioinfo = json.dumps({ - "input": params_kw, - "output": outlines - }, ensure_ascii=False) + ioinfo = json.dumps({ + "input": params_kw, + 'output': [d] + }, ensure_ascii=False) + webpath = await write_llmio(llmusage.id, ioinfo) + llmusage.ioinfo = webpath + debug(f'webpath={webpath}:') llmusage.transno = params_kw.transno llmusage.responsed_seconds = responsed_seconds llmusage.finish_seconds = finish_seconds diff --git a/llmage/syncinference.py b/llmage/syncinference.py index 280c42d..d7ab3ae 100644 --- a/llmage/syncinference.py +++ b/llmage/syncinference.py @@ -50,10 +50,12 @@ async def sync_uapi_request(request, llm, callerid, callerorgid, params_kw=None) llmusage.use_time = timestampstr() llmusage.userid = callerid llmusage.usages = json.dumps(usage, ensure_ascii=False) - llmusage.ioinfo = json.dumps({ - "input": params_kw, - "output": [d] - }, ensure_ascii=False) + ioinfo = json.dumps({ + "input": params_kw, + 'output': [d] + }, ensure_ascii=False) + webpath = await write_llmio(llmusage.id, ioinfo) + llmusage.ioinfo = webpath llmusage.transno = params_kw.transno llmusage.responsed_seconds = responsed_seconds llmusage.finish_seconds = finish_seconds diff --git a/llmage/utils.py b/llmage/utils.py index 776c5af..e8d0fce 100644 --- a/llmage/utils.py +++ b/llmage/utils.py @@ -25,6 +25,11 @@ async def append_new_llmoutput(webpath, output): iostr = json.dumps(io, ensure_ascii=False, indent=4) f.write(iostr.encode('utf-8')) +async def get_usage_from_lastoutput(webpath): + bin = await read_webpath(webpath) + io = json.load(bin.decode('utf-8')) + return io['output'][-1] + async def read_webpath(webpath): fs = FileStorage() p = fs.realPath(webpath)