mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-10-14 12:02:27 +08:00
出站伪装用的 Claude Code 版本号此前硬编码在 claude.CLICurrentVersion, 只能靠环境变量 SUB2API_CLAUDE_CLI_VERSION 覆盖且需重启;Anthropic 抬高 版本下限时(如 Opus 5.5 要求 >= 2.1.280)必须改代码发版才能跟上。 改为每小时从官方 GitHub Releases 同步最新稳定版,无需重启也无需发版。 - 新增 ClaudeCodeVersionSyncService:1 小时间隔,数据源 anthropics/claude-code 的 releases/latest,失败回退最近 30 条列表;过滤 draft/prerelease; 只向前推进,拉取失败保留上次值不降级;面板可关闭 - 新增三个设置项:claude_code_client_version(管理员手动固定)、 claude_code_client_version_synced(同步服务独占写)、 claude_code_version_auto_sync_enabled(开关,默认开) - 取值优先级:面板手动值 -> 同步值 -> SUB2API_CLAUDE_CLI_VERSION -> 内置基线, 每层经 IsSupportedCLIVersion 校验,含 60s 缓存与 singleflight - 版本号运行期化:claude.DefaultHeaders 由包级 var 改为函数,新增 EffectiveCLIVersion/DefaultUserAgent 与 SetCLIVersionResolver(未注入时 与 CLIVersion() 等价);identity 的 defaultFingerprint 不再在包 init 固化, 指纹下限与主版本超前校验改用运行期值 - 守住一致性铁律:buildUpstreamRequest 与 count_tokens 各取一次 UA 字符串, 同时喂给出站 User-Agent 头与请求体 billing 的 cc_version,避免缓存翻转 瞬间头体版本不一致被判非正版客户端 - 管理后台设置页新增配置区块,含中英文案与「当前同步到」只读展示
44 lines
1.6 KiB
Go
44 lines
1.6 KiB
Go
package claude
|
|
|
|
import "sync/atomic"
|
|
|
|
// cliVersionResolver 返回运行期生效的 Claude CLI 版本号(管理员面板手动值 →
|
|
// 后台同步值)。由 SettingService 在装配时注入(wire.go),解析器内部自带
|
|
// TTL 缓存,热路径不触库。
|
|
//
|
|
// 未注入时(所有不经过 wire 的单元测试)EffectiveCLIVersion() 与 CLIVersion()
|
|
// 完全等价,行为不变。
|
|
type cliVersionResolverFunc func() string
|
|
|
|
var cliVersionResolver atomic.Pointer[cliVersionResolverFunc]
|
|
|
|
// SetCLIVersionResolver 注入运行期版本解析器;传 nil 可撤销注入。
|
|
func SetCLIVersionResolver(resolver func() string) {
|
|
if resolver == nil {
|
|
cliVersionResolver.Store(nil)
|
|
return
|
|
}
|
|
r := cliVersionResolverFunc(resolver)
|
|
cliVersionResolver.Store(&r)
|
|
}
|
|
|
|
// EffectiveCLIVersion 返回当前生效的 Claude CLI 版本号。
|
|
// resolver 返回值必须通过 IsSupportedCLIVersion 校验(严格三段 semver 且不低于
|
|
// 内置基线),否则回退 CLIVersion()(环境变量覆盖 → 内置基线)。
|
|
// 运行期值恒 >= 内置基线,identity_service 的"只升不降"语义不受影响。
|
|
func EffectiveCLIVersion() string {
|
|
if r := cliVersionResolver.Load(); r != nil {
|
|
if v := (*r)(); IsSupportedCLIVersion(v) {
|
|
return v
|
|
}
|
|
}
|
|
return CLIVersion()
|
|
}
|
|
|
|
// DefaultUserAgent 返回 Claude Code CLI 伪装 User-Agent。
|
|
// 所有出站路径都必须经本函数取 UA,保证 User-Agent 头与请求体 billing
|
|
// attribution 块中的 cc_version 始终源自同一个版本号。
|
|
func DefaultUserAgent() string {
|
|
return "claude-cli/" + EffectiveCLIVersion() + " (external, cli)"
|
|
}
|