agent_api/README.md

253 lines
9.7 KiB
Markdown
Raw Permalink 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-агентом.
## Release Notes
# v1.1
- **CRITICAL**: `AgentAPI` вместо `url` принимает `base_url` и сам дописывает нужный эндпоинт.
Раньше: `AgentAPI(url="ws://localhost:8000/agent_ws/")`. Сейчас: `AgentAPI(base_url="ws://localhost:8000/")`
- Добавлен параметр `chat_id` в конструктор `AgentAPI`. Нужен для разделения истории сообщений по чатам/веткам.
- `AgentAPI.connect()` вызывает `AgentBusyException`, если выбранный чат уже занят другим API клиентом.
- Добавлен новый тип события `MsgEventSendFile` для отправки файлов пользователю. Поле `path` — путь к файлу относительно `/workspace`.
- `send_message(text, attachments)` теперь принимает `attachments` — список путей к файлам относительно `/workspace`.
## Установка
В `master` всегда будет актуальная рабочая версия.
```bash
pip install git+https://git.lambda.coredump.ru/platform/agent_api.git
```
Требуется Python 3.14+.
## Быстрый старт (с использованием AgentApi)
**Рабочий REPL пример: [tests/manual.py](tests/manual.py).**
## Предполагаемое управление подключениями
```python
from lambda_agent_api.agent_api import AgentApi
connected_agents: dict[str, AgentApi] = {}
# агент автоматически выключится после нескольких минут бездействия
# этот колбек вызовется при разрыве соединения
def on_agent_disconnect(agent: AgentApi):
del connected_agents[agent.id]
async def on_telegram_message(from_user: int, text: str):
agent_id = get_agent_id_by_user(user_id)
agent = connected_agents.get(agent_id, None)
if not agent:
agent = AgentApi(agent_id, get_agent_url(agent_id), on_disconnect=on_agent_disconnect)
await agent.connect()
connected_agents[agent_id] = agent
async for event in agent.send_message(text):
...
```
# Обработка ошибок
- `AgentBusyException` возникает, если отправить `send_message` пока предыдущий запрос ещё в процессе.
- `AgentException` возникает, если агент возвращает `ERROR` или есть проблемы с подключением.
- `on_disconnect` callback вызывается один раз при закрытии/разрыве соединения.
## Протокол
### Клиент → Сервер
#### USER_MESSAGE
Полное сообщение от пользователя.
```json
{
"type": "USER_MESSAGE",
"text": "Текст сообщения"
}
```
| Поле | Тип | Описание |
|------|-------|-------------------|
| type | string | Всегда `USER_MESSAGE` |
| text | string | Текст сообщения |
### Сервер → Клиент
#### STATUS
Отправляется сервером при открытии соединения с клиентом. Будет дополнен информацией о готовности агента принимать сообщения.
```json
{
"type": "STATUS"
}
```
#### AGENT_EVENT_TEXT_CHUNK
Чанк текста ответа агента.
```json
{
"type": "AGENT_EVENT_TEXT_CHUNK",
"text": "Фрагмент текста",
"source": "main"
}
```
| Поле | Тип | Описание |
|--------|--------|-----------------------------------------------|
| type | string | Всегда `AGENT_EVENT_TEXT_CHUNK` |
| text | string | Фрагмент текста ответа агента |
| source | string | Источник события (по умолчанию "main") |
#### AGENT_EVENT_TOOL_CALL_CHUNK
Агент решил использовать инструмент и генерирует аргументы.
```json
{
"type": "AGENT_EVENT_TOOL_CALL_CHUNK",
"tool_name": "имя_инструмента",
"args_chunk": "{\"key\": \"value\"}",
"source": "main"
}
```
| Поле | Тип | Описание |
|-------------|---------|-----------------------------------------------|
| type | string | Всегда `AGENT_EVENT_TOOL_CALL_CHUNK` |
| tool_name | string | Имя инструмента (может быть null в первом чанке) |
| args_chunk | string | Кусок JSON-аргументов (может быть null) |
| source | string | Источник события (по умолчанию "main") |
#### AGENT_EVENT_TOOL_RESULT
Инструмент отработал и вернул результат.
```json
{
"type": "AGENT_EVENT_TOOL_RESULT",
"tool_name": "имя_инструмента",
"result": "результат выполнения",
"source": "main"
}
```
| Поле | Тип | Описание |
|------------|--------|-----------------------------------------------|
| type | string | Всегда `AGENT_EVENT_TOOL_RESULT` |
| tool_name | string | Имя инструмента |
| result | any | Результат выполнения (строка, объект или массив) |
| source | string | Источник события (по умолчанию "main") |
#### AGENT_EVENT_CUSTOM_UPDATE
Кастомный прогресс (например, скачивание файла) изнутри инструмента.
```json
{
"type": "AGENT_EVENT_CUSTOM_UPDATE",
"payload": {"status": "in_progress", "progress": 50},
"source": "main"
}
```
| Поле | Тип | Описание |
|----------|-----------------|-----------------------------------------------|
| type | string | Всегда `AGENT_EVENT_CUSTOM_UPDATE` |
| payload | object | Любые данные о прогрессе |
| source | string | Источник события (по умолчанию "main") |
#### AGENT_EVENT_SEND_FILE
Агент отправляет файл пользователю. Путь к файлу относительно `/workspace`.
```json
{
"type": "AGENT_EVENT_SEND_FILE",
"path": "reports/2024/report.pdf"
}
```
| Поле | Тип | Описание |
|--------|--------|-----------------------------------------------|
| type | string | Всегда `AGENT_EVENT_SEND_FILE` |
| path | string | Путь к файлу относительно `/workspace` |
#### AGENT_EVENT_END
Агент закончил генерацию ответа.
```json
{
"type": "AGENT_EVENT_END",
"tokens_used": 42
}
```
| Поле | Тип | Описание |
|-------------|--------|-----------------------------------------------|
| type | string | Всегда `AGENT_EVENT_END` |
| tokens_used | int | Количество использованных токенов |
#### ERROR
Неопределенная ошибка в работе агента.
```json
{
"type": "ERROR",
"code": "error_code",
"details": "Описание ошибки"
}
```
| Поле | Тип | Описание |
|---------|-------|----------------|
| code | string | Код ошибки |
| details | string | Подробности |
#### GRACEFUL_DISCONNECT
Отправляется перед завершением работы контейнера с агентом. Например, при долгом бездействии. Нужно, чтобы отделять обрыв соединения из-за ошибки с необходимостью повторного подключения. Приход этого сообщения означает, что агент осознанно завершает работу с клиентом по какой-то причине. Для дальнейшего взаимодействия нужно снова обратиться к мастеру.
```json
{
"type": "GRACEFUL_DISCONNECT"
}
```
Неопределенная ошибка в работе агента.
```json
{
"type": "ERROR",
"code": "error_code",
"details": "Описание ошибки"
}
```
| Поле | Тип | Описание |
|---------|-------|----------------|
| code | string | Код ошибки |
| details | string | Подробности |
#### GRACEFUL_DISCONNECT
Отправляется перед завершением работы контейнера с агентом. Например, при долгом бездействии. Нужно, чтобы отделять обрыв соединения из-за ошибки с необходимостью повторного подключения. Приход этого сообщения означает, что агент осознанно завершает работу с клиентом по какой-то причине. Для дальнейшего взаимодействия нужно снова обратиться к мастеру.
```json
{
"type": "GRACEFUL_DISCONNECT"
}
```
![Схема взаимодействия](docs/schema.png)