Skip to content

Commit 0937ec7

Browse files
jopemachineclaude
andcommitted
fix(BA-5830): propagate AppConfigGQL/AppConfigFragmentGQL import-cycle fix
Carry the BA-5829 `strawberry.lazy()` fix through this branch so the merged-view AppConfig type doesn't eagerly load `app_config_fragment.types.node` (which would re-enter `app_config.types` while it is still initializing). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent a627141 commit 0937ec7

1 file changed

Lines changed: 18 additions & 4 deletions

File tree

  • src/ai/backend/manager/api/gql/app_config/types

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

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,24 @@
22

33
from __future__ import annotations
44

5-
from typing import Any
5+
from typing import TYPE_CHECKING, Annotated
66
from uuid import UUID
77

8+
import strawberry
9+
from strawberry.scalars import JSON
10+
811
from ai.backend.common.dto.manager.v2.app_config.response import AppConfigNode
912
from ai.backend.common.meta.meta import NEXT_RELEASE_VERSION
10-
from ai.backend.manager.api.gql.app_config_fragment.types.node import AppConfigFragmentGQL
1113
from ai.backend.manager.api.gql.decorators import (
1214
BackendAIGQLMeta,
1315
gql_field,
1416
gql_pydantic_type,
1517
)
1618
from ai.backend.manager.api.gql.pydantic_compat import PydanticOutputMixin
1719

20+
if TYPE_CHECKING:
21+
from ai.backend.manager.api.gql.app_config_fragment.types.node import AppConfigFragmentGQL
22+
1823

1924
@gql_pydantic_type(
2025
BackendAIGQLMeta(
@@ -31,9 +36,18 @@
3136
class AppConfigGQL(PydanticOutputMixin[AppConfigNode]):
3237
user_id: UUID = gql_field(description="Target user's UUID.")
3338
name: str = gql_field(description="Policy / config name.")
34-
fragments: list[AppConfigFragmentGQL] = gql_field(
39+
# Use `strawberry.lazy()` to break the import cycle between
40+
# `app_config.types.node` and `app_config_fragment.types.node`:
41+
# the fragment package's `__init__.py` eagerly loads its resolver,
42+
# which imports `MyBulkCreate*` payloads back from `app_config.types`.
43+
fragments: list[
44+
Annotated[
45+
AppConfigFragmentGQL,
46+
strawberry.lazy("ai.backend.manager.api.gql.app_config_fragment.types.node"),
47+
]
48+
] = gql_field(
3549
description="Contributing fragments in merge order (low → high).",
3650
)
37-
config: dict[str, Any] | None = gql_field(
51+
config: JSON | None = gql_field(
3852
description="Deep-merged configuration, or null when every fragment is empty.",
3953
)

0 commit comments

Comments
 (0)