# 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