codemie-sdk-python 0.1.611__tar.gz → 0.1.612__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.611 → codemie_sdk_python-0.1.612}/PKG-INFO +1 -1
  2. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/pyproject.toml +1 -1
  3. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/models/conversation.py +60 -1
  4. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/services/conversation.py +88 -2
  5. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/README.md +0 -0
  6. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/__init__.py +0 -0
  7. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/auth/__init__.py +0 -0
  8. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/auth/credentials.py +0 -0
  9. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/client/__init__.py +0 -0
  10. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/client/client.py +0 -0
  11. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/exceptions.py +0 -0
  12. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/models/__init__.py +0 -0
  13. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/models/activity_event.py +0 -0
  14. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/models/admin.py +0 -0
  15. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/models/analytics.py +0 -0
  16. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/models/assistant.py +0 -0
  17. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/models/categories.py +0 -0
  18. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/models/common.py +0 -0
  19. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/models/cost_center.py +0 -0
  20. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/models/datasource.py +0 -0
  21. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/models/errors.py +0 -0
  22. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/models/file_operation.py +0 -0
  23. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/models/guardrails.py +0 -0
  24. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/models/integration.py +0 -0
  25. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/models/llm.py +0 -0
  26. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/models/mcp_config.py +0 -0
  27. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/models/mermaid.py +0 -0
  28. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/models/project.py +0 -0
  29. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/models/skill.py +0 -0
  30. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/models/task.py +0 -0
  31. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/models/user.py +0 -0
  32. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/models/vendor_assistant.py +0 -0
  33. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/models/vendor_guardrail.py +0 -0
  34. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/models/vendor_knowledgebase.py +0 -0
  35. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/models/vendor_runtime.py +0 -0
  36. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/models/vendor_workflow.py +0 -0
  37. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/models/workflow.py +0 -0
  38. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/models/workflow_execution_payload.py +0 -0
  39. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/models/workflow_state.py +0 -0
  40. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/models/workflow_thoughts.py +0 -0
  41. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/models/workflow_transition.py +0 -0
  42. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/services/activity_event.py +0 -0
  43. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/services/admin.py +0 -0
  44. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/services/analytics.py +0 -0
  45. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/services/assistant.py +0 -0
  46. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/services/categories.py +0 -0
  47. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/services/codemie_guardrails.py +0 -0
  48. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/services/cost_center.py +0 -0
  49. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/services/customer_config_service.py +0 -0
  50. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/services/datasource.py +0 -0
  51. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/services/dynamic_config.py +0 -0
  52. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/services/files.py +0 -0
  53. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/services/integration.py +0 -0
  54. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/services/llm.py +0 -0
  55. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/services/mcp_configs.py +0 -0
  56. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/services/mermaid.py +0 -0
  57. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/services/project.py +0 -0
  58. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/services/project_budget_groups.py +0 -0
  59. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/services/skill.py +0 -0
  60. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/services/task.py +0 -0
  61. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/services/user.py +0 -0
  62. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/services/vendor_assistant.py +0 -0
  63. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/services/vendor_guardrail.py +0 -0
  64. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/services/vendor_knowledgebase.py +0 -0
  65. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/services/vendor_runtime.py +0 -0
  66. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/services/vendor_workflow.py +0 -0
  67. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/services/webhook.py +0 -0
  68. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/services/workflow.py +0 -0
  69. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/services/workflow_execution.py +0 -0
  70. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/services/workflow_execution_state.py +0 -0
  71. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/utils/__init__.py +0 -0
  72. {codemie_sdk_python-0.1.611 → codemie_sdk_python-0.1.612}/src/codemie_sdk/utils/http.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: codemie-sdk-python
3
- Version: 0.1.611
3
+ Version: 0.1.612
4
4
  Summary: CodeMie SDK for Python
5
5
  Author: Vadym Vlasenko
6
6
  Author-email: vadym_vlasenko@epam.com
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "codemie-sdk-python"
3
- version = "0.1.611"
3
+ version = "0.1.612"
4
4
  description = "CodeMie SDK for Python"
5
5
  authors = [
6
6
  "Vadym Vlasenko <vadym_vlasenko@epam.com>",
@@ -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
@@ -5,9 +5,13 @@ from __future__ import annotations
5
5
  import requests
6
6
 
7
7
  from ..models.conversation import (
8
+ AdminConversationListResponse,
8
9
  Conversation,
9
10
  ConversationDetails,
10
11
  ConversationCreateRequest,
12
+ ConversationFinishBulkRequest,
13
+ ConversationFinishBulkResponse,
14
+ ConversationFinishResponse,
11
15
  UpdateConversationRequest,
12
16
  ConversationFolder,
13
17
  UpdateConversationFolderRequest,
@@ -36,13 +40,19 @@ class ConversationService:
36
40
  """
37
41
  self._api = ApiRequestHandler(api_domain, token, verify_ssl)
38
42
 
39
- def list(self) -> list[Conversation]:
43
+ def list(self, is_finished: bool | None = None) -> list[Conversation]:
40
44
  """Get list of all conversations for the current user.
41
45
 
46
+ Args:
47
+ is_finished: Optional filter narrowing the list to finished (True)
48
+ or unfinished (False) conversations only. Maps to the
49
+ ``isFinished`` query parameter.
50
+
42
51
  Returns:
43
52
  List of all conversations for the current user.
44
53
  """
45
- return self._api.get("/v1/conversations", list[Conversation])
54
+ params = {"isFinished": is_finished} if is_finished is not None else None
55
+ return self._api.get("/v1/conversations", list[Conversation], params=params)
46
56
 
47
57
  def list_by_assistant_id(self, assistant_id: str) -> list[Conversation]:
48
58
  """Get list of all conversations for the current user that include the specified assistant.
@@ -338,3 +348,79 @@ class ConversationService:
338
348
  f"/v1/share/conversations/{token}",
339
349
  SharedConversationResponse,
340
350
  )
351
+
352
+ # Conversation finishing (EPMCDME-11067)
353
+
354
+ def finish(self, conversation_id: str) -> ConversationFinishResponse:
355
+ """Mark a conversation as finished (owner-only).
356
+
357
+ Not idempotent: a repeat call on an already-finished conversation
358
+ raises HTTP 409 rather than returning success again.
359
+
360
+ Args:
361
+ conversation_id: Conversation ID to finish
362
+
363
+ Returns:
364
+ ConversationFinishResponse with the conversation ID and timestamp
365
+ """
366
+ return self._api.post(
367
+ f"/v1/conversations/{conversation_id}/finish",
368
+ ConversationFinishResponse,
369
+ )
370
+
371
+ def finish_bulk(
372
+ self, conversation_ids: list[str]
373
+ ) -> ConversationFinishBulkResponse:
374
+ """Finish multiple conversations in one request (admin-only).
375
+
376
+ Idempotent per ID: already-finished IDs are reported with
377
+ already_finished=True instead of erroring. Unknown IDs are reported
378
+ with error="not_found".
379
+
380
+ Args:
381
+ conversation_ids: List of conversation IDs to finish (1-500)
382
+
383
+ Returns:
384
+ ConversationFinishBulkResponse with per-ID results
385
+ """
386
+ request = ConversationFinishBulkRequest(conversation_ids=conversation_ids)
387
+ return self._api.post(
388
+ "/v1/admin/conversations/finish-bulk",
389
+ ConversationFinishBulkResponse,
390
+ json_data=request.model_dump(by_alias=True),
391
+ )
392
+
393
+ def list_admin(
394
+ self,
395
+ is_finished: bool | None = None,
396
+ started_after: str | None = None,
397
+ project: str | None = None,
398
+ page: int = 0,
399
+ per_page: int = 20,
400
+ ) -> AdminConversationListResponse:
401
+ """Paginated, cross-user conversation list for admin/scheduler use (admin-only).
402
+
403
+ Args:
404
+ is_finished: Optional filter (maps to ``isFinished``)
405
+ started_after: Optional ISO datetime lower bound (maps to ``startedAt``)
406
+ project: Optional project ID to scope the listing to one application
407
+ page: Page number (0-based)
408
+ per_page: Number of items per page (maps to ``perPage``)
409
+
410
+ Returns:
411
+ AdminConversationListResponse with items and pagination metadata
412
+ """
413
+ params: dict = {"page": page, "perPage": per_page}
414
+ if is_finished is not None:
415
+ params["isFinished"] = is_finished
416
+ if started_after is not None:
417
+ params["startedAt"] = started_after
418
+ if project is not None:
419
+ params["project"] = project
420
+
421
+ return self._api.get(
422
+ "/v1/admin/conversations",
423
+ AdminConversationListResponse,
424
+ params=params,
425
+ wrap_response=False,
426
+ )