refactor(intake): remove legacy sink pipeline - #238
Conversation
Signed-off-by: nachiketb <nachiketb@nvidia.com>
WalkthroughThe change removes the obsolete Intake implementation across Rust and Python components. It removes runtime wiring, public exports, dependencies, documentation, metadata APIs, and Intake-specific tests. ChangesIntake Removal
Estimated code review effort: 4 (Complex) | ~45 minutes Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
switchyard/lib/request_metadata.py (1)
132-143: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy liftPreserve a compatibility path for removed request-metadata exports.
INTAKE_APP_HEADER,INTAKE_ENABLED_HEADER, andIntakeRequestMetadatawere public exports and now fail downstream imports. Retain deprecated aliases for one release, or document an approved breaking migration before removal.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@switchyard/lib/request_metadata.py` around lines 132 - 143, Update the public exports around __all__ and the request-metadata definitions to retain deprecated compatibility aliases for INTAKE_APP_HEADER, INTAKE_ENABLED_HEADER, and IntakeRequestMetadata for one release. Ensure downstream imports continue resolving while directing users toward the current replacements, or document and implement the approved breaking migration instead.Source: Learnings
🧹 Nitpick comments (1)
crates/switchyard-py/src/interop/context.rs (1)
147-168: 🗄️ Data Integrity & Integration | 🔵 Trivial | 💤 Low valueClarify the
_NativeProxyContextconstructor documentation.
ProxyContextstill storesmetadatain Python-ownedProxyMetadata; the native constructor only accepts it for compatibility. No tracked references to the removed submodel-call APIs remain. Update the Rust doc comment to describe this behavior.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@crates/switchyard-py/src/interop/context.rs` around lines 147 - 168, The doc comment above PyProxyContext::new should state that metadata is accepted for Python compatibility but remains stored in Python-owned ProxyMetadata rather than native state, while request_id is validated and stored by the native ProxyContext. Update only this constructor documentation and preserve the current implementation.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@switchyard/lib/request_metadata.py`:
- Around line 42-56: Export the public RequestMetadata class from
switchyard/__init__.py by importing it and adding it to the package’s __all__
collection, while preserving its existing availability from
switchyard.lib.request_metadata.
---
Outside diff comments:
In `@switchyard/lib/request_metadata.py`:
- Around line 132-143: Update the public exports around __all__ and the
request-metadata definitions to retain deprecated compatibility aliases for
INTAKE_APP_HEADER, INTAKE_ENABLED_HEADER, and IntakeRequestMetadata for one
release. Ensure downstream imports continue resolving while directing users
toward the current replacements, or document and implement the approved breaking
migration instead.
---
Nitpick comments:
In `@crates/switchyard-py/src/interop/context.rs`:
- Around line 147-168: The doc comment above PyProxyContext::new should state
that metadata is accepted for Python compatibility but remains stored in
Python-owned ProxyMetadata rather than native state, while request_id is
validated and stored by the native ProxyContext. Update only this constructor
documentation and preserve the current implementation.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 25f01a35-5ae2-46b9-876b-9b5a69d86ab8
⛔ Files ignored due to path filters (2)
examples/experimental/litellm/uv.lockis excluded by!**/*.lockuv.lockis excluded by!**/*.lock,!uv.lock
📒 Files selected for processing (59)
AGENTS.mdINSTALLATION.mdcrates/switchyard-components/src/intake.rscrates/switchyard-components/src/intake/client.rscrates/switchyard-components/src/intake/config.rscrates/switchyard-components/src/intake/context.rscrates/switchyard-components/src/intake/payload.rscrates/switchyard-components/src/lib.rscrates/switchyard-components/src/request_processors/intake.rscrates/switchyard-components/src/request_processors/mod.rscrates/switchyard-components/src/response_processors/intake.rscrates/switchyard-components/src/response_processors/mod.rscrates/switchyard-components/src/telemetry.rscrates/switchyard-components/tests/flat_target_live.rscrates/switchyard-components/tests/intake_http_sink.rscrates/switchyard-components/tests/intake_payload.rscrates/switchyard-components/tests/intake_request_processor.rscrates/switchyard-components/tests/intake_response_processor.rscrates/switchyard-components/tests/support/intake.rscrates/switchyard-components/tests/support/mod.rscrates/switchyard-py/src/component_bindings.rscrates/switchyard-py/src/component_bindings/config.rscrates/switchyard-py/src/component_bindings/intake.rscrates/switchyard-py/src/component_bindings/request_processors.rscrates/switchyard-py/src/component_bindings/response_processors.rscrates/switchyard-py/src/interop/context.rspyproject.tomlswitchyard/__init__.pyswitchyard/cli/intake_cli_config.pyswitchyard/cli/route_bundle.pyswitchyard/cli/switchyard_cli.pyswitchyard/lib/config/__init__.pyswitchyard/lib/config/intake_sink_config.pyswitchyard/lib/processors/__init__.pyswitchyard/lib/processors/intake_client.pyswitchyard/lib/processors/intake_payload_builder.pyswitchyard/lib/processors/intake_request_processor.pyswitchyard/lib/processors/intake_response_processor.pyswitchyard/lib/processors/llm_classifier/request_processor.pyswitchyard/lib/processors/routing_log_response_processor.pyswitchyard/lib/processors/stage_router/classifier.pyswitchyard/lib/profiles/chain.pyswitchyard/lib/request_metadata.pyswitchyard_rust/__init__.pyswitchyard_rust/components.pyswitchyard_rust/components.pyiswitchyard_rust/core.pytests/test_init_all_exports.pytests/test_intake_cli_flags.pytests/test_intake_sink.pytests/test_intake_target.pytests/test_llm_classifier_request_processor.pytests/test_request_metadata.pytests/test_rl_logging.pytests/test_route_bundle.pytests/test_routing_log_response_processor.pytests/test_stage_router_classifier.pytests/test_switchyard_rust_component_bindings.pytests/test_version_package_name.py
💤 Files with no reviewable changes (44)
- switchyard/lib/config/init.py
- switchyard/lib/processors/intake_request_processor.py
- switchyard/lib/processors/intake_response_processor.py
- crates/switchyard-components/src/response_processors/intake.rs
- crates/switchyard-components/tests/intake_response_processor.rs
- switchyard/lib/processors/llm_classifier/request_processor.py
- crates/switchyard-components/tests/intake_payload.rs
- tests/test_route_bundle.py
- crates/switchyard-components/src/intake/client.rs
- crates/switchyard-components/src/intake.rs
- crates/switchyard-components/tests/support/intake.rs
- crates/switchyard-components/src/intake/context.rs
- switchyard_rust/core.py
- crates/switchyard-components/tests/intake_request_processor.rs
- tests/test_version_package_name.py
- crates/switchyard-components/src/telemetry.rs
- crates/switchyard-components/src/request_processors/intake.rs
- tests/test_llm_classifier_request_processor.py
- tests/test_init_all_exports.py
- switchyard_rust/components.pyi
- switchyard/lib/processors/stage_router/classifier.py
- crates/switchyard-components/tests/support/mod.rs
- switchyard/cli/intake_cli_config.py
- tests/test_intake_cli_flags.py
- switchyard/lib/processors/intake_payload_builder.py
- crates/switchyard-py/src/component_bindings/intake.rs
- tests/test_stage_router_classifier.py
- tests/test_rl_logging.py
- crates/switchyard-components/tests/flat_target_live.rs
- crates/switchyard-components/src/intake/config.rs
- tests/test_switchyard_rust_component_bindings.py
- crates/switchyard-components/src/response_processors/mod.rs
- tests/test_intake_target.py
- crates/switchyard-components/src/request_processors/mod.rs
- crates/switchyard-components/tests/intake_http_sink.rs
- switchyard_rust/components.py
- tests/test_intake_sink.py
- crates/switchyard-components/src/intake/payload.rs
- switchyard/init.py
- crates/switchyard-py/src/component_bindings.rs
- switchyard/lib/config/intake_sink_config.py
- switchyard/lib/processors/intake_client.py
- switchyard/lib/processors/init.py
- switchyard_rust/init.py
| @dataclass(frozen=True, slots=True) | ||
| class RequestMetadata: | ||
| """Session and task identifiers retained for compatibility routing logs.""" | ||
|
|
||
| session_id: str | None = None | ||
| task: str | None = None | ||
|
|
||
| @classmethod | ||
| def from_headers(cls, headers: Mapping[str, str]) -> "RequestMetadata": | ||
| """Extract request metadata from a case-insensitive header mapping.""" | ||
| normalized = {name.lower(): value for name, value in headers.items()} | ||
| return cls( | ||
| session_id=_nonempty_header(normalized, PROXY_SESSION_ID_HEADER), | ||
| task=_nonempty_header(normalized, INTAKE_TASK_HEADER), | ||
| ) |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
ast-grep outline switchyard/__init__.py --items all
rg -n -C 2 --type py '\bRequestMetadata\b|__all__' \
switchyard/__init__.py switchyard/lib/request_metadata.pyRepository: NVIDIA-NeMo/Switchyard
Length of output: 2886
Export RequestMetadata from switchyard/__init__.py and its __all__. The class is public in switchyard.lib.request_metadata, but it is not available from the package root as required.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@switchyard/lib/request_metadata.py` around lines 42 - 56, Export the public
RequestMetadata class from switchyard/__init__.py by importing it and adding it
to the package’s __all__ collection, while preserving its existing availability
from switchyard.lib.request_metadata.
Source: Coding guidelines
|
What
intakePython extra andnemo-platformdependency.x-switchyard-intake-taskfor routing-log and session-stats compatibility.Why
The Rust server now exports Intake-consumable telemetry through OTLP. Maintaining a separate direct sink duplicates transport, payload, queueing, and retry logic.
How
/metrics,/v1/stats, routing logs, and session stats unchanged.What to review
Validation
cargo clippy --workspace --all-targets -- -D warningscargo test --workspaceuv run ruff check .uv run mypy switchyarduv run pytest tests/ -q(1329 passed, 31 skipped)Summary by CodeRabbit
Removed Features
Changes
Installation