agent-lab-sdk 0.1.14__tar.gz → 0.1.16__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.

Potentially problematic release.


This version of agent-lab-sdk might be problematic. Click here for more details.

Files changed (29) hide show
  1. agent_lab_sdk-0.1.16/PKG-INFO +352 -0
  2. agent_lab_sdk-0.1.16/README.md +323 -0
  3. agent_lab_sdk-0.1.16/agent_lab_sdk/schema/__init__.py +25 -0
  4. agent_lab_sdk-0.1.16/agent_lab_sdk/schema/input_types.py +193 -0
  5. agent_lab_sdk-0.1.16/agent_lab_sdk.egg-info/PKG-INFO +352 -0
  6. {agent_lab_sdk-0.1.14 → agent_lab_sdk-0.1.16}/agent_lab_sdk.egg-info/SOURCES.txt +1 -0
  7. {agent_lab_sdk-0.1.14 → agent_lab_sdk-0.1.16}/pyproject.toml +1 -1
  8. agent_lab_sdk-0.1.14/PKG-INFO +0 -65
  9. agent_lab_sdk-0.1.14/README.md +0 -36
  10. agent_lab_sdk-0.1.14/agent_lab_sdk/schema/__init__.py +0 -2
  11. agent_lab_sdk-0.1.14/agent_lab_sdk.egg-info/PKG-INFO +0 -65
  12. {agent_lab_sdk-0.1.14 → agent_lab_sdk-0.1.16}/LICENSE +0 -0
  13. {agent_lab_sdk-0.1.14 → agent_lab_sdk-0.1.16}/agent_lab_sdk/__init__.py +0 -0
  14. {agent_lab_sdk-0.1.14 → agent_lab_sdk-0.1.16}/agent_lab_sdk/langgraph/checkpoint/__init__.py +0 -0
  15. {agent_lab_sdk-0.1.14 → agent_lab_sdk-0.1.16}/agent_lab_sdk/langgraph/checkpoint/agw_saver.py +0 -0
  16. {agent_lab_sdk-0.1.14 → agent_lab_sdk-0.1.16}/agent_lab_sdk/llm/__init__.py +0 -0
  17. {agent_lab_sdk-0.1.14 → agent_lab_sdk-0.1.16}/agent_lab_sdk/llm/agw_token_manager.py +0 -0
  18. {agent_lab_sdk-0.1.14 → agent_lab_sdk-0.1.16}/agent_lab_sdk/llm/gigachat_token_manager.py +0 -0
  19. {agent_lab_sdk-0.1.14 → agent_lab_sdk-0.1.16}/agent_lab_sdk/llm/llm.py +0 -0
  20. {agent_lab_sdk-0.1.14 → agent_lab_sdk-0.1.16}/agent_lab_sdk/llm/throttled.py +0 -0
  21. {agent_lab_sdk-0.1.14 → agent_lab_sdk-0.1.16}/agent_lab_sdk/metrics/__init__.py +0 -0
  22. {agent_lab_sdk-0.1.14 → agent_lab_sdk-0.1.16}/agent_lab_sdk/metrics/metrics.py +0 -0
  23. {agent_lab_sdk-0.1.14 → agent_lab_sdk-0.1.16}/agent_lab_sdk/schema/log_message.py +0 -0
  24. {agent_lab_sdk-0.1.14 → agent_lab_sdk-0.1.16}/agent_lab_sdk/storage/__init__.py +0 -0
  25. {agent_lab_sdk-0.1.14 → agent_lab_sdk-0.1.16}/agent_lab_sdk/storage/storage.py +0 -0
  26. {agent_lab_sdk-0.1.14 → agent_lab_sdk-0.1.16}/agent_lab_sdk.egg-info/dependency_links.txt +0 -0
  27. {agent_lab_sdk-0.1.14 → agent_lab_sdk-0.1.16}/agent_lab_sdk.egg-info/requires.txt +0 -0
  28. {agent_lab_sdk-0.1.14 → agent_lab_sdk-0.1.16}/agent_lab_sdk.egg-info/top_level.txt +0 -0
  29. {agent_lab_sdk-0.1.14 → agent_lab_sdk-0.1.16}/setup.cfg +0 -0
@@ -0,0 +1,352 @@
1
+ Metadata-Version: 2.4
2
+ Name: agent-lab-sdk
3
+ Version: 0.1.16
4
+ Summary: SDK для работы с Agent Lab
5
+ Author-email: Andrew Ohurtsov <andermirik@yandex.com>
6
+ License: Proprietary and Confidential — All Rights Reserved
7
+ Keywords: agent,lab,sdk
8
+ Classifier: Development Status :: 4 - Beta
9
+ Classifier: Intended Audience :: Developers
10
+ Classifier: Topic :: Software Development :: Libraries
11
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: Programming Language :: Python :: 3.11
14
+ Classifier: Programming Language :: Python :: 3.12
15
+ Classifier: Programming Language :: Python :: 3.13
16
+ Classifier: License :: Other/Proprietary License
17
+ Classifier: Operating System :: OS Independent
18
+ Requires-Python: <4.0,>=3.11
19
+ Description-Content-Type: text/markdown
20
+ License-File: LICENSE
21
+ Requires-Dist: requests
22
+ Requires-Dist: langgraph~=0.4.1
23
+ Requires-Dist: langchain_gigachat
24
+ Requires-Dist: prometheus-client
25
+ Requires-Dist: langchain
26
+ Requires-Dist: httpx~=0.27.2
27
+ Requires-Dist: orjson>=3.9.7
28
+ Dynamic: license-file
29
+
30
+ # Agent Lab SDK
31
+
32
+ Набор утилит и обёрток для упрощённой работы с LLM, Agent Gateway и метриками в проектах Giga Labs.
33
+
34
+ ## Установка
35
+
36
+ ```bash
37
+ pip install agent_lab_sdk
38
+ ```
39
+
40
+ ## Содержание
41
+
42
+ 1. [Модуль `agent_lab_sdk.llm`](#1-модуль-agent_lab_sdkllm)
43
+ 2. [Модуль `agent_lab_sdk.llm.throttled`](#2-модуль-agent_lab_sdkllmthrottled)
44
+ 3. [Модуль `agent_lab_sdk.metrics`](#3-модуль-agent_lab_sdkmetrics)
45
+ 4. [Хранилище](#4-хранилище)
46
+ 5. [Схема](#5-схема)
47
+ 6. [Сборка и публикация](#6-сборка-и-публикация)
48
+
49
+ ---
50
+
51
+ ## 1. Модуль `agent_lab_sdk.llm`
52
+
53
+ ### 1.1. Получение модели
54
+
55
+ ```python
56
+ from agent_lab_sdk.llm import get_model
57
+
58
+ # Использует токен из окружения по умолчанию
59
+ model = get_model()
60
+
61
+ # Передача явных параметров
62
+ model = get_model(
63
+ access_token="YOUR_TOKEN",
64
+ timeout=60,
65
+ scope="GIGACHAT_API_CORP"
66
+ )
67
+ ```
68
+
69
+ > если не передавать access_token, токен будет выбран через GigaChatTokenManager
70
+
71
+ ### 1.2. Менеджеры токенов
72
+
73
+ | Класс | Описание | Пример использования |
74
+ | ---------------------- | --------------------------------------------------------------------------------------- | ----------------------------------------------- |
75
+ | `AgwTokenManager` | Кеширование + получение токена через Agent Gateway | `token = AgwTokenManager.get_token("provider")` |
76
+ | `GigaChatTokenManager` | Кеширование + получение через GigaChat OAuth с использованием пользовательских секретов | `token = GigaChatTokenManager.get_token()` |
77
+
78
+ ### 1.3. Переменные окружения
79
+
80
+ | Переменная | Описание | Значение по умолчанию / Пример |
81
+ | ---------------------------------------- | -------------------------------------------------------- | --------------------------------------------------- |
82
+ | `GIGACHAT_SCOPE` | Scope GigaChat API | `GIGACHAT_API_PERS` |
83
+ | `GLOBAL_GIGACHAT_TIMEOUT` | Таймаут запросов к GigaChat (секунды) | `120` |
84
+ | `USE_TOKEN_PROVIDER_AGW` | Использовать `AgwTokenManager` | `true` |
85
+ | `GIGACHAT_CREDENTIALS` | Базовые креды для GigaChat (`b64(clientId:secretId)`) | `Y2xpZW50SWQ6c2VjcmV0SWQ=` |
86
+ | `GIGACHAT_TOKEN_PATH` | Путь к файлу кеша токена GigaChat | `/tmp/gigachat_token.json` |
87
+ | `GIGACHAT_TOKEN_FETCH_RETRIES` | Количество попыток получения токена (GigaChat) | `3` |
88
+ | `USE_GIGACHAT_ADVANCED` | Включает запрос токена GigaChat API в продвинутом режиме | `true` |
89
+ | `GIGACHAT_BASE_URL` | Базовый URL GigaChat для расширенного режима | `https://ngw.devices.sberbank.ru:9443/api/v2/oauth` |
90
+ | `TOKEN_PROVIDER_AGW_URL` | URL Agent Gateway для получения AGW-токена | `https://agent-gateway.apps.advosd.sberdevices.ru` |
91
+ | `TOKEN_PROVIDER_AGW_DEFAULT_MAX_RETRIES` | Макс. попыток запроса токена (AGW) | `3` |
92
+ | `TOKEN_PROVIDER_AGW_TIMEOUT_SEC` | Таймаут запроса к AGW (секунды) | `5` |
93
+
94
+ ---
95
+
96
+ ## 2. Модуль `agent_lab_sdk.llm.throttled`
97
+
98
+ Позволяет ограничивать число одновременных вызовов к GigaChat и сервису эмбеддингов, автоматически собирая соответствующие метрики.
99
+
100
+ ```python
101
+ from agent_lab_sdk.llm import GigaChatTokenManager
102
+ from agent_lab_sdk.llm.throttled import ThrottledGigaChat, ThrottledGigaChatEmbeddings
103
+
104
+ access_token = GigaChatTokenManager.get_token()
105
+
106
+ # Чат с учётом ограничений
107
+ chat = ThrottledGigaChat(access_token=access_token)
108
+ response = chat.invoke("Привет!")
109
+
110
+ # Эмбеддинги с учётом ограничений
111
+ emb = ThrottledGigaChatEmbeddings(access_token=access_token)
112
+ vectors = emb.embed_documents(["Text1", "Text2"])
113
+ ```
114
+
115
+ ### 2.1. Переменные окружения для ограничения
116
+
117
+ | Переменная | Описание | Значение по умолчанию |
118
+ | --------------------------------- | ------------------------------------------- | --------------------- |
119
+ | `MAX_CHAT_CONCURRENCY` | Максимум одновременных чат-запросов | `100000` |
120
+ | `MAX_EMBED_CONCURRENCY` | Максимум одновременных запросов эмбеддингов | `100000` |
121
+ | `EMBEDDINGS_MAX_BATCH_SIZE_PARTS` | Макс. размер батча частей для эмбеддингов | `90` |
122
+
123
+ ### 2.2. Метрики
124
+
125
+ Метрики доступны через `agent_lab_sdk.metrics.get_metric`:
126
+
127
+ | Метрика | Описание | Тип |
128
+ | ------------------------- | ---------------------------------------------- | --------- |
129
+ | `chat_slots_in_use` | Число занятых слотов для чата | Gauge |
130
+ | `chat_waiting_tasks` | Число задач, ожидающих освобождения слота чата | Gauge |
131
+ | `chat_wait_time_seconds` | Время ожидания слота чата (секунды) | Histogram |
132
+ | `embed_slots_in_use` | Число занятых слотов для эмбеддингов | Gauge |
133
+ | `embed_waiting_tasks` | Число задач, ожидающих слота эмбеддингов | Gauge |
134
+ | `embed_wait_time_seconds` | Время ожидания слота эмбеддингов (секунды) | Histogram |
135
+
136
+ ---
137
+
138
+ ## 3. Модуль `agent_lab_sdk.metrics`
139
+
140
+ Предоставляет удобный интерфейс для создания и управления метриками через Prometheus-клиент.
141
+
142
+ ### 3.1. Основные функции
143
+
144
+ ```python
145
+ from agent_lab_sdk.metrics import get_metric
146
+
147
+ # Создать метрику
148
+ g = get_metric(
149
+ metric_type="gauge", # тип: "gauge", "counter" или "histogram"
150
+ name="my_gauge", # имя метрики в Prometheus
151
+ documentation="Моя метрика gauge" # описание
152
+ )
153
+
154
+ # Увеличить счётчик
155
+ g.inc()
156
+
157
+ # Установить конкретное значение
158
+ g.set(42)
159
+ ```
160
+
161
+ ### 3.2. Пример использования в коде
162
+
163
+ ```python
164
+ from agent_lab_sdk.metrics import get_metric
165
+ import time
166
+
167
+ # Счётчик HTTP-запросов с метками
168
+ reqs = get_metric(
169
+ metric_type="counter",
170
+ name="http_requests_total",
171
+ documentation="Всего HTTP-запросов",
172
+ labelnames=["method", "endpoint"]
173
+ )
174
+ reqs.labels("GET", "/api").inc()
175
+
176
+ # Гистограмма задержек
177
+ lat = get_metric(
178
+ metric_type="histogram",
179
+ name="http_request_latency_seconds",
180
+ documentation="Длительность HTTP-запроса",
181
+ buckets=[0.1, 0.5, 1.0, 5.0]
182
+ )
183
+ with lat.time():
184
+ time.sleep(0.5)
185
+
186
+ print(reqs.collect())
187
+ print(lat.collect())
188
+ ```
189
+
190
+ ## 4. Хранилище
191
+
192
+ ### 4.1 SD Ассетница
193
+
194
+ функция `store_file_in_sd_asset` сохраняет base64‑файл в хранилище S3 и отдаёт публичную ссылку на файл
195
+
196
+ ```python
197
+ from agent_lab_sdk.storage import store_file_in_sd_asset
198
+
199
+ store_file_in_storage("my-agent-name-filename.png", file_b64, "giga-agents")
200
+ ```
201
+
202
+ ### 4.2 AGW Checkpointer
203
+
204
+ AGW поддерживает langgraph checkpoint API и в SDK представлен `AsyncAGWCheckpointSaver`, который позволяет сохранять состояние графа в AGW напрямую.
205
+
206
+ ## 5. Схема
207
+
208
+ ### 5.1. Типы входных данных
209
+
210
+ Модуль `agent_lab_sdk.schema.input_types` предоставляет фабричные функции для создания аннотированных типов полей, которые могут использоваться в Pydantic моделях для описания интерфейса агентов.
211
+
212
+ #### Основные типы полей
213
+
214
+ ```python
215
+ from typing import List, Annotated
216
+ from pydantic import BaseModel, Field
217
+ from agent_lab_sdk.schema import (
218
+ MainInput, StringInput, StringArrayInput, NumberInput,
219
+ SelectInput, CheckboxInput, FileInput, FilesInput, SelectOption
220
+ )
221
+
222
+ class AgentState(BaseModel):
223
+ # Основное поле ввода
224
+ query: Annotated[str, MainInput(placeholder="Введите ваш запрос")]
225
+
226
+ # Строковое поле
227
+ title: Annotated[str, StringInput(
228
+ default="Без названия",
229
+ title="Заголовок",
230
+ description="Название для вашего запроса"
231
+ )]
232
+
233
+ # Массив строк
234
+ keywords: Annotated[List[str], StringArrayInput(
235
+ placeholder="Добавьте ключевые слова...",
236
+ title="Ключевые слова",
237
+ description="Список ключевых слов для поиска",
238
+ group="Параметры"
239
+ )]
240
+
241
+ # Числовое поле
242
+ temperature: Annotated[float, NumberInput(
243
+ default=0.7,
244
+ title="Температура",
245
+ description="Параметр креативности модели (0.0 - 1.0)",
246
+ hidden=True
247
+ )]
248
+
249
+ # Выпадающий список
250
+ mode: Annotated[str, SelectInput(
251
+ title="Режим работы",
252
+ items=[
253
+ SelectOption(label="Быстрый", value="fast").model_dump(),
254
+ SelectOption(label="Точный", value="precise").model_dump()
255
+ ],
256
+ default="fast",
257
+ group="Настройки"
258
+ )]
259
+
260
+ # Чекбокс
261
+ save_history: Annotated[bool, CheckboxInput(
262
+ title="Сохранять историю",
263
+ description="Сохранять диалог для последующего анализа",
264
+ default=True,
265
+ group="Опции"
266
+ )]
267
+
268
+ # Загрузка одного файла
269
+ document: Annotated[str, FileInput(
270
+ title="Документ",
271
+ file_extensions=".pdf,.docx,.txt"
272
+ )]
273
+
274
+ # Загрузка нескольких файлов
275
+ attachments: Annotated[List[str], FilesInput(
276
+ title="Прикрепленные файлы",
277
+ file_extensions=".pdf,.csv,.xlsx",
278
+ group="Файлы"
279
+ )]
280
+ ```
281
+
282
+ #### Доступные фабричные функции
283
+
284
+ | Тип | Описание | Основные параметры |
285
+ |--------------------| ------------------------------------- | ----------------------------------------------------- |
286
+ | `MainInput` | Основное поле ввода | `placeholder` |
287
+ | `StringInput` | Текстовое поле | `default`, `title`, `description`, `hidden` |
288
+ | `StringArrayInput` | Массив строк | `placeholder`, `title`, `description`, `group`, `hidden` |
289
+ | `NumberInput` | Числовое поле | `default`, `title`, `description`, `hidden` |
290
+ | `SelectInput` | Выпадающий список | `items`, `title`, `group`, `default`, `hidden` |
291
+ | `CheckboxInput` | Чекбокс | `title`, `group`, `description`, `default`, `hidden` |
292
+ | `FileInput` | Загрузка одного файла | `title`, `file_extensions`, `group`, `hidden` |
293
+ | `FilesInput` | Загрузка нескольких файлов | `title`, `file_extensions`, `group`, `hidden` |
294
+
295
+ #### Группировка полей
296
+
297
+ Используйте параметр `group` для логической группировки полей в интерфейсе:
298
+
299
+ ```python
300
+ class TaskConfig(BaseModel):
301
+ # Группа "Основные параметры"
302
+ task_type: Annotated[str, SelectInput(
303
+ title="Тип задачи",
304
+ items=[...],
305
+ group="Основные параметры"
306
+ )]
307
+
308
+ priority: Annotated[str, SelectInput(
309
+ title="Приоритет",
310
+ items=[...],
311
+ group="Основные параметры"
312
+ )]
313
+
314
+ # Группа "Дополнительно"
315
+ notifications: Annotated[bool, CheckboxInput(
316
+ title="Уведомления",
317
+ group="Дополнительно"
318
+ )]
319
+
320
+ tags: Annotated[List[str], StringArrayInput(
321
+ placeholder="Теги...",
322
+ group="Дополнительно"
323
+ )]
324
+ ```
325
+
326
+ ### 5.2. LogMessage
327
+
328
+ TODO: описание LogMessage
329
+
330
+ ## 6. Сборка и публикация
331
+
332
+ 1. Установка twine
333
+
334
+ ```bash
335
+ pip install --upgrade build twine
336
+ ```
337
+
338
+ 2. Собрать и загрузить в pypi
339
+
340
+ перед обновлением сборки нужно не забыть поменять версию в [pyproject.toml](/pyproject.toml)
341
+ ```bash
342
+ python -m build && python -m twine upload dist/*
343
+ ```
344
+
345
+ 3. Ссылка на проект pypi
346
+
347
+ > https://pypi.org/project/agent-lab-sdk/
348
+
349
+ 4. установка локально в editable mode. Предварительно может потребоваться выбрать необходимое окружение
350
+ ```bash
351
+ pip install -e .
352
+ ```
@@ -0,0 +1,323 @@
1
+ # Agent Lab SDK
2
+
3
+ Набор утилит и обёрток для упрощённой работы с LLM, Agent Gateway и метриками в проектах Giga Labs.
4
+
5
+ ## Установка
6
+
7
+ ```bash
8
+ pip install agent_lab_sdk
9
+ ```
10
+
11
+ ## Содержание
12
+
13
+ 1. [Модуль `agent_lab_sdk.llm`](#1-модуль-agent_lab_sdkllm)
14
+ 2. [Модуль `agent_lab_sdk.llm.throttled`](#2-модуль-agent_lab_sdkllmthrottled)
15
+ 3. [Модуль `agent_lab_sdk.metrics`](#3-модуль-agent_lab_sdkmetrics)
16
+ 4. [Хранилище](#4-хранилище)
17
+ 5. [Схема](#5-схема)
18
+ 6. [Сборка и публикация](#6-сборка-и-публикация)
19
+
20
+ ---
21
+
22
+ ## 1. Модуль `agent_lab_sdk.llm`
23
+
24
+ ### 1.1. Получение модели
25
+
26
+ ```python
27
+ from agent_lab_sdk.llm import get_model
28
+
29
+ # Использует токен из окружения по умолчанию
30
+ model = get_model()
31
+
32
+ # Передача явных параметров
33
+ model = get_model(
34
+ access_token="YOUR_TOKEN",
35
+ timeout=60,
36
+ scope="GIGACHAT_API_CORP"
37
+ )
38
+ ```
39
+
40
+ > если не передавать access_token, токен будет выбран через GigaChatTokenManager
41
+
42
+ ### 1.2. Менеджеры токенов
43
+
44
+ | Класс | Описание | Пример использования |
45
+ | ---------------------- | --------------------------------------------------------------------------------------- | ----------------------------------------------- |
46
+ | `AgwTokenManager` | Кеширование + получение токена через Agent Gateway | `token = AgwTokenManager.get_token("provider")` |
47
+ | `GigaChatTokenManager` | Кеширование + получение через GigaChat OAuth с использованием пользовательских секретов | `token = GigaChatTokenManager.get_token()` |
48
+
49
+ ### 1.3. Переменные окружения
50
+
51
+ | Переменная | Описание | Значение по умолчанию / Пример |
52
+ | ---------------------------------------- | -------------------------------------------------------- | --------------------------------------------------- |
53
+ | `GIGACHAT_SCOPE` | Scope GigaChat API | `GIGACHAT_API_PERS` |
54
+ | `GLOBAL_GIGACHAT_TIMEOUT` | Таймаут запросов к GigaChat (секунды) | `120` |
55
+ | `USE_TOKEN_PROVIDER_AGW` | Использовать `AgwTokenManager` | `true` |
56
+ | `GIGACHAT_CREDENTIALS` | Базовые креды для GigaChat (`b64(clientId:secretId)`) | `Y2xpZW50SWQ6c2VjcmV0SWQ=` |
57
+ | `GIGACHAT_TOKEN_PATH` | Путь к файлу кеша токена GigaChat | `/tmp/gigachat_token.json` |
58
+ | `GIGACHAT_TOKEN_FETCH_RETRIES` | Количество попыток получения токена (GigaChat) | `3` |
59
+ | `USE_GIGACHAT_ADVANCED` | Включает запрос токена GigaChat API в продвинутом режиме | `true` |
60
+ | `GIGACHAT_BASE_URL` | Базовый URL GigaChat для расширенного режима | `https://ngw.devices.sberbank.ru:9443/api/v2/oauth` |
61
+ | `TOKEN_PROVIDER_AGW_URL` | URL Agent Gateway для получения AGW-токена | `https://agent-gateway.apps.advosd.sberdevices.ru` |
62
+ | `TOKEN_PROVIDER_AGW_DEFAULT_MAX_RETRIES` | Макс. попыток запроса токена (AGW) | `3` |
63
+ | `TOKEN_PROVIDER_AGW_TIMEOUT_SEC` | Таймаут запроса к AGW (секунды) | `5` |
64
+
65
+ ---
66
+
67
+ ## 2. Модуль `agent_lab_sdk.llm.throttled`
68
+
69
+ Позволяет ограничивать число одновременных вызовов к GigaChat и сервису эмбеддингов, автоматически собирая соответствующие метрики.
70
+
71
+ ```python
72
+ from agent_lab_sdk.llm import GigaChatTokenManager
73
+ from agent_lab_sdk.llm.throttled import ThrottledGigaChat, ThrottledGigaChatEmbeddings
74
+
75
+ access_token = GigaChatTokenManager.get_token()
76
+
77
+ # Чат с учётом ограничений
78
+ chat = ThrottledGigaChat(access_token=access_token)
79
+ response = chat.invoke("Привет!")
80
+
81
+ # Эмбеддинги с учётом ограничений
82
+ emb = ThrottledGigaChatEmbeddings(access_token=access_token)
83
+ vectors = emb.embed_documents(["Text1", "Text2"])
84
+ ```
85
+
86
+ ### 2.1. Переменные окружения для ограничения
87
+
88
+ | Переменная | Описание | Значение по умолчанию |
89
+ | --------------------------------- | ------------------------------------------- | --------------------- |
90
+ | `MAX_CHAT_CONCURRENCY` | Максимум одновременных чат-запросов | `100000` |
91
+ | `MAX_EMBED_CONCURRENCY` | Максимум одновременных запросов эмбеддингов | `100000` |
92
+ | `EMBEDDINGS_MAX_BATCH_SIZE_PARTS` | Макс. размер батча частей для эмбеддингов | `90` |
93
+
94
+ ### 2.2. Метрики
95
+
96
+ Метрики доступны через `agent_lab_sdk.metrics.get_metric`:
97
+
98
+ | Метрика | Описание | Тип |
99
+ | ------------------------- | ---------------------------------------------- | --------- |
100
+ | `chat_slots_in_use` | Число занятых слотов для чата | Gauge |
101
+ | `chat_waiting_tasks` | Число задач, ожидающих освобождения слота чата | Gauge |
102
+ | `chat_wait_time_seconds` | Время ожидания слота чата (секунды) | Histogram |
103
+ | `embed_slots_in_use` | Число занятых слотов для эмбеддингов | Gauge |
104
+ | `embed_waiting_tasks` | Число задач, ожидающих слота эмбеддингов | Gauge |
105
+ | `embed_wait_time_seconds` | Время ожидания слота эмбеддингов (секунды) | Histogram |
106
+
107
+ ---
108
+
109
+ ## 3. Модуль `agent_lab_sdk.metrics`
110
+
111
+ Предоставляет удобный интерфейс для создания и управления метриками через Prometheus-клиент.
112
+
113
+ ### 3.1. Основные функции
114
+
115
+ ```python
116
+ from agent_lab_sdk.metrics import get_metric
117
+
118
+ # Создать метрику
119
+ g = get_metric(
120
+ metric_type="gauge", # тип: "gauge", "counter" или "histogram"
121
+ name="my_gauge", # имя метрики в Prometheus
122
+ documentation="Моя метрика gauge" # описание
123
+ )
124
+
125
+ # Увеличить счётчик
126
+ g.inc()
127
+
128
+ # Установить конкретное значение
129
+ g.set(42)
130
+ ```
131
+
132
+ ### 3.2. Пример использования в коде
133
+
134
+ ```python
135
+ from agent_lab_sdk.metrics import get_metric
136
+ import time
137
+
138
+ # Счётчик HTTP-запросов с метками
139
+ reqs = get_metric(
140
+ metric_type="counter",
141
+ name="http_requests_total",
142
+ documentation="Всего HTTP-запросов",
143
+ labelnames=["method", "endpoint"]
144
+ )
145
+ reqs.labels("GET", "/api").inc()
146
+
147
+ # Гистограмма задержек
148
+ lat = get_metric(
149
+ metric_type="histogram",
150
+ name="http_request_latency_seconds",
151
+ documentation="Длительность HTTP-запроса",
152
+ buckets=[0.1, 0.5, 1.0, 5.0]
153
+ )
154
+ with lat.time():
155
+ time.sleep(0.5)
156
+
157
+ print(reqs.collect())
158
+ print(lat.collect())
159
+ ```
160
+
161
+ ## 4. Хранилище
162
+
163
+ ### 4.1 SD Ассетница
164
+
165
+ функция `store_file_in_sd_asset` сохраняет base64‑файл в хранилище S3 и отдаёт публичную ссылку на файл
166
+
167
+ ```python
168
+ from agent_lab_sdk.storage import store_file_in_sd_asset
169
+
170
+ store_file_in_storage("my-agent-name-filename.png", file_b64, "giga-agents")
171
+ ```
172
+
173
+ ### 4.2 AGW Checkpointer
174
+
175
+ AGW поддерживает langgraph checkpoint API и в SDK представлен `AsyncAGWCheckpointSaver`, который позволяет сохранять состояние графа в AGW напрямую.
176
+
177
+ ## 5. Схема
178
+
179
+ ### 5.1. Типы входных данных
180
+
181
+ Модуль `agent_lab_sdk.schema.input_types` предоставляет фабричные функции для создания аннотированных типов полей, которые могут использоваться в Pydantic моделях для описания интерфейса агентов.
182
+
183
+ #### Основные типы полей
184
+
185
+ ```python
186
+ from typing import List, Annotated
187
+ from pydantic import BaseModel, Field
188
+ from agent_lab_sdk.schema import (
189
+ MainInput, StringInput, StringArrayInput, NumberInput,
190
+ SelectInput, CheckboxInput, FileInput, FilesInput, SelectOption
191
+ )
192
+
193
+ class AgentState(BaseModel):
194
+ # Основное поле ввода
195
+ query: Annotated[str, MainInput(placeholder="Введите ваш запрос")]
196
+
197
+ # Строковое поле
198
+ title: Annotated[str, StringInput(
199
+ default="Без названия",
200
+ title="Заголовок",
201
+ description="Название для вашего запроса"
202
+ )]
203
+
204
+ # Массив строк
205
+ keywords: Annotated[List[str], StringArrayInput(
206
+ placeholder="Добавьте ключевые слова...",
207
+ title="Ключевые слова",
208
+ description="Список ключевых слов для поиска",
209
+ group="Параметры"
210
+ )]
211
+
212
+ # Числовое поле
213
+ temperature: Annotated[float, NumberInput(
214
+ default=0.7,
215
+ title="Температура",
216
+ description="Параметр креативности модели (0.0 - 1.0)",
217
+ hidden=True
218
+ )]
219
+
220
+ # Выпадающий список
221
+ mode: Annotated[str, SelectInput(
222
+ title="Режим работы",
223
+ items=[
224
+ SelectOption(label="Быстрый", value="fast").model_dump(),
225
+ SelectOption(label="Точный", value="precise").model_dump()
226
+ ],
227
+ default="fast",
228
+ group="Настройки"
229
+ )]
230
+
231
+ # Чекбокс
232
+ save_history: Annotated[bool, CheckboxInput(
233
+ title="Сохранять историю",
234
+ description="Сохранять диалог для последующего анализа",
235
+ default=True,
236
+ group="Опции"
237
+ )]
238
+
239
+ # Загрузка одного файла
240
+ document: Annotated[str, FileInput(
241
+ title="Документ",
242
+ file_extensions=".pdf,.docx,.txt"
243
+ )]
244
+
245
+ # Загрузка нескольких файлов
246
+ attachments: Annotated[List[str], FilesInput(
247
+ title="Прикрепленные файлы",
248
+ file_extensions=".pdf,.csv,.xlsx",
249
+ group="Файлы"
250
+ )]
251
+ ```
252
+
253
+ #### Доступные фабричные функции
254
+
255
+ | Тип | Описание | Основные параметры |
256
+ |--------------------| ------------------------------------- | ----------------------------------------------------- |
257
+ | `MainInput` | Основное поле ввода | `placeholder` |
258
+ | `StringInput` | Текстовое поле | `default`, `title`, `description`, `hidden` |
259
+ | `StringArrayInput` | Массив строк | `placeholder`, `title`, `description`, `group`, `hidden` |
260
+ | `NumberInput` | Числовое поле | `default`, `title`, `description`, `hidden` |
261
+ | `SelectInput` | Выпадающий список | `items`, `title`, `group`, `default`, `hidden` |
262
+ | `CheckboxInput` | Чекбокс | `title`, `group`, `description`, `default`, `hidden` |
263
+ | `FileInput` | Загрузка одного файла | `title`, `file_extensions`, `group`, `hidden` |
264
+ | `FilesInput` | Загрузка нескольких файлов | `title`, `file_extensions`, `group`, `hidden` |
265
+
266
+ #### Группировка полей
267
+
268
+ Используйте параметр `group` для логической группировки полей в интерфейсе:
269
+
270
+ ```python
271
+ class TaskConfig(BaseModel):
272
+ # Группа "Основные параметры"
273
+ task_type: Annotated[str, SelectInput(
274
+ title="Тип задачи",
275
+ items=[...],
276
+ group="Основные параметры"
277
+ )]
278
+
279
+ priority: Annotated[str, SelectInput(
280
+ title="Приоритет",
281
+ items=[...],
282
+ group="Основные параметры"
283
+ )]
284
+
285
+ # Группа "Дополнительно"
286
+ notifications: Annotated[bool, CheckboxInput(
287
+ title="Уведомления",
288
+ group="Дополнительно"
289
+ )]
290
+
291
+ tags: Annotated[List[str], StringArrayInput(
292
+ placeholder="Теги...",
293
+ group="Дополнительно"
294
+ )]
295
+ ```
296
+
297
+ ### 5.2. LogMessage
298
+
299
+ TODO: описание LogMessage
300
+
301
+ ## 6. Сборка и публикация
302
+
303
+ 1. Установка twine
304
+
305
+ ```bash
306
+ pip install --upgrade build twine
307
+ ```
308
+
309
+ 2. Собрать и загрузить в pypi
310
+
311
+ перед обновлением сборки нужно не забыть поменять версию в [pyproject.toml](/pyproject.toml)
312
+ ```bash
313
+ python -m build && python -m twine upload dist/*
314
+ ```
315
+
316
+ 3. Ссылка на проект pypi
317
+
318
+ > https://pypi.org/project/agent-lab-sdk/
319
+
320
+ 4. установка локально в editable mode. Предварительно может потребоваться выбрать необходимое окружение
321
+ ```bash
322
+ pip install -e .
323
+ ```