feat(models): add external catalog proxy selection

This commit is contained in:
elky
2026-07-31 09:32:25 +08:00
parent 12057db476
commit beb003b7ad
34 changed files with 2286 additions and 176 deletions
@@ -36,6 +36,7 @@
>
<ListChecks class="w-3.5 h-3.5" />
</Button>
<ExternalModelsAccessControl />
<Button
variant="ghost"
size="icon"
@@ -691,6 +692,7 @@ import {
} from 'lucide-vue-next'
import ModelDetailDrawer from '@/features/models/components/ModelDetailDrawer.vue'
import GlobalModelFormDialog from '@/features/models/components/GlobalModelFormDialog.vue'
import ExternalModelsAccessControl from '@/features/models/components/ExternalModelsAccessControl.vue'
import ProviderModelFormDialog from '@/features/providers/components/ProviderModelFormDialog.vue'
import type { Model } from '@/api/endpoints'
import { useToast } from '@/composables/useToast'
+9 -5
View File
@@ -103,6 +103,7 @@ import { useToast } from '@/composables/useToast'
import { useConfirm } from '@/composables/useConfirm'
import { useClipboard } from '@/composables/useClipboard'
import { useI18n } from '@/i18n'
import { clearModelsDevCache } from '@/api/models-dev'
import {
proxyNodesApi,
type ProxyNode,
@@ -117,6 +118,7 @@ import {
import { Card } from '@/components/ui'
import { parseApiError } from '@/utils/errorParser'
import { parseBatchProxyNodeInput } from './proxy-node-batch'
import { proxyNodeDeleteSuccessMessage } from './proxy-node-delete-feedback'
import ProxyNodeBatchUpgradeDialog from './components/ProxyNodeBatchUpgradeDialog.vue'
import ProxyNodeEventsDialog from './components/ProxyNodeEventsDialog.vue'
import ProxyNodeFormDialog from './components/ProxyNodeFormDialog.vue'
@@ -597,12 +599,14 @@ async function handleDelete(node: ProxyNode) {
try {
const result = await proxyNodesApi.deleteProxyNode(node.id)
await store.fetchNodes()
if (result.cleared_system_proxy) {
success(legacyT('代理节点已删除,系统默认代理已自动清除'))
} else {
success(legacyT('代理节点已删除'))
if (result.cleared_external_models_proxy) {
clearModelsDevCache()
}
await store.fetchNodes()
success(legacyT(proxyNodeDeleteSuccessMessage(
result.cleared_system_proxy,
result.cleared_external_models_proxy,
)))
} catch (err: unknown) {
toastError(parseApiError(err, legacyT('删除失败')))
}
@@ -0,0 +1,36 @@
import { describe, expect, it } from 'vitest'
import { proxyNodeDeleteSuccessMessage } from '../proxy-node-delete-feedback'
describe('proxyNodeDeleteSuccessMessage', () => {
it.each([
{
clearedSystemProxy: true,
clearedExternalModelsProxy: true,
expected: '代理节点已删除,系统默认代理和外部模型目录代理已自动清除',
},
{
clearedSystemProxy: true,
clearedExternalModelsProxy: false,
expected: '代理节点已删除,系统默认代理已自动清除',
},
{
clearedSystemProxy: false,
clearedExternalModelsProxy: true,
expected: '代理节点已删除,外部模型目录代理已自动清除',
},
{
clearedSystemProxy: false,
clearedExternalModelsProxy: false,
expected: '代理节点已删除',
},
])(
'returns the coordinated message for system=$clearedSystemProxy and external=$clearedExternalModelsProxy',
({ clearedSystemProxy, clearedExternalModelsProxy, expected }) => {
expect(proxyNodeDeleteSuccessMessage(
clearedSystemProxy,
clearedExternalModelsProxy,
)).toBe(expected)
},
)
})
@@ -0,0 +1,15 @@
export function proxyNodeDeleteSuccessMessage(
clearedSystemProxy: boolean,
clearedExternalModelsProxy: boolean,
): string {
if (clearedSystemProxy && clearedExternalModelsProxy) {
return '代理节点已删除,系统默认代理和外部模型目录代理已自动清除'
}
if (clearedSystemProxy) {
return '代理节点已删除,系统默认代理已自动清除'
}
if (clearedExternalModelsProxy) {
return '代理节点已删除,外部模型目录代理已自动清除'
}
return '代理节点已删除'
}