mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-11-06 08:49:24 +00:00
feat(claude): 自动同步 Claude Code 客户端版本号
出站伪装用的 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,避免缓存翻转 瞬间头体版本不一致被判非正版客户端 - 管理后台设置页新增配置区块,含中英文案与「当前同步到」只读展示
This commit is contained in:
1 parent
5e244e7382
commit
ca08825935
37 files changed
+1208
-70
No files matched your search
@@ -10,6 +10,7 @@ import (
|
||||
"github.com/Wei-Shaw/sub2api/internal/config"
|
||||
"github.com/Wei-Shaw/sub2api/internal/payment"
|
||||
"github.com/Wei-Shaw/sub2api/internal/pkg/antigravity"
|
||||
"github.com/Wei-Shaw/sub2api/internal/pkg/claude"
|
||||
"github.com/Wei-Shaw/sub2api/internal/pkg/logger"
|
||||
"github.com/Wei-Shaw/sub2api/internal/pkg/xai"
|
||||
"github.com/google/wire"
|
||||
@@ -415,6 +416,18 @@ func ProvideOpenAICodexVersionSyncService(
|
||||
return svc
|
||||
}
|
||||
|
||||
// ProvideClaudeCodeVersionSyncService creates and starts ClaudeCodeVersionSyncService.
|
||||
// 出站 Claude Code 身份的版本号靠它跟随官方发布,无需为了跟版本而发新版本;面板可关闭。
|
||||
func ProvideClaudeCodeVersionSyncService(
|
||||
settingRepo SettingRepository,
|
||||
settingService *SettingService,
|
||||
githubClient GitHubReleaseClient,
|
||||
) *ClaudeCodeVersionSyncService {
|
||||
svc := NewClaudeCodeVersionSyncService(settingRepo, settingService, githubClient, claudeCodeVersionSyncInterval)
|
||||
svc.Start()
|
||||
return svc
|
||||
}
|
||||
|
||||
// ProvideProxyExpiryService creates and starts ProxyExpiryService.
|
||||
func ProvideProxyExpiryService(proxyRepo ProxyRepository) *ProxyExpiryService {
|
||||
svc := NewProxyExpiryService(proxyRepo, time.Minute)
|
||||
@@ -794,6 +807,11 @@ func ProvideSettingService(settingRepo SettingRepository, groupRepo GroupReposit
|
||||
SetCodexCanonicalUserAgentResolver(func() string {
|
||||
return svc.GetOpenAICodexCanonicalUserAgent(context.Background())
|
||||
})
|
||||
// Claude CLI 伪装版本号同理:运行期解析(面板手动值 → 后台同步值 → 内置基线),
|
||||
// 解析器内部自带 60s TTL 缓存,热路径不触库。
|
||||
claude.SetCLIVersionResolver(func() string {
|
||||
return svc.GetClaudeCodeClientVersion(context.Background())
|
||||
})
|
||||
return svc
|
||||
}
|
||||
|
||||
@@ -920,6 +938,7 @@ var ProviderSet = wire.NewSet(
|
||||
wire.Bind(new(GrokOAuthReconciler), new(*TokenRefreshService)),
|
||||
ProvideAccountExpiryService,
|
||||
ProvideOpenAICodexVersionSyncService,
|
||||
ProvideClaudeCodeVersionSyncService,
|
||||
ProvideProxyExpiryService,
|
||||
ProvideSubscriptionExpiryService,
|
||||
ProvideTimingWheelService,
|
||||
|
||||
Reference in new issue
Block a user