feat: 新增 Kiro 适配器、OAuth 改进与多项功能增强

- 新增 Kiro provider 适配器(EventStream 协议解析、令牌管理、用量追踪)
- 重构 OAuth 账户管理与统一配额机制
- 重构 Handler 基类(CLI adapter/handler、请求构建器、流处理器)
- 增强缓存监控后端 API 与前端可视化
- 改进 Gemini 格式标准化器与请求头处理
- Antigravity/Codex 适配器更新,移除旧 metadata_collector
- 新增数据库迁移:proxy provider API keys
- 前端 UI 多项优化

Co-Authored-By: AAEE86 <ppk0227@hotmail.com>
This commit is contained in:
fawney19
2026-02-09 01:05:48 +08:00
parent e324ffdcd6
commit b34dd12863
82 changed files with 6498 additions and 840 deletions

View File

@@ -169,6 +169,41 @@ export const {
listAffinities
} = cacheApi
// ==================== Redis 缓存分类管理 API ====================
export interface RedisCacheCategory {
key: string
name: string
pattern: string
description: string
count: number
}
export interface RedisCacheCategoriesResponse {
available: boolean
message?: string
categories: RedisCacheCategory[]
total_keys: number
}
export const redisCacheApi = {
/**
* 获取 Redis 缓存分类概览
*/
async getCategories(): Promise<RedisCacheCategoriesResponse> {
const response = await api.get('/api/admin/monitoring/cache/redis-keys')
return response.data.data
},
/**
* 清除指定分类的 Redis 缓存
*/
async clearCategory(category: string): Promise<{ status: string; message: string; category: string; deleted_count: number }> {
const response = await api.delete(`/api/admin/monitoring/cache/redis-keys/${category}`)
return response.data
}
}
// ==================== 缓存亲和性分析 API ====================
export interface TTLAnalysisUser {

View File

@@ -67,6 +67,14 @@ export async function revealEndpointKey(keyId: string): Promise<RevealKeyResult>
return response.data
}
/**
* 导出 OAuth Key 凭据(扁平 JSON用于跨实例迁移
*/
export async function exportKey(keyId: string): Promise<Record<string, any>> {
const response = await client.get(`/api/admin/endpoints/keys/${keyId}/export`)
return response.data
}
/**
* 删除 Key
*/
@@ -140,6 +148,7 @@ export async function updateProviderKey(
auto_fetch_models: boolean // 是否启用自动获取模型
model_include_patterns: string[] // 模型包含规则
model_exclude_patterns: string[] // 模型排除规则
proxy: import('./types').ProxyConfig | null // Key 级别代理配置
}>
): Promise<EndpointAPIKey> {
const response = await client.put(`/api/admin/endpoints/keys/${keyId}`, data)
@@ -176,3 +185,33 @@ export async function refreshProviderQuota(providerId: string): Promise<RefreshQ
const response = await client.post(`/api/admin/endpoints/providers/${providerId}/refresh-quota`)
return response.data
}
/**
* 批量导入 OAuth 凭据(通用)
* 支持的 Provider 类型Codex、Antigravity、GeminiCli、ClaudeCode、Kiro
*/
export interface BatchImportResultItem {
index: number
status: 'success' | 'error'
key_id?: string
key_name?: string
auth_method?: string
error?: string
}
export interface BatchImportResult {
total: number
success: number
failed: number
results: BatchImportResultItem[]
}
export async function batchImportOAuth(
providerId: string,
credentials: string
): Promise<BatchImportResult> {
const response = await client.post(`/api/admin/provider-oauth/providers/${providerId}/batch-import`, {
credentials,
})
return response.data
}

View File

@@ -24,7 +24,7 @@ export async function updateProvider(
providerId: string,
data: Partial<{
name: string
provider_type: 'custom' | 'claude_code' | 'codex' | 'gemini_cli' | 'antigravity'
provider_type: 'custom' | 'claude_code' | 'codex' | 'gemini_cli' | 'antigravity' | 'kiro'
description: string | null
website: string
provider_priority: number
@@ -53,7 +53,7 @@ export async function updateProvider(
export async function createProvider(
data: {
name: string
provider_type?: 'custom' | 'claude_code' | 'codex' | 'gemini_cli' | 'antigravity'
provider_type?: 'custom' | 'claude_code' | 'codex' | 'gemini_cli' | 'antigravity' | 'kiro'
description?: string
website?: string
billing_type?: 'monthly_quota' | 'pay_as_you_go' | 'free_tier'

View File

@@ -278,19 +278,26 @@ export interface EndpointAPIKey {
oauth_invalid_reason?: string | null // OAuth Token 失效原因
// 上游元数据(由上游响应采集,如 Codex 额度信息 / Antigravity 配额信息)
upstream_metadata?: UpstreamMetadata | null
// Key 级别代理配置(覆盖 Provider 级别代理)
proxy?: ProxyConfig | null
}
// Codex 上游元数据类型
export interface CodexUpstreamMetadata {
updated_at?: number // 更新时间Unix 时间戳)
plan_type?: string // 套餐类型
primary_used_percent?: number // 限额窗口使用百分比
primary_reset_seconds?: number // 限额重置剩余秒数
primary_reset_at?: number // 限额重置时间Unix 时间戳)
primary_window_minutes?: number // 限额窗口大小(分钟)
secondary_used_percent?: number // 次级限额窗口使用百分比
secondary_reset_seconds?: number // 次级限额重置剩余秒数
secondary_reset_at?: number // 次级限额重置时间Unix 时间戳)
secondary_window_minutes?: number // 次级限额窗口大小(分钟)
primary_used_percent?: number // 限额窗口使用百分比
primary_reset_seconds?: number // 限额重置剩余秒数
primary_reset_at?: number // 限额重置时间Unix 时间戳)
primary_window_minutes?: number // 限额窗口大小(分钟)
secondary_used_percent?: number // 5H限额窗口使用百分比
secondary_reset_seconds?: number // 5H限额重置剩余秒数
secondary_reset_at?: number // 5H限额重置时间Unix 时间戳)
secondary_window_minutes?: number // 5H限额窗口大小(分钟)
code_review_used_percent?: number // 代码审查限额使用百分比
code_review_reset_seconds?: number // 代码审查限额重置剩余秒数
code_review_reset_at?: number // 代码审查限额重置时间Unix 时间戳)
code_review_window_minutes?: number // 代码审查限额窗口大小(分钟)
has_credits?: boolean // 是否有积分
credits_balance?: number // 积分余额
}
@@ -306,8 +313,22 @@ export interface AntigravityUpstreamMetadata {
quota_by_model?: Record<string, AntigravityModelQuota>
}
export interface UpstreamMetadata extends CodexUpstreamMetadata {
// Kiro 上游配额信息
export interface KiroUpstreamMetadata {
subscription_title?: string // 订阅类型 (如 "KIRO PRO+")
current_usage?: number // 当前使用量
usage_limit?: number // 使用限额
remaining?: number // 剩余额度
usage_percentage?: number // 使用百分比 (0-100)
next_reset_at?: number // 下次重置时间Unix 时间戳,毫秒)
email?: string // 用户邮箱
updated_at?: number // Unix 时间戳(秒)
}
export interface UpstreamMetadata {
codex?: CodexUpstreamMetadata
antigravity?: AntigravityUpstreamMetadata
kiro?: KiroUpstreamMetadata
}
// 按格式的健康度数据
@@ -351,6 +372,8 @@ export interface EndpointAPIKeyUpdate {
// 模型过滤规则(仅当 auto_fetch_models=true 时生效)
model_include_patterns?: string[] // 模型包含规则(支持 * 和 ? 通配符)
model_exclude_patterns?: string[] // 模型排除规则(支持 * 和 ? 通配符)
// Key 级别代理配置(覆盖 Provider 级别代理null=清除
proxy?: ProxyConfig | null
}
export interface EndpointHealthDetail {
@@ -421,7 +444,7 @@ export interface PublicEndpointStatusMonitorResponse {
formats: PublicEndpointStatusMonitor[]
}
export type ProviderType = 'custom' | 'claude_code' | 'codex' | 'gemini_cli' | 'antigravity'
export type ProviderType = 'custom' | 'claude_code' | 'codex' | 'gemini_cli' | 'antigravity' | 'kiro'
export interface ProviderWithEndpointsSummary {
id: string