Anthropic Python SDK 1.0 : migration manuelle ou Claude Code
Faire passer un projet Python d’anthropic 0.x à 1.0 tient en une commande d’installation, pip install --upgrade "anthropic>=1,<2", suivie d’un passage sur une liste fixe de changements incompatibles : la couche HTTP tourne désormais sur httpx2, les lecteurs asynchrones de .with_raw_response sont devenus des coroutines, les Text Completions et les paramètres temperature/top_p/top_k ont disparu, et AnthropicBedrock refuse de se construire sans région.1 Parcourez cette liste à la main avec le guide de migration officiel, ou laissez Claude Code faire les modifications avec /claude-api upgrade python et relisez le diff.13 La note de version de Claude Code l’appelle /claude-api upgrade ; le guide de migration ajoute l’argument python, et c’est cette forme qu’il faut taper.13 Les deux routes mènent au même endroit – la page ci-dessous couvre chacune d’elles, à jour pour anthropic 1.0.0 (publié sur PyPI le 20 août 2026 ; vérifié le 25 août).2
{.answer-block}
TL;DR
- Mettez à jour avec
pip install --upgrade "anthropic>=1,<2", puis lancezpyrightoumypy: le guide de migration précise qu’un vérificateur de types signale presque tous les changements incompatibles, ce qui en fait une liste de contrôle toute prête.1 - Python 3.10 est le nouveau plancher. Rien d’autre ne change dans votre environnement ; le SDK prend toujours en charge Pydantic v1 et v2.1
httpxest devenuhttpx2. Les valeurs simples commetimeout=30.0continuent de fonctionner ; les objetshttpxque vous passez au client doivent venir dehttpx2, et les bibliothèques qui patchenthttpxrestent aveugles tant que vous n’appelez pashttpx2.alias_httpx().1- Supprimés : les Text Completions, les paramètres d’échantillonnage et les dictionnaires de schéma dans
output_format.client.completions.create(),temperature,top_pettop_kont disparu ; les dictionnaires de schéma passent dansoutput_config={"format": {...}}.1 - Claude Code v2.1.239 (21 août 2026) a ajouté
/claude-api upgradepour migrer les projets Python d’anthropic0.x vers 1.x.3 Traitez sa sortie comme n’importe quelle migration automatisée : lisez le diff avant de le committer.
Qu’est-ce qui casse quand je passe à anthropic 1.0 ?
Six changements portent l’essentiel du poids ; je condense la référence rapide du guide à ces six-là, et les suppressions plus petites suivent.1 Le plus gros a une raison simple : la couche HTTP du SDK est passée de httpx, qui n’est plus activement maintenu, à httpx2, un fork compatible au niveau de l’API et maintenu par l’équipe Pydantic, avec les mêmes classes, le même comportement et les correctifs de sécurité inclus.1
| Changement | Comment il se manifeste | Correctif |
|---|---|---|
| Python 3.9 abandonné | Non pris en charge sous 3.10 | Passez à Python 3.10 ou plus récent |
httpx remplacé par httpx2 |
TypeError à la construction quand vous passez un ancien httpx.Client ; l’instrumentation devient aveugle |
import httpx2 as httpx ; appelez httpx2.alias_httpx() pour le traçage et les mocks |
.with_raw_response renvoie APIResponse |
Les parse() / text() / json() / read() asynchrones exigent await ; .text et .content sont devenus des méthodes |
await response.parse() / await response.text() en async ; response.text() / response.read() en sync |
| Text Completions supprimées | client.completions.create(), HUMAN_PROMPT, AI_PROMPT n’existent plus |
Passez à client.messages.create() |
| Paramètres dépréciés supprimés | temperature, top_p, top_k lèvent TypeError ; les dictionnaires de schéma dans output_format aussi |
Retirez-les (ou extra_body pour les modèles plus anciens) ; output_config={"format": {...}} |
| Région Bedrock obligatoire | AnthropicBedrock() lève ValueError sans région |
Passez aws_region= ou définissez AWS_REGION |
Des suppressions plus petites et un changement de comportement les accompagnent, chacun avec un remplaçant :1
| Supprimé ou modifié | À utiliser à la place |
|---|---|
messages.parse(stream=True) (qui n’a jamais fonctionné) |
messages.stream(..., output_format=Order), puis stream.get_final_message().parsed_output |
tool_runner(compaction_control=...) |
Compaction côté serveur : betas=["compact-2026-01-12"] plus un dictionnaire context_management |
bytes bruts en body= sur client.get/post/put/patch/delete |
content=b"...", et cast_to=httpx2.Response dans le même appel |
isinstance(x, Stream) pour les flux de messages |
from anthropic.lib.streaming import MessageStream ; isinstance(x, MessageStream) |
Valeurs d’en-tête en bytes |
Appliquez-leur .decode() ; les valeurs d’en-tête doivent être des str |
BetaBase64PDFBlockParam |
BetaRequestDocumentBlockParam |
anthropic.Transport / ProxiesTypes |
httpx2.BaseTransport / httpx2.Proxy / httpx2.AsyncBaseTransport |
agent_toolset.READ_MAX_BYTES |
DEFAULT_MAX_FILE_BYTES |
| Deux casses d’un même nom d’en-tête envoyées comme deux en-têtes | La dernière entrée remplace la précédente, y compris pour les en-têtes que le SDK définit lui-même ; concaténez les valeurs vous-même s’il vous faut les deux |
La dernière ligne mord en silence : default_headers={"USER-AGENT": "my-app/1.0"} remplace désormais le User-Agent du SDK au lieu d’envoyer les deux.1
Comment migrer à la main ?
Trois étapes, dans l’ordre : mettre à jour, laisser le vérificateur de types trouver ce qui casse, puis corriger par catégorie.
pip install --upgrade "anthropic>=1,<2"
pyright # or mypy
Corrigez d’abord les imports httpx, parce que ce sont eux qui échouent le plus bruyamment. Les ré-exports du SDK lui-même (anthropic.Timeout, anthropic.DefaultHttpxClient, anthropic.DefaultAsyncHttpxClient, anthropic.DefaultAioHttpClient) pointent déjà vers httpx2 et continuent de fonctionner ; seuls les objets que vous construisez directement depuis httpx ont besoin de l’alias.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"),
),
)
Si d’autres parties de l’application importent encore httpx et partagent des clients ou des types d’exception avec le SDK, ou si vous utilisez HTTPXClientInstrumentor d’OpenTelemetry, l’intégration httpx de Sentry, respx, pytest-httpx ou vcrpy, appelez httpx2.alias_httpx() une seule fois en tête de votre point d’entrée. L’appel doit s’exécuter avant que quoi que ce soit n’importe httpx (il lève RuntimeError sinon), et le guide le réserve aux applications : une bibliothèque ne doit jamais l’appeler au nom de ses utilisateurs.1 Sous pytest, l’option la moins intrusive du guide est un plugin précoce, un module tests/_alias_httpx.py qui appelle httpx2.alias_httpx(), enregistré dans pyproject.toml pour qu’il se charge avant respx, pytest-httpx et vos modules de test :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 = ["."]
Les objets de réponse et d’erreur sont désormais des types httpx2. Le changement de paquet s’applique à ce que le SDK renvoie, pas seulement à ce que vous lui passez. APIStatusError.response, APIConnectionError.request, response.http_response / .headers / .url sur les réponses brutes, et l’argument response= que reçoivent vos hooks d’événement personnalisés de http_client sont tous des objets httpx2. Ils portent exactement les mêmes attributs qu’avant, donc seuls les tests isinstance et les annotations de type qui nomment httpx.Response / httpx.Request / httpx.Headers doivent basculer vers httpx2.1 Le cas isinstance mérite un second regard. Le guide dit seulement que ces tests doivent basculer ;1 la raison pour laquelle ils comptent, c’est qu’à moins que httpx2.alias_httpx() n’ait fait résoudre httpx vers httpx2, un test comme isinstance(err.response, httpx.Response) contre l’ancien paquet renvoie False sans rien lever, et le gestionnaire saute sa branche.
# 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"))
Ensuite, les lecteurs de réponse brute. .with_raw_response renvoyait LegacyAPIResponse pour les deux clients ; il renvoie maintenant les mêmes classes APIResponse / AsyncAPIResponse que .with_streaming_response utilisait déjà.1
LegacyAPIResponse (avant) |
APIResponse (sync, après) |
AsyncAPIResponse (async, après) |
|---|---|---|
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 |
inchangés | inchangés |
Ensuite, les paramètres supprimés. Les modèles actuels n’utilisent pas temperature, top_p ni top_k, donc les méthodes générées ne les acceptent plus. Un modèle antérieur au changement les honore toujours via extra_body, que le SDK fusionne tel quel dans le JSON de la requête.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})
Les dictionnaires de schéma se déplacent de la même façon : output_format={"type": "json_schema", "schema": ...} sur beta.messages.create() devient output_config={"format": {"type": "json_schema", "schema": ...}} ; les helpers parse() / stream() / count_tokens() / tool_runner() gardent output_format=Order pour une classe, et un dictionnaire de schéma à cet endroit lève désormais TypeError.1
Terminez par Bedrock. AnthropicBedrock et AsyncAnthropicBedrock journalisaient un avertissement et se rabattaient sur us-east-1 ; ils lèvent maintenant ValueError à la construction. La région se résout depuis aws_region=, puis AWS_REGION / AWS_DEFAULT_REGION, puis la session boto3 du aws_profile indiqué.1 Le SDK ignore aussi désormais les événements de streaming Bedrock inconnus qu’il produisait auparavant ; le seul cas connu est amazon-bedrock-invocationMetrics.1
Comment migrer avec Claude Code ?
Le guide de migration nomme lui-même le raccourci : lancez /claude-api upgrade python dans votre projet et relisez le diff.1 Claude Code v2.1.239, publié le 21 août 2026, est la version où la commande est arrivée ; la note de version dit, en entier, « 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) » (ajout de /claude-api upgrade pour migrer les projets Python d’anthropic 0.x vers 1.x, et mise à jour de la référence Python du skill pour 1.x).3
Cette phrase est toute la surface vérifiée : une commande du skill /claude-api qui migre l’usage 0.x d’un projet vers 1.x. Je n’ai trouvé aucune autre documentation sur la façon dont elle choisit ses modifications, alors traitez-la exactement comme cela : une migration automatisée dont vous relisez le diff. Passez à la v2.1.239 ou plus récente (claude update, ou la référence d’installation et de mise à jour), ouvrez une session à la racine du projet et lancez-la :
/claude-api upgrade python
Relisez ensuite le diff bloc par bloc, lancez le vérificateur de types, puis la suite de tests – la même relecture que vous accorderiez à la PR de migration d’un contributeur. L’étape du vérificateur de types compte plus que d’habitude ici, parce que presque tout ce qui casse en 1.0 est une erreur de type, et que cette vérification se moque de qui a fait les modifications.1 Le seul détail que la note de version signale, anthropic.Timeout plutôt que httpx.Timeout, concorde avec le guide : ce ré-export pointe déjà vers httpx2.13
| À la main | /claude-api upgrade python |
|
|---|---|---|
| Nécessite | Le guide de migration, pyright ou mypy |
Claude Code v2.1.239 ou plus récent |
| Qui fait les modifications | Vous | Claude Code, dans votre arbre de travail |
| Étape de relecture | Vérificateur de types plus tests | Relecture du diff, puis vérificateur de types plus tests |
| Ma recommandation | Petite surface, ou câblage httpx personnalisé lourd |
Beaucoup de sites d’appel avec des changements mécaniques |
Nouveau sur Claude Code ? Le guide de démarrage rapide couvre la première session, et le guide complet couvre les skills intégrés et les commandes slash.
FAQ
anthropic 1.0 prend-il toujours en charge Pydantic v1 ?
Oui. Le SDK prend toujours en charge Pydantic v1 et v2 ; le minimum Python 3.10 est le seul changement d’environnement.1
Pourquoi ma configuration OpenTelemetry ou respx ne voit-elle plus les requêtes du SDK après la mise à jour ?
Ces bibliothèques patchent httpx, que le SDK n’utilise plus. Appelez httpx2.alias_httpx() avant que quoi que ce soit n’importe httpx ; import httpx se résout alors vers httpx2 pour tout le processus.1
Puis-je encore passer temperature à un modèle plus ancien ?
Oui, via extra_body={"temperature": 0.2}, que le SDK fusionne dans le JSON de la requête. Pour messages.batches.create(), mettez la clé directement dans le dictionnaire params de la requête.1
Qu’est-ce qui a remplacé la compaction côté client dans tool_runner ?
La compaction côté serveur : passez betas=["compact-2026-01-12"] et context_management={"edits": [{"type": "compact_20260112", "trigger": {"type": "input_tokens", "value": 100_000}}]} à tool_runner(). Dans l’exemple du guide, cette paire remplace compaction_control={"enabled": True, "context_token_threshold": 100_000} ; le seuil de déclenchement doit être d’au moins 50 000 tokens.1
Dois-je retirer httpx_aiohttp de mes requirements ?
Oui. anthropic[aiohttp] et http_client=DefaultAioHttpClient() fonctionnent comme avant, mais l’extra n’installe plus httpx_aiohttp, parce qu’il est désormais livré dans le SDK.1
Points clés à retenir
Pour les développeurs d’applications :
- Épinglez "anthropic>=1,<2", lancez le vérificateur de types et corrigez par catégorie, dans cet ordre : imports httpx, await sur les réponses brutes, paramètres supprimés, région Bedrock.1
- Placez httpx2.alias_httpx() dans les premières lignes du point d’entrée si quoi que ce soit d’autre dans le processus partage des objets httpx avec le SDK ou instrumente httpx.1
Pour les mainteneurs de bibliothèques :
- N’appelez jamais httpx2.alias_httpx() à l’intérieur d’une bibliothèque ; aliasez plutôt l’import (import httpx2 as httpx).1
- Abandonnez anthropic.Transport / ProxiesTypes au profit de httpx2.BaseTransport / httpx2.Proxy.1
Pour les équipes qui utilisent Claude Code :
- Passez à la v2.1.239 ou plus récente et lancez /claude-api upgrade python depuis la racine du projet ; relisez le diff, puis lancez le vérificateur de types et les tests avant de committer.13
Références
-
Anthropic, « Migrating to v1 », MIGRATION.md d’anthropic-sdk-python : commande de mise à jour, plancher Python 3.10,
httpx2, classes de.with_raw_response, API et paramètres supprimés, changements Bedrock, et le renvoi vers/claude-api upgrade python. Vérifié le 25 août 2026. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
PyPI,
anthropic: 1.0.0 publié le 20 août 2026 ; toujours la dernière version au 25 août 2026. ↩ -
Anthropic, notes de version de Claude Code v2.1.239, 21 août 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) ». ↩↩↩↩↩↩