Skip to content

Commit a3d8c56

Browse files
committed
docs(runtime): update compatibility contracts
1 parent 6ee8498 commit a3d8c56

4 files changed

Lines changed: 352 additions & 1 deletion

File tree

docs-site/src/content/docs/reference/runtime-routes.mdx

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,9 +356,34 @@ These routes live under `/backend-api` or legacy usage paths. They are still Poo
356356
<td>Supported</td>
357357
<td>Backend usage alias.</td>
358358
</tr>
359+
<tr>
360+
<td><code>POST /api/codex/rate-limit-reset-credits/consume</code></td>
361+
<td><code>/api/codex/rate-limit-reset-credits/consume</code></td>
362+
<td>No</td>
363+
<td>Supported</td>
364+
<td>Backend HTTP reset-credit consume route. It accepts a JSON object with <code>redeem_request_id</code>, forwards only that field, strips inbound <code>idempotency-key</code>, and records metadata under <code>/api/codex/usage</code>.</td>
365+
</tr>
366+
<tr>
367+
<td><code>POST /wham/rate-limit-reset-credits/consume</code></td>
368+
<td><code>/wham/rate-limit-reset-credits/consume</code></td>
369+
<td>No</td>
370+
<td>Supported</td>
371+
<td>Backend HTTP reset-credit consume route. It records metadata under <code>/wham/usage</code>.</td>
372+
</tr>
373+
<tr>
374+
<td><code>POST /backend-api/wham/rate-limit-reset-credits/consume</code></td>
375+
<td><code>/wham/rate-limit-reset-credits/consume</code></td>
376+
<td>No</td>
377+
<td>Supported</td>
378+
<td>Backend HTTP reset-credit consume route. It records metadata under <code>/backend-api/wham/usage</code>.</td>
379+
</tr>
359380
</tbody>
360381
</table>
361382

383+
The app-server JSON-RPC reset-credit method
384+
`account/rateLimitResetCredit/consume` remains unsupported. Codex Pooler does
385+
not add a wildcard backend app-server proxy for reset-credit methods.
386+
362387
## OpenAI-compatible `/v1` routes
363388

364389
Use `/v1` only for clients that require an OpenAI-shaped base URL:
@@ -474,6 +499,18 @@ Supported work is translated into Codex-compatible requests and then routed thro
474499
</tbody>
475500
</table>
476501

502+
`POST /v1/responses` accepts `reasoning.context` only for `auto`,
503+
`current_turn`, and `all_turns` after trimming and lowercasing. Unknown, empty,
504+
or non-string context values fail before dispatch with
505+
`param: "reasoning.context"`.
506+
507+
Non-strict function tool schemas are lowered before local validation and
508+
upstream dispatch for backend Responses HTTP, backend Responses websocket
509+
`response.create`, and public `/v1/responses` compatibility paths. Lowering is
510+
limited to function tools, including nested function tools inside accepted
511+
namespace tools. Strict function tools and strict structured-output schemas stay
512+
on the strict validation path and are not made looser.
513+
477514
### Routed but unsupported `/v1` endpoints
478515

479516
These routes are deliberately present so clients receive deterministic OpenAI-shaped unsupported endpoint errors before gateway admission or upstream dispatch.
@@ -598,6 +635,14 @@ Prompt-cache routing locality is a local routing hint. It can apply on `POST /ba
598635

599636
Request compression is a per-Pool routing option named `request_compression_enabled`. It is disabled by default. When enabled, Codex Pooler may compress upstream-bound Responses tool-output content before dispatch. This is request-side only: raw outputs and upstream response bodies are not stored, and CCR/retrieval is not implemented.
600637

638+
Supported input shapes are explicit. Search-result compression accepts classic
639+
`path:line[:column]: text`, grouped heading output when a path-like heading has
640+
enough line matches below it, and portable NUL-delimited output shaped as
641+
`path\0line[:column]: text`. Diff compression requires a hunk header and accepts
642+
additions-only, deletions-only, replacement, and minimal unified hunks without a
643+
leading `diff --git` header. Malformed NUL fragments, prose headings, and
644+
ordinary prose with plus/minus lines stay text/skip.
645+
601646
Eligible route families are exact:
602647

603648
<table>

test/codex_pooler_web/controllers/runtime/compatibility_contract_test.exs

Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ defmodule CodexPoolerWeb.Runtime.CompatibilityContractTest do
2727
backend_v1_alias_surface
2828
websocket_continuity
2929
reasoning_minimal
30+
reasoning_context
3031
unsupported_upstream_fields
3132
firewall
3233
decompression
@@ -37,6 +38,8 @@ defmodule CodexPoolerWeb.Runtime.CompatibilityContractTest do
3738
first_event_stream_retry
3839
request_compression
3940
control_plane_surface
41+
backend_reset_credit_consume
42+
function_tool_schema_lowering
4043
backend_alpha_search
4144
v1_supported_surface
4245
v1_unsupported_public_surface
@@ -171,6 +174,102 @@ defmodule CodexPoolerWeb.Runtime.CompatibilityContractTest do
171174
"strips backend-only upstream-unsupported controls"
172175
end
173176

177+
test "documents OpenAI reasoning context literal support" do
178+
feature = CompatibilityMatrix.by_slug!(:reasoning_context)
179+
fixture = CompatibilityMatrix.fixture!(:reasoning_context)
180+
181+
assert feature.status == :supported
182+
assert feature.current == :openai_sdk_literal_normalization
183+
assert feature.routes == [%{method: :post, path: "/v1/responses"}]
184+
assert feature.contract =~ "reasoning.context"
185+
assert feature.contract =~ "auto"
186+
assert feature.contract =~ "current_turn"
187+
assert feature.contract =~ "all_turns"
188+
assert feature.contract =~ "trimming and lowercasing"
189+
assert feature.contract =~ "rejects unknown or non-string"
190+
191+
assert fixture.accepted_values == ["auto", "current_turn", "all_turns"]
192+
assert fixture.normalization == "trim_and_lowercase"
193+
194+
assert fixture.rejected_values == [
195+
"unknown_strings",
196+
"empty_strings",
197+
"non_strings",
198+
"arrays",
199+
"maps"
200+
]
201+
202+
assert fixture.routes == ["/v1/responses"]
203+
end
204+
205+
test "documents non-strict function tool schema lowering scope" do
206+
feature = CompatibilityMatrix.by_slug!(:function_tool_schema_lowering)
207+
fixture = CompatibilityMatrix.fixture!(:function_tool_schema_lowering)
208+
209+
assert feature.status == :supported
210+
assert feature.current == :non_strict_function_tool_schema_lowering
211+
assert :streaming in feature.categories
212+
assert feature.contract =~ "non-strict function tool schemas"
213+
assert feature.contract =~ "before local validation"
214+
assert feature.contract =~ "nested namespace function tools"
215+
assert feature.contract =~ "never weakens strict function tools"
216+
assert feature.contract =~ "strict structured-output schemas"
217+
refute feature.contract =~ "hosted tools"
218+
219+
assert fixture.lowered_tool_types == [
220+
"flat_function",
221+
"nested_function",
222+
"namespace_nested_function"
223+
]
224+
225+
assert fixture.strict_function_tools_lowered == false
226+
assert fixture.strict_structured_outputs_lowered == false
227+
assert "$schema" in fixture.unsupported_json_schema_keywords_dropped
228+
assert "$ref" in fixture.supported_schema_keywords_preserved
229+
assert "const_to_single_value_enum" in fixture.schema_repairs
230+
231+
assert fixture.routes == [
232+
"/backend-api/codex/responses",
233+
"/backend-api/codex/v1/responses",
234+
"/backend-api/codex/responses websocket",
235+
"/backend-api/codex/v1/responses websocket",
236+
"/v1/responses",
237+
"/v1/responses websocket"
238+
]
239+
end
240+
241+
test "documents request compression search and diff input shapes" do
242+
feature = CompatibilityMatrix.by_slug!(:request_compression)
243+
fixture = CompatibilityMatrix.fixture!(:request_compression)
244+
245+
assert feature.status == :supported
246+
assert feature.contract =~ "grouped heading matches"
247+
assert feature.contract =~ "portable NUL-delimited matches"
248+
assert feature.contract =~ "additions-only"
249+
assert feature.contract =~ "deletions-only"
250+
assert feature.contract =~ "minimal unified diffs"
251+
assert feature.contract =~ "ordinary prose"
252+
253+
assert fixture.supported_input_shapes == %{
254+
search_results: [
255+
"classic_path_line",
256+
"grouped_heading",
257+
"portable_nul_delimited"
258+
],
259+
diffs: [
260+
"hunk_additions_only",
261+
"hunk_deletions_only",
262+
"hunk_replacement",
263+
"minimal_unified_hunk"
264+
],
265+
false_positive_guards: [
266+
"path_like_group_heading",
267+
"minimum_grouped_matches",
268+
"hunk_header_required"
269+
]
270+
}
271+
end
272+
174273
test "documents narrow chat input fallback and non-executable additional_tools" do
175274
responses_chat = CompatibilityMatrix.by_slug!(:responses_chat)
176275
responses_fixture = CompatibilityMatrix.fixture!(:responses_chat)
@@ -593,6 +692,72 @@ defmodule CodexPoolerWeb.Runtime.CompatibilityContractTest do
593692
end
594693
end
595694

695+
test "exposes only the backend HTTP reset-credit consume routes" do
696+
route_set =
697+
CodexPoolerWeb.Router
698+
|> Phoenix.Router.routes()
699+
|> Enum.map(&{router_method(&1.verb), &1.path})
700+
|> MapSet.new()
701+
702+
feature = CompatibilityMatrix.by_slug!(:backend_reset_credit_consume)
703+
fixture = CompatibilityMatrix.fixture!(:backend_reset_credit_consume)
704+
705+
expected_routes = [
706+
{:post, "/api/codex/rate-limit-reset-credits/consume"},
707+
{:post, "/wham/rate-limit-reset-credits/consume"},
708+
{:post, "/backend-api/wham/rate-limit-reset-credits/consume"}
709+
]
710+
711+
for route <- expected_routes do
712+
assert MapSet.member?(route_set, route)
713+
end
714+
715+
assert Enum.map(feature.routes, &{&1.method, &1.path}) == expected_routes
716+
assert feature.current == :explicit_authenticated_backend_http_proxy_routes
717+
assert feature.contract =~ "explicit authenticated backend HTTP routes"
718+
assert feature.contract =~ "redeem_request_id"
719+
assert feature.contract =~ "idempotency-key"
720+
assert feature.contract =~ "rate_limit_reset_credit_consume"
721+
assert feature.contract =~ "matching usage accounting endpoint"
722+
723+
assert feature.contract =~
724+
"app-server account/rateLimitResetCredit/consume JSON-RPC unsupported"
725+
726+
assert fixture.auth == "required_bearer_api_key"
727+
assert fixture.route_class == "proxy_http"
728+
assert fixture.operation == "rate_limit_reset_credit_consume"
729+
assert fixture.body_fields_forwarded == ["redeem_request_id"]
730+
assert fixture.stripped_headers == ["idempotency-key"]
731+
assert fixture.privacy == "metadata_only"
732+
733+
assert fixture.routes == [
734+
%{
735+
local_path: "/api/codex/rate-limit-reset-credits/consume",
736+
upstream_path: "/api/codex/rate-limit-reset-credits/consume",
737+
accounting_endpoint: "/api/codex/usage"
738+
},
739+
%{
740+
local_path: "/wham/rate-limit-reset-credits/consume",
741+
upstream_path: "/wham/rate-limit-reset-credits/consume",
742+
accounting_endpoint: "/wham/usage"
743+
},
744+
%{
745+
local_path: "/backend-api/wham/rate-limit-reset-credits/consume",
746+
upstream_path: "/wham/rate-limit-reset-credits/consume",
747+
accounting_endpoint: "/backend-api/wham/usage"
748+
}
749+
]
750+
751+
assert fixture.unsupported_app_server_json_rpc_methods == [
752+
"account/rateLimitResetCredit/consume"
753+
]
754+
755+
refute MapSet.member?(
756+
route_set,
757+
{:post, "/backend-api/codex/account/rateLimitResetCredit/consume"}
758+
)
759+
end
760+
596761
test "documents unsupported v1 public surface with exact OpenAI-shaped error contract" do
597762
feature = CompatibilityMatrix.by_slug!(:v1_unsupported_public_surface)
598763
fixture = CompatibilityMatrix.fixture!(:v1_unsupported_public_surface)

0 commit comments

Comments
 (0)