Files
ironclaw/docs/internal
Illia Polosukhin 95dcf807e0 fix(gateway): serve Responses API under /api/v1/ prefix (#2201) (#2748)
* fix(gateway): serve Responses API under /api/v1/ prefix (#2201)

The OpenAI Responses API was only reachable at `/v1/responses`, which
broke the otherwise consistent `/api/...` prefix used by every other
IronClaw HTTP surface. Callers expecting `/api/v1/responses` got a 404.

This routes both paths through the same handlers:

- `/api/v1/responses` + `/api/v1/responses/{id}` — canonical paths
- `/v1/responses` + `/v1/responses/{id}` — retained as backward-compat
  aliases for clients already configured against the legacy path

Also updates the web gateway CLAUDE.md route table, the
USER_MANAGEMENT_API.md reference, and the module docstring for
responses_api.rs so documentation points at the canonical prefix.

Regression test: tests/responses_api_path_prefix.rs drives the full
router via `start_server` and asserts that POST/GET on both the
canonical and legacy paths reach the handler (400 from the handler
for bad inputs, not 404 from the router) and that both paths enforce
bearer auth (401 without a token). This follows the "Test Through the
Caller, Not Just the Helper" rule so a future router edit that drops
either path fails the test rather than silently regressing.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(gateway): address PR #2748 review feedback

- Extend both_paths_require_auth to cover GET /responses/{id} on both
  canonical and legacy paths.
- Align USER_MANAGEMENT_API.md Responses API examples with the current
  handler behavior (only "default" model accepted).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs: address PR #2748 reviewer nits

- Change the "Go ahead with the transfer" Responses API request example
  to use "model": "default". The handler rejects any other value, so
  copying the old example verbatim would 400.
- Expand the Error Format section to document that the Responses API
  returns an OpenAI-compatible JSON envelope ({"error": {...}}) rather
  than the plain-text body used by every other endpoint. Add 429 to the
  status-code table for Responses API rate limiting.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: address PR #2748 Copilot review nits on docs + test cleanup

- Correct the documented Responses API 429 error type from
  `rate_limit_exceeded` to `rate_limit_error` to match what
  `create_response_handler` actually emits.
- Clarify that the JSON error envelope covers handler-generated
  errors; missing/invalid bearer token (401) and auth-path 503
  are returned by the shared gateway auth middleware as plain text.
- Add a `ServerGuard` RAII helper in the Responses API path-prefix
  integration test that takes `state.shutdown_tx` on startup and
  sends `()` on drop, so each test tears its `axum::serve` task
  down instead of leaking it for the rest of the process. Update
  the six test callers to bind the guard.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 19:00:19 +09:00
..