# Lambda Agent API WebSocket API SDK для взаимодействия с AI-агентом. ## Установка ```bash pip install . ``` Требуется Python 3.14+. ## Быстрый старт (с использованием AgentApi) ```python import asyncio from agent_api import AgentApi, OM async def main(): # Автоматическое управление соединением через контекстный менеджер async with AgentApi("ws://localhost:8000") as agent: # Отправляем сообщение await agent.send_user_message("Привет, агент!") # Читаем ответ потоком событий async for message in agent.listen(): if isinstance(message, OM.EventTextChunk): print(message.text, end="", flush=True) elif isinstance(message, OM.EventEnd): print(f"\n[Завершено, использовано токенов: {message.tokens_used}]") break elif isinstance(message, OM.Error): print(f"\n[Ошибка: {message.code}] {message.details}") break asyncio.run(main()) ``` ## AgentApi - Асинхронный Python клиент Новая библиотека `AgentApi` предоставляет типизированный асинхронный клиент для WebSocket взаимодействия с агентом. ### Характеристики - ✅ **Асинхронный клиент** на основе `aiohttp` - ✅ **Контекстный менеджер** для управления соединением - ✅ **Асинхронный генератор** `listen()` для потокового получения сообщений - ✅ **Типизированные сообщения** через Pydantic с дискриминированными объединениями - ✅ **Обработка ошибок** с кастомным исключением `AgentException` - ✅ **Логирование** на всех уровнях операций - ✅ **Полная документация** всех методов ### Использование ```python from agent_api import AgentApi, AgentException, OM # Использование с контекстным менеджером async with AgentApi("ws://localhost:8000") as agent: # Отправка сообщения await agent.send_user_message("Your question here") # Получение потока ответов try: async for message in agent.listen(): if isinstance(message, OM.Status): print("✓ Agent is ready") elif isinstance(message, OM.EventTextChunk): print(message.text, end="", flush=True) elif isinstance(message, OM.EventEnd): print(f"\nDone! Tokens: {message.tokens_used}") break except AgentException as e: print(f"Agent error ({e.code}): {e.details}") ``` ## Классический подход (низкоуровневый) ```python import asyncio import websockets from models import OutgoingMessage, OM async def main(): uri = "ws://localhost:8000/ws" async with websockets.connect(uri) as ws: # 1. Ждём STATUS - подтверждение готовности status = await ws.recv() print(f"Connected: {status}") # 2. Отправляем сообщение await ws.send('{"type": "USER_MESSAGE", "text": "Привет!"}') # 3. Читаем ответ в виде потока событий while True: msg = await ws.recv() data = OutgoingMessage.model_validate_json(msg) match data: case OM.AgentEvent(subtype=OM.AgentEventType.TEXT_CHUNK): print(data.text, end="", flush=True) case OM.EventEnd(): print(f"\n[Завершено, использовано токенов: {data.tokens_used}]") break case OM.Error(): print(f"\n[Ошибка: {data.code}] {data.details}") break asyncio.run(main()) ``` ## Протокол ### Клиент → Сервер #### USER_MESSAGE Полное сообщение от пользователя. ```json { "type": "USER_MESSAGE", "text": "Текст сообщения" } ``` | Поле | Тип | Описание | |------|-------|-------------------| | type | string | Всегда `USER_MESSAGE` | | text | string | Текст сообщения | ### Сервер → Клиент #### STATUS Отправляется сервером при открытии соединения с клиентом. Будет дополнен информацией о готовности агента принимать сообщения. ```json { "type": "STATUS" } ``` #### AGENT_EVENT Базовый класс для ивентов, которые стримит агент во время генерации ответа. Конкретный класс для ивента определяется по `subtype`. ##### TEXT_CHUNK Чанк текста ответа агента. ```json { "type": "AGENT_EVENT", "subtype": "TEXT_CHUNK", "text": "Фрагмент текста" } ``` ##### END Агент закончил генерацию ответа. ```json { "type": "AGENT_EVENT", "subtype": "END", "tokens_used": 42 } ``` | Поле | Тип | Описание | |-------------|--------|-----------------------| | tokens_used | int | Количество использованных токенов | #### ERROR Неопределенная ошибка в работе агента. ```json { "type": "ERROR", "code": "error_code", "details": "Описание ошибки" } ``` | Поле | Тип | Описание | |---------|-------|----------------| | code | string | Код ошибки | | details | string | Подробности | #### GRACEFUL_DISCONNECT Отправляется перед завершением работы контейнера с агентом. Например, при долгом бездействии. Нужно, чтобы отделять обрыв соединения из-за ошибки с необходимостью повторного подключения. Приход этого сообщения означает, что агент осознанно завершает работу с клиентом по какой-то причине. Для дальнейшего взаимодействия нужно снова обратиться к мастеру. ```json { "type": "GRACEFUL_DISCONNECT" } ``` ![Схема взаимодействия](docs/schema.png) ## Зависимости - Python 3.14+ - pydantic >= 2.12.5