Format Anthropic
CloudZIR expose une seconde surface au format Anthropic Messages. Le
SDK anthropic, Claude Code et tous les outils écrits pour ce format fonctionnent
sans modification : seule l'URL de base change.
Configuration#
| Paramètre | Valeur |
|---|---|
| URL de base | https://api.cloudzir.com/anthropic |
| Endpoint | POST /v1/messages |
| Authentification | x-api-key: zir_ai_… ou Authorization: Bearer zir_ai_… |
# pip install anthropic
import anthropic
client = anthropic.Anthropic(
api_key="zir_ai_...",
base_url="https://api.cloudzir.com/anthropic",
)
message = client.messages.create(
model="mina-full",
max_tokens=1024,
system="Tu es un assistant utile, en français.",
messages=[{"role": "user", "content": "Explique la différence entre TCP et UDP."}],
)
print(message.content[0].text)
print(message.usage.input_tokens, message.usage.output_tokens)// npm install @anthropic-ai/sdk
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
apiKey: process.env.CLOUDZIR_API_KEY,
baseURL: "https://api.cloudzir.com/anthropic",
});
const message = await client.messages.create({
model: "mina-full",
max_tokens: 1024,
system: "Tu es un assistant utile, en français.",
messages: [{ role: "user", content: "Explique la différence entre TCP et UDP." }],
});
console.log(message.content[0].text);curl https://api.cloudzir.com/anthropic/v1/messages \
-H "x-api-key: $CLOUDZIR_API_KEY" \
-H "content-type: application/json" \
-d '{
"model": "mina-full",
"max_tokens": 1024,
"system": "Tu es un assistant utile, en français.",
"messages": [{"role": "user", "content": "Explique la différence entre TCP et UDP."}]
}'Modèles Mina disponibles#
Choisissez un identifiant Mina : mina-flash, mina-low
ou mina-full. La liste des modèles activés pour votre clé est renvoyée par
GET /anthropic/v1/models.
Champs supportés#
| Champ | État | Détail |
|---|---|---|
model | Supporté | Obligatoire ; identifiant Mina listé par GET /anthropic/v1/models. |
max_tokens | Supporté | Obligatoire (comme chez Anthropic). Borné par la sortie max du modèle. |
messages | Supporté | Blocs text, tool_use, tool_result. |
system | Supporté | Chaîne ou liste de blocs text. |
temperature, top_p | Supportés | - |
stop_sequences | Supporté | 4 séquences maximum. |
stream | Supporté | Événements SSE complets (voir plus bas). |
tools, tool_choice | Supportés | auto, any, tool, none. |
metadata.user_id | Supporté | Isolement des limites de débit. |
thinking | Supporté | Active/désactive le raisonnement ; budget_tokens traduit en niveau d'effort (détail). |
cache_control | Accepté, sans effet | La mise en cache est automatique. |
top_k, anthropic-version, mcp_servers, container | Ignorés | Sans effet, sans erreur. |
Blocs image | Supportés | Source base64 ou url (Vision). |
Blocs thinking | Supportés | Renvoyés dans la réponse ; acceptés en entrée (tour précédent). |
Blocs document | Refusés | 400 explicite : extrayez le texte ou envoyez une image. |
Outils#
message = client.messages.create(
model="mina-full",
max_tokens=1024,
tools=[{
"name": "stock_produit",
"description": "Stock disponible d'un produit.",
"input_schema": {
"type": "object",
"properties": {"reference": {"type": "string"}},
"required": ["reference"],
},
}],
messages=[{"role": "user", "content": "Reste-t-il des DEMO-001 ?"}],
)
if message.stop_reason == "tool_use":
bloc = next(b for b in message.content if b.type == "tool_use")
resultat = stock_produit(**bloc.input)
suite = client.messages.create(
model="mina-full",
max_tokens=1024,
messages=[
{"role": "user", "content": "Reste-t-il des DEMO-001 ?"},
{"role": "assistant", "content": message.content},
{"role": "user", "content": [{
"type": "tool_result",
"tool_use_id": bloc.id,
"content": str(resultat),
}]},
],
)
Streaming#
La séquence d'événements suit la spécification Anthropic :
event: message_start → enveloppe du message (id, modèle, usage initial)
event: content_block_start → début d'un bloc (text ou tool_use)
event: content_block_delta → text_delta / input_json_delta
event: content_block_stop → fin du bloc
event: message_delta → stop_reason + usage.output_tokens
event: message_stop → fin
event: ping → maintien de connexion pendant l'attente
with client.messages.stream(
model="mina-low",
max_tokens=512,
messages=[{"role": "user", "content": "Compte de 1 à 10."}],
) as flux:
for texte in flux.text_stream:
print(texte, end="", flush=True)
Erreurs#
Le format d'erreur est celui d'Anthropic :
{"type": "error", "error": {"type": "rate_limit_error", "message": "Limite de débit atteinte…"}}
Correspondance complète : Codes d'erreur. Les types
renvoyés sont invalid_request_error, authentication_error,
permission_error, not_found_error, rate_limit_error,
api_error, overloaded_error.
Quelle surface choisir ?#
| Situation | Surface |
|---|---|
| Nouveau projet | /v1 (OpenAI) : l'écosystème est plus large. |
| Code existant écrit pour Claude | /anthropic : zéro réécriture. |
| Claude Code, agents Anthropic | /anthropic. |
Les deux surfaces partagent la même clé, le même portefeuille, les mêmes tarifs et les mêmes limites.