agent_api/api/README.md

209 lines
6.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 ServerMessage, 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 = ServerMessage.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