AIREITER

Миграция на Anthropic Python SDK v1.0: что сломается

Последнее обновление: 2026-08-22 00:29:33

Anthropic Python SDK v1.0 появился на PyPI 20 августа 2026 года, и большая часть кода с вызовами API переживёт обновление без изменений. Главный риск при этом почти не виден: HTTP-слой переехал с httpx на httpx2. Трейсинг, APM-агенты и тестовые моки, патчащие httpx, продолжат запускаться, но могут молча перестать видеть запросы SDK. Поэтому успешно прошедшие тесты после обновления ещё ничего не гарантируют.

Три версии за два дня — и сразу 1.0

История релизов anthropic на PyPI укладывается в пять строк: версии 0.123.0, 0.124.0 и 0.125.0 вышли 19 августа 2026 года, а уже 20 августа стандартным механизмом Trusted Publishing был опубликован 1.0.0.

По данным официальных заметок к релизу, изменилось следующее:

Заметки к релизам Anthropic Platform с записью о Python SDK v1.0 от 20 августа 2026 года
  • HTTP-слой переведён с httpx на httpx2 — поддерживаемый API-совместимый форк.
  • Теперь требуется Python 3.10 или новее; в классификаторах указаны версии с 3.10 по 3.14.
  • Удалён давно устаревший интерфейс: legacy API Text Completions, параметры temperature, top_p и top_k в методах Messages, а также клиентский compaction_control у tool runner.
  • AnthropicBedrock теперь выбрасывает ошибку, если не задан регион AWS, вместо молчаливого выбора us-east-1.

В описании тега v1.0.0 на GitHub это названо «upgrade to httpx2 and some minor breaking changes». В заметках легко пропустить ещё один эффект: с помощников parse, stream и tool_runner снято предупреждение о beta-статусе. Версия 1.0 без beta-оговорок указывает, что Anthropic считает этот API стабильным.

Что меняется из-за перехода с httpx на httpx2

Если вы создаёте клиент самым обычным способом, ничего не заметите. Но при работе с HTTP-слоем изменения затрагивают всё.

Критично, что именно передаётся в клиент. Числовые значения работают как прежде: Anthropic(timeout=30.0) ведёт себя точно так же. С объектами иначе: обычный httpx.Client, переданный через http_client=, теперь вызывает TypeError при создании клиента, а не при первом запросе. Пользовательские клиенты, таймауты и транспорты нужно строить на httpx2; объекты httpx.Timeout следует заменить на anthropic.Timeout либо httpx2.Timeout.

# 0.x
client = Anthropic(http_client=httpx.Client(proxy="http://proxy:8080"))

# 1.0
client = Anthropic(http_client=DefaultHttpxClient(proxy="http://proxy:8080"))

Имена и поведение DefaultHttpxClient и DefaultAsyncHttpxClient не изменились: они по-прежнему сохраняют рекомендуемые SDK настройки таймаутов, пулов соединений и редиректов, но теперь работают поверх httpx2. В анонсе инженера platform devx @cjav_dev отправной точкой названа официальная MIGRATION.md со всеми изменениями и примерами до и после миграции.

Это не первый подобный переход. В гайде по миграции OpenAI Python SDK на httpx2 описан практически тот же путь: тот же форк, тот же паттерн с помощником DefaultHttpx2Client и те же предупреждения о совместимости с respx. Команды, уже переведшие openai, смогут почти без изменений использовать свой прежний план.

Что удалили в v1.0

Удалено в v1.0Чем заменить
client.completions.create() (Text Completions)client.messages.create()
Константы HUMAN_PROMPT / AI_PROMPTБлоки контента в формате Messages
temperature, top_p, top_k в сигнатурах методовextra_body={"temperature": ...} для legacy-моделей, которые всё ещё их принимают
messages.parse(stream=True)messages.stream(...)
tool_runner(compaction_control=...)Серверная настройка compaction
Алиасы anthropic.Transport, anthropic.ProxiesTypesТипы транспортов из httpx2
body= в низкоуровневых методах запросовcontent=
Словарь схемы output_format в beta APIoutput_config={"format": ...} (помощники structured output по-прежнему принимают output_format=MyModel)
Проверки isinstance(stream, anthropic.Stream)Проверяйте конкретный тип MessageStream

К таблице есть две важные сноски. Pydantic v1 и v2 по-прежнему поддерживаются, так что классы моделей безопасны. А объединение заголовков теперь не чувствительно к регистру: если один заголовок задавался дважды в разном регистре, поведение изменится. Это редкий случай, но ошибки при нём не будет.

Асинхронные изменения для пользователей raw response

Асинхронных изменений немного, но они неприятны для тех, кто использует .with_raw_response. У асинхронного клиента методы parse(), read(), text() и json() теперь требуют await. У синхронного клиента .text и .content из свойств превратились в методы. Ни один вариант не ломается на этапе импорта: синхронный код явно упадёт с ошибкой атрибута, а в асинхронном легко получить незапущенную coroutine, если ничего не await-ить.

Связанный момент: объекты запросов и ответов внутри исключений и сырых результатов теперь имеют типы httpx2. Доступ к атрибутам в основном останется прежним, но проверки вида isinstance(x, httpx.Response) и аннотации типов нужно обновить. Именно такие места хорошо найдут pyright и mypy.

Самая опасная ошибка миграции — незаметная

Вот момент, которому changelog уделяет одну строку, а дашборды мониторинга не простят. Согласно гайду Anthropic по миграции, инструменты, наблюдающие за HTTP-трафиком или подменяющие его через патчинг httpx, — OpenTelemetry, Sentry, respx, pytest-httpx, vcrpy — после обновления могут продолжить работу, но молча перестать видеть запросы SDK. Они по-прежнему импортируются, запускаются и формируют отчёты; просто трафик больше не проходит через библиотеку, которую они патчат. Тесты на таких моках могут формально проходить, если не проверяют, что перехват действительно состоялся: запрос до мока не доходит — и ничего не падает.

Выход — вызвать httpx2.alias_httpx() как можно раньше при старте приложения или тестов. В документации Python SDK уточняется: до любого импорта httpx. Функция регистрирует httpx2 под именем httpx, чтобы инструменты патчинга продолжили работать. При этом гайд по миграции предостерегает от вызова в библиотечном коде: место ему только в точке входа приложения.

«Чистый запуск не доказывает, что ваши AI-вызовы всё ещё трассируются или мокируются». — @MarMarLabs, пост на следующий день после релиза

Пост стоит прочитать целиком: автор предлагает сделать проверку этой невидимой ошибки первым тестом миграции. После обновления намеренно убедитесь, что регистрируются хотя бы один трассируемый и один замоканный вызов. В той же ветке отмечены другие тихие риски: пользовательские транспорты придётся вручную перевести на httpx2, а нижняя граница Python 3.10 может сломать старые CI-образы уже на этапе установки.

Что продолжит работать без изменений

Для многих кодовых баз честный ответ прост: делать ничего не нужно. Переход HTTP-слоя вас не затронет, если вы не создаёте пользовательские клиенты, транспорты или объекты таймаутов. В частности, не меняются:

  • Вызовы client.messages.create(...) с обычными параметрами: запросы и модели ответов остаются теми же.
  • Числовые таймауты и дефолты SDK: 2 повтора с экспоненциальной задержкой при ошибках соединения, 408, 409, 429 и 5xx; стандартный таймаут — 10 минут.
  • Маршрутизация через base_url. Если SDK направлен в gateway или API-совместимый relay вроде эндпоинта Claude API от AIReiter, v1.0 не меняет этот слой: изменился клиент, а не URL.
  • Модели Pydantic v1 и v2, помощники SSE-стриминга и интерфейсы загрузки файлов.

Единственное жёсткое условие — Python 3.10+. Всё остальное из списка безопасно лишь после выполнения этого требования.

Порядок миграции, который выдержит code review

  1. Сначала осознанно зафиксируйте версию: если вы ещё не готовы, ограничение anthropic>=0.125,<1 удержит проект на текущей ветке, пока вы планируете работу.
  2. Пройдитесь по коду поиском import httpx и httpx.: каждое совпадение рядом с SDK — отдельная задача миграции.
  3. Запустите /claude-api upgrade python в Claude Code. Эту команду рекомендует @cjav_dev в анонсе релиза; она сформирует diff с изменениями для вашего проекта.
  4. Пересоберите пользовательские клиенты, транспорты и таймауты на базе httpx2 либо помощников DefaultHttpxClient.
  5. Добавьте httpx2.alias_httpx() в точку входа приложения, если какие-либо инструменты патчат httpx.
  6. Запустите pyright или mypy: изменения типов httpx2 проявятся в аннотациях и проверках isinstance.
  7. В CI проверяйте по одному трассируемому и одному замоканному запросу на тестовый набор. Зелёные логи запуска ничего не доказывают.

Anthropic Python SDK v1.0: вопросы и ответы

Anthropic Python SDK v1 уже существует или это всё ещё ветка 0.x?

Существует. Версия anthropic 1.0.0 опубликована на PyPI 20 августа 2026 года и отмечена как v1.0.0 на GitHub; за день до неё вышла 0.125.0. Страница проекта на PyPI теперь направляет пользователей 0.x к гайду по миграции на v1.

Как передавать temperature, top_p и top_k после v1.0?

Из сигнатур методов они удалены. Для legacy-моделей, которые всё ещё принимают эти параметры на стороне сервера, используйте extra_body={"temperature": 0.7}. При этом текущие модели возвращают 400 для не-дефолтных значений сэмплирования в любом случае: это изменение произошло на уровне моделей, а не SDK.

Продолжат ли работать тесты с respx, pytest-httpx или vcrpy?

Не с клиентом SDK по умолчанию — и ошибок не будет, они просто не перехватят ни одного запроса. Либо вызовите httpx2.alias_httpx() до любого импорта httpx при запуске тестов, либо перенесите моки на httpx2.MockTransport. Версия respx, патчащая только старый httpx, не сможет перехватывать трафик SDK.

Что делает /claude-api upgrade python?

Это команда Claude Code, рекомендованная в анонсе инженера Anthropic devx @cjav_dev. Она сканирует проект на anthropic 0.x и выдаёт migration diff — для импортов, объектов таймаутов и вызовов raw response. Так изменения можно проверить в ревью, а не обнаруживать по traceback.

Остаться на 0.125 или переходить на 1.0

У этого вопроса нет универсально верного ответа — вот реальный компромисс. Версия ниже 1.0 сохранит все существующие моки, трейсеры и пользовательские транспорты без изменений, но вы останетесь на SDK до стабилизации, чья политика версионирования допускает обратно несовместимые изменения в минорных релизах. При этом устаревшие возможности, от которых вы зависите, — completions и параметры сэмплирования — уже официально считаются лишним грузом. Переход на 1.0 даёт стабильный API без beta-статуса, но требует провести полноценный аудит HTTP-слоя сейчас, а не когда-нибудь потом. Решающий фактор — объём собственного кода вокруг HTTP: сервис с единственным обычным вызовом Anthropic() обновится почти без усилий, а платформе с пользовательскими транспортами и наборами тестов на respx стоит обязательно проверить тихие сбои до релиза.

По теме: Skills API вышел из beta на той же неделе, а цены Sonnet 5 стали постоянными 10 августа — оба события относятся к той же серии релизов Claude Platform.