elky
99f6499b2b
fix(conversion): improve stream failures and diagnostic exports
2026-09-08 21:04:22 +08:00
elky
b5ed802277
chore(codex): bump default client version to 0.153.4
2026-09-06 19:58:35 +08:00
elky
e29442a06a
merge(main): resolve subscription usage policy conflicts
2026-09-05 14:21:16 +08:00
ZheFox
5ca4f87951
fix(codex): unify management model catalogs and refresh fingerprints
2026-09-05 13:14:24 +08:00
elky
b37b252b14
fix(ci): satisfy protocol utility clippy checks
2026-09-05 02:37:41 +08:00
elky
0e3bd7eff4
merge(main): sync latest main into security branch
2026-09-05 00:30:16 +08:00
ZheFox and stabey
57cdef4b8d
fix(gateway): harden cross-format sync finalization
...
Co-authored-by: stabey <36232531+stabey@users.noreply.github.com >
2026-09-04 19:53:26 +08:00
ZheFox
14744abd57
fix responses replay across Gemini and Codex
2026-09-04 16:54:42 +08:00
ZheFox
66d6c17d2d
fix antigravity reasoning streaming and terminal errors
2026-09-04 16:36:40 +08:00
elky
579f2c7cc1
feat(security): harden gateway boundaries and usage policies
...
Consolidate subscription usage policy enforcement, privacy-safe persistence, and gateway security hardening into one reviewable change.
Includes bounded HTTP and execution envelopes, header and protocol guards, DNS and relay validation, authentication and secret projection hardening, secure backup/install paths, and regression coverage.
2026-09-04 03:45:52 +08:00
ZheFox
f6884eb8c4
fix(gemini): accept signature-only reasoning exhaustion
2026-09-03 17:57:40 +08:00
ZheFox
d78b5a81fb
fix(gemini): preserve thought-only max-token responses
2026-09-03 17:04:12 +08:00
ZheFox
f822df6cce
Merge remote-tracking branch 'origin/main' into codex/fix-antigravity-quota
2026-09-03 10:46:49 +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
zhefox
2ed2cc66ef
fix(formats): retain response field normalization import
2026-09-02 15:44:15 +08:00
zhefox
b1bf7837cf
style: format quota and response changes
2026-09-02 15:40:40 +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
Kayphoon
88d2b002be
fix(formats): ignore Responses ping stream events
2026-09-01 12:58:21 +00: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
a39048ecce
feat(codex): stabilize identity across retries
2026-09-01 15:33:40 +08:00
zhefox
56395945c0
fix(gateway): route Responses compaction only to Responses providers
2026-08-29 12:28:55 +08:00
ZheFox
1bc2287baa
fix(gemini): normalize mixed tools for same-format providers
2026-08-29 01:08:01 +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
f0b0064f3d
fix(formats): enable mixed Gemini tool calls
2026-08-28 16:55:38 +08:00
ZheFox
64e5725331
fix(formats): sanitize Gemini tool schemas
2026-08-28 16:11:16 +08:00
ZheFox
5b6fce1a77
fix(formats): degrade Responses reasoning summaries for Chat
2026-08-28 14:05:48 +08:00
ZheFox
5687dad177
fix(formats): scope signature helper to tests
2026-08-28 13:21:35 +08:00
ZheFox
c4b4dfa996
fix(formats): preserve Gemini tool thought signatures
2026-08-28 12:47:34 +08:00
ZheFox
8cdfa338e5
fix(gemini): pair idless tool history
2026-08-28 02:15:00 +08:00
ZheFox
4da8c57fe3
fix(ai): align Gemini and Responses compatibility
2026-08-27 22:13:20 +08:00
ZheFox
e2b003af24
fix(formats): preserve Responses namespace tools through Chat
2026-08-26 00:43:50 +08:00
ZheFox
2cd20da1ec
fix(gateway): support current Codex Realtime live routes
2026-08-23 02:51:49 +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
AAEE86
4a0775c4ea
style: apply cargo fmt across gateway and aether-ai crates
2026-08-17 14:53:53 +08:00
AAEE86
1d3051cb89
refactor(ws): structured terminal observation without SSE text round-trips
...
评审第 5 条:Responses WebSocket 收到的本来就是结构化协议事件,但为了复用面向
SSE 的 push_line,观测路径要先把每个事件序列化成 data: {json}\n\n,解析器再
decode 回 Value——一次纯粹的往返。这个「伪 SSE」形状是随手拼的,一旦拼装函数
以后被加上换行或分块逻辑,观测结果就会和真实事件悄悄分叉。
aether-ai-formats:
- OpenAIResponsesProviderState::push_line 机械拆成 decode + push_event,
push_line 现在只做解码。协议状态机一行未动,diff 里除函数签名外只有
&value → value(value 从拥有改成借用,持有结构化事件的传输不必为了调用它
先克隆一份)。
- StreamingStandardTerminalObserver::push_event 走 TerminalStreamParser::Standard,
service tier 的记录方式与 push_line 完全相同。openai:image 的终态状态机按 SSE
行做增量解析、没有结构化入口,返回 AiSurfaceFinalizeError 让调用方
disable_with_error 标记 parser_error,而不是静默丢事件、把摘要留成「未观察到
终态」。ProviderStreamParser 的其余三个格式同样返回 Err:机械拆分随时可做,
但不建无调用方的接口。
WS 侧:
- 新增 responses/observation.rs 的 ResponsesStructuredTerminalObserver,直接消费
frame.protocol_events() 借出的事件。包一层的意义是让「不再拼 SSE」成为类型层面
的事实——这个类型没有任何接受字节的方法,改回 push_line 不可能悄悄发生。
finish() 里的 Ok(None) / Err → disable_with_error 兜底也一并收进来。
- body capture 不动,仍然是 SSE 形状(data: 开头、\n\n 结尾):
aether_usage_runtime::report 用 line.strip_prefix("data:") 解析被捕获的 body
判定 StreamCapturedTerminalState,而它是 stream_report_represents_failure 的一个
OR 项,换成结构化 JSON 会让终态判定恒为 Missing。capture_sse_event /
capture_client_frame / websocket_event_as_sse_line 全部保留,原因写在模块文档
注释里。这一层只换观测,不换捕获。
差分测试(8 个,aether-ai-formats):同一组事件序列分别走 push_line 与
push_event,断言 ExecutionStreamTerminalSummary 完全相等——批量 delta 序列、
completed 带 usage、合法 incomplete、error、response.failed、未知事件、
service tier、缺终态;外加 openai:image 拒绝结构化入口。两条入口不可能有
过滤差异:任何 Value 序列化出来都不会命中 decode_json_data_line 的 empty /
":" / "event:" / [DONE] 四个过滤条件。
turn.rs 里三个既有的 WS 观测测试改走结构化入口;SSE 形状的断言留在 capture 一侧。
验收:crates/aether-usage 零 diff。
2026-08-17 14:53:33 +08:00
AAEE86
71b54070e8
feat(gateway): Codex/OpenAI Responses WebSocket 代理模式
...
在 /v1/responses 上支持 WebSocket 升级,把客户端帧中继到上游 Codex /
OpenAI Responses WebSocket 端点,同时保持既有的路由、鉴权、配额与用量
语义:
- 路由与准入:control/route/ai.rs 识别 WebSocket 升级请求;
websocket/ingress.rs 复用 API Key 鉴权、IP 规则与并发许可,并引入
独立的 WebSocket 连接许可
- 中继:websocket/responses/* 按 connection / session / turn 分层,
帧解析归一化、socket 写入有界、continuation 保持调度亲和性
- 配额:orchestration/codex_quota_breaker.rs 在账号配额耗尽时熔断并
自动恢复,不再直接断开客户端连接
- 用量:每个 turn 的终态用量落库,request_metadata 记录
websocket_mode / websocket_transport,管理端与 usage 视图暴露
is_websocket
- 管理端:provider 可配置 Responses WebSocket 开关
2026-08-17 14:50:33 +08:00
zhefox
810c3dfe2b
fix(codex): serve versioned dynamic model catalogs
2026-08-14 18:41:44 +08:00
elky
f3a12c1008
fix(ai): preserve Codex image edit validation
2026-08-13 11:31:17 +08:00
elky
ca35e09eaa
Merge pull request #718 from zjm54321/fix/custom-image-edit-json
2026-08-13 11:00:15 +08:00
zjm54321
41e93858e1
refactor(ai): simplify image edit serialization
2026-08-11 00:36:33 +08:00
zjm54321
8d918d0459
fix(ai): serialize image edits with images array
2026-08-11 00:30:00 +08:00
zhefox
669f4bddc5
fix: align Responses routing and model permissions
2026-08-03 18:48:01 +08:00