Anthropic Python SDK 1.0: migracja ręczna lub z Claude Code
Przeniesienie projektu w języku Python z anthropic 0.x na 1.0 to jedno polecenie instalacji, pip install --upgrade "anthropic>=1,<2", a potem przejście przez stałą listę zmian łamiących zgodność: warstwa HTTP działa teraz na httpx2, asynchroniczne metody odczytu .with_raw_response stały się korutynami, zniknęły Text Completions oraz parametry temperature/top_p/top_k, a AnthropicBedrock odmawia utworzenia instancji bez podanego regionu.1 Tę listę można przejść ręcznie z oficjalnym przewodnikiem migracji albo pozwolić, by edycje wykonał Claude Code poleceniem /claude-api upgrade python, i przejrzeć diff.13 Notatka o wydaniu Claude Code nazywa je /claude-api upgrade; przewodnik migracji dodaje argument python i właśnie tę formę należy wpisać.13 Obie drogi kończą się w tym samym miejscu – poniższa strona opisuje każdą z nich, według stanu na anthropic 1.0.0 (wydanie na PyPI 20 sierpnia 2026; sprawdzono 25 sierpnia).2
{.answer-block}
TL;DR
- Aktualizacja poleceniem
pip install --upgrade "anthropic>=1,<2", a następnie uruchomieniepyrightlubmypy: przewodnik migracji zaznacza, że type checker wychwytuje niemal każdą zmianę łamiącą zgodność, co daje gotową listę kontrolną.1 - Python 3.10 to nowe minimum. Nic więcej w środowisku się nie zmienia; SDK nadal obsługuje Pydantic v1 i v2.1
httpxstał sięhttpx2. Zwykłe wartości, takie jaktimeout=30.0, działają dalej; obiektyhttpxprzekazywane do klienta muszą pochodzić zhttpx2, a biblioteki, które patchująhttpx, przestają cokolwiek widzieć, dopóki nie zostanie wywołanehttpx2.alias_httpx().1- Usunięte: Text Completions, parametry próbkowania i słowniki schematów w
output_format.client.completions.create(),temperature,top_pitop_kzniknęły; słowniki schematów przenoszą się dooutput_config={"format": {...}}.1 - Claude Code v2.1.239 (21 sierpnia 2026) dodał
/claude-api upgrade, które migruje projekty w języku Python zanthropic0.x na 1.x.3 Jego wynik należy traktować jak każdą automatyczną migrację: przed commitem trzeba przeczytać diff.
Co się psuje po aktualizacji do anthropic 1.0?
Sześć zmian niesie największy ciężar; skracam szybki przegląd z przewodnika do tych sześciu, a mniejsze usunięcia omawiam dalej.1 Największa z nich ma prosty powód: warstwa HTTP SDK przeszła z httpx, który nie jest już aktywnie utrzymywany, na httpx2, zgodny w API fork utrzymywany przez zespół Pydantic, z tymi samymi klasami, tym samym zachowaniem i dołączonymi poprawkami bezpieczeństwa.1
| Zmiana | Jak się objawia | Poprawka |
|---|---|---|
| Porzucono Python 3.9 | Brak wsparcia poniżej 3.10 | Aktualizacja do wersji Python 3.10 lub nowszej |
httpx zastąpiony przez httpx2 |
TypeError przy tworzeniu klienta po przekazaniu starego httpx.Client; instrumentacja przestaje widzieć ruch |
import httpx2 as httpx; wywołanie httpx2.alias_httpx() dla śledzenia i mocków |
.with_raw_response zwraca APIResponse |
Asynchroniczne parse() / text() / json() / read() wymagają await; .text i .content stały się metodami |
await response.parse() / await response.text() w wersji async; response.text() / response.read() w wersji sync |
| Usunięto Text Completions | client.completions.create(), HUMAN_PROMPT, AI_PROMPT już nie istnieją |
Przejście na client.messages.create() |
| Usunięto wycofane parametry | temperature, top_p, top_k zgłaszają TypeError; słowniki schematów w output_format również |
Usunięcie ich (lub extra_body dla starszych modeli); output_config={"format": {...}} |
| Wymagany region Bedrock | AnthropicBedrock() zgłasza ValueError bez regionu |
Przekazanie aws_region= lub ustawienie AWS_REGION |
Razem z nimi idą mniejsze usunięcia i jedna zmiana zachowania, każde z zamiennikiem:1
| Usunięte lub zmienione | Zamiennik |
|---|---|
messages.parse(stream=True) (które nigdy nie działało) |
messages.stream(..., output_format=Order), a następnie stream.get_final_message().parsed_output |
tool_runner(compaction_control=...) |
Kompaktowanie po stronie serwera: betas=["compact-2026-01-12"] plus słownik context_management |
Surowe bytes jako body= w client.get/post/put/patch/delete |
content=b"..." oraz cast_to=httpx2.Response w tym samym wywołaniu |
isinstance(x, Stream) dla strumieni wiadomości |
from anthropic.lib.streaming import MessageStream; isinstance(x, MessageStream) |
Wartości nagłówków typu bytes |
Należy je zdekodować przez .decode(); wartości nagłówków muszą być typu str |
BetaBase64PDFBlockParam |
BetaRequestDocumentBlockParam |
anthropic.Transport / ProxiesTypes |
httpx2.BaseTransport / httpx2.Proxy / httpx2.AsyncBaseTransport |
agent_toolset.READ_MAX_BYTES |
DEFAULT_MAX_FILE_BYTES |
| Dwie pisownie jednej nazwy nagłówka wysyłane jako dwa nagłówki | Późniejszy wpis zastępuje wcześniejszy, także nagłówki ustawiane przez sam SDK; jeśli potrzebne są obie wartości, trzeba je połączyć samodzielnie |
Ostatni wiersz gryzie po cichu: default_headers={"USER-AGENT": "my-app/1.0"} zastępuje teraz własny User-Agent SDK zamiast wysyłać oba nagłówki.1
Jak przeprowadzić migrację ręcznie?
Trzy kroki w ustalonej kolejności: aktualizacja, wskazanie uszkodzeń przez type checker, a potem poprawki kategoria po kategorii.
pip install --upgrade "anthropic>=1,<2"
pyright # or mypy
Najpierw importy httpx, bo to one zawodzą najgłośniej. Własne reeksporty SDK (anthropic.Timeout, anthropic.DefaultHttpxClient, anthropic.DefaultAsyncHttpxClient, anthropic.DefaultAioHttpClient) wskazują już na httpx2 i działają dalej; aliasu potrzebują tylko obiekty budowane bezpośrednio z httpx.1
# Before
import httpx
from anthropic import Anthropic, DefaultHttpxClient
client = Anthropic(
timeout=httpx.Timeout(60.0, connect=5.0),
http_client=DefaultHttpxClient(
proxy="http://my.proxy.example",
transport=httpx.HTTPTransport(local_address="0.0.0.0"),
),
)
# After
import httpx2 as httpx # or `import httpx2` and rename the references
from anthropic import Anthropic, DefaultHttpxClient
client = Anthropic(
timeout=httpx.Timeout(60.0, connect=5.0),
http_client=DefaultHttpxClient(
proxy="http://my.proxy.example",
transport=httpx.HTTPTransport(local_address="0.0.0.0"),
),
)
Jeśli inny kod w aplikacji nadal importuje httpx i współdzieli z SDK klientów lub typy wyjątków, albo jeśli w użyciu jest HTTPXClientInstrumentor z OpenTelemetry, integracja httpx w Sentry, respx, pytest-httpx lub vcrpy, należy raz wywołać httpx2.alias_httpx() na samym początku punktu wejścia. Wywołanie musi nastąpić, zanim cokolwiek zaimportuje httpx (w przeciwnym razie zgłasza RuntimeError), a przewodnik rezerwuje je dla aplikacji: biblioteka nigdy nie powinna wywoływać go w imieniu swoich użytkowników.1 W środowisku pytest najmniej inwazyjną opcją z przewodnika jest wczesny plugin, czyli moduł tests/_alias_httpx.py, który wywołuje httpx2.alias_httpx(), zarejestrowany w pyproject.toml tak, by ładował się przed respx, pytest-httpx i modułami testowymi:1
# tests/_alias_httpx.py
import httpx2
httpx2.alias_httpx() # makes `import httpx` / `import httpcore` resolve to httpx2 / httpcore2
# pyproject.toml
[tool.pytest.ini_options]
addopts = "-p tests._alias_httpx"
pythonpath = ["."]
Obiekty odpowiedzi i błędów są teraz typami httpx2. Zmiana pakietu dotyczy tego, co SDK zwraca, nie tylko tego, co się do niego przekazuje. APIStatusError.response, APIConnectionError.request, response.http_response / .headers / .url w surowych odpowiedziach oraz argument response=, który otrzymują własne event hooki http_client, to wszystko obiekty httpx2. Mają dokładnie te same atrybuty co wcześniej, więc na httpx2 muszą przejść tylko sprawdzenia isinstance i adnotacje typów, które wymieniają httpx.Response / httpx.Request / httpx.Headers.1 Przypadek isinstance zasługuje na drugie spojrzenie. Przewodnik mówi jedynie, że takie sprawdzenia muszą się zmienić;1 istotne są dlatego, że dopóki httpx2.alias_httpx() nie sprawi, by httpx wskazywał na httpx2, sprawdzenie w rodzaju isinstance(err.response, httpx.Response) wobec starego pakietu zwraca False bez żadnego wyjątku, a handler pomija swoją gałąź.
# Before
def log_failure(err: anthropic.APIStatusError) -> None:
response: httpx.Response = err.response
print(response.status_code, response.headers.get("request-id"))
# After
def log_failure(err: anthropic.APIStatusError) -> None:
response: httpx2.Response = err.response
print(response.status_code, response.headers.get("request-id"))
Następnie metody odczytu surowych odpowiedzi. .with_raw_response zwracał dotąd LegacyAPIResponse dla obu klientów; teraz zwraca te same klasy APIResponse / AsyncAPIResponse, których .with_streaming_response używał już wcześniej.1
LegacyAPIResponse (przed) |
APIResponse (sync, po) |
AsyncAPIResponse (async, po) |
|---|---|---|
response.parse() |
response.parse() |
await response.parse() |
response.text |
response.text() |
await response.text() |
response.content |
response.read() |
await response.read() |
response.http_response.json() |
response.json() |
await response.json() |
.headers, .status_code, .url, .request_id |
bez zmian | bez zmian |
Potem usunięte parametry. Aktualne modele nie używają temperature, top_p ani top_k, więc generowane metody już ich nie przyjmują. Model sprzed tej zmiany nadal je honoruje przez extra_body, które SDK scala z JSON-em żądania bez żadnych modyfikacji.1
# Before
client.messages.create(..., model="claude-sonnet-4-6", temperature=0.2)
# After
client.messages.create(..., model="claude-sonnet-4-6", extra_body={"temperature": 0.2})
Słowniki schematów przenoszą się tą samą drogą: output_format={"type": "json_schema", "schema": ...} w beta.messages.create() staje się output_config={"format": {"type": "json_schema", "schema": ...}}; pomocnicze parse() / stream() / count_tokens() / tool_runner() zachowują output_format=Order dla klasy, a słownik schematu w tym miejscu zgłasza teraz TypeError.1
Na koniec Bedrock. AnthropicBedrock i AsyncAnthropicBedrock logowały dotąd ostrzeżenie i wracały do us-east-1; teraz zgłaszają ValueError przy tworzeniu instancji. Region jest ustalany z aws_region=, następnie z AWS_REGION / AWS_DEFAULT_REGION, a potem z sesji boto3 dla podanego aws_profile.1 SDK pomija też teraz nieznane zdarzenia strumieniowania Bedrock, które wcześniej zwracał; jedyny znany przypadek to amazon-bedrock-invocationMetrics.1
Jak przeprowadzić migrację z Claude Code?
Skrót wskazuje sam przewodnik migracji: uruchomić /claude-api upgrade python w projekcie i przejrzeć diff.1 Polecenie pojawiło się w Claude Code v2.1.239, wydanym 21 sierpnia 2026; notatka o wydaniu brzmi w całości: „Added /claude-api upgrade to migrate Python projects from anthropic 0.x to 1.x, and updated the skill’s Python reference for 1.x (timeouts use anthropic.Timeout, not httpx.Timeout)” (dodano /claude-api upgrade do migracji projektów w języku Python z anthropic 0.x na 1.x oraz zaktualizowano referencję skilla dla 1.x).3
To zdanie to cała zweryfikowana powierzchnia: polecenie skilla /claude-api, które migruje użycie 0.x w projekcie na 1.x. Nie znalazłem dalszej dokumentacji tego, jak dobiera swoje edycje, więc należy traktować je dokładnie tak: jako automatyczną migrację, której diff się przegląda. Wystarczy zaktualizować do v2.1.239 lub nowszej (claude update albo instrukcja instalacji i aktualizacji), otworzyć sesję w katalogu głównym projektu i uruchomić:
/claude-api upgrade python
Potem trzeba przeczytać diff fragment po fragmencie, uruchomić type checker i zestaw testów – tę samą recenzję, jaką dostałby PR z migracją od zewnętrznego współtwórcy. Krok ze sprawdzaniem typów ma tu większe znaczenie niż zwykle, bo niemal każde uszkodzenie w 1.0 to błąd typu, a to sprawdzenie nie dba o to, kto wykonał edycje.1 Jedyny szczegół, który wyróżnia notatka o wydaniu, czyli anthropic.Timeout zamiast httpx.Timeout, zgadza się z przewodnikiem: ten reeksport wskazuje już na httpx2.13
| Ręcznie | /claude-api upgrade python |
|
|---|---|---|
| Wymaga | Przewodnika migracji, pyright lub mypy |
Claude Code v2.1.239 lub nowszego |
| Kto wykonuje edycje | Programista | Claude Code, w drzewie roboczym projektu |
| Krok recenzji | Type checker plus testy | Przegląd diffa, potem type checker plus testy |
| Moja rekomendacja | Mała powierzchnia albo rozbudowana własna konfiguracja httpx |
Wiele miejsc wywołań z mechanicznymi zmianami |
Pierwszy kontakt z Claude Code? Szybki start opisuje pierwszą sesję, a pełny przewodnik omawia dołączone skille i polecenia slash.
FAQ
Czy anthropic 1.0 nadal obsługuje Pydantic v1?
Tak. SDK nadal obsługuje Pydantic v1 i v2; minimum Python 3.10 to jedyna zmiana w środowisku.1
Dlaczego moja konfiguracja OpenTelemetry lub respx przestaje widzieć żądania SDK po aktualizacji?
Te biblioteki patchują httpx, którego SDK już nie używa. Należy wywołać httpx2.alias_httpx(), zanim cokolwiek zaimportuje httpx; import httpx wskazuje wtedy na httpx2 w całym procesie.1
Czy nadal można przekazać temperature do starszego modelu?
Tak, przez extra_body={"temperature": 0.2}, które SDK scala z JSON-em żądania. W messages.batches.create() klucz należy umieścić bezpośrednio w słowniku params żądania.1
Co zastąpiło kompaktowanie po stronie klienta w tool_runner?
Kompaktowanie po stronie serwera: do tool_runner() przekazuje się betas=["compact-2026-01-12"] i context_management={"edits": [{"type": "compact_20260112", "trigger": {"type": "input_tokens", "value": 100_000}}]}. W przykładzie z przewodnika ta para zastępuje compaction_control={"enabled": True, "context_token_threshold": 100_000}; próg wyzwalacza musi wynosić co najmniej 50 000 tokenów.1
Czy trzeba usunąć httpx_aiohttp z listy wymagań?
Tak. anthropic[aiohttp] i http_client=DefaultAioHttpClient() działają jak dawniej, ale to extra nie instaluje już httpx_aiohttp, bo pakiet jest teraz dostarczany wewnątrz SDK.1
Najważniejsze wnioski
Dla twórców aplikacji:
- Przypiąć "anthropic>=1,<2", uruchomić type checker i poprawiać według kategorii w tej kolejności: importy httpx, await w surowych odpowiedziach, usunięte parametry, region Bedrock.1
- Umieścić httpx2.alias_httpx() w pierwszych liniach punktu wejścia, jeśli cokolwiek innego w procesie współdzieli obiekty httpx z SDK lub instrumentuje httpx.1
Dla opiekunów bibliotek:
- Nigdy nie wywoływać httpx2.alias_httpx() wewnątrz biblioteki; zamiast tego aliasować import (import httpx2 as httpx).1
- Porzucić anthropic.Transport / ProxiesTypes na rzecz httpx2.BaseTransport / httpx2.Proxy.1
Dla zespołów korzystających z Claude Code:
- Zaktualizować do v2.1.239 lub nowszej i uruchomić /claude-api upgrade python z katalogu głównego projektu; przejrzeć diff, a przed commitem uruchomić type checker i testy.13
Źródła
-
Anthropic, „Migrating to v1”, MIGRATION.md w anthropic-sdk-python: polecenie aktualizacji, minimum Python 3.10,
httpx2, klasy.with_raw_response, usunięte API i parametry, zmiany w Bedrock oraz wskazówka/claude-api upgrade python. Zweryfikowano 2026-08-25. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
PyPI,
anthropic: wersja 1.0.0 wydana 20 sierpnia 2026; nadal najnowsze wydanie według stanu na 2026-08-25. ↩ -
Anthropic, notatka o wydaniu Claude Code v2.1.239, 21 sierpnia 2026: „Added
/claude-api upgradeto migrate Python projects fromanthropic0.x to 1.x, and updated the skill’s Python reference for 1.x (timeouts useanthropic.Timeout, nothttpx.Timeout)”. ↩↩↩↩↩↩