Skip to content

feat(ext-proc): make external processor crate publishable#780

Closed
nerdalert wants to merge 1 commit into
praxis-proxy:mainfrom
nerdalert:feat-ext-proc-publish-crate
Closed

feat(ext-proc): make external processor crate publishable#780
nerdalert wants to merge 1 commit into
praxis-proxy:mainfrom
nerdalert:feat-ext-proc-publish-crate

Conversation

@nerdalert

@nerdalert nerdalert commented Jul 10, 2026

Copy link
Copy Markdown
Member

Summary

This PR makes the generic praxis-proxy-ext-proc crate publishable.

Currently ext_proc works inside the Praxis workspace, but downstream repos cannot depend on it through the normal released-crate path. That blocks llm-d integration test work in praxis-proxy/ai, where the AI gateway needs to register the same generic ext_proc filter without local-path or git-dependency workarounds.

ext_proc is not full Envoy parity yet, but publishing the crate unblocks the llm-d integration-testing epic.

What Changed

  • Marks praxis-proxy-ext-proc as publishable.
  • Exports register_filters() so downstream binaries can explicitly register the filter.
  • Exposes praxis_ext_proc::proto so downstream code can use the generated Envoy ext_proc protobuf and gRPC types.
  • Adds praxis-proxy-ext-proc to the Makefile publish dry-run crate list.

Generated Proto Lint Suppression

This PR exposes praxis_ext_proc::proto so downstream crates can use the same generated Envoy ext_proc protobuf and gRPC types as Praxis. That is needed for downstream integration tests and external processor implementations that need ExternalProcessor, ExternalProcessorServer, ProcessingRequest, and ProcessingResponse.

This is a new public API shape for Praxis filter crates: most published filters expose handwritten Rust filters/config types, while praxis-proxy-ext-proc also exposes generated tonic/prost code.

Because the tonic-generated gRPC client/server methods are generated code, they do not include Praxis-style rustdoc sections such as # Errors on every public Result returning method. The PR keeps Praxis lint standards for handwritten code and suppresses generated-code-only Clippy lints only at the include_proto! module boundary.

Validation

  • git diff --check
  • cargo +nightly-2026-03-28 fmt --all -- --check
  • make lint
  • cargo clippy --workspace --all-targets -- -D warnings
  • cargo test -p praxis-proxy-ext-proc
  • cargo test -p praxis-proxy-ext-proc -- --test-threads=1
  • cargo deny check
  • cargo doc --workspace --no-deps --document-private-items
  • cargo package -p praxis-proxy-ext-proc --allow-dirty --no-verify

Note: full cargo package verification depends on release ordering and will pass after the next praxis-proxy-filter crate version is published first.

@nerdalert nerdalert requested a review from a team July 10, 2026 03:54
@nerdalert nerdalert requested a review from shaneutt as a code owner July 10, 2026 03:54
@nerdalert nerdalert force-pushed the feat-ext-proc-publish-crate branch 2 times, most recently from 4bb3e25 to fdaf11c Compare July 10, 2026 05:14
Signed-off-by: Brent Salisbury <bsalisbu@redhat.com>
@nerdalert nerdalert force-pushed the feat-ext-proc-publish-crate branch from fdaf11c to 7fe5bff Compare July 10, 2026 05:34

@praxis-bot praxis-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

ext-proc publish review

Clean, minimal PR. The visibility changes (pub(crate) to pub for proto and its inner modules), export_filters! usage, clippy::missing_errors_doc lint suppression for generated gRPC code, publish-crate ordering in the Makefile, and doc updates all look correct.

Severity Count
Critical 0
Large 0
Medium 1

Medium -- no test for new register_filters() API: see inline comment.

}
}

praxis_filter::export_filters! {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Medium] The export_filters! invocation generates a new public register_filters() function -- the recommended API documented in the crate doc comment -- but no test in this crate exercises it. The existing pipeline_builds_with_ext_proc_and_failure_mode test manually registers via registry.register("ext_proc", http_builtin(...)) instead.

Update that test to use register_filters() so the published API has end-to-end coverage:

let mut registry = praxis_filter::FilterRegistry::with_builtins();
register_filters(&mut registry);

@shaneutt shaneutt 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 would prefer not to publish this crate. I want to aim for it to not exist at all in time.

I suggest we transfer this crate over the the ai repository, and wall it off for everything except llm-d, and note that it's only for llm-d, keep the anti-pattern warning language, and keep it as an experimental feature.

We should explicitly claim no support or backwards compatibility for any use case except llm-d.

We run the risk of people building on it for other use cases and then it becomes quite hard to remove it later. Bare minimum, I want any such usage outside of llm-d to be gated behind a github request to discuss the use cases beyond llm-d.

@nerdalert

Copy link
Copy Markdown
Member Author

Superseded by praxis-proxy/ai#334

@nerdalert nerdalert closed this Jul 14, 2026
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.

3 participants