模型映射表 (可选)
-
+
+
+
+ 留空表示支持所有模型且不修改请求。配置映射后,左侧模型会被识别为支持的模型,右侧是实际发送的模型。
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+ 留空表示支持所有模型。如果指定模型,请求中的模型不在列表内将不会调度到此账号
+
@@ -1240,6 +1351,31 @@ const form = ref({
smallFastModel: props.account?.smallFastModel || ''
})
+// 模型映射表数据
+const modelMappings = ref([])
+
+// 初始化模型映射表
+const initModelMappings = () => {
+ if (props.account?.supportedModels) {
+ // 如果是对象格式(新的映射表)
+ if (
+ typeof props.account.supportedModels === 'object' &&
+ !Array.isArray(props.account.supportedModels)
+ ) {
+ modelMappings.value = Object.entries(props.account.supportedModels).map(([from, to]) => ({
+ from,
+ to
+ }))
+ } else if (Array.isArray(props.account.supportedModels)) {
+ // 如果是数组格式(旧格式),转换为映射表
+ modelMappings.value = props.account.supportedModels.map((model) => ({
+ from: model,
+ to: model
+ }))
+ }
+ }
+}
+
// 表单验证错误
const errors = ref({
name: '',
@@ -1353,15 +1489,28 @@ const copySetupTokenAuthUrl = async () => {
setupTokenCopied.value = false
}, 2000)
} catch (error) {
- // 降级方案
- const input = document.createElement('input')
- input.value = setupTokenAuthUrl.value
- document.body.appendChild(input)
- input.select()
- document.execCommand('copy')
- document.body.removeChild(input)
- setupTokenCopied.value = true
- showToast('链接已复制', 'success')
+ // 降级方案 - 使用 textarea 替代 input,禁用 ESLint 警告
+ const textarea = document.createElement('textarea')
+ textarea.value = setupTokenAuthUrl.value
+ textarea.style.position = 'fixed'
+ textarea.style.opacity = '0'
+ document.body.appendChild(textarea)
+ textarea.select()
+
+ try {
+ // eslint-disable-next-line
+ const successful = document.execCommand('copy')
+ if (successful) {
+ setupTokenCopied.value = true
+ showToast('链接已复制', 'success')
+ } else {
+ showToast('复制失败,请手动复制', 'error')
+ }
+ } catch (err) {
+ showToast('复制失败,请手动复制', 'error')
+ }
+
+ document.body.removeChild(textarea)
setTimeout(() => {
setupTokenCopied.value = false
}, 2000)
@@ -1561,9 +1710,7 @@ const createAccount = async () => {
data.apiUrl = form.value.apiUrl
data.apiKey = form.value.apiKey
data.priority = form.value.priority || 50
- data.supportedModels = form.value.supportedModels
- ? form.value.supportedModels.split('\n').filter((m) => m.trim())
- : []
+ data.supportedModels = convertMappingsToObject() || {}
data.userAgent = form.value.userAgent || null
data.rateLimitDuration = form.value.rateLimitDuration || 60
} else if (form.value.platform === 'bedrock') {
@@ -1699,9 +1846,7 @@ const updateAccount = async () => {
data.apiKey = form.value.apiKey
}
data.priority = form.value.priority || 50
- data.supportedModels = form.value.supportedModels
- ? form.value.supportedModels.split('\n').filter((m) => m.trim())
- : []
+ data.supportedModels = convertMappingsToObject() || {}
data.userAgent = form.value.userAgent || null
data.rateLimitDuration = form.value.rateLimitDuration || 60
}
@@ -1914,23 +2059,38 @@ watch(
}
)
-// 添加预设模型
-const addPresetModel = (modelName) => {
- // 获取当前模型列表
- const currentModels = form.value.supportedModels
- ? form.value.supportedModels.split('\n').filter((m) => m.trim())
- : []
+// 添加模型映射
+const addModelMapping = () => {
+ modelMappings.value.push({ from: '', to: '' })
+}
- // 检查是否已存在
- if (currentModels.includes(modelName)) {
- showToast(`模型 ${modelName} 已存在`, 'info')
+// 移除模型映射
+const removeModelMapping = (index) => {
+ modelMappings.value.splice(index, 1)
+}
+
+// 添加预设映射
+const addPresetMapping = (from, to) => {
+ // 检查是否已存在相同的映射
+ const exists = modelMappings.value.some((mapping) => mapping.from === from)
+ if (exists) {
+ showToast(`模型 ${from} 的映射已存在`, 'info')
return
}
- // 添加到列表
- currentModels.push(modelName)
- form.value.supportedModels = currentModels.join('\n')
- showToast(`已添加模型 ${modelName}`, 'success')
+ modelMappings.value.push({ from, to })
+ showToast(`已添加映射: ${from} → ${to}`, 'success')
+}
+
+// 将模型映射表转换为对象格式
+const convertMappingsToObject = () => {
+ const mapping = {}
+ modelMappings.value.forEach((item) => {
+ if (item.from && item.to) {
+ mapping[item.from] = item.to
+ }
+ })
+ return Object.keys(mapping).length > 0 ? mapping : null
}
// 监听账户变化,更新表单
@@ -1938,6 +2098,7 @@ watch(
() => props.account,
(newAccount) => {
if (newAccount) {
+ initModelMappings()
// 重新初始化代理配置
const proxyConfig =
newAccount.proxy && newAccount.proxy.host && newAccount.proxy.port