agent-lab-sdk 0.1.58.dev3__tar.gz → 0.1.59.dev1__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 (53) hide show
  1. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/PKG-INFO +1 -1
  2. agent_lab_sdk-0.1.59.dev1/agent_lab_sdk/core/__init__.py +3 -0
  3. agent_lab_sdk-0.1.59.dev1/agent_lab_sdk/core/context.py +5 -0
  4. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/core/settings.py +3 -0
  5. agent_lab_sdk-0.1.59.dev1/agent_lab_sdk/core/utils.py +28 -0
  6. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/langgraph/checkpoint/agw_saver.py +10 -2
  7. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/llm/agw_token_manager.py +7 -1
  8. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/llm/clients/agent_service_client.py +4 -1
  9. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/llm/gigachat_token_manager.py +3 -1
  10. agent_lab_sdk-0.1.59.dev1/agent_lab_sdk/llm/gigachat_wrapper.py +94 -0
  11. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/llm/llm.py +3 -2
  12. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/llm/throttled.py +7 -8
  13. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/storage/storage.py +6 -1
  14. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/storage/storage_v2.py +10 -2
  15. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/tools/search_plugin/search_plugin.py +4 -1
  16. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk.egg-info/PKG-INFO +1 -1
  17. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk.egg-info/SOURCES.txt +3 -0
  18. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/pyproject.toml +1 -1
  19. agent_lab_sdk-0.1.58.dev3/agent_lab_sdk/tools/__init__.py +0 -0
  20. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/LICENSE +0 -0
  21. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/README.md +0 -0
  22. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/__init__.py +0 -0
  23. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/core/unified_semaphore.py +0 -0
  24. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/langgraph/checkpoint/__init__.py +0 -0
  25. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/langgraph/checkpoint/serde.py +0 -0
  26. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/llm/__init__.py +0 -0
  27. {agent_lab_sdk-0.1.58.dev3/agent_lab_sdk/core → agent_lab_sdk-0.1.59.dev1/agent_lab_sdk/llm/clients}/__init__.py +0 -0
  28. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/llm/clients/redis_client.py +0 -0
  29. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/llm/limiting.py +0 -0
  30. {agent_lab_sdk-0.1.58.dev3/agent_lab_sdk/llm/clients → agent_lab_sdk-0.1.59.dev1/agent_lab_sdk/llm/managers}/__init__.py +0 -0
  31. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/llm/managers/ags_token_manager.py +0 -0
  32. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/llm/managers/limits_manager.py +0 -0
  33. {agent_lab_sdk-0.1.58.dev3/agent_lab_sdk/llm/managers → agent_lab_sdk-0.1.59.dev1/agent_lab_sdk/llm/managers/redis}/__init__.py +0 -0
  34. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/llm/managers/redis/ratelimiter.py +0 -0
  35. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/llm/managers/redis/semaphore.py +0 -0
  36. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/llm/retry_utils.py +0 -0
  37. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/llm/token_manager_utils.py +0 -0
  38. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/metrics/__init__.py +0 -0
  39. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/metrics/create.py +0 -0
  40. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/metrics/metrics.py +0 -0
  41. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/schema/__init__.py +0 -0
  42. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/schema/input_types.py +0 -0
  43. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/schema/log_message.py +0 -0
  44. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/storage/__init__.py +0 -0
  45. {agent_lab_sdk-0.1.58.dev3/agent_lab_sdk/llm/managers/redis → agent_lab_sdk-0.1.59.dev1/agent_lab_sdk/tools}/__init__.py +0 -0
  46. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/tools/search_plugin/__init__.py +0 -0
  47. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/tools/search_plugin/tools/__init__.py +0 -0
  48. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/tools/search_plugin/tools/search_image.py +0 -0
  49. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/tools/search_plugin/tools/search_plugin_web_search.py +0 -0
  50. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk.egg-info/dependency_links.txt +0 -0
  51. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk.egg-info/requires.txt +0 -0
  52. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk.egg-info/top_level.txt +0 -0
  53. {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-lab-sdk
3
- Version: 0.1.58.dev3
3
+ Version: 0.1.59.dev1
4
4
  Summary: SDK для работы с Agent Lab
5
5
  Author-email: Andrew Ohurtsov <andermirik@yandex.com>
6
6
  License: Proprietary and Confidential — All Rights Reserved
@@ -0,0 +1,3 @@
1
+ import agent_lab_sdk.core.context
2
+
3
+ __all__ = ["context"]
@@ -0,0 +1,5 @@
1
+ from contextvars import ContextVar
2
+ from typing import Optional
3
+
4
+ trace_id_var: ContextVar[Optional[str]] = ContextVar("trace_id_var", default=None)
5
+ request_id_var: ContextVar[Optional[str]] = ContextVar("request_id_var", default=None)
@@ -41,6 +41,9 @@ class Settings(BaseSettings):
41
41
 
42
42
  GIGACHAT_USE_MTLS: bool = False
43
43
 
44
+ DISABLE_WORKER_CONTEXT: bool = False
45
+ ENABLE_HANDLE_GIGACHAT_STATUS: bool = False
46
+
44
47
  class Config:
45
48
  env_prefix = ENV_PREFIX
46
49
 
@@ -0,0 +1,28 @@
1
+ import contextvars
2
+
3
+ from agent_lab_sdk.core.context import trace_id_var, request_id_var
4
+ from agent_lab_sdk.core.settings import settings
5
+
6
+
7
+ def _get_worker_context():
8
+ if settings.DISABLE_WORKER_CONTEXT:
9
+ return {}
10
+ ctx = contextvars.copy_context()
11
+ for var, value in ctx.items():
12
+ if var.name == "worker_context":
13
+ return value
14
+ return {}
15
+
16
+ def get_trace_id() -> str | None:
17
+ trace_id = trace_id_var.get()
18
+ if trace_id is None:
19
+ ctx = _get_worker_context()
20
+ trace_id = ctx.get("trace_id", None)
21
+ return trace_id
22
+
23
+ def get_request_id() -> str | None:
24
+ request_id = request_id_var.get()
25
+ if request_id is None:
26
+ ctx = _get_worker_context()
27
+ request_id = ctx.get("request_id", None)
28
+ return request_id
@@ -30,6 +30,7 @@ from langgraph.checkpoint.serde.encrypted import EncryptedSerializer
30
30
 
31
31
  from .serde import Serializer
32
32
  from agent_lab_sdk.metrics import get_metric
33
+ from agent_lab_sdk.core.utils import get_trace_id
33
34
 
34
35
  __all__ = ["AsyncAGWCheckpointSaver"]
35
36
 
@@ -497,9 +498,13 @@ class AsyncAGWCheckpointSaver(BaseCheckpointSaver):
497
498
  if not cfg:
498
499
  return {}
499
500
  user_id = cfg.get("configurable", {}).get("user_id")
501
+ trace_id = cfg.get("configurable", {}).get("trace_id")
502
+ headers = {}
500
503
  if user_id:
501
- return {"x-user-id": str(user_id)}
502
- return {}
504
+ headers["x-user-id"] = str(user_id)
505
+ if trace_id:
506
+ headers["x-trace-id"] = str(trace_id)
507
+ return headers
503
508
 
504
509
  # ----------------------- config <-> api --------------------------
505
510
  def _to_api_config(self, cfg: RunnableConfig | None) -> Dict[str, Any]:
@@ -611,6 +616,9 @@ class AsyncAGWCheckpointSaver(BaseCheckpointSaver):
611
616
  ) -> httpx.Response:
612
617
  if headers:
613
618
  kw["headers"] = {**kw.get("headers", {}), **headers}
619
+ trace_id = get_trace_id()
620
+ if trace_id:
621
+ kw["headers"] = {**{"x-trace-id": trace_id}, **kw.get("headers", {})}
614
622
 
615
623
  if "json" in kw:
616
624
  payload = kw.pop("json")
@@ -1,3 +1,4 @@
1
+ import uuid
1
2
  from typing import Optional
2
3
 
3
4
  import requests
@@ -11,6 +12,7 @@ import time
11
12
  from datetime import datetime, timedelta, timezone
12
13
 
13
14
  from agent_lab_sdk.core.settings import settings
15
+ from agent_lab_sdk.core.utils import get_trace_id
14
16
 
15
17
  logger = logging.getLogger(__name__)
16
18
 
@@ -37,12 +39,16 @@ class AgwTokenManager:
37
39
  params = {"provider": provider}
38
40
  if token_type:
39
41
  params["type"] = token_type
42
+
43
+ headers = {
44
+ "x-trace-id": get_trace_id() or str(uuid.uuid4()),
45
+ }
40
46
 
41
47
  max_retries = TOKEN_PROVIDER_AGW_DEFAULT_MAX_RETRIES
42
48
  for attempt in range(1, max_retries + 1):
43
49
  try:
44
50
  logger.info(f"Попытка получения токена из AGW ({attempt}/{max_retries})...")
45
- resp = requests.post(req_url, params=params, data={}, verify=False, timeout=TOKEN_PROVIDER_AGW_TIMEOUT_SEC)
51
+ resp = requests.post(req_url, params=params, data={}, verify=False, headers=headers, timeout=TOKEN_PROVIDER_AGW_TIMEOUT_SEC)
46
52
  resp.raise_for_status()
47
53
  result = resp.json()
48
54
 
@@ -1,10 +1,12 @@
1
1
  import logging
2
+ import uuid
2
3
  from urllib.parse import urljoin
3
4
 
4
5
  import httpx
5
6
  from httpx import HTTPTransport
6
7
 
7
8
  from agent_lab_sdk.core.settings import settings, ENV_PREFIX
9
+ from agent_lab_sdk.core.utils import get_trace_id
8
10
 
9
11
  logger = logging.getLogger(__name__)
10
12
 
@@ -45,7 +47,8 @@ class AgentServiceClient:
45
47
  "credentialId": credential_id,
46
48
  }
47
49
  headers = {
48
- "Authorization": f"Bearer {settings.AGENT_SERVICE_TOKEN}"
50
+ "Authorization": f"Bearer {settings.AGENT_SERVICE_TOKEN}",
51
+ "x-trace-id": get_trace_id() or str(uuid.uuid4()),
49
52
  }
50
53
  try:
51
54
  response = client.post(url, headers=headers, json=body)
@@ -16,6 +16,7 @@ import urllib3
16
16
 
17
17
  from agent_lab_sdk.core.settings import settings
18
18
  from agent_lab_sdk.llm.managers.ags_token_manager import AgsTokenManager
19
+ from agent_lab_sdk.core.utils import get_trace_id
19
20
 
20
21
  logging.basicConfig(level=logging.INFO)
21
22
  logger = logging.getLogger(__name__)
@@ -145,7 +146,8 @@ class GigaChatTokenManager:
145
146
  "Accept": "application/json",
146
147
  "User-Agent": "agent-toolkit",
147
148
  "RqUID": str(uuid.uuid4()), # Уникальный идентификатор запроса
148
- "Authorization": f"Basic {gigachat_credentials}"
149
+ "Authorization": f"Basic {gigachat_credentials}",
150
+ "x-trace-id": get_trace_id() or str(uuid.uuid4()),
149
151
  }
150
152
 
151
153
  max_retries = DEFAULT_MAX_RETRIES
@@ -0,0 +1,94 @@
1
+ import inspect
2
+ import logging
3
+ import functools
4
+ import uuid
5
+ from http import HTTPStatus
6
+
7
+ from gigachat.context import trace_id_cvar
8
+ from langchain_gigachat import GigaChat, GigaChatEmbeddings
9
+ from langchain_core.messages import AIMessage
10
+ from gigachat.exceptions import ResponseError
11
+
12
+ from agent_lab_sdk.core.settings import settings
13
+ from agent_lab_sdk.core.utils import get_trace_id
14
+
15
+ logger = logging.getLogger(__name__)
16
+
17
+
18
+ def _method_wrapper(method):
19
+ is_async = inspect.iscoroutinefunction(method)
20
+
21
+ @functools.wraps(method)
22
+ async def async_wrapper(self, *args, **kwargs):
23
+ trace_id = get_trace_id() or str(uuid.uuid4())
24
+ trace_id_cvar.set(trace_id)
25
+
26
+ try:
27
+ return await method(self, *args, **kwargs)
28
+ except ResponseError as e:
29
+ _, status, _, _ = e.args
30
+
31
+ if settings.ENABLE_HANDLE_GIGACHAT_STATUS and status in (HTTPStatus.NOT_FOUND, HTTPStatus.FORBIDDEN):
32
+ logger.warning(
33
+ f"Encountered HTTP {status}. Executing 'on_request_error' handler."
34
+ )
35
+ return AIMessage(
36
+ content=f"Модель '{self.model}' на контуре '{self.base_url}' временно недоступна."
37
+ )
38
+
39
+ logger.error(f"GigaChat error: {e}")
40
+ raise
41
+ except Exception as e:
42
+ logger.error(f"Unknown error: {e!r}")
43
+ raise
44
+
45
+ @functools.wraps(method)
46
+ def sync_wrapper(self, *args, **kwargs):
47
+ trace_id = get_trace_id() or str(uuid.uuid4())
48
+ trace_id_cvar.set(trace_id)
49
+
50
+ try:
51
+ return method(self, *args, **kwargs)
52
+ except ResponseError as e:
53
+ _, status, _, _ = e.args
54
+
55
+ if settings.ENABLE_HANDLE_GIGACHAT_STATUS and status in (HTTPStatus.NOT_FOUND, HTTPStatus.FORBIDDEN):
56
+ logger.warning(
57
+ f"Encountered HTTP {status}. Executing 'on_request_error' handler."
58
+ )
59
+ return AIMessage(
60
+ content=f"Модель '{self.model}' на контуре '{self.base_url}' временно недоступна."
61
+ )
62
+
63
+ logger.error(f"GigaChat error: {e}")
64
+ raise
65
+ except Exception as e:
66
+ logger.error(f"Unknown error: {e!r}")
67
+ raise
68
+
69
+ return async_wrapper if is_async else sync_wrapper
70
+
71
+ def wrap_gigachat_specific_methods(method_names):
72
+ def wrap_gigachat(cls):
73
+ for name, method in inspect.getmembers(cls, predicate=inspect.isfunction):
74
+ if callable(method) and name in method_names:
75
+ setattr(cls, name, _method_wrapper(method))
76
+ return cls
77
+ return wrap_gigachat
78
+
79
+
80
+ giga_chat_embeddings_wrap_method_names = ["embed_documents", "embed_query", "aembed_documents", "aembed_query"]
81
+ giga_chat_wrap_method_names = [
82
+ "invoke", "ainvoke", "stream", "astream", "astream_events", "batch", "abatch",
83
+ "upload_file", "aupload_file", "batch_as_completed", "abatch_as_completed"
84
+ ]
85
+
86
+ @wrap_gigachat_specific_methods(giga_chat_wrap_method_names)
87
+ class GigaChatWrapper(GigaChat):
88
+ def __init__(self, *args, **kwargs):
89
+ super().__init__(*args, **kwargs)
90
+
91
+ @wrap_gigachat_specific_methods(giga_chat_embeddings_wrap_method_names)
92
+ class GigaChatEmbeddingsWrapper(GigaChatEmbeddings):
93
+ def __init__(self, **kwargs):
94
+ super().__init__(**kwargs)
@@ -2,6 +2,7 @@ from langchain_gigachat.chat_models import GigaChat
2
2
  from langchain_gigachat.embeddings import GigaChatEmbeddings
3
3
  from agent_lab_sdk.core.settings import settings
4
4
  from agent_lab_sdk.llm.gigachat_token_manager import GigaChatTokenManager
5
+ from agent_lab_sdk.llm.gigachat_wrapper import GigaChatEmbeddingsWrapper, GigaChatWrapper
5
6
  from agent_lab_sdk.llm.token_manager_utils import build_token_manager_kwargs
6
7
  from agent_lab_sdk.llm.throttled import ThrottledGigaChat, ThrottledGigaChatEmbeddings
7
8
  from typing import Union
@@ -48,9 +49,9 @@ def get_model(
48
49
  verify_ssl_certs = os.getenv("GIGACHAT_VERIFY_SSL_CERTS", verify_ssl_certs)
49
50
 
50
51
  if type == "chat":
51
- _class = ThrottledGigaChat if throttled else GigaChat
52
+ _class = ThrottledGigaChat if throttled else GigaChatWrapper
52
53
  elif type == "embeddings":
53
- _class = ThrottledGigaChatEmbeddings if throttled else GigaChatEmbeddings
54
+ _class = ThrottledGigaChatEmbeddings if throttled else GigaChatEmbeddingsWrapper
54
55
  else:
55
56
  raise ValueError(f"unsupported type {type}. possible values: chat, embeddings")
56
57
 
@@ -3,11 +3,10 @@ import os
3
3
  from typing import Optional
4
4
 
5
5
  import langchain_gigachat.embeddings.gigachat
6
- from langchain_gigachat import GigaChatEmbeddings
7
- from langchain_gigachat.chat_models import GigaChat
8
6
  from pydantic import PrivateAttr
9
7
 
10
8
  from agent_lab_sdk.core.settings import settings
9
+ from agent_lab_sdk.llm.gigachat_wrapper import GigaChatEmbeddingsWrapper, GigaChatWrapper
11
10
  from agent_lab_sdk.llm.limiting import get_limiter_with_metrics
12
11
  from agent_lab_sdk.llm.managers.ags_token_manager import AgsTokenManager
13
12
 
@@ -46,7 +45,7 @@ _semaphores = {
46
45
  "embed": get_limiter_with_metrics("embed", MAX_EMBED_CONCURRENCY),
47
46
  }
48
47
 
49
- class ThrottledGigaChatEmbeddings(GigaChatEmbeddings):
48
+ class ThrottledGigaChatEmbeddings(GigaChatEmbeddingsWrapper):
50
49
  _manage_access_token: bool = PrivateAttr(default=True)
51
50
  _retry_enabled: bool = PrivateAttr(default=False)
52
51
  _base_kwargs: dict = PrivateAttr(default={})
@@ -95,7 +94,7 @@ class ThrottledGigaChatEmbeddings(GigaChatEmbeddings):
95
94
  self._use_token_provider_ags = use_token_provider_ags
96
95
 
97
96
 
98
- def _fresh(self) -> GigaChatEmbeddings:
97
+ def _fresh(self) -> GigaChatEmbeddingsWrapper:
99
98
  if self._manage_access_token:
100
99
  new_kwargs = _resolve_token_kwargs(
101
100
  self._model,
@@ -104,7 +103,7 @@ class ThrottledGigaChatEmbeddings(GigaChatEmbeddings):
104
103
  self._base_kwargs,
105
104
  self._token_manager_kwargs
106
105
  )
107
- return GigaChatEmbeddings(**new_kwargs)
106
+ return GigaChatEmbeddingsWrapper(**new_kwargs)
108
107
  else:
109
108
  # возвращаем proxy объект чтобы не ломать цепочку наследования
110
109
  return super(ThrottledGigaChatEmbeddings, self)
@@ -142,7 +141,7 @@ class ThrottledGigaChatEmbeddings(GigaChatEmbeddings):
142
141
  lambda: self._fresh().aembed_query(*args, **kwargs),
143
142
  )
144
143
 
145
- class ThrottledGigaChat(GigaChat):
144
+ class ThrottledGigaChat(GigaChatWrapper):
146
145
  _manage_access_token: bool = PrivateAttr(default=True)
147
146
  _retry_enabled: bool = PrivateAttr(default=False)
148
147
  _base_kwargs: dict = PrivateAttr(default={})
@@ -190,7 +189,7 @@ class ThrottledGigaChat(GigaChat):
190
189
  self._model = model
191
190
  self._use_token_provider_ags = use_token_provider_ags
192
191
 
193
- def _fresh(self) -> GigaChat:
192
+ def _fresh(self) -> GigaChatWrapper:
194
193
  if self._manage_access_token:
195
194
  new_kwargs = _resolve_token_kwargs(
196
195
  self._model,
@@ -199,7 +198,7 @@ class ThrottledGigaChat(GigaChat):
199
198
  self._base_kwargs,
200
199
  self._token_manager_kwargs
201
200
  )
202
- new_gigachat = GigaChat(**new_kwargs)
201
+ new_gigachat = GigaChatWrapper(**new_kwargs)
203
202
  # это поле которое управляется классом BaseChatModel, по другому его пока никак не прокинуть
204
203
  new_gigachat.disable_streaming = self.disable_streaming
205
204
  return new_gigachat
@@ -1,10 +1,14 @@
1
1
  import base64
2
2
  import os
3
3
  import mimetypes
4
+ import uuid
4
5
  from typing import Optional
5
6
  from io import BytesIO
6
7
  import requests
7
8
 
9
+ from agent_lab_sdk.core.utils import get_trace_id
10
+
11
+
8
12
  def store_file_in_sd_asset(filename: str, file_base64: str, folder: str = "giga-agents") -> Optional[str]:
9
13
  """
10
14
  Загружает файл в формате base64 в SD Asset API и возвращает URL загруженного файла.
@@ -32,7 +36,8 @@ def store_file_in_sd_asset(filename: str, file_base64: str, folder: str = "giga-
32
36
 
33
37
  # Заголовки запроса
34
38
  headers = {
35
- "X-Api-Key": api_key
39
+ "X-Api-Key": api_key,
40
+ "x-trace-id": get_trace_id() or str(uuid.uuid4()),
36
41
  }
37
42
 
38
43
  mimetype, _ = mimetypes.guess_type(filename)
@@ -1,4 +1,5 @@
1
1
  import os
2
+ import uuid
2
3
  from typing import Optional
3
4
  import logging
4
5
  import requests
@@ -6,6 +7,8 @@ from urllib.parse import urljoin
6
7
  from pydantic import BaseModel
7
8
  import httpx
8
9
 
10
+ from agent_lab_sdk.core.utils import get_trace_id
11
+
9
12
  logger = logging.getLogger(__name__)
10
13
 
11
14
 
@@ -43,7 +46,8 @@ def upload_file(filename: str, file_bytes: bytes) -> Optional[FileUploadResponse
43
46
 
44
47
  headers = {
45
48
  "x-agent-id": ai_agent,
46
- "Content-Type": "application/octet-stream"
49
+ "Content-Type": "application/octet-stream",
50
+ "x-trace-id": get_trace_id() or str(uuid.uuid4()),
47
51
  }
48
52
 
49
53
  params = {
@@ -94,7 +98,11 @@ async def async_upload_file(filename: str, file_bytes: bytes, timeout=30.) -> Op
94
98
  gateway_url = os.getenv("STORAGE_PROVIDER_AGW_URL", "http://localhost")
95
99
  url = _get_upload_path(gateway_url)
96
100
 
97
- headers = {"x-agent-id": ai_agent, "Content-Type": "application/octet-stream"}
101
+ headers = {
102
+ "x-agent-id": ai_agent,
103
+ "Content-Type": "application/octet-stream",
104
+ "x-trace-id": get_trace_id() or str(uuid.uuid4()),
105
+ }
98
106
  params = {"name": filename}
99
107
 
100
108
  logger.debug(
@@ -6,7 +6,8 @@ from enum import StrEnum
6
6
 
7
7
  import httpx
8
8
 
9
- from agent_lab_sdk.core.settings import settings, ENV_PREFIX
9
+ from agent_lab_sdk.core.settings import settings
10
+ from agent_lab_sdk.core.utils import get_trace_id
10
11
  from agent_lab_sdk.llm.limiting import get_limiter_with_metrics
11
12
  from agent_lab_sdk.metrics import get_metric
12
13
  import xml.etree.ElementTree as ET
@@ -128,6 +129,7 @@ class SearchPlugin:
128
129
  "X-Client-ID": str(uuid.uuid4()),
129
130
  "X-Request-ID": str(uuid.uuid4()),
130
131
  "X-Session-ID": str(uuid.uuid4()),
132
+ "x-trace-id": get_trace_id() or str(uuid.uuid4()),
131
133
  **headers
132
134
  }
133
135
 
@@ -190,6 +192,7 @@ class SearchPlugin:
190
192
  headers = {
191
193
  "Authorization": f"{self._api_key}",
192
194
  "User-Agent": "agent-toolkit",
195
+ "x-trace-id": get_trace_id() or str(uuid.uuid4()),
193
196
  **headers
194
197
  }
195
198
  url = self._base_url or self._get_setting_or_raise("SEARCH_IMAGES_PLUGIN_URL")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-lab-sdk
3
- Version: 0.1.58.dev3
3
+ Version: 0.1.59.dev1
4
4
  Summary: SDK для работы с Agent Lab
5
5
  Author-email: Andrew Ohurtsov <andermirik@yandex.com>
6
6
  License: Proprietary and Confidential — All Rights Reserved
@@ -8,14 +8,17 @@ agent_lab_sdk.egg-info/dependency_links.txt
8
8
  agent_lab_sdk.egg-info/requires.txt
9
9
  agent_lab_sdk.egg-info/top_level.txt
10
10
  agent_lab_sdk/core/__init__.py
11
+ agent_lab_sdk/core/context.py
11
12
  agent_lab_sdk/core/settings.py
12
13
  agent_lab_sdk/core/unified_semaphore.py
14
+ agent_lab_sdk/core/utils.py
13
15
  agent_lab_sdk/langgraph/checkpoint/__init__.py
14
16
  agent_lab_sdk/langgraph/checkpoint/agw_saver.py
15
17
  agent_lab_sdk/langgraph/checkpoint/serde.py
16
18
  agent_lab_sdk/llm/__init__.py
17
19
  agent_lab_sdk/llm/agw_token_manager.py
18
20
  agent_lab_sdk/llm/gigachat_token_manager.py
21
+ agent_lab_sdk/llm/gigachat_wrapper.py
19
22
  agent_lab_sdk/llm/limiting.py
20
23
  agent_lab_sdk/llm/llm.py
21
24
  agent_lab_sdk/llm/retry_utils.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.58.dev3"
7
+ version = "0.1.59.dev1"
8
8
  description = "SDK для работы с Agent Lab"
9
9
  readme = "README.md"
10
10
  license = { text = "Proprietary and Confidential — All Rights Reserved" }
File without changes