chore(intake): Move intake to a plugin#616
Conversation
Signed-off-by: Brian Newsom <[email protected]>
…-nemo-platform-launch Signed-off-by: Brian Newsom <[email protected]> # Conflicts: # third_party/requirements-main.txt # uv.lock
Signed-off-by: Brian Newsom <[email protected]>
…-nemo-platform-launch Signed-off-by: Brian Newsom <[email protected]>
Signed-off-by: Brian Newsom <[email protected]>
Signed-off-by: Brian Newsom <[email protected]>
Signed-off-by: Brian Newsom <[email protected]>
8281951 to
ad33379
Compare
📝 WalkthroughWalkthroughIntake is split into a new plugin and a slim typed client package. Backend service registration, OpenAPI handling, evaluator publishing, test wiring, and Studio imports now point to ChangesTyped intake client
Plugin backend
Evaluator integration
Workspace, registries, and CLI/OpenAPI wiring
Studio frontend migration
Sequence Diagram(s)sequenceDiagram
participant IntakeService
participant IntakeConfig
participant ClickHouseSpanClient
participant IntakeRuntime
participant Router
IntakeService->>IntakeConfig: load config
IntakeService->>ClickHouseSpanClient: construct client
IntakeService->>IntakeRuntime: configure(client, config)
IntakeService->>Router: apply_intake_authz(router)
Router->>IntakeRuntime: get_intake_runtime().clickhouse_client
sequenceDiagram
participant Evaluator
participant Mapping
participant AsyncIntakeClient
participant IntakePlugin
Evaluator->>Mapping: trial_to_atif_ingest(trial)
Mapping-->>Evaluator: AtifIngestRequest
Evaluator->>AsyncIntakeClient: create_atif(body)
AsyncIntakeClient->>IntakePlugin: POST /ingest/atif
Evaluator->>AsyncIntakeClient: list_traces(query_params)
AsyncIntakeClient->>IntakePlugin: GET /traces
IntakePlugin-->>AsyncIntakeClient: traces
Possibly related PRs
Suggested labels: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
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)
plugins/nemo-evaluator/tests/intake/test_import_hygiene.py (1)
21-30: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winClose forbidden-import bypasses.
The regex misses
import os, httpxandfrom nmp import intake, so service/HTTP imports can evade this guard. Parse imports viaastinstead.🤖 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 `@plugins/nemo-evaluator/tests/intake/test_import_hygiene.py` around lines 21 - 30, The import-hygiene check in test_intake_mapping_has_no_service_imports relies on _FORBIDDEN regex matching, which can be bypassed by multi-import statements or nested module imports. Replace the regex-based scan with AST parsing in this test so it inspects Import and ImportFrom nodes directly and flags any forbidden modules or submodules (including httpx and nmp.intake) regardless of import syntax.
🤖 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 `@plugins/nemo-intake/src/nemo_intake_plugin/service.py`:
- Around line 121-126: The shutdown path in the service teardown currently
clears the runtime only after client.close() succeeds, so a failed close can
leave a stale ClickHouse client registered. Update the teardown logic in the
service’s close/shutdown method to always call
get_intake_runtime().clear(client) from a finally block around await
client.close(), and then set self.clickhouse_client to None so the runtime state
is cleared regardless of close failures.
---
Outside diff comments:
In `@plugins/nemo-evaluator/tests/intake/test_import_hygiene.py`:
- Around line 21-30: The import-hygiene check in
test_intake_mapping_has_no_service_imports relies on _FORBIDDEN regex matching,
which can be bypassed by multi-import statements or nested module imports.
Replace the regex-based scan with AST parsing in this test so it inspects Import
and ImportFrom nodes directly and flags any forbidden modules or submodules
(including httpx and nmp.intake) regardless of import syntax.
🪄 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: d25a9764-2922-40be-b3e2-2327515805f2
⛔ Files ignored due to path filters (162)
sdk/python/nemo-platform/.nmpcontext/openapi.yamlis excluded by!sdk/**sdk/python/nemo-platform/.nmpcontext/stainless.yamlis excluded by!sdk/**sdk/python/nemo-platform/api.mdis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/_client.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/cli/commands/api/__init__.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/cli/commands/api/intake/__init__.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/cli/commands/api/intake/annotations.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/cli/commands/api/intake/evaluator_results.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/cli/commands/api/intake/ingest/__init__.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/cli/commands/api/intake/ingest/atif.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/cli/commands/api/intake/ingest/chat_completions.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/cli/commands/api/intake/ingest/otlp/__init__.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/cli/commands/api/intake/ingest/otlp/v1/__init__.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/cli/commands/api/intake/ingest/otlp/v1/traces.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/cli/commands/api/intake/spans/__init__.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/cli/commands/api/intake/spans/evaluator_results.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/cli/commands/api/intake/spans/groups.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/cli/commands/api/intake/traces.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/resources/experiment_groups/__init__.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/resources/experiment_groups/api.mdis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/resources/experiment_groups/experiment_groups.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/resources/experiments/__init__.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/resources/experiments/api.mdis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/resources/experiments/experiments.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/resources/experiments/sessions.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/resources/intake/__init__.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/resources/intake/annotations.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/resources/intake/api.mdis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/resources/intake/evaluator_results.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/resources/intake/ingest/__init__.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/resources/intake/ingest/atif.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/resources/intake/ingest/chat_completions.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/resources/intake/ingest/ingest.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/resources/intake/ingest/otlp/__init__.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/resources/intake/ingest/otlp/otlp.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/resources/intake/ingest/otlp/v1/__init__.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/resources/intake/ingest/otlp/v1/traces.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/resources/intake/ingest/otlp/v1/v1.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/resources/intake/intake.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/resources/intake/spans/__init__.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/resources/intake/spans/evaluator_results.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/resources/intake/spans/groups.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/resources/intake/spans/spans.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/resources/intake/traces.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/__init__.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/experiment_group_create_params.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/experiment_group_filter_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/experiment_group_list_params.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/experiment_group_response.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/experiment_group_responses_page.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/experiment_group_update_params.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/experiments/__init__.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/experiments/evaluator_aggregate.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/experiments/experiment_create_params.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/experiments/experiment_filter_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/experiments/experiment_list_params.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/experiments/experiment_response.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/experiments/experiment_responses_page.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/experiments/experiment_session_filter_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/experiments/experiment_session_response.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/experiments/experiment_session_responses_page.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/experiments/experiment_update_params.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/experiments/metric_stat_filters_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/experiments/number_filter_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/experiments/session_list_params.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/__init__.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/annotation.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/annotation_create_params.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/annotation_filter_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/annotation_kind.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/annotation_list_params.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/annotation_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/annotation_sort_field.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/annotations_page.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/evaluation_context_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/evaluator_result.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/evaluator_result_create_params.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/evaluator_result_data_type.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/evaluator_result_filter_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/evaluator_result_list_params.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/evaluator_result_sort_field.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/evaluator_results_page.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/experiment_context.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/experiment_context_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/feedback_annotation.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/feedback_annotation_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/float_filter_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/__init__.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/atif_agent_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/atif_content_part_image_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/atif_content_part_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/atif_content_part_text_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/atif_create_params.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/atif_final_metrics_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/atif_image_source_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/atif_metrics_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/atif_observation_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/atif_observation_result_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/atif_step_agent_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/atif_step_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/atif_step_system_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/atif_step_user_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/atif_subagent_trajectory_ref_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/atif_tool_call_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/captured_chat_completions_request_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/captured_chat_completions_response_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/captured_chat_message_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/chat_completion_create_params.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/chat_completions_ingest_response.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/chat_message_role.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/otlp/__init__.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/otlp/v1/__init__.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/otlp/v1/ingest_response.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/label_annotation.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/label_annotation_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/metadata_annotation.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/metadata_annotation_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/note_annotation.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/note_annotation_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/numeric_filter_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/span.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/span_evaluation_context.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/span_filter_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/span_kind.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/span_list_params.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/span_sort_field.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/span_status.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/spans/__init__.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/spans/evaluator_result_list_response.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/spans/group_list_params.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/spans/span_group.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/spans/span_group_by.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/spans/span_group_sort_field.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/spans/span_groups_page.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/spans_page.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/trace.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/trace_filter_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/trace_list_params.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/trace_retrieve_params.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/trace_sort_field.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/intake/traces_page.pyis excluded by!sdk/**sdk/python/nemo-platform/tests/api_resources/experiment_groups/__init__.pyis excluded by!sdk/**sdk/python/nemo-platform/tests/api_resources/experiments/__init__.pyis excluded by!sdk/**sdk/python/nemo-platform/tests/api_resources/experiments/test_sessions.pyis excluded by!sdk/**sdk/python/nemo-platform/tests/api_resources/intake/__init__.pyis excluded by!sdk/**sdk/python/nemo-platform/tests/api_resources/intake/ingest/__init__.pyis excluded by!sdk/**sdk/python/nemo-platform/tests/api_resources/intake/ingest/otlp/__init__.pyis excluded by!sdk/**sdk/python/nemo-platform/tests/api_resources/intake/ingest/otlp/v1/__init__.pyis excluded by!sdk/**sdk/python/nemo-platform/tests/api_resources/intake/ingest/otlp/v1/test_traces.pyis excluded by!sdk/**sdk/python/nemo-platform/tests/api_resources/intake/ingest/test_atif.pyis excluded by!sdk/**sdk/python/nemo-platform/tests/api_resources/intake/ingest/test_chat_completions.pyis excluded by!sdk/**sdk/python/nemo-platform/tests/api_resources/intake/spans/__init__.pyis excluded by!sdk/**sdk/python/nemo-platform/tests/api_resources/intake/spans/test_evaluator_results.pyis excluded by!sdk/**sdk/python/nemo-platform/tests/api_resources/intake/spans/test_groups.pyis excluded by!sdk/**sdk/python/nemo-platform/tests/api_resources/intake/test_annotations.pyis excluded by!sdk/**sdk/python/nemo-platform/tests/api_resources/intake/test_evaluator_results.pyis excluded by!sdk/**sdk/python/nemo-platform/tests/api_resources/intake/test_spans.pyis excluded by!sdk/**sdk/python/nemo-platform/tests/api_resources/intake/test_traces.pyis excluded by!sdk/**sdk/python/nemo-platform/tests/api_resources/test_experiment_groups.pyis excluded by!sdk/**sdk/python/nemo-platform/tests/api_resources/test_experiments.pyis excluded by!sdk/**sdk/stainless.yamlis excluded by!sdk/**uv.lockis excluded by!**/*.lock
📒 Files selected for processing (193)
.pulse-trufflehog-allowlist.jsondocker/dockerfiles/services/intake/Dockerfile.bakedocs/fern/scripts/filter-public-openapi.mjsopenapi/ga/individual/platform.openapi.yamlopenapi/ga/openapi.yamlopenapi/openapi.yamlpackages/nemo_intake_client/README.mdpackages/nemo_intake_client/pyproject.tomlpackages/nemo_intake_client/src/nemo_intake_client/client.pypackages/nemo_intake_client/src/nemo_intake_client/endpoints.pypackages/nemo_intake_client/src/nemo_intake_client/models.pypackages/nemo_intake_client/tests/test_import_hygiene.pypackages/nemo_platform/pyproject.tomlpackages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/__init__.pypackages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/intake/__init__.pypackages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/intake/annotations.pypackages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/intake/evaluator_results.pypackages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/intake/ingest/__init__.pypackages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/intake/ingest/atif.pypackages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/intake/ingest/chat_completions.pypackages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/intake/ingest/otlp/__init__.pypackages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/intake/ingest/otlp/v1/__init__.pypackages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/intake/ingest/otlp/v1/traces.pypackages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/intake/spans/__init__.pypackages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/intake/spans/evaluator_results.pypackages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/intake/spans/groups.pypackages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/intake/traces.pypackages/nmp_platform_runner/src/nmp/platform_runner/registry.pypackages/nmp_platform_runner/tests/test_registry.pyplugins/nemo-evaluator/pyproject.tomlplugins/nemo-evaluator/src/nemo_evaluator/intake/mapping.pyplugins/nemo-evaluator/src/nemo_evaluator/intake/publish.pyplugins/nemo-evaluator/tests/intake/test_import_hygiene.pyplugins/nemo-evaluator/tests/intake/test_mapping.pyplugins/nemo-evaluator/tests/intake/test_publish.pyplugins/nemo-evaluator/tests/integration/test_publish_to_intake.pyplugins/nemo-intake/.dockerignoreplugins/nemo-intake/README.mdplugins/nemo-intake/examples/send_langchain_openinference_agent.pyplugins/nemo-intake/examples/send_nemo_flow_openinference_agent.pyplugins/nemo-intake/examples/send_otel_sample.pyplugins/nemo-intake/openapi/openapi.yamlplugins/nemo-intake/pyproject.tomlplugins/nemo-intake/pytest.iniplugins/nemo-intake/scripts/spans/run_clickhouse.shplugins/nemo-intake/scripts/spans/seed_experiment_rollup_data.pyplugins/nemo-intake/scripts/spans/seed_experiments_demo.pyplugins/nemo-intake/scripts/spans/seed_span_type_showcase.pyplugins/nemo-intake/src/nemo_intake_plugin/__init__.pyplugins/nemo-intake/src/nemo_intake_plugin/api/__init__.pyplugins/nemo-intake/src/nemo_intake_plugin/api/v2/experiments/endpoints.pyplugins/nemo-intake/src/nemo_intake_plugin/api/v2/experiments/schemas.pyplugins/nemo-intake/src/nemo_intake_plugin/authz.pyplugins/nemo-intake/src/nemo_intake_plugin/config.pyplugins/nemo-intake/src/nemo_intake_plugin/entities/experiments.pyplugins/nemo-intake/src/nemo_intake_plugin/schema.pyplugins/nemo-intake/src/nemo_intake_plugin/sdk.pyplugins/nemo-intake/src/nemo_intake_plugin/service.pyplugins/nemo-intake/src/nemo_intake_plugin/spans/annotations_repository.pyplugins/nemo-intake/src/nemo_intake_plugin/spans/api/annotations.pyplugins/nemo-intake/src/nemo_intake_plugin/spans/api/annotations_schemas.pyplugins/nemo-intake/src/nemo_intake_plugin/spans/api/dependencies.pyplugins/nemo-intake/src/nemo_intake_plugin/spans/api/evaluator_results.pyplugins/nemo-intake/src/nemo_intake_plugin/spans/api/evaluator_results_schemas.pyplugins/nemo-intake/src/nemo_intake_plugin/spans/api/query_filters.pyplugins/nemo-intake/src/nemo_intake_plugin/spans/api/spans.pyplugins/nemo-intake/src/nemo_intake_plugin/spans/api/spans_schemas.pyplugins/nemo-intake/src/nemo_intake_plugin/spans/api/traces.pyplugins/nemo-intake/src/nemo_intake_plugin/spans/api/traces_schemas.pyplugins/nemo-intake/src/nemo_intake_plugin/spans/clickhouse_client.pyplugins/nemo-intake/src/nemo_intake_plugin/spans/clickhouse_migrations.pyplugins/nemo-intake/src/nemo_intake_plugin/spans/domain.pyplugins/nemo-intake/src/nemo_intake_plugin/spans/evaluator_results_repository.pyplugins/nemo-intake/src/nemo_intake_plugin/spans/experiment_rollup_repository.pyplugins/nemo-intake/src/nemo_intake_plugin/spans/experiment_session_repository.pyplugins/nemo-intake/src/nemo_intake_plugin/spans/ingest/atif.pyplugins/nemo-intake/src/nemo_intake_plugin/spans/ingest/atif_domain.pyplugins/nemo-intake/src/nemo_intake_plugin/spans/ingest/atif_mapping.pyplugins/nemo-intake/src/nemo_intake_plugin/spans/ingest/chat_completions.pyplugins/nemo-intake/src/nemo_intake_plugin/spans/ingest/evaluation_context.pyplugins/nemo-intake/src/nemo_intake_plugin/spans/ingest/experiment_context_validation.pyplugins/nemo-intake/src/nemo_intake_plugin/spans/ingest/otlp.pyplugins/nemo-intake/src/nemo_intake_plugin/spans/service.pyplugins/nemo-intake/src/nemo_intake_plugin/spans/span_attribute_bags.pyplugins/nemo-intake/src/nemo_intake_plugin/spans/span_attribute_catalog.pyplugins/nemo-intake/src/nemo_intake_plugin/spans/span_repository.pyplugins/nemo-intake/src/nemo_intake_plugin/spans/span_semantic_attributes.pyplugins/nemo-intake/src/nemo_intake_plugin/spans/storage.pyplugins/nemo-intake/src/nemo_intake_plugin/spans/trace_repository.pyplugins/nemo-intake/tests/conftest.pyplugins/nemo-intake/tests/integration/spans/conftest.pyplugins/nemo-intake/tests/integration/spans/test_annotations_crud.pyplugins/nemo-intake/tests/integration/spans/test_atif_ingest.pyplugins/nemo-intake/tests/integration/spans/test_chat_completions_ingest.pyplugins/nemo-intake/tests/integration/spans/test_clickhouse_bootstrap.pyplugins/nemo-intake/tests/integration/spans/test_evaluator_results_atif.pyplugins/nemo-intake/tests/integration/spans/test_evaluator_results_crud.pyplugins/nemo-intake/tests/integration/spans/test_evaluator_results_filters.pyplugins/nemo-intake/tests/integration/spans/test_evaluator_results_loose_target.pyplugins/nemo-intake/tests/integration/spans/test_experiment_metric_sort.pyplugins/nemo-intake/tests/integration/spans/test_experiment_rollups.pyplugins/nemo-intake/tests/integration/spans/test_experiment_sessions.pyplugins/nemo-intake/tests/integration/spans/test_otlp_ingest_complex.pyplugins/nemo-intake/tests/integration/spans/test_otlp_ingest_limits.pyplugins/nemo-intake/tests/integration/spans/test_otlp_ingest_messages.pyplugins/nemo-intake/tests/integration/spans/test_otlp_ingest_simple.pyplugins/nemo-intake/tests/integration/spans/test_spans_read_filters.pyplugins/nemo-intake/tests/integration/spans/test_traces_read.pyplugins/nemo-intake/tests/integration/test_experiments_crud.pyplugins/nemo-intake/tests/integration/test_intake.pyplugins/nemo-intake/tests/test_atif_v17.pyplugins/nemo-intake/tests/test_authz.pyplugins/nemo-intake/tests/test_clickhouse_startup.pyplugins/nemo-intake/tests/test_client.pyplugins/nemo-intake/tests/test_config.pyplugins/nemo-intake/tests/test_dependencies.pyplugins/nemo-intake/tests/test_experiment_default_sort.pyplugins/nemo-intake/tests/test_experiment_metric_filter.pyplugins/nemo-intake/tests/test_experiment_optimization_fields.pyplugins/nemo-intake/tests/test_experiment_rollup_repository.pyplugins/nemo-intake/tests/test_experiment_session_schemas.pyplugins/nemo-intake/tests/test_experiment_sort.pyplugins/nemo-intake/tests/test_experiment_sort_endpoint.pyplugins/nemo-intake/tests/test_spans_clickhouse_client.pyplugins/nemo-intake/tests/test_spans_clickhouse_migrations.pyplugins/nemo-intake/tests/test_spans_clickhouse_repository.pyplugins/nemo-intake/tests/test_spans_otlp.pyplugins/nemo-intake/tests/test_spans_schemas.pyplugins/nemo-intake/tests/test_spans_span_attribute_catalog.pyplugins/nemo-intake/tests/test_spans_storage.pyplugins/nemo-intake/tests/test_traces_api.pyplugins/nemo-intake/tests/test_traces_clickhouse_repository.pypyproject.tomlpytest.iniservices/intake/mypy.iniservices/intake/src/nmp/intake/config.pyservices/intake/src/nmp/intake/main.pyservices/intake/src/nmp/intake/service.pyservices/intake/tests/conftest.pyservices/intake/tests/test_clickhouse_startup.pytests/agentic-use/intake-export-cli/environment/Dockerfilethird_party/osv-licenses.jsonthird_party/requirements-main.txttools/nemo-platform-sdk-tools/src/nemo_platform_sdk_tools/sdk/cli_generator/cli_config.yamltools/nemo-platform-sdk-tools/src/nemo_platform_sdk_tools/sdk/vendor/vendor_package.pyweb/packages/sdk/orval/constants.tsweb/packages/sdk/package.jsonweb/packages/studio/src/components/ExperimentGroupCreateModal/constants.tsweb/packages/studio/src/components/ExperimentGroupCreateModal/index.tsxweb/packages/studio/src/components/ExperimentGroupEditModal/index.tsxweb/packages/studio/src/components/IntakeDetail/IntakeComponents/AnnotationsPanel.tsxweb/packages/studio/src/components/IntakeDetail/IntakeComponents/IntakeTelemetryStatusBadge.tsxweb/packages/studio/src/components/IntakeDetail/IntakeComponents/SpanFeedbackControls.tsxweb/packages/studio/src/components/IntakeDetail/IntakeComponents/spanKeyValues.test.tsxweb/packages/studio/src/components/IntakeDetail/IntakeComponents/spanKeyValues.tsxweb/packages/studio/src/components/IntakeDetail/IntakeComponents/traceKeyValues.tsxweb/packages/studio/src/components/IntakeDetail/IntakeComponents/useSpanAnnotationActions.tsweb/packages/studio/src/components/IntakeDetail/README.mdweb/packages/studio/src/components/IntakeDetail/SpanMetadataAccordions.tsxweb/packages/studio/src/components/IntakeDetail/SpanTemplates/RerankerSpanContent.tsxweb/packages/studio/src/components/IntakeDetail/SpanTemplates/RetrieverSpanContent.tsxweb/packages/studio/src/components/IntakeDetail/SpanTemplates/rawAttributes.test.tsweb/packages/studio/src/components/IntakeDetail/SpanTemplates/rawAttributes.tsweb/packages/studio/src/components/IntakeDetail/SpanTemplates/registry.tsweb/packages/studio/src/components/IntakeDetail/SpanTemplates/templateFields.tsxweb/packages/studio/src/components/IntakeDetail/SpanTemplates/types.tsweb/packages/studio/src/components/IntakeDetail/TraceDetailSpanTree.tsxweb/packages/studio/src/components/IntakeDetail/TraceDetailSummaryHeader.tsxweb/packages/studio/src/components/IntakeDetail/TraceDetailView.tsxweb/packages/studio/src/components/IntakeDetail/TraceSpanAccordionContent.tsxweb/packages/studio/src/components/IntakeDetail/TraceSpanAccordions.tsxweb/packages/studio/src/components/IntakeDetail/TraceSpanListView.tsxweb/packages/studio/src/components/IntakeDetail/TraceSpanTreeView.tsxweb/packages/studio/src/components/IntakeLists/IntakeSpansTable.tsxweb/packages/studio/src/components/IntakeLists/IntakeTracesTable.tsxweb/packages/studio/src/components/SpanKindBadge/index.tsxweb/packages/studio/src/components/SpanKindBadge/spanKindConfig.tsweb/packages/studio/src/components/dataViews/ExperimentGroupDataView/index.tsxweb/packages/studio/src/components/dataViews/ExperimentGroupDataView/useExperimentGroupExperiments.test.tsweb/packages/studio/src/components/dataViews/ExperimentGroupDataView/useExperimentGroupExperiments.tsweb/packages/studio/src/components/dataViews/ExperimentGroupDataView/useSortErrorRecovery.test.tsweb/packages/studio/src/components/dataViews/ExperimentGroupDataView/useSortErrorRecovery.tsweb/packages/studio/src/components/dataViews/ExperimentSessionsDataView/index.tsxweb/packages/studio/src/mocks/handlers.tsweb/packages/studio/src/mocks/intake/telemetry.tsweb/packages/studio/src/routes/ExperimentDetailRoute/ExperimentDetailMetrics.tsxweb/packages/studio/src/routes/ExperimentDetailRoute/index.tsxweb/packages/studio/src/routes/ExperimentGroupDetailRoute/ExperimentGroupMetrics.tsxweb/packages/studio/src/routes/ExperimentGroupDetailRoute/index.tsxweb/packages/studio/src/routes/ExperimentRoute/ExperimentGroupCard.tsxweb/packages/studio/src/routes/ExperimentRoute/index.tsxweb/packages/studio/src/util/intakeTelemetry.test.tsweb/packages/studio/src/util/intakeTelemetry.ts
💤 Files with no reviewable changes (23)
- services/intake/tests/conftest.py
- services/intake/tests/test_clickhouse_startup.py
- services/intake/mypy.ini
- packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/intake/spans/evaluator_results.py
- packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/intake/ingest/otlp/v1/traces.py
- packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/intake/ingest/otlp/v1/init.py
- packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/intake/annotations.py
- packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/intake/traces.py
- packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/intake/ingest/otlp/init.py
- packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/intake/ingest/atif.py
- services/intake/src/nmp/intake/service.py
- docker/dockerfiles/services/intake/Dockerfile.bake
- packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/intake/ingest/init.py
- packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/intake/spans/groups.py
- packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/init.py
- services/intake/src/nmp/intake/config.py
- packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/intake/spans/init.py
- packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/intake/init.py
- services/intake/src/nmp/intake/main.py
- packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/intake/evaluator_results.py
- tools/nemo-platform-sdk-tools/src/nemo_platform_sdk_tools/sdk/cli_generator/cli_config.yaml
- packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/intake/ingest/chat_completions.py
- packages/nmp_platform_runner/src/nmp/platform_runner/registry.py
Signed-off-by: Brian Newsom <[email protected]>
|
@coderabbitai review |
✅ Action performedReview finished.
|
Signed-off-by: Brian Newsom <[email protected]>
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
services/core/auth/scripts/auth-tools.py (1)
481-494: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick winUse
known_openapi_endpointsfor missing-endpoint checks too.checkandupdatealready merge plugin OpenAPI for orphan/stale checks, but these loops still iterateopenapi_endpoints, so new plugin routes are never flagged or scaffolded.services/core/auth/scripts/auth-tools.py:481-494,751-777🤖 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 `@services/core/auth/scripts/auth-tools.py` around lines 481 - 494, The missing-endpoint scan still iterates over openapi_endpoints instead of the merged known_openapi_endpoints, so plugin routes are skipped during auth config checks and scaffolding. Update the missing-endpoint logic in auth-tools.py to use known_openapi_endpoints for the loop that builds missing, and make sure the update/scaffold path that relies on the same endpoint set also references the merged collection so plugin OpenAPI routes are included consistently.
🤖 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.
Outside diff comments:
In `@services/core/auth/scripts/auth-tools.py`:
- Around line 481-494: The missing-endpoint scan still iterates over
openapi_endpoints instead of the merged known_openapi_endpoints, so plugin
routes are skipped during auth config checks and scaffolding. Update the
missing-endpoint logic in auth-tools.py to use known_openapi_endpoints for the
loop that builds missing, and make sure the update/scaffold path that relies on
the same endpoint set also references the merged collection so plugin OpenAPI
routes are included consistently.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: f593ec72-fbd9-42ca-b56d-9034a5b12e9c
📒 Files selected for processing (5)
docker/base/Dockerfile.nmp-studio-uiplugins/nemo-evaluator/tests/intake/test_import_hygiene.pyplugins/nemo-intake/src/nemo_intake_plugin/service.pyplugins/nemo-intake/tests/test_clickhouse_startup.pyservices/core/auth/scripts/auth-tools.py
🚧 Files skipped from review as they are similar to previous changes (1)
- plugins/nemo-intake/src/nemo_intake_plugin/service.py
|
@coderabbitai The latest auth-tools finding is intentionally not applied. |
|
Tip For best results, initiate chat on the files or code changes.
✏️ Learnings added
|
|
Pausing this for now pending architectural input. |
Summary by CodeRabbit
New Features
Bug Fixes
Breaking Changes