codemie-sdk-python 0.1.296__tar.gz → 0.1.298__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 (54) hide show
  1. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/PKG-INFO +1 -1
  2. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/pyproject.toml +1 -1
  3. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/models/conversation.py +64 -9
  4. codemie_sdk_python-0.1.298/src/codemie_sdk/services/conversation.py +276 -0
  5. codemie_sdk_python-0.1.296/src/codemie_sdk/services/conversation.py +0 -90
  6. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/README.md +0 -0
  7. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/__init__.py +0 -0
  8. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/auth/__init__.py +0 -0
  9. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/auth/credentials.py +0 -0
  10. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/client/__init__.py +0 -0
  11. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/client/client.py +0 -0
  12. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/exceptions.py +0 -0
  13. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/models/__init__.py +0 -0
  14. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/models/admin.py +0 -0
  15. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/models/analytics.py +0 -0
  16. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/models/assistant.py +0 -0
  17. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/models/common.py +0 -0
  18. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/models/datasource.py +0 -0
  19. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/models/file_operation.py +0 -0
  20. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/models/guardrails.py +0 -0
  21. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/models/integration.py +0 -0
  22. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/models/llm.py +0 -0
  23. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/models/mermaid.py +0 -0
  24. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/models/task.py +0 -0
  25. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/models/user.py +0 -0
  26. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/models/vendor_assistant.py +0 -0
  27. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/models/vendor_guardrail.py +0 -0
  28. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/models/vendor_knowledgebase.py +0 -0
  29. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/models/vendor_workflow.py +0 -0
  30. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/models/workflow.py +0 -0
  31. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/models/workflow_execution_payload.py +0 -0
  32. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/models/workflow_state.py +0 -0
  33. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/models/workflow_thoughts.py +0 -0
  34. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/services/admin.py +0 -0
  35. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/services/analytics.py +0 -0
  36. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/services/assistant.py +0 -0
  37. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/services/codemie_guardrails.py +0 -0
  38. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/services/datasource.py +0 -0
  39. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/services/files.py +0 -0
  40. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/services/integration.py +0 -0
  41. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/services/llm.py +0 -0
  42. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/services/mermaid.py +0 -0
  43. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/services/task.py +0 -0
  44. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/services/user.py +0 -0
  45. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/services/vendor_assistant.py +0 -0
  46. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/services/vendor_guardrail.py +0 -0
  47. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/services/vendor_knowledgebase.py +0 -0
  48. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/services/vendor_workflow.py +0 -0
  49. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/services/webhook.py +0 -0
  50. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/services/workflow.py +0 -0
  51. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/services/workflow_execution.py +0 -0
  52. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/services/workflow_execution_state.py +0 -0
  53. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/src/codemie_sdk/utils/__init__.py +0 -0
  54. {codemie_sdk_python-0.1.296 → codemie_sdk_python-0.1.298}/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.296
3
+ Version: 0.1.298
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.296"
3
+ version = "0.1.298"
4
4
  description = "CodeMie SDK for Python"
5
5
  authors = [
6
6
  "Vadym Vlasenko <vadym_vlasenko@epam.com>",
@@ -71,15 +71,15 @@ class HistoryItem(BaseModel):
71
71
  message: str
72
72
  historyIndex: int
73
73
  date: datetime
74
- responseTime: Optional[float]
75
- inputTokens: Optional[int]
76
- outputTokens: Optional[int]
77
- moneySpent: Optional[float]
78
- userMark: Optional[HistoryMark]
79
- operatorMark: Optional[HistoryMark]
80
- messageRaw: Optional[str]
74
+ responseTime: Optional[float] = None
75
+ inputTokens: Optional[int] = None
76
+ outputTokens: Optional[int] = None
77
+ moneySpent: Optional[float] = None
78
+ userMark: Optional[HistoryMark] = None
79
+ operatorMark: Optional[HistoryMark] = None
80
+ messageRaw: Optional[str] = None
81
81
  fileNames: List[str]
82
- assistantId: Optional[str]
82
+ assistantId: Optional[str] = None
83
83
  thoughts: Optional[List[Thought]] = Field(default_factory=list)
84
84
 
85
85
 
@@ -160,10 +160,65 @@ class ConversationDetails(BaseModel):
160
160
  initial_assistant_id: str
161
161
  final_user_mark: Optional[Mark]
162
162
  final_operator_mark: Optional[Mark]
163
- project: str
163
+ project: Optional[str]
164
164
  conversation_details: Optional[ConversationDetailsData]
165
165
  assistant_details: Optional[AssistantDetailsData]
166
166
  user_abilities: Optional[List[str]]
167
167
  is_folder_migrated: bool
168
168
  category: Optional[str]
169
169
  mcp_server_single_usage: Optional[bool] = False
170
+
171
+
172
+ class BaseResponse(BaseModel):
173
+ """Generic base response model with message field."""
174
+
175
+ message: str
176
+
177
+
178
+ class UpdateConversationRequest(BaseModel):
179
+ """Model for updating an existing conversation."""
180
+
181
+ name: Optional[str] = None
182
+ folder: Optional[str] = None
183
+ pinned: Optional[bool] = None
184
+
185
+
186
+ class ConversationFolder(BaseModel):
187
+ """Model for conversation folder metadata."""
188
+
189
+ id: str
190
+ user_id: str
191
+ folder_name: str
192
+ date: str
193
+ update_date: str
194
+ user_abilities: List[str]
195
+
196
+
197
+ class UpdateConversationFolderRequest(BaseModel):
198
+ """Model for creating or updating a folder name."""
199
+
200
+ folder: str
201
+
202
+
203
+ class UpdateHistoryByIndexRequest(BaseModel):
204
+ """Model for updating message content in conversation history by index."""
205
+
206
+ messageIndex: int
207
+ message: str
208
+
209
+
210
+ class UpsertHistoryRequest(BaseModel):
211
+ """Model for upserting conversation history."""
212
+
213
+ history: List[HistoryItem]
214
+ assistant_id: Optional[str] = None
215
+ folder: Optional[str] = None
216
+
217
+
218
+ class UpsertHistoryResponse(BaseModel):
219
+ """Response model for conversation history upsert operation."""
220
+
221
+ conversation_id: str
222
+ new_messages: int
223
+ total_messages: int
224
+ created: bool
@@ -0,0 +1,276 @@
1
+ """Conversation service implementation."""
2
+
3
+ from typing import List
4
+
5
+ from ..models.conversation import (
6
+ Conversation,
7
+ ConversationDetails,
8
+ ConversationCreateRequest,
9
+ UpdateConversationRequest,
10
+ ConversationFolder,
11
+ UpdateConversationFolderRequest,
12
+ UpdateHistoryByIndexRequest,
13
+ UpsertHistoryRequest,
14
+ UpsertHistoryResponse,
15
+ BaseResponse,
16
+ )
17
+ from ..utils import ApiRequestHandler
18
+
19
+
20
+ class ConversationService:
21
+ """Service for managing user conversations."""
22
+
23
+ def __init__(self, api_domain: str, token: str, verify_ssl: bool = True):
24
+ """Initialize the conversation service.
25
+
26
+ Args:
27
+ api_domain: Base URL for the API
28
+ token: Authentication token
29
+ verify_ssl: Whether to verify SSL certificates
30
+ """
31
+ self._api = ApiRequestHandler(api_domain, token, verify_ssl)
32
+
33
+ def list(self) -> List[Conversation]:
34
+ """Get list of all conversations for the current user.
35
+
36
+ Returns:
37
+ List of all conversations for the current user.
38
+ """
39
+ return self._api.get("/v1/conversations", List[Conversation])
40
+
41
+ def list_by_assistant_id(self, assistant_id: str) -> List[Conversation]:
42
+ """Get list of all conversations for the current user that include the specified assistant.
43
+
44
+ Args:
45
+ assistant_id: Assistant ID
46
+
47
+ Returns:
48
+ List of conversations for the specified assistant.
49
+ """
50
+ return [
51
+ conv
52
+ for conv in self._api.get("/v1/conversations", List[Conversation])
53
+ if assistant_id in conv.assistant_ids
54
+ ]
55
+
56
+ def get_conversation(self, conversation_id: str) -> ConversationDetails:
57
+ """Get details for a specific conversation by its ID.
58
+
59
+ Args:
60
+ conversation_id: Conversation ID
61
+
62
+ Returns:
63
+ Conversation details
64
+ """
65
+ return self._api.get(
66
+ f"/v1/conversations/{conversation_id}",
67
+ ConversationDetails,
68
+ )
69
+
70
+ def create(self, request: ConversationCreateRequest) -> dict:
71
+ """Create a new conversation.
72
+
73
+ Args:
74
+ request: Conversation creation request
75
+
76
+ Returns:
77
+ Created conversation details
78
+ """
79
+ return self._api.post(
80
+ "/v1/conversations",
81
+ dict,
82
+ json_data=request.model_dump(exclude_none=True),
83
+ )
84
+
85
+ def delete(self, conversation_id: str) -> dict:
86
+ """Delete a specific conversation by its ID.
87
+
88
+ Args:
89
+ conversation_id: Conversation ID to delete
90
+
91
+ Returns:
92
+ Deletion confirmation
93
+ """
94
+ return self._api.delete(
95
+ f"/v1/conversations/{conversation_id}",
96
+ dict,
97
+ )
98
+
99
+ def update(
100
+ self, conversation_id: str, request: UpdateConversationRequest
101
+ ) -> ConversationDetails:
102
+ """Update an existing conversation.
103
+
104
+ Args:
105
+ conversation_id: Conversation ID to update
106
+ request: Update request with fields to modify
107
+
108
+ Returns:
109
+ Updated conversation details
110
+ """
111
+ return self._api.put(
112
+ f"/v1/conversations/{conversation_id}",
113
+ ConversationDetails,
114
+ json_data=request.model_dump(exclude_none=True),
115
+ )
116
+
117
+ def delete_all(self) -> BaseResponse:
118
+ """Delete all conversations for the current user.
119
+
120
+ Returns:
121
+ Deletion confirmation
122
+ """
123
+ return self._api.delete("/v1/conversations", BaseResponse)
124
+
125
+ def get_files(self, conversation_id: str) -> list:
126
+ """Get list of files attached to a conversation.
127
+
128
+ Args:
129
+ conversation_id: Conversation ID
130
+
131
+ Returns:
132
+ List of file names
133
+ """
134
+ response = self._api.get(
135
+ f"/v1/conversations/{conversation_id}/files",
136
+ dict,
137
+ wrap_response=False,
138
+ )
139
+ # API returns list directly, not wrapped in 'data' field
140
+
141
+ return response
142
+
143
+ # Folder management methods
144
+
145
+ def list_folders(self) -> List[ConversationFolder]:
146
+ """Get list of all conversation folders for the current user.
147
+
148
+ Returns:
149
+ List of conversation folders
150
+ """
151
+ return self._api.get("/v1/conversations/folders/list", List[ConversationFolder])
152
+
153
+ def create_folder(self, request: UpdateConversationFolderRequest) -> BaseResponse:
154
+ """Create a new conversation folder.
155
+
156
+ Args:
157
+ request: Folder creation request with name
158
+
159
+ Returns:
160
+ Creation confirmation
161
+ """
162
+ return self._api.post(
163
+ "/v1/conversations/folder",
164
+ BaseResponse,
165
+ json_data=request.model_dump(exclude_none=True),
166
+ )
167
+
168
+ def update_folder(
169
+ self, folder: str, request: UpdateConversationFolderRequest
170
+ ) -> BaseResponse:
171
+ """Rename an existing conversation folder.
172
+
173
+ Args:
174
+ folder: Current folder name
175
+ request: Update request with new name
176
+
177
+ Returns:
178
+ Update confirmation
179
+ """
180
+ return self._api.put(
181
+ f"/v1/conversations/folder/{folder}",
182
+ BaseResponse,
183
+ json_data=request.model_dump(exclude_none=True),
184
+ )
185
+
186
+ def delete_folder(
187
+ self, folder: str, remove_conversations: bool = False
188
+ ) -> BaseResponse:
189
+ """Delete a conversation folder.
190
+
191
+ Args:
192
+ folder: Folder name to delete
193
+ remove_conversations: Whether to also delete conversations in the folder
194
+
195
+ Returns:
196
+ Deletion confirmation
197
+ """
198
+ endpoint = f"/v1/conversations/folder/{folder}"
199
+ if remove_conversations:
200
+ endpoint += "?remove_conversations=true"
201
+ else:
202
+ endpoint += "?remove_conversations=false"
203
+
204
+ return self._api.delete(endpoint, BaseResponse)
205
+
206
+ # History management methods
207
+
208
+ def upsert_history(
209
+ self, conversation_id: str, request: UpsertHistoryRequest
210
+ ) -> UpsertHistoryResponse:
211
+ """Create or update conversation with history (idempotent upsert).
212
+
213
+ If conversation doesn't exist, creates it with custom ID and provided history.
214
+ If conversation exists, appends only NEW messages not already present.
215
+
216
+ Args:
217
+ conversation_id: Conversation ID (will be created if doesn't exist)
218
+ request: History upsert request with messages
219
+
220
+ Returns:
221
+ Upsert response with metadata about operation
222
+ """
223
+ return self._api.put(
224
+ f"/v1/conversations/{conversation_id}/history",
225
+ UpsertHistoryResponse,
226
+ json_data=request.model_dump(mode="json", exclude_none=True),
227
+ )
228
+
229
+ def delete_history(self, conversation_id: str) -> ConversationDetails:
230
+ """Clear all history from a conversation.
231
+
232
+ Args:
233
+ conversation_id: Conversation ID
234
+
235
+ Returns:
236
+ Updated conversation details with empty history
237
+ """
238
+ return self._api.delete(
239
+ f"/v1/conversations/{conversation_id}/history",
240
+ ConversationDetails,
241
+ )
242
+
243
+ def delete_history_by_index(
244
+ self, conversation_id: str, history_index: int
245
+ ) -> ConversationDetails:
246
+ """Remove a specific history item by index.
247
+
248
+ Args:
249
+ conversation_id: Conversation ID
250
+ history_index: Index of history item to delete
251
+
252
+ Returns:
253
+ Updated conversation details
254
+ """
255
+ return self._api.delete(
256
+ f"/v1/conversations/{conversation_id}/history/{history_index}",
257
+ ConversationDetails,
258
+ )
259
+
260
+ def update_history_by_index(
261
+ self, conversation_id: str, request: UpdateHistoryByIndexRequest
262
+ ) -> ConversationDetails:
263
+ """Update an Assistant response in conversation history by index.
264
+
265
+ Args:
266
+ conversation_id: Conversation ID
267
+ request: Update request with message index and new message content
268
+
269
+ Returns:
270
+ Updated conversation details
271
+ """
272
+ return self._api.put(
273
+ f"/v1/conversations/{conversation_id}/history/{request.messageIndex}",
274
+ ConversationDetails,
275
+ json_data=request.model_dump(exclude_none=True),
276
+ )
@@ -1,90 +0,0 @@
1
- """Conversation service implementation."""
2
-
3
- from typing import List
4
-
5
- from ..models.conversation import (
6
- Conversation,
7
- ConversationDetails,
8
- ConversationCreateRequest,
9
- )
10
- from ..utils import ApiRequestHandler
11
-
12
-
13
- class ConversationService:
14
- """Service for managing user conversations."""
15
-
16
- def __init__(self, api_domain: str, token: str, verify_ssl: bool = True):
17
- """Initialize the conversation service.
18
-
19
- Args:
20
- api_domain: Base URL for the API
21
- token: Authentication token
22
- verify_ssl: Whether to verify SSL certificates
23
- """
24
- self._api = ApiRequestHandler(api_domain, token, verify_ssl)
25
-
26
- def list(self) -> List[Conversation]:
27
- """Get list of all conversations for the current user.
28
-
29
- Returns:
30
- List of all conversations for the current user.
31
- """
32
- return self._api.get("/v1/conversations", List[Conversation])
33
-
34
- def list_by_assistant_id(self, assistant_id: str) -> List[Conversation]:
35
- """Get list of all conversations for the current user that include the specified assistant.
36
-
37
- Args:
38
- assistant_id: Assistant ID
39
-
40
- Returns:
41
- List of conversations for the specified assistant.
42
- """
43
- return [
44
- conv
45
- for conv in self._api.get("/v1/conversations", List[Conversation])
46
- if assistant_id in conv.assistant_ids
47
- ]
48
-
49
- def get_conversation(self, conversation_id: str) -> ConversationDetails:
50
- """Get details for a specific conversation by its ID.
51
-
52
- Args:
53
- conversation_id: Conversation ID
54
-
55
- Returns:
56
- Conversation details
57
- """
58
- return self._api.get(
59
- f"/v1/conversations/{conversation_id}",
60
- ConversationDetails,
61
- )
62
-
63
- def create(self, request: ConversationCreateRequest) -> dict:
64
- """Create a new conversation.
65
-
66
- Args:
67
- request: Conversation creation request
68
-
69
- Returns:
70
- Created conversation details
71
- """
72
- return self._api.post(
73
- "/v1/conversations",
74
- dict,
75
- json_data=request.model_dump(exclude_none=True),
76
- )
77
-
78
- def delete(self, conversation_id: str) -> dict:
79
- """Delete a specific conversation by its ID.
80
-
81
- Args:
82
- conversation_id: Conversation ID to delete
83
-
84
- Returns:
85
- Deletion confirmation
86
- """
87
- return self._api.delete(
88
- f"/v1/conversations/{conversation_id}",
89
- dict,
90
- )