codex-as-api 0.8.3__tar.gz → 0.9.2__tar.gz

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.
Files changed (52) hide show
  1. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/PKG-INFO +25 -5
  2. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/README.md +24 -4
  3. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/RELEASES.md +47 -0
  4. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/config/codex-upstream-contract.json +3 -3
  5. codex_as_api-0.9.2/config/verified-hidden-models.json +165 -0
  6. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/pyproject.toml +3 -1
  7. codex_as_api-0.9.2/scripts/check_no_static_model_catalog.py +413 -0
  8. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/src/codex_as_api/__init__.py +1 -1
  9. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/src/codex_as_api/anthropic_adapter.py +327 -13
  10. codex_as_api-0.9.2/src/codex_as_api/codex_version.py +558 -0
  11. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/src/codex_as_api/messages.py +13 -0
  12. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/src/codex_as_api/model_capabilities.py +65 -2
  13. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/src/codex_as_api/provider.py +346 -67
  14. codex_as_api-0.9.2/src/codex_as_api/reasoning_signature.py +229 -0
  15. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/src/codex_as_api/server.py +18 -1
  16. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/tests/conftest.py +11 -1
  17. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/tests/test_anthropic_adapter.py +641 -0
  18. codex_as_api-0.9.2/tests/test_codex_version.py +447 -0
  19. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/tests/test_messages.py +30 -0
  20. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/tests/test_model_capabilities.py +76 -1
  21. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/tests/test_no_static_model_catalog.py +63 -0
  22. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/tests/test_provider.py +401 -7
  23. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/tests/test_server.py +522 -3
  24. codex_as_api-0.8.3/scripts/check_no_static_model_catalog.py +0 -202
  25. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/.gitignore +0 -0
  26. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/LICENSE +0 -0
  27. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/THIRD_PARTY_NOTICES.md +0 -0
  28. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/config/o200k_base.tiktoken +0 -0
  29. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/requirements.txt +0 -0
  30. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/rust/THIRD_PARTY_NOTICES.md +0 -0
  31. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/scripts/check_package_versions.py +0 -0
  32. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/scripts/check_registry_release.py +0 -0
  33. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/scripts/check_release_artifacts.py +0 -0
  34. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/scripts/generate_rust_third_party_notices.py +0 -0
  35. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/scripts/package_rust_release.py +0 -0
  36. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/src/codex_as_api/auth.py +0 -0
  37. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/src/codex_as_api/codex_config.py +0 -0
  38. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/src/codex_as_api/o200k_tokenizer.py +0 -0
  39. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/src/codex_as_api/protocol.py +0 -0
  40. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/src/codex_as_api/strict_json.py +0 -0
  41. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/tests/__init__.py +0 -0
  42. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/tests/fixtures/o200k_base_encode_ordinary.json +0 -0
  43. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/tests/test_auth.py +0 -0
  44. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/tests/test_codex_config.py +0 -0
  45. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/tests/test_o200k_tokenizer.py +0 -0
  46. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/tests/test_package_versions.py +0 -0
  47. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/tests/test_protocol.py +0 -0
  48. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/tests/test_registry_release.py +0 -0
  49. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/tests/test_release_artifacts.py +0 -0
  50. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/tests/test_rust_third_party_notices.py +0 -0
  51. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/tests/test_strict_json.py +0 -0
  52. {codex_as_api-0.8.3 → codex_as_api-0.9.2}/tests/test_ultrafast.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: codex-as-api
3
- Version: 0.8.3
3
+ Version: 0.9.2
4
4
  Summary: Use ChatGPT/Codex OAuth as a local OpenAI-compatible API server.
5
5
  Project-URL: Homepage, https://github.com/Eunho-J/codex-as-api
6
6
  Project-URL: Repository, https://github.com/Eunho-J/codex-as-api
@@ -192,9 +192,25 @@ model_auto_compact_token_limit = 244800
192
192
 
193
193
  ### Supported Models
194
194
 
195
- Models and capabilities come only from the authenticated Codex `/models` response. The proxy keeps each account/base-URL/client-version snapshot in memory for 300 seconds, invalidates it when a Responses `X-Models-Etag` changes, and never serves a static, stale, or cross-account fallback. An unavailable or malformed refresh returns `503 catalog_unavailable` before streaming headers are sent; an upstream HTTP rejection after the one allowed OAuth refresh preserves its status as `upstream_error`.
195
+ Ordinary models and capabilities come from the authenticated Codex `/models` response. The proxy keeps each account/base-URL/client-version snapshot in memory for 300 seconds and invalidates it when a Responses `X-Models-Etag` changes. An unavailable or malformed refresh returns `503 catalog_unavailable` before streaming headers are sent; an upstream HTTP rejection after the one allowed OAuth refresh preserves its status as `upstream_error`. Model snapshots are never shared across accounts or served as an offline fallback.
196
196
 
197
- Use `GET /v1/models` instead of relying on a documentation list. Every row in the fresh authenticated snapshot is returned, including its exact slug, visibility, `supported_in_api`, reasoning-summary controls, and opaque `comp_hash` compatibility identifier when supplied. A valid empty catalog returns `200` with `data: []`; health and model-default resolution then return `503 catalog_unavailable` rather than selecting a fallback. Requests must use an exact live slug; unknown explicit IDs return `404 model_not_found`.
197
+ Use `GET /v1/models` for the effective catalog. It includes exact slugs, visibility, `supported_in_api`, reasoning-summary controls, and opaque `comp_hash` compatibility identifiers when supplied. Unknown IDs return `404 model_not_found`. Automatic default selection uses only the upstream catalog's originally visible models, not the experimental additions below.
198
+
199
+ #### Experimental hidden models
200
+
201
+ These three upstream-hidden models returned real responses on October 24, 2026, and are explicitly included in codex-as-api's effective catalog:
202
+
203
+ | Model ID | Observed upstream purpose |
204
+ | --- | --- |
205
+ | `gpt-6-chat-thinking` | Server-described paid CCA experiment; hidden and marked unsupported in the upstream API catalog |
206
+ | `gpt-reserve` | Official Codex CLI's Luna Reserve routing for reserve usage |
207
+ | `codex-auto-review` | Official Codex CLI's Guardian automatic approval-review model |
208
+
209
+ A small authenticated smoke test also verified function-tool calling plus tool-result continuation for all three models, and executed a simple generated JavaScript function against four inputs per model. This is a basic functionality check, not a coding-quality benchmark.
210
+
211
+ **These are hidden models. Upstream support can stop at any time, and availability may differ by account. If a model stops responding, [open an issue](https://github.com/Eunho-J/codex-as-api/issues) with its model ID and a sanitized error; we will remove the discontinued model from this catalog.** Do not include access tokens or other credentials in the issue.
212
+
213
+ The proxy exposes these verified exceptions as selectable models and prefers their current live capability metadata. Bundled capability records keep only these three IDs available when a successful live catalog omits them; they do not bypass OAuth, upstream rejection, or a failed/malformed catalog fetch. A successful empty upstream catalog can therefore list these experimental entries, while health/default selection still fails until an ordinary upstream default is available. The proxy never selects a hidden experimental model as its automatic default.
198
214
 
199
215
  To use a different port:
200
216
 
@@ -323,7 +339,11 @@ curl -N http://localhost:18080/v1/messages \
323
339
  }'
324
340
  ```
325
341
 
326
- With `thinking.display: "summarized"` (the enabled/adaptive default), real Codex reasoning summaries are returned as unsigned Anthropic `thinking` blocks and streamed `thinking_delta` content, alongside the existing `codex_reasoning` / `codex_reasoning_delta` extensions. `display: "omitted"` and disabled thinking suppress reasoning output. No Anthropic signature is fabricated. Valid thinking blocks in replayed assistant history are checked and stripped before Codex input; ordinary text and tool calls are preserved.
342
+ With `thinking.display: "summarized"` (the enabled/adaptive default), real Codex reasoning summaries are returned as Anthropic `thinking` blocks and streamed `thinking_delta` content, alongside the existing `codex_reasoning` / `codex_reasoning_delta` extensions. When upstream supplies encrypted reasoning, each reasoning item has its own proxy-specific `signature`: `codex-reasoning-v1:` followed by base64url JSON containing the format version, actual backend model ID, and original reasoning item ID, encrypted content and summary. This is an opaque continuation envelope, not an Anthropic cryptographic signature.
343
+
344
+ On the following assistant-history request, recognized envelopes restore the original Responses reasoning items before that assistant turn's text/tool calls. Historical signed reasoning is accepted even when the current call uses `thinking: {"type":"disabled"}`, including compaction calls: current output-generation settings do not invalidate prior reasoning input. Ciphertext is preserved unchanged; summary text is never converted to ordinary assistant speech. Missing or foreign signatures retain the legacy ignored-thinking behavior, while malformed recognized envelopes return HTTP 400. Reasoning is retained for the same backend model and across the verified `gpt-6.1-sol` / `gpt-6-astra` / `gpt-6-sol` / `gpt-6-luna` / `gpt-daybreak-blue-latest` combinations (25 authenticated source/target pairs); other cross-model envelopes are discarded while ordinary history remains.
345
+
346
+ Multiple summary parts share one thinking block per reasoning item. Encrypted-only items use an empty thinking string with a non-empty signature. Streaming sends `signature_delta` before the matching `content_block_stop`. `display: "omitted"` hides the summary but can preserve an encrypted-only signed block for continuity; disabled thinking suppresses thinking output. Items without encrypted content retain unsigned-summary compatibility behavior.
327
347
 
328
348
  Hosted Anthropic `web_search` declarations are rejected with HTTP 400 on
329
349
  Messages, token-counting, and compact requests. OpenAI Responses cannot supply
@@ -580,7 +600,7 @@ unchanged. The proxy does not inherit speed defaults from Codex config.
580
600
 
581
601
  Official behavior reference: Codex [0.164.0 service-tier resolution](https://github.com/openai/codex/blob/rust-v0.164.0/codex-rs/tui/src/service_tier_resolution.rs)
582
602
  and [stable, enabled-by-default ultrafast feature](https://github.com/openai/codex/blob/rust-v0.164.0/codex-rs/features/src/lib.rs).
583
- The rest of the private HTTP contract remains pinned to 0.153.3.
603
+ The bundled private-protocol reference records the reviewed Codex source revision. Outbound client identity is separate: the proxy resolves the stable `latest` version of npm [`@openai/codex`](https://www.npmjs.com/package/@openai/codex) and uses that same version for the model-catalog `client_version` query and Codex User-Agent. It is not hardcoded to the bundled reference or inferred from a locally installed CLI. Successful version lookups are cached for one hour; a refresh failure retains the last successfully resolved version and retries after a short backoff. A cold lookup failure returns an explicit availability error rather than advertising an invented version.
584
604
 
585
605
  Authenticated tests on July 10, 2026 verified both official continuation paths with `gpt-5.6-sol`: a direct private Responses WebSocket completed a second delta request using the exact prior `response.id`, and the private HTTP endpoint completed the same continuation when the full prior input/output history was replayed. The proxy implements the HTTP replay strategy. Direct HTTP forwarding of `previous_response_id`, Pro, public cache controls, and `safety_identifier` was rejected and is not used. See OpenAI's [reasoning mode documentation](https://developers.openai.com/api/docs/guides/reasoning#reasoning-mode) and the Codex 0.153.3 [HTTP/WebSocket request structures](https://github.com/openai/codex/blob/b1a547b1f73ce86205d9222ac19cff334b3b7a2e/codex-rs/codex-api/src/common.rs#L275-L350).
586
606
 
@@ -158,9 +158,25 @@ model_auto_compact_token_limit = 244800
158
158
 
159
159
  ### Supported Models
160
160
 
161
- Models and capabilities come only from the authenticated Codex `/models` response. The proxy keeps each account/base-URL/client-version snapshot in memory for 300 seconds, invalidates it when a Responses `X-Models-Etag` changes, and never serves a static, stale, or cross-account fallback. An unavailable or malformed refresh returns `503 catalog_unavailable` before streaming headers are sent; an upstream HTTP rejection after the one allowed OAuth refresh preserves its status as `upstream_error`.
161
+ Ordinary models and capabilities come from the authenticated Codex `/models` response. The proxy keeps each account/base-URL/client-version snapshot in memory for 300 seconds and invalidates it when a Responses `X-Models-Etag` changes. An unavailable or malformed refresh returns `503 catalog_unavailable` before streaming headers are sent; an upstream HTTP rejection after the one allowed OAuth refresh preserves its status as `upstream_error`. Model snapshots are never shared across accounts or served as an offline fallback.
162
162
 
163
- Use `GET /v1/models` instead of relying on a documentation list. Every row in the fresh authenticated snapshot is returned, including its exact slug, visibility, `supported_in_api`, reasoning-summary controls, and opaque `comp_hash` compatibility identifier when supplied. A valid empty catalog returns `200` with `data: []`; health and model-default resolution then return `503 catalog_unavailable` rather than selecting a fallback. Requests must use an exact live slug; unknown explicit IDs return `404 model_not_found`.
163
+ Use `GET /v1/models` for the effective catalog. It includes exact slugs, visibility, `supported_in_api`, reasoning-summary controls, and opaque `comp_hash` compatibility identifiers when supplied. Unknown IDs return `404 model_not_found`. Automatic default selection uses only the upstream catalog's originally visible models, not the experimental additions below.
164
+
165
+ #### Experimental hidden models
166
+
167
+ These three upstream-hidden models returned real responses on October 24, 2026, and are explicitly included in codex-as-api's effective catalog:
168
+
169
+ | Model ID | Observed upstream purpose |
170
+ | --- | --- |
171
+ | `gpt-6-chat-thinking` | Server-described paid CCA experiment; hidden and marked unsupported in the upstream API catalog |
172
+ | `gpt-reserve` | Official Codex CLI's Luna Reserve routing for reserve usage |
173
+ | `codex-auto-review` | Official Codex CLI's Guardian automatic approval-review model |
174
+
175
+ A small authenticated smoke test also verified function-tool calling plus tool-result continuation for all three models, and executed a simple generated JavaScript function against four inputs per model. This is a basic functionality check, not a coding-quality benchmark.
176
+
177
+ **These are hidden models. Upstream support can stop at any time, and availability may differ by account. If a model stops responding, [open an issue](https://github.com/Eunho-J/codex-as-api/issues) with its model ID and a sanitized error; we will remove the discontinued model from this catalog.** Do not include access tokens or other credentials in the issue.
178
+
179
+ The proxy exposes these verified exceptions as selectable models and prefers their current live capability metadata. Bundled capability records keep only these three IDs available when a successful live catalog omits them; they do not bypass OAuth, upstream rejection, or a failed/malformed catalog fetch. A successful empty upstream catalog can therefore list these experimental entries, while health/default selection still fails until an ordinary upstream default is available. The proxy never selects a hidden experimental model as its automatic default.
164
180
 
165
181
  To use a different port:
166
182
 
@@ -289,7 +305,11 @@ curl -N http://localhost:18080/v1/messages \
289
305
  }'
290
306
  ```
291
307
 
292
- With `thinking.display: "summarized"` (the enabled/adaptive default), real Codex reasoning summaries are returned as unsigned Anthropic `thinking` blocks and streamed `thinking_delta` content, alongside the existing `codex_reasoning` / `codex_reasoning_delta` extensions. `display: "omitted"` and disabled thinking suppress reasoning output. No Anthropic signature is fabricated. Valid thinking blocks in replayed assistant history are checked and stripped before Codex input; ordinary text and tool calls are preserved.
308
+ With `thinking.display: "summarized"` (the enabled/adaptive default), real Codex reasoning summaries are returned as Anthropic `thinking` blocks and streamed `thinking_delta` content, alongside the existing `codex_reasoning` / `codex_reasoning_delta` extensions. When upstream supplies encrypted reasoning, each reasoning item has its own proxy-specific `signature`: `codex-reasoning-v1:` followed by base64url JSON containing the format version, actual backend model ID, and original reasoning item ID, encrypted content and summary. This is an opaque continuation envelope, not an Anthropic cryptographic signature.
309
+
310
+ On the following assistant-history request, recognized envelopes restore the original Responses reasoning items before that assistant turn's text/tool calls. Historical signed reasoning is accepted even when the current call uses `thinking: {"type":"disabled"}`, including compaction calls: current output-generation settings do not invalidate prior reasoning input. Ciphertext is preserved unchanged; summary text is never converted to ordinary assistant speech. Missing or foreign signatures retain the legacy ignored-thinking behavior, while malformed recognized envelopes return HTTP 400. Reasoning is retained for the same backend model and across the verified `gpt-6.1-sol` / `gpt-6-astra` / `gpt-6-sol` / `gpt-6-luna` / `gpt-daybreak-blue-latest` combinations (25 authenticated source/target pairs); other cross-model envelopes are discarded while ordinary history remains.
311
+
312
+ Multiple summary parts share one thinking block per reasoning item. Encrypted-only items use an empty thinking string with a non-empty signature. Streaming sends `signature_delta` before the matching `content_block_stop`. `display: "omitted"` hides the summary but can preserve an encrypted-only signed block for continuity; disabled thinking suppresses thinking output. Items without encrypted content retain unsigned-summary compatibility behavior.
293
313
 
294
314
  Hosted Anthropic `web_search` declarations are rejected with HTTP 400 on
295
315
  Messages, token-counting, and compact requests. OpenAI Responses cannot supply
@@ -546,7 +566,7 @@ unchanged. The proxy does not inherit speed defaults from Codex config.
546
566
 
547
567
  Official behavior reference: Codex [0.164.0 service-tier resolution](https://github.com/openai/codex/blob/rust-v0.164.0/codex-rs/tui/src/service_tier_resolution.rs)
548
568
  and [stable, enabled-by-default ultrafast feature](https://github.com/openai/codex/blob/rust-v0.164.0/codex-rs/features/src/lib.rs).
549
- The rest of the private HTTP contract remains pinned to 0.153.3.
569
+ The bundled private-protocol reference records the reviewed Codex source revision. Outbound client identity is separate: the proxy resolves the stable `latest` version of npm [`@openai/codex`](https://www.npmjs.com/package/@openai/codex) and uses that same version for the model-catalog `client_version` query and Codex User-Agent. It is not hardcoded to the bundled reference or inferred from a locally installed CLI. Successful version lookups are cached for one hour; a refresh failure retains the last successfully resolved version and retries after a short backoff. A cold lookup failure returns an explicit availability error rather than advertising an invented version.
550
570
 
551
571
  Authenticated tests on July 10, 2026 verified both official continuation paths with `gpt-5.6-sol`: a direct private Responses WebSocket completed a second delta request using the exact prior `response.id`, and the private HTTP endpoint completed the same continuation when the full prior input/output history was replayed. The proxy implements the HTTP replay strategy. Direct HTTP forwarding of `previous_response_id`, Pro, public cache controls, and `safety_identifier` was rejected and is not used. See OpenAI's [reasoning mode documentation](https://developers.openai.com/api/docs/guides/reasoning#reasoning-mode) and the Codex 0.153.3 [HTTP/WebSocket request structures](https://github.com/openai/codex/blob/b1a547b1f73ce86205d9222ac19cff334b3b7a2e/codex-rs/codex-api/src/common.rs#L275-L350).
552
572
 
@@ -1,5 +1,52 @@
1
1
  # Release Notes
2
2
 
3
+ ## v0.9.2
4
+
5
+ ### TypeScript version lookup deadline
6
+
7
+ - Keep the Codex version lookup timeout alive until the lookup settles, including
8
+ fetch implementations without active I/O handles. Clear the timer on completion.
9
+ - Fix Node 22 resolver timeout cancellation that blocked the v0.9.0 and v0.9.1
10
+ Release workflows. This release includes their reasoning and security updates.
11
+
12
+ ## v0.9.1
13
+
14
+ ### TypeScript dependency security updates
15
+
16
+ - Update Express to the 5.3 series and smol-toml to the 1.9.1 series.
17
+ - Refresh the lockfile to body-parser 2.4.0, proxy-addr 2.0.8 and qs 6.16.1,
18
+ addressing the reported request-parser, IP-trust and TOML-parser advisories.
19
+ - Keep Python, TypeScript and Rust package versions aligned. No API or reasoning
20
+ continuity behavior changes are included in this patch.
21
+
22
+ ## v0.9.0
23
+
24
+ ### Encrypted reasoning continuity
25
+
26
+ - Carry Codex reasoning items in a versioned proxy-specific `thinking.signature`
27
+ envelope and restore their opaque encrypted content on the following request.
28
+ The envelope is transport metadata, not a fabricated Anthropic signature.
29
+ - Preserve one thinking block per reasoning item, including multiple summary
30
+ parts and encrypted-only items. Streaming signatures precede their block stops;
31
+ signed reasoning history stays out of ordinary assistant text.
32
+ - Preserve reasoning across the verified GPT-6.1-Sol, GPT-6-Astra, GPT-6-Sol,
33
+ GPT-6-Luna and Daybreak Blue model combinations; authenticated replay passed
34
+ all 25 combinations. Daybreak availability remains account/authorization-gated.
35
+
36
+ ### Current client identity and experimental models
37
+
38
+ - Resolve outbound Codex client identity from npm `@openai/codex`'s stable latest
39
+ version instead of a hardcoded source-reference version. Use a consistent
40
+ version for model-catalog lookup and request headers, with bounded lookup,
41
+ in-memory caching and last-successful-version retry behavior.
42
+ - Explicitly include verified hidden models `gpt-6-chat-thinking`, `gpt-reserve`
43
+ and `codex-auto-review` in the effective catalog without choosing them as an
44
+ automatic default. Prefer current live capability metadata.
45
+ - Document their experimental status: upstream support may end at any time;
46
+ users should report a discontinued model in an issue so it can be removed.
47
+ Basic authenticated conversation, function-call continuation and generated-code
48
+ execution checks passed for all three.
49
+
3
50
  ## v0.8.3
4
51
 
5
52
  ### Client-neutral Anthropic compatibility (all runtimes)
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "upstream": {
3
3
  "repository": "openai/codex",
4
- "version": "0.153.3",
5
- "tag": "rust-v0.153.3",
6
- "commit": "b1a547b1f73ce86205d9222ac19cff334b3b7a2e"
4
+ "version": "0.164.0",
5
+ "tag": "rust-v0.164.0",
6
+ "commit": "6aaac694803004a63c6f393d153c96d22521a6b9"
7
7
  },
8
8
  "models_request": {
9
9
  "path": "/models",
@@ -0,0 +1,165 @@
1
+ {
2
+ "verified_at": "2026-10-23T21:33:21.486Z",
3
+ "warning": "Experimental hidden model; upstream support may stop at any time.",
4
+ "models": [
5
+ {
6
+ "slug": "gpt-6-chat-thinking",
7
+ "display_name": "GPT-6 Chat Thinking",
8
+ "description": "Experimental hidden model; upstream support may stop at any time.",
9
+ "priority": 2,
10
+ "visibility": "list",
11
+ "supported_in_api": true,
12
+ "default_reasoning_level": "medium",
13
+ "supported_reasoning_levels": [
14
+ {
15
+ "effort": "low",
16
+ "description": "Fast responses with lighter reasoning"
17
+ },
18
+ {
19
+ "effort": "medium",
20
+ "description": "Balances speed and reasoning depth for everyday tasks"
21
+ },
22
+ {
23
+ "effort": "high",
24
+ "description": "Greater reasoning depth for complex problems"
25
+ },
26
+ {
27
+ "effort": "xhigh",
28
+ "description": "Extra high reasoning depth for complex problems"
29
+ },
30
+ {
31
+ "effort": "max",
32
+ "description": "Maximum reasoning depth for the hardest problems"
33
+ }
34
+ ],
35
+ "multi_agent_reasoning_effort": null,
36
+ "supports_reasoning_summary_parameter": false,
37
+ "default_reasoning_summary": "none",
38
+ "comp_hash": "3000",
39
+ "context_window": 272000,
40
+ "max_context_window": 272000,
41
+ "auto_compact_token_limit": null,
42
+ "effective_context_window_percent": 95,
43
+ "input_modalities": [
44
+ "text",
45
+ "image"
46
+ ],
47
+ "service_tiers": [],
48
+ "default_service_tier": null,
49
+ "use_responses_lite": true,
50
+ "supports_image_detail_original": true,
51
+ "support_verbosity": false,
52
+ "default_verbosity": "medium"
53
+ },
54
+ {
55
+ "slug": "gpt-reserve",
56
+ "display_name": "GPT-Reserve",
57
+ "description": "Experimental hidden model; upstream support may stop at any time.",
58
+ "priority": 4,
59
+ "visibility": "list",
60
+ "supported_in_api": true,
61
+ "default_reasoning_level": "medium",
62
+ "supported_reasoning_levels": [
63
+ {
64
+ "effort": "low",
65
+ "description": "Fast responses with lighter reasoning"
66
+ },
67
+ {
68
+ "effort": "medium",
69
+ "description": "Balances speed and reasoning depth for everyday tasks"
70
+ },
71
+ {
72
+ "effort": "high",
73
+ "description": "Greater reasoning depth for complex problems"
74
+ },
75
+ {
76
+ "effort": "xhigh",
77
+ "description": "Extra high reasoning depth for complex problems"
78
+ },
79
+ {
80
+ "effort": "max",
81
+ "description": "Maximum reasoning depth for the hardest problems"
82
+ }
83
+ ],
84
+ "multi_agent_reasoning_effort": null,
85
+ "supports_reasoning_summary_parameter": true,
86
+ "default_reasoning_summary": "none",
87
+ "comp_hash": "3000",
88
+ "context_window": 272000,
89
+ "max_context_window": 872000,
90
+ "auto_compact_token_limit": null,
91
+ "effective_context_window_percent": 95,
92
+ "input_modalities": [
93
+ "text",
94
+ "image"
95
+ ],
96
+ "service_tiers": [
97
+ {
98
+ "id": "priority",
99
+ "name": "Fast",
100
+ "description": "1.5x speed, increased usage"
101
+ }
102
+ ],
103
+ "default_service_tier": null,
104
+ "use_responses_lite": true,
105
+ "supports_image_detail_original": true,
106
+ "support_verbosity": true,
107
+ "default_verbosity": "low"
108
+ },
109
+ {
110
+ "slug": "codex-auto-review",
111
+ "display_name": "Codex Auto Review",
112
+ "description": "Experimental hidden model; upstream support may stop at any time.",
113
+ "priority": 43,
114
+ "visibility": "list",
115
+ "supported_in_api": true,
116
+ "default_reasoning_level": "medium",
117
+ "supported_reasoning_levels": [
118
+ {
119
+ "effort": "low",
120
+ "description": "Fast responses with lighter reasoning"
121
+ },
122
+ {
123
+ "effort": "medium",
124
+ "description": "Balances speed and reasoning depth for everyday tasks"
125
+ },
126
+ {
127
+ "effort": "high",
128
+ "description": "Greater reasoning depth for complex problems"
129
+ },
130
+ {
131
+ "effort": "xhigh",
132
+ "description": "Extra high reasoning depth for complex problems"
133
+ },
134
+ {
135
+ "effort": "max",
136
+ "description": "Maximum reasoning depth for the hardest problems"
137
+ }
138
+ ],
139
+ "multi_agent_reasoning_effort": null,
140
+ "supports_reasoning_summary_parameter": true,
141
+ "default_reasoning_summary": "none",
142
+ "comp_hash": "3000",
143
+ "context_window": 272000,
144
+ "max_context_window": 872000,
145
+ "auto_compact_token_limit": null,
146
+ "effective_context_window_percent": 95,
147
+ "input_modalities": [
148
+ "text",
149
+ "image"
150
+ ],
151
+ "service_tiers": [
152
+ {
153
+ "id": "priority",
154
+ "name": "Fast",
155
+ "description": "1.5x speed, increased usage"
156
+ }
157
+ ],
158
+ "default_service_tier": null,
159
+ "use_responses_lite": true,
160
+ "supports_image_detail_original": true,
161
+ "support_verbosity": true,
162
+ "default_verbosity": "low"
163
+ }
164
+ ]
165
+ }
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "codex-as-api"
7
- version = "0.8.3"
7
+ version = "0.9.2"
8
8
  description = "Use ChatGPT/Codex OAuth as a local OpenAI-compatible API server."
9
9
  readme = "README.md"
10
10
  license = { text = "Apache-2.0" }
@@ -47,12 +47,14 @@ packages = ["src/codex_as_api"]
47
47
 
48
48
  [tool.hatch.build.targets.wheel.force-include]
49
49
  "config/codex-upstream-contract.json" = "codex_as_api/codex-upstream-contract.json"
50
+ "config/verified-hidden-models.json" = "codex_as_api/verified-hidden-models.json"
50
51
  "config/o200k_base.tiktoken" = "codex_as_api/o200k_base.tiktoken"
51
52
  "THIRD_PARTY_NOTICES.md" = "codex_as_api/THIRD_PARTY_NOTICES.md"
52
53
 
53
54
  [tool.hatch.build.targets.sdist]
54
55
  include = [
55
56
  "/config/codex-upstream-contract.json",
57
+ "/config/verified-hidden-models.json",
56
58
  "/config/o200k_base.tiktoken",
57
59
  "/src/codex_as_api",
58
60
  "/scripts",