Skip to content

feat(llm): support responses websocket sessions#1730

Merged
looplj merged 43 commits into
looplj:unstablefrom
llc1123:feat/responses-websocket-upstream
May 28, 2026
Merged

feat(llm): support responses websocket sessions#1730
looplj merged 43 commits into
looplj:unstablefrom
llc1123:feat/responses-websocket-upstream

Conversation

@llc1123

@llc1123 llc1123 commented May 27, 2026

Copy link
Copy Markdown
Contributor

变更说明

本 PR 为 AxonHub 增加上游 OpenAI Responses WebSocket 支持,并在同一会话内复用上游 WebSocket 连接:

  • 新增 Responses WebSocket executor,使用 response.create 协议并复用现有 Responses stream 聚合链路。
  • 支持 OpenAI / Codex Responses WebSocket transport 配置与前端入口。
  • 同一受信任会话内复用上游 WS 连接,并把下游完整上下文自动压缩为新增 input suffix + previous_response_id
  • 当历史上下文被改写、连接中断、取消、失败、不完整或错误时,淘汰旧连接并回退到新连接完整上下文发送。
  • WebSocket session pool 绑定服务端认证作用域、上游 URL/auth/header 指纹,避免仅凭客户端 session id 复用连接。
  • 增加池大小、连接生命周期和保留 input 大小上限,避免无限保留连接和 prompt 内容。
  • 默认 WS 连接保留策略调整为 idleTTL=50mmaxLifetime=50m:尽量保留连接本地缓存,同时低于 OpenAI 60 分钟连接上限并给新一轮请求保留约 10 分钟余量。

连接复用与缓存观察

OpenAI WebSocket 文档说明:活跃 WS 连接会保留一个 connection-local 的最近 previous_response_id 状态;连接关闭后,store=true 可以尝试从持久化状态恢复,store=false / ZDR 没有持久化 fallback。

对 Codex WS 的真实上游探针结果:

  • 同一 WS 连接上,store=false + previous_response_id 可以成功续接。
  • 新 WS 连接上,store=false + previous_response_id 返回 previous_response_not_found
  • Codex WS 上 store=true 被拒绝:Store must be set to false
  • 两条新连接重复同一长前缀与同一 prompt_cache_keycached_tokens=0 / 0
  • 同一连接重复同一长前缀与同一 prompt_cache_keycached_tokens=0 / 14080

因此 Codex WS 路径下,连接复用不仅减少握手,还直接关系到 previous_response_id 续接和实际观测到的 prompt-cache 命中。AxonHub 应避免过早关闭可复用连接。

验证

已执行:

  • cd llm && go test ./transformer/openai/responses ./transformer/openai/codex
  • cd llm && go test -race ./transformer/openai/responses -run 'TestWebSocket'
  • go test ./internal/server/middleware -run 'Test.*Auth|Test.*Trace'
  • 临时 Go driver 通过 httptest WebSocket 服务验证:同一 trusted session 只升级 1 次连接,第二轮携带 previous_response_id=resp_1 且只发送 1 条新增 input。
  • 真实 Codex WS 探针验证:断开后 store=false + previous_response_id 失败、store=true 被拒绝、同连接重复长前缀可命中 cached_tokens=14080
  • 临时 package-level Go driver 验证默认 WS pool 参数为 idleTTL=50mmaxLifetime=50m

注意事项

  • WebSocket 仅用于上游 openai/responses transport;下游仍保持 HTTP/SSE。
  • previous_response_id 是上游连接本地语义;连接不可复用时会回退为完整上下文新连接。

llc1123 and others added 9 commits May 27, 2026 16:17
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
@greptile-apps

greptile-apps Bot commented May 27, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds upstream OpenAI Responses WebSocket support and reuses a single upstream WebSocket connection within the same trusted session, enabling previous_response_id continuation and connection-local prompt-cache hits (especially relevant for Codex where store=false prevents cross-connection recovery).

  • WebSocket executor pool: OutboundTransformer.CustomizeExecutor now caches a WebSocketExecutor keyed by the inner HTTP client pointer, so the pool is shared across all requests for a given channel rather than being recreated per request.
  • Session-scoped connection reuse: pool keys are bound to a server-side scope (API key ID or user ID) combined with the client-provided session ID, URL, and auth fingerprint — preventing cross-user connection sharing even with identical session headers.
  • Graceful fallback: when context history changes, connection is stale/closed, or retained input exceeds the memory budget, the connection is either evicted or the full context is re-sent on the live connection without evicting it.

Confidence Score: 5/5

The PR is safe to merge. The connection pooling, session scoping, and fallback logic are well-structured, and the previously identified issues in earlier review rounds have been addressed in this revision.

All six previously flagged issues have been resolved: the per-request pool bug is fixed by caching the WebSocketExecutor on the OutboundTransformer; TLS config is now copied from the HTTP client transport; context cancellation correctly surfaces via the reordered contextCancelled-before-isClosed check and the ctxErr branch in the closed-connection handler; large-input turns now keep the connection alive instead of evicting it; and the closed-connection escape in the acquire loop is guarded by the leaseState closed check. No new correctness issues were found in this pass.

No files require special attention. The core websocket_executor.go and outbound.go changes are the most complex but appear correct after close inspection.

Important Files Changed

Filename Overview
llm/transformer/openai/responses/websocket_executor.go New WebSocket executor with connection pooling keyed on session+scope+auth fingerprint; context cancellation and TLS propagation issues from prior review are fixed; response.failed/incomplete/cancelled intentionally yield HTTP 200 per inline comments
llm/transformer/openai/responses/outbound.go CustomizeExecutor now caches WebSocketExecutor per inner-executor, fixing the per-request pool issue from prior review; Stop() properly closes all cached executors
llm/transformer/openai/codex/outbound.go Mirrors the OutboundTransformer caching pattern for WebSocket executors; codexExecutor wraps the shared WebSocketExecutor and handles token refresh; transport field propagated correctly
internal/server/biz/channel_llm.go buildCodexOutbound extracted to reuse across primary and custom endpoints; transport inferred from URL scheme or explicit endpoint field; stopChannelOutbounds deduplicates Stop() calls via seen-set
internal/server/middleware/auth.go Session scope attached to context for all auth paths (API key, JWT, Gemini key, OpenAPI key), correctly namespaced to prevent cross-user connection reuse
llm/transformer/shared/session.go New WithSessionScope/GetSessionScope context helpers; clean addition with no issues
frontend/src/features/channels/components/channels-action-dialog.tsx Adds WebSocket transport toggle as a virtual ApiFormatOption; URL scheme validated at save time against selected transport; save-time validation enforces scheme correctness
internal/server/biz/channel_endpoint.go Transport field validation added: only responses/responses-compact formats allow websocket transport; removes outdated default-endpoint conflict check

Sequence Diagram

sequenceDiagram
    participant Client as Downstream
    participant Auth as Auth Middleware
    participant Pipe as Pipeline
    participant OT as OutboundTransformer
    participant WE as WebSocketExecutor
    participant Pool as WS Pool
    participant Up as Upstream WS

    Client->>Auth: request + client session header
    Auth->>Auth: attach server scope (api key or user)
    Auth->>Pipe: ctx with server scope + session id

    Pipe->>OT: CustomizeExecutor(httpClient)
    OT->>OT: cache lookup or create WebSocketExecutor
    OT-->>Pipe: cached WebSocketExecutor

    Pipe->>OT: TransformRequest
    Pipe->>WE: DoStream(ctx, httpclient.Request)

    WE->>WE: "poolKey = URL + sessionId + scope + auth + headers"
    alt same session and auth fingerprint
        WE->>Pool: acquire existing connection
        WE->>WE: send suffix input + previous_response_id
    else new or evicted session
        WE->>Up: dial new WebSocket connection
        WE->>Pool: register pooledWebSocketConn
        WE->>WE: send full input
    end

    WE->>Up: WriteJSON response.create
    Up-->>WE: event stream
    WE-->>Pipe: webSocketStream

    alt response.completed
        WE->>Pool: rememberTurn(full input, responseId)
        WE->>Pool: release conn, keep alive
    else response.failed or cancelled or error
        WE->>Pool: evict conn
    end

    Pipe-->>Client: streamed response
Loading

Reviews (23): Last reviewed commit: "fix(llm): keep websocket on retained inp..." | Re-trigger Greptile

Comment thread llm/transformer/openai/responses/outbound.go
llc1123 and others added 8 commits May 27, 2026 23:58
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Comment thread llm/transformer/openai/responses/websocket_executor.go
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Comment thread llm/transformer/openai/responses/websocket_executor.go
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Comment thread llm/transformer/openai/responses/websocket_executor.go
llc1123 and others added 6 commits May 28, 2026 11:19
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
llc1123 and others added 4 commits May 28, 2026 12:38
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
@greptile-apps

greptile-apps Bot commented May 28, 2026

Copy link
Copy Markdown
Contributor

Want your agent to iterate on Greptile's feedback? Try greploops.

llc1123 and others added 6 commits May 28, 2026 13:46
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
@llc1123 llc1123 force-pushed the feat/responses-websocket-upstream branch from 0fae96a to 2e50a05 Compare May 28, 2026 08:06
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Comment thread llm/transformer/openai/responses/websocket_executor.go Outdated
llc1123 and others added 6 commits May 28, 2026 16:48
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Comment thread llm/transformer/openai/responses/websocket_executor.go
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
@llc1123

llc1123 commented May 28, 2026

Copy link
Copy Markdown
Contributor Author

@looplj 可以作为测试功能合并,真实使用场景测得不是很全面,但应该能用。

@looplj looplj merged commit 74d223c into looplj:unstable May 28, 2026
4 checks passed
ldm0206 added a commit to ldm2060/axonhub that referenced this pull request May 29, 2026
…ge title config, request filter preservation, structured response items

Upstream commits merged:
- fix: model settings dialog overflow (looplj#1716)
- chore: custom page title config after login (looplj#1720)
- feat: preserve request log filters on detail navigation (looplj#1723)
- feat(llm): support responses websocket sessions (looplj#1730)
- chore: add claude-opus-4-7 to claudecode DefaultModels (looplj#1733)
- fix(channels): show real i18n label for single-variant types (looplj#1734)
- fix(llm): accept structured response item arguments (looplj#1728)

Resolved 4 import-path conflicts (looplj -> ldm2060) and adapted
session scope integration in auth middleware. Fixed Windows flaky
WebSocket test for platform-specific socket error messages.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
junjiangao pushed a commit to junjiangao/axonhub that referenced this pull request May 30, 2026
* chore: ignore local agent artifacts

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* feat(llm): add responses websocket executor

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* feat(llm): support websocket responses transport

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* feat(channels): configure websocket endpoints

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* feat(channels): wire codex websocket outbound

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* feat(frontend): expose responses websocket channels

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(frontend): align codex websocket base url

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* feat(auth): namespace shared sessions

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* feat(llm): reuse responses websocket sessions

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(llm): persist responses websocket executor

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(codex): persist websocket executor

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(channels): wire responses websocket transport

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* feat(gql): expose channel endpoint transport

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(frontend): preserve endpoint transport

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(llm): key responses websocket executor by client

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(codex): key websocket executor by client

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(channels): infer inherited websocket transport

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(llm): surface websocket cancellation errors

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(llm): distinguish websocket error events

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(llm): propagate websocket TLS config

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(llm): handle websocket cancelled terminals

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(frontend): preserve codex websocket config

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(llm): guard websocket session reuse

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(frontend): preserve endpoint transport state

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(llm): synchronize websocket pool metadata

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(frontend): honor endpoint transport overrides

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(frontend): validate responses transport scheme

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(frontend): preserve codex websocket auth mode

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(channels): use single-hash websocket defaults

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* test(llm): cover cancelled response status

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(llm): stabilize websocket pool lifecycle

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* test(llm): document websocket terminal responses

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(channels): address websocket review nits

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(channels): allow compact websocket responses

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(channels): support codex oauth endpoint overrides

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(frontend): complete responses transport deps

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(llm): preserve closed websocket cancellations

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(codex): reuse oauth token provider

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(llm): close websocket executors

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(channels): stop websocket outbounds on swap

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(llm): extend websocket session lifetime

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* docs: clarify websocket pool and url markers

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(llm): keep websocket on retained input overflow

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

---------

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants