#5 Реализовать клиентскую часть канала общения. Отредактирована дока в соответствии с реализацией

This commit is contained in:
Ярослав Малинин 2026-04-01 10:31:30 +03:00
parent 02467a4e12
commit e38b6a2640

View file

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