Skip to content

[Rust Frontend] Add the stateless Responses API (streaming and non-streaming) - #63902

Merged
BugenZhao merged 11 commits into
vllm-project:mainfrom
franciscojavierarceo:codex/responses-nonstreaming
Nov 3, 2026
Merged

BugenZhao merged 11 commits into
vllm-project:mainfrom
franciscojavierarceo:codex/responses-nonstreaming

Conversation

@franciscojavierarceo

@franciscojavierarceo franciscojavierarceo commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

Overview

Add the stateless Responses API (POST /v1/responses, streaming and non-streaming) to the Rust frontend on top of the existing ChatLlm pipeline.

The original stack split this endpoint into non-streaming (2/3, this PR) followed by streaming (#63903). The Rust frontend is streaming-first: ChatEventStream is the primary interface, and non-streaming Chat Completions is a fold over it. As agreed with @franciscojavierarceo, this PR now carries both layers in that order: streaming first, then non-streaming as a fold over the same state machine. It supersedes #63903. Layer 1/3 (#63901) has merged.

Commits

Each commit builds and passes its tests on its own.

  1. da7eeffe37 (@franciscojavierarceo) — stateless streaming Responses: request lowering into ChatRequest, OutputItemStreamer for the item lifecycle, store-dependent features rejected or 404. Squashes the streaming-first part of the original stack (listed in the commit message); non-streaming returns 400 at this point.
  2. 7e41889ed4 — typed wire DTOs and stream events: tools and tool choice reuse the Chat Completions definitions, input items deserialize into typed items (a message item may omit type, like Python), and SSE events are a typed enum with type and sequence_number added by a wrapper.
  3. 2ea078d012 — defer to shared layers: the response echoes the sampling values the engine actually uses (model defaults applied, max_output_tokens clamped to the context), like Python's ResponsesResponse.from_request(sampling_params), via ChatEventStream::sampling().
  4. 1c1bbe1fe5 — the streamer is the only source of output; output indices and the deferred output_item.done derive from completed items.
  5. 10448da198 (co-authored by @franciscojavierarceo) — non-streaming as a fold: drive the same OutputItemStreamer, discard its events, and return the terminal response. The Responses terminal event carries the complete response, so output follows one set of item rules in both modes. Errors still map to HTTP statuses (engine errors 400/503, a broken stream 500) instead of a failed response.
  6. 8fbae250f3 — per-request timing metrics, as in Python Responses.
  7. 4da559a6db — a truncated reasoning item is also marked incomplete, as in Python.
  8. f28f024629 — remaining vLLM request controls: forward min_p; reject spaces_between_special_tokens: false, media_io_kwargs, mm_processor_kwargs, and enable_response_messages: true instead of dropping them.
  9. a1d8bd8364 — unset response fields serialize as null, as in Python.
  10. 99446a2d75 — report usage.input_tokens_details.cache_write_tokens, as Python has since [Bugfix][Responses API] Complete cache-write token accounting #60973; the OpenAI SDK Response type requires it. Found by the e2e below.

The CI bot merged main into the branch as be0cafa775 before commit 10.

Behavior

  • Stateless: clients replay the full history in input. store: true executes without storing (Python's implicit downgrade); background: true is 400; previous_response_id, retrieval, and cancellation are 404.
  • max_tool_calls limits built-in tool calls only, so with function tools alone it is accepted and echoed.
  • reasoning.summary, text.verbosity, include: ["reasoning.encrypted_content"], and service_tier are accepted compatibility inputs (Codex sends them by default) without producing summaries, applying verbosity, encrypting reasoning, or scheduling guarantees.
  • Deliberate difference from Python: a generation failure during streaming ends with response.failed carrying the partial output, instead of a generic error frame.
  • Not supported: built-in, custom, and namespace tools, allowed_tools, and output logprobs (rejected with 400).

Validation

Rebased onto eb239e34c2.

  • Every commit: cargo fmt --check, cargo clippy --workspace --all-targets --all-features, and the server Responses tests pass (45 → 52 tests across the stack).
  • Tip: cargo test --workspace has 2483 passed; the same 27 tests also fail on main in this environment (grammar replay fixtures and two environment-dependent tests).
  • Route tests cover streaming event order, non-streaming fold, truncation (incomplete on the last item only), engine errors mapped to 400/503, 404s for stored-response features, and typed-client (async-openai) streaming.
  • cache_write_tokens: a route assertion fails without the fix and passes with it.

E2E on GB200 at a1d8bd8364 (before commit 10), Qwen/Qwen3.5-27B-FP8 on one GPU, 64k context, --language-model-only, qwen3 reasoning and qwen3_coder tool parsers, Python engine from the matching main wheel:

  • 12/12 HTTP probes directly against the Rust frontend, validating every SSE event and terminal response against the openai 3.42.1 types: JSON and streaming completion; echoed temperature/top_p equal the model's generation config when unset; a token limit marks the response and its last item incomplete; every streamed output_item.done equals the terminal output with matching IDs and contiguous sequence_numbers; function call and function_call_output replay in both modes; 404 for retrieval and previous_response_id. The only schema gap was the missing cache_write_tokens, fixed in commit 10.
  • At temperature 0, /v1/responses and /v1/chat/completions produce identical prompt token counts, reasoning, and text for the same message.
  • Real Codex CLI 0.163.0, Responses transport, function-only tool catalog, no agentic-api in between: 2/2 runs executed cat nonce.txt and replied with the exact nonce, ending in turn.completed. Each second request replayed two leading developer messages, the user turn, a plaintext reasoning item, the function_call, and its function_call_output; all requests returned 200 with response.completed.

This PR is 17 files, +4478 / -33; route tests are about 1.2k of that.

Original description (@franciscojavierarceo)

Overview

add stateless, non-streaming POST /v1/responses through the existing vllm-chat pipeline, with input replay, function tools, reasoning, and usage.

review order: 1/3: renderer #63901 → 2/3: non-streaming #63902 → 3/3: streaming #63903. all three upstream review PRs target main; later diffs include earlier layers.

this PR includes and depends on #63901. the fork layer shows its isolated diff.

Claims

  • lower Responses input and function-call/result replay through the shared chat path, reusing compatible chat/audio/tool primitives.
  • validate request controls and preserve model-resolved sampling defaults.
  • use the current frontend's typed engine failures and numeric HTTP errors, with real route coverage for 400/503 failures and unknown-response 404s.
  • reject stream: true with HTTP 400 on param: stream until layer 3.

Validation

Latest upstream synchronization — October 28

current head: d5b7df30aa; rebased onto upstream f4fd1ab68e. the fork keeps its native stacked bases; upstream PRs still target main.

  • resolved the shared error-handler overlap with upstream's missing-LoRA 404 change. both NotFound and ResponseNotFound retain their existing wire envelopes; the LoRA/gRPC and Responses HTTP regressions pass.
  • cargo test --locked -p vllm-server -p vllm-text --lib -- --test-threads=1: 579 server + 121 text passed, one existing text test ignored.
  • strict Clippy for server/chat/text/CLI, applicable pre-commit hooks, and git diff --check: passed. cargo nextest remains unavailable.
  • range-diff shows only the error-handler conflict adaptation; all other feature/fix patches are unchanged. all branch tips passed merge-tree checks against f4fd1ab68e.
  • the old umbrella [Rust Frontend] Add OpenAI Responses API endpoint #58783 was synchronized without rewriting its original history. its source tree equals the tested complete stack and it stays draft.

the model-backed HTTP/Codex evidence below predates this synchronization (complete-stack head 3db4c9abf0); it was not repeated after this rebase. today's evidence covers compilation and deterministic wire/route/renderer regressions, not new model qualification. CI reruns on these new heads are separate from the earlier successful workflows. agentic-api was not changed or pushed.

Earlier review and runtime evidence

reviewed and revised on October 27; non-streaming head: 91a782aa08.

  • a regression first reproduced the bug: token-limited responses had overall incomplete status but a final message item marked completed.
  • this layer's cargo test --locked -p vllm-server -p vllm-text --lib -- --test-threads=1: 552 server + 118 text passed, one existing text test ignored.
  • added a route regression for reasoning followed by a truncated function call: earlier output stays completed; only the final message/function item becomes incomplete.
  • strict Clippy, applicable pre-commit hooks, formatting, and git diff --check: passed.
  • all three tips merge cleanly with upstream f8f7634cb4; the fork's isolated stack bases are preserved.

commands ran from rust/ with OPENSSL_DIR pointing to the local OpenSSL build. cargo nextest was unavailable. full-stack tests ran serially because of the previously reproduced shared chat audio-metrics collector collision.

fresh model-backed HTTP and real Codex checks passed on the revised complete stack, as recorded in #63903. this intermediate branch was tested separately with the in-process HTTP route harness; it does not contain streaming.

Details

Responses owns its wire envelopes and conversions while reusing the chat generation path and matching shared audio/tool primitives. the rebase preserves upstream's other route registrations and error serialization rather than restoring the older envelope.

  • omitted or null stream selects non-streaming. omitted/null watermarking and explicit overrides follow current Chat Completions semantics.
  • metadata is a string map limited to 16 pairs, 64-character keys, and 512-character values.
  • omitted temperature/top-p use model defaults; explicit overrides are preserved and checked against the engine request.
  • unknown service tiers, invalid summary/verbosity values, unsupported include outputs, and nonzero top_logprobs are rejected.
  • unknown previous_response_id uses the current shared NotFoundError envelope: HTTP 404, param: response_id, numeric code: 404.

the frontend remains stateless: clients replay history, and agentic-api owns persistence and tool execution. the shared native adapter tracked by vllm-project/agentic-api#359 and vllm-project/agentic-api#382 is still unfinished. accepted reasoning-summary, text-verbosity, and encrypted-reasoning inputs are documented compatibility no-ops; valid service tiers are echoed without scheduling guarantees. persistence, retrieval/cancellation, built-in/custom/namespace tool execution, Harmony rendering, output logprobs, and allowed_tools are out of scope. the rendered Responses documentation describes the supported subset.

these are the existing #58783 layers opened upstream at @BugenZhao's request, rather than competing implementations. the original authored history and discussion remain in #58783. @gcanlin's #53380 implementation is credited in the endpoint and streaming commits. #56124 covers render endpoints and #51535 covers chat allowed_tools; neither duplicates this endpoint.

this layer is 13 files, +2987 / -1 relative to #63901. tests stay under the test-only route module. agentic-api compatibility follow-ups remain local and unpushed. Codex assistance was used; human review of every changed line and independent validation are required before merge.


Pull Request Checklist
  • I used vLLM's /pr-checklist skill. (Mandatory for agents, optional for humans).

  • AI assistance was used during the creation of this PR.

  • Design Fit: Minimizes impact on core components, reuses existing functionality, and justifies added complexity.

  • Testing and Validation: Validates the change and ensures any added tests are meaningful and reliable, with CI coverage or documented CI resource constraints and validation performed outside CI.

  • Code Quality and Style: Keeps code and comments clear and concise, and updates relevant documentation and examples.

  • Pull Request Contents: Includes a brief summary and relevant links, supports claims with evidence, explains root causes and implementation trade-offs, and follows the contributing guide.

BEFORE SUBMITTING, PLEASE READ https://docs.vllm.ai/en/latest/contributing (anything written below this line will be removed by GitHub Actions)

@mergify

mergify Bot commented Oct 27, 2026

Copy link
Copy Markdown
Contributor

This pull request has merge conflicts that must be resolved before it can be
merged. Please rebase the PR, @franciscojavierarceo.

https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork

@mergify

mergify Bot commented Oct 27, 2026

Copy link
Copy Markdown
Contributor

Documentation preview: https://vllm--63902.org.readthedocs.build/en/63902/

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Claude Code Review

This pull request is from a fork — automated review is disabled. A repository maintainer can comment @claude review to run a one-time review.

@franciscojavierarceo
franciscojavierarceo force-pushed the codex/responses-nonstreaming branch from 91a782a to 5bc7b88 Compare October 27, 2026 15:24
@mergify

mergify Bot commented Oct 28, 2026

Copy link
Copy Markdown
Contributor

This pull request has merge conflicts that must be resolved before it can be
merged. Please rebase the PR, @franciscojavierarceo.

https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork

@mergify mergify Bot added the needs-rebase label Oct 28, 2026
@franciscojavierarceo
franciscojavierarceo force-pushed the codex/responses-nonstreaming branch from 5bc7b88 to d5b7df3 Compare October 28, 2026 10:32
@mergify mergify Bot removed the needs-rebase label Oct 28, 2026
@BugenZhao

Copy link
Copy Markdown
Member

Thanks, @franciscojavierarceo! I think the overall shape looks good. However, I’d prefer to support streaming first and then implement non-streaming on top of it. In the Rust frontend, all the interfaces have been streaming-first from the start. We’d rather treat non-streaming as a degenerate case of streaming instead of having the two follow different paths.

Would you mind if I merged PR 3 into this one so I can rework non-streaming to use the streaming path, rather than the other way around?

@franciscojavierarceo

Copy link
Copy Markdown
Contributor Author

Thanks, @franciscojavierarceo! I think the overall shape looks good. However, I’d prefer to support streaming first and then implement non-streaming on top of it. In the Rust frontend, all the interfaces have been streaming-first from the start. We’d rather treat non-streaming as a degenerate case of streaming instead of having the two follow different paths.

Would you mind if I merged PR 3 into this one so I can rework non-streaming to use the streaming path, rather than the other way around?

yeah sgtm

@mergify

mergify Bot commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

This pull request has merge conflicts that must be resolved before it can be
merged. Please rebase the PR, @franciscojavierarceo.

https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork

@mergify mergify Bot added the needs-rebase label Nov 2, 2026
franciscojavierarceo and others added 4 commits November 3, 2026 08:29
Add `POST /v1/responses` on top of `ChatLlm::chat`: requests lower into
a chat request, and `OutputItemStreamer` turns the chat event stream into
Responses output items and SSE lifecycle events. Store-dependent features
are rejected or return 404. Non-streaming requests are rejected for now.

This squashes the streaming-first part of the original stack:

- 9e714a4 [Rust Frontend] Add stateless non-streaming Responses API
- f785541 fix: validate Responses controls and report model sampling defaults
- 881a178 fix: adapt Responses to current Rust frontend contracts
- ef5a082 fix: mark truncated Responses output items incomplete
- 5bc7b88 fix: adapt Responses decoding and cache usage to upstream
- 6698c5b [Rust Frontend] Add Responses streaming lifecycle
- 062c680 test: cover Responses partial output after stream decode failure
- cf47141 fix: adapt Responses streaming to current chat events
- a2adabf fix: preserve final output item status in Responses streams

Its non-streaming path returns in a later commit. Route tests that do not
depend on the response mode now run through streaming.

Co-authored-by: Canlin Guo <canlinguosdu@gmail.com>
Co-authored-by: Codex <noreply@openai.com>
Signed-off-by: Francisco Javier Arceo <4163062+franciscojavierarceo@users.noreply.github.com>
Signed-off-by: Bugen Zhao <i@bugenzhao.com>
Replace raw JSON probing in the Responses route with typed DTOs that
reuse the chat-completions definitions:

- Tools are `ResponsesTool::Function(Function)`, the chat-completions
  `Function` flattened next to `type`, lowered through a shared
  `Function -> ChatTool` conversion.
- `tool_choice` reuses `ToolChoiceValue`, `FunctionChoice`, and
  `ToolReference`.
- Input items deserialize into typed items; a message item may omit
  `type`, mirroring Python's `input_item_parsing`. Errors keep the item
  index.
- `truncation`, `service_tier`, `reasoning.summary`, and
  `text.verbosity` are serde enums instead of string allow-lists.

Stream events become a typed enum serialized directly into SSE data,
with `type` and `sequence_number` added by a wrapper. Lifecycle events
share the response through `Arc` instead of converting it to `Value`.
`function_call_arguments` events no longer carry a `content_index`,
matching the SDK event shape.

Unknown tool, tool-choice, and input-item types now fail
deserialization, so errors name the JSON path instead of a `param`.
The unread `store` field is dropped; `store=true` still executes.

Add an async-openai typed-client test for streaming Responses.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Bugen Zhao <i@bugenzhao.com>
Remove logic the Responses route duplicated from lower layers:

- Echo `temperature`, `top_p`, `max_output_tokens`, and the
  presence/frequency penalties from the sampling values sent to the
  engine, as Python does. `ChatEventStream::sampling()` exposes them,
  read from the prepared generate request in `ChatLlm::chat`, instead
  of the handler pre-filling model defaults and repeating vllm-text's
  precedence. The echoed output limit is the context-clamped one, and
  an omitted limit or penalty no longer disappears from the response.
  The `TextRequestProcessor::sampling_hints()` accessor goes away.
- Drop the `enable_thinking` template kwarg injection. The HF renderer
  already derives it from `reasoning_effort`, and native renderers
  resolve reasoning controls through `ReasoningControl`.
- Revert `#[serde(default)]` on `vllm_parser::Tool.parameters`. Wire
  tools now deserialize into the server `Function` DTO, which owns that
  default.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Bugen Zhao <i@bugenzhao.com>
The terminal streaming response rebuilt its output from the final chat
message with fresh IDs and patched the streamed IDs back by item kind and
order, while failed streams used the streamer's completed items instead.

Make the streamer's completed items the only source of `output`, and
drop the rebuild and the ID reconciliation. This also drops an empty
reasoning block from the final output, which streaming never emitted as
an item.

Derive the next output index and the deferred `output_item.done` from
the completed items instead of keeping copies of them, and drop a
function-call field that was written but never read.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Bugen Zhao <i@bugenzhao.com>
BugenZhao and others added 3 commits November 3, 2026 08:29
When generation hits the output limit, the last output item is the
truncated one. Message and function-call items were marked
`incomplete`, but a reasoning item kept `completed`, so a request that
ran out of tokens while reasoning returned an incomplete response whose
only item claimed to be complete. Python passes the same `incomplete`
status to reasoning items.

Extend the length-limit test to two tool calls so it also checks that
only the last one is marked, and cover reasoning-only truncation in
both modes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CJckCDvqfKYQRRwCYtsCmk
Signed-off-by: Bugen Zhao <i@bugenzhao.com>
The Responses request type lacked several vLLM controls that Python
declares, so serde dropped them and requests ran with the defaults:
`min_p` was ignored, and `spaces_between_special_tokens: false`,
`media_io_kwargs`, `mm_processor_kwargs`, and
`enable_response_messages: true` were accepted without effect.

Forward `min_p` to the shared sampling parameters, and reject the
others with 400 as Chat Completions does. Prompt-cache hints and
`safety_identifier` stay ignored, which Python documents as no-ops.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CJckCDvqfKYQRRwCYtsCmk
Signed-off-by: Bugen Zhao <i@bugenzhao.com>
The response object omitted every unset optional field, so the initial
lifecycle objects had no `usage`, completed ones had no
`incomplete_details`, and unset echoes such as `instructions` or
`reasoning` disappeared. Python and the OpenAI schema keep these
fields present with `null`. Serialize them as `null`, and keep omitting
`metrics` when it is disabled, as Python does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CJckCDvqfKYQRRwCYtsCmk
Signed-off-by: Bugen Zhao <i@bugenzhao.com>
@BugenZhao
BugenZhao force-pushed the codex/responses-nonstreaming branch from d5b7df3 to 7af1e25 Compare November 3, 2026 08:39
@BugenZhao BugenZhao changed the title [Rust Frontend][2/3] Add stateless non-streaming Responses API [Rust Frontend] Add the stateless Responses API (streaming and non-streaming) Nov 3, 2026
@mergify mergify Bot removed the needs-rebase label Nov 3, 2026
@BugenZhao
BugenZhao force-pushed the codex/responses-nonstreaming branch from 7af1e25 to a1d8bd8 Compare November 3, 2026 08:42

@BugenZhao BugenZhao left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I pushed several commits to make the DTOs more strongly typed and to share as much code as possible between the non-streaming and streaming paths.

Thanks again @franciscojavierarceo!

@BugenZhao

Copy link
Copy Markdown
Member

/ci run

@github-actions

github-actions Bot commented Nov 3, 2026

Copy link
Copy Markdown

✅ Triggered Buildkite CI #99513 for commit be0cafa77575.

ℹ️ This PR is 5 commits behind upstream main. Merged upstream main into this branch as be0cafa77575 before starting CI. Pull the branch before pushing more changes.

Add `usage.input_tokens_details.cache_write_tokens`, the prompt tokens
newly written to the prefix cache, as the Python frontend has since
vllm-project#60973. The OpenAI SDK `Response` type requires the
field, so strict validation of Rust responses failed without it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CJckCDvqfKYQRRwCYtsCmk
Signed-off-by: Bugen Zhao <i@bugenzhao.com>
@BugenZhao

Copy link
Copy Markdown
Member

/ci run

@github-actions

github-actions Bot commented Nov 3, 2026

Copy link
Copy Markdown

✅ Triggered Buildkite CI #99516 for commit 99446a2d751b.

@BugenZhao
BugenZhao merged commit eb409c9 into vllm-project:main Nov 3, 2026
31 checks passed
richard-for-bugen Bot added a commit to BugenZhao/vllm that referenced this pull request Nov 3, 2026
…ream test

The stateless Responses API (vllm-project#63902) pinned the trailing `}\n</tool_call`
text the tool parser leaked at the end of output as an extra message item.
With incomplete tool-call markup dropped at the end of output, the stream
ends after the function call item.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: richard-for-bugen[bot] <342439978+richard-for-bugen[bot]@users.noreply.github.com>
richard-for-bugen Bot added a commit to BugenZhao/vllm that referenced this pull request Nov 3, 2026
…the Rust frontend

vllm-project#63902 added the stateless Responses API to the Rust
frontend. A new 35 GB step (the Python Responses step's device) runs
test_basic.py, test_function_call.py, test_structured_output.py and
test_simple.py against it; on a GB200 run these pass apart from the
excluded cases: output logprobs and enable_response_messages (an explicit
400), namespace tools (rejected at deserialization) and the store-backed
test_stateful.py.

test_thinking_token_budget_responses_api stays skipped under the Rust
frontend; its reason now names the actual gap, since /v1/responses
ignores thinking_token_budget.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: richard-for-bugen[bot] <342439978+richard-for-bugen[bot]@users.noreply.github.com>
richard-for-bugen Bot added a commit to BugenZhao/vllm that referenced this pull request Nov 3, 2026
With VLLM_ENABLE_RESPONSES_API_STORE=1, the Python frontend keeps
Responses API responses in memory, so store=true responses can be
retrieved and cancelled, background=true runs, and previous_response_id
resolves. The Rust frontend serves the stateless Responses API
(vllm-project#63902) and keeps no store: it downgrades store=true
like Python does without the variable, so a deployment that sets it
would silently lose retrieval. Reject a non-zero value at startup
instead.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: richard-for-bugen[bot] <342439978+richard-for-bugen[bot]@users.noreply.github.com>
richard-for-bugen Bot added a commit to BugenZhao/vllm that referenced this pull request Nov 4, 2026
…the Rust frontend

vllm-project#63902 added the stateless Responses API to the Rust
frontend. A new 35 GB step (the Python Responses step's device) runs
test_basic.py, test_function_call.py, test_structured_output.py and
test_simple.py against it; on a GB200 run these pass apart from the
excluded cases: output logprobs and enable_response_messages (an explicit
400), namespace tools (rejected at deserialization) and the store-backed
test_stateful.py.

test_thinking_token_budget_responses_api stays skipped under the Rust
frontend; its reason now names the actual gap, since /v1/responses
ignores thinking_token_budget.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: richard-for-bugen[bot] <342439978+richard-for-bugen[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation rust

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants