Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
45a5071
fix(ws): 补齐关闭路径并保留 Codex E2E 探针
tesgth032 May 3, 2026
fdb9460
fix(ws): 中止关闭路径中的内部请求
tesgth032 May 3, 2026
5b7fe3a
test: 统一 GPT-5 测试模型到 gpt-5.4
tesgth032 May 3, 2026
535903c
test: 修正 WS E2E 传输判定与文档模型名
tesgth032 May 3, 2026
165ce23
test: 改善 Codex E2E Windows 缺失提示
tesgth032 May 3, 2026
dab2a7b
fix(ws): 复用 Responses 上游 WebSocket
tesgth032 May 3, 2026
730e617
fix(server): 默认 start 使用生产模式
tesgth032 May 3, 2026
4df3e13
fix(ws): 补齐 Codex 故障兜底与 E2E
tesgth032 May 3, 2026
48d8f86
test(k8s): 加固 shell helper 跨平台执行
tesgth032 May 3, 2026
5bba8fa
test(ws): 扩展 Responses WebSocket 边界 E2E
tesgth032 May 3, 2026
734751b
test(ws): 加固 Responses WebSocket E2E 测试支架
tesgth032 May 3, 2026
24c52e2
test(ws): 修复 Codex E2E Windows shim 解析
tesgth032 May 3, 2026
1fe56e3
test(ws): 加固 Codex WS probe 控制帧兼容
tesgth032 May 3, 2026
e314ef6
fix(ws): 避免关闭活跃 Responses 上游会话
tesgth032 May 3, 2026
db67f82
docs(model): 更新价格表单 GPT-5.4 占位文案
tesgth032 May 3, 2026
29d2541
fix(ws): 稳定上游会话热重载清理状态
tesgth032 May 3, 2026
0f7603a
test(ws): 避免 E2E 端口分配竞态
tesgth032 May 3, 2026
e950a37
test(ws): 清理 E2E probe 冗余变量
tesgth032 May 3, 2026
0bed845
fix(ws): 修复上游会话并发清理与弃用事件
tesgth032 May 4, 2026
ce53e59
test(ws): 稳定二进制关闭回归断言
tesgth032 May 4, 2026
fe833da
test(ws): 让关闭竞态断言等待业务处理
tesgth032 May 4, 2026
b9c5f4b
ci: 恢复 Codex 自动化默认模型
tesgth032 May 4, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions deploy/k8s/ingress/ingress.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ metadata:
namespace: {{NAMESPACE}}
annotations:
# 流式响应需要的长超时和禁用缓冲 (nginx-ingress)
nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
nginx.ingress.kubernetes.io/proxy-read-timeout: "3700"
nginx.ingress.kubernetes.io/proxy-send-timeout: "3700"
nginx.ingress.kubernetes.io/proxy-buffering: "off"
nginx.ingress.kubernetes.io/proxy-request-buffering: "off"
# 客户端 IP 透传依赖 ingress controller 级 forwarded-header / real-ip 配置。
Expand Down
32 changes: 26 additions & 6 deletions docs/k8s-deployment.md
Original file line number Diff line number Diff line change
Expand Up @@ -216,22 +216,40 @@ bash scripts/deploy-k8s.sh --replicas 3 --hpa-min 3 --hpa-max 10 -y
### Codex `/v1/responses` WebSocket 反代

`/v1/responses` 端点对 Codex 客户端会走 **WebSocket 升级**(其余路径仍是 HTTP)。
反代必须显式放行 Upgrade/Connection 头并放宽 idle timeout,否则会出现
同一条连接会连续承载多个 `response.create`,并依赖上游连接本地缓存支持
`store=false` + `previous_response_id` 续接。反代必须显式放行 Upgrade/Connection
头并放宽 idle timeout,否则会出现
`stream disconnected before completion: WebSocket protocol error: Connection reset
without closing handshake`(直连 CCH 正常,经反代失败时多半是这一项)。

**Nginx**

建议在 `http {}` 中先定义连接头映射,避免普通 HTTP 请求也被写死为
`Connection: upgrade`:

```nginx
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
```

```nginx
location /v1/responses {
proxy_pass http://cch_upstream;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
proxy_read_timeout 600s; # Codex 长 reasoning 流式响应时间
proxy_send_timeout 600s;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 3700s; # OpenAI Responses WS 连接上限约 60 分钟
proxy_send_timeout 3700s;
proxy_connect_timeout 300s;
proxy_buffering off; # 关闭缓冲,SSE / WS 才能实时
proxy_request_buffering off;
client_max_body_size 100m; # 避免 Codex 大上下文在反代层被截断
}
```

Expand All @@ -243,8 +261,10 @@ location /v1/responses {
```yaml
metadata:
annotations:
nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
nginx.ingress.kubernetes.io/proxy-read-timeout: "3700"
nginx.ingress.kubernetes.io/proxy-send-timeout: "3700"
nginx.ingress.kubernetes.io/proxy-buffering: "off"
nginx.ingress.kubernetes.io/proxy-request-buffering: "off"
```

**Cloudflare / 其它 CDN**
Expand Down
4 changes: 2 additions & 2 deletions messages/en/settings/prices.json
Original file line number Diff line number Diff line change
Expand Up @@ -172,10 +172,10 @@
"deleteConfirm": "Are you sure you want to delete model {name}? This action cannot be undone.",
"form": {
"modelName": "Model ID",
"modelNamePlaceholder": "e.g., gpt-5.3-codex",
"modelNamePlaceholder": "e.g., gpt-5.4",
"modelNameRequired": "Model ID is required",
"displayName": "Display Name (Optional)",
"displayNamePlaceholder": "e.g., GPT-5.3 Codex",
"displayNamePlaceholder": "e.g., GPT-5.4 Codex",
"type": "Type",
"provider": "Provider",
"providerPlaceholder": "e.g., openai",
Expand Down
2 changes: 1 addition & 1 deletion messages/en/settings/providers/form/modelSelect.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"loading": "Loading...",
"manualAdd": "Manually Add Model",
"manualDesc": "Support adding any model name (not limited to price table)",
"manualPlaceholder": "Enter model name (e.g. gpt-5-turbo)",
"manualPlaceholder": "Enter model name (e.g. gpt-5.4)",
"notFound": "Model not found",
"openai": "OpenAI",
"providerFilterAll": "All Providers",
Expand Down
4 changes: 2 additions & 2 deletions messages/en/usage.json
Original file line number Diff line number Diff line change
Expand Up @@ -544,7 +544,7 @@
"importantPoints": [
"Create an API key in the cch console and set the CCH_API_KEY environment variable",
"cchClaude/openai use ${resolvedOrigin}/v1; cchGemini uses ${resolvedOrigin}/v1beta",
"When selecting models, use provider_id/model_id (e.g. openai/gpt-5.2 or cchClaude/claude-sonnet-4-5-20250929)"
"When selecting models, use provider_id/model_id (e.g. openai/gpt-5.4 or cchClaude/claude-sonnet-4-5-20250929)"
]
},

Expand Down Expand Up @@ -622,7 +622,7 @@
"steps": [
"Restart Droid",
"Enter the /model command",
"Select GPT-5-Codex [cch] or Sonnet 4.5 [cch]",
"Select GPT-5.4 [cch] or Sonnet 4.5 [cch]",
"Start using!"
]
}
Expand Down
4 changes: 2 additions & 2 deletions messages/ja/settings/prices.json
Original file line number Diff line number Diff line change
Expand Up @@ -172,10 +172,10 @@
"deleteConfirm": "モデル {name} を削除してもよろしいですか?この操作は元に戻せません。",
"form": {
"modelName": "モデルID",
"modelNamePlaceholder": "例: gpt-5.3-codex",
"modelNamePlaceholder": "例: gpt-5.4",
"modelNameRequired": "モデルIDは必須です",
"displayName": "表示名 (任意)",
"displayNamePlaceholder": "例: GPT-5.3 Codex",
"displayNamePlaceholder": "例: GPT-5.4 Codex",
"type": "タイプ",
"provider": "プロバイダー",
"providerPlaceholder": "例: openai",
Expand Down
2 changes: 1 addition & 1 deletion messages/ja/settings/providers/form/modelSelect.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"loading": "読み込み中...",
"manualAdd": "手動でモデルを追加",
"manualDesc": "任意のモデル名を追加できます(価格表のモデルに限定されません)",
"manualPlaceholder": "モデル名を入力(例:gpt-5-turbo)",
"manualPlaceholder": "モデル名を入力(例:gpt-5.4)",
"notFound": "モデルが見つかりません",
"openai": "OpenAI",
"providerFilterAll": "すべてのプロバイダー",
Expand Down
2 changes: 1 addition & 1 deletion messages/ja/settings/providers/form/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@
"modelWhitelistLoading": "読み込み中...",
"modelWhitelistManualAdd": "モデルを手動追加",
"modelWhitelistManualDesc": "価格表に限定せず、任意のモデル名を追加できます",
"modelWhitelistManualPlaceholder": "モデル名を入力 (例: gpt-5-turbo)",
"modelWhitelistManualPlaceholder": "モデル名を入力 (例: gpt-5.4)",
"modelWhitelistNotFound": "モデルが見つかりません",
"modelWhitelistSearchPlaceholder": "モデル名を検索...",
"modelWhitelistSelectAll": "すべて選択 ({count})",
Expand Down
4 changes: 2 additions & 2 deletions messages/ja/usage.json
Original file line number Diff line number Diff line change
Expand Up @@ -544,7 +544,7 @@
"importantPoints": [
"cch の管理画面で API Key を作成し、環境変数 CCH_API_KEY を設定してください",
"cchClaude/openai は ${resolvedOrigin}/v1、cchGemini は ${resolvedOrigin}/v1beta を baseURL に使用します",
"モデル選択は provider_id/model_id 形式(例:openai/gpt-5.2 または cchClaude/claude-sonnet-4-5-20250929)"
"モデル選択は provider_id/model_id 形式(例:openai/gpt-5.4 または cchClaude/claude-sonnet-4-5-20250929)"
]
},

Expand Down Expand Up @@ -622,7 +622,7 @@
"steps": [
"Droid を再起動",
"/model コマンドを入力",
"GPT-5-Codex [cch] または Sonnet 4.5 [cch] を選択",
"GPT-5.4 [cch] または Sonnet 4.5 [cch] を選択",
"使用開始!"
]
}
Expand Down
4 changes: 2 additions & 2 deletions messages/ru/settings/prices.json
Original file line number Diff line number Diff line change
Expand Up @@ -172,10 +172,10 @@
"deleteConfirm": "Удалить модель {name}? Это действие необратимо.",
"form": {
"modelName": "ID модели",
"modelNamePlaceholder": "например: gpt-5.3-codex",
"modelNamePlaceholder": "например: gpt-5.4",
"modelNameRequired": "ID модели обязателен",
"displayName": "Отображаемое имя (необязательно)",
"displayNamePlaceholder": "например: GPT-5.3 Codex",
"displayNamePlaceholder": "например: GPT-5.4 Codex",
"type": "Тип",
"provider": "Поставщик",
"providerPlaceholder": "например: openai",
Expand Down
2 changes: 1 addition & 1 deletion messages/ru/settings/providers/form/modelSelect.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"loading": "Загрузка...",
"manualAdd": "Добавить модель вручную",
"manualDesc": "Поддержка добавления любого названия модели (не ограничено прайс-листом)",
"manualPlaceholder": "Введите название модели (например, gpt-5-turbo)",
"manualPlaceholder": "Введите название модели (например, gpt-5.4)",
"notFound": "Модели не найдены",
"openai": "OpenAI",
"providerFilterAll": "Все провайдеры",
Expand Down
2 changes: 1 addition & 1 deletion messages/ru/settings/providers/form/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@
"modelWhitelistLoading": "Загрузка...",
"modelWhitelistManualAdd": "Добавить модель вручную",
"modelWhitelistManualDesc": "Поддерживает добавление любого имени модели (не ограничено прайс-листом)",
"modelWhitelistManualPlaceholder": "Введите имя модели (например, gpt-5-turbo)",
"modelWhitelistManualPlaceholder": "Введите имя модели (например, gpt-5.4)",
"modelWhitelistNotFound": "Модели не найдены",
"modelWhitelistSearchPlaceholder": "Поиск по имени модели...",
"modelWhitelistSelectAll": "Выбрать все ({count})",
Expand Down
4 changes: 2 additions & 2 deletions messages/ru/usage.json
Original file line number Diff line number Diff line change
Expand Up @@ -544,7 +544,7 @@
"importantPoints": [
"Создайте API key в панели cch и задайте переменную окружения CCH_API_KEY",
"cchClaude/openai используют ${resolvedOrigin}/v1; cchGemini использует ${resolvedOrigin}/v1beta",
"При выборе модели используйте provider_id/model_id (например, openai/gpt-5.2 или cchClaude/claude-sonnet-4-5-20250929)"
"При выборе модели используйте provider_id/model_id (например, openai/gpt-5.4 или cchClaude/claude-sonnet-4-5-20250929)"
]
},

Expand Down Expand Up @@ -622,7 +622,7 @@
"steps": [
"Перезагрузите Droid",
"Введите команду /model",
"Выберите GPT-5-Codex [cch] или Sonnet 4.5 [cch]",
"Выберите GPT-5.4 [cch] или Sonnet 4.5 [cch]",
"Начните использовать!"
]
}
Expand Down
4 changes: 2 additions & 2 deletions messages/zh-CN/settings/prices.json
Original file line number Diff line number Diff line change
Expand Up @@ -172,10 +172,10 @@
"deleteConfirm": "确定要删除模型 {name} 吗?此操作不可撤销。",
"form": {
"modelName": "模型 ID",
"modelNamePlaceholder": "例如: gpt-5.3-codex",
"modelNamePlaceholder": "例如: gpt-5.4",
"modelNameRequired": "模型 ID 不能为空",
"displayName": "展示名称(可选)",
"displayNamePlaceholder": "例如: GPT-5.3 Codex",
"displayNamePlaceholder": "例如: GPT-5.4 Codex",
"type": "类型",
"provider": "供应商",
"providerPlaceholder": "例如: openai",
Expand Down
2 changes: 1 addition & 1 deletion messages/zh-CN/settings/providers/form/modelSelect.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
"exactMatchHint": "这里选中的模型会作为精确匹配规则加入白名单;前缀、后缀、关键词和正则规则仍在下方高级编辑区维护。",
"fallbackNotice": "当前无法获取上游模型列表,已自动切换到本地价格表目录。",
"manualAdd": "手动添加模型",
"manualPlaceholder": "输入模型名称(如 gpt-5-turbo)",
"manualPlaceholder": "输入模型名称(如 gpt-5.4)",
"manualDesc": "支持添加任意模型名称(不限于价格表中的模型)",
"claude": "Claude",
"openai": "OpenAI",
Expand Down
2 changes: 1 addition & 1 deletion messages/zh-CN/settings/providers/form/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@
"modelWhitelistSelectAll": "全选 ({count})",
"modelWhitelistClear": "清空",
"modelWhitelistManualAdd": "手动添加模型",
"modelWhitelistManualPlaceholder": "输入模型名称(如 gpt-5-turbo)",
"modelWhitelistManualPlaceholder": "输入模型名称(如 gpt-5.4)",
"modelWhitelistManualDesc": "支持添加任意模型名称(不限于价格表中的模型)",
"modelWhitelistAllowAll": "允许所有 {type} 模型",
"modelWhitelistAllowAllClause": "允许所有 Claude 模型",
Expand Down
4 changes: 2 additions & 2 deletions messages/zh-CN/usage.json
Original file line number Diff line number Diff line change
Expand Up @@ -540,7 +540,7 @@
"importantPoints": [
"请先在 cch 后台创建 API Key,并设置环境变量 CCH_API_KEY",
"cchClaude/openai 使用 ${resolvedOrigin}/v1,cchGemini 使用 ${resolvedOrigin}/v1beta",
"模型选择时使用 provider_id/model_id 格式(例如 openai/gpt-5.2 或 cchClaude/claude-sonnet-4-5-20250929)"
"模型选择时使用 provider_id/model_id 格式(例如 openai/gpt-5.4 或 cchClaude/claude-sonnet-4-5-20250929)"
]
},

Expand Down Expand Up @@ -618,7 +618,7 @@
"steps": [
"重启 Droid",
"输入 /model 命令",
"选择 GPT-5-Codex [cch] 或 Sonnet 4.5 [cch]",
"选择 GPT-5.4 [cch] 或 Sonnet 4.5 [cch]",
"开始使用!"
]
}
Expand Down
4 changes: 2 additions & 2 deletions messages/zh-TW/settings/prices.json
Original file line number Diff line number Diff line change
Expand Up @@ -172,10 +172,10 @@
"deleteConfirm": "確定要刪除模型 {name} 嗎?此操作無法復原。",
"form": {
"modelName": "模型識別碼",
"modelNamePlaceholder": "例如:gpt-5.3-codex",
"modelNamePlaceholder": "例如:gpt-5.4",
"modelNameRequired": "模型 ID 為必填",
"displayName": "顯示名稱(選填)",
"displayNamePlaceholder": "例如:GPT-5.3 Codex",
"displayNamePlaceholder": "例如:GPT-5.4 Codex",
"type": "類型",
"provider": "供應商",
"providerPlaceholder": "例如:openai",
Expand Down
2 changes: 1 addition & 1 deletion messages/zh-TW/settings/providers/form/modelSelect.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"loading": "載入中...",
"manualAdd": "手動新增模型",
"manualDesc": "支援新增任意模型名稱(不限於價格表中的模型)",
"manualPlaceholder": "輸入模型名稱(例如 gpt-5-turbo)",
"manualPlaceholder": "輸入模型名稱(例如 gpt-5.4)",
"notFound": "找不到模型",
"openai": "OpenAI",
"providerFilterAll": "全部供應商",
Expand Down
2 changes: 1 addition & 1 deletion messages/zh-TW/settings/providers/form/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@
"modelWhitelistLoading": "載入中...",
"modelWhitelistManualAdd": "手動新增模型",
"modelWhitelistManualDesc": "支援新增任意模型名稱(不限於價格表中的模型)",
"modelWhitelistManualPlaceholder": "輸入模型名稱(例如 gpt-5-turbo)",
"modelWhitelistManualPlaceholder": "輸入模型名稱(例如 gpt-5.4)",
"modelWhitelistNotFound": "未找到模型",
"modelWhitelistSearchPlaceholder": "搜尋模型名稱...",
"modelWhitelistSelectAll": "全選({count})",
Expand Down
4 changes: 2 additions & 2 deletions messages/zh-TW/usage.json
Original file line number Diff line number Diff line change
Expand Up @@ -540,7 +540,7 @@
"importantPoints": [
"請先在 cch 後台創建 API Key,並設置環境變量 CCH_API_KEY",
"cchClaude/openai 使用 ${resolvedOrigin}/v1,cchGemini 使用 ${resolvedOrigin}/v1beta",
"模型選擇時使用 provider_id/model_id 格式(例如 openai/gpt-5.2 或 cchClaude/claude-sonnet-4-5-20250929)"
"模型選擇時使用 provider_id/model_id 格式(例如 openai/gpt-5.4 或 cchClaude/claude-sonnet-4-5-20250929)"
]
},

Expand Down Expand Up @@ -618,7 +618,7 @@
"steps": [
"重啟 Droid",
"輸入 /model 命令",
"選擇 GPT-5-Codex [cch] 或 Sonnet 4.5 [cch]",
"選擇 GPT-5.4 [cch] 或 Sonnet 4.5 [cch]",
"開始使用!"
]
}
Expand Down
Loading
Loading