codemie-sdk-python 0.1.226__tar.gz → 0.1.228__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.

Potentially problematic release.


This version of codemie-sdk-python might be problematic. Click here for more details.

Files changed (43) hide show
  1. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/PKG-INFO +45 -1
  2. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/README.md +44 -0
  3. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/pyproject.toml +1 -1
  4. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/models/assistant.py +21 -0
  5. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/services/assistant.py +174 -0
  6. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/__init__.py +0 -0
  7. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/auth/__init__.py +0 -0
  8. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/auth/credentials.py +0 -0
  9. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/client/__init__.py +0 -0
  10. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/client/client.py +0 -0
  11. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/exceptions.py +0 -0
  12. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/models/__init__.py +0 -0
  13. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/models/common.py +0 -0
  14. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/models/conversation.py +0 -0
  15. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/models/datasource.py +0 -0
  16. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/models/file_operation.py +0 -0
  17. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/models/integration.py +0 -0
  18. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/models/llm.py +0 -0
  19. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/models/task.py +0 -0
  20. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/models/user.py +0 -0
  21. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/models/vendor_assistant.py +0 -0
  22. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/models/vendor_knowledgebase.py +0 -0
  23. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/models/vendor_workflow.py +0 -0
  24. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/models/workflow.py +0 -0
  25. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/models/workflow_execution_payload.py +0 -0
  26. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/models/workflow_state.py +0 -0
  27. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/models/workflow_thoughts.py +0 -0
  28. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/services/conversation.py +0 -0
  29. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/services/datasource.py +0 -0
  30. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/services/files.py +0 -0
  31. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/services/integration.py +0 -0
  32. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/services/llm.py +0 -0
  33. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/services/task.py +0 -0
  34. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/services/user.py +0 -0
  35. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/services/vendor_assistant.py +0 -0
  36. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/services/vendor_knowledgebase.py +0 -0
  37. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/services/vendor_workflow.py +0 -0
  38. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/services/webhook.py +0 -0
  39. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/services/workflow.py +0 -0
  40. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/services/workflow_execution.py +0 -0
  41. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/services/workflow_execution_state.py +0 -0
  42. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/src/codemie_sdk/utils/__init__.py +0 -0
  43. {codemie_sdk_python-0.1.226 → codemie_sdk_python-0.1.228}/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.226
3
+ Version: 0.1.228
4
4
  Summary: CodeMie SDK for Python
5
5
  Author: Vadym Vlasenko
6
6
  Author-email: vadym_vlasenko@epam.com
@@ -831,6 +831,50 @@ client = CodeMieClient(
831
831
  )
832
832
  ```
833
833
 
834
+ ### Assistant Versioning via SDK
835
+
836
+ The Python SDK exposes full assistant versioning capabilities delivered in EPMCDME-8285.
837
+
838
+ - List versions
839
+ ```python
840
+ versions = client.assistants.list_versions("assistant-id", page=0, per_page=20)
841
+ print([v.version_number for v in versions])
842
+ ```
843
+
844
+ - Get specific version
845
+ ```python
846
+ version = client.assistants.get_version("assistant-id", 2)
847
+ print(version.system_prompt)
848
+ ```
849
+
850
+ - Compare two versions
851
+ ```python
852
+ from codemie_sdk.models.assistant import AssistantVersionDiff
853
+
854
+ diff: AssistantVersionDiff = client.assistants.compare_versions("assistant-id", 1, 3)
855
+ print(diff.summary)
856
+ ```
857
+
858
+ - Rollback to a version
859
+ ```python
860
+ resp = client.assistants.rollback_to_version("assistant-id", 2)
861
+ print(resp)
862
+ ```
863
+
864
+ - Chat with a specific version
865
+ ```python
866
+ from codemie_sdk.models.assistant import AssistantChatRequest
867
+
868
+ req = AssistantChatRequest(text="Hi", stream=False)
869
+ resp = client.assistants.chat_with_version("assistant-id", 2, req)
870
+ print(resp.generated)
871
+ ```
872
+
873
+ Quick CLI example
874
+ ```bash
875
+ python codemie-sdk/examples/assistant_versions.py <assistant_id> [version_number]
876
+ ```
877
+
834
878
  ## Support
835
879
  For providing credentials please contact AI/Run CodeMie Team: Vadym_Vlasenko@epam.com or Nikita_Levyankov@epam.com
836
880
 
@@ -818,6 +818,50 @@ client = CodeMieClient(
818
818
  )
819
819
  ```
820
820
 
821
+ ### Assistant Versioning via SDK
822
+
823
+ The Python SDK exposes full assistant versioning capabilities delivered in EPMCDME-8285.
824
+
825
+ - List versions
826
+ ```python
827
+ versions = client.assistants.list_versions("assistant-id", page=0, per_page=20)
828
+ print([v.version_number for v in versions])
829
+ ```
830
+
831
+ - Get specific version
832
+ ```python
833
+ version = client.assistants.get_version("assistant-id", 2)
834
+ print(version.system_prompt)
835
+ ```
836
+
837
+ - Compare two versions
838
+ ```python
839
+ from codemie_sdk.models.assistant import AssistantVersionDiff
840
+
841
+ diff: AssistantVersionDiff = client.assistants.compare_versions("assistant-id", 1, 3)
842
+ print(diff.summary)
843
+ ```
844
+
845
+ - Rollback to a version
846
+ ```python
847
+ resp = client.assistants.rollback_to_version("assistant-id", 2)
848
+ print(resp)
849
+ ```
850
+
851
+ - Chat with a specific version
852
+ ```python
853
+ from codemie_sdk.models.assistant import AssistantChatRequest
854
+
855
+ req = AssistantChatRequest(text="Hi", stream=False)
856
+ resp = client.assistants.chat_with_version("assistant-id", 2, req)
857
+ print(resp.generated)
858
+ ```
859
+
860
+ Quick CLI example
861
+ ```bash
862
+ python codemie-sdk/examples/assistant_versions.py <assistant_id> [version_number]
863
+ ```
864
+
821
865
  ## Support
822
866
  For providing credentials please contact AI/Run CodeMie Team: Vadym_Vlasenko@epam.com or Nikita_Levyankov@epam.com
823
867
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "codemie-sdk-python"
3
- version = "0.1.226"
3
+ version = "0.1.228"
4
4
  description = "CodeMie SDK for Python"
5
5
  authors = [
6
6
  "Vadym Vlasenko <vadym_vlasenko@epam.com>",
@@ -164,6 +164,7 @@ class Assistant(AssistantBase):
164
164
  user_abilities: Optional[List[Any]] = None
165
165
  mcp_servers: List[MCPServerDetails] = Field(default_factory=list)
166
166
  assistant_ids: List[str] = Field(default_factory=list)
167
+ version_count: Optional[int] = None
167
168
 
168
169
 
169
170
  class AssistantRequestBase(AssistantBase):
@@ -205,6 +206,26 @@ class AssistantUpdateRequest(AssistantRequestBase):
205
206
  pass
206
207
 
207
208
 
209
+ class AssistantVersion(BaseModel):
210
+ """Immutable snapshot of assistant configuration for a specific version."""
211
+
212
+ model_config = ConfigDict(extra="ignore", use_enum_values=True)
213
+
214
+ version_number: int
215
+ created_date: datetime
216
+ created_by: Optional[User] = None
217
+ change_notes: Optional[str] = None
218
+ description: Optional[str] = None
219
+ system_prompt: str
220
+ llm_model_type: Optional[str] = None
221
+ temperature: Optional[float] = None
222
+ top_p: Optional[float] = None
223
+ context: List[Context] = Field(default_factory=list)
224
+ toolkits: List[ToolKitDetails] = Field(default_factory=list)
225
+ mcp_servers: List[MCPServerDetails] = Field(default_factory=list)
226
+ assistant_ids: List[str] = Field(default_factory=list)
227
+
228
+
208
229
  class ChatRole(str, Enum):
209
230
  """Enum for chat message roles."""
210
231
 
@@ -170,6 +170,141 @@ class AssistantService:
170
170
  """
171
171
  return self._api.get(f"/v1/assistants/prebuilt/{slug}", Assistant)
172
172
 
173
+ def list_versions(
174
+ self, assistant_id: str, page: int = 0, per_page: Optional[int] = None
175
+ ):
176
+ """List assistant versions.
177
+
178
+ Args:
179
+ assistant_id: Assistant identifier
180
+ page: Page number for pagination
181
+ per_page: Items per page (optional). If not provided, backend defaults are used.
182
+
183
+ Returns:
184
+ List of AssistantVersion objects
185
+ """
186
+
187
+ params: Dict[str, Any] = {"page": page}
188
+ if per_page is not None:
189
+ params["per_page"] = per_page
190
+ from ..models.assistant import AssistantVersion
191
+
192
+ raw = self._api.get(
193
+ f"/v1/assistants/{assistant_id}/versions",
194
+ dict,
195
+ params=params,
196
+ wrap_response=False,
197
+ )
198
+ items = []
199
+ if isinstance(raw, list):
200
+ items = raw
201
+ elif isinstance(raw, dict):
202
+ items = raw.get("data") or raw.get("versions") or []
203
+ else:
204
+ items = []
205
+ return [AssistantVersion.model_validate(it) for it in items]
206
+
207
+ def get_version(self, assistant_id: str, version_number: int):
208
+ """Get a specific assistant version by number.
209
+
210
+ Args:
211
+ assistant_id: Assistant identifier
212
+ version_number: Version number to retrieve
213
+
214
+ Returns:
215
+ AssistantVersion object
216
+ """
217
+ from ..models.assistant import AssistantVersion
218
+
219
+ raw = self._api.get(
220
+ f"/v1/assistants/{assistant_id}/versions/{version_number}", AssistantVersion
221
+ )
222
+ if isinstance(raw, dict):
223
+ return AssistantVersion.model_validate(raw)
224
+ return raw
225
+
226
+ def compare_versions(self, assistant_id: str, v1: int, v2: int) -> Dict[str, Any]:
227
+ """Compare two assistant versions and return diff summary.
228
+
229
+ Args:
230
+ assistant_id: Assistant identifier
231
+ v1: First version number
232
+ v2: Second version number
233
+
234
+ Returns:
235
+ Generic dictionary with comparison result (diff, summary, etc.)
236
+ """
237
+ return self._api.get(
238
+ f"/v1/assistants/{assistant_id}/versions/{v1}/compare/{v2}",
239
+ dict,
240
+ )
241
+
242
+ def rollback_to_version(
243
+ self, assistant_id: str, version_number: int, change_notes: Optional[str] = None
244
+ ) -> dict:
245
+ """Rollback assistant to a specific version. Creates a new version mirroring target.
246
+
247
+ Args:
248
+ assistant_id: Assistant identifier
249
+ version_number: Target version to rollback to
250
+ change_notes: Optional description of why rollback is performed
251
+
252
+ Returns:
253
+ Backend response (dict)
254
+ """
255
+ payload: Dict[str, Any] = {}
256
+ if change_notes:
257
+ payload["change_notes"] = change_notes
258
+ try:
259
+ return self._api.post(
260
+ f"/v1/assistants/{assistant_id}/versions/{version_number}/rollback",
261
+ dict,
262
+ json_data=payload,
263
+ )
264
+ except requests.HTTPError as err:
265
+ try:
266
+ assistant = self.get(assistant_id)
267
+ version = self.get_version(assistant_id, version_number)
268
+
269
+ update_req = AssistantUpdateRequest(
270
+ name=assistant.name,
271
+ description=assistant.description or "",
272
+ system_prompt=version.system_prompt,
273
+ project=assistant.project,
274
+ llm_model_type=version.llm_model_type or assistant.llm_model_type,
275
+ temperature=version.temperature
276
+ if hasattr(version, "temperature")
277
+ else assistant.temperature,
278
+ top_p=version.top_p
279
+ if hasattr(version, "top_p")
280
+ else assistant.top_p,
281
+ context=version.context
282
+ if hasattr(version, "context")
283
+ else assistant.context,
284
+ toolkits=version.toolkits
285
+ if hasattr(version, "toolkits")
286
+ else assistant.toolkits,
287
+ user_prompts=assistant.user_prompts,
288
+ shared=assistant.shared,
289
+ is_react=assistant.is_react,
290
+ is_global=assistant.is_global,
291
+ slug=assistant.slug,
292
+ mcp_servers=version.mcp_servers
293
+ if hasattr(version, "mcp_servers")
294
+ else assistant.mcp_servers,
295
+ assistant_ids=version.assistant_ids
296
+ if hasattr(version, "assistant_ids")
297
+ else assistant.assistant_ids,
298
+ )
299
+ resp = self.update(assistant_id, update_req)
300
+ resp["_rollback_fallback"] = True
301
+ resp["_target_version"] = version_number
302
+ if change_notes:
303
+ resp["change_notes"] = change_notes
304
+ return resp
305
+ except Exception:
306
+ raise err
307
+
173
308
  def chat(
174
309
  self,
175
310
  assistant_id: str,
@@ -206,6 +341,45 @@ class AssistantService:
206
341
 
207
342
  return response
208
343
 
344
+ def chat_with_version(
345
+ self,
346
+ assistant_id: str,
347
+ version_number: int,
348
+ request: AssistantChatRequest,
349
+ ) -> Union[requests.Response, BaseModelResponse]:
350
+ """Send a chat request to a specific assistant version.
351
+
352
+ Uses the stable chat endpoint with an explicit `version` parameter to
353
+ ensure compatibility with environments that don't expose
354
+ /versions/{version}/model.
355
+
356
+ Args:
357
+ assistant_id: ID of the assistant to chat with
358
+ version_number: version to pin chat to
359
+ request: Chat request details
360
+
361
+ Returns:
362
+ Chat response or streaming response
363
+ """
364
+ pydantic_schema = None
365
+ if issubclass(request.output_schema, BaseModel):
366
+ pydantic_schema = deepcopy(request.output_schema)
367
+ request.output_schema = request.output_schema.model_json_schema()
368
+
369
+ payload = request.model_dump(exclude_none=True, by_alias=True)
370
+ payload["version"] = version_number
371
+
372
+ response = self._api.post(
373
+ f"/v1/assistants/{assistant_id}/model",
374
+ BaseModelResponse,
375
+ json_data=payload,
376
+ stream=request.stream,
377
+ )
378
+ if not request.stream and pydantic_schema:
379
+ response.generated = pydantic_schema.model_validate(response.generated)
380
+
381
+ return response
382
+
209
383
  def upload_file_to_chat(self, file_path: Path):
210
384
  """Upload a file to assistant chat and return the response containing file_url."""
211
385