@bitkyc08/opencodex 2.6.11 → 2.6.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ko.md +135 -35
- package/README.md +6 -0
- package/README.zh-CN.md +147 -26
- package/gui/dist/assets/{index-DaRQZAM0.js → index-CTjsL04v.js} +1 -1
- package/gui/dist/index.html +1 -1
- package/package.json +1 -1
- package/src/web-search/parse.ts +52 -15
package/README.ko.md
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
<h3 align="center">make codex open!</h3>
|
|
2
|
+
<p align="center"><code>npm install -g @bitkyc08/opencodex</code> · <code>ocx start</code> · <b>localhost:10100</b></p>
|
|
3
|
+
|
|
4
|
+
<p align="center">
|
|
5
|
+
<a href="https://www.npmjs.com/package/@bitkyc08/opencodex"><img src="https://img.shields.io/npm/v/@bitkyc08/opencodex?color=cb3837&label=npm&logo=npm" alt="npm version"></a>
|
|
6
|
+
<a href="https://github.com/lidge-jun/opencodex/blob/main/LICENSE"><img src="https://img.shields.io/npm/l/@bitkyc08/opencodex?color=blue" alt="license"></a>
|
|
7
|
+
<img src="https://img.shields.io/node/v/@bitkyc08/opencodex?logo=node.js&label=node" alt="node version">
|
|
8
|
+
</p>
|
|
9
|
+
|
|
1
10
|
<p align="center">
|
|
2
11
|
<img src="assets/banner.png" alt="opencodex — 어떤 LLM이든 Codex에서 사용" width="820">
|
|
3
12
|
</p>
|
|
@@ -10,8 +19,14 @@
|
|
|
10
19
|
<img src="assets/architecture.png" alt="opencodex 아키텍처 — Codex CLI가 opencodex 프록시를 통해 모든 LLM 프로바이더로 라우팅" width="820">
|
|
11
20
|
</p>
|
|
12
21
|
|
|
13
|
-
|
|
14
|
-
|
|
22
|
+
Claude, Gemini, Grok, GLM, DeepSeek, Kimi, Qwen, Ollama 등 어떤 LLM이든 Codex에서 사용하세요 — OpenAI가 지원을 추가하기를 기다릴 필요 없이.
|
|
23
|
+
|
|
24
|
+
opencodex는 Codex의 Responses API를 프로바이더가 쓰는 프로토콜로 변환해 주는 가벼운 로컬 프록시입니다. streaming, tool 호출, reasoning 토큰, 이미지까지 양방향으로 모두 동작합니다.
|
|
25
|
+
|
|
26
|
+
또한 Codex 인증을 위한 **ChatGPT 계정 풀**을 관리할 수 있습니다. 여러 ChatGPT / Codex 계정을 추가하고,
|
|
27
|
+
대시보드에서 5시간 / 주간 / 30일 쿼터를 갱신하며, 새 세션을 사용량이 가장 적은 정상 계정으로 자동
|
|
28
|
+
라우팅할 수 있습니다. 기존 Codex 스레드는 시작한 계정에 그대로 고정되므로, 긴 SSH·tmux·모바일 연결
|
|
29
|
+
세션이 대화 도중 계정을 바꾸지 않습니다.
|
|
15
30
|
|
|
16
31
|
```
|
|
17
32
|
Codex CLI / App / SDK ──/v1/responses──▶ opencodex ──▶ Any provider
|
|
@@ -20,6 +35,21 @@ Codex CLI / App / SDK ──/v1/responses──▶ opencodex ──▶ Any provi
|
|
|
20
35
|
OpenRouter · Azure · DeepSeek · GLM · …and OpenAI itself
|
|
21
36
|
```
|
|
22
37
|
|
|
38
|
+
```mermaid
|
|
39
|
+
flowchart LR
|
|
40
|
+
codex[Codex 세션<br/>CLI, App, SSH, 모바일] --> proxy[opencodex]
|
|
41
|
+
proxy --> existing{기존 스레드?}
|
|
42
|
+
existing -->|예| pinned[같은 ChatGPT<br/>계정 유지]
|
|
43
|
+
existing -->|새 세션| quota[쿼터 갱신<br/>5h, 주간, 30d]
|
|
44
|
+
quota --> pick[사용량 최소<br/>정상 계정 선택]
|
|
45
|
+
pick --> upstream[ChatGPT / Codex 백엔드]
|
|
46
|
+
pinned --> upstream
|
|
47
|
+
upstream --> outcomes[쿼터 / 인증 결과]
|
|
48
|
+
outcomes -->|429| cooldown[쿨다운 + failover]
|
|
49
|
+
outcomes -->|401 / 403| reauth[재인증 필요 표시]
|
|
50
|
+
cooldown --> quota
|
|
51
|
+
```
|
|
52
|
+
|
|
23
53
|
## 지원 플랫폼
|
|
24
54
|
|
|
25
55
|
| OS | 지원 상태 | 서비스 관리자 |
|
|
@@ -67,40 +97,72 @@ npm install -g @bitkyc08/opencodex # --ignore-scripts, --omit=optional 없이
|
|
|
67
97
|
가장 쉬운 방법은 웹 대시보드를 이용하는 것입니다.
|
|
68
98
|
|
|
69
99
|
```bash
|
|
70
|
-
ocx gui
|
|
100
|
+
ocx gui
|
|
71
101
|
```
|
|
72
102
|
|
|
73
|
-
|
|
103
|
+
`http://localhost:10100` 대시보드가 열립니다. 여기서:
|
|
104
|
+
|
|
105
|
+
1. **"Add Provider"** 를 클릭하세요.
|
|
106
|
+
2. **40개 이상의 내장 프로바이더** 중에서 고르거나, 커스텀 OpenAI 호환 엔드포인트를 입력하세요.
|
|
107
|
+
3. API 키를 붙여넣으세요 (Anthropic, xAI, Kimi는 OAuth 로그인도 가능).
|
|
108
|
+
4. 프로바이더의 `/v1/models` 엔드포인트에서 모델이 **자동 감지**됩니다.
|
|
74
109
|
|
|
75
|
-
|
|
76
|
-
2. **API 키 입력** — 키를 붙여넣으면 바로 저장됩니다. OAuth를 지원하는 프로바이더는 로그인 버튼으로 인증할 수도 있습니다.
|
|
77
|
-
3. **모델 자동 감지** — 프로바이더를 추가하면 사용 가능한 모델을 자동으로 가져옵니다. Codex 모델 선택기에도 곧바로 반영됩니다.
|
|
110
|
+
추가한 프로바이더는 재시작 없이 즉시 사용할 수 있습니다.
|
|
78
111
|
|
|
79
|
-
|
|
112
|
+
`ocx init`(대화형 CLI)이나 `~/.opencodex/config.json` 직접 편집으로도 프로바이더를 추가할 수 있습니다.
|
|
80
113
|
|
|
81
114
|
## 모델 라우팅
|
|
82
115
|
|
|
83
116
|
`provider/model` 형식으로 원하는 모델을 직접 지정할 수 있습니다:
|
|
84
117
|
|
|
85
118
|
```bash
|
|
86
|
-
|
|
87
|
-
codex -m "
|
|
88
|
-
|
|
89
|
-
|
|
119
|
+
# Anthropic을 통해 Claude Opus 사용
|
|
120
|
+
codex -m "anthropic/claude-opus-4-8" "이 스택 트레이스를 설명해 줘"
|
|
121
|
+
|
|
122
|
+
# Google을 통해 Gemini 사용
|
|
123
|
+
codex -m "google/gemini-3-pro" "auth.ts의 유닛 테스트를 작성해 줘"
|
|
124
|
+
|
|
125
|
+
# Ollama Cloud를 통해 GLM 사용
|
|
126
|
+
codex -m "ollama-cloud/glm-5.2" "SQL 마이그레이션을 작성해 줘"
|
|
127
|
+
|
|
128
|
+
# Ollama를 통해 로컬 모델 사용
|
|
129
|
+
codex -m "ollama/llama3" "이 함수를 리팩터링해 줘"
|
|
90
130
|
```
|
|
91
131
|
|
|
92
|
-
|
|
132
|
+
`provider/` 접두사를 생략하면 opencodex는 기본 프로바이더로 라우팅하거나, 모델명 패턴으로 자동
|
|
133
|
+
매칭합니다 (예: `claude-*`는 Anthropic, `gpt-*`는 OpenAI).
|
|
134
|
+
|
|
135
|
+
라우팅된 모델은 **Codex App** 모델 선택기에도 모델별 reasoning effort 컨트롤과 함께 나타납니다:
|
|
136
|
+
|
|
137
|
+
<p align="center">
|
|
138
|
+
<img src="assets/codex-app-picker.png" alt="opencodex 라우팅 모델을 reasoning effort 선택기와 함께 보여주는 Codex App" width="480">
|
|
139
|
+
</p>
|
|
140
|
+
|
|
141
|
+
## ChatGPT 계정 풀
|
|
142
|
+
|
|
143
|
+
대시보드의 **Codex Auth**를 열어 풀 계정을 추가하고, 다음 Codex 세션을 어느 계정이 처리할지 고르세요.
|
|
144
|
+
opencodex는 두 가지 동작을 분리해서 유지합니다:
|
|
145
|
+
|
|
146
|
+
- **기존 세션은 affinity를 유지합니다.** 스레드 id가 선택된 계정에 바인딩되어 이후 턴에서 재사용되므로,
|
|
147
|
+
긴 요청이나 모바일/SSH 연결 세션이 같은 계정을 계속 사용합니다.
|
|
148
|
+
- **새 세션은 자동 라우팅됩니다.** 자동 전환이 켜져 있으면 opencodex는 5시간·주간·30일 사용량 중 가장
|
|
149
|
+
뜨거운 쿼터 창을 비교해, 활성 계정이 임계치를 넘으면 새 세션을 사용량이 낮은 적격 계정으로 보냅니다.
|
|
150
|
+
- **쿼터 조회가 내장되어 있습니다.** 대시보드에서 모든 계정 쿼터를 한 번에 갱신할 수 있고, 요청 로그는
|
|
151
|
+
풀 트래픽을 비-PII 계정 서수로 라벨링합니다.
|
|
152
|
+
- **실패는 fail-closed입니다.** 토큰 실패는 다른 자격증명으로 조용히 폴백하지 않고 재인증을 표시합니다.
|
|
153
|
+
429 쿼터 응답은 계정을 쿨다운에 넣고 이후 작업을 다른 적격 풀 계정으로 failover할 수 있습니다.
|
|
93
154
|
|
|
94
155
|
## 주요 기능
|
|
95
156
|
|
|
96
|
-
-
|
|
97
|
-
- **
|
|
98
|
-
-
|
|
99
|
-
-
|
|
100
|
-
-
|
|
101
|
-
-
|
|
102
|
-
-
|
|
103
|
-
-
|
|
157
|
+
- **어떤 LLM이든 Codex에서.** 5개의 프로토콜 adapter가 Anthropic Messages, Google Gemini, Azure, OpenAI Responses passthrough, 그리고 모든 OpenAI 호환 Chat Completions 엔드포인트를 커버합니다 — 즉 기본 제공 **40개 이상의 프로바이더**입니다.
|
|
158
|
+
- **ChatGPT 계정을 안전하게 풀링.** 기존 Codex 스레드는 한 계정에 유지하면서, 새 세션은 쿼터 갱신과 비-PII 요청 라벨과 함께 풀에서 사용량이 낮은 계정을 자동 선택할 수 있습니다.
|
|
159
|
+
- **한 번 로그인하면 API 키는 생략.** xAI, Anthropic, Kimi는 OAuth를 지원하므로 기존 계정으로 인증할 수 있고 토큰은 자동 갱신됩니다. 또는 `codex login`을 forward 하거나, API 키를 붙여넣거나, `${ENV_VAR}` 참조를 쓸 수 있습니다 — 선택은 자유입니다.
|
|
160
|
+
- **Codex가 동작하는 모든 곳에서.** Codex CLI, TUI, App, SDK에 자동으로 주입됩니다. 라우팅된 모델이 네이티브 모델처럼 Codex 모델 선택기에 나타납니다.
|
|
161
|
+
- **알맞은 모델에 위임.** 대시보드나 config에서 최대 5개의 라우팅/네이티브 모델을 Codex 서브에이전트 선택기에 노출해, 복잡한 작업은 reasoning 모델로, 빠른 작업은 저렴한 모델로 보낼 수 있습니다.
|
|
162
|
+
- **어떤 모델에도 초능력을.** OpenAI가 아닌 모델도 ChatGPT 로그인 위에서 도는 `gpt-5.4-mini` sidecar로 실제 웹 검색과 이미지 이해를 사용합니다.
|
|
163
|
+
- **무슨 일이 일어나는지 보이게.** 웹 대시보드가 프로바이더, OAuth 상태, 모델 선택, 실시간 요청 로그를 보여줍니다 — 왜 요청이 실패했는지 더는 추측하지 않아도 됩니다.
|
|
164
|
+
- **백그라운드 실행.** 시스템 서비스(launchd / systemd / Task Scheduler)로 설치하면 부팅 시 자동 시작되어 신경 쓸 필요가 없습니다.
|
|
165
|
+
- **깔끔한 종료, 잔여물 제로.** `ocx stop`(또는 대시보드의 Stop 버튼)은 프록시를 종료하고, 설치된 백그라운드 서비스를 멈추며, Codex를 원래 설정으로 복원합니다. 이후 `codex`는 잔여 설정이나 좀비 프로세스 없이 이전과 똑같이 동작합니다.
|
|
104
166
|
|
|
105
167
|
## 프로바이더 및 adapter
|
|
106
168
|
|
|
@@ -113,11 +175,13 @@ codex -m "xai/grok-4" "이 PR을 리뷰해 줘"
|
|
|
113
175
|
| xAI Grok | `openai-chat` | oauth / key |
|
|
114
176
|
| Kimi (Moonshot) | `openai-chat` | oauth / key |
|
|
115
177
|
| Google Gemini | `google` | key |
|
|
116
|
-
| Azure OpenAI | `azure` | key |
|
|
178
|
+
| Azure OpenAI | `azure-openai` | key |
|
|
117
179
|
| Ollama Cloud + 17개 프로바이더 카탈로그 | `openai-chat` | key |
|
|
118
180
|
| Ollama / vLLM / LM Studio (로컬) | `openai-chat` | key (보통 비워둠) |
|
|
119
181
|
| 모든 OpenAI 호환 엔드포인트 | `openai-chat` | key |
|
|
120
182
|
|
|
183
|
+
그 외에 DeepSeek, Groq, OpenRouter, Together, Fireworks, Cerebras, Mistral, Hugging Face, NVIDIA NIM, MiniMax, Qwen Portal 등이 있습니다. 전체 목록은 `ocx init` 또는 [프로바이더 문서](https://lidge-jun.github.io/opencodex/ko/reference/configuration/)에서 확인하세요.
|
|
184
|
+
|
|
121
185
|
## CLI
|
|
122
186
|
|
|
123
187
|
```bash
|
|
@@ -194,15 +258,39 @@ opencodex는 `config.json.invalid-<timestamp>`로 백업하고 경고를 출력
|
|
|
194
258
|
}
|
|
195
259
|
```
|
|
196
260
|
|
|
197
|
-
|
|
261
|
+
프로바이더 항목은 라우팅 카탈로그 메타데이터도 함께 지정할 수 있습니다. `contextWindow`는 프로바이더
|
|
262
|
+
전체에 적용되는 Codex 노출용 컨텍스트 상한, `modelContextWindows`는 모델별 상한,
|
|
263
|
+
`modelInputModalities`는 `["text"]`나 `["text", "image"]` 같은 모델별 입력 힌트입니다. 이 값들은 라이브
|
|
264
|
+
`/models` 메타데이터를 상한으로 제한할 뿐, 더 작은 라이브 컨텍스트를 늘리지는 않습니다. 전체 필드는
|
|
265
|
+
설정 레퍼런스를 참고하세요.
|
|
266
|
+
|
|
267
|
+
> **Z.AI 경유 GLM-5.2 1M 컨텍스트:** `openai-chat` adapter에서는 `glm-5.2`와 `glm-5.2[1m]`이 모두
|
|
268
|
+
> 동작합니다 — opencodex가 요청 전에 끝의 `[1m]` 접미사를 제거하기 때문입니다(OpenAI 호환 엔드포인트는
|
|
269
|
+
> 대괄호 id를 거부함, Z.AI 400 code 1211). `[1m]` 접미사는 Claude-Code / Anthropic 엔드포인트 관례이며,
|
|
270
|
+
> 네이티브로 쓰려면 `anthropic` adapter를 Z.AI 코딩 base(`https://api.z.ai/api/coding/paas/v4`)로
|
|
271
|
+
> 향하게 하세요. 1M 컨텍스트 창은 모델명이 아니라 모델 카탈로그(`modelContextWindows`)로 설정합니다.
|
|
272
|
+
|
|
273
|
+
로컬 모델도 동작합니다. opencodex를 머신에서 실행 중인 OpenAI 호환 서버로 향하게 하세요:
|
|
198
274
|
|
|
199
275
|
```json
|
|
200
276
|
{
|
|
201
|
-
"
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
"
|
|
205
|
-
|
|
277
|
+
"port": 10100,
|
|
278
|
+
"defaultProvider": "ollama",
|
|
279
|
+
"providers": {
|
|
280
|
+
"ollama": {
|
|
281
|
+
"adapter": "openai-chat",
|
|
282
|
+
"baseUrl": "http://localhost:11434/v1",
|
|
283
|
+
"authMode": "key",
|
|
284
|
+
"apiKey": "",
|
|
285
|
+
"defaultModel": "llama3"
|
|
286
|
+
},
|
|
287
|
+
"vllm": {
|
|
288
|
+
"adapter": "openai-chat",
|
|
289
|
+
"baseUrl": "http://localhost:8000/v1",
|
|
290
|
+
"authMode": "key",
|
|
291
|
+
"apiKey": "",
|
|
292
|
+
"defaultModel": "Qwen/Qwen3-32B"
|
|
293
|
+
}
|
|
206
294
|
}
|
|
207
295
|
}
|
|
208
296
|
```
|
|
@@ -229,6 +317,19 @@ x-opencodex-api-key: your-secret-token
|
|
|
229
317
|
|
|
230
318
|
토큰은 타이밍 공격 방지를 위해 상수 시간으로 비교됩니다.
|
|
231
319
|
|
|
320
|
+
opencodex는 Codex resume 히스토리를 자동으로 remap해, 오래된 OpenAI 채팅과 opencodex가 만든 프로젝트
|
|
321
|
+
스레드가 프록시 활성 동안 Codex App에 계속 보이도록 합니다. 원본 provider/source 메타데이터는
|
|
322
|
+
`~/.opencodex/codex-history-backup.json`에 기록됩니다. `ocx stop` / `ocx restore`는 백업된 OpenAI 행을
|
|
323
|
+
OpenAI로 복원하고, 남은 opencodex 유저 스레드도 OpenAI로 eject 하여 네이티브 Codex가 `config.toml`에
|
|
324
|
+
더 이상 존재하지 않는 provider의 스레드를 resume 하려다 실패하지 않게 합니다.
|
|
325
|
+
|
|
326
|
+
백업 지원이 생기기 전의 옛 개발 빌드에서 `syncResumeHistory`가 이미 히스토리를 remap 했다면, 명시적
|
|
327
|
+
복구 명령을 실행할 수 있습니다:
|
|
328
|
+
|
|
329
|
+
```bash
|
|
330
|
+
ocx recover-history --legacy-openai
|
|
331
|
+
```
|
|
332
|
+
|
|
232
333
|
모든 필드에 대한 자세한 내용은 **[설정 레퍼런스](https://lidge-jun.github.io/opencodex/ko/reference/configuration/)** 를 참고하세요.
|
|
233
334
|
|
|
234
335
|
## 문서
|
|
@@ -244,18 +345,17 @@ x-opencodex-api-key: your-secret-token
|
|
|
244
345
|
git clone https://github.com/lidge-jun/opencodex.git
|
|
245
346
|
cd opencodex
|
|
246
347
|
bun install
|
|
247
|
-
bun run dev
|
|
348
|
+
bun run dev:proxy # dev 모드로 프록시 API 시작
|
|
349
|
+
bun run dev:gui # 다른 터미널에서 대시보드 dev 서버 시작
|
|
248
350
|
bun x tsc --noEmit # 타입 체크
|
|
249
351
|
```
|
|
250
352
|
|
|
251
|
-
`bun run dev`는
|
|
252
|
-
|
|
253
|
-
수정할 때는 별도로 실행하세요:
|
|
353
|
+
`bun run dev`는 호환성을 위해 `bun run dev:proxy`의 별칭으로 남아 있습니다. 소스 체크아웃에서 프록시
|
|
354
|
+
API는 `/healthz`, `/v1/responses`, `/api/*`를 노출하며, `GET /`는 `bun run build:gui`가 `gui/dist`를
|
|
355
|
+
생성한 뒤에만 패키징된 대시보드를 서빙합니다. 대시보드를 수정할 때는 프론트엔드를 별도로 실행하세요:
|
|
254
356
|
|
|
255
357
|
```bash
|
|
256
|
-
|
|
257
|
-
bun install
|
|
258
|
-
bun dev
|
|
358
|
+
bun run dev:gui
|
|
259
359
|
```
|
|
260
360
|
|
|
261
361
|
**[기여하기](https://lidge-jun.github.io/opencodex/ko/contributing/)** 를 참고하세요.
|
package/README.md
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
<h3 align="center">make codex open!</h3>
|
|
2
2
|
<p align="center"><code>npm install -g @bitkyc08/opencodex</code> · <code>ocx start</code> · <b>localhost:10100</b></p>
|
|
3
3
|
|
|
4
|
+
<p align="center">
|
|
5
|
+
<a href="https://www.npmjs.com/package/@bitkyc08/opencodex"><img src="https://img.shields.io/npm/v/@bitkyc08/opencodex?color=cb3837&label=npm&logo=npm" alt="npm version"></a>
|
|
6
|
+
<a href="https://github.com/lidge-jun/opencodex/blob/main/LICENSE"><img src="https://img.shields.io/npm/l/@bitkyc08/opencodex?color=blue" alt="license"></a>
|
|
7
|
+
<img src="https://img.shields.io/node/v/@bitkyc08/opencodex?logo=node.js&label=node" alt="node version">
|
|
8
|
+
</p>
|
|
9
|
+
|
|
4
10
|
<p align="center">
|
|
5
11
|
<img src="assets/banner.png" alt="opencodex — Universal provider proxy for Codex, use any LLM" width="820">
|
|
6
12
|
</p>
|
package/README.zh-CN.md
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
<h3 align="center">make codex open!</h3>
|
|
2
|
+
<p align="center"><code>npm install -g @bitkyc08/opencodex</code> · <code>ocx start</code> · <b>localhost:10100</b></p>
|
|
3
|
+
|
|
4
|
+
<p align="center">
|
|
5
|
+
<a href="https://www.npmjs.com/package/@bitkyc08/opencodex"><img src="https://img.shields.io/npm/v/@bitkyc08/opencodex?color=cb3837&label=npm&logo=npm" alt="npm version"></a>
|
|
6
|
+
<a href="https://github.com/lidge-jun/opencodex/blob/main/LICENSE"><img src="https://img.shields.io/npm/l/@bitkyc08/opencodex?color=blue" alt="license"></a>
|
|
7
|
+
<img src="https://img.shields.io/node/v/@bitkyc08/opencodex?logo=node.js&label=node" alt="node version">
|
|
8
|
+
</p>
|
|
9
|
+
|
|
1
10
|
<p align="center">
|
|
2
11
|
<img src="assets/banner.png" alt="opencodex — 让 Codex 接入任意 LLM" width="820">
|
|
3
12
|
</p>
|
|
@@ -10,7 +19,13 @@
|
|
|
10
19
|
<img src="assets/architecture.png" alt="opencodex 架构 — Codex CLI 通过 opencodex 代理路由到任意 LLM 提供商" width="820">
|
|
11
20
|
</p>
|
|
12
21
|
|
|
13
|
-
Codex
|
|
22
|
+
在 Codex 中使用 Claude、Gemini、Grok、GLM、DeepSeek、Kimi、Qwen、Ollama 或任意其他 LLM —— 无需等待 OpenAI 添加支持。
|
|
23
|
+
|
|
24
|
+
opencodex 是一个轻量级本地代理,把 Codex 的 Responses API 翻译成你的 provider 所讲的协议。streaming、tool 调用、reasoning token、图片 —— 全部双向工作。
|
|
25
|
+
|
|
26
|
+
它还能为 Codex 认证管理一个 **ChatGPT 账户池**。添加多个 ChatGPT / Codex 账户,在仪表盘中刷新它们的
|
|
27
|
+
5 小时 / 每周 / 30 天配额,并让新会话自动路由到使用量最低的健康账户。现有 Codex 线程会固定在启动它的
|
|
28
|
+
账户上,因此长时间的 SSH、tmux 或移动端连接的会话不会在对话中途切换账户。
|
|
14
29
|
|
|
15
30
|
```
|
|
16
31
|
Codex CLI / App / SDK ──/v1/responses──▶ opencodex ──▶ Any provider
|
|
@@ -19,6 +34,21 @@ Codex CLI / App / SDK ──/v1/responses──▶ opencodex ──▶ Any provi
|
|
|
19
34
|
OpenRouter · Azure · DeepSeek · GLM · …and OpenAI itself
|
|
20
35
|
```
|
|
21
36
|
|
|
37
|
+
```mermaid
|
|
38
|
+
flowchart LR
|
|
39
|
+
codex[Codex 会话<br/>CLI, App, SSH, 移动端] --> proxy[opencodex]
|
|
40
|
+
proxy --> existing{已有线程?}
|
|
41
|
+
existing -->|是| pinned[保持同一<br/>ChatGPT 账户]
|
|
42
|
+
existing -->|新会话| quota[刷新配额<br/>5h, 每周, 30d]
|
|
43
|
+
quota --> pick[选择使用量最低<br/>的健康账户]
|
|
44
|
+
pick --> upstream[ChatGPT / Codex 后端]
|
|
45
|
+
pinned --> upstream
|
|
46
|
+
upstream --> outcomes[配额 / 认证结果]
|
|
47
|
+
outcomes -->|429| cooldown[冷却 + failover]
|
|
48
|
+
outcomes -->|401 / 403| reauth[标记需重新认证]
|
|
49
|
+
cooldown --> quota
|
|
50
|
+
```
|
|
51
|
+
|
|
22
52
|
## 支持平台
|
|
23
53
|
|
|
24
54
|
| 操作系统 | 状态 | 服务管理 |
|
|
@@ -60,41 +90,74 @@ npm install -g @bitkyc08/opencodex # 不要加 --ignore-scripts、--omit=optio
|
|
|
60
90
|
|
|
61
91
|
## 亮点
|
|
62
92
|
|
|
63
|
-
-
|
|
64
|
-
-
|
|
65
|
-
-
|
|
66
|
-
-
|
|
67
|
-
-
|
|
68
|
-
-
|
|
69
|
-
-
|
|
70
|
-
-
|
|
71
|
-
- **干净退出,零残留。** `ocx stop`(或仪表盘的 Stop
|
|
93
|
+
- **在 Codex 中使用任意 LLM。** 5 种协议 adapter 覆盖 Anthropic Messages、Google Gemini、Azure、OpenAI Responses 直通,以及所有 OpenAI 兼容 Chat Completions 端点 —— 即开箱即用的 **40+ provider**。
|
|
94
|
+
- **安全地池化 ChatGPT 账户。** 现有 Codex 线程保持在一个账户上,而新会话可以从池中自动挑选使用量更低的账户,并带有配额刷新和非 PII 请求标签。
|
|
95
|
+
- **登录一次,免填 API key。** xAI、Anthropic、Kimi 支持 OAuth,可用现有账户认证,token 自动刷新。也可以转发 `codex login`、粘贴 API key,或使用 `${ENV_VAR}` 引用 —— 随你选择。
|
|
96
|
+
- **Codex 在哪里能用,它就在哪里能用。** 自动注入 Codex CLI、TUI、App 和 SDK。路由模型像原生模型一样出现在 Codex 的模型选择器里。
|
|
97
|
+
- **委派给合适的模型。** 在仪表盘或 config 中把最多 5 个路由/原生模型放进 Codex 的 subagent 选择器 —— 复杂任务交给 reasoning 模型,快速任务交给便宜模型。
|
|
98
|
+
- **给任意模型超能力。** 非 OpenAI 模型也能通过你的 ChatGPT 登录上运行的 `gpt-5.4-mini` sidecar 获得真正的网页搜索和图片理解。
|
|
99
|
+
- **看清正在发生什么。** Web 仪表盘展示 provider、OAuth 状态、模型选择和实时请求日志 —— 不必再猜测请求为何失败。
|
|
100
|
+
- **后台运行。** 安装为系统服务(launchd / systemd / Task Scheduler)后开机自启,无需操心。
|
|
101
|
+
- **干净退出,零残留。** `ocx stop`(或仪表盘的 Stop 按钮)会关闭代理、停止已安装的后台服务,并将 Codex 恢复为原始配置。之后 `codex` 就像从未安装过 opencodex 一样工作 —— 无残留配置,无僵尸进程。
|
|
72
102
|
|
|
73
103
|
## 添加 Provider
|
|
74
104
|
|
|
75
105
|
最简单的方式:用 Web 仪表盘。
|
|
76
106
|
|
|
77
107
|
```bash
|
|
78
|
-
ocx gui
|
|
108
|
+
ocx gui
|
|
79
109
|
```
|
|
80
110
|
|
|
81
|
-
|
|
111
|
+
这会打开 `http://localhost:10100` 仪表盘。在这里:
|
|
112
|
+
|
|
113
|
+
1. 点击 **"Add Provider"**。
|
|
114
|
+
2. 从 **40+ 内置 provider** 中选择,或输入自定义的 OpenAI 兼容端点。
|
|
115
|
+
3. 粘贴 API key(Anthropic、xAI、Kimi 也可用 OAuth 登录)。
|
|
116
|
+
4. 模型会从 provider 的 `/v1/models` 端点**自动发现**。
|
|
82
117
|
|
|
83
|
-
|
|
118
|
+
新 provider 立即可用,无需重启。
|
|
119
|
+
|
|
120
|
+
你也可以通过 `ocx init`(交互式 CLI)或直接编辑 `~/.opencodex/config.json` 来添加 provider。
|
|
84
121
|
|
|
85
122
|
## 模型路由
|
|
86
123
|
|
|
87
124
|
通过 `provider/model` 格式指定路由模型,在 Codex 中直接使用:
|
|
88
125
|
|
|
89
126
|
```bash
|
|
90
|
-
|
|
91
|
-
codex -m "
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
codex -m "
|
|
127
|
+
# 通过 Anthropic 使用 Claude Opus
|
|
128
|
+
codex -m "anthropic/claude-opus-4-8" "解释这个 stack trace"
|
|
129
|
+
|
|
130
|
+
# 通过 Google 使用 Gemini
|
|
131
|
+
codex -m "google/gemini-3-pro" "为 auth.ts 写单元测试"
|
|
132
|
+
|
|
133
|
+
# 通过 Ollama Cloud 使用 GLM
|
|
134
|
+
codex -m "ollama-cloud/glm-5.2" "写一个 SQL migration"
|
|
135
|
+
|
|
136
|
+
# 通过 Ollama 使用本地模型
|
|
137
|
+
codex -m "ollama/llama3" "重构这个函数"
|
|
95
138
|
```
|
|
96
139
|
|
|
97
|
-
|
|
140
|
+
省略 `provider/` 前缀时,opencodex 会路由到默认 provider,或根据模型名模式自动匹配(例如 `claude-*`
|
|
141
|
+
路由到 Anthropic,`gpt-*` 路由到 OpenAI)。
|
|
142
|
+
|
|
143
|
+
路由模型也会出现在 **Codex App** 模型选择器中,并带有按模型的 reasoning effort 控制:
|
|
144
|
+
|
|
145
|
+
<p align="center">
|
|
146
|
+
<img src="assets/codex-app-picker.png" alt="Codex App 展示 opencodex 路由模型及 reasoning effort 选择器" width="480">
|
|
147
|
+
</p>
|
|
148
|
+
|
|
149
|
+
## ChatGPT 账户池
|
|
150
|
+
|
|
151
|
+
打开仪表盘中的 **Codex Auth** 来添加池账户,并选择由哪个账户处理下一个 Codex 会话。
|
|
152
|
+
opencodex 保持两种独立行为:
|
|
153
|
+
|
|
154
|
+
- **现有会话保持 affinity。** 线程 id 绑定到所选账户并在后续轮次复用,因此长请求或移动/SSH 连接的会话
|
|
155
|
+
会继续使用同一账户。
|
|
156
|
+
- **新会话可自动路由。** 启用自动切换后,opencodex 比较 5 小时、每周、30 天使用量中最热的配额窗口,
|
|
157
|
+
当活跃账户越过阈值时,为新会话挑选使用量更低的合格账户。
|
|
158
|
+
- **内置配额查询。** 仪表盘可一键刷新所有账户配额,请求日志用非 PII 的账户序号标记池流量。
|
|
159
|
+
- **失败即 fail-closed。** token 失败会标记需重新认证,而不是悄悄回退到另一个凭证;429 配额响应会让账户
|
|
160
|
+
进入冷却,并可将后续工作 failover 到另一个合格的池账户。
|
|
98
161
|
|
|
99
162
|
## Provider 与 adapter
|
|
100
163
|
|
|
@@ -107,11 +170,13 @@ codex -m "deepseek/deepseek-r1" "分析这个性能瓶颈"
|
|
|
107
170
|
| xAI Grok | `openai-chat` | oauth / key |
|
|
108
171
|
| Kimi(Moonshot) | `openai-chat` | oauth / key |
|
|
109
172
|
| Google Gemini | `google` | key |
|
|
110
|
-
| Azure OpenAI | `azure` | key |
|
|
173
|
+
| Azure OpenAI | `azure-openai` | key |
|
|
111
174
|
| Ollama Cloud + 17 家 provider 目录 | `openai-chat` | key |
|
|
112
175
|
| Ollama / vLLM / LM Studio(本地) | `openai-chat` | key(通常留空) |
|
|
113
176
|
| 任意 OpenAI 兼容端点 | `openai-chat` | key |
|
|
114
177
|
|
|
178
|
+
此外还有 DeepSeek、Groq、OpenRouter、Together、Fireworks、Cerebras、Mistral、Hugging Face、NVIDIA NIM、MiniMax、Qwen Portal 等等。完整列表可通过 `ocx init` 查看,或参阅 [provider 文档](https://lidge-jun.github.io/opencodex/zh-cn/reference/configuration/)。
|
|
179
|
+
|
|
115
180
|
## CLI
|
|
116
181
|
|
|
117
182
|
```bash
|
|
@@ -119,6 +184,8 @@ ocx init # 交互式初始化
|
|
|
119
184
|
ocx start [--port 10100] # 启动代理
|
|
120
185
|
ocx stop # 停止并恢复原生 Codex 配置
|
|
121
186
|
ocx restore # 仅恢复,不停止(别名:ocx eject)
|
|
187
|
+
ocx uninstall # 移除 service/shim/config 并恢复原生 Codex
|
|
188
|
+
ocx ensure # 按需启动 + 刷新 Codex config/cache
|
|
122
189
|
ocx sync # 刷新模型列表 + 重新注入 Codex
|
|
123
190
|
ocx status # 查看代理是否在运行
|
|
124
191
|
ocx login <xai|anthropic|kimi> # OAuth 登录
|
|
@@ -142,6 +209,18 @@ opencodex 提供两种自动启动代理的方式:
|
|
|
142
209
|
| **移除** | `ocx service uninstall` | `ocx codex-shim uninstall` |
|
|
143
210
|
|
|
144
211
|
如需常驻代理,使用 **service**(推荐开发环境)。轻量按需启动使用 **shim**。
|
|
212
|
+
如果配置的代理端口已被占用,`ocx start` 会自动选择另一个空闲本地端口并更新 Codex 使用它。
|
|
213
|
+
|
|
214
|
+
### 卸载
|
|
215
|
+
|
|
216
|
+
删除 npm 包之前,先清理本地状态:
|
|
217
|
+
|
|
218
|
+
```bash
|
|
219
|
+
ocx uninstall
|
|
220
|
+
npm uninstall -g @bitkyc08/opencodex
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
`ocx uninstall` 会停止代理、移除已安装的 service、移除 Codex shim、恢复原生 Codex config/catalog/history,并删除 `~/.opencodex`。
|
|
145
224
|
|
|
146
225
|
## 配置
|
|
147
226
|
|
|
@@ -170,6 +249,17 @@ opencodex 提供两种自动启动代理的方式:
|
|
|
170
249
|
}
|
|
171
250
|
```
|
|
172
251
|
|
|
252
|
+
provider 条目还可以标注路由目录元数据。`contextWindow` 设置 provider 级别、对 Codex 可见的上下文上限,
|
|
253
|
+
`modelContextWindows` 设置按模型的上限,`modelInputModalities` 设置按模型的目录输入提示,例如 `["text"]`
|
|
254
|
+
或 `["text", "image"]`。这些值只会对实时 `/models` 元数据设上限,绝不会抬高更小的实时上下文窗口。完整字段
|
|
255
|
+
参阅配置参考。
|
|
256
|
+
|
|
257
|
+
> **通过 Z.AI 使用 GLM-5.2 1M 上下文:** 在 `openai-chat` adapter 下,`glm-5.2` 和 `glm-5.2[1m]` 都可用 ——
|
|
258
|
+
> opencodex 会在发送请求前剥离末尾的 `[1m]` 后缀,因为 OpenAI 兼容端点会拒绝带方括号的 id(Z.AI 400 code
|
|
259
|
+
> 1211)。`[1m]` 后缀是 Claude-Code / Anthropic 端点的约定;若要原生使用,请把 `anthropic` adapter 指向
|
|
260
|
+
> Z.AI 的 coding base(`https://api.z.ai/api/coding/paas/v4`)。1M 上下文窗口通过模型目录
|
|
261
|
+
> (`modelContextWindows`)设置,而不是模型名。
|
|
262
|
+
|
|
173
263
|
**本地 provider 示例(Ollama / vLLM / LM Studio):**
|
|
174
264
|
|
|
175
265
|
```json
|
|
@@ -191,6 +281,37 @@ opencodex 提供两种自动启动代理的方式:
|
|
|
191
281
|
|
|
192
282
|
WebSocket 传输默认关闭。只有当你希望 Codex 使用 Responses WebSocket 而不是 HTTP/SSE 时,才需要设置 `"websockets": true`。
|
|
193
283
|
|
|
284
|
+
### 远程访问
|
|
285
|
+
|
|
286
|
+
默认情况下 opencodex 绑定到 `127.0.0.1`(回环)且无需额外认证。
|
|
287
|
+
如果你设置 `"hostname": "0.0.0.0"` 把代理暴露到局域网,opencodex 会要求一个 bearer token 来同时保护管理
|
|
288
|
+
API(`/api/*`)和数据平面(`/v1/responses`):
|
|
289
|
+
|
|
290
|
+
```bash
|
|
291
|
+
export OPENCODEX_API_AUTH_TOKEN="your-secret-token"
|
|
292
|
+
ocx start
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
绑定到非回环地址时若缺少该环境变量,代理会拒绝启动。若为局域网访问安装后台服务,请在 `ocx service install`
|
|
296
|
+
之前于同一 shell 中导出相同变量,以便服务管理器接收到它。客户端(脚本、远程机器)必须在每个请求中带上 token:
|
|
297
|
+
|
|
298
|
+
```
|
|
299
|
+
x-opencodex-api-key: your-secret-token
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
token 以常量时间比较,以防止时序攻击。
|
|
303
|
+
|
|
304
|
+
opencodex 会自动 remap Codex resume 历史,使旧的 OpenAI 对话和 opencodex 创建的项目线程在代理活动期间仍在
|
|
305
|
+
Codex App 中可见。原始 provider/source 元数据记录在 `~/.opencodex/codex-history-backup.json`。`ocx stop` /
|
|
306
|
+
`ocx restore` 会把备份的 OpenAI 行恢复到 OpenAI,并把剩余的 opencodex 用户线程也 eject 到 OpenAI,这样原生
|
|
307
|
+
Codex 不会尝试 resume 一个其 provider 已不在 `config.toml` 中的线程。
|
|
308
|
+
|
|
309
|
+
如果你测试过备份支持出现之前的旧开发版本(`syncResumeHistory` 已经 remap 了历史),可以运行显式恢复命令:
|
|
310
|
+
|
|
311
|
+
```bash
|
|
312
|
+
ocx recover-history --legacy-openai
|
|
313
|
+
```
|
|
314
|
+
|
|
194
315
|
每个字段的详细说明参阅 **[配置参考](https://lidge-jun.github.io/opencodex/zh-cn/reference/configuration/)**。
|
|
195
316
|
|
|
196
317
|
## 文档
|
|
@@ -205,17 +326,17 @@ WebSocket 传输默认关闭。只有当你希望 Codex 使用 Responses WebSock
|
|
|
205
326
|
git clone https://github.com/lidge-jun/opencodex.git
|
|
206
327
|
cd opencodex
|
|
207
328
|
bun install
|
|
208
|
-
bun run dev
|
|
329
|
+
bun run dev:proxy # 以开发模式启动代理 API
|
|
330
|
+
bun run dev:gui # 在另一个终端启动仪表盘 dev 服务器
|
|
209
331
|
bun x tsc --noEmit # 类型检查
|
|
210
332
|
```
|
|
211
333
|
|
|
212
|
-
`bun run dev`
|
|
213
|
-
|
|
334
|
+
`bun run dev` 作为 `bun run dev:proxy` 的别名保留以兼容旧用法。在源码检出中,代理 API 暴露 `/healthz`、
|
|
335
|
+
`/v1/responses`、`/api/*`;只有在 `bun run build:gui` 生成 `gui/dist` 之后,`GET /` 才会提供打包后的仪表盘。
|
|
336
|
+
开发前端时请单独运行:
|
|
214
337
|
|
|
215
338
|
```bash
|
|
216
|
-
|
|
217
|
-
bun install
|
|
218
|
-
bun dev
|
|
339
|
+
bun run dev:gui
|
|
219
340
|
```
|
|
220
341
|
|
|
221
342
|
参阅 **[贡献指南](https://lidge-jun.github.io/opencodex/zh-cn/contributing/)**。
|