agent-lab-sdk 0.1.11__py3-none-any.whl → 0.1.13__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 agent-lab-sdk might be problematic. Click here for more details.

@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- import json
3
+ import orjson
4
4
  from random import random
5
5
  from langgraph.checkpoint.serde.types import ChannelProtocol
6
6
  import asyncio
@@ -9,7 +9,7 @@ from contextlib import asynccontextmanager
9
9
  from typing import Any, AsyncIterator, Dict, Iterator, Optional, Sequence, Tuple
10
10
  import logging
11
11
 
12
- import requests
12
+ import httpx
13
13
  from langchain_core.runnables import RunnableConfig
14
14
 
15
15
  from langgraph.checkpoint.base import (
@@ -40,7 +40,7 @@ except NameError: # pragma: no cover
40
40
 
41
41
 
42
42
  class AsyncAGWCheckpointSaver(BaseCheckpointSaver):
43
- """Persist checkpoints in Agent-Gateway с помощью `requests` + threads."""
43
+ """Persist checkpoints in Agent-Gateway с помощью `httpx` async client."""
44
44
 
45
45
  # ---------------------------- init / ctx -------------------------
46
46
  def __init__(
@@ -51,11 +51,11 @@ class AsyncAGWCheckpointSaver(BaseCheckpointSaver):
51
51
  timeout: int | float = 10,
52
52
  api_key: str | None = None,
53
53
  extra_headers: Dict[str, str] | None = None,
54
+ verify: bool = True,
54
55
  ):
55
56
  super().__init__(serde=serde)
56
57
  self.base_url = base_url.rstrip("/")
57
58
  self.timeout = timeout
58
- self._session = requests.Session()
59
59
  self.loop = asyncio.get_running_loop()
60
60
 
61
61
  self.headers: Dict[str, str] = {
@@ -66,12 +66,20 @@ class AsyncAGWCheckpointSaver(BaseCheckpointSaver):
66
66
  self.headers.update(extra_headers)
67
67
  if api_key:
68
68
  self.headers["Authorization"] = f"Bearer {api_key}"
69
+
70
+ self._client = httpx.AsyncClient(
71
+ base_url=self.base_url,
72
+ headers=self.headers,
73
+ timeout=self.timeout,
74
+ verify=verify,
75
+ trust_env=True
76
+ )
69
77
 
70
78
  async def __aenter__(self): # noqa: D401
71
79
  return self
72
80
 
73
81
  async def __aexit__(self, exc_type, exc, tb): # noqa: D401
74
- await asyncio.to_thread(self._session.close)
82
+ await self._client.aclose()
75
83
 
76
84
  # ----------------------- universal dump/load ---------------------
77
85
  # def _safe_dump(self, obj: Any) -> Any:
@@ -89,15 +97,15 @@ class AsyncAGWCheckpointSaver(BaseCheckpointSaver):
89
97
  # 1) bytes → str
90
98
  s = dumped.decode()
91
99
  # 2) str JSON → python (list/dict/scalar)
92
- return json.loads(s)
93
- except (UnicodeDecodeError, json.JSONDecodeError):
100
+ return orjson.loads(s)
101
+ except (UnicodeDecodeError, orjson.JSONDecodeError):
94
102
  # не UTF-8 или не JSON → base64
95
103
  return base64.b64encode(dumped).decode()
96
104
  return dumped
97
105
 
98
106
  def _safe_load(self, obj: Any) -> Any:
99
107
  if isinstance(obj, (dict, list)): # уже распакованный JSON
100
- return self.serde.loads(json.dumps(obj, ensure_ascii=False).encode())
108
+ return self.serde.loads(orjson.dumps(obj))
101
109
  if isinstance(obj, str):
102
110
  # сначала plain JSON-строка
103
111
  try:
@@ -195,18 +203,12 @@ class AsyncAGWCheckpointSaver(BaseCheckpointSaver):
195
203
  return self._safe_load(md)
196
204
 
197
205
  # ------------------------ HTTP wrapper ---------------------------
198
- async def _http(self, m: str, path: str, **kw) -> requests.Response:
199
- url = f"{self.base_url}{path}"
200
- hdr = {**self.headers, **kw.pop("headers", {})}
201
-
206
+ async def _http(self, method: str, path: str, **kw) -> httpx.Response:
202
207
  if "json" in kw:
203
208
  payload = kw.pop("json")
204
- kw["data"] = json.dumps(payload, ensure_ascii=False, separators=(",", ":"))
205
- logger.info(kw["data"])
206
-
207
- return await asyncio.to_thread(
208
- self._session.request, m, url, headers=hdr, timeout=self.timeout, **kw
209
- )
209
+ logger.info(orjson.dumps(payload).decode())
210
+
211
+ return await self._client.request(method, path, **kw)
210
212
 
211
213
  # -------------------- api -> CheckpointTuple ----------------------
212
214
  def _to_tuple(self, node: Dict[str, Any]) -> CheckpointTuple:
@@ -378,4 +380,4 @@ class AsyncAGWCheckpointSaver(BaseCheckpointSaver):
378
380
  try:
379
381
  yield saver
380
382
  finally:
381
- await asyncio.to_thread(saver._session.close)
383
+ await saver._client.aclose()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-lab-sdk
3
- Version: 0.1.11
3
+ Version: 0.1.13
4
4
  Summary: SDK для работы с Agent Lab
5
5
  Author-email: Andrew Ohurtsov <andermirik@yandex.com>
6
6
  License: Proprietary and Confidential — All Rights Reserved
@@ -23,6 +23,8 @@ Requires-Dist: langgraph~=0.4.1
23
23
  Requires-Dist: langchain_gigachat
24
24
  Requires-Dist: prometheus-client
25
25
  Requires-Dist: langchain
26
+ Requires-Dist: httpx~=0.27.2
27
+ Requires-Dist: orjson>=3.9.7
26
28
  Dynamic: license-file
27
29
 
28
30
  # Agent Lab SDK
@@ -1,6 +1,6 @@
1
1
  agent_lab_sdk/__init__.py,sha256=1Dlmv-wuz1QuciymKtYtX7jXzr_fkeGTe7aENfEDl3E,108
2
2
  agent_lab_sdk/langgraph/checkpoint/__init__.py,sha256=DnKwR1LwbaQ3qhb124lE-tnojrUIVcCdNzHEHwgpL5M,86
3
- agent_lab_sdk/langgraph/checkpoint/agw_saver.py,sha256=ALhZW-7XUIVsbZVjCRVhZcMmcYj_f9k3UU-owaq5vxM,13797
3
+ agent_lab_sdk/langgraph/checkpoint/agw_saver.py,sha256=2jCs7izQZ3RBV-lBBtITQKP8EASPDseNOcrqNCmejho,13727
4
4
  agent_lab_sdk/llm/__init__.py,sha256=Yo9MbYdHS1iX05A9XiJGwWN1Hm4IARGav9mNFPrtDeA,376
5
5
  agent_lab_sdk/llm/agw_token_manager.py,sha256=_bPPI8muaEa6H01P8hHQOJHiiivaLd8N_d3OT9UT_80,4787
6
6
  agent_lab_sdk/llm/gigachat_token_manager.py,sha256=TPA8cb0ypdWtRTI5C7GItL9jbLt93vR-Ijf2yMrOytQ,7921
@@ -12,8 +12,8 @@ agent_lab_sdk/schema/__init__.py,sha256=s91PH3Fj1eOq75gtOTiObSDiQdtpixg5Nhs3isBm
12
12
  agent_lab_sdk/schema/log_message.py,sha256=nadi6lZGRuDSPmfbYs9QPpRJUT9Pfy8Y7pGCvyFF5Mw,638
13
13
  agent_lab_sdk/storage/__init__.py,sha256=ik1_v1DMTwehvcAEXIYxuvLuCjJCa3y5qAuJqoQpuSA,81
14
14
  agent_lab_sdk/storage/storage.py,sha256=ELpt7GRwFD-aWa6ctinfA_QwcvzWLvKS0Wz8FlxVqAs,2075
15
- agent_lab_sdk-0.1.11.dist-info/licenses/LICENSE,sha256=_TRXHkF3S9ilWBPdZcHLI_S-PRjK0L_SeOb2pcPAdV4,417
16
- agent_lab_sdk-0.1.11.dist-info/METADATA,sha256=LdYKkRDXPhIsA-lkNsP-c_Eycq02y-nqceKDwrZv_ok,1749
17
- agent_lab_sdk-0.1.11.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
18
- agent_lab_sdk-0.1.11.dist-info/top_level.txt,sha256=E1efqkJ89KNmPBWdLzdMHeVtH0dYyCo4fhnSb81_15I,14
19
- agent_lab_sdk-0.1.11.dist-info/RECORD,,
15
+ agent_lab_sdk-0.1.13.dist-info/licenses/LICENSE,sha256=_TRXHkF3S9ilWBPdZcHLI_S-PRjK0L_SeOb2pcPAdV4,417
16
+ agent_lab_sdk-0.1.13.dist-info/METADATA,sha256=i_f36cFwJR4DqdxPp2KwULIsYHqvwdZBjR9qkTZxaiI,1807
17
+ agent_lab_sdk-0.1.13.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
18
+ agent_lab_sdk-0.1.13.dist-info/top_level.txt,sha256=E1efqkJ89KNmPBWdLzdMHeVtH0dYyCo4fhnSb81_15I,14
19
+ agent_lab_sdk-0.1.13.dist-info/RECORD,,