|
@@ -154,16 +154,13 @@
|
|
|
<el-select
|
|
<el-select
|
|
|
v-model="form.config.model_config.model_id"
|
|
v-model="form.config.model_config.model_id"
|
|
|
filterable
|
|
filterable
|
|
|
- remote
|
|
|
|
|
reserve-keyword
|
|
reserve-keyword
|
|
|
- :remote-method="searchChatModels"
|
|
|
|
|
- :loading="chatModelsLoading"
|
|
|
|
|
style="width: 100%"
|
|
style="width: 100%"
|
|
|
>
|
|
>
|
|
|
<el-option
|
|
<el-option
|
|
|
v-for="model in chatModels"
|
|
v-for="model in chatModels"
|
|
|
:key="model.id"
|
|
:key="model.id"
|
|
|
- :label="modelLabel(model)"
|
|
|
|
|
|
|
+ :label="model.title"
|
|
|
:value="model.id"
|
|
:value="model.id"
|
|
|
/>
|
|
/>
|
|
|
</el-select>
|
|
</el-select>
|
|
@@ -251,16 +248,12 @@
|
|
|
<el-select
|
|
<el-select
|
|
|
v-model="form.config.model_config.rerank_model_id"
|
|
v-model="form.config.model_config.rerank_model_id"
|
|
|
filterable
|
|
filterable
|
|
|
- remote
|
|
|
|
|
- reserve-keyword
|
|
|
|
|
- :remote-method="searchRerankModels"
|
|
|
|
|
- :loading="rerankModelsLoading"
|
|
|
|
|
style="width: 100%"
|
|
style="width: 100%"
|
|
|
>
|
|
>
|
|
|
<el-option
|
|
<el-option
|
|
|
v-for="model in rerankModels"
|
|
v-for="model in rerankModels"
|
|
|
:key="model.id"
|
|
:key="model.id"
|
|
|
- :label="modelLabel(model)"
|
|
|
|
|
|
|
+ :label="model.title"
|
|
|
:value="model.id"
|
|
:value="model.id"
|
|
|
/>
|
|
/>
|
|
|
</el-select>
|
|
</el-select>
|
|
@@ -567,9 +560,6 @@
|
|
|
<el-select
|
|
<el-select
|
|
|
v-model="form.config.web_search_config.web_search_provider_id"
|
|
v-model="form.config.web_search_config.web_search_provider_id"
|
|
|
filterable
|
|
filterable
|
|
|
- remote
|
|
|
|
|
- reserve-keyword
|
|
|
|
|
- :remote-method="searchWebSearchProviders"
|
|
|
|
|
:loading="webSearchProviderLoading"
|
|
:loading="webSearchProviderLoading"
|
|
|
clearable
|
|
clearable
|
|
|
placeholder="请输入关键词搜索"
|
|
placeholder="请输入关键词搜索"
|
|
@@ -647,16 +637,12 @@
|
|
|
<el-select
|
|
<el-select
|
|
|
v-model="form.config.img_vlm_config.vlm_model_id"
|
|
v-model="form.config.img_vlm_config.vlm_model_id"
|
|
|
filterable
|
|
filterable
|
|
|
- remote
|
|
|
|
|
- reserve-keyword
|
|
|
|
|
- :remote-method="searchVlmModels"
|
|
|
|
|
- :loading="vlmModelsLoading"
|
|
|
|
|
style="width: 100%"
|
|
style="width: 100%"
|
|
|
>
|
|
>
|
|
|
<el-option
|
|
<el-option
|
|
|
v-for="model in vlmModels"
|
|
v-for="model in vlmModels"
|
|
|
:key="model.id"
|
|
:key="model.id"
|
|
|
- :label="modelLabel(model)"
|
|
|
|
|
|
|
+ :label="model.title"
|
|
|
:value="model.id"
|
|
:value="model.id"
|
|
|
/>
|
|
/>
|
|
|
</el-select>
|
|
</el-select>
|
|
@@ -678,17 +664,13 @@
|
|
|
<el-select
|
|
<el-select
|
|
|
v-model="form.config.img_vlm_config.asr_model_id"
|
|
v-model="form.config.img_vlm_config.asr_model_id"
|
|
|
filterable
|
|
filterable
|
|
|
- remote
|
|
|
|
|
- reserve-keyword
|
|
|
|
|
- :remote-method="searchAsrModels"
|
|
|
|
|
- :loading="asrModelsLoading"
|
|
|
|
|
clearable
|
|
clearable
|
|
|
style="width: 100%"
|
|
style="width: 100%"
|
|
|
>
|
|
>
|
|
|
<el-option
|
|
<el-option
|
|
|
v-for="model in asrModels"
|
|
v-for="model in asrModels"
|
|
|
:key="model.id"
|
|
:key="model.id"
|
|
|
- :label="modelLabel(model)"
|
|
|
|
|
|
|
+ :label="model.title"
|
|
|
:value="model.id"
|
|
:value="model.id"
|
|
|
/>
|
|
/>
|
|
|
</el-select>
|
|
</el-select>
|
|
@@ -884,10 +866,6 @@ const formId = ref('')
|
|
|
const submitLoading = ref(false)
|
|
const submitLoading = ref(false)
|
|
|
// 统一缓存各类模型选项,按 type 在计算属性中拆分使用。
|
|
// 统一缓存各类模型选项,按 type 在计算属性中拆分使用。
|
|
|
const modelOptions = ref<ModelItem[]>([])
|
|
const modelOptions = ref<ModelItem[]>([])
|
|
|
-const chatModelsLoading = ref(false)
|
|
|
|
|
-const rerankModelsLoading = ref(false)
|
|
|
|
|
-const vlmModelsLoading = ref(false)
|
|
|
|
|
-const asrModelsLoading = ref(false)
|
|
|
|
|
const kbOptions = ref<KnowledgeItem[]>([])
|
|
const kbOptions = ref<KnowledgeItem[]>([])
|
|
|
const kbLoading = ref(false)
|
|
const kbLoading = ref(false)
|
|
|
const toolList = ref<
|
|
const toolList = ref<
|
|
@@ -903,9 +881,7 @@ const toolList = ref<
|
|
|
const webSearchProviderOptions = ref<AgentSelectOption[]>([])
|
|
const webSearchProviderOptions = ref<AgentSelectOption[]>([])
|
|
|
const webSearchProviderLoading = ref(false)
|
|
const webSearchProviderLoading = ref(false)
|
|
|
const mcpServiceOptions = ref<AgentSelectOption[]>([])
|
|
const mcpServiceOptions = ref<AgentSelectOption[]>([])
|
|
|
-const mcpLoading = ref(false)
|
|
|
|
|
const skillOptions = ref<AgentSelectOption[]>([])
|
|
const skillOptions = ref<AgentSelectOption[]>([])
|
|
|
-const skillLoading = ref(false)
|
|
|
|
|
const allSkillOptions = ref<AgentSelectOption[]>([])
|
|
const allSkillOptions = ref<AgentSelectOption[]>([])
|
|
|
const emojiDialogVisible = ref(false)
|
|
const emojiDialogVisible = ref(false)
|
|
|
const systemPromptInputRef = ref()
|
|
const systemPromptInputRef = ref()
|
|
@@ -1040,9 +1016,7 @@ const vlmModels = computed(() => modelOptions.value.filter((item) => item.type =
|
|
|
const asrModels = computed(() =>
|
|
const asrModels = computed(() =>
|
|
|
modelOptions.value.filter((item) => ['ASR', 'Asr', 'asr'].includes(item.type || ''))
|
|
modelOptions.value.filter((item) => ['ASR', 'Asr', 'asr'].includes(item.type || ''))
|
|
|
)
|
|
)
|
|
|
-const modelPageSize = 20
|
|
|
|
|
const remoteOptionPageSize = 20
|
|
const remoteOptionPageSize = 20
|
|
|
-const checkboxOptionPageSize = 200
|
|
|
|
|
const modelRequestKeyPrefix = 'agent-edit-models'
|
|
const modelRequestKeyPrefix = 'agent-edit-models'
|
|
|
const selectedEmoji = computed(() => form.avatar || '🙂')
|
|
const selectedEmoji = computed(() => form.avatar || '🙂')
|
|
|
const knowledgeCheckboxOptions = computed<AgentSelectOption[]>(() => {
|
|
const knowledgeCheckboxOptions = computed<AgentSelectOption[]>(() => {
|
|
@@ -1110,10 +1084,6 @@ const fieldTabMap: Array<{ match: string | RegExp; tab: string }> = [
|
|
|
{ match: 'config.advanced_config.rewrite_prompt_user', tab: 'multi-turn' }
|
|
{ match: 'config.advanced_config.rewrite_prompt_user', tab: 'multi-turn' }
|
|
|
]
|
|
]
|
|
|
|
|
|
|
|
-function modelLabel(item: ModelItem) {
|
|
|
|
|
- return item.title ? `${item.title} (${item.name})` : item.name
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
function resolveFieldTab(prop: string) {
|
|
function resolveFieldTab(prop: string) {
|
|
|
for (const item of fieldTabMap) {
|
|
for (const item of fieldTabMap) {
|
|
|
if (typeof item.match === 'string' && item.match === prop) return item.tab
|
|
if (typeof item.match === 'string' && item.match === prop) return item.tab
|
|
@@ -1338,65 +1308,17 @@ function buildSubmitConfig() {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
async function fetchModels(keyword = '', type = '') {
|
|
async function fetchModels(keyword = '', type = '') {
|
|
|
- const res = await aiModel.postModelPageList(
|
|
|
|
|
|
|
+ const res = await aiModel.postModelSelectList(
|
|
|
{
|
|
{
|
|
|
keyword: keyword.trim(),
|
|
keyword: keyword.trim(),
|
|
|
- type,
|
|
|
|
|
- source: '',
|
|
|
|
|
- pageIndex: 1,
|
|
|
|
|
- pageSize: modelPageSize
|
|
|
|
|
|
|
+ type
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
requestKey: `${modelRequestKeyPrefix}-${type || 'all'}`
|
|
requestKey: `${modelRequestKeyPrefix}-${type || 'all'}`
|
|
|
}
|
|
}
|
|
|
)
|
|
)
|
|
|
if (res.isSuccess) {
|
|
if (res.isSuccess) {
|
|
|
- modelOptions.value = mergeModelOptions((res.result?.model || []) as ModelItem[])
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-async function loadModels() {
|
|
|
|
|
- await Promise.all([
|
|
|
|
|
- fetchModels('', 'KnowledgeQA'),
|
|
|
|
|
- fetchModels('', 'Rerank'),
|
|
|
|
|
- fetchModels('', 'VLLM'),
|
|
|
|
|
- fetchModels('', 'ASR')
|
|
|
|
|
- ])
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-async function searchChatModels(keyword: string) {
|
|
|
|
|
- chatModelsLoading.value = true
|
|
|
|
|
- try {
|
|
|
|
|
- await fetchModels(keyword, 'KnowledgeQA')
|
|
|
|
|
- } finally {
|
|
|
|
|
- chatModelsLoading.value = false
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-async function searchRerankModels(keyword: string) {
|
|
|
|
|
- rerankModelsLoading.value = true
|
|
|
|
|
- try {
|
|
|
|
|
- await fetchModels(keyword, 'Rerank')
|
|
|
|
|
- } finally {
|
|
|
|
|
- rerankModelsLoading.value = false
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-async function searchVlmModels(keyword: string) {
|
|
|
|
|
- vlmModelsLoading.value = true
|
|
|
|
|
- try {
|
|
|
|
|
- await fetchModels(keyword, 'VLLM')
|
|
|
|
|
- } finally {
|
|
|
|
|
- vlmModelsLoading.value = false
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-async function searchAsrModels(keyword: string) {
|
|
|
|
|
- asrModelsLoading.value = true
|
|
|
|
|
- try {
|
|
|
|
|
- await fetchModels(keyword, 'ASR')
|
|
|
|
|
- } finally {
|
|
|
|
|
- asrModelsLoading.value = false
|
|
|
|
|
|
|
+ modelOptions.value = mergeModelOptions((res.result || []) as ModelItem[])
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -1542,21 +1464,17 @@ function applyDetail(item: AgentItem) {
|
|
|
form.config.advanced_config.fallback_response =
|
|
form.config.advanced_config.fallback_response =
|
|
|
item.config?.advanced_config?.fallback_response || ''
|
|
item.config?.advanced_config?.fallback_response || ''
|
|
|
form.config.advanced_config.fallback_prompt = item.config?.advanced_config?.fallback_prompt || ''
|
|
form.config.advanced_config.fallback_prompt = item.config?.advanced_config?.fallback_prompt || ''
|
|
|
-
|
|
|
|
|
- console.log('applyDetail', item, form)
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
async function loadKnowledgeBases() {
|
|
async function loadKnowledgeBases() {
|
|
|
kbLoading.value = true
|
|
kbLoading.value = true
|
|
|
try {
|
|
try {
|
|
|
- const res = await knowledge.postAiKnowledgeBasePageList({
|
|
|
|
|
|
|
+ const res = await knowledge.postAiKnowledgeBaseSelectList({
|
|
|
keyword: '',
|
|
keyword: '',
|
|
|
- type: '',
|
|
|
|
|
- pageIndex: 1,
|
|
|
|
|
- pageSize: checkboxOptionPageSize
|
|
|
|
|
|
|
+ type: ''
|
|
|
})
|
|
})
|
|
|
if (res.isSuccess) {
|
|
if (res.isSuccess) {
|
|
|
- kbOptions.value = mergeKnowledgeOptions((res.result?.model || []) as KnowledgeItem[])
|
|
|
|
|
|
|
+ kbOptions.value = mergeKnowledgeOptions((res.result || []) as KnowledgeItem[])
|
|
|
}
|
|
}
|
|
|
} finally {
|
|
} finally {
|
|
|
kbLoading.value = false
|
|
kbLoading.value = false
|
|
@@ -1585,11 +1503,8 @@ async function loadWebSearchProviders() {
|
|
|
async function searchWebSearchProviders(keyword: string) {
|
|
async function searchWebSearchProviders(keyword: string) {
|
|
|
webSearchProviderLoading.value = true
|
|
webSearchProviderLoading.value = true
|
|
|
try {
|
|
try {
|
|
|
- const res = await resource.postWebSearchPageList({
|
|
|
|
|
- keyword: keyword.trim(),
|
|
|
|
|
- provider: '',
|
|
|
|
|
- pageIndex: 1,
|
|
|
|
|
- pageSize: remoteOptionPageSize
|
|
|
|
|
|
|
+ const res = await resource.postWebSearchSelectList({
|
|
|
|
|
+ keyword: keyword.trim()
|
|
|
})
|
|
})
|
|
|
if (res?.isSuccess) {
|
|
if (res?.isSuccess) {
|
|
|
webSearchProviderOptions.value = mergeOptions(
|
|
webSearchProviderOptions.value = mergeOptions(
|
|
@@ -1613,49 +1528,36 @@ async function loadMcpServices() {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
async function searchMcpServices(keyword: string) {
|
|
async function searchMcpServices(keyword: string) {
|
|
|
- mcpLoading.value = true
|
|
|
|
|
- try {
|
|
|
|
|
- const res = await resource.postMcpPageList({
|
|
|
|
|
- keyword: keyword.trim(),
|
|
|
|
|
- transport_type: '',
|
|
|
|
|
- pageIndex: 1,
|
|
|
|
|
- pageSize: keyword.trim() ? remoteOptionPageSize : checkboxOptionPageSize
|
|
|
|
|
- })
|
|
|
|
|
- if (res?.isSuccess) {
|
|
|
|
|
- mcpServiceOptions.value = mergeOptions(
|
|
|
|
|
- mcpServiceOptions.value,
|
|
|
|
|
- ((res.result?.model || []) as McpItem[])
|
|
|
|
|
- .filter((item): item is McpItem & { id: string } => !!item.id)
|
|
|
|
|
- .map((item) => ({
|
|
|
|
|
- label: item.name || item.id,
|
|
|
|
|
- value: item.id
|
|
|
|
|
- })),
|
|
|
|
|
- form.config.setting_config.mcp_services
|
|
|
|
|
- )
|
|
|
|
|
- }
|
|
|
|
|
- } finally {
|
|
|
|
|
- mcpLoading.value = false
|
|
|
|
|
|
|
+ const res = await resource.postMcpSelectList({
|
|
|
|
|
+ keyword: keyword.trim()
|
|
|
|
|
+ })
|
|
|
|
|
+ if (res?.isSuccess) {
|
|
|
|
|
+ mcpServiceOptions.value = mergeOptions(
|
|
|
|
|
+ mcpServiceOptions.value,
|
|
|
|
|
+ ((res.result || []) as McpItem[])
|
|
|
|
|
+ .filter((item): item is McpItem & { id: string } => !!item.id)
|
|
|
|
|
+ .map((item) => ({
|
|
|
|
|
+ label: item.name || item.id,
|
|
|
|
|
+ value: item.id
|
|
|
|
|
+ })),
|
|
|
|
|
+ form.config.setting_config.mcp_services
|
|
|
|
|
+ )
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
async function loadSkills() {
|
|
async function loadSkills() {
|
|
|
- skillLoading.value = true
|
|
|
|
|
- try {
|
|
|
|
|
- const res = await resource.postSkillsList({})
|
|
|
|
|
- if (res?.isSuccess) {
|
|
|
|
|
- allSkillOptions.value = ((res.result || []) as SkillItem[]).map((item) => ({
|
|
|
|
|
- label: item.name,
|
|
|
|
|
- value: item.name,
|
|
|
|
|
- description: item.description
|
|
|
|
|
- }))
|
|
|
|
|
- skillOptions.value = mergeOptions(
|
|
|
|
|
- skillOptions.value,
|
|
|
|
|
- filterLocalOptions(allSkillOptions.value, ''),
|
|
|
|
|
- form.config.setting_config.selected_skills
|
|
|
|
|
- )
|
|
|
|
|
- }
|
|
|
|
|
- } finally {
|
|
|
|
|
- skillLoading.value = false
|
|
|
|
|
|
|
+ const res = await resource.postSkillsList({})
|
|
|
|
|
+ if (res?.isSuccess) {
|
|
|
|
|
+ allSkillOptions.value = ((res.result || []) as SkillItem[]).map((item) => ({
|
|
|
|
|
+ label: item.name,
|
|
|
|
|
+ value: item.name,
|
|
|
|
|
+ description: item.description
|
|
|
|
|
+ }))
|
|
|
|
|
+ skillOptions.value = mergeOptions(
|
|
|
|
|
+ skillOptions.value,
|
|
|
|
|
+ filterLocalOptions(allSkillOptions.value, ''),
|
|
|
|
|
+ form.config.setting_config.selected_skills
|
|
|
|
|
+ )
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -1669,7 +1571,6 @@ async function loadDetail(id: string) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
async function handleOpen() {
|
|
async function handleOpen() {
|
|
|
- console.log('handleOpen', props.agentId)
|
|
|
|
|
loadTools()
|
|
loadTools()
|
|
|
if (props.configOnly) {
|
|
if (props.configOnly) {
|
|
|
const initialMode =
|
|
const initialMode =
|
|
@@ -1686,7 +1587,7 @@ async function handleOpen() {
|
|
|
resetForm()
|
|
resetForm()
|
|
|
}
|
|
}
|
|
|
await Promise.all([
|
|
await Promise.all([
|
|
|
- loadModels(),
|
|
|
|
|
|
|
+ fetchModels(),
|
|
|
loadKnowledgeBases(),
|
|
loadKnowledgeBases(),
|
|
|
loadWebSearchProviders(),
|
|
loadWebSearchProviders(),
|
|
|
loadMcpServices(),
|
|
loadMcpServices(),
|
|
@@ -2073,6 +1974,7 @@ watch(
|
|
|
font-weight: 500;
|
|
font-weight: 500;
|
|
|
line-height: 1.5;
|
|
line-height: 1.5;
|
|
|
color: var(--agent-text);
|
|
color: var(--agent-text);
|
|
|
|
|
+ margin-top: -2px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.tool-option__desc {
|
|
.tool-option__desc {
|