Skip to content

Commit aee1824

Browse files
committed
refactor(BA-5947): expose search_model_cards on VFolderAdapter
Adds a thin façade so the VFolder field resolver reads naturally as `adapters.vfolder.search_model_cards(scope, input)` instead of reaching into the model_card adapter. The implementation still lives in `ModelCardAdapter.search_in_vfolder`; VFolderAdapter delegates via a constructor-injected reference, mirroring how the deployment adapter exposes `search_revisions` from the parent entity.
1 parent cec0484 commit aee1824

3 files changed

Lines changed: 32 additions & 3 deletions

File tree

src/ai/backend/manager/api/adapters/registry.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ def create(
171171
catalog endpoints always agree with the coordinators' live
172172
registrations.
173173
"""
174+
model_card_adapter = ModelCardAdapter(processors)
174175
return cls(
175176
agent=AgentAdapter(processors),
176177
app_config=AppConfigAdapter(processors),
@@ -203,7 +204,7 @@ def create(
203204
runtime_variant=RuntimeVariantAdapter(processors),
204205
runtime_variant_preset=RuntimeVariantPresetAdapter(processors),
205206
deployment_revision_preset=DeploymentRevisionPresetAdapter(processors),
206-
model_card=ModelCardAdapter(processors),
207+
model_card=model_card_adapter,
207208
resource_usage=ResourceUsageAdapter(processors),
208209
scheduling_handler=SchedulingHandlerAdapter(deployment_coordinator),
209210
scheduling_history=SchedulingHistoryAdapter(processors),
@@ -212,6 +213,6 @@ def create(
212213
storage_host=StorageHostAdapter(processors),
213214
storage_namespace=StorageNamespaceAdapter(processors),
214215
user=UserAdapter(processors, auth_config),
215-
vfolder=VFolderAdapter(processors),
216+
vfolder=VFolderAdapter(processors, model_card_adapter=model_card_adapter),
216217
vfs_storage=VFSStorageAdapter(processors),
217218
)

src/ai/backend/manager/api/adapters/vfolder/adapter.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,19 @@
33
from __future__ import annotations
44

55
import secrets
6+
from typing import TYPE_CHECKING
67
from uuid import UUID
78

9+
if TYPE_CHECKING:
10+
from ai.backend.manager.api.adapters.model_card.adapter import ModelCardAdapter
11+
from ai.backend.manager.services.processors import Processors
12+
813
from ai.backend.common.contexts.user import current_user
914
from ai.backend.common.data.model_deployment.types import DeploymentStrategy
1015
from ai.backend.common.dto.manager.v2.common import BinarySizeInfo
1116
from ai.backend.common.dto.manager.v2.deployment.request import DeploymentStrategyInput
17+
from ai.backend.common.dto.manager.v2.model_card.request import SearchModelCardsInput
18+
from ai.backend.common.dto.manager.v2.model_card.response import SearchModelCardsPayload
1219
from ai.backend.common.dto.manager.v2.vfolder.request import (
1320
BulkDeleteVFoldersInput,
1421
BulkPurgeVFoldersInput,
@@ -98,6 +105,7 @@
98105
combine_conditions_or,
99106
negate_conditions,
100107
)
108+
from ai.backend.manager.repositories.model_card.types import VFolderModelCardSearchScope
101109
from ai.backend.manager.repositories.vfolder.types import (
102110
ProjectVFolderSearchScope,
103111
UserVFolderSearchScope,
@@ -192,6 +200,26 @@ def _build_policy_from_strategy_input(
192200
class VFolderAdapter(BaseAdapter):
193201
"""Adapter for VFolder domain operations."""
194202

203+
def __init__(
204+
self,
205+
processors: Processors,
206+
model_card_adapter: ModelCardAdapter,
207+
) -> None:
208+
super().__init__(processors)
209+
self._model_card_adapter = model_card_adapter
210+
211+
async def search_model_cards(
212+
self,
213+
scope: VFolderModelCardSearchScope,
214+
input: SearchModelCardsInput,
215+
) -> SearchModelCardsPayload:
216+
"""Search model cards backed by a specific VFolder.
217+
218+
Façade over the model_card adapter so that nested resolvers on
219+
VFolder call sites read naturally as ``adapters.vfolder.search_model_cards``.
220+
"""
221+
return await self._model_card_adapter.search_in_vfolder(scope, input)
222+
195223
@staticmethod
196224
def _vfolder_data_to_node(data: VFolderData) -> VFolderNode:
197225
"""Convert VFolderData to VFolderNode DTO."""

src/ai/backend/manager/api/gql/vfolder_v2/types/node.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ async def model_cards(
113113
if order_by
114114
else None
115115
)
116-
result = await info.context.adapters.model_card.search_in_vfolder(
116+
result = await info.context.adapters.vfolder.search_model_cards(
117117
scope=VFolderModelCardSearchScope(vfolder_id=VFolderUUID(UUID(self.id))),
118118
input=SearchModelCardsInput(
119119
filter=filter.to_pydantic() if filter is not None else None,

0 commit comments

Comments
 (0)