浏览代码

词嵌入模型

kagg886 1 月之前
父节点
当前提交
a2c4d7d66d
共有 3 个文件被更改,包括 75 次插入6 次删除
  1. 5 2
      src/api/assist/type.ts
  2. 61 2
      src/views/assistant/index.vue
  3. 9 2
      src/views/assistant/model.vue

+ 5 - 2
src/api/assist/type.ts

@@ -44,7 +44,9 @@ export type FunctionCall = {
 }
 
 export type ChatRequest = {
+	session_id: number
 	modelClassId?: number
+	modelEmbeddingId?: number
 	modelMcpId?: number[]
 	message: Message[]
 }
@@ -93,6 +95,7 @@ export type StructDataResponse = ChatResponseBase<'structdata'> & {
 
 export type ChatResponse = Text | ToolCallRequest | ToolCallResponse | ErrorResponse | DataResponse | StructDataResponse
 
+export type ModelType = 'embedding' | 'chat'
 // 大语言模型配置相关类型定义
 
 // 大语言模型配置列表查询参数
@@ -104,7 +107,7 @@ export type LmConfigListParams = {
 	pageSize?: number // 分页数量,最大500,默认10
 	modelClass?: string // 模型分类
 	modelName?: string // 模型名称
-	modelType?: string // 模型类型
+	modelType?: ModelType // 模型类型
 	status?: string // 是否启用
 	createdAt?: string // 创建时间
 }
@@ -116,7 +119,7 @@ export type LmConfigInfo = {
 	modelName?: string // 模型名称
 	apiKey?: string // API密钥
 	baseUrl?: string // 基础URL
-	modelType?: string // 模型类型
+	modelType?: ModelType // 模型类型
 	isCallFun?: boolean // 是否调用函数
 	maxToken?: number // 最大令牌数
 	status: boolean // 是否启用

+ 61 - 2
src/views/assistant/index.vue

@@ -19,6 +19,7 @@ import {
 	Loading,
 	Promotion,
 	VideoPause,
+	CopyDocument,
 } from '@element-plus/icons-vue'
 import { MarkdownPlugin } from '/@/components/markdown/type/markdown'
 import EChartsPlugin from '/@/components/markdown/plugins/echarts'
@@ -124,7 +125,7 @@ const modelLabel = computed(() => {
 })
 
 const { loading: loadingModels, doLoading: loadModel } = useLoading(async () => {
-	const data: { list: LmConfigInfo[]; total: number } = await assist.model.getList().catch(() => {
+	const data: { list: LmConfigInfo[]; total: number } = await assist.model.getList({modelType: 'chat'}).catch(() => {
 		return {
 			list: [],
 		}
@@ -134,7 +135,43 @@ const { loading: loadingModels, doLoading: loadModel } = useLoading(async () =>
 	selectedModel.value = data.list[0]?.id ?? undefined
 })
 
-onMounted(loadModel)
+// 词嵌入模型选择
+const embeddingModelOptions = ref<LmConfigInfo[]>([])
+const selectedEmbeddingModel = ref<number | undefined>(undefined)
+const embeddingModelLabel = computed(() => {
+	const select = embeddingModelOptions.value.filter((i) => i.id === selectedEmbeddingModel.value)
+
+	if (select.length === 0) {
+		return '选择词嵌入模型'
+	}
+
+	return select[0].modelName
+})
+
+const { loading: loadingEmbeddingModels, doLoading: loadEmbeddingModel } = useLoading(async () => {
+	const data: { list: LmConfigInfo[]; total: number } = await assist.model.getList({modelType: 'embedding'}).catch(() => {
+		return {
+			list: [],
+		}
+	})
+
+	data.list = [
+		...(data.list ?? []),
+		{
+			id: -1,
+			modelName: '不启用词嵌入',
+			status: true
+		},
+	]
+
+	embeddingModelOptions.value = data.list
+	selectedEmbeddingModel.value = data.list[0]?.id ?? undefined
+})
+
+onMounted(() => {
+	loadModel()
+	loadEmbeddingModel()
+})
 
 // 加载提示词列表
 const { loading: loadingPromptList, doLoading: loadPromptList } = useLoading(async () => {
@@ -285,6 +322,7 @@ const replaceMessage = async (index: number) => {
 const chatInternal = (rtn: Message, context: Message[] = messages.value) => {
 	chatInstance.value = assist.chat.sse({
 		chatRequest: {
+			session_id: activeConversationId.value!,
 			message: prompt.value
 				? [
 						{
@@ -298,6 +336,7 @@ const chatInternal = (rtn: Message, context: Message[] = messages.value) => {
 				  ]
 				: context,
 			modelClassId: selectedModel.value,
+			modelEmbeddingId: (selectedEmbeddingModel.value ?? -1) > 0 ? selectedEmbeddingModel.value : undefined
 		},
 		onReceive: (resp: ChatResponse) => {
 			switch (resp.type) {
@@ -1093,6 +1132,26 @@ const handlePromptReset = async () => {
 								</template>
 							</el-dropdown>
 
+							<!-- 词嵌入模型选择按钮 -->
+							<el-dropdown trigger="click" placement="top-start">
+								<button class="control-btn embedding-model-btn">
+									<el-icon><CopyDocument /></el-icon>
+									<span>{{ embeddingModelLabel }}</span>
+								</button>
+								<template #dropdown>
+									<el-dropdown-menu>
+										<el-dropdown-item
+											v-for="item in embeddingModelOptions"
+											:key="item.id"
+											@click="selectedEmbeddingModel = item.id"
+											:class="{ 'is-selected': selectedEmbeddingModel === item.id }"
+										>
+											{{ item.modelName }}
+										</el-dropdown-item>
+									</el-dropdown-menu>
+								</template>
+							</el-dropdown>
+
 							<!-- 提示词选择按钮 -->
 							<button class="control-btn prompt-btn" @click="openPromptDialog = true">
 								<el-icon><Document /></el-icon>

+ 9 - 2
src/views/assistant/model.vue

@@ -238,7 +238,10 @@ onMounted(() => {
 				<el-input style="width: 150px" v-model="searchParam.modelName" placeholder="模型名称" clearable />
 			</el-form-item>
 			<el-form-item label="" prop="modelType">
-				<el-input style="width: 150px" v-model="searchParam.modelType" placeholder="模型类型" clearable />
+				<el-select v-model="searchParam.modelType" placeholder="请选择模型类型" clearable>
+					<el-option label="词嵌入" value="embedding" />
+					<el-option label="对话模型" value="chat" />
+				</el-select>
 			</el-form-item>
 			<el-form-item label="" prop="status">
 				<el-select style="width: 125px" v-model="searchParam.status" placeholder="状态" clearable>
@@ -337,7 +340,11 @@ onMounted(() => {
 					<el-input v-model="formData.modelClass" placeholder="请输入模型分类" clearable />
 				</el-form-item>
 				<el-form-item label="模型类型" prop="modelType">
-					<el-input v-model="formData.modelType" placeholder="请输入模型类型" clearable />
+					<el-select v-model="formData.modelType" placeholder="请选择模型类型">
+						<el-option label="词嵌入" value="embedding" />
+						<el-option label="对话模型" value="chat" />
+					</el-select>
+<!--					<el-input v-model="formData.modelType" placeholder="请输入模型类型" clearable />-->
 				</el-form-item>
 				<el-form-item label="API密钥" prop="apiKey">
 					<el-input v-model="formData.apiKey" type="password" placeholder="请输入API密钥" clearable show-password />