Fase 1: intercambio de SDK — el diff de código real
Ambos SDKs ahora aceptan la misma forma de array `messages: [{role, content}]`. Las diferencias: nombre del método, estructura de respuesta, y cómo se pasan los prompts del sistema. Aquí está el diff canónico para una conclusión simple.
```python # OpenAI (antes) 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 (despué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 ```
Tres diferencias. **El prompt del sistema es su propio campo** en Claude (`system=`), no un mensaje en el array. **`max_tokens` es requerido** en Claude (OpenAI tiene un valor por defecto). **Forma de respuesta** es `resp.content[0].text` (un array de bloques de contenido) en lugar de `resp.choices[0].message.content`.
El streaming funciona de la misma manera conceptualmente — ambos exponen gestores de contexto `with client.<x>.stream(...)`. Los eventos de Anthropic están más estructurados (`content_block_start`, `content_block_delta`, `content_block_stop`) donde el stream de OpenAI es una secuencia plana de chunks de conclusión. La mayoría del código de producción simplemente itera el stream y concatena `delta.text` (Claude) o `delta.content` (OpenAI) — ambos funcionan.