ZheFox
d78b5a81fb
fix(gemini): preserve thought-only max-token responses
2026-09-03 17:04:12 +08:00
elky
4291a91dc0
test(gateway): pass routing policy to affinity effects
2026-09-03 15:50:53 +08:00
ZheFox
4c6bafe255
Merge remote-tracking branch 'upstream/main' into codex/fix-antigravity-quota
2026-09-03 15:50:22 +08:00
elky
9309ad844f
test(gateway): align routing fixtures with strategy policies
2026-09-03 14:11:15 +08:00
ZheFox
d672ba2068
test(gateway): seed routing strategy for antigravity flows
2026-09-03 13:45:57 +08:00
ZheFox
587486ab0c
Merge remote-tracking branch 'upstream/main' into codex/fix-antigravity-quota
2026-09-03 13:24:39 +08:00
ZheFox
40a5e1470d
fix(gateway): persist quota refresh from strong catalog reads
2026-09-03 13:16:40 +08:00
elky
77f93c638d
Merge codex/routing-strategy-consolidation into main
2026-09-03 12:00:51 +08:00
fawney
2cb4d554aa
feat(routing): consolidate scheduling strategy configuration
2026-09-03 11:05:59 +08:00
ZheFox
76fb8905c9
test(gateway): align antigravity response message id
2026-09-03 11:04:18 +08:00
ZheFox
f822df6cce
Merge remote-tracking branch 'origin/main' into codex/fix-antigravity-quota
2026-09-03 10:46:49 +08:00
ZheFox
45c840b8d3
fix(providers): refresh Antigravity grouped quotas
2026-09-03 10:46:44 +08:00
elky
214f3d6406
fix(providers): hide billing fields in provider form
2026-09-02 23:17:01 +08:00
elky
7323d41fbe
feat(routing): move sticky-key retries into routing policy with lazy attempts
...
Replace the provider/endpoint max_retries fields as the source of same-key
retries with a routing policy setting, sticky_key_attempts (default 2). Only
the first-ranked candidate is retried on the same key; every failover
candidate gets a single attempt so failover keeps advancing instead of
retrying each fallback key.
Materialize exactly one attempt per candidate and derive same-key retries in
the attempt loop after a candidate-scoped failure, so the retry budget no
longer inflates up-front materialization and needs no upper bound. The budget
travels in the report context; retries reuse the plan with a fresh candidate
id and incremented retry index. Pool groups only retry their first key within
the retry-index stride.
Expose the setting in the routing profile editor and the set_scheduling rule
action, and drop the max_retries input from the provider form.
2026-09-02 20:48:40 +08:00
elky
415b2da81b
feat(routing): make routing profiles the sole scheduler policy source
...
Bootstrap an enabled system-default routing group from the legacy
scheduler config keys on startup, resolve the default ordering config
from that group before falling back to the legacy keys, and stop merging
keep_priority_on_conversion with the legacy flag when a policy is
resolved. Thread the policy-derived ordering config into candidate
preselection so it no longer reads system config independently.
Add per-API-format key priority overrides so a key serving several
formats keeps independent ordering, matching the legacy
global_priority_by_format semantics. Expose keep_priority_on_conversion
in the routing profile editor and read the effective policy in the
model routing preview, monitoring metrics and provider page badge.
2026-09-02 17:04:04 +08:00
zhefox
a0369cf49a
Merge remote-tracking branch 'zhefox/main' into zhefox-main
...
# Conflicts:
# crates/aether-admin/src/provider/quota.rs
# crates/aether-ai/formats/src/formats/openai/chat/stream.rs
# crates/aether-ai/formats/src/formats/openai/responses/mod.rs
# crates/aether-provider/pool/src/provider.rs
# crates/aether-provider/pool/src/quota.rs
2026-09-02 15:25:27 +08:00
zhefox
dbbe7b22ab
fix(pool): isolate dynamic model quota buckets and 429 scheduling
2026-09-02 15:23:23 +08:00
ZheFox
144a28f544
feat(admin-users): add plan entitlement revocation flow
2026-09-02 11:23:24 +08:00
zhefox
7ae984df4b
fix(gateway): detect DeepSeek custom relay models
2026-09-01 22:49:35 +08:00
elky
d5f34b2ee2
feat(codex): add provider outbound policy boundary
2026-09-01 21:21:42 +08:00
fawney
30a75832f8
feat(vscodex): add remote Codex collaboration module
2026-09-01 20:25:35 +08:00
ZheFox
5a69cfe40d
Merge pull request #772 from zhefox/main
...
fix(gateway): handle pool saturation and malformed Gemini calls
2026-09-01 19:31:44 +08:00
ZheFox
3d87bbf230
style(rust): apply workspace formatting
2026-09-01 19:31:13 +08:00
ZheFox
633363e190
fix(gateway): handle pool saturation and malformed Gemini calls
2026-09-01 19:25:00 +08:00
elky
d07dc86376
refactor(codex): generalize fingerprint convergence
2026-09-01 17:05:54 +08:00
elky
3e540ce589
fix(gateway): route Codex context through transport facade
2026-09-01 15:53:47 +08:00
elky
a39048ecce
feat(codex): stabilize identity across retries
2026-09-01 15:33:40 +08:00
ZheFox
57abb20778
fix(pool): show Antigravity quota reset times
2026-09-01 11:29:48 +08:00
ZheFox
2fe2600021
fix(pool): isolate model quotas and compact account display
2026-09-01 10:15:57 +08:00
ZheFox
9b819169d5
Merge pull request #767 from zhefox/fix/provider-key-concurrency-cache-affinity
...
fix(gateway): improve provider pool concurrency, quotas, and affinity
2026-09-01 08:11:46 +08:00
ZheFox
9631b229b3
fix(gateway): add provider key concurrency and cache affinity modes
2026-09-01 08:06:58 +08:00
zhefox
56395945c0
fix(gateway): route Responses compaction only to Responses providers
2026-08-29 12:28:55 +08:00
ZheFox
5bcdcca784
fix(formats): normalize Responses additional tools for Chat
2026-08-28 23:03:56 +08:00
ZheFox
83098f98b6
fix(formats): gate mixed Gemini tools by model
2026-08-28 20:42:49 +08:00
ZheFox
4da8c57fe3
fix(ai): align Gemini and Responses compatibility
2026-08-27 22:13:20 +08:00
ZheFox
9d9892be6a
fix(gateway): finalize cross-format sync JSON responses
2026-08-26 00:43:58 +08:00
ZheFox
2f2d444f97
fix(codex): self-heal Spark-contaminated account quotas
...
Keep model-scoped Spark windows out of account state, preserve authoritative WHAM exhaustion flags, and repair historical cross-family quota generations without weakening stale-response guards.
2026-08-25 19:13:41 +08:00
ZheFox
6a9eea34a0
test(gateway): fix Codex Realtime route fixture
2026-08-23 04:00:16 +08:00
ZheFox
2cd20da1ec
fix(gateway): support current Codex Realtime live routes
2026-08-23 02:51:49 +08:00
ZheFox
acde38b8e7
fix(usage): unify OpenAI Live and WebSocket records
2026-08-21 11:53:53 +08:00
ZheFox
2c89202001
feat(gateway): add Codex Live and OpenAI Realtime
...
Implement preflighted Live/Realtime WebSocket transports, protocol-aware authentication, usage auditing, UI filtering, and legacy Codex permission migration.
2026-08-21 04:27:34 +08:00
ZheFox
4185ad1b1e
feat(gateway): add Codex Live transport
2026-08-20 21:59:05 +08:00
ZheFox
654f798d25
fix(ws): harden Responses continuation state
2026-08-20 08:51:16 +08:00
ZheFox
bef282cfee
fix(responses): replay DeepSeek opaque reasoning state
2026-08-20 00:40:48 +08:00
ZheFox
d21d8ce9f5
fix(codex): avoid replaying static config on websocket continuations
2026-08-20 00:40:40 +08:00
ZheFox
c50a1c6c46
fix(ws): preserve Codex continuation bindings
2026-08-18 17:17:45 +08:00
elky
535ee098c3
fix(auth): reject unsigned admin identity headers
2026-08-18 11:12:17 +08:00
ZheFox
c8118edf36
fix(ws): harden Responses connection lifecycle
...
Revalidate control policy per turn, isolate downstream credentials, and make planner/turn ownership cancellation-safe.
Preserve opaque protocol events, align configurable timeout semantics, and extend end-to-end security and settlement coverage.
2026-08-17 18:50:29 +08:00
AAEE86
4a0775c4ea
style: apply cargo fmt across gateway and aether-ai crates
2026-08-17 14:53:53 +08:00
AAEE86
6fc02dad3e
fix(ws): restore redacted PII in provider frames before client delivery
...
Responses WebSocket 只实现了脱敏的一半:请求侧 mask 之后,provider 事件帧在推给
客户端之前没有还原,于是 session 映射内的占位符以 <AETHER:EMAIL:...> 的形式直接
透给客户端。这里补齐响应侧,语义与 HTTP 路径对齐。
- 还原点是 relay loop 的最后一跳(send_client_message 之前、capture_client_frame
之前),对应 HTTP 的 restore_sync_response_body / StreamingResponseRestorer 所在
位置。审计与终态观测继续消费脱敏态事件,只有发往客户端的那一份拷贝被还原。
- 复用 privacy::restore_json_strings(改为 pub(crate))与
RedactionSession::restore_text,不复制任何还原逻辑:只还原本 session mask 过的
映射,未映射的占位符原样保留;type / model / id 等协议字段不可能命中 sentinel,
因此不受影响。批量 {"chunks":[...]} 帧一并递归还原。
- session 生命周期:mask 仍然是 per-turn(slot 依旧每轮新建),但 session 改由连接
持有,按有界 FIFO 留最近 8 轮。理由是 WS 的会话历史留在上游,continuation 只发
增量输入,per-turn 释放会漏还原后续响应里回显的更早轮次占位符;HTTP 不会漏,是
因为它每次重发整段历史、重新 mask 会派生出同一个 sentinel。被挤出窗口的轮次退回
「占位符原样透传」,不会错误还原成别的值。
- 未命中还原时不改写字节;连接上没有任何 mask session 时(未启用脱敏)连事件 clone
都不做。
测试:redaction.rs 新增 8 条单测(还原命中/批量帧/未映射占位符原样/未命中不改写/
无 session 不介入/空 session 不留存/审计侧入参不被改写/跨轮还原/窗口有界);
responses_websocket_e2e 新增一条用例,mock 上游回显收到的 input,断言上游只看到
占位符而客户端拿到真实邮箱。
2026-08-17 14:53:46 +08:00