Skip to content

refactor(openai)!: normalize Responses filter names to openai_<feature> - #1100

Draft
leseb wants to merge 10 commits into
praxis-proxy:mainfrom
leseb:leseb/rename-search-dispatch-filters
Draft

leseb wants to merge 10 commits into
praxis-proxy:mainfrom
leseb:leseb/rename-search-dispatch-filters

Conversation

@leseb

@leseb leseb commented Sep 11, 2026

Copy link
Copy Markdown
Collaborator

Summary

Normalizes every OpenAI Responses filter to the openai_<feature> convention set by openai_mcp_dispatch, so each filter's registered name, module path, and struct agree. This is a pre-v1 rename with no compatibility aliases: config-facing filter names change (e.g. openai_responses_formatopenai_format, openai_response_storeopenai_store, responses_to_chat_completionsopenai_responses_to_chat_completions, and the search filters become openai_file_search_dispatch / openai_web_search_dispatch), module directories and filter structs are renamed to match, and all generated docs, READMEs, example configs, and integration tests are updated accordingly. No behavior changes.

Related issue

N/A — internal naming-consistency cleanup (no tracked issue).

Validation

  • Unit tests — cargo test -p praxis-ai-apis -p praxis-ai-filters (all pass)
  • make build and full-workspace cargo test --no-run
  • make lint (clippy, fmt, generated filter-docs, example-tests, README syncs, responses registry, inference coverage, markdown links)
  • make doc

Checklist

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

Breaking changes

Filter names used in pipeline configs change (pre-v1, no aliases). Update - filter: <name> entries:

Old New
openai_responses_format openai_format
openai_responses_model_rewrite openai_model_rewrite
openai_responses_validate openai_validate
openai_responses_rehydrate openai_rehydrate
openai_responses_compact openai_compact
openai_responses_proxy openai_proxy
openai_response_store openai_store
responses_to_chat_completions openai_responses_to_chat_completions
openai_file_search_callout openai_file_search_dispatch
openai_web_search openai_web_search_dispatch

Align every OpenAI Responses filter with the openai_mcp_dispatch gold
standard so the registered name, module path, and filter struct agree.

Registered names (config-facing, breaking):
- openai_responses_format          -> openai_format
- openai_responses_model_rewrite   -> openai_model_rewrite
- openai_responses_validate        -> openai_validate
- openai_responses_rehydrate       -> openai_rehydrate
- openai_responses_compact         -> openai_compact
- openai_responses_proxy           -> openai_proxy
- openai_response_store            -> openai_store
- responses_to_chat_completions    -> openai_responses_to_chat_completions
- openai_file_search_callout       -> openai_file_search_dispatch
- openai_web_search                -> openai_web_search_dispatch

Module directories renamed to match (Rust paths only): mcp_tool_resolve,
tool_parse, responses_proxy, file_search_dispatch, web_search_dispatch.

Filter structs renamed for consistency (e.g. StreamEventsFilter,
ResponsesValidateFilter, FileSearchDispatchFilter, WebSearchDispatchFilter).

Regenerated filter docs, Responses/example READMEs, and updated example
configs and integration tests to the new names.

BREAKING CHANGE: filter names used in pipeline configs have changed as
listed above; update `- filter: <name>` entries accordingly. This is a
pre-v1 rename with no compatibility aliases.

Signed-off-by: Sébastien Han <seb@redhat.com>
Renaming the filters changed identifier lengths, which shifts nightly
rustfmt line-wrapping in the rehydrate, stream_events, responses, and
web_search_dispatch test/filter modules. Reformat to satisfy
`cargo +nightly fmt --all -- --check`.

Signed-off-by: Sébastien Han <seb@redhat.com>
@leseb
leseb force-pushed the leseb/rename-search-dispatch-filters branch from 0a13d78 to 43152ed Compare September 15, 2026 09:42
Resolve the merge with main after the openai_<feature> filter rename:

- New openai_stream_events tests (praxis-proxy#556/praxis-proxy#1155) referenced the renamed
  StreamEventsFilter type under its old name; update them.
- Regenerate examples/README.md for the merged stream-events example.

Signed-off-by: Sébastien Han <seb@redhat.com>
The A/B/C Responses filter normalization left two defect classes that broke CI:

- Over-rename: the fixed OpenAI "web_search" tool type / synthetic bridge
  wire name was rewritten to "web_search_dispatch" in the dispatch bridges,
  their unit tests, example configs, and vLLM SDK tests. "web_search" is a
  fixed wire-format string; only the filter was renamed. Reverted every
  API-contract occurrence back to "web_search".
- Under-rename: the IRR dispatcher assertion and the vLLM SDK config builder
  still used old registered names. Updated to openai_web_search_dispatch /
  openai_file_search_dispatch and openai_responses_to_chat_completions.

Also finished the rename in doc comments, a vacuous validate test seed, and
remaining test/helper identifiers, and regenerated examples/README.md.

Signed-off-by: Sébastien Han <seb@redhat.com>
The generated apis/src/openai/responses/README.md sorts filters by their
registered name. Renaming the Responses filters to openai_<feature>
(openai_compact, openai_format, openai_store, openai_validate,
openai_responses_to_chat_completions) reorders that list and the pipeline
hooks table, but the generated README was not re-synced, so
`cargo xtask sync-responses-readme` flagged it stale on CI.

Regenerated via `cargo xtask sync-responses-readme --fix`. Descriptions
are unchanged; only the alphabetical ordering of the renamed filters
differs.

Signed-off-by: Sébastien Han <seb@redhat.com>
Integrates praxis-proxy#890 (openai_operation operation-classifier filter) into the
OpenAI Responses filter rename branch.

Only conflict was the generated docs/filters/reference.md filter table:
HEAD carried the renamed filters, origin/main added the openai_operation
row. Resolved by regenerating via 'cargo xtask generate-filter-docs',
which produces the authoritative union (renamed filters + openai_operation
sorted between openai_model_rewrite and openai_proxy). The 4 known praxis-proxy#1166
on_invalid base doc-artifacts were reverted; only reference.md is kept.

Verified: workspace build, clippy, nightly fmt, sync-example-readme (no
change), sync-responses-readme, check-responses-registry (7 ops),
check-inference (24/24), openresponses-coverage, apis lib (3428/0),
integration suite examples (362/0).

Signed-off-by: Sébastien Han <seb@redhat.com>
Integrates praxis-proxy#1162 (bound file search callout decoding) into the OpenAI
Responses filter rename branch.

No conflicts. Git replayed praxis-proxy#1162's edits into the renamed file_search_dispatch/
paths (client.rs decode-bounding + tests) and picked up the serde_json
raw_value feature it needs. The rename kept the internal test-function
names as file_search_callout_*, so praxis-proxy#1162's hunks applied cleanly.

Verified: workspace build, clippy --all-targets (0), nightly fmt,
sync-responses-readme/sync-example-readme (no change),
check-responses-registry (7 ops), check-inference (24/24),
openresponses-coverage, apis lib 3435/0 (incl praxis-proxy#1162's new decode-bound
tests), integration suite file_search_dispatch example 6/0.

Signed-off-by: Sébastien Han <seb@redhat.com>
Integrates praxis-proxy#1181 (fail closed on tenant-unsafe schemas at startup) into
the OpenAI Responses filter rename branch.

No conflicts: praxis-proxy#1181 is confined to the store backends (apis/src/store/
schemas.rs, sqlite.rs, postgres.rs, tests.rs), which the filter rename
never touched, so its changes apply cleanly with no overlap.

Verified: workspace build, clippy --all-targets (0 warnings), nightly fmt,
sync-responses-readme/sync-example-readme (no change), check-responses-registry
(7 ops), check-inference (24/24), openresponses-coverage, apis lib 3441/0
(incl praxis-proxy#1181's new store schema-validation tests).

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

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

Signed-off-by: Sébastien Han <seb@redhat.com>
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.

2 participants