mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-02 17:30:23 +08:00
refactor: 共享请求管道、按需懒加载、流式内存护栏与连接池治理
- 抽取 ApiRequestPipeline 单例,44 个路由文件共享同一实例 - Handler/Adapter 模块级 __getattr__ 延迟导入,减少启动时间 - 新增 ensure_stream_buffer_limit() 流式内存护栏(16MB 单行 / 32MB 总量) - HTTP 空闲连接清理与 curl_cffi LRU 会话池 - ensure_providers_bootstrapped 按需引导指定 provider_types - Usage 事件序列化迁移至 msgpack,Redis codec 隔离 - 启动预热任务(/readyz 就绪门控)与优雅关闭 - 通知邮件模块独立开关与 SMTP 配置校验 - CryptoService DCL 线程安全修复 - 通知模块开关 DB 查询 30s 内存缓存 - /readyz 对 unknown 状态返回 503 - 预热关闭 5s 超时保护 - 预热适配器逐个 try-except 容错 - FormatConversionRegistry 哨兵模式防并发重复物化 - 流式缓冲检查无条件执行 Closes #230 Co-authored-by: AAEE86 <ppk0227@hotmail.com>
This commit is contained in:
@@ -573,10 +573,19 @@
|
||||
/>
|
||||
</div>
|
||||
<div
|
||||
v-if="key.upstream_metadata.codex.primary_reset_seconds"
|
||||
class="text-[9px] text-muted-foreground/70 mt-0.5"
|
||||
v-if="key.upstream_metadata.codex.primary_reset_at || key.upstream_metadata.codex.primary_reset_seconds"
|
||||
class="text-[9px] mt-0.5 tabular-nums"
|
||||
:class="getResetCountdownClass(
|
||||
key.upstream_metadata.codex.primary_reset_at,
|
||||
key.upstream_metadata.codex.primary_reset_seconds,
|
||||
key.upstream_metadata.codex.updated_at
|
||||
)"
|
||||
>
|
||||
{{ formatResetTime(key.upstream_metadata.codex.primary_reset_seconds) }}后重置
|
||||
{{ getResetCountdownText(
|
||||
key.upstream_metadata.codex.primary_reset_at,
|
||||
key.upstream_metadata.codex.primary_reset_seconds,
|
||||
key.upstream_metadata.codex.updated_at
|
||||
) }}
|
||||
</div>
|
||||
</div>
|
||||
<!-- 5H限额(仅 Team/Plus/Enterprise 显示) -->
|
||||
@@ -594,9 +603,20 @@
|
||||
:style="{ width: `${Math.max(100 - key.upstream_metadata.codex.secondary_used_percent, 0)}%` }"
|
||||
/>
|
||||
</div>
|
||||
<div class="text-[9px] text-muted-foreground/70 mt-0.5">
|
||||
<template v-if="key.upstream_metadata.codex.secondary_reset_seconds">
|
||||
{{ formatResetTime(key.upstream_metadata.codex.secondary_reset_seconds) }}后重置
|
||||
<div
|
||||
class="text-[9px] mt-0.5 tabular-nums"
|
||||
:class="getResetCountdownClass(
|
||||
key.upstream_metadata.codex.secondary_reset_at,
|
||||
key.upstream_metadata.codex.secondary_reset_seconds,
|
||||
key.upstream_metadata.codex.updated_at
|
||||
)"
|
||||
>
|
||||
<template v-if="key.upstream_metadata.codex.secondary_reset_at || key.upstream_metadata.codex.secondary_reset_seconds">
|
||||
{{ getResetCountdownText(
|
||||
key.upstream_metadata.codex.secondary_reset_at,
|
||||
key.upstream_metadata.codex.secondary_reset_seconds,
|
||||
key.upstream_metadata.codex.updated_at
|
||||
) }}
|
||||
</template>
|
||||
<template v-else>
|
||||
已重置
|
||||
@@ -1063,7 +1083,7 @@ import { Popover, PopoverTrigger, PopoverContent } from '@/components/ui'
|
||||
import { useToast } from '@/composables/useToast'
|
||||
import { useConfirm } from '@/composables/useConfirm'
|
||||
import { useClipboard } from '@/composables/useClipboard'
|
||||
import { useCountdownTimer, formatCountdown, getOAuthExpiresCountdown } from '@/composables/useCountdownTimer'
|
||||
import { useCountdownTimer, formatCountdown, getOAuthExpiresCountdown, getCodexResetCountdown } from '@/composables/useCountdownTimer'
|
||||
import {
|
||||
getProvider,
|
||||
getProviderEndpoints,
|
||||
@@ -2526,6 +2546,28 @@ function getAntigravityQuotaSummary(metadata: UpstreamMetadata | null | undefine
|
||||
return result
|
||||
}
|
||||
|
||||
function getResetCountdownText(
|
||||
resetAt: number | null | undefined,
|
||||
resetSecs: number | null | undefined,
|
||||
updatedAt: number | null | undefined
|
||||
): string {
|
||||
const status = getCodexResetCountdown(resetAt, resetSecs, updatedAt, countdownTick.value)
|
||||
if (!status) return ''
|
||||
return status.isExpired ? status.text : `${status.text} 后重置`
|
||||
}
|
||||
|
||||
function getResetCountdownClass(
|
||||
resetAt: number | null | undefined,
|
||||
resetSecs: number | null | undefined,
|
||||
updatedAt: number | null | undefined
|
||||
): string {
|
||||
const status = getCodexResetCountdown(resetAt, resetSecs, updatedAt, countdownTick.value)
|
||||
if (!status || status.isExpired) return 'text-muted-foreground/70'
|
||||
if (status.isCritical) return 'text-destructive font-medium animate-pulse'
|
||||
if (status.isUrgent) return 'text-amber-500 dark:text-amber-400'
|
||||
return 'text-muted-foreground/70'
|
||||
}
|
||||
|
||||
// 格式化重置时间
|
||||
function formatResetTime(seconds: number): string {
|
||||
const days = Math.floor(seconds / 86400)
|
||||
|
||||
Reference in New Issue
Block a user