diff --git a/backend/apps/system/api/aimodel.py b/backend/apps/system/api/aimodel.py index 781d1889..2767f0a1 100644 --- a/backend/apps/system/api/aimodel.py +++ b/backend/apps/system/api/aimodel.py @@ -1,5 +1,6 @@ import json from typing import List, Union +from apps.ai_model.model_factory import LLMConfig, LLMFactory from apps.system.schemas.ai_model_schema import AiModelConfigItem, AiModelCreator, AiModelEditor, AiModelGridItem from fastapi import APIRouter, Query from sqlmodel import func, select, update @@ -7,9 +8,28 @@ from sqlmodel import func, select, update from apps.system.models.system_model import AiModelDetail from common.core.deps import SessionDep from common.utils.time import get_timestamp +from common.utils.utils import SQLBotLogUtil router = APIRouter(tags=["system/aimodel"], prefix="/system/aimodel") +@router.post("/status") +async def check_llm(info: AiModelCreator): + try: + additional_params = {item.key: item.val for item in info.config_list} + config = LLMConfig( + model_type="openai", + model_name=info.base_model, + api_key=info.api_key, + api_base_url=info.api_domain, + additional_params=additional_params, + ) + llm_instance = LLMFactory.create_llm(config) + result = llm_instance.llm.invoke("who are you?") + SQLBotLogUtil.info(f"check_llm result: {result}") + except Exception as e: + SQLBotLogUtil.error(f"Error checking LLM: {e}") + raise e + @router.get("", response_model=list[AiModelGridItem]) async def query( session: SessionDep, @@ -74,8 +94,8 @@ async def update_model( data["config"] = json.dumps([item.model_dump(exclude_unset=True) for item in editor.config_list]) data.pop("config_list", None) db_model = session.get(AiModelDetail, id) - update_data = AiModelDetail.model_validate(data) - db_model.sqlmodel_update(update_data) + #update_data = AiModelDetail.model_validate(data) + db_model.sqlmodel_update(data) session.add(db_model) session.commit() diff --git a/frontend/src/api/system.ts b/frontend/src/api/system.ts index 153c985f..ee62cb57 100644 --- a/frontend/src/api/system.ts +++ b/frontend/src/api/system.ts @@ -8,4 +8,6 @@ export const modelApi = { delete: (id: number) => request.delete(`/system/aimodel/${id}`), query: (id: number) => request.get(`/system/aimodel/${id}`), setDefault: (id: number) => request.put(`/system/aimodel/default/${id}`), + check: (data: any) => + request.post('/system/aimodel/status', data, { requestOptions: { silent: true } }), } diff --git a/frontend/src/i18n/zh-CN.json b/frontend/src/i18n/zh-CN.json index e42b6bf6..a68fe338 100644 --- a/frontend/src/i18n/zh-CN.json +++ b/frontend/src/i18n/zh-CN.json @@ -279,7 +279,8 @@ "verification_successful": "校验成功", "del_default_tip": "无法删除模型: {msg}", "del_default_warn": "该模型为系统默认模型,请先设置其他模型为系统默认模型,再删除此模型。", - "del_warn_tip": "是否删除模型: {msg}?" + "del_warn_tip": "是否删除模型: {msg}?", + "check_failed": "模型无效【{msg}】" }, "user": { "workspace": "工作空间", diff --git a/frontend/src/views/system/model/Model.vue b/frontend/src/views/system/model/Model.vue index dc2dec0d..8d623279 100644 --- a/frontend/src/views/system/model/Model.vue +++ b/frontend/src/views/system/model/Model.vue @@ -69,6 +69,17 @@ const defaultModelListWithSearch = computed(() => { }) }) +const modelCheckHandler = (item: any) => { + setTimeout(() => { + modelApi.check(item).catch((err: any) => { + if (err.response?.data?.msg) { + ElMessage.error(t('model.check_failed', { msg: err.response.data.msg || '' })) + } else { + ElMessage.error(t('model.check_failed', { msg: err.message || '' })) + } + }) + }, 1000) +} const duplicateName = async (item: any) => { const res = await modelApi.queryAll() const names = res.filter((ele: any) => ele.id !== item.id).map((ele: any) => ele.name) @@ -85,6 +96,7 @@ const duplicateName = async (item: any) => { type: 'success', message: t('workspace.add_successfully'), }) + modelCheckHandler(item) }) return } @@ -95,6 +107,7 @@ const duplicateName = async (item: any) => { type: 'success', message: t('common.save_success'), }) + modelCheckHandler(item) }) }