Skip to content

fix(customizer): resolve metadata drift in model upload - #756

Merged
soluwalana merged 3 commits into
mainfrom
solu/fix-model-upload
Jul 17, 2026
Merged

fix(customizer): resolve metadata drift in model upload#756
soluwalana merged 3 commits into
mainfrom
solu/fix-model-upload

Conversation

@soluwalana

@soluwalana soluwalana commented Jul 17, 2026

Copy link
Copy Markdown
Contributor

Summary by CodeRabbit

  • New Features

    • Upload metadata now preserves model tool-calling settings, including chat templates and parser configuration.
    • Metadata is derived consistently from the model configuration across supported job types.
  • Bug Fixes

    • Improved fileset metadata validation and handling when model configuration is missing or incomplete.
    • Prevented incorrectly structured tool-calling metadata from being accepted.

@soluwalana
soluwalana requested review from a team as code owners July 17, 2026 15:20
@github-actions github-actions Bot added the fix label Jul 17, 2026
@coderabbitai

coderabbitai Bot commented Jul 17, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Changes

Model upload metadata now comes from model-entity tool-calling configuration. Shared helpers replace flat metadata construction, and Automodel, RL, and Unsloth compilers use the new fileset metadata shape with updated tests.

Model fileset metadata propagation

Layer / File(s) Summary
Shared fileset metadata helpers and validation
packages/nmp_customization_common/src/.../file_io_metadata.py, packages/nmp_customization_common/tests/tasks/test_file_io_metadata.py
Adds extraction and wrapping helpers for chat_template and tool-calling fields, removes build_output_metadata, and validates the nested schema shape.
Automodel upload metadata integration
services/automodel/src/.../jobs/compiler.py
Removes the local metadata builder and uses the shared model-entity helper for upload metadata.
RL and Unsloth upload metadata integration
services/rl/src/.../jobs/compiler.py, services/rl/tests/test_compiler.py, services/unsloth/src/.../jobs/compiler.py, services/unsloth/tests/test_compiler_validation_path.py
Updates upload builders to accept ModelEntity instances and adjusts expectations for missing tool-calling metadata.

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 23.90% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: fixing metadata drift in model upload.
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 unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch solu/fix-model-upload

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

@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.

🧹 Nitpick comments (2)
services/rl/tests/test_compiler.py (1)

221-221: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Test the populated metadata path.

  • services/rl/tests/test_compiler.py#L221-L221: configure the model fixture with spec.chat_template or spec.tool_call_config and assert the nested {"model": {"tool_calling": ...}} upload metadata.
  • services/unsloth/tests/test_compiler_validation_path.py#L125-L125: add spec metadata to the mocked entity and assert its propagation instead of only the no-spec path.
🤖 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/rl/tests/test_compiler.py` at line 221, Extend the compiler tests to
cover populated metadata: in services/rl/tests/test_compiler.py at lines
221-221, configure the model fixture with spec.chat_template or
spec.tool_call_config and assert nested {"model": {"tool_calling": ...}} upload
metadata; in services/unsloth/tests/test_compiler_validation_path.py at lines
125-125, add spec metadata to the mocked entity and assert that it propagates
instead of only validating the no-spec path.
packages/nmp_customization_common/src/nmp/customization_common/tasks/file_io_metadata.py (1)

6-42: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Type these helpers and the upload config arg.

  • packages/nmp_customization_common/src/nmp/customization_common/tasks/file_io_metadata.py: replace Any/bare dict with ModelEntity (or a narrow protocol) and typed metadata mappings.
  • services/rl/src/nmp/rl/app/jobs/compiler.py: annotate me as ModelEntity to match the download path.
🤖 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
`@packages/nmp_customization_common/src/nmp/customization_common/tasks/file_io_metadata.py`
around lines 6 - 42, The helpers extract_tool_calling_metadata,
build_model_fileset_metadata, and
build_output_fileset_metadata_from_model_entity currently use Any and
unparameterized dict types; replace them with ModelEntity (or a narrow protocol)
and precise typed metadata mappings, preserving existing behavior. In
services/rl/src/nmp/rl/app/jobs/compiler.py lines 124-130, annotate the upload
configuration variable me as ModelEntity to match the download path.

Source: Coding guidelines

🤖 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.

Nitpick comments:
In
`@packages/nmp_customization_common/src/nmp/customization_common/tasks/file_io_metadata.py`:
- Around line 6-42: The helpers extract_tool_calling_metadata,
build_model_fileset_metadata, and
build_output_fileset_metadata_from_model_entity currently use Any and
unparameterized dict types; replace them with ModelEntity (or a narrow protocol)
and precise typed metadata mappings, preserving existing behavior. In
services/rl/src/nmp/rl/app/jobs/compiler.py lines 124-130, annotate the upload
configuration variable me as ModelEntity to match the download path.

In `@services/rl/tests/test_compiler.py`:
- Line 221: Extend the compiler tests to cover populated metadata: in
services/rl/tests/test_compiler.py at lines 221-221, configure the model fixture
with spec.chat_template or spec.tool_call_config and assert nested {"model":
{"tool_calling": ...}} upload metadata; in
services/unsloth/tests/test_compiler_validation_path.py at lines 125-125, add
spec metadata to the mocked entity and assert that it propagates instead of only
validating the no-spec path.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 10cad0b5-c76e-4dca-b644-ee97a15029e4

📥 Commits

Reviewing files that changed from the base of the PR and between 19d3199 and ce2ba39.

📒 Files selected for processing (7)
  • packages/nmp_customization_common/src/nmp/customization_common/tasks/file_io_metadata.py
  • packages/nmp_customization_common/tests/tasks/test_file_io_metadata.py
  • services/automodel/src/nmp/automodel/app/jobs/compiler.py
  • services/rl/src/nmp/rl/app/jobs/compiler.py
  • services/rl/tests/test_compiler.py
  • services/unsloth/src/nmp/unsloth/app/jobs/compiler.py
  • services/unsloth/tests/test_compiler_validation_path.py

@github-actions

github-actions Bot commented Jul 17, 2026

Copy link
Copy Markdown
Contributor
Suite Lines Covered Line Rate Branch Rate
Unit Tests 25534/32751 78.0% 62.6%
Integration Tests 14732/31400 46.9% 19.2%

@soluwalana
soluwalana enabled auto-merge July 17, 2026 15:31
Comment thread services/automodel/src/nmp/automodel/app/jobs/compiler.py Outdated
@soluwalana
soluwalana force-pushed the solu/fix-model-upload branch from 4fbae79 to 30bce98 Compare July 17, 2026 16:32
@soluwalana
soluwalana requested a review from a team as a code owner July 17, 2026 16:32

@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: 9

🧹 Nitpick comments (5)
plugins/nemo-evaluator/src/nemo_evaluator/intake/mapping.py (1)

72-79: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider renaming experiment_id parameter to evaluation_id.

The function is named run_task_to_evaluation_context and outputs evaluation_id, but the parameter is still experiment_id. The docstring explains the mapping, but renaming the parameter would reduce cognitive load once all callers are updated.

🤖 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/src/nemo_evaluator/intake/mapping.py` around lines 72
- 79, Rename the experiment_id parameter in run_task_to_evaluation_context to
evaluation_id, update all callers and keyword arguments accordingly, and
preserve the returned evaluation_context mapping with evaluation_id set from the
renamed parameter.
services/intake/src/nmp/intake/api/v2/experiments/endpoints.py (1)

666-674: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Endpoint description hardcodes "300" instead of using INTAKE_PREVIEW_PAYLOAD_CHAR_LIMIT.

The schema field descriptions in schemas.py use INTAKE_PREVIEW_PAYLOAD_CHAR_LIMIT for the truncation limit, but this endpoint description hardcodes "300 characters". If the constant changes, the OpenAPI description here will be out of sync.

♻️ Suggested fix
         mode: EvaluationSessionMode = Query(
             default="detailed",
             description=(
-                "Response mode. summary omits root-span input and output; preview includes both truncated to "
-                "300 characters; detailed returns full root-span payloads."
+                f"Response mode. summary omits root-span input and output; preview includes both truncated to "
+                f"{INTAKE_PREVIEW_PAYLOAD_CHAR_LIMIT} characters; detailed returns full root-span payloads."
             ),
         ),
🤖 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/intake/src/nmp/intake/api/v2/experiments/endpoints.py` around lines
666 - 674, Update the mode Query description in the endpoint definition to
interpolate or otherwise reuse INTAKE_PREVIEW_PAYLOAD_CHAR_LIMIT instead of
hardcoding “300”, keeping the existing summary, preview, and detailed behavior
wording unchanged.
services/intake/src/nmp/intake/spans/api/spans_schemas.py (1)

122-124: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

SPAN_SUMMARY_ERROR_MESSAGE_CHAR_LIMIT name is now misleading.

This constant is used for truncation in both summary and preview modes (via _error_message_for_mode with compact=True), but its name only references "summary". Consider renaming to SPAN_COMPACT_ERROR_MESSAGE_CHAR_LIMIT for clarity.

Also applies to: 246-249

🤖 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/intake/src/nmp/intake/spans/api/spans_schemas.py` around lines 122 -
124, Rename SPAN_SUMMARY_ERROR_MESSAGE_CHAR_LIMIT to
SPAN_COMPACT_ERROR_MESSAGE_CHAR_LIMIT throughout the spans schema and
error-message formatting code, including _error_message_for_mode and its
documentation, while preserving the existing truncation behavior for both
summary and preview modes.
web/packages/studio/src/components/sidePanels/AgentPanels/AgentPanel/index.tsx (1)

111-112: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider a type guard instead of as assertion, and note format coverage gap.

The agent?.config as AgentConfig | undefined assertion bypasses type checking. Per coding guidelines, prefer type guards over assertions. Additionally, AgentConfig only models the legacy nat-workflow-v1 format (llms.model_name); agents using the new nemo-agents-spec-v1 format (with harnesses/models instead of llms) will silently show no model names. This degrades gracefully but is a feature gap worth tracking.

🤖 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
`@web/packages/studio/src/components/sidePanels/AgentPanels/AgentPanel/index.tsx`
around lines 111 - 112, Replace the unchecked assertion in the agentModelNames
initialization with a type guard that validates the configuration before passing
it to getAgentModelNames. Extend the configuration/model-name handling to
support nemo-agents-spec-v1 agents using harnesses and models, while preserving
legacy nat-workflow-v1 support and graceful empty results for unsupported
configurations.

Source: Coding guidelines

web/packages/studio/src/components/dataViews/JobsDataView/index.tsx (1)

116-128: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Ref mutation during render.

seenSourcesRef.current.add(job.source) mutates a ref during render. While safe in practice (idempotent Set.add), React advises against writing refs during render. Consider computing the accumulated set in useMemo keyed on jobsData?.data and storing it in the ref inside an effect, or deriving mergedSourceOptions purely from current data + a useMemo-cached accumulation.

♻️ Optional refactor: derive seen sources without render-time ref mutation
-  // Surface plugin sources not in the static list (e.g. nemo-agents-plugin).
-  const seenSourcesRef = useRef<Set<string>>(new Set());
-  for (const job of jobsData?.data ?? []) {
-    if (job.source) seenSourcesRef.current.add(job.source);
-  }
-
-  const staticSourceValues = new Set(sourceFilterOptions.map((option) => option.value));
-  const dynamicSourceOptions = [...seenSourcesRef.current]
-    .filter((source) => !staticSourceValues.has(source) && !hiddenJobSources.includes(source))
-    .sort()
-    .map((source) => ({ label: SOURCE_DISPLAY[source]?.label ?? source, value: source }));
+  // Surface plugin sources not in the static list (e.g. nemo-agents-plugin).
+  const seenSourcesRef = useRef<Set<string>>(new Set());
+  const currentSources = useMemo(
+    () => {
+      const next = new Set(seenSourcesRef.current);
+      for (const job of jobsData?.data ?? []) {
+        if (job.source) next.add(job.source);
+      }
+      return next;
+    },
+    [jobsData?.data]
+  );
+  useEffect(() => {
+    seenSourcesRef.current = currentSources;
+  }, [currentSources]);
+
+  const staticSourceValues = new Set(sourceFilterOptions.map((option) => option.value));
+  const dynamicSourceOptions = [...currentSources]
+    .filter((source) => !staticSourceValues.has(source) && !hiddenJobSources.includes(source))
+    .sort()
+    .map((source) => ({ label: SOURCE_DISPLAY[source]?.label ?? source, value: source }));
🤖 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 `@web/packages/studio/src/components/dataViews/JobsDataView/index.tsx` around
lines 116 - 128, Remove the render-time mutation of seenSourcesRef in the
JobsDataView source-option logic. Derive the accumulated source set with useMemo
keyed on jobsData?.data, then update the ref from an effect if retaining the ref
is necessary; ensure mergedSourceOptions is computed from the current data and
accumulated sources without writing to the ref during render.
🤖 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 @.github/workflows/ci.yaml:
- Around line 1213-1214: Update the checkout step using actions/checkout in the
workflow to set persist-credentials to false, matching the secure configuration
used by the other checkout steps. Keep the existing pinned action reference
unchanged.

In `@docs/agents/deploy-agents.mdx`:
- Around line 362-364: Update the documented `uv run nemo services run` command
to bind port 8080 only to the Docker bridge gateway/interface instead of
`0.0.0.0`. Preserve the existing port and service invocation while replacing the
host value with the bridge-specific address.

In `@plugins/nemo-agents/src/nemo_agents_plugin/fabric/README.md`:
- Around line 1-22: Restructure the Fabric Config Boundary README as an
EXPLANATION page: add a Prerequisites section at the top and a closing Next
Steps section, while preserving the existing configuration-boundary explanation.
Replace hardcoded product names throughout the document with the repository’s
configured documentation substitutions, including the title and references to
Platform, Fabric, and NeMo Agents.

In `@plugins/nemo-agents/src/nemo_agents_plugin/fabric/validation.py`:
- Around line 55-58: Update the plan execution error handling around
fabric_client.plan in the validation flow to catch non-configuration exceptions
as well as FabricConfigError, and wrap them in FabricValidationError while
preserving the original exception as the cause. Keep the existing
configuration-specific handling and validation error message context intact.

In `@plugins/nemo-insights/src/nemo_insights_plugin/cli.py`:
- Around line 55-70: Restrict the load_env_file call in _load_profile_or_error
to explicitly supported analysis environment keys, or skip automatic .env
loading unless the user explicitly opts in. Preserve explicit profile loading
behavior while preventing discovered profiles from injecting arbitrary
os.environ values.
- Around line 152-154: Update the output-path handling in the CLI around
analysis.profile_output so explicit --insights-file-output paths also create
their parent directory with parents=True and exist_ok=True before invoking the
runner. Preserve the existing behavior for profile-derived paths and avoid
duplicating directory-creation logic where possible.

In `@plugins/nemo-insights/src/nemo_insights_plugin/preflight.py`:
- Around line 23-30: Update the readiness check in the preflight HTTP request to
return true only when the response status is in the 2xx success range, replacing
the current status_code < 500 condition while preserving the existing URL,
timeout, and redirect behavior.

In `@plugins/nemo-insights/testbed/publish.py`:
- Around line 136-145: Serialize the complete publishing transaction in the flow
around release.next_ref, release._release_gh("upload"), and the subsequent
"edit" so concurrent publishers cannot read and overwrite the same release notes
body. Hold the existing catalog/release lock across ref generation, asset
upload, notes retrieval, catalog_row creation, and insert_catalog_row editing,
preserving immutable asset collision behavior.

In `@services/core/jobs/src/nmp/core/jobs/app/dispatcher.py`:
- Line 343: Update the job listing flow around the dispatcher query and
in-memory status filtering so status-filtered candidates are determined before
applying pagination. Ensure source sorting still operates correctly, matching
jobs from later store pages are included, and total_results reflects the
status-filtered set.

---

Nitpick comments:
In `@plugins/nemo-evaluator/src/nemo_evaluator/intake/mapping.py`:
- Around line 72-79: Rename the experiment_id parameter in
run_task_to_evaluation_context to evaluation_id, update all callers and keyword
arguments accordingly, and preserve the returned evaluation_context mapping with
evaluation_id set from the renamed parameter.

In `@services/intake/src/nmp/intake/api/v2/experiments/endpoints.py`:
- Around line 666-674: Update the mode Query description in the endpoint
definition to interpolate or otherwise reuse INTAKE_PREVIEW_PAYLOAD_CHAR_LIMIT
instead of hardcoding “300”, keeping the existing summary, preview, and detailed
behavior wording unchanged.

In `@services/intake/src/nmp/intake/spans/api/spans_schemas.py`:
- Around line 122-124: Rename SPAN_SUMMARY_ERROR_MESSAGE_CHAR_LIMIT to
SPAN_COMPACT_ERROR_MESSAGE_CHAR_LIMIT throughout the spans schema and
error-message formatting code, including _error_message_for_mode and its
documentation, while preserving the existing truncation behavior for both
summary and preview modes.

In `@web/packages/studio/src/components/dataViews/JobsDataView/index.tsx`:
- Around line 116-128: Remove the render-time mutation of seenSourcesRef in the
JobsDataView source-option logic. Derive the accumulated source set with useMemo
keyed on jobsData?.data, then update the ref from an effect if retaining the ref
is necessary; ensure mergedSourceOptions is computed from the current data and
accumulated sources without writing to the ref during render.

In
`@web/packages/studio/src/components/sidePanels/AgentPanels/AgentPanel/index.tsx`:
- Around line 111-112: Replace the unchecked assertion in the agentModelNames
initialization with a type guard that validates the configuration before passing
it to getAgentModelNames. Extend the configuration/model-name handling to
support nemo-agents-spec-v1 agents using harnesses and models, while preserving
legacy nat-workflow-v1 support and graceful empty results for unsupported
configurations.
🪄 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: eebdc267-0f08-4e59-a0c9-635b19b94a7c

📥 Commits

Reviewing files that changed from the base of the PR and between 525ccc8 and 30bce98.

⛔ Files ignored due to path filters (34)
  • 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/src/nemo_platform/beta/evaluator/enums.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/beta/evaluator/values/common.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/app.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/sessions.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/traces.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/api/jobs/__init__.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/resources/evaluations/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/api.md 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/sessions.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/resources/jobs/api.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/resources/jobs/jobs.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/evaluations/evaluation_session_response.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/evaluations/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/session.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_list_params.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_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/jobs/__init__.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/jobs/job_list_params.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/jobs/platform_job_list_sort_field.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/api_resources/intake/test_sessions.py is excluded by !sdk/**
  • sdk/stainless.yaml is excluded by !sdk/**
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (141)
  • .github/workflows/ci.yaml
  • .github/workflows/insights-testbed.yml
  • .gitignore
  • conftest.py
  • docker/Dockerfile.bake
  • docker/base/Dockerfile.nmp-jobs-launcher
  • docs/agents/deploy-agents.mdx
  • docs/cli/reference.mdx
  • docs/customizer/tutorials/embedding-customization-job.mdx
  • docs/evaluator/index.mdx
  • docs/fern/package.json
  • docs/fern/scripts/docs-watch.mjs
  • docs/fern/scripts/sync-helm-docs.mjs
  • docs/helm/_snippets/helm-values.css
  • docs/helm/index.mdx
  • docs/set-up/config-reference.mdx
  • docs/set-up/helm/install.mdx
  • e2e/configs/local-docker-agents.yaml
  • e2e/services_pool.py
  • e2e/test_evaluator_plugin.py
  • e2e/test_nemo_agents_docker.py
  • openapi/ga/individual/platform.openapi.yaml
  • openapi/ga/openapi.yaml
  • openapi/openapi.yaml
  • packages/nemo_evaluator_sdk/src/nemo_evaluator_sdk/enums.py
  • packages/nemo_evaluator_sdk/src/nemo_evaluator_sdk/values/common.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/app.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/sessions.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/traces.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/api/jobs/__init__.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/jobs/api_factory.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/jobs/types.py
  • packages/nemo_platform_plugin/tests/test_jobs_create_spec_json.py
  • plugins/nemo-agents/examples/nemo-agent-config/agent.yaml
  • plugins/nemo-agents/openapi/openapi.yaml
  • plugins/nemo-agents/pyproject.toml
  • plugins/nemo-agents/src/nemo_agents_plugin/agent_config.py
  • plugins/nemo-agents/src/nemo_agents_plugin/entities.py
  • plugins/nemo-agents/src/nemo_agents_plugin/fabric/README.md
  • plugins/nemo-agents/src/nemo_agents_plugin/fabric/translator.py
  • plugins/nemo-agents/src/nemo_agents_plugin/fabric/validation.py
  • plugins/nemo-agents/src/nemo_agents_plugin/schema.py
  • plugins/nemo-agents/tests/unit/test_agent_config.py
  • plugins/nemo-agents/tests/unit/test_entities.py
  • plugins/nemo-agents/tests/unit/test_fabric_translator.py
  • plugins/nemo-agents/tests/unit/test_fabric_validation.py
  • plugins/nemo-evaluator/src/nemo_evaluator/api/service/task_service.py
  • plugins/nemo-evaluator/src/nemo_evaluator/api/v2/tasks.py
  • plugins/nemo-evaluator/src/nemo_evaluator/intake/mapping.py
  • plugins/nemo-evaluator/tests/api/service/test_task_service.py
  • plugins/nemo-evaluator/tests/api/v2/test_metrics_routes.py
  • plugins/nemo-evaluator/tests/api/v2/test_tasks_routes.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-evaluator/tests/test_evaluate_job.py
  • plugins/nemo-evaluator/tests/test_sdk.py
  • plugins/nemo-insights/README.md
  • plugins/nemo-insights/pyproject.toml
  • plugins/nemo-insights/src/nemo_insights_plugin/analyst/analyst_backend.py
  • plugins/nemo-insights/src/nemo_insights_plugin/analyst/run.py
  • plugins/nemo-insights/src/nemo_insights_plugin/cli.py
  • plugins/nemo-insights/src/nemo_insights_plugin/contracts/checks.py
  • plugins/nemo-insights/src/nemo_insights_plugin/contracts/insights.py
  • plugins/nemo-insights/src/nemo_insights_plugin/contracts/profile.py
  • plugins/nemo-insights/src/nemo_insights_plugin/preflight.py
  • plugins/nemo-insights/src/nemo_insights_plugin/profile.py
  • plugins/nemo-insights/testbed/README.md
  • plugins/nemo-insights/testbed/cli.py
  • plugins/nemo-insights/testbed/publish.py
  • plugins/nemo-insights/testbed/reingest.py
  • plugins/nemo-insights/testbed/release.py
  • plugins/nemo-insights/tests/contracts/test_checks.py
  • plugins/nemo-insights/tests/contracts/test_insights.py
  • plugins/nemo-insights/tests/contracts/test_profile_contract.py
  • plugins/nemo-insights/tests/test_cli_profile.py
  • plugins/nemo-insights/tests/test_periodic_analysis.py
  • plugins/nemo-insights/tests/test_preflight.py
  • plugins/nemo-insights/tests/test_profile.py
  • plugins/nemo-insights/tests/testbed/test_cli.py
  • plugins/nemo-insights/tests/testbed/test_publish.py
  • plugins/nemo-insights/tests/testbed/test_reingest.py
  • plugins/nemo-insights/tests/testbed/test_release.py
  • pyproject.toml
  • pytest.ini
  • script/generate_config_docs.py
  • services/automodel/src/nmp/automodel/app/jobs/compiler.py
  • services/core/auth/src/nmp/core/auth/assets/static-authz.yaml
  • services/core/jobs/src/nmp/core/jobs/api/v2/jobs/endpoints.py
  • services/core/jobs/src/nmp/core/jobs/api/v2/jobs/schemas.py
  • services/core/jobs/src/nmp/core/jobs/app/dispatcher.py
  • services/core/jobs/src/nmp/core/jobs/controllers/backends/config.py
  • services/core/jobs/tests/test_config.py
  • services/core/jobs/tests/test_dispatcher.py
  • services/core/models/src/nmp/core/models/api/v2/models.py
  • services/intake/README.md
  • services/intake/src/nmp/intake/api/v2/experiments/endpoints.py
  • services/intake/src/nmp/intake/api/v2/experiments/schemas.py
  • services/intake/src/nmp/intake/service.py
  • services/intake/src/nmp/intake/spans/api/dependencies.py
  • services/intake/src/nmp/intake/spans/api/sessions.py
  • services/intake/src/nmp/intake/spans/api/sessions_schemas.py
  • services/intake/src/nmp/intake/spans/api/spans.py
  • services/intake/src/nmp/intake/spans/api/spans_schemas.py
  • services/intake/src/nmp/intake/spans/api/traces.py
  • services/intake/src/nmp/intake/spans/api/traces_schemas.py
  • services/intake/src/nmp/intake/spans/domain.py
  • services/intake/src/nmp/intake/spans/evaluation_session_repository.py
  • services/intake/src/nmp/intake/spans/service.py
  • services/intake/src/nmp/intake/spans/session_repository.py
  • services/intake/src/nmp/intake/spans/span_repository.py
  • services/intake/src/nmp/intake/spans/span_rollups.py
  • services/intake/src/nmp/intake/spans/storage.py
  • services/intake/src/nmp/intake/spans/trace_repository.py
  • services/intake/tests/integration/spans/test_chat_completions_ingest.py
  • services/intake/tests/integration/spans/test_experiment_sessions.py
  • services/intake/tests/integration/spans/test_sessions_read.py
  • services/intake/tests/integration/spans/test_traces_read.py
  • services/intake/tests/integration/test_intake.py
  • services/intake/tests/test_evaluation_session_clickhouse_repository.py
  • services/intake/tests/test_experiment_session_schemas.py
  • services/intake/tests/test_sessions_api.py
  • services/intake/tests/test_sessions_clickhouse_repository.py
  • services/intake/tests/test_spans_clickhouse_repository.py
  • services/intake/tests/test_spans_schemas.py
  • services/intake/tests/test_spans_storage.py
  • services/intake/tests/test_traces_clickhouse_repository.py
  • web/packages/studio/src/components/IntakeLists/IntakePayloadPreviewCell.tsx
  • web/packages/studio/src/components/IntakeLists/IntakeSpansTable.test.tsx
  • web/packages/studio/src/components/IntakeLists/IntakeSpansTable.tsx
  • web/packages/studio/src/components/IntakeLists/IntakeTracesTable.test.tsx
  • web/packages/studio/src/components/IntakeLists/IntakeTracesTable.tsx
  • web/packages/studio/src/components/dataViews/EvaluationSessionsDataView/index.test.tsx
  • web/packages/studio/src/components/dataViews/EvaluationSessionsDataView/index.tsx
  • web/packages/studio/src/components/dataViews/JobsDataView/index.test.tsx
  • web/packages/studio/src/components/dataViews/JobsDataView/index.tsx
  • web/packages/studio/src/components/sidePanels/AgentPanels/AgentPanel/index.test.tsx
  • web/packages/studio/src/components/sidePanels/AgentPanels/AgentPanel/index.tsx
  • web/packages/studio/src/mocks/intake/telemetry.ts
💤 Files with no reviewable changes (5)
  • docs/helm/_snippets/helm-values.css
  • packages/nemo_evaluator_sdk/src/nemo_evaluator_sdk/values/common.py
  • plugins/nemo-insights/pyproject.toml
  • docs/helm/index.mdx
  • packages/nemo_evaluator_sdk/src/nemo_evaluator_sdk/enums.py
🚧 Files skipped from review as they are similar to previous changes (1)
  • services/automodel/src/nmp/automodel/app/jobs/compiler.py

Comment thread .github/workflows/ci.yaml
Comment thread docs/agents/deploy-agents.mdx
Comment thread plugins/nemo-agents/src/nemo_agents_plugin/fabric/README.md
Comment thread plugins/nemo-agents/src/nemo_agents_plugin/fabric/validation.py
Comment thread plugins/nemo-insights/src/nemo_insights_plugin/cli.py
Comment thread plugins/nemo-insights/src/nemo_insights_plugin/cli.py
Comment thread plugins/nemo-insights/src/nemo_insights_plugin/preflight.py
Comment thread plugins/nemo-insights/testbed/publish.py
Comment thread services/core/jobs/src/nmp/core/jobs/app/dispatcher.py
@soluwalana
soluwalana force-pushed the solu/fix-model-upload branch from 202785d to 0192a82 Compare July 17, 2026 16:53
soluwalana and others added 3 commits July 17, 2026 11:01
Signed-off-by: Sam Oluwalana <soluwalana@nvidia.com>
Co-authored-by: Albert Cui <albcui@nvidia.com>
Signed-off-by: Sam Oluwalana <soluwalana@nvidia.com>
Signed-off-by: Sam Oluwalana <soluwalana@nvidia.com>
@soluwalana
soluwalana force-pushed the solu/fix-model-upload branch from 0192a82 to f8ab185 Compare July 17, 2026 17:01
@soluwalana
soluwalana added this pull request to the merge queue Jul 17, 2026
Merged via the queue into main with commit 44cee38 Jul 17, 2026
56 checks passed
@soluwalana
soluwalana deleted the solu/fix-model-upload branch July 17, 2026 17:25
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.

2 participants