|
@@ -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>
|