codemie-sdk-python 0.1.702__tar.gz → 0.1.704__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/PKG-INFO +1 -1
  2. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/pyproject.toml +1 -1
  3. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/__init__.py +2 -2
  4. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/a2a.py +26 -15
  5. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/cost_center.py +27 -0
  6. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/mcp_config.py +48 -1
  7. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/services/a2a.py +1 -1
  8. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/services/cost_center.py +22 -0
  9. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/services/mcp_configs.py +46 -1
  10. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/services/project.py +1 -1
  11. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/README.md +0 -0
  12. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/auth/__init__.py +0 -0
  13. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/auth/credentials.py +0 -0
  14. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/builders/__init__.py +0 -0
  15. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/builders/workflow/__init__.py +0 -0
  16. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/builders/workflow/builder.py +0 -0
  17. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/builders/workflow/definition.py +0 -0
  18. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/builders/workflow/publish.py +0 -0
  19. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/client/__init__.py +0 -0
  20. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/client/client.py +0 -0
  21. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/exceptions.py +0 -0
  22. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/__init__.py +0 -0
  23. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/activity_event.py +0 -0
  24. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/admin.py +0 -0
  25. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/analytics.py +0 -0
  26. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/assistant.py +0 -0
  27. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/categories.py +0 -0
  28. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/common.py +0 -0
  29. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/conversation.py +0 -0
  30. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/datasource.py +0 -0
  31. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/errors.py +0 -0
  32. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/file_operation.py +0 -0
  33. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/guardrails.py +0 -0
  34. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/integration.py +0 -0
  35. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/llm.py +0 -0
  36. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/mermaid.py +0 -0
  37. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/project.py +0 -0
  38. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/skill.py +0 -0
  39. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/task.py +0 -0
  40. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/user.py +0 -0
  41. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/vendor_assistant.py +0 -0
  42. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/vendor_guardrail.py +0 -0
  43. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/vendor_knowledgebase.py +0 -0
  44. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/vendor_runtime.py +0 -0
  45. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/vendor_workflow.py +0 -0
  46. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/workflow.py +0 -0
  47. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/workflow_execution_payload.py +0 -0
  48. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/workflow_state.py +0 -0
  49. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/workflow_thoughts.py +0 -0
  50. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/workflow_transition.py +0 -0
  51. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/models/workspace.py +0 -0
  52. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/services/activity_event.py +0 -0
  53. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/services/admin.py +0 -0
  54. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/services/analytics.py +0 -0
  55. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/services/assistant.py +0 -0
  56. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/services/categories.py +0 -0
  57. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/services/codemie_guardrails.py +0 -0
  58. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/services/conversation.py +0 -0
  59. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/services/customer_config_service.py +0 -0
  60. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/services/datasource.py +0 -0
  61. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/services/dynamic_config.py +0 -0
  62. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/services/files.py +0 -0
  63. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/services/integration.py +0 -0
  64. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/services/llm.py +0 -0
  65. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/services/mermaid.py +0 -0
  66. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/services/project_budget_groups.py +0 -0
  67. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/services/skill.py +0 -0
  68. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/services/task.py +0 -0
  69. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/services/user.py +0 -0
  70. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/services/vendor_assistant.py +0 -0
  71. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/services/vendor_guardrail.py +0 -0
  72. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/services/vendor_knowledgebase.py +0 -0
  73. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/services/vendor_runtime.py +0 -0
  74. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/services/vendor_workflow.py +0 -0
  75. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/services/webhook.py +0 -0
  76. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/services/workflow.py +0 -0
  77. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/services/workflow_execution.py +0 -0
  78. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/services/workflow_execution_state.py +0 -0
  79. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/services/workspace.py +0 -0
  80. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/utils/__init__.py +0 -0
  81. {codemie_sdk_python-0.1.702 → codemie_sdk_python-0.1.704}/src/codemie_sdk/utils/http.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codemie-sdk-python
3
- Version: 0.1.702
3
+ Version: 0.1.704
4
4
  Summary: CodeMie SDK for Python
5
5
  License: Apache-2.0
6
6
  Author: CodeMie
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "codemie-sdk-python"
3
- version = "0.1.702"
3
+ version = "0.1.704"
4
4
  description = "CodeMie SDK for Python"
5
5
  authors = ["CodeMie"]
6
6
  license = "Apache-2.0"
@@ -170,8 +170,8 @@ from .models.integration import (
170
170
  from .models.a2a import (
171
171
  AgentCard,
172
172
  AgentProvider,
173
+ AgentInterface,
173
174
  AgentCapabilities,
174
- AgentAuthentication,
175
175
  AgentSkill,
176
176
  )
177
177
  from .services.a2a import A2AService
@@ -307,8 +307,8 @@ __all__ = [
307
307
  "TypeOfIntegration",
308
308
  "AgentCard",
309
309
  "AgentProvider",
310
+ "AgentInterface",
310
311
  "AgentCapabilities",
311
- "AgentAuthentication",
312
312
  "AgentSkill",
313
313
  "A2AService",
314
314
  ]
@@ -1,4 +1,6 @@
1
- """A2A (agent-to-agent) models."""
1
+ """A2A (agent-to-agent) models (protocol v1.0)."""
2
+
3
+ from typing import Any
2
4
 
3
5
  from pydantic import BaseModel, ConfigDict
4
6
 
@@ -8,27 +10,28 @@ class AgentProvider(BaseModel):
8
10
 
9
11
  model_config = ConfigDict(extra="ignore")
10
12
 
11
- organization: str
13
+ organization: str | None = None
12
14
  url: str | None = None
13
15
 
14
16
 
15
- class AgentCapabilities(BaseModel):
16
- """Capabilities advertised by an A2A agent card."""
17
+ class AgentInterface(BaseModel):
18
+ """A transport interface the agent exposes."""
17
19
 
18
20
  model_config = ConfigDict(extra="ignore")
19
21
 
20
- streaming: bool = False
21
- pushNotifications: bool = False
22
- stateTransitionHistory: bool = False
22
+ url: str
23
+ protocolBinding: str | None = None
24
+ protocolVersion: str | None = None
23
25
 
24
26
 
25
- class AgentAuthentication(BaseModel):
26
- """Authentication schemes advertised by an A2A agent card."""
27
+ class AgentCapabilities(BaseModel):
28
+ """Capabilities advertised by an A2A agent card."""
27
29
 
28
30
  model_config = ConfigDict(extra="ignore")
29
31
 
30
- schemes: list[str]
31
- credentials: str | None = None
32
+ streaming: bool = False
33
+ pushNotifications: bool = False
34
+ extendedAgentCard: bool = False
32
35
 
33
36
 
34
37
  class AgentSkill(BaseModel):
@@ -52,12 +55,20 @@ class AgentCard(BaseModel):
52
55
 
53
56
  name: str
54
57
  description: str | None = None
55
- url: str
58
+ supportedInterfaces: list[AgentInterface]
56
59
  provider: AgentProvider | None = None
57
60
  version: str
58
61
  documentationUrl: str | None = None
59
62
  capabilities: AgentCapabilities
60
- authentication: AgentAuthentication | None = None
61
- defaultInputModes: list[str] = ["text"]
62
- defaultOutputModes: list[str] = ["text"]
63
+ securitySchemes: dict[str, dict[str, Any]] | None = None
64
+ securityRequirements: list[dict[str, Any]] | None = None
65
+ defaultInputModes: list[str] = []
66
+ defaultOutputModes: list[str] = []
63
67
  skills: list[AgentSkill]
68
+
69
+ @property
70
+ def protocol_version(self) -> str | None:
71
+ """Protocol version of the first advertised interface."""
72
+ if self.supportedInterfaces:
73
+ return self.supportedInterfaces[0].protocolVersion
74
+ return None
@@ -59,3 +59,30 @@ class PaginatedCostCenterListResponse(BaseModel):
59
59
 
60
60
  data: list[CostCenterResponse]
61
61
  pagination: PaginationInfo
62
+
63
+
64
+ class CostCenterAssignedBudgetSummary(BaseModel):
65
+ """Per-category budget totals aggregated across a cost center's linked projects."""
66
+
67
+ model_config = ConfigDict(extra="ignore")
68
+
69
+ budget_category: str
70
+ budget_duration: str | None = None
71
+ soft_budget: float
72
+ max_budget: float
73
+ member_count: int
74
+ allocated_member_budget_total: float
75
+ current_spending: float
76
+ excluded_count: int = 0
77
+ unsynced_count: int = 0
78
+
79
+
80
+ class CostCenterBudgetSummary(BaseModel):
81
+ """Combined budget rollup for a cost center across its linked projects."""
82
+
83
+ model_config = ConfigDict(extra="ignore")
84
+
85
+ current_spending: float
86
+ budget_limit: float | None = None
87
+ total_percent: float
88
+ budgets: list[CostCenterAssignedBudgetSummary] = []
@@ -24,6 +24,16 @@ class MCPServerConfigData(BaseModel):
24
24
  allow_issuer_prefix_match: bool = False
25
25
 
26
26
 
27
+ class MCPVariableDefinition(BaseModel):
28
+ """Definition of an environment variable required by an MCP server."""
29
+
30
+ model_config = ConfigDict(extra="ignore")
31
+
32
+ name: str
33
+ description: str
34
+ required: bool = True
35
+
36
+
27
37
  class MCPConfigCreateRequest(BaseModel):
28
38
  """Request model for creating a global MCP configuration entry."""
29
39
 
@@ -39,6 +49,42 @@ class MCPConfigCreateRequest(BaseModel):
39
49
  is_public: bool = False
40
50
 
41
51
 
52
+ class MCPConfigCloneRequest(BaseModel):
53
+ """Request model for cloning a global MCP configuration from a submitted form payload.
54
+
55
+ ``is_public`` and ``is_system`` are not part of the request: the clone always
56
+ inherits them from the source configuration.
57
+ """
58
+
59
+ model_config = ConfigDict(extra="ignore")
60
+
61
+ name: str = Field(..., min_length=1, max_length=255)
62
+ description: str | None = None
63
+ server_home_url: str | None = None
64
+ source_url: str | None = None
65
+ logo_url: str | None = None
66
+ categories: list[str] = Field(default_factory=list)
67
+ config: MCPServerConfigData
68
+ required_env_vars: list[MCPVariableDefinition] = Field(default_factory=list)
69
+
70
+
71
+ class MCPConfigUpdateRequest(BaseModel):
72
+ """Request model for updating a global MCP configuration; only provided fields are sent."""
73
+
74
+ model_config = ConfigDict(extra="ignore")
75
+
76
+ name: str | None = Field(None, min_length=1, max_length=255)
77
+ description: str | None = None
78
+ server_home_url: str | None = None
79
+ source_url: str | None = None
80
+ logo_url: str | None = None
81
+ categories: list[str] | None = None
82
+ config: MCPServerConfigData | None = None
83
+ required_env_vars: list[MCPVariableDefinition] | None = None
84
+ is_public: bool | None = None
85
+ is_active: bool | None = None
86
+
87
+
42
88
  class MCPConfigResponse(BaseModel):
43
89
  """Response model for a global MCP configuration entry."""
44
90
 
@@ -52,6 +98,7 @@ class MCPConfigResponse(BaseModel):
52
98
  logo_url: str | None = None
53
99
  categories: list[str] = Field(default_factory=list)
54
100
  config: MCPServerConfigData | None = None
101
+ required_env_vars: list[MCPVariableDefinition] = Field(default_factory=list)
55
102
  user_id: str | None = None
56
103
  is_public: bool = False
57
104
  is_system: bool = False
@@ -66,7 +113,7 @@ class MCPConfigListResponse(BaseModel):
66
113
 
67
114
  model_config = ConfigDict(extra="ignore")
68
115
 
69
- data: list[MCPConfigResponse] = Field(default_factory=list)
116
+ configs: list[MCPConfigResponse] = Field(default_factory=list)
70
117
  total: int = 0
71
118
  page: int = 0
72
119
  per_page: int = 20
@@ -27,7 +27,7 @@ class A2AService:
27
27
  AgentCard: agent discovery metadata for the assistant
28
28
  """
29
29
  return self._api.get(
30
- f"/v1/a2a/assistants/{assistant_id}/.well-known/agent.json",
30
+ f"/v1/a2a/assistants/{assistant_id}/.well-known/agent-card.json",
31
31
  AgentCard,
32
32
  wrap_response=False,
33
33
  )
@@ -17,6 +17,7 @@
17
17
  from uuid import UUID
18
18
 
19
19
  from ..models.cost_center import (
20
+ CostCenterBudgetSummary,
20
21
  CostCenterResponse,
21
22
  CreateCostCenterRequest,
22
23
  PaginatedCostCenterListResponse,
@@ -104,3 +105,24 @@ class CostCenterService:
104
105
  params=params,
105
106
  wrap_response=False,
106
107
  )
108
+
109
+ def get_budget_rollup(self, cost_center_id: UUID) -> CostCenterBudgetSummary:
110
+ """Get the budget rollup across the projects linked to a cost center (admin-only).
111
+
112
+ Sums the budgets of every linked project per category and overall.
113
+
114
+ Args:
115
+ cost_center_id: UUID of the cost center
116
+
117
+ Returns:
118
+ CostCenterBudgetSummary with overall spending, limit and percentage plus
119
+ a per-category breakdown
120
+
121
+ Raises:
122
+ HTTPError: If the request fails
123
+ """
124
+ return self._api.get(
125
+ f"/v1/admin/cost-centers/{cost_center_id}/budget-rollup",
126
+ response_model=CostCenterBudgetSummary,
127
+ wrap_response=False,
128
+ )
@@ -1,9 +1,11 @@
1
1
  """MCPConfigs service — Settings > MCPs management (global catalog entries)."""
2
2
 
3
3
  from ..models.mcp_config import (
4
+ MCPConfigCloneRequest,
4
5
  MCPConfigCreateRequest,
5
6
  MCPConfigListResponse,
6
7
  MCPConfigResponse,
8
+ MCPConfigUpdateRequest,
7
9
  )
8
10
  from ..utils import ApiRequestHandler, TokenSource
9
11
 
@@ -71,7 +73,50 @@ class MCPConfigsService:
71
73
  params=params,
72
74
  wrap_response=False,
73
75
  )
74
- return response.data
76
+ return response.configs
77
+
78
+ def clone(
79
+ self, config_id: str, request: MCPConfigCloneRequest
80
+ ) -> MCPConfigResponse:
81
+ """Create a new global MCP configuration from a clone form payload (admin only).
82
+
83
+ ``is_public`` and ``is_system`` are always copied from the source configuration.
84
+ An unchanged ``client_secret`` is carried over from the source.
85
+
86
+ Args:
87
+ config_id: ID of the source MCP config entry.
88
+ request: MCPConfigCloneRequest with the (possibly edited) parameters of the clone.
89
+
90
+ Returns:
91
+ The newly created MCPConfigResponse.
92
+ """
93
+ return self._api.post(
94
+ f"/v1/mcp-configs/{config_id}/clone",
95
+ MCPConfigResponse,
96
+ json_data=request.model_dump(exclude_none=True),
97
+ wrap_response=False,
98
+ )
99
+
100
+ def update(
101
+ self, config_id: str, request: MCPConfigUpdateRequest
102
+ ) -> MCPConfigResponse:
103
+ """Update a global MCP configuration (admin only).
104
+
105
+ Only the fields set on the request are sent.
106
+
107
+ Args:
108
+ config_id: The MCP config entry ID to update.
109
+ request: MCPConfigUpdateRequest with the fields to change.
110
+
111
+ Returns:
112
+ Updated MCPConfigResponse.
113
+ """
114
+ return self._api.put(
115
+ f"/v1/mcp-configs/{config_id}",
116
+ MCPConfigResponse,
117
+ json_data=request.model_dump(exclude_none=True),
118
+ wrap_response=False,
119
+ )
75
120
 
76
121
  def delete(self, config_id: str) -> None:
77
122
  """Delete a global MCP configuration entry.
@@ -205,7 +205,7 @@ class ProjectService:
205
205
  return self._api.patch(
206
206
  f"/v1/projects/{project_name}",
207
207
  response_model=ProjectUpdateResponse,
208
- json_data=payload.model_dump(exclude_none=True),
208
+ json_data=payload.model_dump(mode="json", exclude_none=True),
209
209
  )
210
210
 
211
211
  def delete_project(self, project_name: str) -> ProjectDeleteResponse: