Files
sub2api/backend/internal/service/shadow_routing.go
T
李建琦 6d655c9903
Release / update-version (push) Has been cancelled
Release / build-frontend (push) Has been cancelled
Release / release (push) Has been cancelled
Release / sync-version-file (push) Has been cancelled
CI / shell (push) Canceled after 0s
CI / test (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
CI / golangci-lint (push) Canceled after 0s
Security Scan / backend-security (push) Canceled after 0s
Security Scan / frontend-security (push) Canceled after 0s
Sub2API v1.0 - AI API 网关(二开初始版本,基于上游 Wei-Shaw/sub2api)
2026-08-21 18:30:13 +08:00

52 lines
2.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package service
// parentHealthyForShadow 报告 spark 影子账号的母账号凭据是否可用(影子据此可被调度)。
//
// 非影子账号直接返回 true(不受此检查约束)。
// lookup 将母账号 ID 解析为当前 Account(来自调度快照 map 或 repo)。
//
// 关键语义(F1 决策 A + 外审 D):母账号须仍是 OpenAI OAuth(fail-closed——否则透传凭据解析必失败,
// 影子不应进调度候选),且凭据「可用」。IsCredentialUsableForShadow 检查:账号 active、OAuth token
// 未过期、且**未处于 TempUnschedulableUntil 冷却期**——对 OpenAI 账号该字段由 401/token 刷新耗尽/
// transport·proxy 故障写入,代表共享凭据或传输坏死,故**连坐**影子。
//
// **刻意排除** global 维度的 RateLimitResetAt/OverloadUntil 与母账号手动 Schedulable 开关:
// 母账号 global 429 不得连坐 spark 影子,否则会重新耦合影子架构本应解耦的两条 429 道。
// 母账号未找到(nil)、非 OpenAI OAuth、或凭据不可用时影子被挡。
func parentHealthyForShadow(account *Account, lookup func(int64) *Account) bool {
if account == nil || !account.IsShadow() {
return true
}
parent := lookup(*account.ParentAccountID)
if parent == nil {
return false
}
return parent.IsOpenAIOAuth() && parent.IsCredentialUsableForShadow()
}
// sparkModelVariants 返回所有归一到 spark 的模型 ID(当前仅 basespark 无 effort 变体)。
// 从 codexModelMap 派生,使集合与别名表单一来源、不漂移;若上游将来新增 spark 变体,
// 在 codexModelMap 注册后此处自动跟随。
func sparkModelVariants() []string {
out := make([]string, 0, 1)
for alias, target := range codexModelMap {
if target == "gpt-5.3-codex-spark" {
out = append(out, alias)
}
}
return out
}
// defaultSparkShadowModelMapping 返回 spark 影子账号的默认 model_mapping。
//
// 恒等映射(key 映射到自身)把「只接 spark」限制落在 key 白名单上,模型零改写、
// 与空 mapping 透传行为一致。当前 spark 仅 base 一个模型(无 effort 变体)。
func defaultSparkShadowModelMapping() map[string]any {
variants := sparkModelVariants()
mapping := make(map[string]any, len(variants))
for _, m := range variants {
mapping[m] = m
}
return mapping
}