kboss/b/cntoai/model_management_add.dspy
2026-05-28 18:20:40 +08:00

90 lines
3.2 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# model_management 可写入字段(不含 id、created_at、updated_at
_MODEL_FIELDS = (
'llmid', 'provider', 'model_name', 'display_name', 'model_logo', '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', '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:
return None
return str(value).replace("'", "''")
def _build_model_dict(ns, include_listing_status=False):
data = {}
for field in _MODEL_FIELDS:
if field in ns and ns.get(field) is not None and ns.get(field) != '':
data[field] = ns.get(field)
if include_listing_status and 'listing_status' not in data:
data['listing_status'] = ns.get('listing_status', 0)
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={}):
"""新增模型及 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'}
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', 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'}
# 未传 sort_order 时,默认与新建主键 id 相同
if not (
'sort_order' in ns
and ns.get('sort_order') is not None
and ns.get('sort_order') != ''
):
await sor.U('model_management', {'id': model_id, 'sort_order': model_id})
model_dic['sort_order'] = 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