Feature/20260529 opus 4.8 - #5188
Closed
gladhu wants to merge 25 commits into
Closed
Conversation
…ge 并强化 VChart key。 - 经典主题:generateChartTimePoints 按筛选区间生成刻度并与聚合 showYear 对齐;刷新/搜索传入区间;请求前将起止时间归一到当日 00:00 与 23:59:59。 - 筛选默认值:快捷范围改为自然日(首尾整日);应用筛选时将起止对齐到整天。 - 全局默认时间粒度改为 day(common.DataExportDefaultTime、默认主题常量与经典本地兜底/后台表单初始值)。
Dockerfile 增加构建参数 RESERVE_CPU_CORES(默认 1),表示给宿主机预留的 CPU 个数。 builder / builder-classic(两次 bun run build):BuildKit 常会并行跑这两个 stage,因此每个 stage 里设 GOMAXPROCS = max(1, ⌊(nproc − RESERVE) / 2⌋), 两个一起跑时大致不会超过「全部核心 − 预留」。 builder2(go build):单独跑,使用 GOMAXPROCS = max(1, nproc − RESERVE)。 Dockerfile.dev 同样支持 RESERVE_CPU_CORES,仅在 go build 前设置 GOMAXPROCS(没有两个前端并行的问题)。 用法示例 docker build -t "new-api:$(cat VERSION)" . # 预留 2 个核给宿主机: docker build --build-arg RESERVE_CPU_CORES=2 -t "new-api:$(cat VERSION)" . 你需要知道的限制 GOMAXPROCS 主要约束 Go 编译器和会读它的工具(例如 esbuild);Rspack/Bun 其它线程不保证完全被压住。 若机器核心很少(例如 2 核还要预留 1 核),并行前端仍可能偏紧;这时可加大 RESERVE_CPU_CORES,或给 BuildKit 配 max-parallelism = 1 让 stage 串行。
后端 API 接口:GET /api/channel/:id/consumption(需管理员权限) 查询参数: 参数 说明 start_timestamp 开始时间(Unix 秒) end_timestamp 结束时间(Unix 秒) user_id 可选,筛选某用户在该渠道的消费 username 可选,与 user_id 二选一 未传时间时,默认统计本月 1 日 00:00 至当前。 示例: # 渠道 5 在 2026 年 3 月的总消费 GET /api/channel/5/consumption?start_timestamp=1740787200&end_timestamp=1743465599 # 用户 alice 在渠道 5 上某段时间的消费 GET /api/channel/5/consumption?start_timestamp=...&end_timestamp=...&username=alice 响应字段:quota(区间内消耗额度,按站点配置展示为金额)、request_count、prompt_tokens、completion_tokens、lifetime_used_quota(渠道历史总消耗,仅在不按用户筛选时参考)。 数据来源为 logs 表中 type=消费 的记录聚合;需开启消费日志(LogConsumeEnabled)。 管理后台 UI 在 渠道管理 页面,渠道行操作菜单中新增 「渠道消费统计」: 时间范围:支持今天、近 7 天、本周、近 30 天、本月及自定义起止时间 渠道总消费:不填用户即为该渠道在选定时间段内的总消耗 用户 + 渠道:填写用户 ID 或用户名后点「应用用户筛选」,查看该用户在该渠道上的消耗
定义在 relay/common/override.go:delete_header 会从参数覆盖上下文里的 header_override 映射中 删除 对应键,并通过 syncRuntimeHeaderOverrideFromContext 同步到 RelayInfo.RuntimeHeadersOverride。
在 claude_handler.go 等路径中,请求体 JSON 会先经过 ApplyParamOverrideWithRelayInfo,再交给各渠道 adaptor。
AWS Claude 的特殊处理
AWS Bedrock(AK/SK 模式)不走普通 HTTP 转发,而在 relay/channel/aws/relay-aws.go 的 doAwsClientRequest 中:
SetupRequestHeader → CommonClaudeHeadersOperation 会把客户端的 anthropic-beta 复制 到内部 requestHeader
ResolveHeaderOverride 根据运行时 override 设置 头
formatRequest 读取 requestHeader.Get("anthropic-beta"),写入 Bedrock JSON 的 anthropic_beta 字段
原先第 2 步只会 Set override 里存在的头,不会删除 第 1 步已写入的头。因此即使用 delete_header 从 RuntimeHeadersOverride 里移除了 anthropic-beta,formatRequest 仍能从 requestHeader 读到客户端传来的值。
根因
delete_header 只更新了“应发送的头”映射,没有在最终 http.Header 上执行删除。AWS Claude 在 SetupRequestHeader 之后合并 override,导致被删的 anthropic-beta 仍留在 header 中并进入 Bedrock payload。
修复方案
RelayInfo.RuntimeHeadersDeleted:记录 delete_header(及 move_header 删除源头等)显式删除的头名。
deleteHeaderOverrideInContext:删除时写入 header_deleted 上下文。
ApplyResolvedHeaderOverrides(relay/channel/api_request.go):在应用 override 后,对 RuntimeHeadersDeleted 调用 Header.Del。
AWS 路径:doAwsClientRequest 改用 ApplyResolvedHeaderOverrides,不再只做 Set 循环。
变更文件
文件 变更
relay/common/relay_info.go
新增 RuntimeHeadersDeleted
relay/common/override.go
跟踪/同步已删除头
relay/channel/api_request.go
ApplyResolvedHeaderOverrides + 删除逻辑
relay/channel/aws/relay-aws.go
使用新合并函数
relay/common/override_test.go
断言删除跟踪
relay/channel/api_request_test.go
删除头行为测试
relay/channel/aws/relay_aws_test.go
AWS + 完整 param override 集成测试
相关测试已通过。
修复后行为
配置:
{
"operations": [
{ "mode": "delete_header", "path": "anthropic-beta" }
]
}
流程变为:
ApplyParamOverrideWithRelayInfo 记录 anthropic-beta 在 RuntimeHeadersDeleted
doAwsClientRequest 先 SetupRequestHeader(可能暂时带上客户端 beta)
ApplyResolvedHeaderOverrides 应用 override 并 Del anthropic-beta
formatRequest 读不到该头 → Bedrock 请求体 不含 anthropic_beta
限制与说明
仅作用于 HTTP 头链路:delete_header 删除的是请求头;若请求 JSON 体里直接带有 anthropic_beta(少见),不会被此操作移除。
透传 body 模式:开启 PassThroughRequestEnabled 或渠道 PassThroughBodyEnabled 时,可能绕过 formatRequest,行为取决于原始 body。
不仅 AWS:所有经 DoApiRequest / DoFormRequest / WebSocket 的路径都会受益;AWS Claude AK/SK 是本次报告的场景。
AWS API Key 模式(ClientModeApiKey):走 DoApiRequest,同样会应用删除逻辑。
全局 Claude 设置:WriteHeaders 若在 SetupRequestHeader 里添加了 beta,删除发生在其后,仍会生效。
若你需要,我可以再补一条:在透传 body 模式下也从 JSON 中剥离 anthropic_beta 的增强逻辑。
…tle-sub),并微调字号、字间距与行高。整体更克制统一,更符合科技感,且仅改动 home-custom.html 内相关 CSS 与 class 名。
Contributor
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (3)
📒 Files selected for processing (144)
WalkthroughAdds admin/user CSV/ZIP export endpoints, channel consumption aggregation and endpoint, extends Claude Opus 4.8 support, updates dashboards to day-based ranges, introduces docs/integration UI and consumption dialogs, centralizes relay header override deletions, and refines Docker build parallelism. ChangesCore Feature Slice
Sequence Diagram(s)sequenceDiagram
participant AdminUI
participant API
participant ExportCtrl
participant Model
AdminUI->>API: GET /api/log/admin/export/monthly_bill?user_id&year&month&timezone
API->>ExportCtrl: Route to ExportAdminUserMonthlyBill
ExportCtrl->>Model: AdminUserMonthRangeSeconds(year, month)
ExportCtrl->>Model: GetUserLogTypeAggregatesForRange(user, start, end)
ExportCtrl->>Model: GetUserConsumeSummaryByModelForRange(user, start, end)
Model-->>ExportCtrl: aggregates, model summaries
ExportCtrl->>AdminUI: CSV (UTF-8 BOM) download
Estimated code review effort🎯 5 (Critical) | ⏱️ ~120 minutes Possibly related issues
Possibly related PRs
Suggested reviewers
Poem
✨ Finishing Touches🧪 Generate unit tests (beta)
⚔️ Resolve merge conflicts
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Important
📝 变更描述 / Description
(简述:做了什么?为什么这样改能生效?请基于你对代码逻辑的理解来写,避免粘贴未经整理的内容)
🚀 变更类型 / Type of change
🔗 关联任务 / Related Issue
✅ 提交前检查项 / Checklist
Bug fix,我已提交或关联对应 Issue,且不会将设计取舍、预期不一致或理解偏差直接归类为 bug。📸 运行证明 / Proof of Work
(请在此粘贴截图、关键日志或测试报告,以证明变更生效)
Summary by CodeRabbit
Release Notes
New Features
Enhancements
Model Support
Localization