#5 Реализовать клиентскую часть канала общения. Отредактирована дока в соответствии с реализацией
This commit is contained in:
parent
02467a4e12
commit
e38b6a2640
1 changed files with 29 additions and 14 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue