diff --git a/api/README.md b/api/README.md index 4818566..4796b1d 100644 --- a/api/README.md +++ b/api/README.md @@ -21,19 +21,25 @@ def my_callback(message): print(f"\n[Ошибка: {message.code}] {message.details}") elif isinstance(message, OM.Status): print("✓ Agent status update") + elif isinstance(message, OM.GracefulDisconnect): + print("✓ Agent gracefully requested disconnect") async def main(): - # Автоматическое управление соединением через контекстный менеджер - async with AgentApi("ws://localhost:8000", callback=my_callback) as api: - # Отправляем сообщение и получаем итератор ответа + api = AgentApi("agent-1", "ws://localhost:8000/ws", callback=my_callback) + + await api.connect() + try: response = await api.send_message("Привет, агент!") - # Читаем ответ потоком чанков async for chunk in response: if isinstance(chunk, OM.EventTextChunk): print(chunk.text, end="", flush=True) - - print(f"\n[Завершено, использовано токенов: {response.tokens}]") + + # После окончания Generation возможно получить EventEnd в очереди и сохранить tokens + # (в current implementation: `response` - генератор, для токенов смотрите `EventEnd` в callback) + + finally: + await api.close() asyncio.run(main()) ``` @@ -45,9 +51,10 @@ asyncio.run(main()) ### Характеристики - ✅ **Асинхронный клиент** на основе `aiohttp` -- ✅ **Контекстный менеджер** для управления соединением +- ✅ **Явное подключение/закрытие** через `connect()`/`close()` +- ✅ **Защита от параллельных запросов** через `AgentBusyException` - ✅ **ResponseIterator** для асинхронной итерации по чанкам ответа -- ✅ **Callback** для обработки событий вне генерации ответа (ошибки, статусы) +- ✅ **Callback** для обработки событий вне генерации ответа (`Status`, `Error`, `GracefulDisconnect`) - ✅ **Типизированные сообщения** через Pydantic с дискриминированными объединениями - ✅ **Обработка ошибок** с кастомным исключением `AgentException` - ✅ **Логирование** на всех уровнях операций @@ -58,19 +65,27 @@ asyncio.run(main()) ```python from agent_api import AgentApi, OM -# Использование с контекстным менеджером -async with AgentApi("ws://localhost:8000", callback=my_callback) as api: - # Отправка сообщения и получение итератора +api = AgentApi("agent-1", "ws://localhost:8000/ws", callback=my_callback) + +await api.connect() +try: response = await api.send_message("Your question here") - # Итерация по чанкам ответа async for chunk in response: if isinstance(chunk, OM.EventTextChunk): print(chunk.text, end="", flush=True) - - print(f"\nDone! Tokens: {response.tokens}") + + print("\nDone!") +finally: + await api.close() ``` +# Обработка ошибок + +- `AgentBusyException` возникает, если отправить `send_message` пока предыдущий запрос ещё в процессе. +- `AgentException` возникает, если агент возвращает `ERROR` или есть проблемы с подключением. +- `on_disconnect` callback вызывается один раз при закрытии/разрыве соединения. + Callback функция для обработки событий вне генерации: ```python