|
|
@@ -1,7 +1,7 @@
|
|
|
<template>
|
|
|
<el-dialog
|
|
|
v-model="visible"
|
|
|
- :title="configOnly ? '配置智能体' : formId ? '编辑智能体' : '新建智能体'"
|
|
|
+ :title="configOnly ? t('pages.agent.editModal.configAgent') : formId ? t('pages.agent.editModal.editAgent') : t('pages.agent.editModal.createAgent')"
|
|
|
class="agent-modal"
|
|
|
append-to-body
|
|
|
fullscreen
|
|
|
@@ -16,58 +16,58 @@
|
|
|
label-width="120px"
|
|
|
>
|
|
|
<el-tabs v-model="activeTab" tab-position="left" class="settings-tabs">
|
|
|
- <el-tab-pane label="基础信息" name="basic">
|
|
|
+ <el-tab-pane :label="t('pages.agent.editModal.tabBasic')" name="basic">
|
|
|
<div class="tab-intro">
|
|
|
- {{ configOnly ? '配置智能体的运行模式和参数' : '配置智能体的基本信息' }}
|
|
|
+ {{ configOnly ? t('pages.agent.editModal.configAgentDesc') : t('pages.agent.editModal.createAgentDesc') }}
|
|
|
</div>
|
|
|
<div class="collapse-body">
|
|
|
- <el-form-item label="运行模式" prop="mode">
|
|
|
+ <el-form-item :label="t('pages.agent.editModal.modeLabel')" 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' }
|
|
|
+ { label: t('pages.agent.editModal.modeQuickAnswer'), value: 'quick-answer' },
|
|
|
+ { label: t('pages.agent.editModal.modeSmartReasoning'), value: 'smart-reasoning' }
|
|
|
]"
|
|
|
/>
|
|
|
- <div class="field-tip">多步思考,深度分析复杂问题。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.modeTip') }}</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
<div class="mode-tip ml-120px">
|
|
|
- <div class="mode-tip__label">当前说明</div>
|
|
|
+ <div class="mode-tip__label">{{ t('pages.agent.editModal.modeTipLabel') }}</div>
|
|
|
<p v-if="form.mode === 'quick-answer'">
|
|
|
- 适合问答与知识检索场景,可继续完善上下文模板、查询扩展和多轮对话。
|
|
|
+ {{ t('pages.agent.editModal.quickAnswerDesc') }}
|
|
|
</p>
|
|
|
- <p v-else>适合工具调用与多步推理场景,可继续配置工具、MCP 服务和 Skills。</p>
|
|
|
+ <p v-else>{{ t('pages.agent.editModal.smartReasoningDesc') }}</p>
|
|
|
</div>
|
|
|
- <el-form-item v-if="!configOnly" label="名称" prop="name">
|
|
|
- <el-input v-model="form.name" placeholder="请输入智能体名称" />
|
|
|
- <div class="field-tip">为智能体设置一个易于识别的名称。</div>
|
|
|
+ <el-form-item v-if="!configOnly" :label="t('pages.agent.editModal.nameLabel')" prop="name">
|
|
|
+ <el-input v-model="form.name" :placeholder="t('pages.agent.editModal.namePlaceholder')" />
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.nameTip') }}</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item v-if="!configOnly" label="图标" prop="avatar">
|
|
|
+ <el-form-item v-if="!configOnly" :label="t('pages.agent.editModal.avatarLabel')" prop="avatar">
|
|
|
<div class="emoji-field">
|
|
|
<el-button class="emoji-trigger" @click="emojiDialogVisible = true">
|
|
|
<span class="emoji-preview">{{ selectedEmoji }}</span>
|
|
|
- <span>{{ form.avatar ? '更换 Emoji' : '选择 Emoji' }}</span>
|
|
|
+ <span>{{ form.avatar ? t('pages.agent.editModal.changeEmoji') : t('pages.agent.editModal.selectEmoji') }}</span>
|
|
|
</el-button>
|
|
|
- <el-button v-if="form.avatar" text @click="clearEmoji">清空</el-button>
|
|
|
+ <el-button v-if="form.avatar" text @click="clearEmoji">{{ t('pages.agent.editModal.clearEmoji') }}</el-button>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item v-if="!configOnly" label="描述" prop="description">
|
|
|
+ <el-form-item v-if="!configOnly" :label="t('pages.agent.editModal.descriptionLabel')" prop="description">
|
|
|
<el-input
|
|
|
v-model="form.description"
|
|
|
type="textarea"
|
|
|
:rows="3"
|
|
|
- placeholder="请输入智能体描述"
|
|
|
+ :placeholder="t('pages.agent.editModal.descriptionPlaceholder')"
|
|
|
/>
|
|
|
- <div class="field-tip">简要描述智能体的用途和特点。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.descriptionTip') }}</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="系统提示词" prop="config.basic_config.system_prompt">
|
|
|
+ <el-form-item :label="t('pages.agent.editModal.systemPromptLabel')" prop="config.basic_config.system_prompt">
|
|
|
<div class="prompt-field">
|
|
|
<div class="prompt-toolbar">
|
|
|
<div class="prompt-variable-row">
|
|
|
- <span class="prompt-variable-label">支持变量</span>
|
|
|
+ <span class="prompt-variable-label">{{ t('pages.agent.editModal.supportVariables') }}</span>
|
|
|
<el-tag
|
|
|
v-for="variable in systemPromptVariables"
|
|
|
:key="variable"
|
|
|
@@ -90,7 +90,7 @@
|
|
|
)
|
|
|
"
|
|
|
>
|
|
|
- 模板选择
|
|
|
+ {{ t('pages.agent.editModal.templateSelect') }}
|
|
|
</el-button>
|
|
|
</div>
|
|
|
<el-input
|
|
|
@@ -99,20 +99,20 @@
|
|
|
mode="prompt"
|
|
|
type="textarea"
|
|
|
:rows="15"
|
|
|
- placeholder="请输入系统提示词,可直接编写角色、目标、约束和回答风格"
|
|
|
+ :placeholder="t('pages.agent.editModal.systemPromptPlaceholder')"
|
|
|
/>
|
|
|
</div>
|
|
|
- <div class="field-tip">自定义系统提示词,定义智能体的行为和角色。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.systemPromptTip') }}</div>
|
|
|
</el-form-item>
|
|
|
<el-form-item
|
|
|
v-if="form.mode === 'quick-answer'"
|
|
|
- label="上下文模板"
|
|
|
+ :label="t('pages.agent.editModal.contextTemplateLabel')"
|
|
|
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>
|
|
|
+ <span class="prompt-variable-label">{{ t('pages.agent.editModal.supportVariables') }}</span>
|
|
|
<el-tag
|
|
|
v-for="variable in quickAnswerVariables"
|
|
|
:key="variable"
|
|
|
@@ -130,7 +130,7 @@
|
|
|
:icon="DocumentCopy"
|
|
|
@click="openPromptTemplatePicker('contextTemplate', 'context-template')"
|
|
|
>
|
|
|
- 模板选择
|
|
|
+ {{ t('pages.agent.editModal.templateSelect') }}
|
|
|
</el-button>
|
|
|
</div>
|
|
|
<el-input
|
|
|
@@ -139,18 +139,18 @@
|
|
|
mode="prompt"
|
|
|
type="textarea"
|
|
|
:rows="15"
|
|
|
- placeholder="请输入上下文模板,用于约束问答模式下的上下文组织方式"
|
|
|
+ :placeholder="t('pages.agent.editModal.contextTemplatePlaceholder')"
|
|
|
/>
|
|
|
</div>
|
|
|
- <div class="field-tip">定义如何将检索到的内容格式化后传递给模型。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.contextTemplateTip') }}</div>
|
|
|
</el-form-item>
|
|
|
</div>
|
|
|
</el-tab-pane>
|
|
|
|
|
|
- <el-tab-pane label="模型配置" name="model">
|
|
|
- <div class="tab-intro">配置智能体的模型参数</div>
|
|
|
+ <el-tab-pane :label="t('pages.agent.editModal.tabModel')" name="model">
|
|
|
+ <div class="tab-intro">{{ t('pages.agent.editModal.modelTabIntro') }}</div>
|
|
|
<div class="collapse-body">
|
|
|
- <el-form-item label="模型" prop="config.model_config.model_id">
|
|
|
+ <el-form-item :label="t('pages.agent.editModal.modelLabel')" prop="config.model_config.model_id">
|
|
|
<el-select
|
|
|
v-model="form.config.model_config.model_id"
|
|
|
filterable
|
|
|
@@ -164,9 +164,9 @@
|
|
|
:value="model.id"
|
|
|
/>
|
|
|
</el-select>
|
|
|
- <div class="field-tip">选择智能体使用的大语言模型。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.modelTip') }}</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="温度" prop="config.model_config.temperature">
|
|
|
+ <el-form-item :label="t('pages.agent.editModal.temperatureLabel')" 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"
|
|
|
@@ -175,30 +175,30 @@
|
|
|
:step="0.1"
|
|
|
style="width: 50%"
|
|
|
/>
|
|
|
- <div class="field-tip">控制输出的随机性,0 最确定,1 最随机。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.temperatureTip') }}</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="最大 Token 数" prop="config.model_config.max_completion_tokens">
|
|
|
+ <el-form-item :label="t('pages.agent.editModal.maxTokensLabel')" prop="config.model_config.max_completion_tokens">
|
|
|
<el-input-number
|
|
|
v-model="form.config.model_config.max_completion_tokens"
|
|
|
:min="1"
|
|
|
style="width: 100%"
|
|
|
/>
|
|
|
- <div class="field-tip">限制模型单次回复可生成的最大 Token 数。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.maxTokensTip') }}</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="思考模式" prop="config.model_config.thinking">
|
|
|
+ <el-form-item :label="t('pages.agent.editModal.thinkingModeLabel')" prop="config.model_config.thinking">
|
|
|
<div class="switch-wrap flex items-center gap-2">
|
|
|
<el-switch v-model="form.config.model_config.thinking" />
|
|
|
- <div class="field-tip">启用模型的扩展思考能力,需要模型本身支持。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.thinkingModeTip') }}</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
</div>
|
|
|
</el-tab-pane>
|
|
|
|
|
|
- <el-tab-pane label="知识库" name="knowledge">
|
|
|
- <div class="tab-intro">配置智能体可访问的知识库</div>
|
|
|
+ <el-tab-pane :label="t('pages.agent.editModal.tabKnowledge')" name="knowledge">
|
|
|
+ <div class="tab-intro">{{ t('pages.agent.editModal.kbTabIntro') }}</div>
|
|
|
<div class="collapse-body">
|
|
|
- <el-form-item label="关联知识库" prop="config.kb_config.knowledge_bases">
|
|
|
+ <el-form-item :label="t('pages.agent.editModal.kbRelationLabel')" prop="config.kb_config.knowledge_bases">
|
|
|
<div class="selection-panel">
|
|
|
<el-segmented
|
|
|
v-model="form.config.kb_config.kb_selection_mode"
|
|
|
@@ -219,15 +219,15 @@
|
|
|
</el-checkbox>
|
|
|
</el-checkbox-group>
|
|
|
</div>
|
|
|
- <div class="field-tip">选择智能体可访问的知识库范围。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.kbTip') }}</div>
|
|
|
<div
|
|
|
v-if="form.config.kb_config.kb_selection_mode === 'selected'"
|
|
|
class="field-tip"
|
|
|
>
|
|
|
- 选择要关联的知识库,包括协作知识库。
|
|
|
+ {{ t('pages.agent.editModal.kbSelectTip') }}
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="知识的文件类型" prop="config.kb_config.supported_file_types">
|
|
|
+ <el-form-item :label="t('pages.agent.editModal.fileTypeLabel')" prop="config.kb_config.supported_file_types">
|
|
|
<el-select
|
|
|
v-model="form.config.kb_config.supported_file_types"
|
|
|
multiple
|
|
|
@@ -242,9 +242,9 @@
|
|
|
:value="item"
|
|
|
/>
|
|
|
</el-select>
|
|
|
- <div class="field-tip">限制可选择的文件类型,留空表示支持所有类型。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.fileTypeTip') }}</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="ReRank 模型" prop="config.model_config.rerank_model_id">
|
|
|
+ <el-form-item :label="t('pages.agent.editModal.rerankModelLabel')" prop="config.model_config.rerank_model_id">
|
|
|
<el-select
|
|
|
v-model="form.config.model_config.rerank_model_id"
|
|
|
filterable
|
|
|
@@ -257,21 +257,21 @@
|
|
|
:value="model.id"
|
|
|
/>
|
|
|
</el-select>
|
|
|
- <div class="field-tip">用于对知识库检索结果进行重排序,提高回答准确性。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.rerankModelTip') }}</div>
|
|
|
</el-form-item>
|
|
|
<div class="subsection ml-120px">
|
|
|
- <div class="subsection-title">FAQ 优化策略</div>
|
|
|
+ <div class="subsection-title">{{ t('pages.agent.editModal.faqTitle') }}</div>
|
|
|
<div class="subsection-tip">
|
|
|
- 当知识库中包含 FAQ(问答对)时,可以启用此策略让 FAQ 答案优先于普通文档。
|
|
|
+ {{ t('pages.agent.editModal.faqTip') }}
|
|
|
</div>
|
|
|
- <el-form-item label="启动 FAQ 优先" prop="config.faq_config.faq_priority_enabled">
|
|
|
+ <el-form-item :label="t('pages.agent.editModal.faqPriorityLabel')" prop="config.faq_config.faq_priority_enabled">
|
|
|
<div class="switch-wrap flex items-center gap-2">
|
|
|
<el-switch v-model="form.config.faq_config.faq_priority_enabled" />
|
|
|
- <div class="field-tip">FAQ 答案将优先于普通文档被引用,提高回答准确性。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.faqPriorityTip') }}</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
<el-form-item
|
|
|
- label="直接问答阈值"
|
|
|
+ :label="t('pages.agent.editModal.directAnswerThresholdLabel')"
|
|
|
prop="config.faq_config.faq_direct_answer_threshold"
|
|
|
>
|
|
|
<div class="switch-wrap w-full flex items-center gap-3">
|
|
|
@@ -282,10 +282,10 @@
|
|
|
:step="0.1"
|
|
|
style="width: 50%"
|
|
|
/>
|
|
|
- <div class="field-tip">当问题与 FAQ 相似度超过此值时,直接使用 FAQ 答案。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.directAnswerThresholdTip') }}</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="FAQ 分数加权" prop="config.faq_config.faq_score_boost">
|
|
|
+ <el-form-item :label="t('pages.agent.editModal.faqScoreBoostLabel')" 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"
|
|
|
@@ -294,17 +294,17 @@
|
|
|
:step="0.1"
|
|
|
style="width: 50%"
|
|
|
/>
|
|
|
- <div class="field-tip">FAQ 结果的相关性分数乘以此系数,使其排序更靠前。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.faqScoreBoostTip') }}</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
</div>
|
|
|
</div>
|
|
|
</el-tab-pane>
|
|
|
|
|
|
- <el-tab-pane v-if="form.mode === 'smart-reasoning'" label="工具配置" name="tools">
|
|
|
- <div class="tab-intro">配置 Agent 可以使用的工具</div>
|
|
|
+ <el-tab-pane v-if="form.mode === 'smart-reasoning'" :label="t('pages.agent.editModal.tabTools')" name="tools">
|
|
|
+ <div class="tab-intro">{{ t('pages.agent.editModal.toolsTabIntro') }}</div>
|
|
|
<div class="collapse-body">
|
|
|
- <el-form-item label="允许的工具" prop="config.setting_config.allowed_tools">
|
|
|
+ <el-form-item :label="t('pages.agent.editModal.allowedToolsLabel')" prop="config.setting_config.allowed_tools">
|
|
|
<div class="selection-panel">
|
|
|
<el-checkbox-group
|
|
|
v-model="form.config.setting_config.allowed_tools"
|
|
|
@@ -331,28 +331,28 @@
|
|
|
</div>
|
|
|
</el-checkbox-group>
|
|
|
</div>
|
|
|
- <div class="field-tip">选择 Agent 可以使用的工具。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.allowedToolsTip') }}</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="最大迭代次数" prop="config.setting_config.max_iterations">
|
|
|
+ <el-form-item :label="t('pages.agent.editModal.maxIterationsLabel')" prop="config.setting_config.max_iterations">
|
|
|
<el-input-number
|
|
|
v-model="form.config.setting_config.max_iterations"
|
|
|
:min="1"
|
|
|
:max="50"
|
|
|
style="width: 100%"
|
|
|
/>
|
|
|
- <div class="field-tip">Agent 执行任务时的最大推理步骤数。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.maxIterationsTip') }}</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="LLM 调用超时" prop="config.setting_config.llm_call_timeout">
|
|
|
+ <el-form-item :label="t('pages.agent.editModal.llmTimeoutLabel')" prop="config.setting_config.llm_call_timeout">
|
|
|
<el-input-number
|
|
|
v-model="form.config.setting_config.llm_call_timeout"
|
|
|
:min="0"
|
|
|
style="width: 100%"
|
|
|
/>
|
|
|
<div class="field-tip">
|
|
|
- 单次 LLM 调用的最大等待时间(秒),超过此时间后调用将被中止。
|
|
|
+ {{ t('pages.agent.editModal.llmTimeoutTip') }}
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="MCP 服务" prop="config.setting_config.mcp_services">
|
|
|
+ <el-form-item :label="t('pages.agent.editModal.mcpServiceLabel')" prop="config.setting_config.mcp_services">
|
|
|
<div class="selection-panel">
|
|
|
<el-segmented
|
|
|
v-model="form.config.setting_config.mcp_selection_mode"
|
|
|
@@ -373,23 +373,23 @@
|
|
|
</el-checkbox>
|
|
|
</el-checkbox-group>
|
|
|
</div>
|
|
|
- <div class="field-tip">选择 Agent 可以调用的 MCP 服务。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.mcpTip') }}</div>
|
|
|
<div
|
|
|
v-if="form.config.setting_config.mcp_selection_mode === 'selected'"
|
|
|
class="field-tip"
|
|
|
>
|
|
|
- 选择要启用的 MCP 服务。
|
|
|
+ {{ t('pages.agent.editModal.mcpSelectTip') }}
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
</div>
|
|
|
</el-tab-pane>
|
|
|
|
|
|
- <el-tab-pane v-if="form.mode === 'smart-reasoning'" label="技能 Skills" name="skills">
|
|
|
+ <el-tab-pane v-if="form.mode === 'smart-reasoning'" :label="t('pages.agent.editModal.tabSkills')" name="skills">
|
|
|
<div class="tab-intro">
|
|
|
- 配置 Agent 可以使用的预装 Skills,提供专业领域知识和工作流程
|
|
|
+ {{ t('pages.agent.editModal.skillsTabIntro') }}
|
|
|
</div>
|
|
|
<div class="collapse-body">
|
|
|
- <el-form-item label="Skills 选择" prop="config.setting_config.selected_skills">
|
|
|
+ <el-form-item :label="t('pages.agent.editModal.skillsSelectLabel')" prop="config.setting_config.selected_skills">
|
|
|
<div class="selection-panel">
|
|
|
<el-segmented
|
|
|
v-model="form.config.setting_config.skills_selection_mode"
|
|
|
@@ -415,30 +415,30 @@
|
|
|
</el-checkbox>
|
|
|
</el-checkbox-group>
|
|
|
</div>
|
|
|
- <div class="field-tip">选择 Agent 可以使用的 Skills 范围。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.skillsTip') }}</div>
|
|
|
<div
|
|
|
v-if="form.config.setting_config.skills_selection_mode === 'selected'"
|
|
|
class="field-tip"
|
|
|
>
|
|
|
- 选择要启用的 Skills。
|
|
|
+ {{ t('pages.agent.editModal.skillsSelectTip') }}
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
</div>
|
|
|
</el-tab-pane>
|
|
|
|
|
|
- <el-tab-pane label="搜索策略" name="search">
|
|
|
- <div class="tab-intro">配置知识库检索和排序的参数</div>
|
|
|
+ <el-tab-pane :label="t('pages.agent.editModal.tabSearch')" name="search">
|
|
|
+ <div class="tab-intro">{{ t('pages.agent.editModal.searchTabIntro') }}</div>
|
|
|
<div class="collapse-body">
|
|
|
- <el-form-item label="向量召回数量" prop="config.search_config.embedding_top_k">
|
|
|
+ <el-form-item :label="t('pages.agent.editModal.embeddingTopKLabel')" 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%"
|
|
|
/>
|
|
|
- <div class="field-tip">向量检索返回的最大结果数量。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.embeddingTopKTip') }}</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="关键词阈值" prop="config.search_config.keyword_threshold">
|
|
|
+ <el-form-item :label="t('pages.agent.editModal.keywordThresholdLabel')" 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"
|
|
|
@@ -447,10 +447,10 @@
|
|
|
:step="0.1"
|
|
|
style="width: 50%"
|
|
|
/>
|
|
|
- <div class="field-tip">关键词检索的最低相关性分数。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.keywordThresholdTip') }}</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="向量阈值" prop="config.search_config.vector_threshold">
|
|
|
+ <el-form-item :label="t('pages.agent.editModal.vectorThresholdLabel')" 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"
|
|
|
@@ -459,19 +459,19 @@
|
|
|
:step="0.1"
|
|
|
style="width: 50%"
|
|
|
/>
|
|
|
- <div class="field-tip">向量检索的最低相似度分数。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.vectorThresholdTip') }}</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="重排数量" prop="config.search_config.rerank_top_k">
|
|
|
+ <el-form-item :label="t('pages.agent.editModal.rerankTopKLabel')" 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%"
|
|
|
/>
|
|
|
- <div class="field-tip">重排序后保留的最大结果数量。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.rerankTopKTip') }}</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="重排阈值" prop="config.search_config.rerank_threshold">
|
|
|
+ <el-form-item :label="t('pages.agent.editModal.rerankThresholdLabel')" 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"
|
|
|
@@ -480,28 +480,28 @@
|
|
|
:step="0.1"
|
|
|
style="width: 50%"
|
|
|
/>
|
|
|
- <div class="field-tip">重排序的最低相关性分数。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.rerankThresholdTip') }}</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
<div v-if="form.mode === 'quick-answer'" class="subsection">
|
|
|
- <div class="subsection-title">问答</div>
|
|
|
- <el-form-item label="查询扩展" prop="config.advanced_config.enable_query_expansion">
|
|
|
+ <div class="subsection-title">{{ t('pages.agent.editModal.qaSectionTitle') }}</div>
|
|
|
+ <el-form-item :label="t('pages.agent.editModal.queryExpansionLabel')" prop="config.advanced_config.enable_query_expansion">
|
|
|
<div class="switch-wrap flex items-center gap-2">
|
|
|
<el-switch v-model="form.config.advanced_config.enable_query_expansion" />
|
|
|
- <div class="field-tip">自动扩展查询词以提高召回率。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.queryExpansionTip') }}</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="兜底策略" prop="config.advanced_config.fallback_strategy">
|
|
|
+ <el-form-item :label="t('pages.agent.editModal.fallbackStrategyLabel')" prop="config.advanced_config.fallback_strategy">
|
|
|
<el-segmented
|
|
|
v-model="form.config.advanced_config.fallback_strategy"
|
|
|
class="selection-segmented"
|
|
|
:options="fallbackStrategyOptions"
|
|
|
/>
|
|
|
- <div class="field-tip">当无法从知识库找到相关内容时的处理方式。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.fallbackStrategyTip') }}</div>
|
|
|
</el-form-item>
|
|
|
<el-form-item
|
|
|
v-if="form.config.advanced_config.fallback_strategy === 'model'"
|
|
|
- label="兜底提示词"
|
|
|
+ :label="t('pages.agent.editModal.fallbackPromptLabel')"
|
|
|
prop="config.advanced_config.fallback_prompt"
|
|
|
>
|
|
|
<div class="prompt-field">
|
|
|
@@ -512,49 +512,49 @@
|
|
|
:icon="DocumentCopy"
|
|
|
@click="openPromptTemplatePicker('fallbackPrompt', 'fall-back')"
|
|
|
>
|
|
|
- 模板选择
|
|
|
+ {{ t('pages.agent.editModal.templateSelect') }}
|
|
|
</el-button>
|
|
|
</div>
|
|
|
<el-input
|
|
|
v-model="form.config.advanced_config.fallback_prompt"
|
|
|
type="textarea"
|
|
|
:rows="15"
|
|
|
- placeholder="请输入模型兜底时使用的提示词"
|
|
|
+ :placeholder="t('pages.agent.editModal.fallbackPromptPlaceholder')"
|
|
|
/>
|
|
|
</div>
|
|
|
<div class="field-tip">
|
|
|
- 当无法从知识库找到相关内容时,用于引导模型生成兜底回复。
|
|
|
+ {{ t('pages.agent.editModal.fallbackPromptTip') }}
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
<el-form-item
|
|
|
v-else
|
|
|
- label="固定提示词"
|
|
|
+ :label="t('pages.agent.editModal.fixedPromptLabel')"
|
|
|
prop="config.advanced_config.fallback_response"
|
|
|
>
|
|
|
<el-input
|
|
|
v-model="form.config.advanced_config.fallback_response"
|
|
|
type="textarea"
|
|
|
:rows="3"
|
|
|
- placeholder="请输入固定兜底内容"
|
|
|
+ :placeholder="t('pages.agent.editModal.fixedResponsePlaceholder')"
|
|
|
/>
|
|
|
- <div class="field-tip">当无法回答时返回的固定文本。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.fixedResponseTip') }}</div>
|
|
|
</el-form-item>
|
|
|
</div>
|
|
|
</div>
|
|
|
</el-tab-pane>
|
|
|
|
|
|
- <el-tab-pane label="网络搜索" name="web-search">
|
|
|
- <div class="tab-intro">配置智能体的网络搜索能力</div>
|
|
|
+ <el-tab-pane :label="t('pages.agent.editModal.tabWebSearch')" name="web-search">
|
|
|
+ <div class="tab-intro">{{ t('pages.agent.editModal.webSearchTabIntro') }}</div>
|
|
|
<div class="collapse-body">
|
|
|
- <el-form-item label="网络搜索开启" prop="config.web_search_config.web_search_enabled">
|
|
|
+ <el-form-item :label="t('pages.agent.editModal.webSearchEnableLabel')" prop="config.web_search_config.web_search_enabled">
|
|
|
<div class="switch-wrap flex items-center gap-2">
|
|
|
<el-switch v-model="form.config.web_search_config.web_search_enabled" />
|
|
|
- <div class="field-tip">启用后智能体可以搜索互联网获取信息。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.webSearchEnableTip') }}</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
<el-form-item
|
|
|
v-if="form.config.web_search_config.web_search_enabled"
|
|
|
- label="选择搜索引擎"
|
|
|
+ :label="t('pages.agent.editModal.searchEngineLabel')"
|
|
|
prop="config.web_search_config.web_search_provider_id"
|
|
|
>
|
|
|
<el-select
|
|
|
@@ -562,7 +562,7 @@
|
|
|
filterable
|
|
|
:loading="webSearchProviderLoading"
|
|
|
clearable
|
|
|
- placeholder="请输入关键词搜索"
|
|
|
+ :placeholder="t('pages.agent.editModal.searchEnginePlaceholder')"
|
|
|
style="width: 100%"
|
|
|
>
|
|
|
<el-option
|
|
|
@@ -572,11 +572,11 @@
|
|
|
:value="item.value"
|
|
|
/>
|
|
|
</el-select>
|
|
|
- <div class="field-tip">为此智能体指定搜索引擎,留空则使用默认搜索引擎。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.searchEngineTip') }}</div>
|
|
|
</el-form-item>
|
|
|
<el-form-item
|
|
|
v-if="form.config.web_search_config.web_search_enabled"
|
|
|
- label="最大搜索结果数"
|
|
|
+ :label="t('pages.agent.editModal.maxResultsLabel')"
|
|
|
prop="config.web_search_config.web_search_max_results"
|
|
|
>
|
|
|
<div class="switch-wrap w-full flex items-center gap-3">
|
|
|
@@ -586,25 +586,25 @@
|
|
|
:max="10"
|
|
|
style="width: 50%"
|
|
|
/>
|
|
|
- <div class="field-tip">每次搜索返回的最大结果数量。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.maxResultsTip') }}</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
<el-form-item
|
|
|
v-if="form.config.web_search_config.web_search_enabled"
|
|
|
label-width="130px"
|
|
|
- label="自动抓取页面内容"
|
|
|
+ :label="t('pages.agent.editModal.webFetchLabel')"
|
|
|
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 后自动抓取排名靠前的网页完整内容,提升回答质量。
|
|
|
+ {{ t('pages.agent.editModal.webFetchTip') }}
|
|
|
</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
<el-form-item
|
|
|
v-if="form.config.web_search_config.web_fetch_enabled"
|
|
|
- label="抓取页面数"
|
|
|
+ :label="t('pages.agent.editModal.fetchCountLabel')"
|
|
|
prop="config.web_search_config.web_fetch_top_n"
|
|
|
>
|
|
|
<div class="switch-wrap w-full flex items-center gap-3">
|
|
|
@@ -614,24 +614,24 @@
|
|
|
:max="10"
|
|
|
style="width: 50%"
|
|
|
/>
|
|
|
- <div class="field-tip">Rerank 后最多抓取几个网页的完整内容。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.fetchCountTip') }}</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
</div>
|
|
|
</el-tab-pane>
|
|
|
|
|
|
- <el-tab-pane label="多模态" name="multimodal">
|
|
|
- <div class="tab-intro">配置图片上传和视觉语言模型,启用后用户可在对话中上传图片</div>
|
|
|
+ <el-tab-pane :label="t('pages.agent.editModal.tabMultimodal')" name="multimodal">
|
|
|
+ <div class="tab-intro">{{ t('pages.agent.editModal.multimodalTabIntro') }}</div>
|
|
|
<div class="collapse-body">
|
|
|
- <el-form-item label="图片上传" prop="config.img_vlm_config.image_upload_enabled">
|
|
|
+ <el-form-item :label="t('pages.agent.editModal.imageUploadLabel')" prop="config.img_vlm_config.image_upload_enabled">
|
|
|
<div class="switch-wrap flex items-center gap-2">
|
|
|
<el-switch v-model="form.config.img_vlm_config.image_upload_enabled" />
|
|
|
- <div class="field-tip">启用后用户可在对话中上传图片进行多模态问答。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.imageUploadTip') }}</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
<el-form-item
|
|
|
v-if="form.config.img_vlm_config.image_upload_enabled"
|
|
|
- label="VLM 模型设置"
|
|
|
+ :label="t('pages.agent.editModal.vlmModelLabel')"
|
|
|
prop="config.img_vlm_config.vlm_model_id"
|
|
|
>
|
|
|
<el-select
|
|
|
@@ -646,19 +646,19 @@
|
|
|
:value="model.id"
|
|
|
/>
|
|
|
</el-select>
|
|
|
- <div class="field-tip">用于图片分析的视觉语言模型。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.vlmModelTip') }}</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="语音上传" prop="config.img_vlm_config.audio_upload_enabled">
|
|
|
+ <el-form-item :label="t('pages.agent.editModal.audioUploadLabel')" prop="config.img_vlm_config.audio_upload_enabled">
|
|
|
<div class="switch-wrap flex items-center gap-2">
|
|
|
<el-switch v-model="form.config.img_vlm_config.audio_upload_enabled" />
|
|
|
<div class="field-tip">
|
|
|
- 启用后用户可在对话中上传音频文件,系统将使用 ASR 模型自动转录为文字。
|
|
|
+ {{ t('pages.agent.editModal.audioUploadTip') }}
|
|
|
</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
<el-form-item
|
|
|
v-if="form.config.img_vlm_config.audio_upload_enabled"
|
|
|
- label="ASR 模型设置"
|
|
|
+ :label="t('pages.agent.editModal.asrModelLabel')"
|
|
|
prop="config.img_vlm_config.asr_model_id"
|
|
|
>
|
|
|
<el-select
|
|
|
@@ -675,24 +675,24 @@
|
|
|
/>
|
|
|
</el-select>
|
|
|
<div class="field-tip">
|
|
|
- 用于音频转录的语音识别模型,未配置时音频文件将以占位符形式传递。
|
|
|
+ {{ t('pages.agent.editModal.asrModelTip') }}
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
</div>
|
|
|
</el-tab-pane>
|
|
|
|
|
|
- <el-tab-pane v-if="form.mode === 'quick-answer'" label="多轮对话" name="multi-turn">
|
|
|
- <div class="tab-intro">配置多轮对话和问题改写相关参数</div>
|
|
|
+ <el-tab-pane v-if="form.mode === 'quick-answer'" :label="t('pages.agent.editModal.tabMultiTurn')" name="multi-turn">
|
|
|
+ <div class="tab-intro">{{ t('pages.agent.editModal.multiTurnTabIntro') }}</div>
|
|
|
<div class="collapse-body">
|
|
|
- <el-form-item label="多轮对话" prop="config.multiple_config.multi_turn_enabled">
|
|
|
+ <el-form-item :label="t('pages.agent.editModal.multiTurnLabel')" prop="config.multiple_config.multi_turn_enabled">
|
|
|
<div class="switch-wrap flex items-center gap-2">
|
|
|
<el-switch v-model="form.config.multiple_config.multi_turn_enabled" />
|
|
|
- <div class="field-tip">开启后将保留历史对话上下文。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.multiTurnTip') }}</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
<el-form-item
|
|
|
v-if="form.config.multiple_config.multi_turn_enabled"
|
|
|
- label="保留轮数"
|
|
|
+ :label="t('pages.agent.editModal.historyTurnsLabel')"
|
|
|
prop="config.multiple_config.history_turns"
|
|
|
>
|
|
|
<el-input-number
|
|
|
@@ -701,24 +701,24 @@
|
|
|
:max="20"
|
|
|
style="width: 100%"
|
|
|
/>
|
|
|
- <div class="field-tip">保留最近几轮对话作为上下文。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.historyTurnsTip') }}</div>
|
|
|
</el-form-item>
|
|
|
<div v-if="form.mode === 'quick-answer'">
|
|
|
- <el-form-item label="问题改写" prop="config.advanced_config.enable_rewrite">
|
|
|
+ <el-form-item :label="t('pages.agent.editModal.rewriteLabel')" prop="config.advanced_config.enable_rewrite">
|
|
|
<div class="switch-wrap flex items-center gap-2">
|
|
|
<el-switch v-model="form.config.advanced_config.enable_rewrite" />
|
|
|
- <div class="field-tip">多轮对话时自动改写用户问题,消解指代和补全省略。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.rewriteTip') }}</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
<el-form-item
|
|
|
v-if="form.config.advanced_config.enable_rewrite"
|
|
|
- label="改写系统提示词"
|
|
|
+ :label="t('pages.agent.editModal.rewriteSystemPromptLabel')"
|
|
|
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>
|
|
|
+ <span class="prompt-variable-label">{{ t('pages.agent.editModal.availableVariables') }}</span>
|
|
|
<el-tag
|
|
|
v-for="variable in rewriteVariables"
|
|
|
:key="variable"
|
|
|
@@ -736,7 +736,7 @@
|
|
|
:icon="DocumentCopy"
|
|
|
@click="openPromptTemplatePicker('rewritePromptSystem', 'rewrite')"
|
|
|
>
|
|
|
- 模板选择
|
|
|
+ {{ t('pages.agent.editModal.templateSelect') }}
|
|
|
</el-button>
|
|
|
</div>
|
|
|
<el-input
|
|
|
@@ -744,20 +744,20 @@
|
|
|
v-model="form.config.advanced_config.rewrite_prompt_system"
|
|
|
type="textarea"
|
|
|
:rows="15"
|
|
|
- placeholder="请输入问题改写时的系统提示词"
|
|
|
+ :placeholder="t('pages.agent.editModal.rewriteSystemPromptPlaceholder')"
|
|
|
/>
|
|
|
</div>
|
|
|
- <div class="field-tip">用于问题改写的系统提示词。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.rewriteSystemPromptTip') }}</div>
|
|
|
</el-form-item>
|
|
|
<el-form-item
|
|
|
v-if="form.config.advanced_config.enable_rewrite"
|
|
|
- label="改写用户提示词"
|
|
|
+ :label="t('pages.agent.editModal.rewriteUserPromptLabel')"
|
|
|
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>
|
|
|
+ <span class="prompt-variable-label">{{ t('pages.agent.editModal.availableVariables') }}</span>
|
|
|
<el-tag
|
|
|
v-for="variable in rewriteVariables"
|
|
|
:key="variable"
|
|
|
@@ -775,7 +775,7 @@
|
|
|
:icon="DocumentCopy"
|
|
|
@click="openPromptTemplatePicker('rewritePromptUser', 'rewrite')"
|
|
|
>
|
|
|
- 模板选择
|
|
|
+ {{ t('pages.agent.editModal.templateSelect') }}
|
|
|
</el-button>
|
|
|
</div>
|
|
|
<el-input
|
|
|
@@ -783,10 +783,10 @@
|
|
|
v-model="form.config.advanced_config.rewrite_prompt_user"
|
|
|
type="textarea"
|
|
|
:rows="15"
|
|
|
- placeholder="请输入问题改写时的用户提示词"
|
|
|
+ :placeholder="t('pages.agent.editModal.rewriteUserPromptPlaceholder')"
|
|
|
/>
|
|
|
</div>
|
|
|
- <div class="field-tip">用于问题改写的用户提示词模板。</div>
|
|
|
+ <div class="field-tip">{{ t('pages.agent.editModal.rewriteUserPromptTip') }}</div>
|
|
|
</el-form-item>
|
|
|
</div>
|
|
|
</div>
|
|
|
@@ -795,14 +795,14 @@
|
|
|
</el-form>
|
|
|
</el-scrollbar>
|
|
|
|
|
|
- <el-dialog v-model="emojiDialogVisible" title="选择 Emoji 图标" width="520px" append-to-body>
|
|
|
+ <el-dialog v-model="emojiDialogVisible" :title="t('pages.agent.editModal.emojiPickerTitle')" 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' }"
|
|
|
+ :static-texts="{ placeholder: t('pages.agent.editModal.emojiSearchPlaceholder') }"
|
|
|
@select="handleEmojiSelect"
|
|
|
/>
|
|
|
</div>
|
|
|
@@ -818,8 +818,8 @@
|
|
|
|
|
|
<template #footer>
|
|
|
<div class="drawer-footer">
|
|
|
- <el-button @click="visible = false">取消</el-button>
|
|
|
- <el-button type="primary" :loading="submitLoading" @click="handleSubmit">保存</el-button>
|
|
|
+ <el-button @click="visible = false">{{ t('pages.agent.editModal.cancel') }}</el-button>
|
|
|
+ <el-button type="primary" :loading="submitLoading" @click="handleSubmit">{{ t('pages.agent.editModal.save') }}</el-button>
|
|
|
</div>
|
|
|
</template>
|
|
|
</el-dialog>
|
|
|
@@ -827,6 +827,7 @@
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
import { computed, nextTick, reactive, ref, watch } from 'vue'
|
|
|
+import { useI18n } from '@/composables/useI18n'
|
|
|
import { ElMessage } from 'element-plus'
|
|
|
import { DocumentCopy } from '@element-plus/icons-vue'
|
|
|
import { agentApplication, aiModel, knowledge, resource } from '@repo/api-service'
|
|
|
@@ -847,6 +848,7 @@ import type {
|
|
|
} from '../type'
|
|
|
|
|
|
const visible = defineModel<boolean>({ required: true })
|
|
|
+const { t } = useI18n()
|
|
|
|
|
|
const props = defineProps<{
|
|
|
agentId?: string
|
|
|
@@ -892,20 +894,20 @@ const promptTemplateDialogVisible = ref(false)
|
|
|
const currentPromptField = ref<PromptFieldKey>('systemPrompt')
|
|
|
const currentPromptTemplateType = ref<PromptTemplateType>('system-prompt')
|
|
|
const supportedFileTypes = ['pdf', 'docx', 'txt', 'md', 'csv', 'xlsx', 'jpg']
|
|
|
-const selectionModeOptions = [
|
|
|
- { label: '全部知识库', value: 'all' },
|
|
|
- { label: '指定知识库', value: 'selected' },
|
|
|
- { label: '不适用知识库', value: 'none' }
|
|
|
-]
|
|
|
-const selectionMCPOptions = [
|
|
|
- { label: '全部', value: 'all' },
|
|
|
- { label: '指定', value: 'selected' },
|
|
|
- { label: '禁用', value: 'none' }
|
|
|
-]
|
|
|
-const fallbackStrategyOptions = [
|
|
|
- { label: '模型生成', value: 'model' },
|
|
|
- { label: '固定回复', value: 'fixed' }
|
|
|
-]
|
|
|
+const selectionModeOptions = computed(() => [
|
|
|
+ { label: t('pages.agent.editModal.kbAll'), value: 'all' },
|
|
|
+ { label: t('pages.agent.editModal.kbSelected'), value: 'selected' },
|
|
|
+ { label: t('pages.agent.editModal.kbNone'), value: 'none' }
|
|
|
+])
|
|
|
+const selectionMCPOptions = computed(() => [
|
|
|
+ { label: t('pages.agent.editModal.selectAll'), value: 'all' },
|
|
|
+ { label: t('pages.agent.editModal.selectSpecified'), value: 'selected' },
|
|
|
+ { label: t('pages.agent.editModal.selectDisabled'), value: 'none' }
|
|
|
+])
|
|
|
+const fallbackStrategyOptions = computed(() => [
|
|
|
+ { label: t('pages.agent.editModal.fallbackModel'), value: 'model' },
|
|
|
+ { label: t('pages.agent.editModal.fallbackFixed'), value: 'fixed' }
|
|
|
+])
|
|
|
const smartReasoningSystemPromptVariables = [
|
|
|
'knowledge_bases',
|
|
|
'web_search_status',
|
|
|
@@ -990,25 +992,25 @@ const form = reactive<AgentFormData>({
|
|
|
}
|
|
|
})
|
|
|
|
|
|
-const rules = {
|
|
|
+const rules = computed(() => ({
|
|
|
name: [
|
|
|
{
|
|
|
required: !props.configOnly,
|
|
|
- message: '名称不能为空',
|
|
|
+ message: t('pages.agent.editModal.nameRequired'),
|
|
|
trigger: 'blur'
|
|
|
}
|
|
|
],
|
|
|
- mode: [{ required: true, message: '请选择模式', trigger: 'change' }],
|
|
|
+ mode: [{ required: true, message: t('pages.agent.editModal.modeRequired'), trigger: 'change' }],
|
|
|
'config.basic_config.system_prompt': [
|
|
|
- { required: true, message: '请输入系统提示词', trigger: 'blur' }
|
|
|
+ { required: true, message: t('pages.agent.editModal.systemPromptRequired'), trigger: 'blur' }
|
|
|
],
|
|
|
'config.model_config.model_id': [
|
|
|
- { required: true, message: '请选择对话模型', trigger: 'change' }
|
|
|
+ { required: true, message: t('pages.agent.editModal.modelRequired'), trigger: 'change' }
|
|
|
],
|
|
|
'config.model_config.rerank_model_id': [
|
|
|
- { required: true, message: '请选择重排序模型', trigger: 'change' }
|
|
|
+ { required: true, message: t('pages.agent.editModal.rerankModelRequired'), trigger: 'change' }
|
|
|
]
|
|
|
-}
|
|
|
+}))
|
|
|
|
|
|
const chatModels = computed(() => modelOptions.value.filter((item) => item.type === 'KnowledgeQA'))
|
|
|
const rerankModels = computed(() => modelOptions.value.filter((item) => item.type === 'Rerank'))
|
|
|
@@ -1564,7 +1566,7 @@ async function loadSkills() {
|
|
|
async function loadDetail(id: string) {
|
|
|
const res = await agentApplication.postAiAgentInfo({ id })
|
|
|
if (!res.isSuccess || !res.result) {
|
|
|
- ElMessage.error(res?.error || '详情加载失败')
|
|
|
+ ElMessage.error(res?.error || t('pages.agent.editModal.detailLoadFailed'))
|
|
|
return
|
|
|
}
|
|
|
applyDetail(res.result as AgentItem)
|
|
|
@@ -1629,22 +1631,22 @@ async function handleSubmit() {
|
|
|
})
|
|
|
|
|
|
if (!res.isSuccess) {
|
|
|
- ElMessage.error(res?.error || '更新失败')
|
|
|
+ ElMessage.error(res?.error || t('pages.agent.editModal.updateFailed'))
|
|
|
return
|
|
|
}
|
|
|
- ElMessage.success('更新成功')
|
|
|
+ ElMessage.success(t('pages.agent.editModal.updateSuccess'))
|
|
|
} else {
|
|
|
const res = await agentApplication.postAiAgentCreate(payload as any)
|
|
|
if (!res.isSuccess) {
|
|
|
- ElMessage.error(res?.error || '创建失败')
|
|
|
+ ElMessage.error(res?.error || t('pages.agent.editModal.createFailed'))
|
|
|
return
|
|
|
}
|
|
|
- ElMessage.success('创建成功')
|
|
|
+ ElMessage.success(t('pages.agent.editModal.createSuccess'))
|
|
|
}
|
|
|
visible.value = false
|
|
|
emit('saved')
|
|
|
} catch {
|
|
|
- ElMessage.error('Save failed')
|
|
|
+ ElMessage.error(t('pages.agent.editModal.saveFailed'))
|
|
|
} finally {
|
|
|
submitLoading.value = false
|
|
|
}
|