Skip to content

refactor(examples): unify full-flow configs into B-shaped gateway - #975

Open
leseb wants to merge 3 commits into
praxis-proxy:mainfrom
leseb:leseb/merge-full-flow-configs
Open

refactor(examples): unify full-flow configs into B-shaped gateway#975
leseb wants to merge 3 commits into
praxis-proxy:mainfrom
leseb:leseb/merge-full-flow-configs

Conversation

@leseb

@leseb leseb commented Sep 7, 2026

Copy link
Copy Markdown
Collaborator

Summary

Merge the standalone full-flow.yaml gateway into full-flow-agentic.yaml as a single "B-shaped" config: POST /v1/responses runs through the terminal iterative_request_router for server-side file_search, while the Responses WebSocket (GET /v1/responses) and the non-Responses paths (/v1/prompts, /v1/embeddings, /v1/files, /v1/vector_stores) branch around the IRR via a conditions-gated headers host, and a format-first guard rejects Chat Completions / Anthropic Messages bodies on /v1/responses with 404. This is the smallest complete change because it deletes the now-redundant full-flow.yaml, migrates every test and doc reference to the unified config in one pass, and regenerates the examples README. The config is a draft gated on #313 (file_search SSE streaming lifecycle); an #[ignore]d streaming placeholder test marks the post-#313 expectation.

Related issue

Refs #313

Validation

  • Unit tests — no production code changed (example-config + test/doc migration only)
  • Integration or functional tests — cargo test -p praxis-tests-integration --test suite green for full_flow (12), full_flow_agentic (6 + 1 ignored, file_search: SSE event emission for progress streaming #313), session_replay (9), codex_websocket (2); cargo xtask lint-example-tests → 41 configs covered
  • make lint (exit 0) and make build (exit 0)

Checklist

  • I reviewed every changed line and can explain the change.
  • New capabilities include an example config and functional example test.
  • User-facing behavior and generated documentation are updated.
  • Performance-sensitive changes include appropriate benchmark or load-test evidence. (N/A — no production/perf code changed)
  • Commits are signed and include a Signed-off-by trailer.

Breaking changes

Deletes the full-flow.yaml example config; external references must switch to full-flow-agentic.yaml. This is a draft — do not merge until #313 lands and validates the file_search SSE streaming lifecycle.

Merge full-flow.yaml into full-flow-agentic.yaml as a single B-shaped gateway: POST /v1/responses runs through the terminal iterative_request_router for server-side file_search, while the Responses WebSocket (GET /v1/responses) and the non-Responses paths (/v1/prompts, /v1/embeddings, /v1/files, /v1/vector_stores) branch around the IRR via a conditions-gated headers host. A format-first guard rejects Chat Completions and Anthropic Messages bodies on /v1/responses with 404. The now-redundant full-flow.yaml is deleted.

Migrate all full_flow, full_flow_agentic, session_replay, codex_websocket, and vLLM SDK references to the unified config; regenerate the examples README table; drop the stale skip-list entry. The config is a DRAFT gated on praxis-proxy#313 (file_search SSE streaming lifecycle): an ignored streaming placeholder test marks the post-praxis-proxy#313 expectation.

Signed-off-by: Sébastien Han <seb@redhat.com>
Base advanced past the B-shaped gateway refactor. Resolve conflicts:
keep full-flow.yaml deleted, migrate example tests onto
full-flow-agentic.yaml, take the renumbered pre-IRR chain (with
openai_stream_events intentionally absent), preserve the union of the
full_flow tests, and #[ignore] the two file_search SSE-through-IRR
streaming tests pending issue praxis-proxy#313.

Signed-off-by: Sébastien Han <seb@redhat.com>
… passthrough

Issue praxis-proxy#313 (file_search SSE streaming lifecycle) landed, so remove the
DRAFT gating from the unified full-flow-agentic gateway. Add
openai_stream_events as the first filter of the IRR inference step (per
§5 of the praxis-proxy#313 spec) alongside max_stream_response_bytes so POST
/v1/responses serves streaming (stream: true) clients through the IRR,
and un-ignore the previously gated streaming integration tests.

The unified config routes every POST /v1/responses through
openai_file_search_callout, which exposed a regression: on an ordinary
response with no file-search work, capture_response still re-serialized
the body and stripped the upstream representation headers (ETag,
Last-Modified, Content-Encoding, ...), defeating
openai_responses_rehydrate's decision to decline rewriting a
validator-bearing response.

Make the passthrough predicate precise: skip finalization only when file
search performed no transformation this round (no function_call was
translated to a file_search_call, and the tool-call budget did not force
any pending call to `incomplete`) and there is no accumulated file-search
state to assemble. terminalize_all_pending_calls now reports whether it
rewrote a call, so a budget-exhausted response is never mistaken for a
passthrough and leaked to the client with a non-terminal file_search_call.

Add focused callout unit tests (a passthrough preserves representation
headers; a budget-exhausted native call is terminalized, not passed
through) and keep the integration tests unchanged. praxis-proxy#1046 owns the broader
consolidation of file-search finalization.

Signed-off-by: Sébastien Han <seb@redhat.com>
@leseb
leseb marked this pull request as ready for review September 11, 2026 08:13
@leseb
leseb requested review from a team and jland-redhat September 11, 2026 08:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant