diff --git a/backend/apps/system/api/aimodel.py b/backend/apps/system/api/aimodel.py index 52074a57..781d1889 100644 --- a/backend/apps/system/api/aimodel.py +++ b/backend/apps/system/api/aimodel.py @@ -2,7 +2,7 @@ import json from typing import List, Union from apps.system.schemas.ai_model_schema import AiModelConfigItem, AiModelCreator, AiModelEditor, AiModelGridItem from fastapi import APIRouter, Query -from sqlmodel import func, select +from sqlmodel import func, select, update from apps.system.models.system_model import AiModelDetail from common.core.deps import SessionDep @@ -23,7 +23,7 @@ async def query( AiModelDetail.default_model) if keyword is not None: statement = statement.where(AiModelDetail.name.like(f"%{keyword}%")) - + statement = statement.order_by(AiModelDetail.create_time.asc()) items = session.exec(statement).all() return items @@ -85,6 +85,27 @@ async def delete_model( id: int ): item = session.get(AiModelDetail, id) + if item.default_model: + raise RuntimeError(f"Can not delete [${item.name}], because it is default model!") session.delete(item) session.commit() + +@router.put("/default/{id}") +async def set_default(session: SessionDep, id: int): + db_model = session.get(AiModelDetail, id) + if not db_model: + raise ValueError(f"AiModelDetail with id {id} not found") + if db_model.default_model: + return + + try: + session.exec( + update(AiModelDetail).values(default_model=False) + ) + db_model.default_model = True + session.add(db_model) + session.commit() + except Exception as e: + session.rollback() + raise e \ No newline at end of file diff --git a/frontend/src/api/system.ts b/frontend/src/api/system.ts index 0153122c..153c985f 100644 --- a/frontend/src/api/system.ts +++ b/frontend/src/api/system.ts @@ -7,5 +7,5 @@ export const modelApi = { edit: (data: any) => request.put('/system/aimodel', data), delete: (id: number) => request.delete(`/system/aimodel/${id}`), query: (id: number) => request.get(`/system/aimodel/${id}`), - status: (data: any) => request.patch('/system/aimodel/status', data), + setDefault: (id: number) => request.put(`/system/aimodel/default/${id}`), } diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts index 1839cb34..aa4f4c5f 100644 --- a/frontend/src/router/index.ts +++ b/frontend/src/router/index.ts @@ -9,7 +9,6 @@ import Datasource from '@/views/ds/Datasource.vue' import DashboardEditor from '@/views/dashboard/editor/index.vue' import DashboardPreview from '@//views/dashboard/preview/SQPreviewSingle.vue' import Dashboard from '@/views/dashboard/index.vue' -// import Model from '@/views/system/model/index.vue' import Model from '@/views/system/model/Model.vue' // import User from "@/views/system/user/index.vue"; import { watchRouter } from './watch' diff --git a/frontend/src/views/chat/ChatCreator.vue b/frontend/src/views/chat/ChatCreator.vue index 1430a78f..d9663c65 100644 --- a/frontend/src/views/chat/ChatCreator.vue +++ b/frontend/src/views/chat/ChatCreator.vue @@ -3,6 +3,7 @@ import { chatApi, ChatInfo } from '@/api/chat.ts' import { onMounted, ref } from 'vue' import { datasourceApi } from '@/api/datasource.ts' import DatasourceItemCard from '../ds/DatasourceItemCard.vue' +import { useRoute } from 'vue-router' const dsList = ref>([]) @@ -13,6 +14,7 @@ function listDs() { dsList.value = res }) } +const route = useRoute() const dialogVisible = ref(false) @@ -66,6 +68,9 @@ function createChat(datasource: number) { onMounted(() => { listDs() + const id = route.query.id as unknown as number + if (!id) return + createChat(id) }) defineExpose({ diff --git a/frontend/src/views/ds/Card.vue b/frontend/src/views/ds/Card.vue index 73fdbf7e..5dae8cc1 100644 --- a/frontend/src/views/ds/Card.vue +++ b/frontend/src/views/ds/Card.vue @@ -12,6 +12,7 @@ const props = withDefaults( defineProps<{ name: string type: string + type_name: string rate?: string description?: string id?: string @@ -19,13 +20,13 @@ const props = withDefaults( { name: '-', type: '-', - rate: '-', description: '-', id: '-', + type_name: '-', } ) -const emits = defineEmits(['edit', 'del', 'question', 'dataTableDetail']) +const emits = defineEmits(['edit', 'del', 'question', 'dataTableDetail', 'showTable']) const icon = computed(() => { return (dsTypeWithImg.find((ele) => props.type === ele.type) || {}).img }) @@ -57,7 +58,7 @@ const onClickOutside = () => {
{{ name }}
-
{{ type }}
+
{{ type_name }}
@@ -69,7 +70,6 @@ const onClickOutside = () => { - {{ rate }}
diff --git a/frontend/src/views/ds/Datasource.vue b/frontend/src/views/ds/Datasource.vue index b2836684..9881dad4 100644 --- a/frontend/src/views/ds/Datasource.vue +++ b/frontend/src/views/ds/Datasource.vue @@ -5,6 +5,7 @@ import icon_searchOutline_outlined from '@/assets/svg/icon_search-outline_outlin import arrow_down from '@/assets/svg/arrow-down.svg' import icon_add_outlined from '@/assets/svg/icon_add_outlined.svg' import EmptyBackground from '@/views/dashboard/common/EmptyBackground.vue' +import { useRouter } from 'vue-router' import DataTable from './DataTable.vue' import icon_done_outlined from '@/assets/svg/icon_done_outlined.svg' import icon_close_outlined from '@/assets/svg/operate/ope-close.svg' @@ -18,12 +19,14 @@ import { useI18n } from 'vue-i18n' interface Datasource { name: string + type_name: string type: string img: string - rate?: string + description: string id?: string } +const router = useRouter() const { t } = useI18n() const keywords = ref('') const defaultDatasourceKeywords = ref('') @@ -75,6 +78,15 @@ const handleEditDatasource = (res: any) => { }) } +const handleQuestion = (id: string) => { + router.push({ + path: '/chat/index', + query: { + id, + }, + }) +} + const handleAddDatasource = () => { editDatasource.value = false datasourceConfigvVisible.value = true @@ -208,7 +220,7 @@ const dataTableDetail = (ele: any) => {
- 没有找到相关结果 + {{ t('model.relevant_results_found') }}
@@ -235,7 +247,9 @@ const dataTableDetail = (ele: any) => { :key="ele.id" :name="ele.name" :type="ele.type" - :rate="ele.rate" + :type_name="ele.type_name" + :description="ele.description" + @question="handleQuestion" @edit="handleEditDatasource(ele)" @del="deleteHandler(ele)" @data-table-detail="dataTableDetail(ele)" diff --git a/frontend/src/views/system/model/Card.vue b/frontend/src/views/system/model/Card.vue index 516fbef2..e166f753 100644 --- a/frontend/src/views/system/model/Card.vue +++ b/frontend/src/views/system/model/Card.vue @@ -59,14 +59,12 @@ const handleDel = () => { - + + + + + + diff --git a/frontend/src/views/system/model/Model.vue b/frontend/src/views/system/model/Model.vue index ee4eb4db..98638694 100644 --- a/frontend/src/views/system/model/Model.vue +++ b/frontend/src/views/system/model/Model.vue @@ -69,6 +69,10 @@ const defaultModelListWithSearch = computed(() => { }) const handleDefaultModelChange = (item: any) => { + const current_default_node = modelList.value.find((ele: Model) => ele.default_model) + if (current_default_node?.id === item.id) { + return + } ElMessageBox.confirm(`是否设置 ${item.name} 为系统默认模型?`, { confirmButtonType: 'primary', tip: '系统默认模型被替换后,智能问数的结果将会受到影响,请谨慎操作。', @@ -78,10 +82,10 @@ const handleDefaultModelChange = (item: any) => { autofocus: false, callback: (val: string) => { if (val === 'confirm') { - modelList.value.forEach((ele: any) => { - ele.default_model = ele.id === item.id + modelApi.setDefault(item.id).then(() => { + ElMessage.success('设置成功') + search() }) - ElMessage.success('设置成功') } }, }) diff --git a/frontend/src/views/system/model/ModelForm.vue b/frontend/src/views/system/model/ModelForm.vue index d5d76326..a4dc7e1a 100644 --- a/frontend/src/views/system/model/ModelForm.vue +++ b/frontend/src/views/system/model/ModelForm.vue @@ -87,7 +87,13 @@ const rules = { ], base_model: [{ required: true, message: t('model.the_basic_model_de'), trigger: 'blur' }], name: [{ required: true, message: t('model.the_basic_model'), trigger: 'blur' }], - api_key: [{ required: true, message: 'api_key', trigger: 'blur' }], + api_key: [ + { + required: true, + message: t('datasource.please_enter') + t('common.empty') + 'API Key', + trigger: 'blur', + }, + ], } onMounted(() => { diff --git a/frontend/src/views/system/model/index.vue b/frontend/src/views/system/model/index.vue deleted file mode 100644 index 457db734..00000000 --- a/frontend/src/views/system/model/index.vue +++ /dev/null @@ -1,538 +0,0 @@ - - - - -