diff --git a/dashboard/src/components/shared/ProviderSelector.vue b/dashboard/src/components/shared/ProviderSelector.vue
index ffade98d1..9be8c5da0 100644
--- a/dashboard/src/components/shared/ProviderSelector.vue
+++ b/dashboard/src/components/shared/ProviderSelector.vue
@@ -14,8 +14,20 @@
-
- {{ tm('providerSelector.dialogTitle') }}
+
+ {{ tm('providerSelector.dialogTitle') }}
+
+ {{ tm('providerSelector.createProvider') }}
+
@@ -79,12 +91,33 @@
+
+
+
+
+
+
+
diff --git a/dashboard/src/i18n/locales/en-US/core/shared.json b/dashboard/src/i18n/locales/en-US/core/shared.json
index f24a10b89..2131f4ef9 100644
--- a/dashboard/src/i18n/locales/en-US/core/shared.json
+++ b/dashboard/src/i18n/locales/en-US/core/shared.json
@@ -40,6 +40,8 @@
"cancelSelection": "Cancel",
"clearSelection": "None",
"clearSelectionSubtitle": "Clear current selection",
- "unknownType": "Unknown type"
+ "unknownType": "Unknown type",
+ "createProvider": "Create Provider",
+ "manageProviders": "Provider Management"
}
}
diff --git a/dashboard/src/i18n/locales/zh-CN/core/shared.json b/dashboard/src/i18n/locales/zh-CN/core/shared.json
index 1fbf50553..067dc8dda 100644
--- a/dashboard/src/i18n/locales/zh-CN/core/shared.json
+++ b/dashboard/src/i18n/locales/zh-CN/core/shared.json
@@ -40,6 +40,8 @@
"cancelSelection": "取消",
"clearSelection": "不选择",
"clearSelectionSubtitle": "清除当前选择",
- "unknownType": "未知类型"
+ "unknownType": "未知类型",
+ "createProvider": "创建提供商",
+ "manageProviders": "提供商管理"
}
}
diff --git a/dashboard/src/views/ProviderPage.vue b/dashboard/src/views/ProviderPage.vue
index a86b0bb85..4a51c6578 100644
--- a/dashboard/src/views/ProviderPage.vue
+++ b/dashboard/src/views/ProviderPage.vue
@@ -36,7 +36,6 @@
{{ tm('providerSources.title') }}
- {{ displayedProviderSources.length }}
@@ -126,7 +125,6 @@
{{ tm('models.configured') }}
-
{{ tm('models.available') }} {{
availableModels.length }}
@@ -359,6 +357,13 @@ import ItemCard from '@/components/shared/ItemCard.vue'
import AddNewProvider from '@/components/provider/AddNewProvider.vue'
import { getProviderIcon } from '@/utils/providerUtils'
+const props = defineProps({
+ defaultTab: {
+ type: String,
+ default: 'chat_completion'
+ }
+})
+
const { tm } = useModuleI18n('features/provider')
const router = useRouter()
@@ -367,7 +372,7 @@ const config = ref({})
const metadata = ref({})
const providerSources = ref([])
const providers = ref([])
-const selectedProviderType = ref('chat_completion')
+const selectedProviderType = ref(resolveDefaultTab(props.defaultTab))
const selectedProviderSource = ref(null)
const selectedProviderSourceOriginalId = ref(null)
const editableProviderSource = ref(null)
@@ -607,6 +612,32 @@ function isTypeMatchingProviderType(type, providerType) {
return type && type.includes(providerType)
}
+function resolveDefaultTab(value) {
+ const normalized = (value || '').toLowerCase()
+
+ if (normalized.startsWith('select_agent_runner_provider') || normalized === 'agent_runner') {
+ return 'agent_runner'
+ }
+
+ if (normalized === 'select_provider_stt' || normalized === 'speech_to_text' || normalized.includes('stt')) {
+ return 'speech_to_text'
+ }
+
+ if (normalized === 'select_provider_tts' || normalized === 'text_to_speech' || normalized.includes('tts')) {
+ return 'text_to_speech'
+ }
+
+ if (normalized.includes('embedding')) {
+ return 'embedding'
+ }
+
+ if (normalized.includes('rerank')) {
+ return 'rerank'
+ }
+
+ return 'chat_completion'
+}
+
function resolveSourceIcon(source) {
if (!source) return ''
@@ -959,6 +990,10 @@ onMounted(async () => {
await loadProviderTemplate()
})
+watch(() => props.defaultTab, (val) => {
+ selectedProviderType.value = resolveDefaultTab(val)
+})
+
// 跟踪编辑中的 provider source 是否被修改
watch(editableProviderSource, () => {
if (suppressSourceWatch) return