update
This commit is contained in:
parent
f57d27d1bd
commit
dac9cea1b5
@ -1,12 +1,15 @@
|
||||
# 可写入/更新的字段(不含 id、created_at、updated_at)
|
||||
# model_management 可写入字段(不含 id、created_at、updated_at)
|
||||
_MODEL_FIELDS = (
|
||||
'llmid', 'provider', 'model_name', 'display_name', 'model_type',
|
||||
'context_length', 'input_token_price', 'output_token_price',
|
||||
'cache_hit_input_price', 'billing_method', 'billing_unit',
|
||||
'capabilities', 'limitations', 'highlights', 'is_active',
|
||||
'description', 'listing_status',
|
||||
'description', 'listing_status', 'sort_order', 'experience',
|
||||
)
|
||||
|
||||
# model_api_doc 可写入字段(不含 id、model_id、created_at、updated_at)
|
||||
_API_DOC_FIELDS = ('api_url', 'curl_code', 'python_code')
|
||||
|
||||
|
||||
def _escape(value):
|
||||
if value is None:
|
||||
@ -24,26 +27,54 @@ def _build_model_dict(ns, include_listing_status=False):
|
||||
return data
|
||||
|
||||
|
||||
def _build_api_doc_dict(ns):
|
||||
data = {}
|
||||
for field in _API_DOC_FIELDS:
|
||||
if field in ns and ns.get(field) is not None:
|
||||
data[field] = ns.get(field)
|
||||
return data
|
||||
|
||||
|
||||
async def model_management_add(ns={}):
|
||||
"""新增模型,默认待上架 listing_status=0"""
|
||||
"""新增模型及 API 文档,provider、model_name 必传"""
|
||||
if not ns.get('provider') or not ns.get('model_name'):
|
||||
return {'status': False, 'msg': 'provider and model_name are required'}
|
||||
|
||||
ns_dic = _build_model_dict(ns, include_listing_status=True)
|
||||
if 'listing_status' not in ns_dic:
|
||||
ns_dic['listing_status'] = 0
|
||||
if 'is_active' not in ns_dic:
|
||||
ns_dic['is_active'] = 1
|
||||
model_dic = _build_model_dict(ns, include_listing_status=True)
|
||||
if 'listing_status' not in model_dic:
|
||||
model_dic['listing_status'] = 0
|
||||
if 'is_active' not in model_dic:
|
||||
model_dic['is_active'] = 1
|
||||
|
||||
api_doc_dic = _build_api_doc_dict(ns)
|
||||
if api_doc_dic and not api_doc_dic.get('api_url'):
|
||||
return {'status': False, 'msg': 'api_url is required when creating api doc'}
|
||||
|
||||
db = DBPools()
|
||||
async with db.sqlorContext('kboss') as sor:
|
||||
try:
|
||||
await sor.C('model_management', ns_dic)
|
||||
return {'status': True, 'msg': 'create model success', 'data': ns_dic}
|
||||
await sor.C('model_management', model_dic)
|
||||
|
||||
id_rows = await sor.sqlExe('SELECT LAST_INSERT_ID() AS id;', {})
|
||||
model_id = id_rows[0]['id'] if id_rows else None
|
||||
if not model_id:
|
||||
await sor.rollback()
|
||||
return {'status': False, 'msg': 'create model failed, missing model id'}
|
||||
|
||||
result_data = dict(model_dic)
|
||||
result_data['id'] = model_id
|
||||
|
||||
if api_doc_dic:
|
||||
create_dic = dict(api_doc_dic)
|
||||
create_dic['model_id'] = str(model_id)
|
||||
await sor.C('model_api_doc', create_dic)
|
||||
result_data['api_doc'] = create_dic
|
||||
|
||||
return {'status': True, 'msg': 'create model success', 'data': result_data}
|
||||
except Exception as e:
|
||||
await sor.rollback()
|
||||
return {'status': False, 'msg': 'create model failed, %s' % str(e)}
|
||||
|
||||
|
||||
|
||||
ret = await model_management_add(params_kw)
|
||||
return ret
|
||||
return ret
|
||||
|
||||
@ -1,12 +1,15 @@
|
||||
# 可写入/更新的字段(不含 id、created_at、updated_at)
|
||||
# model_management 可写入字段(不含 id、created_at、updated_at)
|
||||
_MODEL_FIELDS = (
|
||||
'llmid', 'provider', 'model_name', 'display_name', 'model_type',
|
||||
'context_length', 'input_token_price', 'output_token_price',
|
||||
'cache_hit_input_price', 'billing_method', 'billing_unit',
|
||||
'capabilities', 'limitations', 'highlights', 'is_active',
|
||||
'description', 'listing_status',
|
||||
'description', 'listing_status', 'sort_order', 'experience',
|
||||
)
|
||||
|
||||
# model_api_doc 可写入字段(不含 id、model_id、created_at、updated_at)
|
||||
_API_DOC_FIELDS = ('api_url', 'curl_code', 'python_code')
|
||||
|
||||
|
||||
def _escape(value):
|
||||
if value is None:
|
||||
@ -23,23 +26,73 @@ def _build_model_dict(ns, include_listing_status=False):
|
||||
data['listing_status'] = ns.get('listing_status', 0)
|
||||
return data
|
||||
|
||||
|
||||
def _build_api_doc_dict(ns):
|
||||
"""构建 API 文档更新字典;字段在 ns 中即参与更新(含空字符串)"""
|
||||
data = {}
|
||||
for field in _API_DOC_FIELDS:
|
||||
if field in ns and ns.get(field) is not None:
|
||||
data[field] = ns.get(field)
|
||||
return data
|
||||
|
||||
|
||||
async def model_management_update(ns={}):
|
||||
"""编辑模型,id 必传"""
|
||||
"""编辑模型及 API 文档,id(model_management 主键)必传"""
|
||||
model_id = ns.get('id')
|
||||
if not model_id:
|
||||
return {'status': False, 'msg': 'id is required'}
|
||||
|
||||
ns_dic = _build_model_dict(ns)
|
||||
ns_dic['id'] = model_id
|
||||
model_dic = _build_model_dict(ns)
|
||||
api_doc_dic = _build_api_doc_dict(ns)
|
||||
has_model_update = bool(model_dic)
|
||||
has_api_doc_update = bool(api_doc_dic)
|
||||
|
||||
if not has_model_update and not has_api_doc_update:
|
||||
return {'status': False, 'msg': 'no fields to update'}
|
||||
|
||||
db = DBPools()
|
||||
async with db.sqlorContext('kboss') as sor:
|
||||
try:
|
||||
await sor.U('model_management', ns_dic)
|
||||
if has_model_update:
|
||||
model_dic['id'] = model_id
|
||||
await sor.U('model_management', model_dic)
|
||||
|
||||
if has_api_doc_update:
|
||||
api_doc_id = ns.get('api_doc_id')
|
||||
existing = None
|
||||
if api_doc_id:
|
||||
find_sql = (
|
||||
"SELECT id FROM model_api_doc WHERE id = '%s' AND model_id = '%s' LIMIT 1;"
|
||||
% (_escape(api_doc_id), _escape(str(model_id)))
|
||||
)
|
||||
existing = await sor.sqlExe(find_sql, {})
|
||||
if not existing:
|
||||
find_sql = (
|
||||
"SELECT id FROM model_api_doc WHERE model_id = '%s' LIMIT 1;"
|
||||
% _escape(str(model_id))
|
||||
)
|
||||
existing = await sor.sqlExe(find_sql, {})
|
||||
|
||||
if existing:
|
||||
doc_update = dict(api_doc_dic)
|
||||
doc_update['id'] = existing[0]['id']
|
||||
await sor.U('model_api_doc', doc_update)
|
||||
else:
|
||||
if not api_doc_dic.get('api_url'):
|
||||
await sor.rollback()
|
||||
return {
|
||||
'status': False,
|
||||
'msg': 'api_url is required when creating api doc',
|
||||
}
|
||||
create_dic = dict(api_doc_dic)
|
||||
create_dic['model_id'] = str(model_id)
|
||||
await sor.C('model_api_doc', create_dic)
|
||||
|
||||
return {'status': True, 'msg': 'update model success'}
|
||||
except Exception as e:
|
||||
await sor.rollback()
|
||||
return {'status': False, 'msg': 'update model failed, %s' % str(e)}
|
||||
|
||||
|
||||
|
||||
ret = await model_management_update(params_kw)
|
||||
return ret
|
||||
return ret
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user