
Anthropic Python SDK: установка, настройка base_url, потоковая передача и обработка ошибок
В anthropic — официальный Python-клиент Anthropic для Claude API. Этот пакет обеспечивает аутентификацию, повторные попытки, потоковую передачу и типизированные ошибки, а также работает без изменений с любой конечной точкой, совместимой с Anthropic: задайте base_url (или ANTHROPIC_BASE_URL), и остальной код останется прежним.
Установка
pip install anthropicВерсии 1.x работают на httpx2 и требуют Python 3.10 или новее. Если вы передаёте собственный клиент HTTP, используйте предоставляемый SDK DefaultHttpxClient , чтобы сохранить его стандартные тайм-ауты и ограничения подключений.
Создание клиента
import anthropic
client = anthropic.Anthropic(
api_key="your_key", # default: ANTHROPIC_API_KEY
base_url="https://aiprimetech.io", # default: ANTHROPIC_BASE_URL, else https://api.anthropic.com
)base_url — корневой адрес хоста. SDK добавляет /v1/messages самостоятельно, поэтому https://aiprimetech.io/v1 приведёт к /v1/v1/messages и 404 page not found. Если обе переменные заданы в окружении, anthropic.Anthropic() вообще не требует аргументов:
export ANTHROPIC_API_KEY=your_key
export ANTHROPIC_BASE_URL=https://aiprimetech.ioОтправка сообщения
message = client.messages.create(
model="claude-sonnet-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Summarise TCP slow start in two sentences."}],
)
for block in message.content:
if block.type == "text":
print(block.text)
print(message.usage.input_tokens, message.usage.output_tokens)
print(message._request_id) # log this with any failure reportcontent — список блоков (текст, рассуждения, использование инструментов), поэтому проверяйте block.type вместо того, чтобы читать content[0].text без проверки.
Потоковая передача ответов
with client.messages.stream(
model="claude-sonnet-5",
max_tokens=16000,
messages=[{"role": "user", "content": "Write a short story about a lighthouse."}],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
final = stream.get_final_message()Используйте потоковую передачу для любых запросов с большим объёмом входных или выходных данных либо большим значением max_tokens: отдельный запрос без потоковой передачи должен завершиться до истечения тайм-аута, а для потока это не требуется. messages.create(..., stream=True) предоставляет итератор исходных событий, если вспомогательный метод вам не нужен.
Асинхронный клиент
import asyncio, anthropic
client = anthropic.AsyncAnthropic(base_url="https://aiprimetech.io")
limit = asyncio.Semaphore(3) # stay within your key's concurrency
async def ask(question: str) -> str:
async with limit:
msg = await client.messages.create(
model="claude-haiku-4-5",
max_tokens=512,
messages=[{"role": "user", "content": question}],
)
return next(b.text for b in msg.content if b.type == "text")
async def main():
answers = await asyncio.gather(*(ask(q) for q in ["What is DNS?", "What is BGP?"]))
print(answers)
asyncio.run(main())Семафор важен. Одновременная отправка сотен запросов с помощью asyncio.gather — самая частая причина ошибок Concurrency limit exceeded , с которыми мы сталкиваемся при работе Python-клиентов.
Тайм-ауты и повторные попытки
По умолчанию: тайм-аут 10 мин. на запрос и 2 автоматических повторных попыток с экспоненциальным увеличением задержки. SDK повторяет запросы при ошибках подключения, ответах 408, 409, 429 и 5xx. Поскольку запросы с истёкшим тайм-аутом тоже повторяются, максимальное общее время равно тайм-ауту, умноженному на число попыток.
client = anthropic.Anthropic(base_url="https://aiprimetech.io", timeout=60.0, max_retries=4)
# override for one call only
client.with_options(timeout=300.0).messages.create(
model="claude-opus-5-5",
max_tokens=4000,
messages=[{"role": "user", "content": "Review this design doc..."}],
)Обработка ошибок
| Статус | Исключение | Повторять? |
|---|---|---|
| 400 | anthropic.BadRequestError | Нет: исправьте запрос |
| 401 | anthropic.AuthenticationError | Нет: ключ неверен или отсутствует |
| 403 | anthropic.PermissionDeniedError | Нет |
| 404 | anthropic.NotFoundError | Нет: проверьте ID модели или URL |
| 429 | anthropic.RateLimitError | Да, после паузы |
| 5xx, включая 529 — перегрузка | anthropic.InternalServerError | Да |
| Сбой сети | anthropic.APIConnectionError | Да |
| Тайм-аут | anthropic.APITimeoutError | Да, либо используйте потоковую передачу |
try:
message = client.messages.create(model="claude-sonnet-5", max_tokens=1024,
messages=[{"role": "user", "content": "Hi"}])
except anthropic.NotFoundError as e:
print("Bad model ID or URL:", e.message)
except anthropic.RateLimitError as e:
print("Rate limited, retry after", e.response.headers.get("retry-after"))
except anthropic.APIStatusError as e:
print(e.status_code, e.type, e.message)
except anthropic.APIConnectionError:
print("Network problem")Сначала перехватывайте конкретные классы, а APIStatusError — в последнюю очередь; один общий except скрывает различие между ошибками, при которых стоит повторить запрос, и ошибками, требующими изменения кода. e.type возвращает строку с типом ошибки API, например rate_limit_error или overloaded_error.
ID моделей
| Идентификатор модели | Для каких задач |
|---|---|
claude-sonnet-5 | Основной выбор для программирования и работы с агентами: быстрая, мощная, со средней стоимостью. |
claude-opus-5-5 | Более сложные рассуждения, масштабный рефакторинг, длительная работа агентов. |
claude-fable-5-1 | Самая мощная и дорогая; используйте её для наиболее сложных задач. |
claude-haiku-4-5 | Недорогая и быстрая: заголовки, краткие изложения, классификация, небольшие шаги. |
client.models.list() возвращает модели, доступные через конечную точку, поэтому вы можете проверить ID перед использованием. Используйте ID точно в указанном виде: без суффиксов с датой.
Устранение неполадок при работе через шлюз
| Что вы видите | Причина | Решение |
|---|---|---|
NotFoundError на 404 page not found | /v1 в base_url | Используйте корневой адрес хоста |
AuthenticationError | Ключ не задан в окружении процесса или вставлен с пробельными символами | Выведите len(os.environ["ANTHROPIC_API_KEY"]) |
RateLimitError: Concurrency limit exceeded for user | Слишком много одновременных запросов | Объект asyncio.Semaphore , как показано выше |
APITimeoutError при длительных задачах | Запрос без потоковой передачи выполняется дольше тайм-аута | Используйте потоковую передачу или увеличьте timeout |
InternalServerError: No available accounts | Временная нехватка ресурсов у вышестоящего сервиса | Дайте SDK повторить запрос; увеличьте max_retries |
Insufficient account balance | Баланс исчерпан | Пополнить баланс |
Подробнее об ошибках на стороне модели — в руководстве по ошибкам Claude API.
Часто задаваемые вопросы
Как установить Anthropic Python SDK?
Как задать собственный базовый URL в Anthropic Python SDK?
Каковы стандартные тайм-аут и число повторных попыток?
Как использовать потоковую передачу с Python SDK?
Получите ключ API — учётная запись Anthropic и запись в лист ожидания не нужны.
Получить ключ APIAI Prime Tech — независимый API-шлюз. Он не связан с Anthropic, не одобрен этой компанией и не является её реселлером. Claude и названия связанных моделей — товарные знаки их соответствующих владельцев.