mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-11-04 00:42:14 +00:00
feat(grok): 吸收调度阈值、配额解析、批量用量与 CLI 身份
从 personal-dev 取优并接线到 feat/grok-complete-integration: - 调度阈值:grok_sched_* 写入、ApplyAccountSchedulingThreshold、 account_scheduling_thresholds 设置与 Settings UI、网关过滤 - 配额头:x-rate-limit 别名、相对秒 reset、tier/entitlement 扩展 - 批量 usage:GetUsageBatch + POST /usage/batch + AccountsView 合并加载 - CLI 身份:xai.cli_identity 统一 pin/UA;service 层 applyGrokCLIHeaders 与 transport 最终改写对齐;media eligibility 模块落地 - UsageCell:月度 cents→USD 与 30d 进度条展示 保留既有 failure taxonomy / sticky / free recovery 等 HEAD cools。
This commit is contained in:
1 parent
0316994c52
commit
7c62382d04
55 files changed
+3542
-162
No files matched your search
@@ -317,6 +317,19 @@ export async function getUsage(id: number, source?: 'passive' | 'active', force?
|
||||
return data
|
||||
}
|
||||
|
||||
export interface BatchAccountUsageResponse {
|
||||
usage: Record<string, AccountUsageInfo>
|
||||
errors: Record<string, string>
|
||||
}
|
||||
|
||||
export async function getBatchUsage(accountIds: number[], force?: boolean): Promise<BatchAccountUsageResponse> {
|
||||
const { data } = await apiClient.post<BatchAccountUsageResponse>('/admin/accounts/usage/batch', {
|
||||
account_ids: accountIds,
|
||||
force: force === true
|
||||
})
|
||||
return data
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear account rate limit status
|
||||
* @param id - Account ID
|
||||
@@ -986,6 +999,7 @@ export const accountsAPI = {
|
||||
getStats,
|
||||
clearError,
|
||||
getUsage,
|
||||
getBatchUsage,
|
||||
getTodayStats,
|
||||
getBatchTodayStats,
|
||||
clearRateLimit,
|
||||
|
||||
@@ -32,6 +32,38 @@ export type DefaultPlatformQuotasMap = Partial<Record<PlatformType, PlatformQuot
|
||||
|
||||
const PLATFORMS: PlatformType[] = ["anthropic", "openai", "gemini", "antigravity", "grok"]
|
||||
|
||||
export type SchedulingThresholdPlatformType =
|
||||
| "openai"
|
||||
| "anthropic"
|
||||
| "grok"
|
||||
|
||||
export type AccountSchedulingThresholdsMap = Record<SchedulingThresholdPlatformType, number>
|
||||
|
||||
export const SCHEDULING_THRESHOLD_PLATFORMS: SchedulingThresholdPlatformType[] = [
|
||||
"openai",
|
||||
"anthropic",
|
||||
"grok",
|
||||
]
|
||||
|
||||
export function normalizeAccountSchedulingThresholdsMap(
|
||||
input?: Partial<Record<SchedulingThresholdPlatformType, number>> | null,
|
||||
): AccountSchedulingThresholdsMap {
|
||||
const result = {} as AccountSchedulingThresholdsMap
|
||||
for (const platform of SCHEDULING_THRESHOLD_PLATFORMS) {
|
||||
const value = input?.[platform]
|
||||
result[platform] = typeof value === "number" && Number.isFinite(value)
|
||||
? Math.min(100, Math.max(1, Math.trunc(value)))
|
||||
: 100
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
export function sanitizeAccountSchedulingThresholdsMap(
|
||||
input?: Partial<Record<SchedulingThresholdPlatformType, number>> | null,
|
||||
): AccountSchedulingThresholdsMap {
|
||||
return normalizeAccountSchedulingThresholdsMap(input)
|
||||
}
|
||||
|
||||
/** 归一化为全 4 平台 × 3 窗口(缺失填 null),供模板非空绑定 */
|
||||
export function normalizePlatformQuotasMap(input?: DefaultPlatformQuotasMap | null): DefaultPlatformQuotasMap {
|
||||
const result: DefaultPlatformQuotasMap = {}
|
||||
@@ -559,6 +591,9 @@ export interface SystemSettings {
|
||||
grok_default_text_model: string;
|
||||
grok_cross_client_model_map_enabled: boolean;
|
||||
|
||||
// Per-platform account auto-pause thresholds (100 = disabled)
|
||||
account_scheduling_thresholds: AccountSchedulingThresholdsMap;
|
||||
|
||||
// Identity patch configuration (Claude -> Gemini)
|
||||
enable_identity_patch: boolean;
|
||||
identity_patch_prompt: string;
|
||||
@@ -876,6 +911,7 @@ export interface UpdateSettingsRequest {
|
||||
fallback_model_antigravity?: string;
|
||||
grok_default_text_model?: string;
|
||||
grok_cross_client_model_map_enabled?: boolean;
|
||||
account_scheduling_thresholds?: AccountSchedulingThresholdsMap;
|
||||
enable_identity_patch?: boolean;
|
||||
identity_patch_prompt?: string;
|
||||
ops_monitoring_enabled?: boolean;
|
||||
|
||||
Reference in new issue
Block a user