Skip to content

Commit 93d30d5

Browse files
committed
fix(BA-5829): use strawberry JSON scalar for opaque config payloads
Strawberry's schema builder can't resolve `dict[str, Any]` to a GraphQL output/input type and fails the manager startup with `AppConfigFragment fields cannot be resolved. Unexpected type 'dict[str, typing.Any]'`. Switch the three opaque payload fields (`AppConfigGQL.config`, `AppConfigFragmentGQL.extra_config`, and the bulk-input `extra_config`) to `strawberry.scalars.JSON`, matching how `service_catalog`, `agent`, `deployment`, and `notification` already expose JSON-shaped fields.
1 parent ab4ce5f commit 93d30d5

3 files changed

Lines changed: 9 additions & 7 deletions

File tree

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22

33
from __future__ import annotations
44

5-
from typing import Any
65
from uuid import UUID
76

7+
from strawberry.scalars import JSON
8+
89
from ai.backend.common.dto.manager.v2.app_config.response import AppConfigNode
910
from ai.backend.common.meta.meta import NEXT_RELEASE_VERSION
1011
from ai.backend.manager.api.gql.app_config_fragment.types.node import AppConfigFragmentGQL
@@ -34,6 +35,6 @@ class AppConfigGQL(PydanticOutputMixin[AppConfigNode]):
3435
fragments: list[AppConfigFragmentGQL] = gql_field(
3536
description="Contributing fragments in merge order (low → high).",
3637
)
37-
config: dict[str, Any] | None = gql_field(
38+
config: JSON | None = gql_field(
3839
description="Deep-merged configuration, or null when every fragment is empty.",
3940
)

src/ai/backend/manager/api/gql/app_config_fragment/types/bulk_inputs.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from __future__ import annotations
44

5-
from typing import Any
5+
from strawberry.scalars import JSON
66

77
from ai.backend.common.dto.manager.v2.app_config_fragment.request import (
88
AdminAppConfigFragmentItemInput as AdminItemInputDTO,
@@ -46,7 +46,7 @@
4646
)
4747
class AdminAppConfigFragmentItemInputGQL(PydanticInputMixin[AdminItemInputDTO]):
4848
key: AppConfigFragmentKeyInputGQL = gql_field(description="Natural-key identifier.")
49-
extra_config: dict[str, Any] = gql_field(description="Raw configuration payload.")
49+
extra_config: JSON = gql_field(description="Raw configuration payload.")
5050

5151

5252
@gql_pydantic_input(
@@ -91,7 +91,7 @@ class AdminBulkPurgeAppConfigFragmentInputGQL(PydanticInputMixin[AdminBulkPurgeI
9191
)
9292
class MyAppConfigFragmentItemInputGQL(PydanticInputMixin[MyItemInputDTO]):
9393
name: str = gql_field(description="Policy name.")
94-
extra_config: dict[str, Any] = gql_field(description="Raw configuration payload.")
94+
extra_config: JSON = gql_field(description="Raw configuration payload.")
9595

9696

9797
@gql_pydantic_input(

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@
33
from __future__ import annotations
44

55
from datetime import datetime
6-
from typing import Any
76
from uuid import UUID
87

8+
from strawberry.scalars import JSON
9+
910
from ai.backend.common.dto.manager.v2.app_config_fragment.response import AppConfigFragmentNode
1011
from ai.backend.common.dto.manager.v2.app_config_fragment.types import AppConfigScopeType
1112
from ai.backend.common.meta.meta import NEXT_RELEASE_VERSION
@@ -41,7 +42,7 @@ class AppConfigFragmentGQL(PydanticOutputMixin[AppConfigFragmentNode]):
4142
scope_type: AppConfigScopeType = gql_field(description="Scope type.")
4243
scope_id: str = gql_field(description="Scope id.")
4344
name: str = gql_field(description="Policy name (FK to app_config_policies).")
44-
extra_config: dict[str, Any] | None = gql_field(
45+
extra_config: JSON | None = gql_field(
4546
description="Raw configuration payload, or null."
4647
)
4748
created_at: datetime = gql_field(description="Creation timestamp.")

0 commit comments

Comments
 (0)