llmage/wwwroot/api/llm_launch_check_api.dspy

84 lines
3.1 KiB
Plaintext

llmid = params_kw.get('llmid', '')
action = params_kw.get('action', 'check')
if not llmid:
return json.dumps({'widgettype':'Error','options':{'text':'missing llmid'}}, ensure_ascii=False)
if action == 'inference':
# 验证推理配置是否完整
async with get_sor_context(request._run_ns, 'llmage') as sor:
recs = await sor.sqlExe(
"select * from llm where id=${llmid}$", {'llmid': llmid})
if not recs:
return json.dumps({'widgettype':'Error','options':{'text':'模型记录不存在'}}, ensure_ascii=False)
llm = recs[0]
# 检查 API 映射
maps = await sor.sqlExe(
"select * from llm_api_map where llmid=${llmid}$",
{'llmid': llmid})
if not maps:
return json.dumps({'widgettype':'Error','options':{'text':'无 API 映射配置'}}, ensure_ascii=False)
# 检查 upapp 和 uapi
uapi_recs = await sor.sqlExe("""
select a.*, e.ioid, e.stream, e.name as api_name
from llm a
join llm_api_map m on a.id = m.llmid
join upapp c on a.upappid = c.id
join uapi e on c.id = e.upappid and m.apiname = e.name
where a.id=${llmid}$""", {'llmid': llmid})
if not uapi_recs:
return json.dumps({'widgettype':'Error','options':{'text':'uapi 配置不完整,无法调用'}}, ensure_ascii=False)
uapi = uapi_recs[0]
# 检查 ioid
io_recs = await sor.sqlExe(
"select * from uapiio where id=${ioid}$", {'ioid': uapi.ioid})
if not io_recs:
return json.dumps({'widgettype':'Error','options':{'text':'IO 定义不存在'}}, ensure_ascii=False)
return json.dumps({'widgettype':'Message','options':{'text':f'推理配置验证通过\n模型: {llm.name}\nAPI: {uapi.api_name}\nIO: {uapi.ioid}\nStream: {uapi.stream}'}}, ensure_ascii=False)
elif action == 'check_charging':
# 验证计费配置是否完整
usages_str = params_kw.get('usages', '{}')
try:
usages = json.loads(usages_str) if isinstance(usages_str, str) else usages_str
except:
usages = {}
async with get_sor_context(request._run_ns, 'llmage') as sor:
maps = await sor.sqlExe(
"select * from llm_api_map where llmid=${llmid}$",
{'llmid': llmid})
if not maps:
return json.dumps({'widgettype':'Error','options':{'text':'无 API 映射'}}, ensure_ascii=False)
ppids = [m.ppid for m in maps if m.ppid]
if not ppids:
return json.dumps({'widgettype':'Error','options':{'text':'无定价项目(ppid)'}}, ensure_ascii=False)
# 实际调用定价计算
try:
prices = await llm_query_price(llmid, usages)
if not prices:
return json.dumps({'widgettype':'Error','options':{'text':'定价计算返回空'}}, ensure_ascii=False)
lines = []
total = 0
for p in prices:
amount = getattr(p, 'amount', 0) or 0
name = getattr(p, 'timing_name', '') or ''
total += amount
lines.append(f'{name}: {amount}')
lines.append(f'合计: {total}')
return json.dumps({'widgettype':'Message','options':{'text':f'计费测试通过\n' + chr(10).join(lines)}}, ensure_ascii=False)
except Exception as e:
return json.dumps({'widgettype':'Error','options':{'text':f'计费测试失败: {e}'}}, ensure_ascii=False)
return json.dumps({'widgettype':'Error','options':{'text':'无效的操作'}}, ensure_ascii=False)