|
|
@@ -1,18 +1,34 @@
|
|
|
<template>
|
|
|
- <el-dialog v-model="visible" :title="formId ? '编辑智能体' : '新建智能体'" class="agent-modal" fullscreen>
|
|
|
+ <el-dialog
|
|
|
+ v-model="visible"
|
|
|
+ :title="formId ? '编辑智能体' : '新建智能体'"
|
|
|
+ class="agent-modal"
|
|
|
+ fullscreen
|
|
|
+ >
|
|
|
<div class="modal-wrap">
|
|
|
- <el-form ref="formRef" :model="form" :rules="rules" label-position="left" class="agent-form" label-width="120px">
|
|
|
+ <el-form
|
|
|
+ ref="formRef"
|
|
|
+ :model="form"
|
|
|
+ :rules="rules"
|
|
|
+ label-position="left"
|
|
|
+ class="agent-form"
|
|
|
+ label-width="120px"
|
|
|
+ >
|
|
|
<el-tabs v-model="activeTab" tab-position="left" class="settings-tabs">
|
|
|
<el-tab-pane label="基础信息" name="basic">
|
|
|
<div class="tab-intro">配置智能体的基本信息</div>
|
|
|
<div class="collapse-body">
|
|
|
<el-form-item label="运行模式" prop="mode">
|
|
|
<div class="switch-wrap flex items-center gap-2">
|
|
|
- <el-segmented v-model="form.mode" class="selection-segmented"
|
|
|
- :options="[{ label: '快速问答', value: 'quick-answer' }, { label: '智能推理', value: 'smart-reasoning' }]" />
|
|
|
- <div class="field-tip">
|
|
|
- 多步思考,深度分析复杂问题。
|
|
|
- </div>
|
|
|
+ <el-segmented
|
|
|
+ v-model="form.mode"
|
|
|
+ class="selection-segmented"
|
|
|
+ :options="[
|
|
|
+ { label: '快速问答', value: 'quick-answer' },
|
|
|
+ { label: '智能推理', value: 'smart-reasoning' }
|
|
|
+ ]"
|
|
|
+ />
|
|
|
+ <div class="field-tip">多步思考,深度分析复杂问题。</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
<div class="mode-tip ml-120px">
|
|
|
@@ -36,7 +52,12 @@
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="描述" prop="description">
|
|
|
- <el-input v-model="form.description" type="textarea" :rows="3" placeholder="请输入智能体描述" />
|
|
|
+ <el-input
|
|
|
+ v-model="form.description"
|
|
|
+ type="textarea"
|
|
|
+ :rows="3"
|
|
|
+ placeholder="请输入智能体描述"
|
|
|
+ />
|
|
|
<div class="field-tip">简要描述智能体的用途和特点。</div>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="系统提示词" prop="config.basic_config.system_prompt">
|
|
|
@@ -44,41 +65,74 @@
|
|
|
<div class="prompt-toolbar">
|
|
|
<div class="prompt-variable-row">
|
|
|
<span class="prompt-variable-label">支持变量</span>
|
|
|
- <el-tag v-for="variable in systemPromptVariables" :key="variable"
|
|
|
- class="prompt-variable-tag" type="info" effect="plain"
|
|
|
- @click="insertPromptVariable('systemPrompt', variable)">
|
|
|
+ <el-tag
|
|
|
+ v-for="variable in systemPromptVariables"
|
|
|
+ :key="variable"
|
|
|
+ class="prompt-variable-tag"
|
|
|
+ type="info"
|
|
|
+ effect="plain"
|
|
|
+ @click="insertPromptVariable('systemPrompt', variable)"
|
|
|
+ >
|
|
|
{{ formatPromptVariable(variable) }}
|
|
|
</el-tag>
|
|
|
</div>
|
|
|
- <el-button class="prompt-template-trigger" text :icon="DocumentCopy"
|
|
|
- @click="openPromptTemplatePicker('systemPrompt')">
|
|
|
+ <el-button
|
|
|
+ class="prompt-template-trigger"
|
|
|
+ text
|
|
|
+ :icon="DocumentCopy"
|
|
|
+ @click="openPromptTemplatePicker('systemPrompt')"
|
|
|
+ >
|
|
|
模板选择
|
|
|
</el-button>
|
|
|
</div>
|
|
|
- <el-input ref="systemPromptInputRef" v-model="form.config.basic_config.system_prompt" mode="prompt"
|
|
|
- type="textarea" :rows="8" placeholder="请输入系统提示词,可直接编写角色、目标、约束和回答风格" />
|
|
|
+ <el-input
|
|
|
+ ref="systemPromptInputRef"
|
|
|
+ v-model="form.config.basic_config.system_prompt"
|
|
|
+ mode="prompt"
|
|
|
+ type="textarea"
|
|
|
+ :rows="8"
|
|
|
+ placeholder="请输入系统提示词,可直接编写角色、目标、约束和回答风格"
|
|
|
+ />
|
|
|
</div>
|
|
|
<div class="field-tip">自定义系统提示词,定义智能体的行为和角色。</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item v-if="form.mode === 'quick-answer'" label="上下文模板"
|
|
|
- prop="config.basic_config.context_template">
|
|
|
+ <el-form-item
|
|
|
+ v-if="form.mode === 'quick-answer'"
|
|
|
+ label="上下文模板"
|
|
|
+ prop="config.basic_config.context_template"
|
|
|
+ >
|
|
|
<div class="prompt-field">
|
|
|
<div class="prompt-toolbar">
|
|
|
<div class="prompt-variable-row">
|
|
|
<span class="prompt-variable-label">支持变量</span>
|
|
|
- <el-tag v-for="variable in quickAnswerVariables" :key="variable"
|
|
|
- class="prompt-variable-tag" type="info" effect="plain"
|
|
|
- @click="insertPromptVariable('contextTemplate', variable)">
|
|
|
+ <el-tag
|
|
|
+ v-for="variable in quickAnswerVariables"
|
|
|
+ :key="variable"
|
|
|
+ class="prompt-variable-tag"
|
|
|
+ type="info"
|
|
|
+ effect="plain"
|
|
|
+ @click="insertPromptVariable('contextTemplate', variable)"
|
|
|
+ >
|
|
|
{{ formatPromptVariable(variable) }}
|
|
|
</el-tag>
|
|
|
</div>
|
|
|
- <el-button class="prompt-template-trigger" text :icon="DocumentCopy"
|
|
|
- @click="openPromptTemplatePicker('contextTemplate')">
|
|
|
+ <el-button
|
|
|
+ class="prompt-template-trigger"
|
|
|
+ text
|
|
|
+ :icon="DocumentCopy"
|
|
|
+ @click="openPromptTemplatePicker('contextTemplate')"
|
|
|
+ >
|
|
|
模板选择
|
|
|
</el-button>
|
|
|
</div>
|
|
|
- <el-input ref="contextTemplateInputRef" v-model="form.config.basic_config.context_template"
|
|
|
- mode="prompt" type="textarea" :rows="5" placeholder="请输入上下文模板,用于约束问答模式下的上下文组织方式" />
|
|
|
+ <el-input
|
|
|
+ ref="contextTemplateInputRef"
|
|
|
+ v-model="form.config.basic_config.context_template"
|
|
|
+ mode="prompt"
|
|
|
+ type="textarea"
|
|
|
+ :rows="5"
|
|
|
+ placeholder="请输入上下文模板,用于约束问答模式下的上下文组织方式"
|
|
|
+ />
|
|
|
</div>
|
|
|
<div class="field-tip">定义如何将检索到的内容格式化后传递给模型。</div>
|
|
|
</el-form-item>
|
|
|
@@ -89,22 +143,42 @@
|
|
|
<div class="tab-intro">配置智能体的模型参数</div>
|
|
|
<div class="collapse-body">
|
|
|
<el-form-item label="模型" prop="config.model_config.model_id">
|
|
|
- <el-select v-model="form.config.model_config.model_id" filterable remote reserve-keyword
|
|
|
- :remote-method="searchChatModels" :loading="chatModelsLoading" style="width: 100%">
|
|
|
- <el-option v-for="model in chatModels" :key="model.id" :label="modelLabel(model)" :value="model.id" />
|
|
|
+ <el-select
|
|
|
+ v-model="form.config.model_config.model_id"
|
|
|
+ filterable
|
|
|
+ remote
|
|
|
+ reserve-keyword
|
|
|
+ :remote-method="searchChatModels"
|
|
|
+ :loading="chatModelsLoading"
|
|
|
+ style="width: 100%"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="model in chatModels"
|
|
|
+ :key="model.id"
|
|
|
+ :label="modelLabel(model)"
|
|
|
+ :value="model.id"
|
|
|
+ />
|
|
|
</el-select>
|
|
|
<div class="field-tip">选择智能体使用的大语言模型。</div>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="温度" prop="config.model_config.temperature">
|
|
|
<div class="switch-wrap w-full flex items-center gap-2">
|
|
|
- <el-slider v-model="form.config.model_config.temperature" :min="0" :max="1" :step="0.1"
|
|
|
- style="width: 50%" />
|
|
|
+ <el-slider
|
|
|
+ v-model="form.config.model_config.temperature"
|
|
|
+ :min="0"
|
|
|
+ :max="1"
|
|
|
+ :step="0.1"
|
|
|
+ style="width: 50%"
|
|
|
+ />
|
|
|
<div class="field-tip">控制输出的随机性,0 最确定,1 最随机。</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="最大 Token 数" prop="config.model_config.max_completion_tokens">
|
|
|
- <el-input-number v-model="form.config.model_config.max_completion_tokens" :min="1"
|
|
|
- style="width: 100%" />
|
|
|
+ <el-input-number
|
|
|
+ v-model="form.config.model_config.max_completion_tokens"
|
|
|
+ :min="1"
|
|
|
+ style="width: 100%"
|
|
|
+ />
|
|
|
<div class="field-tip">限制模型单次回复可生成的最大 Token 数。</div>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="思考模式" prop="config.model_config.thinking">
|
|
|
@@ -112,7 +186,6 @@
|
|
|
<el-switch v-model="form.config.model_config.thinking" />
|
|
|
<div class="field-tip">启用模型的扩展思考能力,需要模型本身支持。</div>
|
|
|
</div>
|
|
|
-
|
|
|
</el-form-item>
|
|
|
</div>
|
|
|
</el-tab-pane>
|
|
|
@@ -122,32 +195,66 @@
|
|
|
<div class="collapse-body">
|
|
|
<el-form-item label="关联知识库" prop="config.kb_config.knowledge_bases">
|
|
|
<div class="selection-panel">
|
|
|
- <el-segmented v-model="form.config.kb_config.kb_selection_mode" class="selection-segmented"
|
|
|
- :options="selectionModeOptions" />
|
|
|
- <el-checkbox-group v-if="form.config.kb_config.kb_selection_mode === 'selected'"
|
|
|
- v-model="form.config.kb_config.knowledge_bases" class="checkbox-grid">
|
|
|
- <el-checkbox v-for="item in knowledgeCheckboxOptions" :key="item.value" :label="item.value">
|
|
|
+ <el-segmented
|
|
|
+ v-model="form.config.kb_config.kb_selection_mode"
|
|
|
+ class="selection-segmented"
|
|
|
+ :options="selectionModeOptions"
|
|
|
+ />
|
|
|
+ <el-checkbox-group
|
|
|
+ v-if="form.config.kb_config.kb_selection_mode === 'selected'"
|
|
|
+ v-model="form.config.kb_config.knowledge_bases"
|
|
|
+ class="checkbox-grid"
|
|
|
+ >
|
|
|
+ <el-checkbox
|
|
|
+ v-for="item in knowledgeCheckboxOptions"
|
|
|
+ :key="item.value"
|
|
|
+ :label="item.value"
|
|
|
+ >
|
|
|
{{ item.label }}
|
|
|
</el-checkbox>
|
|
|
</el-checkbox-group>
|
|
|
</div>
|
|
|
<div class="field-tip">选择智能体可访问的知识库范围。</div>
|
|
|
- <div v-if="form.config.kb_config.kb_selection_mode === 'selected'" class="field-tip">
|
|
|
+ <div
|
|
|
+ v-if="form.config.kb_config.kb_selection_mode === 'selected'"
|
|
|
+ class="field-tip"
|
|
|
+ >
|
|
|
选择要关联的知识库,包括协作知识库。
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="知识的文件类型" prop="config.kb_config.supported_file_types">
|
|
|
- <el-select v-model="form.config.kb_config.supported_file_types" multiple allow-create filterable
|
|
|
- style="width: 100%">
|
|
|
- <el-option v-for="item in supportedFileTypes" :key="item" :label="item" :value="item" />
|
|
|
+ <el-select
|
|
|
+ v-model="form.config.kb_config.supported_file_types"
|
|
|
+ multiple
|
|
|
+ allow-create
|
|
|
+ filterable
|
|
|
+ style="width: 100%"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="item in supportedFileTypes"
|
|
|
+ :key="item"
|
|
|
+ :label="item"
|
|
|
+ :value="item"
|
|
|
+ />
|
|
|
</el-select>
|
|
|
<div class="field-tip">限制可选择的文件类型,留空表示支持所有类型。</div>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="ReRank 模型" prop="config.model_config.rerank_model_id">
|
|
|
- <el-select v-model="form.config.model_config.rerank_model_id" filterable remote reserve-keyword
|
|
|
- :remote-method="searchRerankModels" :loading="rerankModelsLoading" style="width: 100%">
|
|
|
- <el-option v-for="model in rerankModels" :key="model.id" :label="modelLabel(model)"
|
|
|
- :value="model.id" />
|
|
|
+ <el-select
|
|
|
+ v-model="form.config.model_config.rerank_model_id"
|
|
|
+ filterable
|
|
|
+ remote
|
|
|
+ reserve-keyword
|
|
|
+ :remote-method="searchRerankModels"
|
|
|
+ :loading="rerankModelsLoading"
|
|
|
+ style="width: 100%"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="model in rerankModels"
|
|
|
+ :key="model.id"
|
|
|
+ :label="modelLabel(model)"
|
|
|
+ :value="model.id"
|
|
|
+ />
|
|
|
</el-select>
|
|
|
<div class="field-tip">用于对知识库检索结果进行重排序,提高回答准确性。</div>
|
|
|
</el-form-item>
|
|
|
@@ -161,19 +268,31 @@
|
|
|
<el-switch v-model="form.config.faq_config.faq_priority_enabled" />
|
|
|
<div class="field-tip">FAQ 答案将优先于普通文档被引用,提高回答准确性。</div>
|
|
|
</div>
|
|
|
-
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="直接问答阈值" prop="config.faq_config.faq_direct_answer_threshold">
|
|
|
+ <el-form-item
|
|
|
+ label="直接问答阈值"
|
|
|
+ prop="config.faq_config.faq_direct_answer_threshold"
|
|
|
+ >
|
|
|
<div class="switch-wrap w-full flex items-center gap-3">
|
|
|
- <el-slider v-model="form.config.faq_config.faq_direct_answer_threshold" :min="0.7" :max="1"
|
|
|
- :step="0.1" style="width: 50%" />
|
|
|
+ <el-slider
|
|
|
+ v-model="form.config.faq_config.faq_direct_answer_threshold"
|
|
|
+ :min="0.7"
|
|
|
+ :max="1"
|
|
|
+ :step="0.1"
|
|
|
+ style="width: 50%"
|
|
|
+ />
|
|
|
<div class="field-tip">当问题与 FAQ 相似度超过此值时,直接使用 FAQ 答案。</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="FAQ 分数加权" prop="config.faq_config.faq_score_boost">
|
|
|
<div class="switch-wrap w-full flex items-center gap-3">
|
|
|
- <el-slider v-model="form.config.faq_config.faq_score_boost" :min="1" :max="2" :step="0.1"
|
|
|
- style="width: 50%" />
|
|
|
+ <el-slider
|
|
|
+ v-model="form.config.faq_config.faq_score_boost"
|
|
|
+ :min="1"
|
|
|
+ :max="2"
|
|
|
+ :step="0.1"
|
|
|
+ style="width: 50%"
|
|
|
+ />
|
|
|
<div class="field-tip">FAQ 结果的相关性分数乘以此系数,使其排序更靠前。</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
@@ -186,12 +305,19 @@
|
|
|
<div class="collapse-body">
|
|
|
<el-form-item label="允许的工具" prop="config.setting_config.allowed_tools">
|
|
|
<div class="selection-panel">
|
|
|
- <el-checkbox-group v-model="form.config.setting_config.allowed_tools" class="tool-group-list">
|
|
|
+ <el-checkbox-group
|
|
|
+ v-model="form.config.setting_config.allowed_tools"
|
|
|
+ class="tool-group-list"
|
|
|
+ >
|
|
|
<div v-for="group in toolList" :key="group.name" class="tool-group-section">
|
|
|
<div class="tool-group-title">{{ group.name }}</div>
|
|
|
<div class="tool-group-card">
|
|
|
<div class="tool-group-card__items">
|
|
|
- <el-checkbox v-for="tool in group.tools" :key="tool.name" :label="tool.name">
|
|
|
+ <el-checkbox
|
|
|
+ v-for="tool in group.tools"
|
|
|
+ :key="tool.name"
|
|
|
+ :label="tool.name"
|
|
|
+ >
|
|
|
<div class="tool-option">
|
|
|
<div class="tool-option__label">{{ tool.label }}</div>
|
|
|
<div v-if="tool.description" class="tool-option__desc">
|
|
|
@@ -207,29 +333,50 @@
|
|
|
<div class="field-tip">选择 Agent 可以使用的工具。</div>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="最大迭代次数" prop="config.setting_config.max_iterations">
|
|
|
- <el-input-number v-model="form.config.setting_config.max_iterations" :min="1" :max="50"
|
|
|
- style="width: 100%" />
|
|
|
+ <el-input-number
|
|
|
+ v-model="form.config.setting_config.max_iterations"
|
|
|
+ :min="1"
|
|
|
+ :max="50"
|
|
|
+ style="width: 100%"
|
|
|
+ />
|
|
|
<div class="field-tip">Agent 执行任务时的最大推理步骤数。</div>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="LLM 调用超时" prop="config.setting_config.llm_call_timeout">
|
|
|
- <el-input-number v-model="form.config.setting_config.llm_call_timeout" :min="0" style="width: 100%" />
|
|
|
+ <el-input-number
|
|
|
+ v-model="form.config.setting_config.llm_call_timeout"
|
|
|
+ :min="0"
|
|
|
+ style="width: 100%"
|
|
|
+ />
|
|
|
<div class="field-tip">
|
|
|
单次 LLM 调用的最大等待时间(秒),超过此时间后调用将被中止。
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="MCP 服务" prop="config.setting_config.mcp_services">
|
|
|
<div class="selection-panel">
|
|
|
- <el-segmented v-model="form.config.setting_config.mcp_selection_mode" class="selection-segmented"
|
|
|
- :options="selectionMCPOptions" />
|
|
|
- <el-checkbox-group v-if="form.config.setting_config.mcp_selection_mode === 'selected'"
|
|
|
- v-model="form.config.setting_config.mcp_services" class="checkbox-grid">
|
|
|
- <el-checkbox v-for="item in mcpCheckboxOptions" :key="item.value" :label="item.value">
|
|
|
+ <el-segmented
|
|
|
+ v-model="form.config.setting_config.mcp_selection_mode"
|
|
|
+ class="selection-segmented"
|
|
|
+ :options="selectionMCPOptions"
|
|
|
+ />
|
|
|
+ <el-checkbox-group
|
|
|
+ v-if="form.config.setting_config.mcp_selection_mode === 'selected'"
|
|
|
+ v-model="form.config.setting_config.mcp_services"
|
|
|
+ class="checkbox-grid"
|
|
|
+ >
|
|
|
+ <el-checkbox
|
|
|
+ v-for="item in mcpCheckboxOptions"
|
|
|
+ :key="item.value"
|
|
|
+ :label="item.value"
|
|
|
+ >
|
|
|
{{ item.label }}
|
|
|
</el-checkbox>
|
|
|
</el-checkbox-group>
|
|
|
</div>
|
|
|
<div class="field-tip">选择 Agent 可以调用的 MCP 服务。</div>
|
|
|
- <div v-if="form.config.setting_config.mcp_selection_mode === 'selected'" class="field-tip">
|
|
|
+ <div
|
|
|
+ v-if="form.config.setting_config.mcp_selection_mode === 'selected'"
|
|
|
+ class="field-tip"
|
|
|
+ >
|
|
|
选择要启用的 MCP 服务。
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
@@ -243,11 +390,21 @@
|
|
|
<div class="collapse-body">
|
|
|
<el-form-item label="Skills 选择" prop="config.setting_config.selected_skills">
|
|
|
<div class="selection-panel">
|
|
|
- <el-segmented v-model="form.config.setting_config.skills_selection_mode" class="selection-segmented"
|
|
|
- :options="selectionMCPOptions" />
|
|
|
- <el-checkbox-group v-if="form.config.setting_config.skills_selection_mode === 'selected'"
|
|
|
- v-model="form.config.setting_config.selected_skills" class="skill-checkbox-list">
|
|
|
- <el-checkbox v-for="item in skillCheckboxOptions" :key="item.value" :label="item.value">
|
|
|
+ <el-segmented
|
|
|
+ v-model="form.config.setting_config.skills_selection_mode"
|
|
|
+ class="selection-segmented"
|
|
|
+ :options="selectionMCPOptions"
|
|
|
+ />
|
|
|
+ <el-checkbox-group
|
|
|
+ v-if="form.config.setting_config.skills_selection_mode === 'selected'"
|
|
|
+ v-model="form.config.setting_config.selected_skills"
|
|
|
+ class="skill-checkbox-list"
|
|
|
+ >
|
|
|
+ <el-checkbox
|
|
|
+ v-for="item in skillCheckboxOptions"
|
|
|
+ :key="item.value"
|
|
|
+ :label="item.value"
|
|
|
+ >
|
|
|
<div class="skill-option">
|
|
|
<div class="skill-option__label">{{ item.label }}</div>
|
|
|
<div v-if="item.description" class="skill-option__desc">
|
|
|
@@ -258,7 +415,10 @@
|
|
|
</el-checkbox-group>
|
|
|
</div>
|
|
|
<div class="field-tip">选择 Agent 可以使用的 Skills 范围。</div>
|
|
|
- <div v-if="form.config.setting_config.skills_selection_mode === 'selected'" class="field-tip">
|
|
|
+ <div
|
|
|
+ v-if="form.config.setting_config.skills_selection_mode === 'selected'"
|
|
|
+ class="field-tip"
|
|
|
+ >
|
|
|
选择要启用的 Skills。
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
@@ -269,33 +429,56 @@
|
|
|
<div class="tab-intro">配置知识库检索和排序的参数</div>
|
|
|
<div class="collapse-body">
|
|
|
<el-form-item label="向量召回数量" prop="config.search_config.embedding_top_k">
|
|
|
- <el-input-number v-model="form.config.search_config.embedding_top_k" :min="1" :max="50"
|
|
|
- style="width: 100%" />
|
|
|
+ <el-input-number
|
|
|
+ v-model="form.config.search_config.embedding_top_k"
|
|
|
+ :min="1"
|
|
|
+ :max="50"
|
|
|
+ style="width: 100%"
|
|
|
+ />
|
|
|
<div class="field-tip">向量检索返回的最大结果数量。</div>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="关键词阈值" prop="config.search_config.keyword_threshold">
|
|
|
<div class="switch-wrap w-full flex items-center gap-3">
|
|
|
- <el-slider v-model="form.config.search_config.keyword_threshold" :min="0" :max="1" :step="0.1"
|
|
|
- style="width: 50%" />
|
|
|
+ <el-slider
|
|
|
+ v-model="form.config.search_config.keyword_threshold"
|
|
|
+ :min="0"
|
|
|
+ :max="1"
|
|
|
+ :step="0.1"
|
|
|
+ style="width: 50%"
|
|
|
+ />
|
|
|
<div class="field-tip">关键词检索的最低相关性分数。</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="向量阈值" prop="config.search_config.vector_threshold">
|
|
|
<div class="switch-wrap w-full flex items-center gap-3">
|
|
|
- <el-slider v-model="form.config.search_config.vector_threshold" :min="0" :max="1" :step="0.1"
|
|
|
- style="width: 50%" />
|
|
|
+ <el-slider
|
|
|
+ v-model="form.config.search_config.vector_threshold"
|
|
|
+ :min="0"
|
|
|
+ :max="1"
|
|
|
+ :step="0.1"
|
|
|
+ style="width: 50%"
|
|
|
+ />
|
|
|
<div class="field-tip">向量检索的最低相似度分数。</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="重排数量" prop="config.search_config.rerank_top_k">
|
|
|
- <el-input-number v-model="form.config.search_config.rerank_top_k" :min="1" :max="20"
|
|
|
- style="width: 100%" />
|
|
|
+ <el-input-number
|
|
|
+ v-model="form.config.search_config.rerank_top_k"
|
|
|
+ :min="1"
|
|
|
+ :max="20"
|
|
|
+ style="width: 100%"
|
|
|
+ />
|
|
|
<div class="field-tip">重排序后保留的最大结果数量。</div>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="重排阈值" prop="config.search_config.rerank_threshold">
|
|
|
<div class="switch-wrap w-full flex items-center gap-3">
|
|
|
- <el-slider v-model="form.config.search_config.rerank_threshold" :min="-10" :max="10" :step="0.1"
|
|
|
- style="width: 50%" />
|
|
|
+ <el-slider
|
|
|
+ v-model="form.config.search_config.rerank_threshold"
|
|
|
+ :min="-10"
|
|
|
+ :max="10"
|
|
|
+ :step="0.1"
|
|
|
+ style="width: 50%"
|
|
|
+ />
|
|
|
<div class="field-tip">重排序的最低相关性分数。</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
@@ -306,32 +489,53 @@
|
|
|
<el-switch v-model="form.config.advanced_config.enable_query_expansion" />
|
|
|
<div class="field-tip">自动扩展查询词以提高召回率。</div>
|
|
|
</div>
|
|
|
-
|
|
|
</el-form-item>
|
|
|
<el-form-item label="兜底策略" prop="config.advanced_config.fallback_strategy">
|
|
|
- <el-segmented v-model="form.config.advanced_config.fallback_strategy" class="selection-segmented"
|
|
|
- :options="fallbackStrategyOptions" />
|
|
|
+ <el-segmented
|
|
|
+ v-model="form.config.advanced_config.fallback_strategy"
|
|
|
+ class="selection-segmented"
|
|
|
+ :options="fallbackStrategyOptions"
|
|
|
+ />
|
|
|
<div class="field-tip">当无法从知识库找到相关内容时的处理方式。</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item v-if="form.config.advanced_config.fallback_strategy === 'model'" label="兜底提示词"
|
|
|
- prop="config.advanced_config.fallback_prompt">
|
|
|
+ <el-form-item
|
|
|
+ v-if="form.config.advanced_config.fallback_strategy === 'model'"
|
|
|
+ label="兜底提示词"
|
|
|
+ prop="config.advanced_config.fallback_prompt"
|
|
|
+ >
|
|
|
<div class="prompt-field">
|
|
|
<div class="prompt-toolbar prompt-toolbar--end">
|
|
|
- <el-button class="prompt-template-trigger" text :icon="DocumentCopy"
|
|
|
- @click="openPromptTemplatePicker('fallbackPrompt')">
|
|
|
+ <el-button
|
|
|
+ class="prompt-template-trigger"
|
|
|
+ text
|
|
|
+ :icon="DocumentCopy"
|
|
|
+ @click="openPromptTemplatePicker('fallbackPrompt')"
|
|
|
+ >
|
|
|
模板选择
|
|
|
</el-button>
|
|
|
</div>
|
|
|
- <el-input v-model="form.config.advanced_config.fallback_prompt" type="textarea" :rows="3"
|
|
|
- placeholder="请输入模型兜底时使用的提示词" />
|
|
|
+ <el-input
|
|
|
+ v-model="form.config.advanced_config.fallback_prompt"
|
|
|
+ type="textarea"
|
|
|
+ :rows="3"
|
|
|
+ placeholder="请输入模型兜底时使用的提示词"
|
|
|
+ />
|
|
|
</div>
|
|
|
<div class="field-tip">
|
|
|
当无法从知识库找到相关内容时,用于引导模型生成兜底回复。
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item v-else label="固定提示词" prop="config.advanced_config.fallback_response">
|
|
|
- <el-input v-model="form.config.advanced_config.fallback_response" type="textarea" :rows="3"
|
|
|
- placeholder="请输入固定兜底内容" />
|
|
|
+ <el-form-item
|
|
|
+ v-else
|
|
|
+ label="固定提示词"
|
|
|
+ prop="config.advanced_config.fallback_response"
|
|
|
+ >
|
|
|
+ <el-input
|
|
|
+ v-model="form.config.advanced_config.fallback_response"
|
|
|
+ type="textarea"
|
|
|
+ :rows="3"
|
|
|
+ placeholder="请输入固定兜底内容"
|
|
|
+ />
|
|
|
<div class="field-tip">当无法回答时返回的固定文本。</div>
|
|
|
</el-form-item>
|
|
|
</div>
|
|
|
@@ -347,36 +551,71 @@
|
|
|
<div class="field-tip">启用后智能体可以搜索互联网获取信息。</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item v-if="form.config.web_search_config.web_search_enabled" label="选择搜索引擎"
|
|
|
- prop="config.web_search_config.web_search_provider_id">
|
|
|
- <el-select v-model="form.config.web_search_config.web_search_provider_id" filterable remote
|
|
|
- reserve-keyword :remote-method="searchWebSearchProviders" :loading="webSearchProviderLoading"
|
|
|
- clearable placeholder="请输入关键词搜索" style="width: 100%">
|
|
|
- <el-option v-for="item in webSearchProviderOptions" :key="item.value" :label="item.label"
|
|
|
- :value="item.value" />
|
|
|
+ <el-form-item
|
|
|
+ v-if="form.config.web_search_config.web_search_enabled"
|
|
|
+ label="选择搜索引擎"
|
|
|
+ prop="config.web_search_config.web_search_provider_id"
|
|
|
+ >
|
|
|
+ <el-select
|
|
|
+ v-model="form.config.web_search_config.web_search_provider_id"
|
|
|
+ filterable
|
|
|
+ remote
|
|
|
+ reserve-keyword
|
|
|
+ :remote-method="searchWebSearchProviders"
|
|
|
+ :loading="webSearchProviderLoading"
|
|
|
+ clearable
|
|
|
+ placeholder="请输入关键词搜索"
|
|
|
+ style="width: 100%"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="item in webSearchProviderOptions"
|
|
|
+ :key="item.value"
|
|
|
+ :label="item.label"
|
|
|
+ :value="item.value"
|
|
|
+ />
|
|
|
</el-select>
|
|
|
<div class="field-tip">为此智能体指定搜索引擎,留空则使用默认搜索引擎。</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item v-if="form.config.web_search_config.web_search_enabled" label="最大搜索结果数"
|
|
|
- prop="config.web_search_config.web_search_max_results">
|
|
|
+ <el-form-item
|
|
|
+ v-if="form.config.web_search_config.web_search_enabled"
|
|
|
+ label="最大搜索结果数"
|
|
|
+ prop="config.web_search_config.web_search_max_results"
|
|
|
+ >
|
|
|
<div class="switch-wrap w-full flex items-center gap-3">
|
|
|
- <el-slider v-model="form.config.web_search_config.web_search_max_results" :min="1" :max="10"
|
|
|
- style="width: 50%" />
|
|
|
+ <el-slider
|
|
|
+ v-model="form.config.web_search_config.web_search_max_results"
|
|
|
+ :min="1"
|
|
|
+ :max="10"
|
|
|
+ style="width: 50%"
|
|
|
+ />
|
|
|
<div class="field-tip">每次搜索返回的最大结果数量。</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item v-if="form.config.web_search_config.web_search_enabled" label-width="130px" label="自动抓取页面内容"
|
|
|
- prop="config.web_search_config.web_fetch_enabled">
|
|
|
+ <el-form-item
|
|
|
+ v-if="form.config.web_search_config.web_search_enabled"
|
|
|
+ label-width="130px"
|
|
|
+ label="自动抓取页面内容"
|
|
|
+ prop="config.web_search_config.web_fetch_enabled"
|
|
|
+ >
|
|
|
<div class="switch-wrap flex items-center gap-2">
|
|
|
<el-switch v-model="form.config.web_search_config.web_fetch_enabled" />
|
|
|
- <div class="field-tip">ReRank 后自动抓取排名靠前的网页完整内容,提升回答质量。</div>
|
|
|
+ <div class="field-tip">
|
|
|
+ ReRank 后自动抓取排名靠前的网页完整内容,提升回答质量。
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item v-if="form.config.web_search_config.web_fetch_enabled" label="抓取页面数"
|
|
|
- prop="config.web_search_config.web_fetch_top_n">
|
|
|
+ <el-form-item
|
|
|
+ v-if="form.config.web_search_config.web_fetch_enabled"
|
|
|
+ label="抓取页面数"
|
|
|
+ prop="config.web_search_config.web_fetch_top_n"
|
|
|
+ >
|
|
|
<div class="switch-wrap w-full flex items-center gap-3">
|
|
|
- <el-slider v-model="form.config.web_search_config.web_fetch_top_n" :min="1" :max="10"
|
|
|
- style="width: 50%" />
|
|
|
+ <el-slider
|
|
|
+ v-model="form.config.web_search_config.web_fetch_top_n"
|
|
|
+ :min="1"
|
|
|
+ :max="10"
|
|
|
+ style="width: 50%"
|
|
|
+ />
|
|
|
<div class="field-tip">Rerank 后最多抓取几个网页的完整内容。</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
@@ -392,11 +631,26 @@
|
|
|
<div class="field-tip">启用后用户可在对话中上传图片进行多模态问答。</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item v-if="form.config.img_vlm_config.image_upload_enabled" label="VLM 模型设置"
|
|
|
- prop="config.img_vlm_config.vlm_model_id">
|
|
|
- <el-select v-model="form.config.img_vlm_config.vlm_model_id" filterable remote reserve-keyword
|
|
|
- :remote-method="searchVlmModels" :loading="vlmModelsLoading" style="width: 100%">
|
|
|
- <el-option v-for="model in vlmModels" :key="model.id" :label="modelLabel(model)" :value="model.id" />
|
|
|
+ <el-form-item
|
|
|
+ v-if="form.config.img_vlm_config.image_upload_enabled"
|
|
|
+ label="VLM 模型设置"
|
|
|
+ prop="config.img_vlm_config.vlm_model_id"
|
|
|
+ >
|
|
|
+ <el-select
|
|
|
+ v-model="form.config.img_vlm_config.vlm_model_id"
|
|
|
+ filterable
|
|
|
+ remote
|
|
|
+ reserve-keyword
|
|
|
+ :remote-method="searchVlmModels"
|
|
|
+ :loading="vlmModelsLoading"
|
|
|
+ style="width: 100%"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="model in vlmModels"
|
|
|
+ :key="model.id"
|
|
|
+ :label="modelLabel(model)"
|
|
|
+ :value="model.id"
|
|
|
+ />
|
|
|
</el-select>
|
|
|
<div class="field-tip">用于图片分析的视觉语言模型。</div>
|
|
|
</el-form-item>
|
|
|
@@ -408,11 +662,27 @@
|
|
|
</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item v-if="form.config.img_vlm_config.audio_upload_enabled" label="ASR 模型设置"
|
|
|
- prop="config.img_vlm_config.asr_model_id">
|
|
|
- <el-select v-model="form.config.img_vlm_config.asr_model_id" filterable remote reserve-keyword
|
|
|
- :remote-method="searchAsrModels" :loading="asrModelsLoading" clearable style="width: 100%">
|
|
|
- <el-option v-for="model in asrModels" :key="model.id" :label="modelLabel(model)" :value="model.id" />
|
|
|
+ <el-form-item
|
|
|
+ v-if="form.config.img_vlm_config.audio_upload_enabled"
|
|
|
+ label="ASR 模型设置"
|
|
|
+ prop="config.img_vlm_config.asr_model_id"
|
|
|
+ >
|
|
|
+ <el-select
|
|
|
+ v-model="form.config.img_vlm_config.asr_model_id"
|
|
|
+ filterable
|
|
|
+ remote
|
|
|
+ reserve-keyword
|
|
|
+ :remote-method="searchAsrModels"
|
|
|
+ :loading="asrModelsLoading"
|
|
|
+ clearable
|
|
|
+ style="width: 100%"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="model in asrModels"
|
|
|
+ :key="model.id"
|
|
|
+ :label="modelLabel(model)"
|
|
|
+ :value="model.id"
|
|
|
+ />
|
|
|
</el-select>
|
|
|
<div class="field-tip">
|
|
|
用于音频转录的语音识别模型,未配置时音频文件将以占位符形式传递。
|
|
|
@@ -430,10 +700,17 @@
|
|
|
<div class="field-tip">开启后将保留历史对话上下文。</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item v-if="form.config.multiple_config.multi_turn_enabled" label="保留轮数"
|
|
|
- prop="config.multiple_config.history_turns">
|
|
|
- <el-input-number v-model="form.config.multiple_config.history_turns" :min="1" :max="20"
|
|
|
- style="width: 100%" />
|
|
|
+ <el-form-item
|
|
|
+ v-if="form.config.multiple_config.multi_turn_enabled"
|
|
|
+ label="保留轮数"
|
|
|
+ prop="config.multiple_config.history_turns"
|
|
|
+ >
|
|
|
+ <el-input-number
|
|
|
+ v-model="form.config.multiple_config.history_turns"
|
|
|
+ :min="1"
|
|
|
+ :max="20"
|
|
|
+ style="width: 100%"
|
|
|
+ />
|
|
|
<div class="field-tip">保留最近几轮对话作为上下文。</div>
|
|
|
</el-form-item>
|
|
|
<div v-if="form.mode === 'quick-answer'">
|
|
|
@@ -443,48 +720,81 @@
|
|
|
<div class="field-tip">多轮对话时自动改写用户问题,消解指代和补全省略。</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item v-if="form.config.advanced_config.enable_rewrite" label="改写系统提示词"
|
|
|
- prop="config.advanced_config.rewrite_prompt_system">
|
|
|
+ <el-form-item
|
|
|
+ v-if="form.config.advanced_config.enable_rewrite"
|
|
|
+ label="改写系统提示词"
|
|
|
+ prop="config.advanced_config.rewrite_prompt_system"
|
|
|
+ >
|
|
|
<div class="prompt-field">
|
|
|
<div class="prompt-toolbar">
|
|
|
<div class="prompt-variable-row">
|
|
|
<span class="prompt-variable-label">可用变量</span>
|
|
|
- <el-tag v-for="variable in rewriteVariables" :key="variable"
|
|
|
- class="prompt-variable-tag" type="info" effect="plain"
|
|
|
- @click="insertPromptVariable('rewritePromptSystem', variable)">
|
|
|
+ <el-tag
|
|
|
+ v-for="variable in rewriteVariables"
|
|
|
+ :key="variable"
|
|
|
+ class="prompt-variable-tag"
|
|
|
+ type="info"
|
|
|
+ effect="plain"
|
|
|
+ @click="insertPromptVariable('rewritePromptSystem', variable)"
|
|
|
+ >
|
|
|
{{ formatPromptVariable(variable) }}
|
|
|
</el-tag>
|
|
|
</div>
|
|
|
- <el-button class="prompt-template-trigger" text :icon="DocumentCopy"
|
|
|
- @click="openPromptTemplatePicker('rewritePromptSystem')">
|
|
|
+ <el-button
|
|
|
+ class="prompt-template-trigger"
|
|
|
+ text
|
|
|
+ :icon="DocumentCopy"
|
|
|
+ @click="openPromptTemplatePicker('rewritePromptSystem')"
|
|
|
+ >
|
|
|
模板选择
|
|
|
</el-button>
|
|
|
</div>
|
|
|
- <el-input ref="rewritePromptSystemInputRef"
|
|
|
- v-model="form.config.advanced_config.rewrite_prompt_system" type="textarea" :rows="3"
|
|
|
- placeholder="请输入问题改写时的系统提示词" />
|
|
|
+ <el-input
|
|
|
+ ref="rewritePromptSystemInputRef"
|
|
|
+ v-model="form.config.advanced_config.rewrite_prompt_system"
|
|
|
+ type="textarea"
|
|
|
+ :rows="3"
|
|
|
+ placeholder="请输入问题改写时的系统提示词"
|
|
|
+ />
|
|
|
</div>
|
|
|
<div class="field-tip">用于问题改写的系统提示词。</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item v-if="form.config.advanced_config.enable_rewrite" label="改写用户提示词"
|
|
|
- prop="config.advanced_config.rewrite_prompt_user">
|
|
|
+ <el-form-item
|
|
|
+ v-if="form.config.advanced_config.enable_rewrite"
|
|
|
+ label="改写用户提示词"
|
|
|
+ prop="config.advanced_config.rewrite_prompt_user"
|
|
|
+ >
|
|
|
<div class="prompt-field">
|
|
|
<div class="prompt-toolbar">
|
|
|
<div class="prompt-variable-row">
|
|
|
<span class="prompt-variable-label">可用变量</span>
|
|
|
- <el-tag v-for="variable in rewriteVariables" :key="variable"
|
|
|
- class="prompt-variable-tag" type="info" effect="plain"
|
|
|
- @click="insertPromptVariable('rewritePromptUser', variable)">
|
|
|
+ <el-tag
|
|
|
+ v-for="variable in rewriteVariables"
|
|
|
+ :key="variable"
|
|
|
+ class="prompt-variable-tag"
|
|
|
+ type="info"
|
|
|
+ effect="plain"
|
|
|
+ @click="insertPromptVariable('rewritePromptUser', variable)"
|
|
|
+ >
|
|
|
{{ formatPromptVariable(variable) }}
|
|
|
</el-tag>
|
|
|
</div>
|
|
|
- <el-button class="prompt-template-trigger" text :icon="DocumentCopy"
|
|
|
- @click="openPromptTemplatePicker('rewritePromptUser')">
|
|
|
+ <el-button
|
|
|
+ class="prompt-template-trigger"
|
|
|
+ text
|
|
|
+ :icon="DocumentCopy"
|
|
|
+ @click="openPromptTemplatePicker('rewritePromptUser')"
|
|
|
+ >
|
|
|
模板选择
|
|
|
</el-button>
|
|
|
</div>
|
|
|
- <el-input ref="rewritePromptUserInputRef" v-model="form.config.advanced_config.rewrite_prompt_user"
|
|
|
- type="textarea" :rows="3" placeholder="请输入问题改写时的用户提示词" />
|
|
|
+ <el-input
|
|
|
+ ref="rewritePromptUserInputRef"
|
|
|
+ v-model="form.config.advanced_config.rewrite_prompt_user"
|
|
|
+ type="textarea"
|
|
|
+ :rows="3"
|
|
|
+ placeholder="请输入问题改写时的用户提示词"
|
|
|
+ />
|
|
|
</div>
|
|
|
<div class="field-tip">用于问题改写的用户提示词模板。</div>
|
|
|
</el-form-item>
|
|
|
@@ -497,8 +807,14 @@
|
|
|
|
|
|
<el-dialog v-model="emojiDialogVisible" title="选择 Emoji 图标" width="520px" append-to-body>
|
|
|
<div class="emoji-picker-wrap">
|
|
|
- <EmojiPicker :native="true" :hide-search="false" :disable-skin-tones="false" :display-recent="true"
|
|
|
- :static-texts="{ placeholder: '搜索 Emoji' }" @select="handleEmojiSelect" />
|
|
|
+ <EmojiPicker
|
|
|
+ :native="true"
|
|
|
+ :hide-search="false"
|
|
|
+ :disable-skin-tones="false"
|
|
|
+ :display-recent="true"
|
|
|
+ :static-texts="{ placeholder: '搜索 Emoji' }"
|
|
|
+ @select="handleEmojiSelect"
|
|
|
+ />
|
|
|
</div>
|
|
|
</el-dialog>
|
|
|
|
|
|
@@ -525,8 +841,7 @@ import { DocumentCopy } from '@element-plus/icons-vue'
|
|
|
import { agentApplication, aiModel, knowledge, resource } from '@repo/api-service'
|
|
|
import EmojiPicker from 'vue3-emoji-picker'
|
|
|
import 'vue3-emoji-picker/css'
|
|
|
-import PromptModal from './PromptModal.vue'
|
|
|
-import type { PromptFieldKey } from './promptTypes'
|
|
|
+import PromptModal, { type PromptFieldKey } from '@/features/PromptModal.vue'
|
|
|
import type {
|
|
|
AgentFormData,
|
|
|
AgentItem,
|
|
|
@@ -559,14 +874,16 @@ const vlmModelsLoading = ref(false)
|
|
|
const asrModelsLoading = ref(false)
|
|
|
const kbOptions = ref<KnowledgeItem[]>([])
|
|
|
const kbLoading = ref(false)
|
|
|
-const toolList = ref<Array<{
|
|
|
- name: string;
|
|
|
- tools: {
|
|
|
- description: string;
|
|
|
- label: string;
|
|
|
- name: string;
|
|
|
- }[];
|
|
|
-}>>([])
|
|
|
+const toolList = ref<
|
|
|
+ Array<{
|
|
|
+ name: string
|
|
|
+ tools: {
|
|
|
+ description: string
|
|
|
+ label: string
|
|
|
+ name: string
|
|
|
+ }[]
|
|
|
+ }>
|
|
|
+>([])
|
|
|
const webSearchProviderOptions = ref<AgentSelectOption[]>([])
|
|
|
const webSearchProviderLoading = ref(false)
|
|
|
const mcpServiceOptions = ref<AgentSelectOption[]>([])
|
|
|
@@ -995,15 +1312,18 @@ function buildSubmitConfig() {
|
|
|
}
|
|
|
|
|
|
async function fetchModels(keyword = '', type = '') {
|
|
|
- const res = await aiModel.postModelPageList({
|
|
|
- keyword: keyword.trim(),
|
|
|
- type,
|
|
|
- source: '',
|
|
|
- pageIndex: 1,
|
|
|
- pageSize: modelPageSize
|
|
|
- }, {
|
|
|
- requestKey: `${modelRequestKeyPrefix}-${type || 'all'}`
|
|
|
- })
|
|
|
+ const res = await aiModel.postModelPageList(
|
|
|
+ {
|
|
|
+ keyword: keyword.trim(),
|
|
|
+ type,
|
|
|
+ source: '',
|
|
|
+ pageIndex: 1,
|
|
|
+ pageSize: modelPageSize
|
|
|
+ },
|
|
|
+ {
|
|
|
+ requestKey: `${modelRequestKeyPrefix}-${type || 'all'}`
|
|
|
+ }
|
|
|
+ )
|
|
|
if (res.isSuccess) {
|
|
|
modelOptions.value = mergeModelOptions((res.result?.model || []) as ModelItem[])
|
|
|
}
|
|
|
@@ -1734,7 +2054,6 @@ watch(
|
|
|
margin-bottom: 12px;
|
|
|
height: auto;
|
|
|
white-space: normal;
|
|
|
-
|
|
|
}
|
|
|
|
|
|
.skill-checkbox-list :deep(.el-checkbox__label) {
|
|
|
@@ -1850,7 +2169,6 @@ watch(
|
|
|
.prompt-toolbar {
|
|
|
flex-direction: column;
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
}
|
|
|
</style>
|