codemie-sdk-python 0.1.227__py3-none-any.whl → 0.1.228__py3-none-any.whl
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.
- codemie_sdk/models/assistant.py +21 -0
- codemie_sdk/services/assistant.py +174 -0
- {codemie_sdk_python-0.1.227.dist-info → codemie_sdk_python-0.1.228.dist-info}/METADATA +45 -1
- {codemie_sdk_python-0.1.227.dist-info → codemie_sdk_python-0.1.228.dist-info}/RECORD +5 -5
- {codemie_sdk_python-0.1.227.dist-info → codemie_sdk_python-0.1.228.dist-info}/WHEEL +0 -0
codemie_sdk/models/assistant.py
CHANGED
|
@@ -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
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: codemie-sdk-python
|
|
3
|
-
Version: 0.1.
|
|
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
|
|
|
@@ -5,7 +5,7 @@ codemie_sdk/client/__init__.py,sha256=yf6C39MmrJ6gK9ZHMhBeynKwUUYVSUTQbKxU8-4qpK
|
|
|
5
5
|
codemie_sdk/client/client.py,sha256=PnVWutwE2jPWqmouON1G1xSIOmmVnxSxNguFA-XATdE,6549
|
|
6
6
|
codemie_sdk/exceptions.py,sha256=XoVPyognx-JmyVxLHkZPAcX1CMi1OoT1diBFJLU54so,1183
|
|
7
7
|
codemie_sdk/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
8
|
-
codemie_sdk/models/assistant.py,sha256=
|
|
8
|
+
codemie_sdk/models/assistant.py,sha256=ppQcTpF4wMc0E3wvBR1kj3QQyNGRsLxAw0gFdydrh-Q,11728
|
|
9
9
|
codemie_sdk/models/common.py,sha256=gmZ-ps8TbaieNKr0kUKoQEjhVrHD2CAYomOpZQRatH8,1195
|
|
10
10
|
codemie_sdk/models/conversation.py,sha256=tGlqtVnoRCbTm8J8Y1BUmBvMpLW3IRFE0CIHJYoNU_Y,4238
|
|
11
11
|
codemie_sdk/models/datasource.py,sha256=yCFB_wg9Lo2V6mzF2N3lsVBXJoyc8pyfMgMZUorn0ng,10852
|
|
@@ -21,7 +21,7 @@ codemie_sdk/models/workflow.py,sha256=qfk0rBJnFUMpcEDq_E5GB3hzYKbe_bb2NYJlLZJwUE
|
|
|
21
21
|
codemie_sdk/models/workflow_execution_payload.py,sha256=Jd9pwmkOQ0q9Xih-8Jw4CZ3CfazRnuwPesjbDEWBva8,559
|
|
22
22
|
codemie_sdk/models/workflow_state.py,sha256=okEMKzkiBU3GHs9VNBoiEMOnOeZRMXGYtpL0NYSg-FY,1374
|
|
23
23
|
codemie_sdk/models/workflow_thoughts.py,sha256=CjHaIPgca9kQAjpoq8IpX4MuDeql1SvaoKS5RmyU2SE,616
|
|
24
|
-
codemie_sdk/services/assistant.py,sha256=
|
|
24
|
+
codemie_sdk/services/assistant.py,sha256=J4l30poF4XVnK1y_cuGprGOZIIZyy9yRK73ak4lLfpc,14421
|
|
25
25
|
codemie_sdk/services/conversation.py,sha256=Ss0mkGaBi4u8-YKzhRYUJOfoFqJueDp9JurI5DRCGT8,2566
|
|
26
26
|
codemie_sdk/services/datasource.py,sha256=d8LImpireGOnXKvj4h8iafq_ZQMn177_GGLLiE5g7wU,7405
|
|
27
27
|
codemie_sdk/services/files.py,sha256=MKLJEv208yUkeRO2JfC4XWPeJ4TKg5ZGaxaBU5GXzoM,1955
|
|
@@ -38,6 +38,6 @@ codemie_sdk/services/workflow_execution.py,sha256=P57fz3fsUnKLg8qUYszMxCn_ykovh2
|
|
|
38
38
|
codemie_sdk/services/workflow_execution_state.py,sha256=tXoaa8yT09xgYEUNiHhVULe76TwGwVgZupMIUyyLxdo,2070
|
|
39
39
|
codemie_sdk/utils/__init__.py,sha256=BXAJJfAzO89-kMYvWWo9wSNhSbGgF3vB1In9sePFhMM,109
|
|
40
40
|
codemie_sdk/utils/http.py,sha256=1eNjCoVh_hq0TIsDSlsXZWmqODznIXvPpRrIn-KeftY,9759
|
|
41
|
-
codemie_sdk_python-0.1.
|
|
42
|
-
codemie_sdk_python-0.1.
|
|
43
|
-
codemie_sdk_python-0.1.
|
|
41
|
+
codemie_sdk_python-0.1.228.dist-info/METADATA,sha256=4CRSZP-Oyrs5cpspZuL_A5h0m5bVeE7jerZNWrnZL4A,25972
|
|
42
|
+
codemie_sdk_python-0.1.228.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
|
43
|
+
codemie_sdk_python-0.1.228.dist-info/RECORD,,
|
|
File without changes
|