diff --git a/web/admin-spa/src/components/apikeys/BatchEditApiKeyModal.vue b/web/admin-spa/src/components/apikeys/BatchEditApiKeyModal.vue index 1d9635b0..39eff929 100644 --- a/web/admin-spa/src/components/apikeys/BatchEditApiKeyModal.vue +++ b/web/admin-spa/src/components/apikeys/BatchEditApiKeyModal.vue @@ -581,6 +581,7 @@ const refreshAccounts = async () => { claudeData, claudeConsoleData, geminiData, + geminiApiData, openaiData, openaiResponsesData, bedrockData, @@ -590,6 +591,7 @@ const refreshAccounts = async () => { apiClient.get('/admin/claude-accounts'), apiClient.get('/admin/claude-console-accounts'), apiClient.get('/admin/gemini-accounts'), + apiClient.get('/admin/gemini-api-accounts'), // 获取 Gemini-API 账号 apiClient.get('/admin/openai-accounts'), apiClient.get('/admin/openai-responses-accounts'), apiClient.get('/admin/bedrock-accounts'), @@ -622,13 +624,31 @@ const refreshAccounts = async () => { localAccounts.value.claude = claudeAccounts + // 合并 Gemini OAuth 和 Gemini API 账号 + const geminiAccounts = [] + if (geminiData.success) { - localAccounts.value.gemini = (geminiData.data || []).map((account) => ({ - ...account, - isDedicated: account.accountType === 'dedicated' - })) + ;(geminiData.data || []).forEach((account) => { + geminiAccounts.push({ + ...account, + platform: 'gemini', + isDedicated: account.accountType === 'dedicated' + }) + }) } + if (geminiApiData.success) { + ;(geminiApiData.data || []).forEach((account) => { + geminiAccounts.push({ + ...account, + platform: 'gemini-api', + isDedicated: account.accountType === 'dedicated' + }) + }) + } + + localAccounts.value.gemini = geminiAccounts + const openaiAccounts = [] if (openaiData.success) { @@ -819,12 +839,20 @@ onMounted(async () => { // 初始化账号数据 if (props.accounts) { + // props.accounts.gemini 已经包含了 OAuth 和 API 两种类型的账号(父组件已合并) + // 保留原有的 platform 属性,不要覆盖 + const geminiAccounts = (props.accounts.gemini || []).map((account) => ({ + ...account, + platform: account.platform || 'gemini' // 保留原有 platform,只在没有时设默认值 + })) + + // props.accounts.openai 只包含 openai 类型,openaiResponses 需要单独处理 const openaiAccounts = [] if (props.accounts.openai) { props.accounts.openai.forEach((account) => { openaiAccounts.push({ ...account, - platform: 'openai' + platform: account.platform || 'openai' }) }) } @@ -832,17 +860,20 @@ onMounted(async () => { props.accounts.openaiResponses.forEach((account) => { openaiAccounts.push({ ...account, - platform: 'openai-responses' + platform: account.platform || 'openai-responses' }) }) } localAccounts.value = { claude: props.accounts.claude || [], - gemini: props.accounts.gemini || [], + gemini: geminiAccounts, openai: openaiAccounts, bedrock: props.accounts.bedrock || [], - droid: props.accounts.droid || [], + droid: (props.accounts.droid || []).map((account) => ({ + ...account, + platform: account.platform || 'droid' + })), claudeGroups: props.accounts.claudeGroups || [], geminiGroups: props.accounts.geminiGroups || [], openaiGroups: props.accounts.openaiGroups || [], diff --git a/web/admin-spa/src/components/apikeys/CreateApiKeyModal.vue b/web/admin-spa/src/components/apikeys/CreateApiKeyModal.vue index f699b442..056c3e73 100644 --- a/web/admin-spa/src/components/apikeys/CreateApiKeyModal.vue +++ b/web/admin-spa/src/components/apikeys/CreateApiKeyModal.vue @@ -986,13 +986,20 @@ onMounted(async () => { availableTags.value = await apiKeysStore.fetchTags() // 初始化账号数据 if (props.accounts) { - // 合并 OpenAI 和 OpenAI-Responses 账号 + // props.accounts.gemini 已经包含了 OAuth 和 API 两种类型的账号(父组件已合并) + // 保留原有的 platform 属性,不要覆盖 + const geminiAccounts = (props.accounts.gemini || []).map((account) => ({ + ...account, + platform: account.platform || 'gemini' // 保留原有 platform,只在没有时设默认值 + })) + + // props.accounts.openai 只包含 openai 类型,openaiResponses 需要单独处理 const openaiAccounts = [] if (props.accounts.openai) { props.accounts.openai.forEach((account) => { openaiAccounts.push({ ...account, - platform: 'openai' + platform: account.platform || 'openai' }) }) } @@ -1000,19 +1007,19 @@ onMounted(async () => { props.accounts.openaiResponses.forEach((account) => { openaiAccounts.push({ ...account, - platform: 'openai-responses' + platform: account.platform || 'openai-responses' }) }) } localAccounts.value = { claude: props.accounts.claude || [], - gemini: props.accounts.gemini || [], + gemini: geminiAccounts, openai: openaiAccounts, bedrock: props.accounts.bedrock || [], droid: (props.accounts.droid || []).map((account) => ({ ...account, - platform: 'droid' + platform: account.platform || 'droid' })), claudeGroups: props.accounts.claudeGroups || [], geminiGroups: props.accounts.geminiGroups || [], @@ -1032,6 +1039,7 @@ const refreshAccounts = async () => { claudeData, claudeConsoleData, geminiData, + geminiApiData, openaiData, openaiResponsesData, bedrockData, @@ -1041,6 +1049,7 @@ const refreshAccounts = async () => { apiClient.get('/admin/claude-accounts'), apiClient.get('/admin/claude-console-accounts'), apiClient.get('/admin/gemini-accounts'), + apiClient.get('/admin/gemini-api-accounts'), // 获取 Gemini-API 账号 apiClient.get('/admin/openai-accounts'), apiClient.get('/admin/openai-responses-accounts'), // 获取 OpenAI-Responses 账号 apiClient.get('/admin/bedrock-accounts'), @@ -1073,13 +1082,31 @@ const refreshAccounts = async () => { localAccounts.value.claude = claudeAccounts + // 合并 Gemini OAuth 和 Gemini API 账号 + const geminiAccounts = [] + if (geminiData.success) { - localAccounts.value.gemini = (geminiData.data || []).map((account) => ({ - ...account, - isDedicated: account.accountType === 'dedicated' // 保留以便向后兼容 - })) + ;(geminiData.data || []).forEach((account) => { + geminiAccounts.push({ + ...account, + platform: 'gemini', + isDedicated: account.accountType === 'dedicated' + }) + }) } + if (geminiApiData.success) { + ;(geminiApiData.data || []).forEach((account) => { + geminiAccounts.push({ + ...account, + platform: 'gemini-api', + isDedicated: account.accountType === 'dedicated' + }) + }) + } + + localAccounts.value.gemini = geminiAccounts + // 合并 OpenAI 和 OpenAI-Responses 账号 const openaiAccounts = [] diff --git a/web/admin-spa/src/components/apikeys/EditApiKeyModal.vue b/web/admin-spa/src/components/apikeys/EditApiKeyModal.vue index 782b52ac..fd831c2b 100644 --- a/web/admin-spa/src/components/apikeys/EditApiKeyModal.vue +++ b/web/admin-spa/src/components/apikeys/EditApiKeyModal.vue @@ -1179,32 +1179,20 @@ onMounted(async () => { // 初始化账号数据 if (props.accounts) { - // 合并 Gemini OAuth 和 Gemini API 账号 - const geminiAccounts = [] - if (props.accounts.gemini) { - props.accounts.gemini.forEach((account) => { - geminiAccounts.push({ - ...account, - platform: 'gemini' - }) - }) - } - if (props.accounts.geminiApi) { - props.accounts.geminiApi.forEach((account) => { - geminiAccounts.push({ - ...account, - platform: 'gemini-api' - }) - }) - } + // props.accounts.gemini 已经包含了 OAuth 和 API 两种类型的账号(父组件已合并) + // 保留原有的 platform 属性,不要覆盖 + const geminiAccounts = (props.accounts.gemini || []).map((account) => ({ + ...account, + platform: account.platform || 'gemini' // 保留原有 platform,只在没有时设默认值 + })) - // 合并 OpenAI 和 OpenAI-Responses 账号 + // props.accounts.openai 只包含 openai 类型,openaiResponses 需要单独处理 const openaiAccounts = [] if (props.accounts.openai) { props.accounts.openai.forEach((account) => { openaiAccounts.push({ ...account, - platform: 'openai' + platform: account.platform || 'openai' }) }) } @@ -1212,7 +1200,7 @@ onMounted(async () => { props.accounts.openaiResponses.forEach((account) => { openaiAccounts.push({ ...account, - platform: 'openai-responses' + platform: account.platform || 'openai-responses' }) }) } @@ -1224,7 +1212,7 @@ onMounted(async () => { bedrock: props.accounts.bedrock || [], droid: (props.accounts.droid || []).map((account) => ({ ...account, - platform: 'droid' + platform: account.platform || 'droid' })), claudeGroups: props.accounts.claudeGroups || [], geminiGroups: props.accounts.geminiGroups || [], diff --git a/web/admin-spa/src/views/ApiKeysView.vue b/web/admin-spa/src/views/ApiKeysView.vue index d2af046e..d68fe6d3 100644 --- a/web/admin-spa/src/views/ApiKeysView.vue +++ b/web/admin-spa/src/views/ApiKeysView.vue @@ -2158,6 +2158,7 @@ const defaultTime = ref([new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 2, 1, 23, const accounts = ref({ claude: [], gemini: [], + geminiApi: [], // 添加 Gemini-API 账号列表(用于传递给子组件初始化) openai: [], openaiResponses: [], // 添加 OpenAI-Responses 账号列表 bedrock: [], @@ -2372,12 +2373,15 @@ const loadAccounts = async (forceRefresh = false) => { } if (geminiApiData.success) { - ;(geminiApiData.data || []).forEach((account) => { - geminiAccounts.push({ - ...account, - platform: 'gemini-api', - isDedicated: account.accountType === 'dedicated' - }) + // 保存原始 Gemini-API 账号列表供子组件初始化使用 + accounts.value.geminiApi = (geminiApiData.data || []).map((account) => ({ + ...account, + platform: 'gemini-api', + isDedicated: account.accountType === 'dedicated' + })) + // 同时添加到合并列表 + accounts.value.geminiApi.forEach((account) => { + geminiAccounts.push(account) }) }