diff --git a/api/README.md b/api/README.md index a13bce4..4818566 100644 --- a/api/README.md +++ b/api/README.md @@ -16,22 +16,24 @@ pip install . import asyncio from agent_api import AgentApi, OM +def my_callback(message): + if isinstance(message, OM.Error): + print(f"\n[Ошибка: {message.code}] {message.details}") + elif isinstance(message, OM.Status): + print("✓ Agent status update") + async def main(): # Автоматическое управление соединением через контекстный менеджер - async with AgentApi("ws://localhost:8000") as agent: - # Отправляем сообщение - await agent.send_user_message("Привет, агент!") + async with AgentApi("ws://localhost:8000", callback=my_callback) as api: + # Отправляем сообщение и получаем итератор ответа + response = await api.send_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 + # Читаем ответ потоком чанков + async for chunk in response: + if isinstance(chunk, OM.EventTextChunk): + print(chunk.text, end="", flush=True) + + print(f"\n[Завершено, использовано токенов: {response.tokens}]") asyncio.run(main()) ``` @@ -44,7 +46,8 @@ asyncio.run(main()) - ✅ **Асинхронный клиент** на основе `aiohttp` - ✅ **Контекстный менеджер** для управления соединением -- ✅ **Асинхронный генератор** `listen()` для потокового получения сообщений +- ✅ **ResponseIterator** для асинхронной итерации по чанкам ответа +- ✅ **Callback** для обработки событий вне генерации ответа (ошибки, статусы) - ✅ **Типизированные сообщения** через Pydantic с дискриминированными объединениями - ✅ **Обработка ошибок** с кастомным исключением `AgentException` - ✅ **Логирование** на всех уровнях операций @@ -53,25 +56,31 @@ asyncio.run(main()) ### Использование ```python -from agent_api import AgentApi, AgentException, OM +from agent_api import AgentApi, OM # Использование с контекстным менеджером -async with AgentApi("ws://localhost:8000") as agent: - # Отправка сообщения - await agent.send_user_message("Your question here") +async with AgentApi("ws://localhost:8000", callback=my_callback) as api: + # Отправка сообщения и получение итератора + response = await api.send_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}") + # Итерация по чанкам ответа + async for chunk in response: + if isinstance(chunk, OM.EventTextChunk): + print(chunk.text, end="", flush=True) + + print(f"\nDone! Tokens: {response.tokens}") +``` + +Callback функция для обработки событий вне генерации: + +```python +def my_callback(message): + if isinstance(message, OM.Status): + print("Agent status update") + elif isinstance(message, OM.Error): + print(f"Agent error: {message.code} - {message.details}") + elif isinstance(message, OM.GracefulDisconnect): + print("Agent disconnecting gracefully") ``` ## Классический подход (низкоуровневый)