Le SDK Anthropic en direct : streaming, caching, structured output
Le choix : pas de framework entre l'app et le modĂšle
Le projet appelle Claude via AsyncAnthropic directement. Les quatre techniques ci-dessous expliquent pourquoi : chacune exige un contrÎle fin que les abstractions génériques rendent laborieux.
1. Le streaming d'événements
async with client.messages.stream(model="claude-sonnet-4-6", messages=..., tools=...) as stream:
async for event in stream:
... # content_block_start / text_delta / input_json_delta / content_block_stop
Le SDK Ă©met des Ă©vĂ©nements typĂ©s : du texte (text_delta), mais aussi les arguments d'un tool call en cours de gĂ©nĂ©ration (input_json_delta). Le projet les traduit en Ă©vĂ©nements internes provider-agnostiques, poussĂ©s en SSE (module 2) â l'UI voit l'agent « penser » en direct.
2. Le prompt caching : diviser la facture
Le system prompt du copilot (instructions + définitions de tools) fait des milliers de tokens identiques à chaque tour. Le cache d'Anthropic les fait payer une fois :
system = [{"type": "text", "text": LONG_SYSTEM, "cache_control": {"type": "ephemeral"}}]
DeuxiĂšme breakpoint posĂ© sur le dernier message de l'historique : le prĂ©fixe de conversation (tours prĂ©cĂ©dents) est lui aussi servi du cache Ă chaque nouveau tour. Sur un agent multi-tours, c'est le levier de coĂ»t/latence n°1 â et une raison majeure du SDK natif : le placement des breakpoints est chirurgical.
3. Le structured output via tool_use
Pour l'extraction, on ne « prie » pas pour du JSON valide : on force un tool dont le schéma EST le format de sortie :
tools=[{"name": "emit_order", "input_schema": EXTRACTION_OUTPUT_SCHEMA}],
tool_choice={"type": "tool", "name": "emit_order"}
Le modĂšle est contraint de produire un input conforme au JSON Schema â qu'on valide ensuite avec Pydantic (double rideau, module 1). C'est la technique la plus fiable pour obtenir du structurĂ©.
4. Le budget de sortie et la troncature
max_tokens est configurĂ© par tenant, et le cas stop_reason == "max_tokens" est gĂ©rĂ© explicitement : une rĂ©ponse tronquĂ©e en plein tool call est jetĂ©e proprement (un tool_use partiel rĂ©-injectĂ© rend l'agent incohĂ©rent). DĂ©tail de prod devenu ADR â le genre de cas qu'un framework masque jusqu'Ă l'incident.
Le prompt caching d'Anthropic est le plus rentable surâŠ