96 lines
4.1 KiB
Plaintext
96 lines
4.1 KiB
Plaintext
# 可写入/更新的字段(不含 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',
|
||
)
|
||
|
||
|
||
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
|
||
|
||
async def model_management_search(ns={}):
|
||
"""
|
||
分页查询模型列表,支持按 model_name / model_type / provider 筛选。
|
||
返回模型总数、待上架总数、已上架总数,以及厂商列表、模型类型列表。
|
||
"""
|
||
import traceback
|
||
|
||
page_size = int(ns.get('page_size', 1000))
|
||
current_page = int(ns.get('current_page', 1))
|
||
offset = (current_page - 1) * page_size
|
||
|
||
conditions = ['1=1']
|
||
if ns.get('display_name'):
|
||
display_name = ns.get('display_name')
|
||
# 模糊查询
|
||
conditions.append(f"display_name LIKE '%%%%{display_name}%%%%'")
|
||
if ns.get('model_type'):
|
||
conditions.append("model_type = '%s'" % _escape(ns.get('model_type')))
|
||
if ns.get('provider'):
|
||
conditions.append("provider = '%s'" % _escape(ns.get('provider')))
|
||
if ns.get('listing_status') is not None and ns.get('listing_status') != '':
|
||
conditions.append("listing_status = '%s'" % _escape(ns.get('listing_status')))
|
||
|
||
where_clause = ' AND '.join(conditions)
|
||
|
||
db = DBPools()
|
||
async with db.sqlorContext('kboss') as sor:
|
||
try:
|
||
stats_sql = """SELECT COUNT(*) AS total_count, SUM(CASE WHEN listing_status = 0 THEN 1 ELSE 0 END) AS pending_count, SUM(CASE WHEN listing_status = 1 THEN 1 ELSE 0 END) AS listed_count FROM model_management;"""
|
||
stats_li = await sor.sqlExe(stats_sql, {})
|
||
stats = stats_li[0] if stats_li else {}
|
||
|
||
provider_sql = """
|
||
SELECT DISTINCT provider FROM model_management
|
||
WHERE provider IS NOT NULL AND provider != ''
|
||
ORDER BY provider;
|
||
"""
|
||
model_type_sql = """
|
||
SELECT DISTINCT model_type FROM model_management
|
||
WHERE model_type IS NOT NULL AND model_type != ''
|
||
ORDER BY model_type;
|
||
"""
|
||
|
||
count_sql = """SELECT COUNT(*) AS total_count FROM model_management WHERE %s;""" % where_clause
|
||
filter_total = (await sor.sqlExe(count_sql, {}))[0]['total_count']
|
||
|
||
find_sql = """SELECT * FROM model_management WHERE %s ORDER BY sort_order ASC LIMIT %s OFFSET %s;""" % (where_clause, page_size, offset)
|
||
provider_rows = await sor.sqlExe(provider_sql, {})
|
||
model_type_rows = await sor.sqlExe(model_type_sql, {})
|
||
model_list = await sor.sqlExe(find_sql, {})
|
||
|
||
return {
|
||
'status': True,
|
||
'msg': 'search model success',
|
||
'data': {
|
||
'total_count': stats.get('total_count', 0),
|
||
'pending_count': int(stats.get('pending_count') or 0),
|
||
'listed_count': int(stats.get('listed_count') or 0),
|
||
'provider_list': [r['provider'] for r in provider_rows],
|
||
'model_type_list': [r['model_type'] for r in model_type_rows],
|
||
'filter_total': filter_total,
|
||
'page_size': page_size,
|
||
'current_page': current_page,
|
||
'model_list': model_list,
|
||
},
|
||
}
|
||
except Exception as e:
|
||
return {'status': False, 'msg': 'search model failed, %s' % traceback.format_exc()}
|
||
|
||
ret = await model_management_search(params_kw)
|
||
return ret |