dalamudx
e8ee7b4ecf
fix(claude-code): 升级伪装的 Claude Code 版本到 2.1.284
...
上游按模型校验 Claude Code 最低版本,claude-opus-5-5 要求 >= 2.1.280,
而 profile 里写死的 2.1.161 会被拒绝(claude_code_version_too_old, 400),
且 Aether 会统一改写 UA,真实 Claude Code 客户端也会受影响。
将 cli_version 升级为 2.1.284,并同步 stainless 包版本 (0.112.1) 与
node 运行时版本 (v26.3.0),保持指纹一致;相关测试断言同步更新。
2026-09-29 18:47:59 +08:00
dalamudx
c1aa5d618d
feat(claude-code): 为 claude_code provider 补全 Claude Code 请求体特征
...
非 Claude Code 客户端(如 pi)经 OAuth 的 claude_code provider 转发时,
只有请求头被伪装成 Claude Code,请求体仍是客户端原样,被上游以
429 rate_limit_error 拒绝(响应无 ratelimit 额度头,并非真实限流)。
参考 sub2api 的 OAuth 请求体伪装,在传输层补齐请求体:
- system 重写为计费头 + 身份句 + 通用提示词三块(Fable 仅保留前两块)
- 原 system 迁入 messages 开头,避免丢失客户端指令
- 缺失时补 metadata.user_id,device/session id 基于 key 稳定派生
- 缺失时补 tools/temperature/max_tokens,并限制 cache_control 不超过 4 个
- 已带计费块且有 metadata.user_id 的真实 Claude Code 请求原样放行,
重复应用幂等
接入点覆盖跨格式路径(apply_transport_request_body_semantics)和
原生 claude:messages 同格式路径,仅作用于 provider_type=claude_code。
2026-09-29 18:35:23 +08:00
AAEE86
309f507ef4
fix(pool): 配额倒计时归零后进度条与列表恢复显示 100%
...
- 后端读取层 provider_key_status_snapshot_payload 复用调度侧同一判定
provider_pool_reset_deadline_elapsed,对已到期的 Codex 配额窗口归一化为
used_ratio=0 / remaining_ratio=1,并清除窗口级耗尽标记;跳过
window_minutes=0 与无用量观测的窗口
- 前端展示层在倒计时归零(isExpired)时兜底显示 100%,并隐藏重置前的旧用量
文本,保证归零瞬间即时恢复,与后端读取口径、调度口径一致
- 补充后端 2 个单测(到期归一化、遗留耗尽状态清理)与前端 1 个回归用例
(负向验证可复现旧行为)
验证:aether-provider-pool 71/71;aether-gateway lib 回归通过(仅 3 个依赖
PostgreSQL 服务端的用例因本机环境缺失失败,与本改动无关);前端 222 文件 /
1718 用例全部通过;clippy -D warnings、cargo fmt、vue-tsc、eslint 均通过。
2026-09-29 16:52:26 +08:00
ZheFox
00a315e3bf
Merge pull request #868 from AAEE86/feat/batch-assign-create-model
...
feat(providers): 批量管理模型支持创建统一模型并刷新列表
2026-09-29 14:37:34 +08:00
AAEE86
f811e29f13
feat(providers): 批量管理模型支持创建统一模型并刷新列表
...
- BatchAssignModelsDialog: 在"按密钥匹配"按钮旁新增"创建模型"按钮,
复用 GlobalModelFormDialog 打开"创建统一模型"界面
- 创建成功后重新加载全局模型列表,新模型可直接勾选并保存关联
- GlobalModelFormDialog: 新增可选 zIndex 属性,用于嵌套弹窗层级
- 补充组件测试:打开创建弹窗、创建成功后列表刷新
2026-09-29 14:29:56 +08:00
ZheFox
fb7e3fc224
Merge pull request #838 from dalamudx/feat/user-group-provider-stats
...
fix(stats): scope group usage by providers and add ungrouped view
2026-09-29 12:23:27 +08:00
ZheFox
cabca22d65
Merge pull request #867 from AAEE86/lint/define-macros-order
...
fix(lint): 修正 defineProps 位置,修复 CI eslint 失败
2026-09-29 11:13:00 +08:00
AAEE86
11989e278e
fix(lint): 修正 defineProps 位置并格式化用户批量组件
...
- UserBatchResultSummary.vue: 将 defineProps 移到 <script setup> 首部,
满足 vue/define-macros-order 规则,修复 CI eslint 失败
- 自动修复 vue/max-attributes-per-line 与
vue/singleline-html-element-content-newline 格式警告
2026-09-29 10:58:40 +08:00
ZheFox
532af797bf
Merge pull request #854 from AAEE86/ci/gateway-test-slim-batch1
...
ci: fix Nightly scope detection in reusable Rust CI
2026-09-29 10:19:06 +08:00
ZheFox
cafa05c4cb
Merge pull request #859 from stabey/fix/protocol-conversion-live-fixes
...
fix(formats): repair live cross-format conversion gaps
2026-09-29 10:10:42 +08:00
ZheFox
49ec53cbd9
Merge pull request #858 from stabey/codex/fix-sse-prefetch-handoff
...
fix(stream): preserve parser state across SSE prefetch handoff
2026-09-29 10:06:04 +08:00
ZheFox
73f1d79637
Merge pull request #856 from Kayphoon/fix/manual-cleanup-buffered-body
...
fix(admin): buffer request body for manual cleanup, smtp test, and system update routes
2026-09-29 10:05:33 +08:00
ZheFox
1b8f78a992
Merge pull request #846 from RWDai/review/pr-02-user-bulk-balance
...
feat(admin): batch adjust user wallet balances
2026-09-29 10:05:01 +08:00
ZheFox
14ef19d9e1
Merge pull request #860 from stabey/fix/flaky-first-request-deadline-test
...
test(gateway): deflake first-request deadline preface test
2026-09-29 10:04:35 +08:00
RWDai
bc0e9f94e2
fix(admin): serialize wallet batches across tabs
2026-09-28 18:51:14 +08:00
RWDai
74072e5007
test(postgres): decode ledger amount as float8
2026-09-28 18:23:20 +08:00
RWDai
c96f8272f4
test(ci): run batch wallet clamp against postgres
2026-09-28 18:12:21 +08:00
RWDai
4c07d9fcfb
fix(admin): floor batch deductions at zero
2026-09-28 17:56:27 +08:00
stabey and Claude Opus 5.5
45678d9419
test(gateway): decouple first-request deadline test from hyper header timeout
...
The partial-preface test raced a 5ms first-request deadline against a
10ms hyper header_read_timeout. On a slow runner both timers expire
before the next poll and tokio::select! may pick the connection branch,
surfacing hyper's header-timeout error instead of the clean deadline
close. Push hyper's timeout out to 30s so only the deadline can fire.
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected] >
2026-09-28 11:46:43 +08:00
stabey and Claude Opus 5.5
75bc32cfe9
fix(formats): repair live cross-format conversion gaps
...
Verified against a live Antigravity + xAI deployment:
- Gemini and Claude clients calling a forced-stream Responses upstream
(xAI, Codex) without streaming always failed: the aggregated body echoes
request metadata (parallel_tool_calls, tools, encrypted reasoning) that
the strict cross-format check refuses, and the gateway then wrapped the
raw SSE capture in a client error body sent with HTTP 200. Project the
validated aggregate to every client format, as the Chat path already
does, and return 502 instead of raw provider bytes when a successful
cross-format response still cannot be converted.
- Gemini stream decoding keyed tool calls by part position, so parallel
calls arriving in separate chunks (all at parts[0]) merged into one call
with concatenated arguments. Key them by arrival order; ids cannot be
used because they are optional and the Antigravity envelope synthesizes
per-chunk ids that repeat across chunks. Generated call_auto_N ids now
follow arrival order.
- Non-stream Responses output reported truncated or filtered cross-format
answers as completed; derive incomplete + incomplete_details from the
canonical stop reason.
- Gemini request parsing ignored parametersJsonSchema and
responseJsonSchema and passed OpenAPI upper-case type names (OBJECT,
STRING) through to JSON Schema targets, which xAI rejects.
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected] >
2026-09-28 01:49:11 +08:00
stabey
d4bc058c2f
fix(stream): preserve parser state across SSE prefetch handoff
2026-09-27 04:02:12 +08:00
stabey and Claude Opus 5
2516e51b4e
fix(routing): keep global model names out of provider alias reach
...
A provider model can be addressed by its upstream name or by any of its
`provider_model_mappings` entries, and neither name is published in the
model catalog, which lists global model names only. Resolution ran per API
format, so an alias could win a format the real global model had no
provider in: a `claude:messages` client asking for `gemini-3.8-flash`
landed on the provider that merely renames its own `gemini-3.8-flash-cursor`
model to `gemini-3.8-flash` on the way upstream, and the separate global
model stopped distinguishing the two routes.
Treat global model names as a reserved namespace instead: when the request
names an active global model, only rows bound to it may serve it, whatever
API format they sit in. Rows in hand answer that question for free whenever
one of them is bound to a global model of that name, so the lookup stays off
the path ordinary requests take. Authorization resolves the same way, so an
API key's allowed models cannot be satisfied through a resolution candidate
planning will no longer make.
A request naming a model that is not a global model keeps every matching
rule, so addressing a provider variant by its upstream name still works.
Co-Authored-By: Claude Opus 5 <[email protected] >
2026-09-27 04:01:44 +08:00
Kayphoon
3541ccfe29
perf(usage): truncate usage_body_blobs in before-now cleanup to reclaim physical disk space
2026-09-25 06:02:14 +00:00
Kayphoon
bd83cff58f
fix(admin): buffer request body for manual cleanup, smtp test, and system update routes
2026-09-24 19:19:18 +00:00
AAEE86
85c04335c6
ci: guard rust scope detection against false green
...
- changes 脚本加 set -euo pipefail,git fetch/diff 失败即中止,避免写出
rust=false/shell=false 让下游误判为“无需测试”。
- changed_paths 为空(异常事件)时保守置 rust=true/shell=true,宁可多跑不漏测。
- check 与 data_db_smoke 增加 needs.changes.result 兜底。
- 恢复 push/pull_request 的 paths 白名单,并补齐 rust-toolchain.toml、
.cargo/**、*.sql,workflow 触发规则与分类脚本对齐,避免“分类正确但
workflow 未启动”的漏测。
- nextest 删除硬编码 test-threads,改用默认 num-cpus,避免在大规格 runner
上主动压低并发;保留 slow-timeout 卡死保护。
- 补真实 TCP smoke test,覆盖管理员安全接口的监听端口与 HTTP/JSON 链路。
2026-09-24 16:50:33 +08:00
AAEE86
c08497c963
ci: make nightly rust scope explicit
2026-09-24 13:37:25 +08:00
ZheFox
d30268f80f
Merge pull request #850 from AAEE86/ci/gateway-test-slim-batch1
...
ci(gateway): reduce Test (Gateway) runtime without duplicate execution
2026-09-24 12:22:27 +08:00
ZheFox
5679375f71
Merge pull request #853 from AAEE86/feat/codex-fingerprint-help
...
feat(frontend): improve Codex fingerprint setting guidance
2026-09-24 12:22:12 +08:00
AAEE86
3465d23db3
feat(frontend): improve Codex fingerprint setting guidance
2026-09-24 11:33:41 +08:00
ZheFox
e3333f1aef
Merge pull request #852 from zhefox/main
...
fix(codex): restore recovered quota status and stabilize lifecycle tests
2026-09-24 11:16:05 +08:00
ZheFox
31d5e2d172
fix(codex): restore recovered quota status and stabilize lifecycle tests
2026-09-24 10:33:45 +08:00
AAEE86
bb9f2eed8e
ci: avoid rerunning gateway lib tests
2026-09-24 10:32:59 +08:00
AAEE86
926f5cc928
test: slim gateway startup helpers and configure nextest
2026-09-24 10:13:01 +08:00
AAEE86
27ae884759
ci: split gateway cache and tunnel integration scope
2026-09-24 09:35:44 +08:00
AAEE86
834eb9c308
ci(gateway): slim pool scheduler fixtures and backup candidates
2026-09-24 08:58:55 +08:00
RWDai
390b73d4b6
test(data): include new migration in version expectation
2026-09-23 20:34:25 +08:00
RWDai
bcd121d447
fix(admin): make bulk wallet batches idempotent
2026-09-23 19:43:18 +08:00
AAEE86
3394a51278
ci(gateway): slim Test (Gateway) batch 1 — split architecture guards, pin build fingerprint
...
第一批减负(对应 docs/operations/gateway-ci-timeout-reduction-plan.md):
A1 架构守卫迁出
- 将 src/tests/architecture/**(208 项 / 约 1.5 万行字符串断言)迁至
tests/architecture/,入口 tests/architecture_guard.rs
- 从 lib cfg(test) 巨型编译单元移除,压低 rustc 峰值与 OOM 风险
- 断言逻辑不变;helper 可见性改为 pub(crate)
A2 构建指纹统一
- test_gateway 的 mold RUSTFLAGS / RUST_MIN_STACK / sccache 上移至 job 级 env
- rust-ci.yml 全部 toolchain 钉住 1.95.0(与 rust-toolchain.toml、fmt/clippy 一致)
- Gateway 独立 cache key,避免 mold 指纹与无 mold job 互相污染
A4 补安全集成测试
- 新增 Test integration targets:cargo nextest run -p aether-gateway --tests
- 覆盖 architecture_guard + 此前未执行的 admin_unsigned_identity_headers
验证:architecture_guard + admin_unsigned 209 passed;
cargo check -p aether-gateway --lib --tests 通过;cargo fmt --check 通过。
不创建 PR,仅本地分支提交。
2026-09-23 17:51:45 +08:00
RWDai
75471ae4a4
fix(admin): classify bulk wallet adjustment failures
2026-09-23 17:27:34 +08:00
ZheFox
57f53903f5
Merge pull request #849 from AAEE86/codex-dynamic-client-profile
...
fix(codex): confine codex profile api to ai_serving root seams
2026-09-23 17:25:10 +08:00
AAEE86
81788d3a64
fix(codex): confine codex profile api to ai_serving root seams
2026-09-23 16:47:45 +08:00
RWDai
30bb0c3130
fix: harden bulk wallet balance adjustment
2026-09-23 16:29:47 +08:00
ZheFox
595b8e4e05
Merge pull request #848 from AAEE86/codex-dynamic-client-profile
...
feat(codex): add dynamic CLI client profile
2026-09-23 16:09:01 +08:00
AAEE86
7e033d0571
feat(codex): add dynamic CLI client profile
2026-09-23 15:57:37 +08:00
ZheFox
5745442ed7
Merge pull request #847 from zhefox/main
...
feat(codex): add an optional 1% quota reserve for pool scheduling
2026-09-23 15:17:31 +08:00
ZheFox
1a4eba1005
feat(codex): add optional minimum quota reserve for pool scheduling
2026-09-23 14:44:29 +08:00
ZheFox
2a9d8d3b25
Merge pull request #845 from RWDai/review/pr-01-user-api-key-ip-rules
...
fix(admin): return user API key IP rules
2026-09-23 13:31:23 +08:00
RWDai
e25e240d16
feat(admin): batch adjust user wallet balances
2026-09-23 11:30:33 +08:00
RWDai
cd765f2c2f
fix(admin): return user API key IP rules
2026-09-23 11:03:45 +08:00
ZheFox
ec95989e02
Merge pull request #842 from zhefox/fix/usage-response-model-conflicts
...
feat(usage): integrate response models and resolve conflicts after #841
2026-09-22 23:36:58 +08:00