Skip to content

feat(models): add typed NemoClient models foundation - #993

Merged
maxdubrinsky merged 4 commits into
mainfrom
aircore-876-typed-models-client/md
Aug 13, 2026
Merged

feat(models): add typed NemoClient models foundation#993
maxdubrinsky merged 4 commits into
mainfrom
aircore-876-typed-models-client/md

Conversation

@maxdubrinsky

@maxdubrinsky maxdubrinsky commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

What

Introduce the typed NemoClient Models service client that the AIRCORE-876 consumer migration will build on:

  • request/response DTOs (models/types.py)
  • PreparedRequest endpoint builders (models/endpoints.py)
  • the sync/async ModelsClient surface (models/client.py)

Why this is safe to merge now

Purely additive. No existing code imports this module yet, so it changes no runtime behavior and carries zero risk to current consumers. It is split out of the large AIRCORE-876 migration so reviewers can scrutinize the typed contract in isolation, before the mechanical consumer repoint lands.

The breaking, coupled steps land separately: the consumer repoint, the packages/models resources rewrite, and the vendored SDK sync (make vendor, which removes sdk.models.retrieve/create/list/adapters.*).

Also carries the method() descriptor fix this client requires: class-level attribute access now resolves without invoking the wrapped callable, so Mock(spec=ModelsClient) and other introspection tools no longer break. Plus a response.py docstring note on distinguishing 202/204 deletes.

Scope

  • models/{client,endpoints,types}.py
  • client/method.py (descriptor fix), client/response.py (docstring)
  • Tests: tests/models/{test_client,test_endpoints}.py, tests/client/test_method.py

Disjoint from the retry-fix PR; the two can merge in any order.

Verification

  • pytest packages/nemo_platform_plugin/tests -> 1076 passed
  • Endpoint-builder tests cover path/param/body serialization, exclude_unset, conflict-resolver wiring, and response typing
  • ruff check / ruff format --check clean

Summary by CodeRabbit

  • New Features
    • Added typed synchronous and asynchronous clients for managing models, adapters, providers, prompts, deployments, and configurations.
    • Added validated request and response models for model references, inference settings, deployment options, and tool definitions.
    • Added deployment and provider status polling with timeout, failure, and deletion handling.
    • Added helpers for generating OpenAI-compatible provider routes.
    • Improved endpoint introspection, documentation visibility, and class-level access.
  • Bug Fixes
    • Deployment deletions now record a DELETING status-history entry.
  • Documentation
    • Added guidance for distinguishing responses with multiple successful status codes.

@maxdubrinsky
maxdubrinsky requested review from a team as code owners July 30, 2026 17:39
@github-actions github-actions Bot added the feat label Jul 30, 2026
@coderabbitai

coderabbitai Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: a2183760-60ec-47cc-a1b0-d8d21531039f

📥 Commits

Reviewing files that changed from the base of the PR and between 847b28f and ee96c89.

📒 Files selected for processing (2)
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/models/client.py
  • packages/nemo_platform_plugin/tests/client/test_method.py
🚧 Files skipped from review as they are similar to previous changes (2)
  • packages/nemo_platform_plugin/tests/client/test_method.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/models/client.py

📝 Walkthrough

Walkthrough

Adds typed Models service DTOs and endpoint contracts, synchronous and asynchronous clients, OpenAI route builders, deployment/provider polling, conflict handling, deployment deletion history, and focused tests.

Changes

Models service client

Layer / File(s) Summary
Descriptor introspection and binding
packages/nemo_platform_plugin/src/nemo_platform_plugin/client/method.py, packages/nemo_platform_plugin/tests/client/test_method.py
EndpointMethod exposes endpoint metadata, supports class-level access, rejects unbound calls, and preserves sync/async instance binding.
Models service DTOs and validation
packages/nemo_platform_plugin/src/nemo_platform_plugin/models/types.py
Adds typed Models service entities, request models, enums, configuration schemas, query parameters, and validators.
Models service endpoint contract
packages/nemo_platform_plugin/src/nemo_platform_plugin/models/endpoints.py, packages/nemo_platform_plugin/tests/models/test_endpoints.py
Adds typed CRUD, versioning, status, listing, and conflict-replay endpoints for Models service resources, with prepared-request coverage.
Sync and async client behavior
packages/nemo_platform_plugin/src/nemo_platform_plugin/models/client.py, packages/nemo_platform_plugin/src/nemo_platform_plugin/client/response.py, packages/nemo_platform_plugin/tests/models/test_client.py
Adds endpoint-backed clients, OpenAI route builders, provider resolution, status polling, response-status guidance, and sync/async client tests.
Deployment deletion history
services/core/models/src/nmp/core/models/api/service/model_deployment_service.py, services/core/models/tests/unit/test_model_deployment_service_unit.py
Deployment deletion now appends a timestamped DELETING status-history entry for specific-version and bulk deletion paths.

Sequence Diagram(s)

sequenceDiagram
  participant ModelsClient
  participant ModelsAPI
  participant StatusHistory
  ModelsClient->>ModelsAPI: Fetch deployment or provider status
  ModelsAPI-->>ModelsClient: Return typed status response
  ModelsClient->>StatusHistory: Inspect new history entries
  StatusHistory-->>ModelsClient: Return current status and message
  ModelsClient->>ModelsAPI: Poll until desired, error, deletion, or timeout
Loading

Possibly related PRs

Suggested reviewers: marcusds

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 16.18% 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 clearly and concisely describes the main change: adding a typed Models foundation to NemoClient.
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 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch aircore-876-typed-models-client/md

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

🧹 Nitpick comments (2)
packages/nemo_platform_plugin/src/nemo_platform_plugin/models/client.py (1)

245-329: 🩺 Stability & Availability | 🔵 Trivial

Sync polling blocks the calling thread for up to timeout seconds.

wait_for_deployment_status/wait_for_provider_status on ModelsClient block synchronously (default up to 1200s / 60s). Consumer wiring is deferred to a separate PR — worth confirming those call-sites don't invoke this from a request-handling thread; prefer AsyncModelsClient or a NemoJob for long-running polls.

🤖 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/src/nemo_platform_plugin/models/client.py`
around lines 245 - 329, The wait_for_deployment_status and
wait_for_provider_status methods synchronously block the calling thread for
their full polling timeout. Review their call sites and ensure they are not
invoked from request-handling threads; route long-running polling through
AsyncModelsClient or a NemoJob instead, while preserving the existing polling
behavior for suitable synchronous callers.
packages/nemo_platform_plugin/tests/models/test_client.py (1)

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

Provider fixtures built with _model_json, not _provider_json.

Both test_create_provider_exist_ok_resolves_conflict (Line 186) and test_provider_route_for_deployment_fetches_provider (Line 240) build the mocked ModelProvider response via _model_json(...) (the ModelEntity-shaped helper) instead of _provider_json(...). It passes today, but it's confusing and fragile if the two DTOs diverge further.

♻️ Proposed fix
-    existing = httpx.Response(
-        200,
-        request=httpx.Request("GET", BASE),
-        json=_model_json("p", host_url="http://x") | {"host_url": "http://x"},
-    )
+    existing = httpx.Response(
+        200,
+        request=httpx.Request("GET", BASE),
+        json=_provider_json(name="p", host_url="http://x"),
+    )
-    http.request.return_value = httpx.Response(
-        200,
-        request=httpx.Request("GET", BASE),
-        json=_model_json("my-provider", host_url="https://api.example.com"),
-    )
+    http.request.return_value = httpx.Response(
+        200,
+        request=httpx.Request("GET", BASE),
+        json=_provider_json(name="my-provider", host_url="https://api.example.com"),
+    )

Also applies to: 235-247

🤖 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/models/test_client.py` around lines 179 -
198, Update the provider response fixtures in
test_create_provider_exist_ok_resolves_conflict and
test_provider_route_for_deployment_fetches_provider to use _provider_json(...)
instead of _model_json(...), while preserving the existing provider-specific
field overrides and assertions.
🤖 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/nemo_platform_plugin/src/nemo_platform_plugin/models/client.py`:
- Around line 237-243: Validate that model_provider_id contains the required
“workspace/name” delimiter before unpacking it in both
get_provider_route_openai_url_for_deployment and its async counterpart. Raise a
clear ValueError identifying the deployment and malformed model_provider_id,
while preserving the existing provider lookup for valid identifiers.

In `@packages/nemo_platform_plugin/tests/models/test_endpoints.py`:
- Around line 119-126: Replace the dynamic __import__ calls in
test_create_model_adapter_nested_path and the corresponding
update-model-deployment test with normal top-level imports for
CreateModelAdapterRequest and UpdateModelDeploymentConfigRequest, then
instantiate those imported classes directly at the call sites.

---

Nitpick comments:
In `@packages/nemo_platform_plugin/src/nemo_platform_plugin/models/client.py`:
- Around line 245-329: The wait_for_deployment_status and
wait_for_provider_status methods synchronously block the calling thread for
their full polling timeout. Review their call sites and ensure they are not
invoked from request-handling threads; route long-running polling through
AsyncModelsClient or a NemoJob instead, while preserving the existing polling
behavior for suitable synchronous callers.

In `@packages/nemo_platform_plugin/tests/models/test_client.py`:
- Around line 179-198: Update the provider response fixtures in
test_create_provider_exist_ok_resolves_conflict and
test_provider_route_for_deployment_fetches_provider to use _provider_json(...)
instead of _model_json(...), while preserving the existing provider-specific
field overrides and assertions.
🪄 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: 22aa54f6-4522-4cd6-b964-c9dfc8e2671c

📥 Commits

Reviewing files that changed from the base of the PR and between 5fe01ba and 773663e.

📒 Files selected for processing (8)
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/client/method.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/client/response.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/models/client.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/models/endpoints.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/models/types.py
  • packages/nemo_platform_plugin/tests/client/test_method.py
  • packages/nemo_platform_plugin/tests/models/test_client.py
  • packages/nemo_platform_plugin/tests/models/test_endpoints.py

Comment thread packages/nemo_platform_plugin/tests/models/test_endpoints.py
@maxdubrinsky
maxdubrinsky marked this pull request as draft July 30, 2026 17:50
@github-actions

github-actions Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor
Suite Lines Covered Line Rate Branch Rate
Unit Tests 32757/41507 78.9% 63.5%
Integration Tests 19159/39433 48.6% 20.7%

@maxdubrinsky
maxdubrinsky marked this pull request as ready for review July 30, 2026 18:30
Introduces the typed Models service client that the AIRCORE-876 consumer
migration will build on: request/response DTOs (types), PreparedRequest
endpoint builders (endpoints), and the sync/async ModelsClient surface
(client).

Purely additive: no existing code imports it yet, so it changes no runtime
behavior and carries zero risk to current consumers. Also carries the
method() descriptor fix that this client requires -- class-level attribute
access now resolves without invoking the wrapped callable, so
Mock(spec=ModelsClient) and other introspection no longer break -- plus a
response docstring note on distinguishing 202/204 deletes.

The consumer repoint, the packages/models resources rewrite, and the
vendored SDK sync land separately as the breaking, coupled steps. Covered
by endpoint-builder, client-surface, and descriptor tests.

Signed-off-by: Max Dubrinsky <mdubrinsky@nvidia.com>
…provider id

Address review findings on the typed Models client foundation:

- method() class-level access returns a per-owning-class callable stub
  (async def for async clients, def for sync) instead of the raw
  descriptor, so unittest.mock classifies async endpoints as AsyncMock.
  Previously Mock(spec=AsyncModelsClient).create_model was a sync
  MagicMock and could not be awaited, and create_autospec yielded
  non-callable stubs -- defeating the typed async client's purpose.
- delete_deployment appends a DELETING entry to status_history so the
  client (which reads status_history[-1] as current) no longer sees a
  stale status after a delete request.
- get_provider_route_openai_url_for_deployment guards a model_provider_id
  that lacks the workspace/ prefix with a clear ValueError instead of an
  opaque unpack crash.

Adds regression tests for all three.

Signed-off-by: Max Dubrinsky <mdubrinsky@nvidia.com>
@maxdubrinsky
maxdubrinsky force-pushed the aircore-876-typed-models-client/md branch from 773663e to 8103d6f Compare August 12, 2026 17:54
@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

Replace two call-time __import__("...types", fromlist=[...]) lookups in
the endpoint tests with normal names added to the existing top-level
import block (CreateModelAdapterRequest, UpdateModelDeploymentConfigRequest).
Addresses a CodeRabbit maintainability nit on PR #993.

Signed-off-by: Max Dubrinsky <mdubrinsky@nvidia.com>

@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

🧹 Nitpick comments (4)
packages/nemo_platform_plugin/tests/client/test_method.py (1)

87-99: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Test autospec signature enforcement.

This test checks mock classification only. Add invalid positional-call assertions for both clients. This verifies that create_autospec preserves the wrapped keyword-only endpoint signature.

Proposed test
     auto_sync = create_autospec(ModelsClient)
     assert callable(auto_sync.create_model)
     assert not isinstance(auto_sync.create_model, AsyncMock)
+    with pytest.raises(TypeError):
+        auto_sync.create_model("workspace", object())
 
     auto_async = create_autospec(AsyncModelsClient)
     assert callable(auto_async.create_model)
     assert isinstance(auto_async.create_model, AsyncMock)
+    with pytest.raises(TypeError):
+        auto_async.create_model("workspace", object())
🤖 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/client/test_method.py` around lines 87 -
99, Extend test_create_autospec_yields_awaitable_endpoint_stubs to invoke
create_model on both auto_sync and auto_async with an invalid positional
argument and assert each call raises TypeError. Keep the existing callable and
AsyncMock classification checks, and ensure the invalid calls exercise the
wrapped keyword-only signature enforced by create_autospec.
packages/nemo_platform_plugin/src/nemo_platform_plugin/models/types.py (2)

1417-1466: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

total=False plus NotRequired is redundant.

Every key already defaults to not-required under total=False. Remove NotRequired or remove total=False for one consistent style.

🤖 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/src/nemo_platform_plugin/models/types.py`
around lines 1417 - 1466, The query parameter TypedDicts redundantly combine
total=False with NotRequired annotations. Update ListModelsQueryParams,
GetModelQueryParams, ListAdaptersQueryParams, ListProvidersQueryParams,
ListPromptsQueryParams, ListDeploymentsQueryParams,
ListDeploymentConfigsQueryParams, and UpdateDeploymentStatusQueryParams to use
one consistent optional-key style by removing either total=False or the
NotRequired wrappers throughout.

451-458: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

list[...] | None with default_factory=list is contradictory.

The field can never be None by default, but the type permits None. Choose one: drop | None, or use default=None. This affects generated schema nullability for consumers.

Also applies to: 960-963

🤖 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/src/nemo_platform_plugin/models/types.py`
around lines 451 - 458, Resolve the nullability mismatch in the model fields
around served_models and the corresponding field near the later occurrence:
either remove | None to make the list non-nullable with default_factory=list, or
change the default to None to preserve nullable typing. Apply the same
consistent choice to both fields and ensure the generated schema reflects it.
packages/nemo_platform_plugin/tests/models/test_client.py (1)

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

Use concrete collection type hints.

Replace bare dict and list annotations with parameterized types such as dict[str, object] and list[dict[str, object]].

As per coding guidelines, “Prefer concrete type hints over string-based annotations.”

Also applies to: 38-38, 53-53

🤖 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/models/test_client.py` at line 26, Update
the type annotations in _model_json and the additionally referenced declarations
to use concrete parameterized collection types, replacing bare dict and list
annotations with forms such as dict[str, object] and list[dict[str, object]].

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.

Inline comments:
In `@packages/nemo_platform_plugin/src/nemo_platform_plugin/models/types.py`:
- Around line 112-120: Update the temperature Field description in the model
definition to match its actual constraints: allow values from 0 through 2,
explicitly permit 0.0, and remove the contradictory “between 0 and 1” and “can't
be set to 0.0” wording.

In
`@services/core/models/src/nmp/core/models/api/service/model_deployment_service.py`:
- Around line 497-501: Add a shared helper for deletion status-history updates
and use it in both DELETING branches near the direct status_history.append
calls. Have the helper compact adjacent entries with the same status and
message, cap history at 100 entries, and perform this normalization before
entity.update(); preserve the DELETING entry as the latest status.

---

Nitpick comments:
In `@packages/nemo_platform_plugin/src/nemo_platform_plugin/models/types.py`:
- Around line 1417-1466: The query parameter TypedDicts redundantly combine
total=False with NotRequired annotations. Update ListModelsQueryParams,
GetModelQueryParams, ListAdaptersQueryParams, ListProvidersQueryParams,
ListPromptsQueryParams, ListDeploymentsQueryParams,
ListDeploymentConfigsQueryParams, and UpdateDeploymentStatusQueryParams to use
one consistent optional-key style by removing either total=False or the
NotRequired wrappers throughout.
- Around line 451-458: Resolve the nullability mismatch in the model fields
around served_models and the corresponding field near the later occurrence:
either remove | None to make the list non-nullable with default_factory=list, or
change the default to None to preserve nullable typing. Apply the same
consistent choice to both fields and ensure the generated schema reflects it.

In `@packages/nemo_platform_plugin/tests/client/test_method.py`:
- Around line 87-99: Extend test_create_autospec_yields_awaitable_endpoint_stubs
to invoke create_model on both auto_sync and auto_async with an invalid
positional argument and assert each call raises TypeError. Keep the existing
callable and AsyncMock classification checks, and ensure the invalid calls
exercise the wrapped keyword-only signature enforced by create_autospec.

In `@packages/nemo_platform_plugin/tests/models/test_client.py`:
- Line 26: Update the type annotations in _model_json and the additionally
referenced declarations to use concrete parameterized collection types,
replacing bare dict and list annotations with forms such as dict[str, object]
and list[dict[str, object]].
🪄 Autofix

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: 33eaa1d4-354c-4be1-a02e-407be522e0ce

📥 Commits

Reviewing files that changed from the base of the PR and between d4b8171 and 8103d6f.

📒 Files selected for processing (10)
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/client/method.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/client/response.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/models/client.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/models/endpoints.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/models/types.py
  • packages/nemo_platform_plugin/tests/client/test_method.py
  • packages/nemo_platform_plugin/tests/models/test_client.py
  • packages/nemo_platform_plugin/tests/models/test_endpoints.py
  • services/core/models/src/nmp/core/models/api/service/model_deployment_service.py
  • services/core/models/tests/unit/test_model_deployment_service_unit.py
🚧 Files skipped from review as they are similar to previous changes (3)
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/client/response.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/models/endpoints.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/models/client.py

CI Lint all caught two issues from the earlier commits:

- ruff format collapses the malformed-model_provider_id message onto one
  line in client.py.
- ty reports call-non-callable / invalid-argument-type on the new
  class-level-access tests: EndpointMethod.__get__(obj=None) is typed as
  the descriptor because the overload cannot distinguish the sync vs async
  owning class, so ty cannot see the callable stub returned at runtime.
  The three tests deliberately exercise that runtime stub, so they carry
  targeted ty: ignore suppressions with an explanatory note.

Signed-off-by: Max Dubrinsky <mdubrinsky@nvidia.com>
@maxdubrinsky
maxdubrinsky added this pull request to the merge queue Aug 12, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Aug 12, 2026
@maxdubrinsky
maxdubrinsky added this pull request to the merge queue Aug 12, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Aug 12, 2026
@maxdubrinsky
maxdubrinsky added this pull request to the merge queue Aug 12, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Aug 12, 2026
@maxdubrinsky
maxdubrinsky added this pull request to the merge queue Aug 13, 2026
Merged via the queue into main with commit c8ff4e7 Aug 13, 2026
55 checks passed
@maxdubrinsky
maxdubrinsky deleted the aircore-876-typed-models-client/md branch August 13, 2026 14:14
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