Skip to content

chore(intake): Move intake to a plugin#616

Closed
BrianNewsom wants to merge 9 commits into
mainfrom
brnewsom/ase-90-pluginize-intake-service-for-nemo-platform-launch
Closed

chore(intake): Move intake to a plugin#616
BrianNewsom wants to merge 9 commits into
mainfrom
brnewsom/ase-90-pluginize-intake-service-for-nemo-platform-launch

Conversation

@BrianNewsom

@BrianNewsom BrianNewsom commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Summary by CodeRabbit

  • New Features

    • Added a plugin-based Intake surface with typed sync/async client support and a new SDK entry point.
    • Enabled Intake workflows for experiments, traces, spans, annotations, and evaluator results across backend and web UI.
    • Added route-derived authorization for Intake REST operations.
  • Bug Fixes

    • Improved Intake configuration compatibility with legacy environment variables and YAML.
    • Updated backend startup behavior and ClickHouse bootstrapping tests for clearer availability handling.
    • Adjusted public OpenAPI generation filtering for gated Intake paths.
  • Breaking Changes

    • Removed the standalone Intake service and the previous Intake CLI command set from top-level API adapters.

@BrianNewsom
BrianNewsom requested review from a team as code owners July 8, 2026 23:06
@BrianNewsom BrianNewsom changed the title Brnewsom/ase 90 pluginize intake service for nemo platform launch chore(intake): Move intake to a plugin Jul 8, 2026
@github-actions github-actions Bot added the chore label Jul 8, 2026
@github-actions

github-actions Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

@BrianNewsom
BrianNewsom force-pushed the brnewsom/ase-90-pluginize-intake-service-for-nemo-platform-launch branch from 8281951 to ad33379 Compare July 8, 2026 23:11
@coderabbitai

coderabbitai Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Intake 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 nemo-intake/nemo-intake-client instead of the old services/intake and platform intake surface.

Changes

Typed intake client

Layer / File(s) Summary
Client contracts and models
packages/nemo_intake_client/{pyproject.toml,README.md,src/nemo_intake_client/*}
Adds the new Intake client package, typed request/response models, and endpoint contracts for ATIF, evaluator results, traces, and experiment CRUD.
Client tests
packages/nemo_intake_client/tests/*
Adds import-hygiene tests that assert the package has no service entry points and does not pull in service-stack dependencies on import.

Plugin backend

Layer / File(s) Summary
Service, config, authz, and runtime
plugins/nemo-intake/src/nemo_intake_plugin/{service.py,config.py,authz.py,sdk.py,schema.py,spans/clickhouse_client.py}
Adds Intake service lifecycle, config/env compatibility, route authz stamping, plugin SDK resources, shared filter helpers, and process-local ClickHouse runtime state.
API, ingest, and repositories
plugins/nemo-intake/src/nemo_intake_plugin/{api,spans}/**
Moves Intake API and ingest modules to the plugin namespace, switches created_by handling to a request header dependency, and updates repository/runtime imports to the new plugin modules.
Plugin tests
plugins/nemo-intake/tests/**
Adds startup, config, authz, dependency, client, and ClickHouse tests; updates fixtures to use the new service factory and runtime wiring.
Plugin packaging, docs, and scripts
plugins/nemo-intake/{pyproject.toml,.dockerignore,README.md,examples/*,scripts/spans/*}
Renames the plugin package, updates build metadata, and repoints example/script/documentation paths and tracer names to plugins/nemo-intake.

Evaluator integration

Layer / File(s) Summary
Typed mapping and publish flow
plugins/nemo-evaluator/src/nemo_evaluator/intake/{mapping.py,publish.py}, plugins/nemo-evaluator/tests/intake/*, plugins/nemo-evaluator/tests/integration/*
Evaluator boundary mapping now returns Intake client models, publish flow uses AsyncIntakeClient, and the tests/fakes/integration paths follow the new request and trace APIs.
Evaluator packaging and hygiene
plugins/nemo-evaluator/pyproject.toml, plugins/nemo-evaluator/tests/intake/test_import_hygiene.py
Adds the slim Intake client dependency and updates import/dependency hygiene checks to enforce the new boundary.

Workspace, registries, and CLI/OpenAPI wiring

Layer / File(s) Summary
Registry and CLI deregistration
packages/nmp_platform_runner/..., packages/nemo_platform_ext/.../api/__init__.py, tools/nemo-platform-sdk-tools/.../cli_config.yaml
Removes Intake from service registries, top-level CLI entries, and CLI generator config.
Workspace, bundling, and build config
pyproject.toml, pytest.ini, packages/nemo_platform/pyproject.toml, tools/nemo-platform-sdk-tools/.../vendor_package.py, tests/agentic-use/.../Dockerfile, docs/fern/scripts/filter-public-openapi.mjs, .pulse-trufflehog-allowlist.json
Updates workspace membership, dependency groups, bundle entries, plugin entry points, OpenAPI filtering, and the allowlist path for the new plugin layout.

Studio frontend migration

Layer / File(s) Summary
SDK generation config
web/packages/sdk/orval/constants.ts, web/packages/sdk/package.json
Adds Intake SDK generation config and scripts.
Experiment and intake UI
web/packages/studio/src/{components, routes, mocks, util}/**
Switches experiment, span, trace, and annotation components/tests to the @nemo/sdk/generated/intake/* API and schema modules.

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
Loading
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
Loading

Possibly related PRs

Suggested labels: refactor
Suggested reviewers: mckornfield, shanaiabuggy

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title is concise and accurately summarizes the main change: moving intake into a plugin.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch brnewsom/ase-90-pluginize-intake-service-for-nemo-platform-launch

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor
Suite Lines Covered Line Rate Branch Rate
Unit Tests 23682/30865 76.7% 61.4%
Integration Tests 13964/29545 47.3% 19.9%

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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 win

Close forbidden-import bypasses.

The regex misses import os, httpx and from nmp import intake, so service/HTTP imports can evade this guard. Parse imports via ast instead.

🤖 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

📥 Commits

Reviewing files that changed from the base of the PR and between ae7e9fb and ad33379.

⛔ Files ignored due to path filters (162)
  • sdk/python/nemo-platform/.nmpcontext/openapi.yaml is excluded by !sdk/**
  • sdk/python/nemo-platform/.nmpcontext/stainless.yaml is excluded by !sdk/**
  • sdk/python/nemo-platform/api.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/_client.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/api/__init__.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/api/intake/__init__.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/api/intake/annotations.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/api/intake/evaluator_results.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/api/intake/ingest/__init__.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/api/intake/ingest/atif.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/api/intake/ingest/chat_completions.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/api/intake/ingest/otlp/__init__.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/api/intake/ingest/otlp/v1/__init__.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/api/intake/ingest/otlp/v1/traces.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/api/intake/spans/__init__.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/api/intake/spans/evaluator_results.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/api/intake/spans/groups.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/api/intake/traces.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/resources/experiment_groups/__init__.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/resources/experiment_groups/api.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/resources/experiment_groups/experiment_groups.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/resources/experiments/__init__.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/resources/experiments/api.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/resources/experiments/experiments.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/resources/experiments/sessions.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/resources/intake/__init__.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/resources/intake/annotations.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/resources/intake/api.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/resources/intake/evaluator_results.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/resources/intake/ingest/__init__.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/resources/intake/ingest/atif.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/resources/intake/ingest/chat_completions.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/resources/intake/ingest/ingest.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/resources/intake/ingest/otlp/__init__.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/resources/intake/ingest/otlp/otlp.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/resources/intake/ingest/otlp/v1/__init__.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/resources/intake/ingest/otlp/v1/traces.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/resources/intake/ingest/otlp/v1/v1.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/resources/intake/intake.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/resources/intake/spans/__init__.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/resources/intake/spans/evaluator_results.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/resources/intake/spans/groups.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/resources/intake/spans/spans.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/resources/intake/traces.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/__init__.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/experiment_group_create_params.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/experiment_group_filter_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/experiment_group_list_params.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/experiment_group_response.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/experiment_group_responses_page.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/experiment_group_update_params.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiments/__init__.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiments/evaluator_aggregate.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiments/experiment_create_params.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiments/experiment_filter_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiments/experiment_list_params.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiments/experiment_response.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiments/experiment_responses_page.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiments/experiment_session_filter_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiments/experiment_session_response.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiments/experiment_session_responses_page.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiments/experiment_update_params.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiments/metric_stat_filters_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiments/number_filter_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiments/session_list_params.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/__init__.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/annotation.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/annotation_create_params.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/annotation_filter_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/annotation_kind.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/annotation_list_params.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/annotation_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/annotation_sort_field.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/annotations_page.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/evaluation_context_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/evaluator_result.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/evaluator_result_create_params.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/evaluator_result_data_type.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/evaluator_result_filter_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/evaluator_result_list_params.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/evaluator_result_sort_field.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/evaluator_results_page.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/experiment_context.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/experiment_context_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/feedback_annotation.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/feedback_annotation_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/float_filter_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/__init__.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/atif_agent_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/atif_content_part_image_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/atif_content_part_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/atif_content_part_text_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/atif_create_params.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/atif_final_metrics_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/atif_image_source_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/atif_metrics_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/atif_observation_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/atif_observation_result_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/atif_step_agent_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/atif_step_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/atif_step_system_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/atif_step_user_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/atif_subagent_trajectory_ref_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/atif_tool_call_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/captured_chat_completions_request_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/captured_chat_completions_response_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/captured_chat_message_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/chat_completion_create_params.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/chat_completions_ingest_response.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/chat_message_role.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/otlp/__init__.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/otlp/v1/__init__.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/ingest/otlp/v1/ingest_response.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/label_annotation.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/label_annotation_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/metadata_annotation.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/metadata_annotation_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/note_annotation.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/note_annotation_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/numeric_filter_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/span.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/span_evaluation_context.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/span_filter_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/span_kind.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/span_list_params.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/span_sort_field.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/span_status.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/spans/__init__.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/spans/evaluator_result_list_response.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/spans/group_list_params.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/spans/span_group.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/spans/span_group_by.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/spans/span_group_sort_field.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/spans/span_groups_page.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/spans_page.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/trace.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/trace_filter_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/trace_list_params.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/trace_retrieve_params.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/trace_sort_field.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/intake/traces_page.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/api_resources/experiment_groups/__init__.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/api_resources/experiments/__init__.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/api_resources/experiments/test_sessions.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/api_resources/intake/__init__.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/api_resources/intake/ingest/__init__.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/api_resources/intake/ingest/otlp/__init__.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/api_resources/intake/ingest/otlp/v1/__init__.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/api_resources/intake/ingest/otlp/v1/test_traces.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/api_resources/intake/ingest/test_atif.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/api_resources/intake/ingest/test_chat_completions.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/api_resources/intake/spans/__init__.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/api_resources/intake/spans/test_evaluator_results.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/api_resources/intake/spans/test_groups.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/api_resources/intake/test_annotations.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/api_resources/intake/test_evaluator_results.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/api_resources/intake/test_spans.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/api_resources/intake/test_traces.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/api_resources/test_experiment_groups.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/api_resources/test_experiments.py is excluded by !sdk/**
  • sdk/stainless.yaml is excluded by !sdk/**
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (193)
  • .pulse-trufflehog-allowlist.json
  • docker/dockerfiles/services/intake/Dockerfile.bake
  • docs/fern/scripts/filter-public-openapi.mjs
  • openapi/ga/individual/platform.openapi.yaml
  • openapi/ga/openapi.yaml
  • openapi/openapi.yaml
  • packages/nemo_intake_client/README.md
  • packages/nemo_intake_client/pyproject.toml
  • packages/nemo_intake_client/src/nemo_intake_client/client.py
  • packages/nemo_intake_client/src/nemo_intake_client/endpoints.py
  • packages/nemo_intake_client/src/nemo_intake_client/models.py
  • packages/nemo_intake_client/tests/test_import_hygiene.py
  • packages/nemo_platform/pyproject.toml
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/__init__.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/intake/__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/evaluator_results.py
  • 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/ingest/atif.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/intake/ingest/chat_completions.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/otlp/v1/__init__.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/spans/__init__.py
  • 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/spans/groups.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/intake/traces.py
  • packages/nmp_platform_runner/src/nmp/platform_runner/registry.py
  • packages/nmp_platform_runner/tests/test_registry.py
  • plugins/nemo-evaluator/pyproject.toml
  • plugins/nemo-evaluator/src/nemo_evaluator/intake/mapping.py
  • plugins/nemo-evaluator/src/nemo_evaluator/intake/publish.py
  • plugins/nemo-evaluator/tests/intake/test_import_hygiene.py
  • plugins/nemo-evaluator/tests/intake/test_mapping.py
  • plugins/nemo-evaluator/tests/intake/test_publish.py
  • plugins/nemo-evaluator/tests/integration/test_publish_to_intake.py
  • plugins/nemo-intake/.dockerignore
  • plugins/nemo-intake/README.md
  • plugins/nemo-intake/examples/send_langchain_openinference_agent.py
  • plugins/nemo-intake/examples/send_nemo_flow_openinference_agent.py
  • plugins/nemo-intake/examples/send_otel_sample.py
  • plugins/nemo-intake/openapi/openapi.yaml
  • plugins/nemo-intake/pyproject.toml
  • plugins/nemo-intake/pytest.ini
  • plugins/nemo-intake/scripts/spans/run_clickhouse.sh
  • plugins/nemo-intake/scripts/spans/seed_experiment_rollup_data.py
  • plugins/nemo-intake/scripts/spans/seed_experiments_demo.py
  • plugins/nemo-intake/scripts/spans/seed_span_type_showcase.py
  • plugins/nemo-intake/src/nemo_intake_plugin/__init__.py
  • plugins/nemo-intake/src/nemo_intake_plugin/api/__init__.py
  • plugins/nemo-intake/src/nemo_intake_plugin/api/v2/experiments/endpoints.py
  • plugins/nemo-intake/src/nemo_intake_plugin/api/v2/experiments/schemas.py
  • plugins/nemo-intake/src/nemo_intake_plugin/authz.py
  • plugins/nemo-intake/src/nemo_intake_plugin/config.py
  • plugins/nemo-intake/src/nemo_intake_plugin/entities/experiments.py
  • plugins/nemo-intake/src/nemo_intake_plugin/schema.py
  • plugins/nemo-intake/src/nemo_intake_plugin/sdk.py
  • plugins/nemo-intake/src/nemo_intake_plugin/service.py
  • plugins/nemo-intake/src/nemo_intake_plugin/spans/annotations_repository.py
  • plugins/nemo-intake/src/nemo_intake_plugin/spans/api/annotations.py
  • plugins/nemo-intake/src/nemo_intake_plugin/spans/api/annotations_schemas.py
  • plugins/nemo-intake/src/nemo_intake_plugin/spans/api/dependencies.py
  • plugins/nemo-intake/src/nemo_intake_plugin/spans/api/evaluator_results.py
  • plugins/nemo-intake/src/nemo_intake_plugin/spans/api/evaluator_results_schemas.py
  • plugins/nemo-intake/src/nemo_intake_plugin/spans/api/query_filters.py
  • plugins/nemo-intake/src/nemo_intake_plugin/spans/api/spans.py
  • plugins/nemo-intake/src/nemo_intake_plugin/spans/api/spans_schemas.py
  • plugins/nemo-intake/src/nemo_intake_plugin/spans/api/traces.py
  • plugins/nemo-intake/src/nemo_intake_plugin/spans/api/traces_schemas.py
  • plugins/nemo-intake/src/nemo_intake_plugin/spans/clickhouse_client.py
  • plugins/nemo-intake/src/nemo_intake_plugin/spans/clickhouse_migrations.py
  • plugins/nemo-intake/src/nemo_intake_plugin/spans/domain.py
  • plugins/nemo-intake/src/nemo_intake_plugin/spans/evaluator_results_repository.py
  • plugins/nemo-intake/src/nemo_intake_plugin/spans/experiment_rollup_repository.py
  • plugins/nemo-intake/src/nemo_intake_plugin/spans/experiment_session_repository.py
  • plugins/nemo-intake/src/nemo_intake_plugin/spans/ingest/atif.py
  • plugins/nemo-intake/src/nemo_intake_plugin/spans/ingest/atif_domain.py
  • plugins/nemo-intake/src/nemo_intake_plugin/spans/ingest/atif_mapping.py
  • plugins/nemo-intake/src/nemo_intake_plugin/spans/ingest/chat_completions.py
  • plugins/nemo-intake/src/nemo_intake_plugin/spans/ingest/evaluation_context.py
  • plugins/nemo-intake/src/nemo_intake_plugin/spans/ingest/experiment_context_validation.py
  • plugins/nemo-intake/src/nemo_intake_plugin/spans/ingest/otlp.py
  • plugins/nemo-intake/src/nemo_intake_plugin/spans/service.py
  • plugins/nemo-intake/src/nemo_intake_plugin/spans/span_attribute_bags.py
  • plugins/nemo-intake/src/nemo_intake_plugin/spans/span_attribute_catalog.py
  • plugins/nemo-intake/src/nemo_intake_plugin/spans/span_repository.py
  • plugins/nemo-intake/src/nemo_intake_plugin/spans/span_semantic_attributes.py
  • plugins/nemo-intake/src/nemo_intake_plugin/spans/storage.py
  • plugins/nemo-intake/src/nemo_intake_plugin/spans/trace_repository.py
  • plugins/nemo-intake/tests/conftest.py
  • plugins/nemo-intake/tests/integration/spans/conftest.py
  • plugins/nemo-intake/tests/integration/spans/test_annotations_crud.py
  • plugins/nemo-intake/tests/integration/spans/test_atif_ingest.py
  • plugins/nemo-intake/tests/integration/spans/test_chat_completions_ingest.py
  • plugins/nemo-intake/tests/integration/spans/test_clickhouse_bootstrap.py
  • plugins/nemo-intake/tests/integration/spans/test_evaluator_results_atif.py
  • plugins/nemo-intake/tests/integration/spans/test_evaluator_results_crud.py
  • plugins/nemo-intake/tests/integration/spans/test_evaluator_results_filters.py
  • plugins/nemo-intake/tests/integration/spans/test_evaluator_results_loose_target.py
  • plugins/nemo-intake/tests/integration/spans/test_experiment_metric_sort.py
  • plugins/nemo-intake/tests/integration/spans/test_experiment_rollups.py
  • plugins/nemo-intake/tests/integration/spans/test_experiment_sessions.py
  • plugins/nemo-intake/tests/integration/spans/test_otlp_ingest_complex.py
  • plugins/nemo-intake/tests/integration/spans/test_otlp_ingest_limits.py
  • plugins/nemo-intake/tests/integration/spans/test_otlp_ingest_messages.py
  • plugins/nemo-intake/tests/integration/spans/test_otlp_ingest_simple.py
  • plugins/nemo-intake/tests/integration/spans/test_spans_read_filters.py
  • plugins/nemo-intake/tests/integration/spans/test_traces_read.py
  • plugins/nemo-intake/tests/integration/test_experiments_crud.py
  • plugins/nemo-intake/tests/integration/test_intake.py
  • plugins/nemo-intake/tests/test_atif_v17.py
  • plugins/nemo-intake/tests/test_authz.py
  • plugins/nemo-intake/tests/test_clickhouse_startup.py
  • plugins/nemo-intake/tests/test_client.py
  • plugins/nemo-intake/tests/test_config.py
  • plugins/nemo-intake/tests/test_dependencies.py
  • plugins/nemo-intake/tests/test_experiment_default_sort.py
  • plugins/nemo-intake/tests/test_experiment_metric_filter.py
  • plugins/nemo-intake/tests/test_experiment_optimization_fields.py
  • plugins/nemo-intake/tests/test_experiment_rollup_repository.py
  • plugins/nemo-intake/tests/test_experiment_session_schemas.py
  • plugins/nemo-intake/tests/test_experiment_sort.py
  • plugins/nemo-intake/tests/test_experiment_sort_endpoint.py
  • plugins/nemo-intake/tests/test_spans_clickhouse_client.py
  • plugins/nemo-intake/tests/test_spans_clickhouse_migrations.py
  • plugins/nemo-intake/tests/test_spans_clickhouse_repository.py
  • plugins/nemo-intake/tests/test_spans_otlp.py
  • plugins/nemo-intake/tests/test_spans_schemas.py
  • plugins/nemo-intake/tests/test_spans_span_attribute_catalog.py
  • plugins/nemo-intake/tests/test_spans_storage.py
  • plugins/nemo-intake/tests/test_traces_api.py
  • plugins/nemo-intake/tests/test_traces_clickhouse_repository.py
  • pyproject.toml
  • pytest.ini
  • services/intake/mypy.ini
  • services/intake/src/nmp/intake/config.py
  • services/intake/src/nmp/intake/main.py
  • services/intake/src/nmp/intake/service.py
  • services/intake/tests/conftest.py
  • services/intake/tests/test_clickhouse_startup.py
  • tests/agentic-use/intake-export-cli/environment/Dockerfile
  • third_party/osv-licenses.json
  • third_party/requirements-main.txt
  • tools/nemo-platform-sdk-tools/src/nemo_platform_sdk_tools/sdk/cli_generator/cli_config.yaml
  • tools/nemo-platform-sdk-tools/src/nemo_platform_sdk_tools/sdk/vendor/vendor_package.py
  • web/packages/sdk/orval/constants.ts
  • web/packages/sdk/package.json
  • web/packages/studio/src/components/ExperimentGroupCreateModal/constants.ts
  • web/packages/studio/src/components/ExperimentGroupCreateModal/index.tsx
  • web/packages/studio/src/components/ExperimentGroupEditModal/index.tsx
  • web/packages/studio/src/components/IntakeDetail/IntakeComponents/AnnotationsPanel.tsx
  • web/packages/studio/src/components/IntakeDetail/IntakeComponents/IntakeTelemetryStatusBadge.tsx
  • web/packages/studio/src/components/IntakeDetail/IntakeComponents/SpanFeedbackControls.tsx
  • web/packages/studio/src/components/IntakeDetail/IntakeComponents/spanKeyValues.test.tsx
  • web/packages/studio/src/components/IntakeDetail/IntakeComponents/spanKeyValues.tsx
  • web/packages/studio/src/components/IntakeDetail/IntakeComponents/traceKeyValues.tsx
  • web/packages/studio/src/components/IntakeDetail/IntakeComponents/useSpanAnnotationActions.ts
  • web/packages/studio/src/components/IntakeDetail/README.md
  • web/packages/studio/src/components/IntakeDetail/SpanMetadataAccordions.tsx
  • web/packages/studio/src/components/IntakeDetail/SpanTemplates/RerankerSpanContent.tsx
  • web/packages/studio/src/components/IntakeDetail/SpanTemplates/RetrieverSpanContent.tsx
  • web/packages/studio/src/components/IntakeDetail/SpanTemplates/rawAttributes.test.ts
  • web/packages/studio/src/components/IntakeDetail/SpanTemplates/rawAttributes.ts
  • web/packages/studio/src/components/IntakeDetail/SpanTemplates/registry.ts
  • web/packages/studio/src/components/IntakeDetail/SpanTemplates/templateFields.tsx
  • web/packages/studio/src/components/IntakeDetail/SpanTemplates/types.ts
  • web/packages/studio/src/components/IntakeDetail/TraceDetailSpanTree.tsx
  • web/packages/studio/src/components/IntakeDetail/TraceDetailSummaryHeader.tsx
  • web/packages/studio/src/components/IntakeDetail/TraceDetailView.tsx
  • web/packages/studio/src/components/IntakeDetail/TraceSpanAccordionContent.tsx
  • web/packages/studio/src/components/IntakeDetail/TraceSpanAccordions.tsx
  • web/packages/studio/src/components/IntakeDetail/TraceSpanListView.tsx
  • web/packages/studio/src/components/IntakeDetail/TraceSpanTreeView.tsx
  • web/packages/studio/src/components/IntakeLists/IntakeSpansTable.tsx
  • web/packages/studio/src/components/IntakeLists/IntakeTracesTable.tsx
  • web/packages/studio/src/components/SpanKindBadge/index.tsx
  • web/packages/studio/src/components/SpanKindBadge/spanKindConfig.ts
  • web/packages/studio/src/components/dataViews/ExperimentGroupDataView/index.tsx
  • web/packages/studio/src/components/dataViews/ExperimentGroupDataView/useExperimentGroupExperiments.test.ts
  • web/packages/studio/src/components/dataViews/ExperimentGroupDataView/useExperimentGroupExperiments.ts
  • web/packages/studio/src/components/dataViews/ExperimentGroupDataView/useSortErrorRecovery.test.ts
  • web/packages/studio/src/components/dataViews/ExperimentGroupDataView/useSortErrorRecovery.ts
  • web/packages/studio/src/components/dataViews/ExperimentSessionsDataView/index.tsx
  • web/packages/studio/src/mocks/handlers.ts
  • web/packages/studio/src/mocks/intake/telemetry.ts
  • web/packages/studio/src/routes/ExperimentDetailRoute/ExperimentDetailMetrics.tsx
  • web/packages/studio/src/routes/ExperimentDetailRoute/index.tsx
  • web/packages/studio/src/routes/ExperimentGroupDetailRoute/ExperimentGroupMetrics.tsx
  • web/packages/studio/src/routes/ExperimentGroupDetailRoute/index.tsx
  • web/packages/studio/src/routes/ExperimentRoute/ExperimentGroupCard.tsx
  • web/packages/studio/src/routes/ExperimentRoute/index.tsx
  • web/packages/studio/src/util/intakeTelemetry.test.ts
  • web/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

Comment thread plugins/nemo-intake/src/nemo_intake_plugin/service.py Outdated
@BrianNewsom

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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 win

Use known_openapi_endpoints for missing-endpoint checks too. check and update already merge plugin OpenAPI for orphan/stale checks, but these loops still iterate openapi_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

📥 Commits

Reviewing files that changed from the base of the PR and between ad33379 and ea846b4.

📒 Files selected for processing (5)
  • docker/base/Dockerfile.nmp-studio-ui
  • plugins/nemo-evaluator/tests/intake/test_import_hygiene.py
  • plugins/nemo-intake/src/nemo_intake_plugin/service.py
  • plugins/nemo-intake/tests/test_clickhouse_startup.py
  • services/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

@BrianNewsom

Copy link
Copy Markdown
Contributor Author

@coderabbitai The latest auth-tools finding is intentionally not applied. openapi_endpoints is the platform spec and is the source for required/scaffolded static-auth entries. Plugin authorization is derived from @path_rule and merged by the runtime bundle / sync-plugins; known_openapi_endpoints includes plugin specs only for orphan and stale-opt-out checks so materialized plugin entries are not deleted. Iterating known_openapi_endpoints for missing entries currently produces 150 false failures across agents (60), evaluator (40), deployments (14), safe-synthesizer (14), auditor (11), and data-designer (11). Intake has no missing entries.

@coderabbitai

coderabbitai Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

@BrianNewsom Understood, makes sense — openapi_endpoints stays the source of truth for required entries, known_openapi_endpoints is scoped to orphan/stale-opt-out checks only. Thanks for the clarification.


✏️ Learnings added
Learnt from: BrianNewsom
URL: https://github.com/NVIDIA-NeMo/nemo-platform/pull/616

Timestamp: 2026-07-09T00:52:03.641Z
Learning: In `services/core/auth/scripts/auth-tools.py`, the platform's `openapi_endpoints` (main OpenAPI spec) is the source of truth for required/scaffolded static-auth entries. `known_openapi_endpoints` (merged main + plugin OpenAPI specs via `extract_plugin_openapi_endpoints`/`merge_openapi_endpoints`) must only be used for orphan-detection and stale `x-not-in-openapi` opt-out checks — never for detecting missing static-auth entries — because plugin authorization is derived from `path_rule` decorators and merged at runtime via the bundle/`sync-plugins` mechanism, not scaffolded into the static auth config. Iterating `known_openapi_endpoints` for missing entries produces false failures across plugins (e.g., agents, evaluator, deployments, safe-synthesizer, auditor, data-designer).

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.

@BrianNewsom BrianNewsom closed this Jul 9, 2026
@BrianNewsom

Copy link
Copy Markdown
Contributor Author

Pausing this for now pending architectural input.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant