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.
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/PKG-INFO +1 -1
- agent_lab_sdk-0.1.59.dev1/agent_lab_sdk/core/__init__.py +3 -0
- agent_lab_sdk-0.1.59.dev1/agent_lab_sdk/core/context.py +5 -0
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/core/settings.py +3 -0
- agent_lab_sdk-0.1.59.dev1/agent_lab_sdk/core/utils.py +28 -0
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/langgraph/checkpoint/agw_saver.py +10 -2
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/llm/agw_token_manager.py +7 -1
- {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
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/llm/gigachat_token_manager.py +3 -1
- agent_lab_sdk-0.1.59.dev1/agent_lab_sdk/llm/gigachat_wrapper.py +94 -0
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/llm/llm.py +3 -2
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/llm/throttled.py +7 -8
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/storage/storage.py +6 -1
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/storage/storage_v2.py +10 -2
- {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
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk.egg-info/PKG-INFO +1 -1
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk.egg-info/SOURCES.txt +3 -0
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/pyproject.toml +1 -1
- agent_lab_sdk-0.1.58.dev3/agent_lab_sdk/tools/__init__.py +0 -0
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/LICENSE +0 -0
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/README.md +0 -0
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/__init__.py +0 -0
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/core/unified_semaphore.py +0 -0
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/langgraph/checkpoint/__init__.py +0 -0
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/langgraph/checkpoint/serde.py +0 -0
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/llm/__init__.py +0 -0
- {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
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/llm/clients/redis_client.py +0 -0
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/llm/limiting.py +0 -0
- {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
- {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
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/llm/managers/limits_manager.py +0 -0
- {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
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/llm/managers/redis/ratelimiter.py +0 -0
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/llm/managers/redis/semaphore.py +0 -0
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/llm/retry_utils.py +0 -0
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/llm/token_manager_utils.py +0 -0
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/metrics/__init__.py +0 -0
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/metrics/create.py +0 -0
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/metrics/metrics.py +0 -0
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/schema/__init__.py +0 -0
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/schema/input_types.py +0 -0
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/schema/log_message.py +0 -0
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/storage/__init__.py +0 -0
- {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
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/tools/search_plugin/__init__.py +0 -0
- {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
- {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
- {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
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk.egg-info/dependency_links.txt +0 -0
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk.egg-info/requires.txt +0 -0
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk.egg-info/top_level.txt +0 -0
- {agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/setup.cfg +0 -0
|
@@ -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
|
-
|
|
502
|
-
|
|
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")
|
{agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/llm/agw_token_manager.py
RENAMED
|
@@ -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)
|
{agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/llm/gigachat_token_manager.py
RENAMED
|
@@ -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
|
|
52
|
+
_class = ThrottledGigaChat if throttled else GigaChatWrapper
|
|
52
53
|
elif type == "embeddings":
|
|
53
|
-
_class = ThrottledGigaChatEmbeddings if throttled else
|
|
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(
|
|
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) ->
|
|
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
|
|
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(
|
|
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) ->
|
|
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 =
|
|
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 = {
|
|
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
|
|
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")
|
|
@@ -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.
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/core/unified_semaphore.py
RENAMED
|
File without changes
|
|
File without changes
|
{agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/langgraph/checkpoint/serde.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/llm/clients/redis_client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/llm/managers/limits_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk/llm/token_manager_utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
{agent_lab_sdk-0.1.58.dev3 → agent_lab_sdk-0.1.59.dev1}/agent_lab_sdk.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|