Phase 1 : échange SDK — le vrai diff code
Les deux SDK acceptent maintenant la même forme de tableau `messages: [{role, content}]`. Les différences : nom de méthode, structure réponse, et comment les prompts système sont passés. Voici le diff canonique pour une simple completion.
```python # OpenAI (avant) from openai import OpenAI client = OpenAI() resp = client.chat.completions.create( model="gpt-5.5", messages=[ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "Summarize: ..."} ], max_tokens=500, ) answer = resp.choices[0].message.content ```
```python # Anthropic (après) import anthropic client = anthropic.Anthropic() resp = client.messages.create( model="claude-sonnet-4-6", max_tokens=500, system="You are a helpful assistant.", messages=[ {"role": "user", "content": "Summarize: ..."} ], ) answer = resp.content[0].text ```
Trois différences. **Le prompt système est son propre champ** chez Claude (`system=`), pas un message dans le tableau. **`max_tokens` est requis** chez Claude (OpenAI par défaut au max du modèle). **La forme réponse** est `resp.content[0].text` (un tableau de blocs contenu) au lieu de `resp.choices[0].message.content`.
Le streaming fonctionne de la même façon conceptuellement — les deux exposent les context managers `with client.<x>.stream(...)`. Les événements d'Anthropic sont plus structurés (`content_block_start`, `content_block_delta`, `content_block_stop`) où le stream OpenAI est une séquence plate de chunks completion. La plupart du code production itère simplement le stream et concatène `delta.text` (Claude) ou `delta.content` (OpenAI) — les deux fonctionnent.