mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-02 09:20:22 +08:00
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:
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user