name = “codex” wire_api = “responses” supports_websockets = false base_url = “ https://x666.me/v1 ” env_key = “OPENAI_API_KEY” 报错 Unexpected status 403 Forbidden: Image generation is not enabled for this group, url: https://x666.me/v1/responses , cf-ray: a09c5e942b4eea91-ICN 5 个帖子 - 5 位参与者 阅读完整话题
复杂局域网里的 WebRTC 稳定性,重点不只是 WebRTC offer/answer 怎么转发,还包括外围控制链路如何恢复。 这个场景不是 2C 通话,而是更接近医疗、养老等机构里的设备群:大量共享设备长时间在线,集中运维,现场环境可能比较嘈杂,同时还要保证一定收音距离和通话音质。 我遇到的核心问题是:长连接不一定会明确断开,有时会出现“看起来还连着,但应用消息已经不通”的状态。结果是设备页面显示在线,但呼叫事件发不到对端,超时、挂断、多人通话清理都会变得不一致。 这篇文章聚焦几个点: WebSocket 长连接假连接为什么危险 为什么只依赖客户端主动重连不够 gRPC Gateway 如何做双向控制 自动发现和主节点状态表怎么帮助恢复 呼叫超时、自动挂断、一对一挂断、多人挂断如何收敛 嘈杂环境下,音频可观测性为什么也属于稳定性的一部分 我的结论是:这不是简单的 WebSocket 换 gRPC ,而是要补齐发现、状态和恢复闭环。媒体链路仍然走 WebRTC ,Go/gRPC 更适合做控制面和状态收敛。 原文地址: https://www.lodan.me/posts/webrtc-grpc-gateway-discovery-recovery/ 想听听大家在局域网、弱网、设备长时间运行场景里,是怎么处理长连接假在线和通话状态恢复的。
复杂局域网里的 WebRTC 稳定性,重点不只是 WebRTC offer/answer 怎么转发,还包括外围控制链路如何恢复。 这个场景不是 2C 通话,而是更接近医疗、养老等机构里的设备群:大量共享设备长时间在线,集中运维,现场环境可能比较嘈杂,同时还要保证一定收音距离和通话音质。 我遇到的核心问题是:长连接不一定会明确断开,有时会出现“看起来还连着,但应用消息已经不通”的状态。结果是设备页面显示在线,但呼叫事件发不到对端,超时、挂断、多人通话清理都会变得不一致。 这篇文章聚焦几个点: WebSocket 长连接假连接为什么危险 为什么只依赖客户端主动重连不够 gRPC Gateway 如何做双向控制 自动发现和主节点状态表怎么帮助恢复 呼叫超时、自动挂断、一对一挂断、多人挂断如何收敛 嘈杂环境下,音频可观测性为什么也属于稳定性的一部分 我的结论是:这不是简单的 WebSocket 换 gRPC ,而是要补齐发现、状态和恢复闭环。媒体链路仍然走 WebRTC ,Go/gRPC 更适合做控制面和状态收敛。 原文地址: https://www.lodan.me/posts/webrtc-grpc-gateway-discovery-recovery/ 想听听大家在局域网、弱网、设备长时间运行场景里,是怎么处理长连接假在线和通话状态恢复的。
复杂局域网里的 WebRTC 稳定性,重点不只是 WebRTC offer/answer 怎么转发,还包括外围控制链路如何恢复。 这个场景不是 2C 通话,而是更接近医疗、养老等机构里的设备群:大量共享设备长时间在线,集中运维,现场环境可能比较嘈杂,同时还要保证一定收音距离和通话音质。 我遇到的核心问题是:长连接不一定会明确断开,有时会出现“看起来还连着,但应用消息已经不通”的状态。结果是设备页面显示在线,但呼叫事件发不到对端,超时、挂断、多人通话清理都会变得不一致。 这篇文章聚焦几个点: WebSocket 长连接假连接为什么危险 为什么只依赖客户端主动重连不够 gRPC Gateway 如何做双向控制 自动发现和主节点状态表怎么帮助恢复 呼叫超时、自动挂断、一对一挂断、多人挂断如何收敛 嘈杂环境下,音频可观测性为什么也属于稳定性的一部分 我的结论是:这不是简单的 WebSocket 换 gRPC ,而是要补齐发现、状态和恢复闭环。媒体链路仍然走 WebRTC ,Go/gRPC 更适合做控制面和状态收敛。 原文地址: https://www.lodan.me/posts/webrtc-grpc-gateway-discovery-recovery/ 想听听大家在局域网、弱网、设备长时间运行场景里,是怎么处理长连接假在线和通话状态恢复的。
各位大佬,Codex使用WebSocket连接后开始频繁出现以下报错,请问这是哪里的问题?是上游报错,还是我的客户端和代理出现了问题呢? stream disconnected before completion: WebSocket protocol error: Connection reset without closing handshake 3 个帖子 - 2 位参与者 阅读完整话题
连续5次stream disconnected before completion: websocket closed by server before response.completed 好好的怎么突然就坏了。 9 个帖子 - 3 位参与者 阅读完整话题
Tibo发布推特正在解决,一直思考是官方原因,非节点问题 4 个帖子 - 3 位参与者 阅读完整话题
CPA 代理 Codex 卡在"正在思考"的排查与 WebSocket 解决方案 使用 CPA 代理 Codex / Codex CLI / Codex Desktop 时,可能会遇到这些现象: 卡在"正在思考",长时间没有输出。 请求反复失败,偶发超时。 CPA 代理下 HTTPS / SSE 转发不稳定。 codex doctor 显示 WebSocket 失败,随后 fallback 到 HTTPS。 这类问题不一定和出口 IP 区域有关,更常见的关键点是 Codex 到 CPA、CPA 到 OpenAI 这两段是否真的走了 WebSocket。本文整理完整配置方式,以及如何确认链路是否已经变成全程 WebSocket。 目标链路 理想的全程 WebSocket 链路是: Codex ---ws---> CPA ---wss---> OpenAI / ChatGPT Codex backend 也就是: Codex -> ws://localhost:8317/v1/responses CPA -> wss://chatgpt.com/backend-api/codex/responses 注意,这里有两段链路: Codex -> CPA :由 Codex provider 配置决定。 CPA -> OpenAI :由 CPA 当前选中的 Codex OAuth auth 文件决定。 只配置其中一段,可能只能得到半程 WebSocket。 解决方案:开启全程 WebSocket 目标是让 Codex 到 CPA 使用 WebSocket,同时 CPA 到 OpenAI 也使用 WSS。 1. 修改 Codex 配置 编辑 Codex 配置文件: ~/.codex/config.toml 找到 CPA 对应的 provider,例如: [model_providers.cliproxyapi] base_url = "http://localhost:8317/v1" 在这个 provider 下添加: supports_websockets = true 完整示例: [model_providers.cliproxyapi] name = "cliproxyapi" base_url = "http://localhost:8317/v1" wire_api = "responses" supports_websockets = true 这个配置必须放在 [model_providers.cliproxyapi] 下面,不要放到 [features] 下面。 2. 不要乱配 feature flag 不要盲目在 [features] 下添加: responses_websockets_v2 = true 部分 Codex 版本中相关 feature flag 已经被移除或默认内置。可以用下面命令确认: macOS: /Applications/Codex.app/Contents/Resources/codex debug features Windows 示例: codex debug features 如果输出里显示类似: responses_websockets: removed responses_websockets_v2: removed 说明这个开关已经不再需要,也不应该再配。关键配置是 provider 里的 supports_websockets = true 。 3. 修改 CPA 的 Codex auth 文件 只改 Codex 配置,通常只能保证: Codex ---ws---> CPA 要实现: CPA ---wss---> OpenAI 还需要让 CPA 当前使用的 Codex OAuth auth 开启 WebSocket。 CPA 的 Codex OAuth auth 文件一般在: macOS 常见位置: ~/.cli-proxy-api/ Windows 运行包常见位置示例: <CPA_RUNTIME_DIR>\auth\ 文件名通常类似: [email protected] [email protected] 编辑 CPA 实际选中的 Codex auth 文件,在 JSON 顶层添加: "websockets": true 示例结构: { "websockets": true, "access_token": "...", "account_id": "...", "email": "...", "refresh_token": "...", "type": "codex" } 注意: websockets 是 JSON 顶层字段。 不要放进 metadata 、 attributes 或其他嵌套对象里。 如果有多个 Codex auth 文件,要改 CPA 实际选中的那个。 CPA 日志中的 Use OAuth provider=codex auth_file=... 会显示当前使用的是哪个 auth 文件。 验证步骤 1. 用 Codex doctor 验证 Codex 到 CPA macOS: /Applications/Codex.app/Contents/Resources/codex doctor Windows / PATH 已配置时: codex doctor 成功时应看到类似: websocket connected (HTTP 101 Switching Protocols) supports websockets true endpoint ws://localhost:8317/v1/... 这说明: Codex ---ws---> CPA 已经成立。 2. 用 CPA Manager 监控辅助判断 CPA Manager 的监控列表也可以作为一个直观信号。开启 WebSocket 后,监控里对应模型的请求方法通常会显示为: GET /v1/responses 这和普通 HTTP/SSE 请求不一样。之前走 HTTP/SSE fallback 时,请求通常是: POST /v1/responses Accept: text/event-stream 原因是 WebSocket 握手本身是 HTTP GET + Upgrade: websocket ,成功后才升级成 WebSocket 连接。所以在 CPA Manager 里看到连续成功的 GET /v1/responses ,基本可以说明 Codex -> CPA 这一段已经在走 WebSocket 路由。 不过它只能证明下游请求进入了 CPA 的 WebSocket handler。要确认 CPA -> OpenAI 也变成 WSS,还需要继续看 main.log 里是否有 codex websockets: upstream connected ... url=wss://... 。 3. 打开 CPA 日志验证 CPA 到 OpenAI 这一步不是长期必需,只建议临时打开用于验证。编辑 CPA 配置文件。 macOS Homebrew 常见位置: /opt/homebrew/etc/cliproxyapi.conf Windows 运行包示例: <CPA_RUNTIME_DIR>\config.yaml 临时打开: debug: true request-log: true logging-to-file: true 然后重启 CPA。 日志文件常见位置: macOS: ~/.cli-proxy-api/logs/main.log Windows 运行包示例: <CPA_RUNTIME_DIR>\auth\logs\main.log 用 rg 检索关键日志: macOS: rg -n "codex websockets|upstream connected|wss://|responses websocket|Use OAuth" ~/.cli-proxy-api/logs/main.log Windows: rg -n "codex websockets|upstream connected|wss://|responses websocket|Use OAuth" <CPA_RUNTIME_DIR>\auth\logs\main.log 成功时会看到类似: responses websocket: client connected ... remote=127.0.0.1 Use OAuth provider=codex [email protected] ... codex websockets: upstream connected ... url=wss://chatgpt.com/backend-api/codex/responses 这就说明链路已经是: Codex ---ws---> CPA ---wss---> OpenAI 验证完成后,建议把 CPA 日志开关关回去: debug: false request-log: false logging-to-file: false 然后再次重启 CPA。 原因是 request-log: true 可能记录完整请求 payload,包括对话内容、工具调用参数等,长期打开会增加磁盘占用和敏感信息落盘风险。 常见误区 误区 1:把 supports_websockets 放错位置 错误写法: [features] supports_websockets = true 正确写法: [model_providers.cliproxyapi] supports_websockets = true supports_websockets 是 provider 能力配置,不是 feature flag。 误区 2:只开了 Codex 到 CPA 如果 CPA 日志里只有: responses websocket: client connected 但没有: codex websockets: upstream connected ... url=wss://... 说明大概率只是: Codex ---ws---> CPA 还没有实现: CPA ---wss---> OpenAI 这时继续检查 CPA 当前选中的 Codex auth 文件是否有: "websockets": true 误区 3:被本机代理环境变量干扰 有时环境里设置了: HTTP_PROXY HTTPS_PROXY http_proxy https_proxy 但 NO_PROXY 没包含本地地址,导致 ws://127.0.0.1:8317 也被拿去走外部代理。 典型报错可能是: HTTP CONNECT failed with status 504 Proxy URL scheme not supported 临时验证时可以设置: macOS / Linux: NO_PROXY=127.0.0.1,localhost no_proxy=127.0.0.1,localhost codex doctor Windows PowerShell: $env:NO_PROXY = "127.0.0.1,localhost" $env:no_proxy = "127.0.0.1,localhost" codex doctor 如果这样就恢复 HTTP 101 Switching Protocols ,说明本地代理绕过规则需要补齐。 误区 4:cc-switch 端口能监听但不支持 WebSocket 路由 有些情况下 Codex provider 指向了 cc-switch.exe 暴露的端口,例如: ws://127.0.0.1:15721/v1/... codex doctor 可能显示: supports websockets true Responses WebSocket failed HTTP 405 Method Not Allowed 这说明: Codex 端已经尝试 WebSocket。 配置也认为 provider 支持 WebSocket。 但本地 cc-switch / COA 的 /v1/... WebSocket 路由没有正确接住。 实际请求会 fallback 到 HTTPS/SSE,仍可能卡在"正在思考"。 实践建议:如果你的目标只是让 Codex 通过 CPA 访问上游,并且 CPA 已经能提供 http://127.0.0.1:8317/v1 这类 OpenAI-compatible provider,那么可以先关掉 cc-switch ,让 Codex 直接指向 CPA。这样链路更短,排查也更清楚。除非你明确依赖 cc-switch 做模型切换或其他额外能力,否则它在这条 WebSocket 修复链路里通常不是必需层。 排查方向: 确认 Codex provider 是否应该指向 CPA,而不是 cc-switch 临时端口。 确认 base_url 是否为 CPA 端口,例如 http://127.0.0.1:8317/v1 。 用 Get-NetTCPConnection / lsof 查监听进程,确认端口背后到底是谁。 如果必须经过 cc-switch,确认该版本是否支持 Codex Responses WebSocket 路由。 Windows 查看监听进程示例: Get-NetTCPConnection -LocalPort 8317 | Select-Object LocalAddress,LocalPort,State,OwningProcess Get-CimInstance Win32_Process | Where-Object { $_.ProcessId -eq <PID> } | Select-Object ProcessId,Name,CommandLine macOS 查看监听进程示例: lsof -nP -iTCP:8317 -sTCP:LISTEN Windows 实测参考 以下是一组 Windows 上验证成功的关键点,路径仅作示例: Codex 配置: [model_providers.cliproxyapi] name = "cliproxyapi" base_url = "http://127.0.0.1:8317/v1" supports_websockets = true wire_api = "responses" CPA 进程: <CPA_RUNTIME_DIR>\cli-proxy-api.exe CPA 配置: <CPA_RUNTIME_DIR>\config.yaml CPA auth 目录: <CPA_RUNTIME_DIR>\auth\ CPA 日志: <CPA_RUNTIME_DIR>\auth\logs\main.log 成功日志关键行: responses websocket: client connected ... remote=127.0.0.1 Use OAuth provider=codex auth_file=codex-...-plus.json for model gpt-5.5 codex websockets: upstream connected ... url=wss://chatgpt.com/backend-api/codex/responses 成功后 codex doctor 关键行: websocket connected (HTTP 101 Switching Protocols) supports websockets true endpoint ws://127.0.0.1:8317/v1/<redacted> 快速判断表 现象 含义 下一步 websocket connected (HTTP 101) Codex 到 CPA 已经是 WS 继续看 CPA 日志确认上游 WSS CPA Manager 显示 GET /v1/responses 下游大概率已走 WS upgrade 路由 继续看 main.log 确认上游 WSS responses websocket: client connected CPA 收到了下游 WS 继续找 upstream connected codex websockets: upstream connected ... wss://... CPA 到 OpenAI 已经是 WSS 全程 WebSocket 成功 HTTP 405 Method Not Allowed 本地服务没接住 WS 路由 检查端口背后是不是 cc-switch/旧 COA HTTP CONNECT failed 504 本地 WS 被错误送去代理 设置 NO_PROXY=127.0.0.1,localhost POST /v1/responses + Accept: text/event-stream 可能仍在 HTTP/SSE fallback 检查 Codex provider 与 CPA auth 最终检查清单 Codex provider 下有 supports_websockets = true 。 Codex provider 的 base_url 指向 CPA,而不是不支持 WS 的中间服务。 CPA 当前使用的 Codex auth JSON 顶层有 "websockets": true 。 codex doctor 显示 HTTP 101 Switching Protocols 。 CPA main.log 显示 responses websocket: client connected 。 CPA main.log 显示 codex websockets: upstream connected ... url=wss://chatgpt.com/backend-api/codex/responses 。 验证完成后关闭 debug 、 request-log 、 logging-to-file 。 4 个帖子 - 4 位参与者 阅读完整话题
CPA 代理 Codex 卡在"正在思考"的排查与 WebSocket 解决方案 使用 CPA 代理 Codex / Codex CLI / Codex Desktop 时,可能会遇到这些现象: 卡在"正在思考",长时间没有输出。 请求反复失败,偶发超时。 CPA 代理下 HTTPS / SSE 转发不稳定。 codex doctor 显示 WebSocket 失败,随后 fallback 到 HTTPS。 这类问题不一定和出口 IP 区域有关,更常见的关键点是 Codex 到 CPA、CPA 到 OpenAI 这两段是否真的走了 WebSocket。本文整理完整配置方式,以及如何确认链路是否已经变成全程 WebSocket。 目标链路 理想的全程 WebSocket 链路是: Codex ---ws---> CPA ---wss---> OpenAI / ChatGPT Codex backend 也就是: Codex -> ws://localhost:8317/v1/responses CPA -> wss://chatgpt.com/backend-api/codex/responses 注意,这里有两段链路: Codex -> CPA :由 Codex provider 配置决定。 CPA -> OpenAI :由 CPA 当前选中的 Codex OAuth auth 文件决定。 只配置其中一段,可能只能得到半程 WebSocket。 解决方案:开启全程 WebSocket 目标是让 Codex 到 CPA 使用 WebSocket,同时 CPA 到 OpenAI 也使用 WSS。 1. 修改 Codex 配置 编辑 Codex 配置文件: ~/.codex/config.toml 找到 CPA 对应的 provider,例如: [model_providers.cliproxyapi] base_url = "http://localhost:8317/v1" 在这个 provider 下添加: supports_websockets = true 完整示例: [model_providers.cliproxyapi] name = "cliproxyapi" base_url = "http://localhost:8317/v1" wire_api = "responses" supports_websockets = true 这个配置必须放在 [model_providers.cliproxyapi] 下面,不要放到 [features] 下面。 2. 不要乱配 feature flag 不要盲目在 [features] 下添加: responses_websockets_v2 = true 部分 Codex 版本中相关 feature flag 已经被移除或默认内置。可以用下面命令确认: macOS: /Applications/Codex.app/Contents/Resources/codex debug features Windows 示例: codex debug features 如果输出里显示类似: responses_websockets: removed responses_websockets_v2: removed 说明这个开关已经不再需要,也不应该再配。关键配置是 provider 里的 supports_websockets = true 。 3. 修改 CPA 的 Codex auth 文件 只改 Codex 配置,通常只能保证: Codex ---ws---> CPA 要实现: CPA ---wss---> OpenAI 还需要让 CPA 当前使用的 Codex OAuth auth 开启 WebSocket。 CPA 的 Codex OAuth auth 文件一般在: macOS 常见位置: ~/.cli-proxy-api/ Windows 运行包常见位置示例: <CPA_RUNTIME_DIR>\auth\ 文件名通常类似: [email protected] [email protected] 编辑 CPA 实际选中的 Codex auth 文件,在 JSON 顶层添加: "websockets": true 示例结构: { "websockets": true, "access_token": "...", "account_id": "...", "email": "...", "refresh_token": "...", "type": "codex" } 注意: websockets 是 JSON 顶层字段。 不要放进 metadata 、 attributes 或其他嵌套对象里。 如果有多个 Codex auth 文件,要改 CPA 实际选中的那个。 CPA 日志中的 Use OAuth provider=codex auth_file=... 会显示当前使用的是哪个 auth 文件。 验证步骤 1. 用 Codex doctor 验证 Codex 到 CPA macOS: /Applications/Codex.app/Contents/Resources/codex doctor Windows / PATH 已配置时: codex doctor 成功时应看到类似: websocket connected (HTTP 101 Switching Protocols) supports websockets true endpoint ws://localhost:8317/v1/... 这说明: Codex ---ws---> CPA 已经成立。 2. 用 CPA Manager 监控辅助判断 CPA Manager 的监控列表也可以作为一个直观信号。开启 WebSocket 后,监控里对应模型的请求方法通常会显示为: GET /v1/responses 这和普通 HTTP/SSE 请求不一样。之前走 HTTP/SSE fallback 时,请求通常是: POST /v1/responses Accept: text/event-stream 原因是 WebSocket 握手本身是 HTTP GET + Upgrade: websocket ,成功后才升级成 WebSocket 连接。所以在 CPA Manager 里看到连续成功的 GET /v1/responses ,基本可以说明 Codex -> CPA 这一段已经在走 WebSocket 路由。 不过它只能证明下游请求进入了 CPA 的 WebSocket handler。要确认 CPA -> OpenAI 也变成 WSS,还需要继续看 main.log 里是否有 codex websockets: upstream connected ... url=wss://... 。 3. 打开 CPA 日志验证 CPA 到 OpenAI 这一步不是长期必需,只建议临时打开用于验证。编辑 CPA 配置文件。 macOS Homebrew 常见位置: /opt/homebrew/etc/cliproxyapi.conf Windows 运行包示例: <CPA_RUNTIME_DIR>\config.yaml 临时打开: debug: true request-log: true logging-to-file: true 然后重启 CPA。 日志文件常见位置: macOS: ~/.cli-proxy-api/logs/main.log Windows 运行包示例: <CPA_RUNTIME_DIR>\auth\logs\main.log 用 rg 检索关键日志: macOS: rg -n "codex websockets|upstream connected|wss://|responses websocket|Use OAuth" ~/.cli-proxy-api/logs/main.log Windows: rg -n "codex websockets|upstream connected|wss://|responses websocket|Use OAuth" <CPA_RUNTIME_DIR>\auth\logs\main.log 成功时会看到类似: responses websocket: client connected ... remote=127.0.0.1 Use OAuth provider=codex [email protected] ... codex websockets: upstream connected ... url=wss://chatgpt.com/backend-api/codex/responses 这就说明链路已经是: Codex ---ws---> CPA ---wss---> OpenAI 验证完成后,建议把 CPA 日志开关关回去: debug: false request-log: false logging-to-file: false 然后再次重启 CPA。 原因是 request-log: true 可能记录完整请求 payload,包括对话内容、工具调用参数等,长期打开会增加磁盘占用和敏感信息落盘风险。 常见误区 误区 1:把 supports_websockets 放错位置 错误写法: [features] supports_websockets = true 正确写法: [model_providers.cliproxyapi] supports_websockets = true supports_websockets 是 provider 能力配置,不是 feature flag。 误区 2:只开了 Codex 到 CPA 如果 CPA 日志里只有: responses websocket: client connected 但没有: codex websockets: upstream connected ... url=wss://... 说明大概率只是: Codex ---ws---> CPA 还没有实现: CPA ---wss---> OpenAI 这时继续检查 CPA 当前选中的 Codex auth 文件是否有: "websockets": true 误区 3:被本机代理环境变量干扰 有时环境里设置了: HTTP_PROXY HTTPS_PROXY http_proxy https_proxy 但 NO_PROXY 没包含本地地址,导致 ws://127.0.0.1:8317 也被拿去走外部代理。 典型报错可能是: HTTP CONNECT failed with status 504 Proxy URL scheme not supported 临时验证时可以设置: macOS / Linux: NO_PROXY=127.0.0.1,localhost no_proxy=127.0.0.1,localhost codex doctor Windows PowerShell: $env:NO_PROXY = "127.0.0.1,localhost" $env:no_proxy = "127.0.0.1,localhost" codex doctor 如果这样就恢复 HTTP 101 Switching Protocols ,说明本地代理绕过规则需要补齐。 误区 4:cc-switch 端口能监听但不支持 WebSocket 路由 有些情况下 Codex provider 指向了 cc-switch.exe 暴露的端口,例如: ws://127.0.0.1:15721/v1/... codex doctor 可能显示: supports websockets true Responses WebSocket failed HTTP 405 Method Not Allowed 这说明: Codex 端已经尝试 WebSocket。 配置也认为 provider 支持 WebSocket。 但本地 cc-switch / COA 的 /v1/... WebSocket 路由没有正确接住。 实际请求会 fallback 到 HTTPS/SSE,仍可能卡在"正在思考"。 实践建议:如果你的目标只是让 Codex 通过 CPA 访问上游,并且 CPA 已经能提供 http://127.0.0.1:8317/v1 这类 OpenAI-compatible provider,那么可以先关掉 cc-switch ,让 Codex 直接指向 CPA。这样链路更短,排查也更清楚。除非你明确依赖 cc-switch 做模型切换或其他额外能力,否则它在这条 WebSocket 修复链路里通常不是必需层。 排查方向: 确认 Codex provider 是否应该指向 CPA,而不是 cc-switch 临时端口。 确认 base_url 是否为 CPA 端口,例如 http://127.0.0.1:8317/v1 。 用 Get-NetTCPConnection / lsof 查监听进程,确认端口背后到底是谁。 如果必须经过 cc-switch,确认该版本是否支持 Codex Responses WebSocket 路由。 Windows 查看监听进程示例: Get-NetTCPConnection -LocalPort 8317 | Select-Object LocalAddress,LocalPort,State,OwningProcess Get-CimInstance Win32_Process | Where-Object { $_.ProcessId -eq <PID> } | Select-Object ProcessId,Name,CommandLine macOS 查看监听进程示例: lsof -nP -iTCP:8317 -sTCP:LISTEN Windows 实测参考 以下是一组 Windows 上验证成功的关键点,路径仅作示例: Codex 配置: [model_providers.cliproxyapi] name = "cliproxyapi" base_url = "http://127.0.0.1:8317/v1" supports_websockets = true wire_api = "responses" CPA 进程: <CPA_RUNTIME_DIR>\cli-proxy-api.exe CPA 配置: <CPA_RUNTIME_DIR>\config.yaml CPA auth 目录: <CPA_RUNTIME_DIR>\auth\ CPA 日志: <CPA_RUNTIME_DIR>\auth\logs\main.log 成功日志关键行: responses websocket: client connected ... remote=127.0.0.1 Use OAuth provider=codex auth_file=codex-...-plus.json for model gpt-5.5 codex websockets: upstream connected ... url=wss://chatgpt.com/backend-api/codex/responses 成功后 codex doctor 关键行: websocket connected (HTTP 101 Switching Protocols) supports websockets true endpoint ws://127.0.0.1:8317/v1/<redacted> 快速判断表 现象 含义 下一步 websocket connected (HTTP 101) Codex 到 CPA 已经是 WS 继续看 CPA 日志确认上游 WSS CPA Manager 显示 GET /v1/responses 下游大概率已走 WS upgrade 路由 继续看 main.log 确认上游 WSS responses websocket: client connected CPA 收到了下游 WS 继续找 upstream connected codex websockets: upstream connected ... wss://... CPA 到 OpenAI 已经是 WSS 全程 WebSocket 成功 HTTP 405 Method Not Allowed 本地服务没接住 WS 路由 检查端口背后是不是 cc-switch/旧 COA HTTP CONNECT failed 504 本地 WS 被错误送去代理 设置 NO_PROXY=127.0.0.1,localhost POST /v1/responses + Accept: text/event-stream 可能仍在 HTTP/SSE fallback 检查 Codex provider 与 CPA auth 最终检查清单 Codex provider 下有 supports_websockets = true 。 Codex provider 的 base_url 指向 CPA,而不是不支持 WS 的中间服务。 CPA 当前使用的 Codex auth JSON 顶层有 "websockets": true 。 codex doctor 显示 HTTP 101 Switching Protocols 。 CPA main.log 显示 responses websocket: client connected 。 CPA main.log 显示 codex websockets: upstream connected ... url=wss://chatgpt.com/backend-api/codex/responses 。 验证完成后关闭 debug 、 request-log 、 logging-to-file 。 2 个帖子 - 2 位参与者 阅读完整话题
最近几天频繁出现websocket握手后,首字节超时的问题,会导致codex一直显示正在思考,但是无响应的问题,我在日本,新加坡和本地电脑上测试发现,都出现过网络层的超时问题,就最近几天才出现的,请问各位佬友有遇到该问题吗?怎么样才能解决? 2 个帖子 - 2 位参与者 阅读完整话题
codex 如何通过surge 打开websocket 模式?最近codex 总时断链5次;发现应该是链接websocket 导致?但是我不想禁用socket?有没有大佬知道怎么设置吗? 3 个帖子 - 2 位参与者 阅读完整话题
使用 CDN 来保护 MC 服务器 / TCP Over WebSocket 最近写了个项目: TOH Proxy 项目地址: https://github.com/albert4719/toh-proxy 可以把 Minecraft 的 TCP 连接转发到 WebSocket 上,再通过 CDN 代理,从而隐藏服务器真实 IP 。 简单来说: 玩家 -> CDN -> WebSocket -> MC 服务器 而不是: 玩家 -> 直接攻击你的服务器 IP 为什么这么做? 传统 MC 服务器: IP 直接暴露 容易被 DDOS 一打就炸 国内高防价格离谱 但 WebSocket 属于 HTTP 体系。 也就是说: 腾讯云 EdgeOne 百度 CDN Cloudflare 其他 CDN 理论上都能代理。 于是就能做到: TCP -> WebSocket -> CDN 加速 让 MC 流量走 CDN 节点。 特性 TCP Over WebSocket 支持 Proxy Protocol 还原玩家真实 IP 支持 Velocity / Paper 支持 CDN 回源 支持 HTTPS / WSS 隐藏真实服务器 IP 支持第三方 MOD 直连 原理 服务端监听: ws://your-domain/mc 客户端: 本地 TCP -> WebSocket -> CDN -> 服务端 服务端收到 WS 后再转发回真正的 MC TCP 服务。 这样: 玩家看到的是 CDN IP 攻击者看到的也是 CDN IP 真实服务器 IP 不暴露 延迟测试 很多人第一反应: “WebSocket 会不会很卡?” 实际测试结果比预想好很多。 百度 CDN (付费动态加速) 测试使用: DRCDN 动态加速 实际延迟: 仅增加约 30ms 基本没有明显游玩影响。 正常生存服、小游戏服都完全可玩。 腾讯云 EdgeOne (免费版) 免费版本也能正常使用。 但由于: 无动态加速 路由不稳定 免费线路优先级较低 实际延迟大概: 增加约 50ms ~ 150ms 会有略微卡顿感。 不过: 腾讯云 EO 支持购买动态加速套餐 理论上延迟还能继续下降。 适合什么场景? 非常适合: 小型公益服 容易被打的服务器 国内裸奔服务器 没钱买高防 想隐藏真实 IP 已支持 Velocity Paper Proxy Protocol 第三方 MOD 接入 后续准备: 官方 MOD UDP/KCP 多线路 自动节点切换 使用方式 服务端: MC TCP -> TOH Proxy Server -> CDN 客户端: 本地 MC -> TOH Proxy Client -> CDN -> 服务端 玩家本地连接: 127.0.0.1:3001 即可进入服务器。 题外话 其实 Minecraft 本身挺适合走 CDN 的。 因为: 长连接 带宽低 数据量小 延迟要求没 FPS 那么极端 之前一直没人这么搞,主要是: TCP 不能直接过 CDN 但套一层 WebSocket 后,问题就解决了。 有兴趣可以一起研究。 欢迎提 issue / PR 。
使用 CDN 来保护 MC 服务器 / TCP Over WebSocket 最近写了个项目: TOH Proxy 项目地址: https://github.com/albert4719/toh-proxy 可以把 Minecraft 的 TCP 连接转发到 WebSocket 上,再通过 CDN 代理,从而隐藏服务器真实 IP 。 简单来说: 玩家 -> CDN -> WebSocket -> MC 服务器 而不是: 玩家 -> 直接攻击你的服务器 IP 为什么这么做? 传统 MC 服务器: IP 直接暴露 容易被 DDOS 一打就炸 国内高防价格离谱 但 WebSocket 属于 HTTP 体系。 也就是说: 腾讯云 EdgeOne 百度 CDN Cloudflare 其他 CDN 理论上都能代理。 于是就能做到: TCP -> WebSocket -> CDN 加速 让 MC 流量走 CDN 节点。 特性 TCP Over WebSocket 支持 Proxy Protocol 还原玩家真实 IP 支持 Velocity / Paper 支持 CDN 回源 支持 HTTPS / WSS 隐藏真实服务器 IP 支持第三方 MOD 直连 原理 服务端监听: ws://your-domain/mc 客户端: 本地 TCP -> WebSocket -> CDN -> 服务端 服务端收到 WS 后再转发回真正的 MC TCP 服务。 这样: 玩家看到的是 CDN IP 攻击者看到的也是 CDN IP 真实服务器 IP 不暴露 延迟测试 很多人第一反应: “WebSocket 会不会很卡?” 实际测试结果比预想好很多。 百度 CDN (付费动态加速) 测试使用: DRCDN 动态加速 实际延迟: 仅增加约 30ms 基本没有明显游玩影响。 正常生存服、小游戏服都完全可玩。 腾讯云 EdgeOne (免费版) 免费版本也能正常使用。 但由于: 无动态加速 路由不稳定 免费线路优先级较低 实际延迟大概: 增加约 50ms ~ 150ms 会有略微卡顿感。 不过: 腾讯云 EO 支持购买动态加速套餐 理论上延迟还能继续下降。 适合什么场景? 非常适合: 小型公益服 容易被打的服务器 国内裸奔服务器 没钱买高防 想隐藏真实 IP 已支持 Velocity Paper Proxy Protocol 第三方 MOD 接入 后续准备: 官方 MOD UDP/KCP 多线路 自动节点切换 使用方式 服务端: MC TCP -> TOH Proxy Server -> CDN 客户端: 本地 MC -> TOH Proxy Client -> CDN -> 服务端 玩家本地连接: 127.0.0.1:3001 即可进入服务器。 题外话 其实 Minecraft 本身挺适合走 CDN 的。 因为: 长连接 带宽低 数据量小 延迟要求没 FPS 那么极端 之前一直没人这么搞,主要是: TCP 不能直接过 CDN 但套一层 WebSocket 后,问题就解决了。 有兴趣可以一起研究。 欢迎提 issue / PR 。
使用 CDN 来保护 MC 服务器 / TCP Over WebSocket 最近写了个项目: TOH Proxy 项目地址: https://github.com/albert4719/toh-proxy 可以把 Minecraft 的 TCP 连接转发到 WebSocket 上,再通过 CDN 代理,从而隐藏服务器真实 IP 。 简单来说: 玩家 -> CDN -> WebSocket -> MC 服务器 而不是: 玩家 -> 直接攻击你的服务器 IP 为什么这么做? 传统 MC 服务器: IP 直接暴露 容易被 DDOS 一打就炸 国内高防价格离谱 但 WebSocket 属于 HTTP 体系。 也就是说: 腾讯云 EdgeOne 百度 CDN Cloudflare 其他 CDN 理论上都能代理。 于是就能做到: TCP -> WebSocket -> CDN 加速 让 MC 流量走 CDN 节点。 特性 TCP Over WebSocket 支持 Proxy Protocol 还原玩家真实 IP 支持 Velocity / Paper 支持 CDN 回源 支持 HTTPS / WSS 隐藏真实服务器 IP 支持第三方 MOD 直连 原理 服务端监听: ws://your-domain/mc 客户端: 本地 TCP -> WebSocket -> CDN -> 服务端 服务端收到 WS 后再转发回真正的 MC TCP 服务。 这样: 玩家看到的是 CDN IP 攻击者看到的也是 CDN IP 真实服务器 IP 不暴露 延迟测试 很多人第一反应: “WebSocket 会不会很卡?” 实际测试结果比预想好很多。 百度 CDN (付费动态加速) 测试使用: DRCDN 动态加速 实际延迟: 仅增加约 30ms 基本没有明显游玩影响。 正常生存服、小游戏服都完全可玩。 腾讯云 EdgeOne (免费版) 免费版本也能正常使用。 但由于: 无动态加速 路由不稳定 免费线路优先级较低 实际延迟大概: 增加约 50ms ~ 150ms 会有略微卡顿感。 不过: 腾讯云 EO 支持购买动态加速套餐 理论上延迟还能继续下降。 适合什么场景? 非常适合: 小型公益服 容易被打的服务器 国内裸奔服务器 没钱买高防 想隐藏真实 IP 已支持 Velocity Paper Proxy Protocol 第三方 MOD 接入 后续准备: 官方 MOD UDP/KCP 多线路 自动节点切换 使用方式 服务端: MC TCP -> TOH Proxy Server -> CDN 客户端: 本地 MC -> TOH Proxy Client -> CDN -> 服务端 玩家本地连接: 127.0.0.1:3001 即可进入服务器。 题外话 其实 Minecraft 本身挺适合走 CDN 的。 因为: 长连接 带宽低 数据量小 延迟要求没 FPS 那么极端 之前一直没人这么搞,主要是: TCP 不能直接过 CDN 但套一层 WebSocket 后,问题就解决了。 有兴趣可以一起研究。 欢迎提 issue / PR 。
方法一、把 Responses WebSocket 关掉 在 ~/.codex/config.toml 加: model_provider = “chatgpt_http” [model_providers.chatgpt_http] name = “ChatGPT HTTP” base_url = “ https://chatgpt.com/backend-api/codex ” wire_api = “responses” requires_openai_auth = true supports_websockets = false 方法二、开TUN模式,或者用 codex-proxy-launcher 设置下代理 方法三、让codex自己搞定 还有什么解决方法,一起补充。 7 个帖子 - 7 位参与者 阅读完整话题
最近 npm 相关的投毒实在是太多了…… npm install -g socket socket wrapper on 具体原理: https://socket.dev/blog/introducing-safe-npm
最近 npm 相关的投毒实在是太多了…… npm install -g socket socket wrapper on 具体原理: https://socket.dev/blog/introducing-safe-npm
Codex Desktop 频繁出现 Reconnecting... ,根因大多是 OpenAI/ChatGPT 的 WebSocket 连接没有稳定命中代理。 解决思路: 确认 Clash Verge 本地端口,比如 127.0.0.1:7897 设置 Windows 用户级代理环境变量 在 ~\.codex\config.toml 加 [shell_environment_policy] [shell_environment_policy] set = { HTTP_PROXY = "http://127.0.0.1:7897", HTTPS_PROXY = "http://127.0.0.1:7897", ALL_PROXY = "http://127.0.0.1:7897", NO_PROXY = "localhost,127.0.0.1,::1" } Clash Verge 里把 Codex.exe 、 chatgpt.com 、 openai.com 、 oaistatic.com 、 oaiusercontent.com 强制走同一代理组 重启 Clash Verge 和 Codex 重点:AI 服务最好固定稳定节点 3 个帖子 - 2 位参与者 阅读完整话题
最近 npm 相关的投毒实在是太多了…… npm install -g socket socket wrapper on 具体原理: https://socket.dev/blog/introducing-safe-npm
最近 npm 相关的投毒实在是太多了…… npm install -g socket socket wrapper on 具体原理: https://socket.dev/blog/introducing-safe-npm