Исправлен ридми в соответствии с изменениями в agent_api

This commit is contained in:
Ярослав Малинин 2026-03-30 10:30:28 +03:00
parent f0986b6fd6
commit c7a9d3446d

View file

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