📝 LLM и AI

AsyncAnthropic: асинхронный клиент Claude API

P
Автор
Pyland
📅
Опубликовано
30.06.2026
⏱️
Время чтения
1 мин
👁️
Просмотров
96
🌳
Уровень
Продвинутый
🐦 💼 ✈️

AsyncAnthropic — асинхронная версия Anthropic клиента. Использует async/await и интегрируется с asyncio event loop.

Отличия от синхронного клиента

# Синхронный (блокирует поток)
import anthropic
client = anthropic.Anthropic()
response = client.messages.create(...)

# Асинхронный (не блокирует)
import anthropic
client = anthropic.AsyncAnthropic()
response = await client.messages.create(...)

API идентичен — только добавляется await.

Базовое использование

import asyncio
import anthropic
from environs import Env

env = Env()
env.read_env()

client = anthropic.AsyncAnthropic(api_key=env.str("ANTHROPIC_API_KEY"))

async def chat(message: str) -> str:
    response = await client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=1024,
        messages=[{"role": "user", "content": message}]
    )
    return response.content[0].text

async def main():
    answer = await chat("Объясни async/await за 3 предложения")
    print(answer)

asyncio.run(main())

Асинхронный стриминг

async def stream_chat(message: str) -> str:
    chunks = []
    async with client.messages.stream(
        model="claude-sonnet-4-6",
        max_tokens=1024,
        messages=[{"role": "user", "content": message}],
    ) as stream:
        async for text in stream.text_stream:
            print(text, end="", flush=True)
            chunks.append(text)
        final = await stream.get_final_message()
    print()
    return "".join(chunks)

asyncio.gather() — параллельные запросы

async def analyze_batch(texts: list[str]) -> list[str]:
    """Отправляет все запросы параллельно."""
    async def analyze_one(text: str) -> str:
        response = await client.messages.create(
            model="claude-sonnet-4-6",
            max_tokens=256,
            messages=[{"role": "user", "content": f"Тональность: {text}. Одним словом."}]
        )
        return response.content[0].text.strip()

    return await asyncio.gather(*[analyze_one(t) for t in texts])

async def main():
    texts = ["Отличный продукт!", "Ужасный сервис", "Нормально, ничего особенного"]
    results = await analyze_batch(texts)
    for text, sentiment in zip(texts, results):
        print(f"{sentiment}: {text}")

asyncio.run(main())

Обработка ошибок

async def safe_chat(message: str) -> str | None:
    try:
        response = await client.messages.create(
            model="claude-sonnet-4-6",
            max_tokens=512,
            messages=[{"role": "user", "content": message}]
        )
        return response.content[0].text
    except anthropic.RateLimitError:
        await asyncio.sleep(5)
        return await safe_chat(message)  # retry
    except anthropic.APIError as e:
        print(f"Ошибка API: {e}")
        return None

Ваша реакция на статью

💬 Комментарии (0)

🔐 Войдите в систему, чтобы оставить комментарий
🚪 Войти
💭

Комментариев пока нет

Станьте первым, кто поделится мнением об этой статье!

🔗 Похожие

Похожие статьи

Продолжите изучение с этими материалами

📝

Event loop в Python: как asyncio делает «параллел…

Event loop — сердце asyncio. Он не запускает код параллельно в нескольких потоках. Он переключается...

📅 30.06.2026 👁️ 122
📝

run_in_executor и anyio: sync-библиотеки в async …

Иногда нужно вызвать синхронную библиотеку из async кода не блокируя event loop.

📅 30.06.2026 👁️ 99
📝

Async context managers: async with и @asynccontex…

Async context managers управляют ресурсами в async коде — соединениями, файлами, транзакциями.

📅 30.06.2026 👁️ 108

Понравилась статья?

Подпишитесь на наши обновления и получайте новые статьи первыми. Развивайтесь вместе с PyLand!