codemie-sdk-python 0.1.595__tar.gz → 0.1.613__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 (72) hide show
  1. codemie_sdk_python-0.1.595/README.md → codemie_sdk_python-0.1.613/PKG-INFO +14 -43
  2. codemie_sdk_python-0.1.595/PKG-INFO → codemie_sdk_python-0.1.613/README.md +1 -56
  3. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/pyproject.toml +1 -1
  4. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/__init__.py +0 -8
  5. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/client/client.py +8 -0
  6. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/models/assistant.py +40 -50
  7. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/models/conversation.py +60 -1
  8. codemie_sdk_python-0.1.613/src/codemie_sdk/models/cost_center.py +42 -0
  9. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/models/datasource.py +30 -0
  10. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/models/integration.py +1 -0
  11. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/models/project.py +4 -0
  12. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/services/assistant.py +30 -96
  13. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/services/conversation.py +88 -2
  14. codemie_sdk_python-0.1.613/src/codemie_sdk/services/cost_center.py +76 -0
  15. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/services/datasource.py +9 -1
  16. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/services/project.py +4 -1
  17. codemie_sdk_python-0.1.613/src/codemie_sdk/services/project_budget_groups.py +158 -0
  18. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/services/workflow_execution.py +13 -0
  19. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/auth/__init__.py +0 -0
  20. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/auth/credentials.py +0 -0
  21. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/client/__init__.py +0 -0
  22. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/exceptions.py +0 -0
  23. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/models/__init__.py +0 -0
  24. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/models/activity_event.py +0 -0
  25. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/models/admin.py +0 -0
  26. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/models/analytics.py +0 -0
  27. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/models/categories.py +0 -0
  28. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/models/common.py +0 -0
  29. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/models/errors.py +0 -0
  30. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/models/file_operation.py +0 -0
  31. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/models/guardrails.py +0 -0
  32. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/models/llm.py +0 -0
  33. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/models/mcp_config.py +0 -0
  34. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/models/mermaid.py +0 -0
  35. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/models/skill.py +0 -0
  36. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/models/task.py +0 -0
  37. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/models/user.py +0 -0
  38. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/models/vendor_assistant.py +0 -0
  39. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/models/vendor_guardrail.py +0 -0
  40. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/models/vendor_knowledgebase.py +0 -0
  41. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/models/vendor_runtime.py +0 -0
  42. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/models/vendor_workflow.py +0 -0
  43. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/models/workflow.py +0 -0
  44. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/models/workflow_execution_payload.py +0 -0
  45. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/models/workflow_state.py +0 -0
  46. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/models/workflow_thoughts.py +0 -0
  47. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/models/workflow_transition.py +0 -0
  48. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/services/activity_event.py +0 -0
  49. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/services/admin.py +0 -0
  50. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/services/analytics.py +0 -0
  51. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/services/categories.py +0 -0
  52. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/services/codemie_guardrails.py +0 -0
  53. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/services/customer_config_service.py +0 -0
  54. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/services/dynamic_config.py +0 -0
  55. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/services/files.py +0 -0
  56. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/services/integration.py +0 -0
  57. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/services/llm.py +0 -0
  58. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/services/mcp_configs.py +0 -0
  59. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/services/mermaid.py +0 -0
  60. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/services/skill.py +0 -0
  61. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/services/task.py +0 -0
  62. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/services/user.py +0 -0
  63. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/services/vendor_assistant.py +0 -0
  64. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/services/vendor_guardrail.py +0 -0
  65. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/services/vendor_knowledgebase.py +0 -0
  66. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/services/vendor_runtime.py +0 -0
  67. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/services/vendor_workflow.py +0 -0
  68. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/services/webhook.py +0 -0
  69. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/services/workflow.py +0 -0
  70. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/services/workflow_execution_state.py +0 -0
  71. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/utils/__init__.py +0 -0
  72. {codemie_sdk_python-0.1.595 → codemie_sdk_python-0.1.613}/src/codemie_sdk/utils/http.py +0 -0
@@ -1,3 +1,16 @@
1
+ Metadata-Version: 2.1
2
+ Name: codemie-sdk-python
3
+ Version: 0.1.613
4
+ Summary: CodeMie SDK for Python
5
+ Author: Vadym Vlasenko
6
+ Author-email: vadym_vlasenko@epam.com
7
+ Requires-Python: >=3.12,<4.0
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: Programming Language :: Python :: 3.12
10
+ Requires-Dist: pydantic (>=2.12.2,<3.0.0)
11
+ Requires-Dist: requests (>=2.31.0,<3.0.0)
12
+ Description-Content-Type: text/markdown
13
+
1
14
  # CodeMie Python SDK
2
15
 
3
16
  Python SDK for CodeMie services. This SDK provides a comprehensive interface to interact with CodeMie services, including LLM (Large Language Models), assistants, workflows, and tools.
@@ -340,48 +353,6 @@ response = client.assistants.chat_with_version("assistant-id", version_number=2,
340
353
  print(response.generated)
341
354
  ```
342
355
 
343
- #### Project Feature Mapping
344
-
345
- Control which assistants have a feature enabled per project. Currently the only supported feature is `teams`.
346
-
347
- 1. **List assistants with a feature enabled for a project**
348
- ```python
349
- from codemie_sdk import AssistantProjectFeature
350
-
351
- assistants = client.assistants.list_project_mapping(
352
- feature=AssistantProjectFeature.teams,
353
- project="my-project",
354
- page=0,
355
- per_page=12,
356
- )
357
- for a in assistants:
358
- print(a.name)
359
- ```
360
-
361
- 2. **Enable a feature for an assistant on a project**
362
- ```python
363
- from codemie_sdk import AssistantProjectFeature, AssistantProjectMappingRequest
364
-
365
- request = AssistantProjectMappingRequest(
366
- project_name="my-project",
367
- feature=AssistantProjectFeature.teams,
368
- )
369
- response = client.assistants.enable_project_mapping("assistant-id", request)
370
- print(response.message)
371
- ```
372
-
373
- 3. **Disable a feature for an assistant on a project**
374
- ```python
375
- from codemie_sdk import AssistantProjectFeature
376
-
377
- response = client.assistants.disable_project_mapping(
378
- "assistant-id",
379
- project="my-project",
380
- feature=AssistantProjectFeature.teams,
381
- )
382
- print(response.message)
383
- ```
384
-
385
356
  ### Datasource Service
386
357
 
387
358
  The Datasource service enables managing various types of data sources in CodeMie, including code repositories, Confluence spaces, Jira projects, files, and Google documents.
@@ -1430,4 +1401,4 @@ poetry build
1430
1401
 
1431
1402
  # Publish to PyPI
1432
1403
  make publish
1433
- ```
1404
+ ```
@@ -1,16 +1,3 @@
1
- Metadata-Version: 2.1
2
- Name: codemie-sdk-python
3
- Version: 0.1.595
4
- Summary: CodeMie SDK for Python
5
- Author: Vadym Vlasenko
6
- Author-email: vadym_vlasenko@epam.com
7
- Requires-Python: >=3.12,<4.0
8
- Classifier: Programming Language :: Python :: 3
9
- Classifier: Programming Language :: Python :: 3.12
10
- Requires-Dist: pydantic (>=2.12.2,<3.0.0)
11
- Requires-Dist: requests (>=2.31.0,<3.0.0)
12
- Description-Content-Type: text/markdown
13
-
14
1
  # CodeMie Python SDK
15
2
 
16
3
  Python SDK for CodeMie services. This SDK provides a comprehensive interface to interact with CodeMie services, including LLM (Large Language Models), assistants, workflows, and tools.
@@ -353,48 +340,6 @@ response = client.assistants.chat_with_version("assistant-id", version_number=2,
353
340
  print(response.generated)
354
341
  ```
355
342
 
356
- #### Project Feature Mapping
357
-
358
- Control which assistants have a feature enabled per project. Currently the only supported feature is `teams`.
359
-
360
- 1. **List assistants with a feature enabled for a project**
361
- ```python
362
- from codemie_sdk import AssistantProjectFeature
363
-
364
- assistants = client.assistants.list_project_mapping(
365
- feature=AssistantProjectFeature.teams,
366
- project="my-project",
367
- page=0,
368
- per_page=12,
369
- )
370
- for a in assistants:
371
- print(a.name)
372
- ```
373
-
374
- 2. **Enable a feature for an assistant on a project**
375
- ```python
376
- from codemie_sdk import AssistantProjectFeature, AssistantProjectMappingRequest
377
-
378
- request = AssistantProjectMappingRequest(
379
- project_name="my-project",
380
- feature=AssistantProjectFeature.teams,
381
- )
382
- response = client.assistants.enable_project_mapping("assistant-id", request)
383
- print(response.message)
384
- ```
385
-
386
- 3. **Disable a feature for an assistant on a project**
387
- ```python
388
- from codemie_sdk import AssistantProjectFeature
389
-
390
- response = client.assistants.disable_project_mapping(
391
- "assistant-id",
392
- project="my-project",
393
- feature=AssistantProjectFeature.teams,
394
- )
395
- print(response.message)
396
- ```
397
-
398
343
  ### Datasource Service
399
344
 
400
345
  The Datasource service enables managing various types of data sources in CodeMie, including code repositories, Confluence spaces, Jira projects, files, and Google documents.
@@ -1443,4 +1388,4 @@ poetry build
1443
1388
 
1444
1389
  # Publish to PyPI
1445
1390
  make publish
1446
- ```
1391
+ ```
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "codemie-sdk-python"
3
- version = "0.1.595"
3
+ version = "0.1.613"
4
4
  description = "CodeMie SDK for Python"
5
5
  authors = [
6
6
  "Vadym Vlasenko <vadym_vlasenko@epam.com>",
@@ -151,10 +151,6 @@ from .models.skill import (
151
151
  from .services.skill import SkillService
152
152
  from .models.assistant import (
153
153
  BuiltinSubagent,
154
- AssistantProjectFeature,
155
- AssistantProjectMappingRequest,
156
- AssistantProjectMappingPagination,
157
- AssistantProjectMappingListResponse,
158
154
  )
159
155
  from .models.integration import (
160
156
  TransferMode,
@@ -165,10 +161,6 @@ from .models.integration import (
165
161
  __version__ = "0.2.12"
166
162
  __all__ = [
167
163
  "CodeMieClient",
168
- "AssistantProjectFeature",
169
- "AssistantProjectMappingRequest",
170
- "AssistantProjectMappingPagination",
171
- "AssistantProjectMappingListResponse",
172
164
  "VendorType",
173
165
  "VendorAssistantSetting",
174
166
  "VendorAssistantSettingsResponse",
@@ -28,7 +28,9 @@ from ..services.activity_event import ActivityEventService
28
28
  from ..services.codemie_guardrails import CodemieGuardrailService
29
29
  from ..services.dynamic_config import DynamicConfigService
30
30
  from ..services.mcp_configs import MCPConfigsService
31
+ from ..services.cost_center import CostCenterService
31
32
  from ..services.customer_config_service import CustomerConfigService
33
+ from ..services.project_budget_groups import ProjectBudgetGroupsService
32
34
 
33
35
 
34
36
  class CodeMieClient:
@@ -173,6 +175,12 @@ class CodeMieClient:
173
175
  self.customer_config = CustomerConfigService(
174
176
  self._api_domain, _token_source, verify_ssl=self._verify_ssl
175
177
  )
178
+ self.cost_centers = CostCenterService(
179
+ self._api_domain, _token_source, verify_ssl=self._verify_ssl
180
+ )
181
+ self.project_budget_groups = ProjectBudgetGroupsService(
182
+ self._api_domain, _token_source, verify_ssl=self._verify_ssl
183
+ )
176
184
 
177
185
  @property
178
186
  def token(self) -> str:
@@ -181,6 +181,44 @@ class AssistantListResponse(BaseModel):
181
181
  created_by: User | None = None
182
182
 
183
183
 
184
+ class ToolCallPolicy(str, Enum):
185
+ """Policy governing when tool calls require user approval."""
186
+
187
+ AUTO_APPROVE = "auto_approve"
188
+ APPROVE_FOR_ME = "approve_for_me"
189
+ ASK_FOR_APPROVAL = "ask_for_approval"
190
+
191
+
192
+ class ToolCallAction(str, Enum):
193
+ """User action on a pending tool-call confirmation."""
194
+
195
+ ALLOW = "allow"
196
+ DENY = "deny"
197
+
198
+
199
+ class ToolPermissionsConfig(BaseModel):
200
+ """Configuration for tool-call approval policy on an assistant."""
201
+
202
+ model_config = ConfigDict(extra="ignore")
203
+
204
+ tool_call_policy: ToolCallPolicy = ToolCallPolicy.AUTO_APPROVE
205
+ allow_override: bool = True
206
+
207
+
208
+ class ToolCallResumeRequest(BaseModel):
209
+ """Request body for POST /v1/assistants/{id}/model/tool-call/resume."""
210
+
211
+ model_config = ConfigDict(extra="ignore", use_enum_values=True)
212
+
213
+ conversation_id: str = Field(
214
+ description="Conversation ID that has a pending tool-call checkpoint"
215
+ )
216
+ action: ToolCallAction = Field(
217
+ description="User decision: 'allow' executes the tool, 'deny' rejects it"
218
+ )
219
+ stream: bool = Field(default=True, description="Enable streaming NDJSON response")
220
+
221
+
184
222
  class Assistant(AssistantBase):
185
223
  """Full assistant model with additional fields."""
186
224
 
@@ -233,6 +271,7 @@ class Assistant(AssistantBase):
233
271
  default=None,
234
272
  description="Number of times this assistant has been cloned in the Marketplace",
235
273
  )
274
+ tool_permissions: ToolPermissionsConfig | None = None
236
275
 
237
276
 
238
277
  class AssistantRequestBase(AssistantBase):
@@ -268,6 +307,7 @@ class AssistantRequestBase(AssistantBase):
268
307
  enabled_builtin_subagents: list[str] | None = None
269
308
  prompt_variables: list[PromptVariable] = Field(default_factory=list)
270
309
  skip_integration_validation: bool | None = Field(default=False)
310
+ tool_permissions: ToolPermissionsConfig | None = None
271
311
 
272
312
 
273
313
  class AssistantCreateRequest(AssistantRequestBase):
@@ -612,53 +652,3 @@ class ReactionRequest(BaseModel):
612
652
  model_config = ConfigDict(extra="ignore", use_enum_values=True)
613
653
 
614
654
  reaction: ReactionType = Field(description="Reaction type: 'like' or 'dislike'")
615
-
616
-
617
- class AssistantProjectFeature(str, Enum):
618
- """Feature discriminator for assistant/project mappings (e.g. Teams bot).
619
-
620
- This enum is expected to grow over time on the backend; treat unrecognized
621
- wire values defensively rather than assuming this is the complete set.
622
- """
623
-
624
- TEAMS = "teams"
625
-
626
-
627
- class AssistantProjectMappingRequest(BaseModel):
628
- """Request body for POST /v1/assistants/{assistant_id}/projects/mapping."""
629
-
630
- model_config = ConfigDict(extra="ignore", use_enum_values=True)
631
-
632
- project_name: str = Field(description="Project (application) name")
633
- feature: AssistantProjectFeature = Field(
634
- description="Feature discriminator this mapping is for, e.g. 'teams'"
635
- )
636
-
637
-
638
- class AssistantProjectMappingPagination(BaseModel):
639
- """Pagination metadata returned by GET /v1/assistants/projects/mapping."""
640
-
641
- model_config = ConfigDict(extra="ignore")
642
-
643
- page: int = Field(description="Current page, 0-indexed")
644
- per_page: int = Field(description="Items per page")
645
- total: int = Field(description="Total matching assistants across all pages")
646
-
647
-
648
- class AssistantProjectMappingListResponse(BaseModel):
649
- """Response for GET /v1/assistants/projects/mapping.
650
-
651
- List items are intentionally typed as ``dict[str, Any]`` rather than
652
- ``Assistant``/``AssistantBase``. The backend contract documents this
653
- endpoint as returning "the same shape as GET /v1/assistants", but that
654
- endpoint's own shape is parameterized by a ``minimal_response`` flag that
655
- this new endpoint does not expose, and the exact per-item fields returned
656
- here are not otherwise confirmed. Rather than guess the wire format,
657
- callers get the raw dict and can assert on whichever fields they need
658
- (e.g. ``item["id"]``).
659
- """
660
-
661
- model_config = ConfigDict(extra="ignore")
662
-
663
- data: list[dict[str, Any]] = Field(default_factory=list)
664
- pagination: AssistantProjectMappingPagination
@@ -4,7 +4,7 @@ from __future__ import annotations
4
4
 
5
5
  from datetime import datetime
6
6
 
7
- from pydantic import BaseModel, Field
7
+ from pydantic import BaseModel, ConfigDict, Field
8
8
 
9
9
  from codemie_sdk.models.assistant import ContextType
10
10
 
@@ -14,6 +14,8 @@ class Conversation(BaseModel):
14
14
  Model for conversation summary data as returned from the list endpoint.
15
15
  """
16
16
 
17
+ model_config = ConfigDict(extra="ignore")
18
+
17
19
  id: str
18
20
  name: str
19
21
  folder: str | None
@@ -21,6 +23,7 @@ class Conversation(BaseModel):
21
23
  date: str
22
24
  assistant_ids: list[str]
23
25
  initial_assistant_id: str | None
26
+ finished_at: datetime | None = None
24
27
 
25
28
 
26
29
  class Mark(BaseModel):
@@ -177,6 +180,7 @@ class ConversationDetails(BaseModel):
177
180
  is_workflow_conversation: bool | None = None
178
181
  category: str | None
179
182
  mcp_server_single_usage: bool | None = False
183
+ finished_at: datetime | None = None
180
184
 
181
185
 
182
186
  class ConversationShareRequest(BaseModel):
@@ -256,3 +260,58 @@ class UpsertHistoryResponse(BaseModel):
256
260
  new_messages: int
257
261
  total_messages: int
258
262
  created: bool
263
+
264
+
265
+ class ConversationFinishResponse(BaseModel):
266
+ """Response for POST /conversations/{conversation_id}/finish (owner-only, not idempotent).
267
+
268
+ Already-finished conversations cause the server to raise HTTP 409 rather
269
+ than return this response again.
270
+ """
271
+
272
+ model_config = ConfigDict(populate_by_name=True)
273
+
274
+ conversation_id: str = Field(alias="conversationId")
275
+ finished_at: datetime = Field(alias="finishedAt")
276
+
277
+
278
+ class ConversationFinishResult(BaseModel):
279
+ """Per-conversation-ID result entry within a bulk-finish response."""
280
+
281
+ model_config = ConfigDict(populate_by_name=True)
282
+
283
+ conversation_id: str = Field(alias="conversationId")
284
+ already_finished: bool = Field(default=False, alias="alreadyFinished")
285
+ finished_at: datetime | None = Field(default=None, alias="finishedAt")
286
+ error: str | None = None
287
+
288
+
289
+ class ConversationFinishBulkRequest(BaseModel):
290
+ """Request body for POST /admin/conversations/finish-bulk."""
291
+
292
+ model_config = ConfigDict(populate_by_name=True)
293
+
294
+ conversation_ids: list[str] = Field(alias="conversationIds")
295
+
296
+
297
+ class ConversationFinishBulkResponse(BaseModel):
298
+ """Response for POST /admin/conversations/finish-bulk (admin-only, idempotent per ID)."""
299
+
300
+ total: int
301
+ results: list[ConversationFinishResult]
302
+
303
+
304
+ class ConversationPagination(BaseModel):
305
+ """Pagination metadata for the admin conversation list endpoint."""
306
+
307
+ page: int
308
+ per_page: int
309
+ total: int
310
+ pages: int
311
+
312
+
313
+ class AdminConversationListResponse(BaseModel):
314
+ """Paginated response for GET /admin/conversations (admin-only, cross-user)."""
315
+
316
+ data: list[Conversation]
317
+ pagination: ConversationPagination
@@ -0,0 +1,42 @@
1
+ # Copyright 2026 EPAM Systems, Inc. ("EPAM")
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ """Cost center management models for the CodeMie SDK."""
16
+
17
+ from datetime import datetime
18
+ from uuid import UUID
19
+
20
+ from pydantic import BaseModel, ConfigDict
21
+
22
+
23
+ class CostCenterResponse(BaseModel):
24
+ """Response model for a cost center."""
25
+
26
+ model_config = ConfigDict(extra="ignore")
27
+
28
+ id: UUID
29
+ name: str
30
+ description: str | None = None
31
+ created_by: str
32
+ created_at: datetime
33
+ project_count: int = 0
34
+
35
+
36
+ class CreateCostCenterRequest(BaseModel):
37
+ """Request model for creating a cost center."""
38
+
39
+ model_config = ConfigDict(extra="ignore")
40
+
41
+ name: str
42
+ description: str | None = None
@@ -123,6 +123,15 @@ class AzureDevOpsWorkItem(BaseModel):
123
123
  model_config = ConfigDict(extra="ignore")
124
124
 
125
125
 
126
+ class XWiki(BaseModel):
127
+ """Model for xWiki-specific response fields"""
128
+
129
+ space: str | None = None
130
+ wiki: str | None = None
131
+
132
+ model_config = ConfigDict(extra="ignore")
133
+
134
+
126
135
  class Code(BaseModel):
127
136
  """Model for code repository datasource creation"""
128
137
 
@@ -239,6 +248,17 @@ class AzureDevOpsWorkItemDataSourceRequest(BaseDataSourceRequest, AzureDevOpsWor
239
248
  super().__init__(type=DataSourceType.AZURE_DEVOPS_WORK_ITEM, **data)
240
249
 
241
250
 
251
+ class XWikiDataSourceRequest(BaseDataSourceRequest, XWiki):
252
+ """Model for xWiki datasource creation requests"""
253
+
254
+ def __init__(self, **data):
255
+ super().__init__(type=DataSourceType.XWIKI, **data)
256
+
257
+ @classmethod
258
+ def required_fields(cls) -> list[str]:
259
+ return ["space"]
260
+
261
+
242
262
  class BaseUpdateDataSourceRequest(BaseDataSourceRequest):
243
263
  """Mixin update-specific reindex fields"""
244
264
 
@@ -327,6 +347,13 @@ class UpdateAzureDevOpsWorkItemDataSourceRequest(
327
347
  super().__init__(type=DataSourceType.AZURE_DEVOPS_WORK_ITEM, **data)
328
348
 
329
349
 
350
+ class UpdateXWikiDataSourceRequest(BaseUpdateDataSourceRequest, XWiki):
351
+ """Model for xWiki datasource updates"""
352
+
353
+ def __init__(self, **data):
354
+ super().__init__(type=DataSourceType.XWIKI, **data)
355
+
356
+
330
357
  class CodeAnalysisDataSourceRequest(BaseModel):
331
358
  """Model for provider-based datasource creation requests"""
332
359
 
@@ -399,6 +426,8 @@ class DataSource(BaseModel):
399
426
  azure_devops_wiki: AzureDevOpsWiki | None = None
400
427
  # Azure DevOps Work Item specific fields
401
428
  azure_devops_work_item: AzureDevOpsWorkItem | None = None
429
+ # xWiki specific fields
430
+ xwiki: XWiki | None = None
402
431
 
403
432
  @model_validator(mode="before")
404
433
  def before_init(cls, values):
@@ -417,6 +446,7 @@ class DataSource(BaseModel):
417
446
  DataSourceType.GOOGLE,
418
447
  DataSourceType.AZURE_DEVOPS_WIKI,
419
448
  DataSourceType.AZURE_DEVOPS_WORK_ITEM,
449
+ DataSourceType.XWIKI,
420
450
  ]:
421
451
  complete_state = values.get("complete_state", 0)
422
452
  if complete_state is not None:
@@ -41,6 +41,7 @@ class CredentialTypes(str, Enum):
41
41
  SHAREPOINT = "SharePoint"
42
42
  GOOGLE_OAUTH = "GoogleOAuth"
43
43
  XWIKI = "XWiki"
44
+ MS_TEAMS = "MSTeams"
44
45
 
45
46
 
46
47
  class IntegrationType(str, Enum):
@@ -79,6 +79,7 @@ class ProjectListItem(BaseModel):
79
79
  cost_center_name: str | None = None
80
80
  spending: float | None = None
81
81
  budgets: list[ProjectBudgetItem] | None = []
82
+ chargeback_attribution: str = "project"
82
83
 
83
84
 
84
85
  class PaginationInfo(BaseModel):
@@ -116,6 +117,7 @@ class ProjectDetailResponse(BaseModel):
116
117
  cost_center_id: UUID | None = None
117
118
  cost_center_name: str | None = None
118
119
  members: list[ProjectMember]
120
+ chargeback_attribution: str = "project"
119
121
 
120
122
 
121
123
  class ProjectCreateRequest(BaseModel):
@@ -147,6 +149,7 @@ class ProjectCreateResponse(BaseModel):
147
149
  cost_center_id: UUID | None = None
148
150
  cost_center_name: str | None = None
149
151
  enforce_member_spend_limits: bool = False
152
+ chargeback_attribution: str = "project"
150
153
 
151
154
 
152
155
  # PATCH /v1/projects/{name} returns the same shape as the create response
@@ -168,6 +171,7 @@ class ProjectUpdateRequest(BaseModel):
168
171
  cost_center_id: UUID | None = None
169
172
  clear_cost_center: bool = False
170
173
  enforce_member_spend_limits: bool | None = None
174
+ chargeback_attribution: str | None = None
171
175
 
172
176
 
173
177
  class ProjectDeleteResponse(BaseModel):