Phase 1: SDK-Swap — der echte Code-Diff
Beide SDKs akzeptieren jetzt die gleiche `messages: [{role, content}]` Array-Form. Die Unterschiede: Methodenname, Response-Struktur und wie System-Prompts übergeben werden. Hier ist der kanonische Diff für eine einfache Completion.
```python # OpenAI (vorher) 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 (nachher) 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 ```
Drei Unterschiede. **System-Prompt ist ein eigenes Feld** bei Claude (`system=`), nicht eine Message im Array. **`max_tokens` ist erforderlich** bei Claude (OpenAI defaultet auf Model-Max). **Response-Form** ist `resp.content[0].text` (ein Array von Content-Blöcken) statt `resp.choices[0].message.content`.
Streaming funktioniert konzeptionell auf die gleiche Weise — beide bieten `with client.<x>.stream(...)` Context-Manager. Anthropics Events sind stärker strukturiert (`content_block_start`, `content_block_delta`, `content_block_stop`), wo OpenAIs Stream eine flache Sequenz von Completion-Chunks ist. Die meisten Production-Codes iterieren einfach über den Stream und verketteten `delta.text` (Claude) oder `delta.content` (OpenAI) — beide funktionieren.