Skip to content

Commit 31bcdaf

Browse files
committed
refactor(ui): 统一图像与文本模型的测试连接逻辑至 composable 层
- 将图像模型的 canTestConnection、canRefreshModels、isConnectionConfigured 逻辑统一迁移至 useImageModelManager - 文本模型新增模式支持测试连接功能,行为与图像模型保持一致 - 统一连接可用性判断逻辑,修改 canTestFormConnection 依赖 modelId 而非 name 进行校验 - 移除图像模型中冗余的 v-if="selectedProvider" 条件,由 manager 层统一控制状态 - 组件层职责收敛为纯 UI 展示,业务逻辑全部收拢至 manager 层管理 - 架构调整后,文本与图像模型的连接管理逻辑保持一致,提升代码可维护性
1 parent b8bd391 commit 31bcdaf

File tree

3 files changed

+38
-39
lines changed

3 files changed

+38
-39
lines changed

packages/ui/src/components/ImageModelEditModal.vue

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@
149149
<template #action>
150150
<NSpace justify="space-between" align="center" style="width: 100%;">
151151
<!-- 左侧:连接测试 -->
152-
<NSpace align="center" v-if="selectedProvider">
152+
<NSpace align="center">
153153
<NButton
154154
@click="handleTestConnection"
155155
:loading="isTestingConnection"
@@ -262,7 +262,9 @@ const {
262262
selectedProvider,
263263
selectedModel,
264264
currentParameterDefinitions,
265-
// (use local computed for UI gates)
265+
isConnectionConfigured,
266+
canTestConnection,
267+
canRefreshModels,
266268
267269
// methods
268270
onProviderChange: handleProviderChange,
@@ -340,23 +342,6 @@ const connectionFields = computed(() => {
340342
return fields
341343
})
342344
343-
const isConnectionConfigured = computed(() => {
344-
if (!selectedProvider.value?.connectionSchema) return true
345-
346-
const schema = selectedProvider.value.connectionSchema
347-
const config = configForm.value.connectionConfig || {}
348-
349-
return schema.required.every(field => config[field])
350-
})
351-
352-
const canTestConnection = computed(() => {
353-
return selectedProvider.value && isConnectionConfigured.value
354-
})
355-
356-
const canRefreshModels = computed(() => {
357-
return selectedProvider.value?.supportsDynamicModels && isConnectionConfigured.value
358-
})
359-
360345
const refreshButtonTooltip = computed(() => {
361346
if (canRefreshModels.value) {
362347
return t('image.model.refreshTooltip')

packages/ui/src/composables/model/useImageModelManager.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,19 @@ export function useImageModelManager() {
152152
supportsDynamicModels.value && isConnectionConfigured.value && !isLoadingDynamicModels.value
153153
)
154154

155+
const canTestConnection = computed(() => {
156+
// 测试期间禁用
157+
if (isTestingConnection.value) return false
158+
// 必须有必需的连接配置
159+
if (!isConnectionConfigured.value) return false
160+
// 必须有模型 ID(发送请求所需)
161+
if (!configForm.value.modelId?.trim()) return false
162+
// 必须有 provider
163+
if (!configForm.value.providerId) return false
164+
165+
return true
166+
})
167+
155168
// 初始化数据加载
156169
const loadProviders = async () => {
157170
isLoadingProviders.value = true
@@ -696,6 +709,7 @@ export function useImageModelManager() {
696709
supportsDynamicModels,
697710
isConnectionConfigured,
698711
canRefreshModels,
712+
canTestConnection,
699713
currentParameterDefinitions,
700714
currentParamOverrides,
701715
availableParameterCount,

packages/ui/src/composables/model/useTextModelManager.ts

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -153,14 +153,14 @@ export function useTextModelManager() {
153153
})
154154

155155
const canTestFormConnection = computed(() => {
156-
// 必须在编辑模式下
157-
if (!editingModelId.value) return false
158156
// 测试期间禁用
159157
if (isTestingFormConnection.value) return false
160158
// 必须有必需的连接配置
161159
if (!isConnectionConfigured.value) return false
162-
// 必须有模型名称
163-
if (!form.value.name?.trim()) return false
160+
// 必须有模型 ID(发送请求所需)
161+
if (!form.value.modelId?.trim()) return false
162+
// 必须有 provider
163+
if (!form.value.providerId) return false
164164

165165
return true
166166
})
@@ -614,34 +614,32 @@ export function useTextModelManager() {
614614
formConnectionStatus.value = { type: 'info', message: t('modelManager.testing') }
615615

616616
try {
617-
const existingConfig = editingModelId.value ? await modelManager.getModel(editingModelId.value) : undefined
618-
if (!existingConfig) {
619-
throw new Error('模型配置不存在')
620-
}
621-
622617
if (!form.value.providerId || !form.value.modelId) {
623618
throw new Error('模型未选择')
624619
}
625620

626-
const providerMeta = ensureProviderMeta(form.value.providerId, existingConfig.providerMeta)
627-
const modelMeta = ensureModelMeta(form.value.providerId, form.value.modelId, existingConfig.modelMeta)
621+
// 编辑模式下获取现有配置,新增模式下为 undefined
622+
const existingConfig = editingModelId.value ? await modelManager.getModel(editingModelId.value) : undefined
623+
624+
const providerMeta = ensureProviderMeta(form.value.providerId, existingConfig?.providerMeta)
625+
const modelMeta = ensureModelMeta(form.value.providerId, form.value.modelId, existingConfig?.modelMeta)
628626

629627
const baseURL = typeof form.value.connectionConfig?.baseURL === 'string'
630628
? form.value.connectionConfig.baseURL.trim()
631629
: undefined
632630

633631
const connectionConfig: TextConnectionConfig = {
634-
baseURL: baseURL || existingConfig.connectionConfig?.baseURL,
635-
...existingConfig.connectionConfig,
632+
baseURL: baseURL || existingConfig?.connectionConfig?.baseURL,
633+
...existingConfig?.connectionConfig,
636634
...form.value.connectionConfig,
637635
apiKey: form.value.displayMaskedKey && form.value.originalApiKey
638636
? form.value.originalApiKey
639-
: (form.value.connectionConfig.apiKey || existingConfig.connectionConfig?.apiKey)
637+
: (form.value.connectionConfig.apiKey || existingConfig?.connectionConfig?.apiKey)
640638
}
641639

642640
const tempConfig = {
643-
id: `temp-test-${editingModelId.value}-${Date.now()}`,
644-
name: form.value.name,
641+
id: `temp-test-${editingModelId.value || 'new'}-${Date.now()}`,
642+
name: form.value.name || form.value.modelId,
645643
enabled: form.value.enabled,
646644
providerMeta,
647645
modelMeta,
@@ -654,8 +652,9 @@ export function useTextModelManager() {
654652
try {
655653
// 测试临时模型
656654
await llmService.testConnection(tempConfig.id)
657-
formConnectionStatus.value = { type: 'success', message: t('modelManager.testSuccess', { provider: form.value.name }) }
658-
toast.success(t('modelManager.testSuccess', { provider: form.value.name }))
655+
const displayName = form.value.name || form.value.modelId
656+
formConnectionStatus.value = { type: 'success', message: t('modelManager.testSuccess', { provider: displayName }) }
657+
toast.success(t('modelManager.testSuccess', { provider: displayName }))
659658
} finally {
660659
// 清理临时模型
661660
try {
@@ -667,11 +666,12 @@ export function useTextModelManager() {
667666

668667
} catch (error) {
669668
console.error('连接测试失败:', error)
669+
const displayName = form.value.name || form.value.modelId
670670
formConnectionStatus.value = {
671671
type: 'error',
672-
message: t('modelManager.testFailed', { provider: form.value.name, error: error instanceof Error ? error.message : 'Unknown error' || 'Unknown error' })
672+
message: t('modelManager.testFailed', { provider: displayName, error: error instanceof Error ? error.message : 'Unknown error' })
673673
}
674-
toast.error(t('modelManager.testFailed', { provider: form.value.name, error: error instanceof Error ? error.message : 'Unknown error' || 'Unknown error' }))
674+
toast.error(t('modelManager.testFailed', { provider: displayName, error: error instanceof Error ? error.message : 'Unknown error' }))
675675
} finally {
676676
isTestingFormConnection.value = false
677677
}

0 commit comments

Comments
 (0)