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ètreValeur
URL de basehttps://api.cloudzir.com/anthropic
EndpointPOST /v1/messages
Authentificationx-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)

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ÉtatDétail
modelSupportéObligatoire ; identifiant Mina listé par GET /anthropic/v1/models.
max_tokensSupportéObligatoire (comme chez Anthropic). Borné par la sortie max du modèle.
messagesSupportéBlocs text, tool_use, tool_result.
systemSupportéChaîne ou liste de blocs text.
temperature, top_pSupportés-
stop_sequencesSupporté4 séquences maximum.
streamSupportéÉvénements SSE complets (voir plus bas).
tools, tool_choiceSupportésauto, any, tool, none.
metadata.user_idSupportéIsolement des limites de débit.
thinkingSupportéActive/désactive le raisonnement ; budget_tokens traduit en niveau d'effort (détail).
cache_controlAccepté, sans effetLa mise en cache est automatique.
top_k, anthropic-version, mcp_servers, containerIgnorésSans effet, sans erreur.
Blocs imageSupportésSource base64 ou url (Vision).
Blocs thinkingSupportésRenvoyés dans la réponse ; acceptés en entrée (tour précédent).
Blocs documentRefusés400 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 ?#

SituationSurface
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.

Paramètres

Réponse API