Skip to content

chore(sdk): refactor sdk service lifecycle - #937

Open
ironcommit wants to merge 1 commit into
mainfrom
AIRCORE-950-dependency-provider-sdk-test-client-migration/rsadler
Open

chore(sdk): refactor sdk service lifecycle#937
ironcommit wants to merge 1 commit into
mainfrom
AIRCORE-950-dependency-provider-sdk-test-client-migration/rsadler

Conversation

@ironcommit

@ironcommit ironcommit commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Summary by CodeRabbit

  • New Features
    • Added automatic routing of API requests to configured platform services, including environment-based endpoint overrides.
    • Added reusable service SDK creation with support for custom HTTP clients and workload identity authentication.
    • Added immutable SDK-managed HTTP clients to prevent accidental changes to request settings.
    • Improved service OpenAPI metadata and query-parameter schema generation.
  • Bug Fixes
    • Improved SDK cleanup during service shutdown and controller stop signaling.
    • Standardized SDK injection across Jobs, Models, Inference Gateway, Files, and Guardrails services.
    • Added warnings for missing task-principal delegation where applicable.

@ironcommit
ironcommit requested review from a team as code owners July 28, 2026 00:27
@github-actions github-actions Bot added the chore label Jul 28, 2026
@coderabbitai

coderabbitai Bot commented Jul 28, 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

SDK and HTTP client ownership were refactored: shared module-level HTTP clients were removed in favor of SDK-owned immutable clients, a ServiceSDKFactory and PlatformEndpoint-based routing replaced request-router URL resolution, DependencyProvider gained configuration methods, and downstream services/controllers/tests were updated to consume injected SDK clients accordingly.

Changes

SDK Lifecycle and Service Integration Refactor

Layer / File(s) Summary
Immutable clients and endpoint routing
packages/nmp_common/src/nmp/common/immutable_http_client.py, packages/nmp_common/src/nmp/common/platform_endpoint.py, packages/nmp_common/tests/test_immutable_http_client.py, packages/nmp_common/tests/test_platform_endpoint.py
New immutable httpx client wrappers freeze headers/cookies/hooks; PlatformEndpoint gains service_pattern/service_endpoints and route_request_url() for TCP/UDS routing transports.
SDK construction and authentication
packages/nmp_common/src/nmp/common/sdk_factory.py, packages/nemo_platform_plugin/src/nemo_platform_plugin/sdk_provider.py, packages/nemo_platform_plugin/src/nemo_platform_plugin/client/adapter.py, packages/nmp_common/src/nmp/common/entities/client.py, packages/nmp_common/tests/sdk_factory/test_sdk.py, tests
Removes PlatformRequestRouter/URL-router preservation; adds workload-identity auth, with_options_reusing_http_client, centralized on-behalf-of header derivation.
Service SDK factory and dependency provider
packages/nmp_common/src/nmp/common/service/sdk_factory.py, packages/nmp_common/src/nmp/common/service/base.py, packages/nmp_common/src/nmp/common/service/__init__.py, packages/nmp_common/src/nmp/common/service/dependencies.py, tests
New ServiceSDKFactory; DependencyProvider adds endpoint/HTTP-client configuration, scoped SDK creation, _ServiceFastAPI OpenAPI override.
Application and controller dependency wiring
packages/nmp_platform_runner/src/nmp/platform_runner/server.py, .../run.py, .../loader.py, tests, packages/nemo_platform_ext/tests/local/*
create_app propagates shared HTTP client into services; controller loading simplified via isinstance checks; removes cast usage.
Service consumer SDK injection and lifecycle
services/core/*, services/guardrails/*, services/studio/*, packages/nmp_testing/src/nmp/testing/client.py, tests
Core services/endpoints now receive SDKs via dependency injection (get_sdk_client) instead of constructing them directly; Studio owns its telemetry client.

Sequence Diagram(s)

sequenceDiagram
  participant App as create_app
  participant Provider as DependencyProvider
  participant Factory as ServiceSDKFactory
  participant Endpoint as PlatformEndpoint
  App->>Provider: configure_platform_endpoint / configure_http_client
  Provider->>Factory: create ServiceSDKFactory(endpoint, http_client)
  Factory->>Endpoint: sync_sdk_http_client / async_sdk_http_client
  Endpoint-->>Factory: immutable routing client
  Factory-->>Provider: platform SDK instance
  Provider-->>App: SDK client
Loading

Possibly related PRs

Suggested labels: refactor

Suggested reviewers: mckornfield, maxdubrinsky, svvarom

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 35.15% 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 matches the main theme of the changeset: a broad refactor of SDK/service lifecycle handling.
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 AIRCORE-950-dependency-provider-sdk-test-client-migration/rsadler

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.

Actionable comments posted: 7

🧹 Nitpick comments (8)
packages/nmp_common/src/nmp/common/platform_endpoint.py (1)

231-235: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Use UDS_BASE_URL instead of re-hardcoding the host.

-        return url.copy_with(scheme="http", host="nemo-platform.local", port=None)
+        uds_url = httpx.URL(UDS_BASE_URL)
+        return url.copy_with(scheme=uds_url.scheme, host=uds_url.host, port=None)
🤖 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_common/src/nmp/common/platform_endpoint.py` around lines 231 -
235, Update _url_for_endpoint to use the existing UDS_BASE_URL value for the
Unix-domain-socket host instead of hardcoding "nemo-platform.local", while
preserving the current scheme and port handling.
packages/nemo_platform_ext/tests/local/test_health_child.py (1)

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

Test no longer asserts anything new.

With services=[] and no controllers, this only checks that lifespan sets a flag — already implied by test_create_app_starts_and_joins_controller_threads above. Since the removed test covered shutdown cleanup, consider asserting the replacement behavior instead (e.g. DependencyProvider.close() / SDK factory aclose() runs on shutdown).

🤖 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/nemo_platform_ext/tests/local/test_health_child.py` around lines 110
- 130, The test_lifespan_shutdown_marks_controller_stop_signal test duplicates
existing lifespan coverage because it only asserts the stop signal with no
controllers. Replace this assertion with verification that shutdown performs the
intended cleanup, specifically that DependencyProvider.close() or the SDK
factory aclose() is invoked when the TestClient context exits.
packages/nmp_common/src/nmp/common/immutable_http_client.py (1)

74-78: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Silently dropping response cookies diverges from httpx contract.

extract_cookies becoming a no-op means auth/session flows that rely on Set-Cookie (e.g. redirect chains) break with no signal. Intentional per the comment, but consider a debug log so it's diagnosable.

🤖 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_common/src/nmp/common/immutable_http_client.py` around lines 74
- 78, Update _ImmutableCookies.extract_cookies to emit a debug-level diagnostic
when response cookies are intentionally discarded, while preserving its
non-persistent behavior. Include enough context to identify the dropped
Set-Cookie handling without changing cookie storage or raising an error.
packages/nemo_platform_plugin/tests/test_sdk_provider.py (1)

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

Negative-only assertion.

Nothing verifies _warn_missing_task_principal actually fires when the principal is absent and no token file is set — the assertion would pass even if the warning were deleted. Add the positive case to test_get_task_sdk_without_principal.

🤖 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/nemo_platform_plugin/tests/test_sdk_provider.py` around lines 132 -
148, The test coverage only asserts that no warning appears in the
workload-identity path and does not verify the missing-principal warning. Update
test_get_task_sdk_without_principal to configure no principal or token file,
invoke DefaultSDKProvider.get_task_sdk, and assert caplog contains the warning
emitted by _warn_missing_task_principal while preserving the existing SDK
assertions.
packages/nmp_common/tests/test_platform_endpoint.py (1)

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

No coverage for the routing transports themselves.

route_request_url is well covered, but _SyncPlatformEndpointRoutingTransport.handle_request / async counterpart — URL rewrite, Host header rewrite, and per-UDS transport caching — are untested. A MockTransport-backed test would catch regressions in _set_request_url.

🤖 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_common/tests/test_platform_endpoint.py` around lines 100 - 204,
Add MockTransport-backed tests covering
_SyncPlatformEndpointRoutingTransport.handle_request and its async counterpart:
verify routed URL rewriting, matching Host header rewriting, and per-UDS
transport caching while exercising _set_request_url. Reuse the existing endpoint
fixtures/configuration and assert both sync and async transport behavior without
expanding unrelated routing coverage.
services/core/entities/src/nmp/core/entities/controllers/main.py (2)

1-1: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Controller DependencyProviders are never closed on shutdown. Both controllers create/receive a DependencyProvider for their SDK client but the finally block never calls provider.close(), leaking the SDK's HTTP client on every restart.

  • services/core/entities/src/nmp/core/entities/controllers/main.py#L84-94: add loop.run_until_complete(provider.close()) before returning (reuses the existing event loop).
  • services/core/models/src/nmp/core/models/controllers/main.py#L111-122: add asyncio.run(provider.close()) in the finally block.
🤖 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/entities/src/nmp/core/entities/controllers/main.py` at line 1,
Close each controller’s DependencyProvider during shutdown: in the core entities
controller’s finally block, call provider.close() through the existing event
loop before returning; in the core models controller’s finally block, call
asyncio.run(provider.close()).

46-47: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Controller's DependencyProvider is never closed.

provider (injected or freshly created) is used for the SDK client but never closed in the finally block — its HTTP client/SDK leak on every shutdown/restart. An event loop already exists (loop) that can run the async close.

♻️ Proposed fix
     finally:
         cleanup_loop.stop()
         cleanup_loop.join(timeout=10)
         if cleanup_loop.is_alive():
             logger.warning("Workspace cleanup loop did not stop in time")
+        loop.run_until_complete(provider.close())
         logger.info("Entities controller stopped")

Also applies to: 84-94

🤖 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/entities/src/nmp/core/entities/controllers/main.py` around
lines 46 - 47, Update the controller cleanup around the provider initialization
and existing finally block so the DependencyProvider used by get_sdk_client is
always closed, including injected providers, by running its asynchronous close
operation through the existing loop. Preserve the current SDK shutdown behavior
and ensure provider cleanup executes during every shutdown or restart path.
services/core/models/src/nmp/core/models/controllers/main.py (1)

61-62: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Controller's DependencyProvider is never closed.

Same gap as entities controller: provider's SDK/HTTP client are never closed on shutdown.

♻️ Proposed fix
         if models_controller_loop.is_alive():
             logger.warning("Models controller loop did not stop, forcing cleanup")
             models_controller.shutdown()
+        asyncio.run(provider.close())
         logger.info("Models controller stopped")

Also applies to: 111-122

🤖 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/models/src/nmp/core/models/controllers/main.py` around lines 61
- 62, Update the controller initialization and shutdown flow around
DependencyProvider and provider.get_sdk_client(as_service="models") so the
provider-owned SDK/HTTP client is closed when the controller shuts down. Match
the cleanup pattern used by the entities controller, while preserving externally
supplied providers and normal request handling.
🤖 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 `@packages/nmp_common/src/nmp/common/platform_endpoint.py`:
- Around line 262-271: Make the UDS transport lookup and creation in
_transport_for_endpoint thread-safe so concurrent requests for the same socket
path cannot create duplicate transports. Guard the _uds_transports
check-and-insert with an appropriate lock, ensuring close() can still manage
every cached transport.
- Around line 149-165: Update resolve_platform_endpoint so malformed URLs from
individual service routes do not abort default endpoint resolution. Wrap each
resolve_service_endpoint call for discovered routes in targeted exception
handling, log the offending service name and URL, and omit only that route from
service_endpoints while still requiring the base_url to parse successfully.

In `@packages/nmp_common/src/nmp/common/sdk_factory.py`:
- Around line 43-44: Update _should_bootstrap_workload_identity to depend only
on is_workload_identity_token_file_set(), removing the http_client presence
check. Preserve the injected client by threading it separately through
create_platform_sdk() and create_async_platform_sdk() so the token exchange
still uses that client when workload identity bootstrap is enabled.

In `@packages/nmp_common/src/nmp/common/service/base.py`:
- Around line 73-79: Update DependencyProvider initialization in
Service.__init__ and the entity-client creation flow around
_get_entity_sdk_on_behalf_of() to pass the actual Service.name value instead of
retaining the hard-coded "platform" _service_name. Ensure the real service name
is set before creating the entity SDK so requests use the correct service
identifier.

In `@packages/nmp_common/src/nmp/common/service/sdk_factory.py`:
- Line 1: Update ServiceSDKFactory.aclose() and HTTP-client initialization to
track whether the factory created the client or received it from
DependencyProvider.configure_http_client(). Only close the client when owned by
the factory; leave injected shared clients open.

In `@services/core/models/tests/unit/api/test_models_api.py`:
- Around line 416-423: Rename the test containing the direct
start_update_model_spec_job invocation to describe that it verifies swallowing a
NemoTransportError, or instead route the test through create_model and assert
the persisted entity. Ensure the test name accurately matches the behavior
actually exercised.

In `@services/studio/src/nmp/studio/service.py`:
- Around line 147-153: Update the telemetry request flow around the service
method containing DefaultAsyncHttpxClient so it reuses a service-owned or
injected HTTP client instead of creating one per request. Initialize or accept
the client at service scope, use it for upstream_response requests, and close it
during the service’s shutdown lifecycle.

---

Nitpick comments:
In `@packages/nemo_platform_ext/tests/local/test_health_child.py`:
- Around line 110-130: The test_lifespan_shutdown_marks_controller_stop_signal
test duplicates existing lifespan coverage because it only asserts the stop
signal with no controllers. Replace this assertion with verification that
shutdown performs the intended cleanup, specifically that
DependencyProvider.close() or the SDK factory aclose() is invoked when the
TestClient context exits.

In `@packages/nemo_platform_plugin/tests/test_sdk_provider.py`:
- Around line 132-148: The test coverage only asserts that no warning appears in
the workload-identity path and does not verify the missing-principal warning.
Update test_get_task_sdk_without_principal to configure no principal or token
file, invoke DefaultSDKProvider.get_task_sdk, and assert caplog contains the
warning emitted by _warn_missing_task_principal while preserving the existing
SDK assertions.

In `@packages/nmp_common/src/nmp/common/immutable_http_client.py`:
- Around line 74-78: Update _ImmutableCookies.extract_cookies to emit a
debug-level diagnostic when response cookies are intentionally discarded, while
preserving its non-persistent behavior. Include enough context to identify the
dropped Set-Cookie handling without changing cookie storage or raising an error.

In `@packages/nmp_common/src/nmp/common/platform_endpoint.py`:
- Around line 231-235: Update _url_for_endpoint to use the existing UDS_BASE_URL
value for the Unix-domain-socket host instead of hardcoding
"nemo-platform.local", while preserving the current scheme and port handling.

In `@packages/nmp_common/tests/test_platform_endpoint.py`:
- Around line 100-204: Add MockTransport-backed tests covering
_SyncPlatformEndpointRoutingTransport.handle_request and its async counterpart:
verify routed URL rewriting, matching Host header rewriting, and per-UDS
transport caching while exercising _set_request_url. Reuse the existing endpoint
fixtures/configuration and assert both sync and async transport behavior without
expanding unrelated routing coverage.

In `@services/core/entities/src/nmp/core/entities/controllers/main.py`:
- Line 1: Close each controller’s DependencyProvider during shutdown: in the
core entities controller’s finally block, call provider.close() through the
existing event loop before returning; in the core models controller’s finally
block, call asyncio.run(provider.close()).
- Around line 46-47: Update the controller cleanup around the provider
initialization and existing finally block so the DependencyProvider used by
get_sdk_client is always closed, including injected providers, by running its
asynchronous close operation through the existing loop. Preserve the current SDK
shutdown behavior and ensure provider cleanup executes during every shutdown or
restart path.

In `@services/core/models/src/nmp/core/models/controllers/main.py`:
- Around line 61-62: Update the controller initialization and shutdown flow
around DependencyProvider and provider.get_sdk_client(as_service="models") so
the provider-owned SDK/HTTP client is closed when the controller shuts down.
Match the cleanup pattern used by the entities controller, while preserving
externally supplied providers and normal request handling.
🪄 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: 373a22c4-c7ff-4d6e-adff-f5ebb6505bdd

📥 Commits

Reviewing files that changed from the base of the PR and between d58318f and de3454f.

📒 Files selected for processing (40)
  • packages/nemo_platform_ext/tests/local/test_health_child.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/client/adapter.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/sdk_provider.py
  • packages/nemo_platform_plugin/tests/client/test_adapter.py
  • packages/nemo_platform_plugin/tests/test_sdk_provider.py
  • packages/nmp_common/src/nmp/common/entities/client.py
  • packages/nmp_common/src/nmp/common/http_clients.py
  • packages/nmp_common/src/nmp/common/immutable_http_client.py
  • packages/nmp_common/src/nmp/common/platform_endpoint.py
  • packages/nmp_common/src/nmp/common/sdk_factory.py
  • packages/nmp_common/src/nmp/common/service/__init__.py
  • packages/nmp_common/src/nmp/common/service/base.py
  • packages/nmp_common/src/nmp/common/service/dependencies.py
  • packages/nmp_common/src/nmp/common/service/sdk_factory.py
  • packages/nmp_common/tests/nmp_common/test_dependency_provider.py
  • packages/nmp_common/tests/sdk_factory/test_sdk.py
  • packages/nmp_common/tests/service/test_sdk_factory.py
  • packages/nmp_common/tests/test_immutable_http_client.py
  • packages/nmp_common/tests/test_platform_endpoint.py
  • packages/nmp_platform_runner/src/nmp/platform_runner/server.py
  • packages/nmp_platform_runner/tests/test_server.py
  • packages/nmp_testing/src/nmp/testing/client.py
  • services/core/entities/src/nmp/core/entities/controllers/main.py
  • services/core/files/src/nmp/core/files/api/endpoint_helpers.py
  • services/core/inference-gateway/src/nmp/core/inference_gateway/service.py
  • services/core/inference-gateway/src/nmp/core/inference_gateway/testing/fixtures.py
  • services/core/inference-gateway/tests/unit/conftest.py
  • services/core/inference-gateway/tests/unit/test_service.py
  • services/core/jobs/src/nmp/core/jobs/api/dependencies.py
  • services/core/jobs/src/nmp/core/jobs/api/v2/jobs/endpoints.py
  • services/core/models/src/nmp/core/models/api/dependencies.py
  • services/core/models/src/nmp/core/models/api/service/adapter_entity_service.py
  • services/core/models/src/nmp/core/models/api/service/model_entity_service.py
  • services/core/models/src/nmp/core/models/api/v2/models.py
  • services/core/models/src/nmp/core/models/controllers/main.py
  • services/core/models/tests/unit/api/test_models_api.py
  • services/guardrails/src/nmp/guardrails/api/dependencies.py
  • services/hello-world/tests/integration/tasks/test_workload_workspace_get_task.py
  • services/studio/src/nmp/studio/service.py
  • services/studio/tests/unit/test_service.py
💤 Files with no reviewable changes (3)
  • packages/nmp_common/src/nmp/common/http_clients.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/client/adapter.py
  • packages/nmp_testing/src/nmp/testing/client.py

Comment thread packages/nmp_common/src/nmp/common/platform_endpoint.py
Comment thread packages/nmp_common/src/nmp/common/platform_endpoint.py Outdated
Comment thread packages/nmp_common/src/nmp/common/sdk_factory.py Outdated
Comment thread packages/nmp_common/src/nmp/common/service/base.py Outdated
Comment thread packages/nmp_common/src/nmp/common/service/sdk_factory.py
Comment thread services/core/models/tests/unit/api/test_models_api.py
Comment thread services/studio/src/nmp/studio/service.py Outdated
@github-actions

github-actions Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor
Suite Lines Covered Line Rate Branch Rate
Unit Tests 27630/35413 78.0% 62.4%
Integration Tests N/A N/A N/A

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/nmp_common/src/nmp/common/service/base.py (1)

250-253: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

Clear configured clients even when no SDK factory was created.

configure_http_client() can set _configured_http_client before first SDK access, but this branch leaves it populated when _service_sdk_factory is None. Clear it unconditionally during close() to prevent stale or later-closed clients from being reused.

🤖 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_common/src/nmp/common/service/base.py` around lines 250 - 253,
Update the close() cleanup around _service_sdk_factory so
_configured_http_client is cleared unconditionally, including when no SDK
factory exists. Keep SDK factory shutdown conditional, but move the
configured-client reset outside that condition to prevent reuse of stale
clients.
🤖 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 `@packages/nmp_common/src/nmp/common/service/base.py`:
- Around line 510-511: Update the OpenAPI metadata setup in
_ServiceFastAPI.openapi() so nmp_openapi_description preserves
Service.description by removing the empty-string assignment or assigning
self.description. Keep the existing nmp_openapi_summary behavior unchanged.

In `@plugins/nemo-customizer/openapi/openapi.yaml`:
- Around line 395-400: The OpenAPI specification removes the still-supported RL
job routes. In openapi.yaml, retain the existing
/apis/customization/v2/workspaces/{workspace}/rl/jobs paths alongside the
Unsloth routes, mark them as deprecated, and preserve their documented behavior
until RL consumers migrate.

---

Outside diff comments:
In `@packages/nmp_common/src/nmp/common/service/base.py`:
- Around line 250-253: Update the close() cleanup around _service_sdk_factory so
_configured_http_client is cleared unconditionally, including when no SDK
factory exists. Keep SDK factory shutdown conditional, but move the
configured-client reset outside that condition to prevent reuse of stale
clients.
🪄 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: 9728c8f3-a7dd-4be6-a4c2-2a7bd02aaa88

📥 Commits

Reviewing files that changed from the base of the PR and between de3454f and e2ccece.

⛔ Files ignored due to path filters (1)
  • sdk/python/nemo-platform/tests/vendored/nemo_platform_ext/local/test_health_child.py is excluded by !sdk/**
📒 Files selected for processing (8)
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/client/adapter.py
  • packages/nmp_common/src/nmp/common/service/__init__.py
  • packages/nmp_common/src/nmp/common/service/base.py
  • packages/nmp_common/src/nmp/common/service/dependencies.py
  • packages/nmp_common/tests/api/test_query_param_schemas.py
  • packages/nmp_common/tests/nmp_common/test_dependency_provider.py
  • plugins/nemo-customizer/openapi/openapi.yaml
  • plugins/nemo-deployments/openapi/openapi.yaml
💤 Files with no reviewable changes (3)
  • packages/nmp_common/src/nmp/common/service/init.py
  • packages/nmp_common/src/nmp/common/service/dependencies.py
  • packages/nmp_common/tests/nmp_common/test_dependency_provider.py
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/client/adapter.py

Comment thread packages/nmp_common/src/nmp/common/service/base.py Outdated
Comment thread plugins/nemo-customizer/openapi/openapi.yaml
@ironcommit
ironcommit force-pushed the AIRCORE-950-dependency-provider-sdk-test-client-migration/rsadler branch from e2ccece to 7707646 Compare July 28, 2026 01:06

@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

♻️ Duplicate comments (3)
plugins/nemo-customizer/openapi/openapi.yaml (1)

395-400: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

RL job paths removed without a deprecation window.

All eight /rl/jobs routes are gone while plugins/nemo-rl still implements them. Keep them as deprecated: true aliases until consumers migrate.

🤖 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-customizer/openapi/openapi.yaml` around lines 395 - 400, Restore
all eight /rl/jobs routes in the OpenAPI specification as aliases to the
existing nemo-rl endpoints, and mark each route deprecated: true. Preserve their
existing request/response definitions and operation behavior while retaining the
current /unsloth/jobs routes.
packages/nmp_common/src/nmp/common/platform_endpoint.py (2)

262-271: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

UDS transport cache is racy.

Concurrent first requests to the same socket path can each build a transport; the loser is orphaned and never closed. Guard the check-and-insert with a lock, or pre-populate from endpoint.service_endpoints in __init__ since the routing table is fixed.

Also applies to: 290-299

🤖 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_common/src/nmp/common/platform_endpoint.py` around lines 262 -
271, The UDS transport cache in _transport_for_endpoint is racy during
concurrent initialization. Guard the _uds_transports lookup and HTTPTransport
creation/insertion with a shared lock, ensuring only one transport is created
per socket path and reused by all callers; apply the same synchronization to the
related cache access around the other endpoint transport path.

149-165: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

One malformed service URL breaks all SDK construction.

Every discovered route (including env-derived NMP_<SVC>_URL) is parsed eagerly, so a single bad value makes resolve_platform_endpoint raise for callers that never touch that service. Skip and log the offending route 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 `@packages/nmp_common/src/nmp/common/platform_endpoint.py` around lines 149 -
165, Update resolve_platform_endpoint and its service-endpoint construction so
malformed URLs from discovered routes, including NMP_<SVC>_URL values, are
caught per service rather than aborting SDK construction. Log the offending
service route, omit it from service_endpoints, and preserve successful routes
and default endpoint resolution.
🤖 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 `@packages/nmp_common/src/nmp/common/platform_endpoint.py`:
- Around line 231-235: The _url_for_endpoint function drops the configured base
URL path for non-UDS endpoints. Preserve endpoint_url.path when constructing the
returned URL so prefixes such as /entities-prefix remain part of the request
route, or enforce rejection of non-root paths during endpoint parsing if that is
the established contract.

---

Duplicate comments:
In `@packages/nmp_common/src/nmp/common/platform_endpoint.py`:
- Around line 262-271: The UDS transport cache in _transport_for_endpoint is
racy during concurrent initialization. Guard the _uds_transports lookup and
HTTPTransport creation/insertion with a shared lock, ensuring only one transport
is created per socket path and reused by all callers; apply the same
synchronization to the related cache access around the other endpoint transport
path.
- Around line 149-165: Update resolve_platform_endpoint and its service-endpoint
construction so malformed URLs from discovered routes, including NMP_<SVC>_URL
values, are caught per service rather than aborting SDK construction. Log the
offending service route, omit it from service_endpoints, and preserve successful
routes and default endpoint resolution.

In `@plugins/nemo-customizer/openapi/openapi.yaml`:
- Around line 395-400: Restore all eight /rl/jobs routes in the OpenAPI
specification as aliases to the existing nemo-rl endpoints, and mark each route
deprecated: true. Preserve their existing request/response definitions and
operation behavior while retaining the current /unsloth/jobs routes.
🪄 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: f2271d61-d238-494d-baf2-8e9f37766d29

📥 Commits

Reviewing files that changed from the base of the PR and between e2ccece and 7707646.

⛔ Files ignored due to path filters (1)
  • sdk/python/nemo-platform/tests/vendored/nemo_platform_ext/local/test_health_child.py is excluded by !sdk/**
📒 Files selected for processing (44)
  • packages/nemo_platform_ext/tests/local/test_health_child.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/client/adapter.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/sdk_provider.py
  • packages/nemo_platform_plugin/tests/client/test_adapter.py
  • packages/nemo_platform_plugin/tests/test_sdk_provider.py
  • packages/nmp_common/src/nmp/common/entities/client.py
  • packages/nmp_common/src/nmp/common/http_clients.py
  • packages/nmp_common/src/nmp/common/immutable_http_client.py
  • packages/nmp_common/src/nmp/common/platform_endpoint.py
  • packages/nmp_common/src/nmp/common/sdk_factory.py
  • packages/nmp_common/src/nmp/common/service/__init__.py
  • packages/nmp_common/src/nmp/common/service/base.py
  • packages/nmp_common/src/nmp/common/service/dependencies.py
  • packages/nmp_common/src/nmp/common/service/sdk_factory.py
  • packages/nmp_common/tests/api/test_query_param_schemas.py
  • packages/nmp_common/tests/nmp_common/test_common_service.py
  • packages/nmp_common/tests/nmp_common/test_dependency_provider.py
  • packages/nmp_common/tests/sdk_factory/test_sdk.py
  • packages/nmp_common/tests/service/test_sdk_factory.py
  • packages/nmp_common/tests/test_immutable_http_client.py
  • packages/nmp_common/tests/test_platform_endpoint.py
  • packages/nmp_platform_runner/src/nmp/platform_runner/server.py
  • packages/nmp_platform_runner/tests/test_server.py
  • packages/nmp_testing/src/nmp/testing/client.py
  • plugins/nemo-customizer/openapi/openapi.yaml
  • plugins/nemo-deployments/openapi/openapi.yaml
  • services/core/entities/src/nmp/core/entities/controllers/main.py
  • services/core/files/src/nmp/core/files/api/endpoint_helpers.py
  • services/core/inference-gateway/src/nmp/core/inference_gateway/service.py
  • services/core/inference-gateway/src/nmp/core/inference_gateway/testing/fixtures.py
  • services/core/inference-gateway/tests/unit/conftest.py
  • services/core/inference-gateway/tests/unit/test_service.py
  • services/core/jobs/src/nmp/core/jobs/api/dependencies.py
  • services/core/jobs/src/nmp/core/jobs/api/v2/jobs/endpoints.py
  • services/core/models/src/nmp/core/models/api/dependencies.py
  • services/core/models/src/nmp/core/models/api/service/adapter_entity_service.py
  • services/core/models/src/nmp/core/models/api/service/model_entity_service.py
  • services/core/models/src/nmp/core/models/api/v2/models.py
  • services/core/models/src/nmp/core/models/controllers/main.py
  • services/core/models/tests/unit/api/test_models_api.py
  • services/guardrails/src/nmp/guardrails/api/dependencies.py
  • services/hello-world/tests/integration/tasks/test_workload_workspace_get_task.py
  • services/studio/src/nmp/studio/service.py
  • services/studio/tests/unit/test_service.py
💤 Files with no reviewable changes (2)
  • packages/nmp_common/src/nmp/common/http_clients.py
  • packages/nmp_testing/src/nmp/testing/client.py
🚧 Files skipped from review as they are similar to previous changes (32)
  • packages/nmp_common/src/nmp/common/service/init.py
  • services/core/files/src/nmp/core/files/api/endpoint_helpers.py
  • packages/nmp_common/src/nmp/common/service/dependencies.py
  • plugins/nemo-deployments/openapi/openapi.yaml
  • packages/nmp_common/src/nmp/common/entities/client.py
  • packages/nmp_platform_runner/tests/test_server.py
  • services/core/models/src/nmp/core/models/api/service/model_entity_service.py
  • services/core/inference-gateway/tests/unit/test_service.py
  • services/hello-world/tests/integration/tasks/test_workload_workspace_get_task.py
  • services/core/models/tests/unit/api/test_models_api.py
  • services/core/entities/src/nmp/core/entities/controllers/main.py
  • services/core/jobs/src/nmp/core/jobs/api/dependencies.py
  • services/core/inference-gateway/src/nmp/core/inference_gateway/service.py
  • services/core/inference-gateway/tests/unit/conftest.py
  • services/core/models/src/nmp/core/models/controllers/main.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/sdk_provider.py
  • services/guardrails/src/nmp/guardrails/api/dependencies.py
  • services/core/models/src/nmp/core/models/api/service/adapter_entity_service.py
  • services/studio/tests/unit/test_service.py
  • services/core/models/src/nmp/core/models/api/dependencies.py
  • services/studio/src/nmp/studio/service.py
  • services/core/inference-gateway/src/nmp/core/inference_gateway/testing/fixtures.py
  • packages/nmp_common/src/nmp/common/service/sdk_factory.py
  • packages/nemo_platform_ext/tests/local/test_health_child.py
  • services/core/jobs/src/nmp/core/jobs/api/v2/jobs/endpoints.py
  • packages/nmp_common/src/nmp/common/immutable_http_client.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/client/adapter.py
  • packages/nmp_common/tests/api/test_query_param_schemas.py
  • services/core/models/src/nmp/core/models/api/v2/models.py
  • packages/nmp_common/src/nmp/common/sdk_factory.py
  • packages/nmp_platform_runner/src/nmp/platform_runner/server.py
  • packages/nmp_common/src/nmp/common/service/base.py

Comment thread packages/nmp_common/src/nmp/common/platform_endpoint.py Outdated

@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 (1)
packages/nmp_common/src/nmp/common/sdk_factory.py (1)

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

Avoid the private _resolve_bootstrap import. Expose a public bootstrap helper for injected-client use, or fail fast here with a clear import error.

🤖 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_common/src/nmp/common/sdk_factory.py` around lines 112 - 126,
Update _workload_identity_bootstrap_for_injected_client to avoid importing the
private _resolve_bootstrap symbol; preferably expose and call a public bootstrap
helper that accepts the same configuration, URL, token, and extra-header inputs,
or otherwise fail immediately with a clear import error when the public API is
unavailable.
🤖 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_common/src/nmp/common/sdk_factory.py`:
- Around line 112-126: Update _workload_identity_bootstrap_for_injected_client
to avoid importing the private _resolve_bootstrap symbol; preferably expose and
call a public bootstrap helper that accepts the same configuration, URL, token,
and extra-header inputs, or otherwise fail immediately with a clear import error
when the public API is unavailable.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: c5b4fcea-e175-4214-bb90-4e73a34bc8ad

📥 Commits

Reviewing files that changed from the base of the PR and between 7707646 and e0c8403.

📒 Files selected for processing (9)
  • packages/nmp_common/src/nmp/common/platform_endpoint.py
  • packages/nmp_common/src/nmp/common/sdk_factory.py
  • packages/nmp_common/src/nmp/common/service/base.py
  • packages/nmp_common/tests/nmp_common/test_common_service.py
  • packages/nmp_common/tests/sdk_factory/test_sdk.py
  • packages/nmp_common/tests/test_platform_endpoint.py
  • services/core/models/tests/unit/api/test_models_api.py
  • services/studio/src/nmp/studio/service.py
  • services/studio/tests/unit/test_service.py
🚧 Files skipped from review as they are similar to previous changes (2)
  • packages/nmp_common/src/nmp/common/service/base.py
  • packages/nmp_common/src/nmp/common/platform_endpoint.py

@ironcommit
ironcommit force-pushed the AIRCORE-950-dependency-provider-sdk-test-client-migration/rsadler branch from e0c8403 to 2186927 Compare July 28, 2026 02:42

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/nmp_common/src/nmp/common/sdk_factory.py (1)

311-341: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Workload-identity path silently drops as_service and on_behalf_of.

Callers passing delegation get it discarded when the token file is set, with no log. Document it in the docstring (and ideally debug-log the drop).

📝 Docstring note
         base_url: Optional platform base URL. When omitted with no explicit http_client,
             the resolved platform endpoint supplies both the base URL and HTTP client.
+
+    Note:
+        When ``NMP_WORKLOAD_IDENTITY_TOKEN_FILE`` is set, authentication comes from
+        the exchanged workload token; ``as_service`` and ``on_behalf_of`` are ignored.
🤖 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_common/src/nmp/common/sdk_factory.py` around lines 311 - 341,
Update the workload-identity branch in the SDK factory around
_sync_workload_identity_sdk so the docstring explicitly documents that
as_service and on_behalf_of are ignored when workload identity is bootstrapped;
add a debug log at that branch when either delegation argument is supplied,
indicating they were dropped. Preserve existing behavior for base_url, internal,
and http_client.
🤖 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 `@packages/nmp_common/src/nmp/common/platform_endpoint.py`:
- Around line 205-229: Restrict _service_url_env_names and its use from
_service_route_names to URL environment variables whose normalized service names
are already present in the platform configuration’s service_discovery or
get_services results. Exclude unknown NMP_*_URL variables while preserving BASE
exclusion and existing normalization behavior, so non-service environment values
cannot affect resolve_platform_endpoint().

In `@packages/nmp_common/tests/test_platform_endpoint.py`:
- Around line 92-133: Add an autouse pytest fixture in test_platform_endpoint.py
that removes every environment variable matching NMP_*_URL before each test,
while preserving NMP_BASE_URL. Use monkeypatch.delenv with a snapshot of
os.environ keys so resolve_platform_endpoint tests run without ambient service
routes.

---

Outside diff comments:
In `@packages/nmp_common/src/nmp/common/sdk_factory.py`:
- Around line 311-341: Update the workload-identity branch in the SDK factory
around _sync_workload_identity_sdk so the docstring explicitly documents that
as_service and on_behalf_of are ignored when workload identity is bootstrapped;
add a debug log at that branch when either delegation argument is supplied,
indicating they were dropped. Preserve existing behavior for base_url, internal,
and http_client.
🪄 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: 6fb33f6e-eae9-4ed2-b428-d1dac6ca248e

📥 Commits

Reviewing files that changed from the base of the PR and between e0c8403 and 2186927.

⛔ Files ignored due to path filters (1)
  • sdk/python/nemo-platform/tests/vendored/nemo_platform_ext/local/test_health_child.py is excluded by !sdk/**
📒 Files selected for processing (54)
  • packages/nemo_platform_ext/tests/local/test_health_child.py
  • packages/nemo_platform_ext/tests/local/test_services_contract.py
  • packages/nemo_platform_ext/tests/local/test_sidecar_integration.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/client/adapter.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/sdk_provider.py
  • packages/nemo_platform_plugin/tests/client/test_adapter.py
  • packages/nemo_platform_plugin/tests/test_sdk_provider.py
  • packages/nmp_common/src/nmp/common/entities/client.py
  • packages/nmp_common/src/nmp/common/http_clients.py
  • packages/nmp_common/src/nmp/common/immutable_http_client.py
  • packages/nmp_common/src/nmp/common/platform_endpoint.py
  • packages/nmp_common/src/nmp/common/sdk_factory.py
  • packages/nmp_common/src/nmp/common/service/__init__.py
  • packages/nmp_common/src/nmp/common/service/base.py
  • packages/nmp_common/src/nmp/common/service/dependencies.py
  • packages/nmp_common/src/nmp/common/service/sdk_factory.py
  • packages/nmp_common/tests/api/test_query_param_schemas.py
  • packages/nmp_common/tests/nmp_common/test_common_service.py
  • packages/nmp_common/tests/nmp_common/test_dependency_provider.py
  • packages/nmp_common/tests/sdk_factory/test_sdk.py
  • packages/nmp_common/tests/service/test_sdk_factory.py
  • packages/nmp_common/tests/test_immutable_http_client.py
  • packages/nmp_common/tests/test_platform_endpoint.py
  • packages/nmp_platform_runner/src/nmp/platform_runner/loader.py
  • packages/nmp_platform_runner/src/nmp/platform_runner/plugin_adapter.py
  • packages/nmp_platform_runner/src/nmp/platform_runner/run.py
  • packages/nmp_platform_runner/src/nmp/platform_runner/server.py
  • packages/nmp_platform_runner/tests/test_run.py
  • packages/nmp_platform_runner/tests/test_server.py
  • packages/nmp_platform_runner/tests/test_sidecars.py
  • packages/nmp_testing/src/nmp/testing/client.py
  • services/core/entities/src/nmp/core/entities/controllers/main.py
  • services/core/files/src/nmp/core/files/api/endpoint_helpers.py
  • services/core/inference-gateway/src/nmp/core/inference_gateway/service.py
  • services/core/inference-gateway/src/nmp/core/inference_gateway/testing/fixtures.py
  • services/core/inference-gateway/tests/unit/conftest.py
  • services/core/inference-gateway/tests/unit/test_service.py
  • services/core/jobs/src/nmp/core/jobs/api/dependencies.py
  • services/core/jobs/src/nmp/core/jobs/api/v2/jobs/endpoints.py
  • services/core/jobs/src/nmp/core/jobs/controllers/main.py
  • services/core/models/src/nmp/core/models/api/dependencies.py
  • services/core/models/src/nmp/core/models/api/service/adapter_entity_service.py
  • services/core/models/src/nmp/core/models/api/service/model_entity_service.py
  • services/core/models/src/nmp/core/models/api/v2/models.py
  • services/core/models/src/nmp/core/models/config.py
  • services/core/models/src/nmp/core/models/controllers/backends/registry.py
  • services/core/models/src/nmp/core/models/controllers/main.py
  • services/core/models/src/nmp/core/models/sidecars/adapters/main.py
  • services/core/models/tests/unit/api/test_models_api.py
  • services/core/models/tests/unit/sidecars/test_adapters_controller.py
  • services/guardrails/src/nmp/guardrails/api/dependencies.py
  • services/hello-world/tests/integration/tasks/test_workload_workspace_get_task.py
  • services/studio/src/nmp/studio/service.py
  • services/studio/tests/unit/test_service.py
💤 Files with no reviewable changes (2)
  • packages/nmp_common/src/nmp/common/http_clients.py
  • packages/nmp_testing/src/nmp/testing/client.py
🚧 Files skipped from review as they are similar to previous changes (21)
  • packages/nmp_common/src/nmp/common/service/init.py
  • services/core/jobs/src/nmp/core/jobs/api/v2/jobs/endpoints.py
  • packages/nmp_common/src/nmp/common/entities/client.py
  • services/core/files/src/nmp/core/files/api/endpoint_helpers.py
  • services/core/inference-gateway/tests/unit/conftest.py
  • services/core/inference-gateway/src/nmp/core/inference_gateway/testing/fixtures.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/client/adapter.py
  • services/core/models/src/nmp/core/models/api/service/model_entity_service.py
  • services/core/models/src/nmp/core/models/api/service/adapter_entity_service.py
  • packages/nmp_common/src/nmp/common/service/sdk_factory.py
  • services/core/inference-gateway/src/nmp/core/inference_gateway/service.py
  • services/hello-world/tests/integration/tasks/test_workload_workspace_get_task.py
  • services/core/inference-gateway/tests/unit/test_service.py
  • packages/nmp_common/src/nmp/common/immutable_http_client.py
  • services/guardrails/src/nmp/guardrails/api/dependencies.py
  • services/core/models/src/nmp/core/models/api/dependencies.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/sdk_provider.py
  • services/studio/src/nmp/studio/service.py
  • packages/nmp_common/tests/api/test_query_param_schemas.py
  • packages/nmp_common/src/nmp/common/service/base.py
  • services/core/models/src/nmp/core/models/api/v2/models.py

Comment thread packages/nmp_common/src/nmp/common/platform_endpoint.py
Comment thread packages/nmp_common/tests/test_platform_endpoint.py
@ironcommit
ironcommit force-pushed the AIRCORE-950-dependency-provider-sdk-test-client-migration/rsadler branch from 4eef4f6 to f5b4501 Compare July 28, 2026 16:11
Signed-off-by: Ryan S <267728323+ironcommit@users.noreply.github.com>
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