agent-lab-sdk 0.1.39__tar.gz → 0.1.41__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 (28) hide show
  1. {agent_lab_sdk-0.1.39 → agent_lab_sdk-0.1.41}/PKG-INFO +27 -2
  2. {agent_lab_sdk-0.1.39 → agent_lab_sdk-0.1.41}/README.md +26 -1
  3. {agent_lab_sdk-0.1.39 → agent_lab_sdk-0.1.41}/agent_lab_sdk/langgraph/checkpoint/agw_saver.py +21 -22
  4. agent_lab_sdk-0.1.41/agent_lab_sdk/storage/__init__.py +4 -0
  5. agent_lab_sdk-0.1.41/agent_lab_sdk/storage/storage_v2.py +66 -0
  6. {agent_lab_sdk-0.1.39 → agent_lab_sdk-0.1.41}/agent_lab_sdk.egg-info/PKG-INFO +27 -2
  7. {agent_lab_sdk-0.1.39 → agent_lab_sdk-0.1.41}/agent_lab_sdk.egg-info/SOURCES.txt +2 -1
  8. {agent_lab_sdk-0.1.39 → agent_lab_sdk-0.1.41}/pyproject.toml +1 -1
  9. agent_lab_sdk-0.1.39/agent_lab_sdk/storage/__init__.py +0 -3
  10. {agent_lab_sdk-0.1.39 → agent_lab_sdk-0.1.41}/LICENSE +0 -0
  11. {agent_lab_sdk-0.1.39 → agent_lab_sdk-0.1.41}/agent_lab_sdk/__init__.py +0 -0
  12. {agent_lab_sdk-0.1.39 → agent_lab_sdk-0.1.41}/agent_lab_sdk/langgraph/checkpoint/__init__.py +0 -0
  13. {agent_lab_sdk-0.1.39 → agent_lab_sdk-0.1.41}/agent_lab_sdk/langgraph/checkpoint/serde.py +0 -0
  14. {agent_lab_sdk-0.1.39 → agent_lab_sdk-0.1.41}/agent_lab_sdk/llm/__init__.py +0 -0
  15. {agent_lab_sdk-0.1.39 → agent_lab_sdk-0.1.41}/agent_lab_sdk/llm/agw_token_manager.py +0 -0
  16. {agent_lab_sdk-0.1.39 → agent_lab_sdk-0.1.41}/agent_lab_sdk/llm/gigachat_token_manager.py +0 -0
  17. {agent_lab_sdk-0.1.39 → agent_lab_sdk-0.1.41}/agent_lab_sdk/llm/llm.py +0 -0
  18. {agent_lab_sdk-0.1.39 → agent_lab_sdk-0.1.41}/agent_lab_sdk/llm/throttled.py +0 -0
  19. {agent_lab_sdk-0.1.39 → agent_lab_sdk-0.1.41}/agent_lab_sdk/metrics/__init__.py +0 -0
  20. {agent_lab_sdk-0.1.39 → agent_lab_sdk-0.1.41}/agent_lab_sdk/metrics/metrics.py +0 -0
  21. {agent_lab_sdk-0.1.39 → agent_lab_sdk-0.1.41}/agent_lab_sdk/schema/__init__.py +0 -0
  22. {agent_lab_sdk-0.1.39 → agent_lab_sdk-0.1.41}/agent_lab_sdk/schema/input_types.py +0 -0
  23. {agent_lab_sdk-0.1.39 → agent_lab_sdk-0.1.41}/agent_lab_sdk/schema/log_message.py +0 -0
  24. {agent_lab_sdk-0.1.39 → agent_lab_sdk-0.1.41}/agent_lab_sdk/storage/storage.py +0 -0
  25. {agent_lab_sdk-0.1.39 → agent_lab_sdk-0.1.41}/agent_lab_sdk.egg-info/dependency_links.txt +0 -0
  26. {agent_lab_sdk-0.1.39 → agent_lab_sdk-0.1.41}/agent_lab_sdk.egg-info/requires.txt +0 -0
  27. {agent_lab_sdk-0.1.39 → agent_lab_sdk-0.1.41}/agent_lab_sdk.egg-info/top_level.txt +0 -0
  28. {agent_lab_sdk-0.1.39 → agent_lab_sdk-0.1.41}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-lab-sdk
3
- Version: 0.1.39
3
+ Version: 0.1.41
4
4
  Summary: SDK для работы с Agent Lab
5
5
  Author-email: Andrew Ohurtsov <andermirik@yandex.com>
6
6
  License: Proprietary and Confidential — All Rights Reserved
@@ -220,7 +220,32 @@ from agent_lab_sdk.storage import store_file_in_sd_asset
220
220
  store_file_in_storage("my-agent-name-filename.png", file_b64, "giga-agents")
221
221
  ```
222
222
 
223
- ### 4.2 AGW Checkpointer
223
+ ### 4.2 V2 File Upload
224
+
225
+ Новый v2 API для загрузки файлов через Agent Gateway с поддержкой бинарных данных и автоматическим выбором сервиса хранения.
226
+
227
+ ```python
228
+ from agent_lab_sdk.storage import upload_file, FileUploadResponse
229
+
230
+ # Загрузка из байтов
231
+ with open("document.pdf", "rb") as f:
232
+ file_bytes = f.read()
233
+ result: FileUploadResponse = upload_file("document.pdf", file_bytes)
234
+
235
+ # Результат - Pydantic модель с информацией о файле
236
+ print(f"File ID: {result.id}")
237
+ print(f"Absolute Path: {result.absolute_path}")
238
+ print(f"Storage: {result.storage}")
239
+ ```
240
+
241
+ #### Переменные окружения для V2 Upload
242
+
243
+ | Переменная | Описание | Значение по умолчанию |
244
+ | -------------------------- | ---------------------------------- | --------------------- |
245
+ | `AGENT_SERVICE_NAME` | Имя сервиса агента (обязательно) | - |
246
+ | `STORAGE_PROVIDER_AGW_URL` | URL Agent Gateway | `http://localhost` |
247
+
248
+ ### 4.3 AGW Checkpointer
224
249
 
225
250
  AGW поддерживает langgraph checkpoint API и в SDK представлен `AsyncAGWCheckpointSaver`, который позволяет сохранять состояние графа в AGW напрямую.
226
251
 
@@ -190,7 +190,32 @@ from agent_lab_sdk.storage import store_file_in_sd_asset
190
190
  store_file_in_storage("my-agent-name-filename.png", file_b64, "giga-agents")
191
191
  ```
192
192
 
193
- ### 4.2 AGW Checkpointer
193
+ ### 4.2 V2 File Upload
194
+
195
+ Новый v2 API для загрузки файлов через Agent Gateway с поддержкой бинарных данных и автоматическим выбором сервиса хранения.
196
+
197
+ ```python
198
+ from agent_lab_sdk.storage import upload_file, FileUploadResponse
199
+
200
+ # Загрузка из байтов
201
+ with open("document.pdf", "rb") as f:
202
+ file_bytes = f.read()
203
+ result: FileUploadResponse = upload_file("document.pdf", file_bytes)
204
+
205
+ # Результат - Pydantic модель с информацией о файле
206
+ print(f"File ID: {result.id}")
207
+ print(f"Absolute Path: {result.absolute_path}")
208
+ print(f"Storage: {result.storage}")
209
+ ```
210
+
211
+ #### Переменные окружения для V2 Upload
212
+
213
+ | Переменная | Описание | Значение по умолчанию |
214
+ | -------------------------- | ---------------------------------- | --------------------- |
215
+ | `AGENT_SERVICE_NAME` | Имя сервиса агента (обязательно) | - |
216
+ | `STORAGE_PROVIDER_AGW_URL` | URL Agent Gateway | `http://localhost` |
217
+
218
+ ### 4.3 AGW Checkpointer
194
219
 
195
220
  AGW поддерживает langgraph checkpoint API и в SDK представлен `AsyncAGWCheckpointSaver`, который позволяет сохранять состояние графа в AGW напрямую.
196
221
 
@@ -220,24 +220,33 @@ class AsyncAGWCheckpointSaver(BaseCheckpointSaver):
220
220
  self._client = None
221
221
 
222
222
  # ----------------------- universal dump/load ---------------------
223
- # def _safe_dump(self, obj: Any) -> Any:
224
- # """self.serde.dump → гарантированная JSON-строка."""
225
- # dumped = self.serde.dumps(obj)
226
- # if isinstance(dumped, (bytes, bytearray)):
227
- # return base64.b64encode(dumped).decode() # str
228
- # return dumped # уже json-совместимо
229
-
230
223
  def _safe_dump(self, obj: Any) -> Any:
231
- """bytes → python-object; fallback base64 для реально бинарных данных."""
232
- dumped = self.serde.dumps(obj)
224
+ """
225
+ JSON-first сериализация:
226
+ 1) Пытаемся через self.serde.dumps(obj).
227
+ - Если вернул bytes: пробуем декодировать в JSON-строку и распарсить.
228
+ - Если не JSON/не UTF-8 — заворачиваем как base64-строку.
229
+ - Если вернул dict/list/scalar — они уже JSON-совместимы.
230
+ 2) Если self.serde.dumps(obj) бросает исключение (например, для Send),
231
+ делаем типизированный фолбэк {"type": str, "blob": base64 | None}.
232
+ """
233
+ try:
234
+ dumped = self.serde.dumps(obj)
235
+ except Exception:
236
+ # typed fallback (как рекомендуют в LangGraph для нетривиальных типов)
237
+ # https://langchain-ai.github.io/langgraph/reference/checkpoints/
238
+ try:
239
+ t, b = self.serde.dumps_typed(obj)
240
+ except Exception:
241
+ # крайний случай: строковое представление
242
+ t, b = type(obj).__name__, str(obj).encode()
243
+ return {"type": t, "blob": base64.b64encode(b).decode() if b is not None else None}
244
+
233
245
  if isinstance(dumped, (bytes, bytearray)):
234
246
  try:
235
- # 1) bytes → str
236
247
  s = dumped.decode()
237
- # 2) str JSON → python (list/dict/scalar)
238
248
  return orjson.loads(s)
239
249
  except (UnicodeDecodeError, orjson.JSONDecodeError):
240
- # не UTF-8 или не JSON → base64
241
250
  return base64.b64encode(dumped).decode()
242
251
  return dumped
243
252
 
@@ -308,16 +317,6 @@ class AsyncAGWCheckpointSaver(BaseCheckpointSaver):
308
317
  except Exception:
309
318
  return obj
310
319
 
311
- # def _safe_load(self, obj: Any) -> Any:
312
- # """Обратная операция к _safe_dump."""
313
- # if isinstance(obj, str):
314
- # try:
315
- # return self.serde.load(base64.b64decode(obj))
316
- # except Exception:
317
- # # не base64 — обычная строка
318
- # return self.serde.load(obj)
319
- # return self.serde.load(obj)
320
-
321
320
  # ----------------------- config <-> api --------------------------
322
321
  def _to_api_config(self, cfg: RunnableConfig | None) -> Dict[str, Any]:
323
322
  if not cfg:
@@ -0,0 +1,4 @@
1
+ from .storage import store_file_in_sd_asset
2
+ from .storage_v2 import upload_file, FileUploadResponse
3
+
4
+ __all__ = ["store_file_in_sd_asset", "upload_file", "FileUploadResponse"]
@@ -0,0 +1,66 @@
1
+ import os
2
+ from typing import Optional
3
+ import requests
4
+ from pydantic import BaseModel
5
+
6
+
7
+ class FileUploadResponse(BaseModel):
8
+ """Ответ от сервиса загрузки файлов"""
9
+ id: Optional[str] = None
10
+ bucket: Optional[str] = None
11
+ key: Optional[str] = None
12
+ storage: Optional[str] = None
13
+ absolute_path: str
14
+
15
+
16
+ def upload_file(filename: str, file_bytes: bytes) -> Optional[FileUploadResponse]:
17
+ """
18
+ Загружает файл в бинарном формате через v2 API и возвращает информацию о загруженном файле.
19
+
20
+ Args:
21
+ filename: имя файла
22
+ file_bytes: содержимое файла в виде байтов
23
+
24
+ Returns:
25
+ FileUploadResponse с информацией о файле или None в случае ошибки
26
+ """
27
+
28
+ ai_agent = os.getenv("AGENT_SERVICE_NAME")
29
+ if not ai_agent:
30
+ raise ValueError("AGENT_SERVICE_NAME environment variable is required")
31
+
32
+ gateway_url = os.getenv("STORAGE_PROVIDER_AGW_URL", "http://localhost")
33
+ url = f"{gateway_url}/files/v2/upload"
34
+
35
+ headers = {
36
+ "x-agent-id": ai_agent,
37
+ "Content-Type": "application/octet-stream"
38
+ }
39
+
40
+ params = {
41
+ "name": filename
42
+ }
43
+
44
+ try:
45
+ response = requests.post(
46
+ url,
47
+ headers=headers,
48
+ params=params,
49
+ data=file_bytes
50
+ )
51
+ response.raise_for_status()
52
+
53
+ if response.status_code == 200:
54
+ data = response.json()
55
+ return FileUploadResponse(
56
+ id=data.get("id", ""),
57
+ bucket=data.get("bucket", ""),
58
+ key=data.get("key", ""),
59
+ storage=data.get("storage", ""),
60
+ absolute_path=data.get("absolutePath", "")
61
+ )
62
+
63
+ except requests.exceptions.RequestException as e:
64
+ print(f"Ошибка при загрузке файла через v2 API: {e}")
65
+
66
+ return None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-lab-sdk
3
- Version: 0.1.39
3
+ Version: 0.1.41
4
4
  Summary: SDK для работы с Agent Lab
5
5
  Author-email: Andrew Ohurtsov <andermirik@yandex.com>
6
6
  License: Proprietary and Confidential — All Rights Reserved
@@ -220,7 +220,32 @@ from agent_lab_sdk.storage import store_file_in_sd_asset
220
220
  store_file_in_storage("my-agent-name-filename.png", file_b64, "giga-agents")
221
221
  ```
222
222
 
223
- ### 4.2 AGW Checkpointer
223
+ ### 4.2 V2 File Upload
224
+
225
+ Новый v2 API для загрузки файлов через Agent Gateway с поддержкой бинарных данных и автоматическим выбором сервиса хранения.
226
+
227
+ ```python
228
+ from agent_lab_sdk.storage import upload_file, FileUploadResponse
229
+
230
+ # Загрузка из байтов
231
+ with open("document.pdf", "rb") as f:
232
+ file_bytes = f.read()
233
+ result: FileUploadResponse = upload_file("document.pdf", file_bytes)
234
+
235
+ # Результат - Pydantic модель с информацией о файле
236
+ print(f"File ID: {result.id}")
237
+ print(f"Absolute Path: {result.absolute_path}")
238
+ print(f"Storage: {result.storage}")
239
+ ```
240
+
241
+ #### Переменные окружения для V2 Upload
242
+
243
+ | Переменная | Описание | Значение по умолчанию |
244
+ | -------------------------- | ---------------------------------- | --------------------- |
245
+ | `AGENT_SERVICE_NAME` | Имя сервиса агента (обязательно) | - |
246
+ | `STORAGE_PROVIDER_AGW_URL` | URL Agent Gateway | `http://localhost` |
247
+
248
+ ### 4.3 AGW Checkpointer
224
249
 
225
250
  AGW поддерживает langgraph checkpoint API и в SDK представлен `AsyncAGWCheckpointSaver`, который позволяет сохранять состояние графа в AGW напрямую.
226
251
 
@@ -21,4 +21,5 @@ agent_lab_sdk/schema/__init__.py
21
21
  agent_lab_sdk/schema/input_types.py
22
22
  agent_lab_sdk/schema/log_message.py
23
23
  agent_lab_sdk/storage/__init__.py
24
- agent_lab_sdk/storage/storage.py
24
+ agent_lab_sdk/storage/storage.py
25
+ agent_lab_sdk/storage/storage_v2.py
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "agent-lab-sdk"
7
- version = "0.1.39"
7
+ version = "0.1.41"
8
8
  description = "SDK для работы с Agent Lab"
9
9
  readme = "README.md"
10
10
  license = { text = "Proprietary and Confidential — All Rights Reserved" }
@@ -1,3 +0,0 @@
1
- from .storage import store_file_in_sd_asset
2
-
3
- __all__ = ["store_file_in_sd_asset"]
File without changes
File without changes