{
const bedrockAccounts = ref([])
const geminiAccounts = ref([])
const openaiAccounts = ref([])
+ const azureOpenaiAccounts = ref([])
const loading = ref(false)
const error = ref(null)
const sortBy = ref('')
@@ -111,6 +112,25 @@ export const useAccountsStore = defineStore('accounts', () => {
}
}
+ // 获取Azure OpenAI账户列表
+ const fetchAzureOpenAIAccounts = async () => {
+ loading.value = true
+ error.value = null
+ try {
+ const response = await apiClient.get('/admin/azure-openai-accounts')
+ if (response.success) {
+ azureOpenaiAccounts.value = response.data || []
+ } else {
+ throw new Error(response.message || '获取Azure OpenAI账户失败')
+ }
+ } catch (err) {
+ error.value = err.message
+ throw err
+ } finally {
+ loading.value = false
+ }
+ }
+
// 获取所有账户
const fetchAllAccounts = async () => {
loading.value = true
@@ -121,7 +141,8 @@ export const useAccountsStore = defineStore('accounts', () => {
fetchClaudeConsoleAccounts(),
fetchBedrockAccounts(),
fetchGeminiAccounts(),
- fetchOpenAIAccounts()
+ fetchOpenAIAccounts(),
+ fetchAzureOpenAIAccounts()
])
} catch (err) {
error.value = err.message
@@ -231,6 +252,26 @@ export const useAccountsStore = defineStore('accounts', () => {
}
}
+ // 创建Azure OpenAI账户
+ const createAzureOpenAIAccount = async (data) => {
+ loading.value = true
+ error.value = null
+ try {
+ const response = await apiClient.post('/admin/azure-openai-accounts', data)
+ if (response.success) {
+ await fetchAzureOpenAIAccounts()
+ return response.data
+ } else {
+ throw new Error(response.message || '创建Azure OpenAI账户失败')
+ }
+ } catch (err) {
+ error.value = err.message
+ throw err
+ } finally {
+ loading.value = false
+ }
+ }
+
// 更新Claude账户
const updateClaudeAccount = async (id, data) => {
loading.value = true
@@ -331,6 +372,26 @@ export const useAccountsStore = defineStore('accounts', () => {
}
}
+ // 更新Azure OpenAI账户
+ const updateAzureOpenAIAccount = async (id, data) => {
+ loading.value = true
+ error.value = null
+ try {
+ const response = await apiClient.put(`/admin/azure-openai-accounts/${id}`, data)
+ if (response.success) {
+ await fetchAzureOpenAIAccounts()
+ return response
+ } else {
+ throw new Error(response.message || '更新Azure OpenAI账户失败')
+ }
+ } catch (err) {
+ error.value = err.message
+ throw err
+ } finally {
+ loading.value = false
+ }
+ }
+
// 切换账户状态
const toggleAccount = async (platform, id) => {
loading.value = true
@@ -345,6 +406,10 @@ export const useAccountsStore = defineStore('accounts', () => {
endpoint = `/admin/bedrock-accounts/${id}/toggle`
} else if (platform === 'gemini') {
endpoint = `/admin/gemini-accounts/${id}/toggle`
+ } else if (platform === 'openai') {
+ endpoint = `/admin/openai-accounts/${id}/toggle`
+ } else if (platform === 'azure_openai') {
+ endpoint = `/admin/azure-openai-accounts/${id}/toggle`
} else {
endpoint = `/admin/openai-accounts/${id}/toggle`
}
@@ -359,6 +424,10 @@ export const useAccountsStore = defineStore('accounts', () => {
await fetchBedrockAccounts()
} else if (platform === 'gemini') {
await fetchGeminiAccounts()
+ } else if (platform === 'openai') {
+ await fetchOpenAIAccounts()
+ } else if (platform === 'azure_openai') {
+ await fetchAzureOpenAIAccounts()
} else {
await fetchOpenAIAccounts()
}
@@ -388,6 +457,10 @@ export const useAccountsStore = defineStore('accounts', () => {
endpoint = `/admin/bedrock-accounts/${id}`
} else if (platform === 'gemini') {
endpoint = `/admin/gemini-accounts/${id}`
+ } else if (platform === 'openai') {
+ endpoint = `/admin/openai-accounts/${id}`
+ } else if (platform === 'azure_openai') {
+ endpoint = `/admin/azure-openai-accounts/${id}`
} else {
endpoint = `/admin/openai-accounts/${id}`
}
@@ -402,6 +475,10 @@ export const useAccountsStore = defineStore('accounts', () => {
await fetchBedrockAccounts()
} else if (platform === 'gemini') {
await fetchGeminiAccounts()
+ } else if (platform === 'openai') {
+ await fetchOpenAIAccounts()
+ } else if (platform === 'azure_openai') {
+ await fetchAzureOpenAIAccounts()
} else {
await fetchOpenAIAccounts()
}
@@ -580,6 +657,7 @@ export const useAccountsStore = defineStore('accounts', () => {
bedrockAccounts.value = []
geminiAccounts.value = []
openaiAccounts.value = []
+ azureOpenaiAccounts.value = []
loading.value = false
error.value = null
sortBy.value = ''
@@ -593,6 +671,7 @@ export const useAccountsStore = defineStore('accounts', () => {
bedrockAccounts,
geminiAccounts,
openaiAccounts,
+ azureOpenaiAccounts,
loading,
error,
sortBy,
@@ -604,17 +683,20 @@ export const useAccountsStore = defineStore('accounts', () => {
fetchBedrockAccounts,
fetchGeminiAccounts,
fetchOpenAIAccounts,
+ fetchAzureOpenAIAccounts,
fetchAllAccounts,
createClaudeAccount,
createClaudeConsoleAccount,
createBedrockAccount,
createGeminiAccount,
createOpenAIAccount,
+ createAzureOpenAIAccount,
updateClaudeAccount,
updateClaudeConsoleAccount,
updateBedrockAccount,
updateGeminiAccount,
updateOpenAIAccount,
+ updateAzureOpenAIAccount,
toggleAccount,
deleteAccount,
refreshClaudeToken,
diff --git a/web/admin-spa/src/stores/dashboard.js b/web/admin-spa/src/stores/dashboard.js
index 70d1984f..20cc40b6 100644
--- a/web/admin-spa/src/stores/dashboard.js
+++ b/web/admin-spa/src/stores/dashboard.js
@@ -19,6 +19,8 @@ export const useDashboardStore = defineStore('dashboard', () => {
claude: { total: 0, normal: 0, abnormal: 0, paused: 0, rateLimited: 0 },
'claude-console': { total: 0, normal: 0, abnormal: 0, paused: 0, rateLimited: 0 },
gemini: { total: 0, normal: 0, abnormal: 0, paused: 0, rateLimited: 0 },
+ openai: { total: 0, normal: 0, abnormal: 0, paused: 0, rateLimited: 0 },
+ azure_openai: { total: 0, normal: 0, abnormal: 0, paused: 0, rateLimited: 0 },
bedrock: { total: 0, normal: 0, abnormal: 0, paused: 0, rateLimited: 0 }
},
todayRequests: 0,
@@ -174,6 +176,8 @@ export const useDashboardStore = defineStore('dashboard', () => {
claude: { total: 0, normal: 0, abnormal: 0, paused: 0, rateLimited: 0 },
'claude-console': { total: 0, normal: 0, abnormal: 0, paused: 0, rateLimited: 0 },
gemini: { total: 0, normal: 0, abnormal: 0, paused: 0, rateLimited: 0 },
+ openai: { total: 0, normal: 0, abnormal: 0, paused: 0, rateLimited: 0 },
+ azure_openai: { total: 0, normal: 0, abnormal: 0, paused: 0, rateLimited: 0 },
bedrock: { total: 0, normal: 0, abnormal: 0, paused: 0, rateLimited: 0 }
},
todayRequests: recentActivity.requestsToday || 0,
diff --git a/web/admin-spa/src/views/AccountsView.vue b/web/admin-spa/src/views/AccountsView.vue
index deed5c1a..f0555b6e 100644
--- a/web/admin-spa/src/views/AccountsView.vue
+++ b/web/admin-spa/src/views/AccountsView.vue
@@ -7,7 +7,7 @@
账户管理
- 管理您的 Claude 和 Gemini 账户及代理配置
+ 管理您的 Claude、Gemini、OpenAI 和 Azure OpenAI 账户及代理配置
@@ -820,6 +841,7 @@ const platformOptions = ref([
{ value: 'claude-console', label: 'Claude Console', icon: 'fa-terminal' },
{ value: 'gemini', label: 'Gemini', icon: 'fa-google' },
{ value: 'openai', label: 'OpenAi', icon: 'fa-openai' },
+ { value: 'azure_openai', label: 'Azure OpenAI', icon: 'fab fa-microsoft' },
{ value: 'bedrock', label: 'Bedrock', icon: 'fab fa-aws' }
])
@@ -912,7 +934,8 @@ const loadAccounts = async (forceReload = false) => {
apiClient.get('/admin/claude-console-accounts', { params }),
apiClient.get('/admin/bedrock-accounts', { params }),
apiClient.get('/admin/gemini-accounts', { params }),
- apiClient.get('/admin/openai-accounts', { params })
+ apiClient.get('/admin/openai-accounts', { params }),
+ apiClient.get('/admin/azure-openai-accounts', { params })
)
} else {
// 只请求指定平台,其他平台设为null占位
@@ -958,7 +981,7 @@ const loadAccounts = async (forceReload = false) => {
// 加载分组成员关系(需要在分组数据加载完成后)
await loadGroupMembers(forceReload)
- const [claudeData, claudeConsoleData, bedrockData, geminiData, openaiData] =
+ const [claudeData, claudeConsoleData, bedrockData, geminiData, openaiData, azureOpenaiData] =
await Promise.all(requests)
const allAccounts = []
@@ -1016,6 +1039,17 @@ const loadAccounts = async (forceReload = false) => {
})
allAccounts.push(...openaiAccounts)
}
+ if (azureOpenaiData && azureOpenaiData.success) {
+ const azureOpenaiAccounts = (azureOpenaiData.data || []).map((acc) => {
+ // 计算每个Azure OpenAI账户绑定的API Key数量
+ const boundApiKeysCount = apiKeys.value.filter(
+ (key) => key.azureOpenaiAccountId === acc.id
+ ).length
+ const groupInfo = accountGroupMap.value.get(acc.id) || null
+ return { ...acc, platform: 'azure_openai', boundApiKeysCount, groupInfo }
+ })
+ allAccounts.push(...azureOpenaiAccounts)
+ }
accounts.value = allAccounts
} catch (error) {
@@ -1244,6 +1278,8 @@ const deleteAccount = async (account) => {
endpoint = `/admin/bedrock-accounts/${account.id}`
} else if (account.platform === 'openai') {
endpoint = `/admin/openai-accounts/${account.id}`
+ } else if (account.platform === 'azure_openai') {
+ endpoint = `/admin/azure-openai-accounts/${account.id}`
} else {
endpoint = `/admin/gemini-accounts/${account.id}`
}
@@ -1316,6 +1352,8 @@ const toggleSchedulable = async (account) => {
endpoint = `/admin/gemini-accounts/${account.id}/toggle-schedulable`
} else if (account.platform === 'openai') {
endpoint = `/admin/openai-accounts/${account.id}/toggle-schedulable`
+ } else if (account.platform === 'azure_openai') {
+ endpoint = `/admin/azure-openai-accounts/${account.id}/toggle-schedulable`
} else {
showToast('该账户类型暂不支持调度控制', 'warning')
return
diff --git a/web/admin-spa/src/views/DashboardView.vue b/web/admin-spa/src/views/DashboardView.vue
index 3341555d..17b7d361 100644
--- a/web/admin-spa/src/views/DashboardView.vue
+++ b/web/admin-spa/src/views/DashboardView.vue
@@ -105,6 +105,20 @@
dashboardData.accountsByPlatform.openai.total
}}