HiAPI
Blog

Tutoriel

Comment utiliser glm-5.3 via l'API hiapi : curl, Python et une requête exécutable

Sep 17, 2026
Comment utiliser glm-5.3 via l'API hiapi : curl, Python et une requête exécutable

Ce que vous allez construire

Une intégration exécutable qui appelle glm-5.3 via l'API Chat Completions compatible OpenAI de hiapi — une seule requête renvoie un véritable résultat de complétion, et met en lumière le piège le plus fréquent avec ce modèle : ses tokens de raisonnement consomment votre budget max_tokens.

Prérequis : une clé API hiapi. Obtenez-la depuis le dashboard — c'est simplement une chaîne sk-..., et la même clé fonctionne pour tous les modèles activés sur votre compte, pas seulement celui-ci.

Chaque requête et réponse ci-dessous a été réellement exécutée contre l'API en production au moment de la rédaction de cet article.

Exemple minimal exécutable

glm-5.3 est un modèle texte sur le point de terminaison standard Chat Completions — pas le flux asynchrone /v1/tasks que hiapi utilise pour les modèles d'image/vidéo/audio. Une requête, une réponse, aucune interrogation répétée.

curl https://api.hiapi.ai/v1/chat/completions \
  -H "Authorization: Bearer sk-<your-api-key>" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "glm-5.3",
    "messages": [
      {"role": "user", "content": "Reply with exactly: OK"}
    ],
    "max_tokens": 200
  }'

Réponse (tronquée) :

{
  "id": "8be5f07603f0407c90734e8b4c2f02f0",
  "object": "chat.completion",
  "model": "glm-5.3",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "OK",
        "reasoning_content": "The user wants me to reply with exactly \"OK\" ..."
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 17,
    "completion_tokens": 35,
    "total_tokens": 52,
    "completion_tokens_details": { "reasoning_tokens": 32 }
  }
}

Le même appel en Python, avec uniquement requests :

import requests

resp = requests.post(
    "https://api.hiapi.ai/v1/chat/completions",
    headers={"Authorization": "Bearer sk-<your-api-key>"},
    json={
        "model": "glm-5.3",
        "messages": [
            {"role": "user", "content": "Reply with exactly: OK"}
        ],
        "max_tokens": 200,
    },
    timeout=60,
)
resp.raise_for_status()
data = resp.json()
print(data["choices"][0]["message"]["content"])
print(data["usage"])

Comme la structure est compatible OpenAI, ce code fonctionne aussi sans modification avec les SDK Python/JS officiels openai — il suffit de pointer base_url vers https://api.hiapi.ai/v1 et de passer votre clé hiapi.

Modes de production

Les tokens de raisonnement dévorent un budget max_tokens trop bas

glm-5.3 réfléchit toujours avant de répondre — chaque réponse porte un champ reasoning_content à côté de content, et aucun indicateur de requête ne permet de le désactiver. Ce contenu de raisonnement est décompté de max_tokens avant la réponse visible. Si vous fixez le budget trop bas, vous obtenez content: null et finish_reason: "length", car le modèle a dépensé tout son quota à réfléchir et n'est jamais arrivé à l'étape de rédaction de la réponse :

{
  "choices": [{
    "message": { "content": null, "reasoning_content": "The user has given a very simple instruction: \"" },
    "finish_reason": "length"
  }],
  "usage": { "completion_tokens": 10, "completion_tokens_details": { "reasoning_tokens": 9 } }
}

Même avec un prompt simple, laissez une marge confortable (200+ tokens est un plancher sûr), et vérifiez toujours finish_reason avant de faire confiance à content — "length" signifie que la réponse a été tronquée, voire qu'elle n'a peut-être même pas commencé.

Sortie en streaming

Définissez "stream": true et lisez les Server-Sent Events. Le contenu de raisonnement et le texte de la réponse arrivent sous forme de champs delta distincts — d'abord les blocs delta.reasoning_content, puis delta.content quand le modèle commence sa réponse réelle — et le flux se termine sur le dernier bloc avec finish_reason: "stop" :

curl https://api.hiapi.ai/v1/chat/completions \
  -H "Authorization: Bearer sk-<your-api-key>" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "glm-5.3",
    "messages": [{"role": "user", "content": "Count to 3."}],
    "max_tokens": 200,
    "stream": true
  }'
data: {"choices":[{"delta":{"role":"assistant","content":"","reasoning_content":null},"finish_reason":null}]}

data: {"choices":[{"delta":{"content":null,"reasoning_content":"The"},"finish_reason":null}]}

data: {"choices":[{"delta":{"content":"1, ","reasoning_content":null},"finish_reason":null}]}

data: {"choices":[{"delta":{"content":"2, 3.","reasoning_content":null},"finish_reason":null}]}

data: {"choices":[{"delta":{},"finish_reason":"stop"}]}

Si vous diffusez en streaming vers une UI, acheminez reasoning_content et content vers des panneaux distincts au lieu de les concaténer — ce ne sont pas les mêmes flux de texte.

Appel d'outils

L'appel de fonctions suit la structure OpenAI standard. Déclarez tools ; lorsque le modèle décide d'appeler un outil, finish_reason revient avec "tool_calls" et un tableau tool_calls rempli (il raisonne toujours d'abord, donc reasoning_content apparaît aussi) :

{
  "message": {
    "role": "assistant",
    "content": null,
    "reasoning_content": "The user wants to know the weather in Paris. I have a tool available for that. Let me call it.",
    "tool_calls": [{
      "id": "call_12e21fe488f046bc9edb4488",
      "type": "function",
      "function": { "name": "get_weather", "arguments": "{\"city\": \"Paris\"}" }
    }]
  },
  "finish_reason": "tool_calls"
}

Au tour suivant, renvoyez le message tool_calls de l'assistant ainsi qu'un message de résultat avec role: "tool", comme dans toute intégration compatible OpenAI.

Gestion des erreurs

Une clé invalide ou absente renvoie un HTTP 401 avec une structure d'erreur cohérente — vérifiez le code de statut avant d'analyser choices :

{
  "error": {
    "code": "permission_denied",
    "message": "This API key is invalid. Check that it is correct or use another API key and try again.",
    "type": "hiapi_error"
  }
}

Ressources associées

Questions fréquentes

glm-5.3 prend-il en charge le streaming ? Oui — définissez "stream": true et lisez les blocs SSE. Le contenu de raisonnement et le contenu de la réponse sont diffusés sous forme de champs delta distincts.

Pourquoi content est-il null dans ma réponse ? Presque toujours parce que le budget max_tokens est trop petit pour couvrir à la fois le raisonnement et la réponse. Vérifiez finish_reason : "length" signifie que la réponse a été tronquée avant (ou pendant) la vraie réponse. Augmentez max_tokens.

Puis-je désactiver l'étape de raisonnement ? Non, pas via un paramètre de requête — glm-5.3 raisonne avant chaque réponse, et reasoning_content est toujours rempli. Prévoyez un budget pour lui plutôt que d'essayer de le désactiver.

glm-5.3 prend-il en charge l'appel de fonctions/outils ? Oui, avec la structure standard OpenAI tools / tool_calls, vérifiée sur le point de terminaison en production.

Puis-je utiliser le SDK OpenAI officiel plutôt que du HTTP brut ? Oui. Pointez base_url du SDK vers https://api.hiapi.ai/v1 et utilisez votre clé hiapi sk-... comme clé API — aucune autre modification n'est nécessaire.

Comment glm-5.3 est-il facturé ? À la consommation de tokens, comme les autres modèles texte hiapi. Consultez la page Tarifs pour les taux actuels plutôt que de vous fier à un chiffre donné dans cet article.

Articles similaires

Voir tous les articles →

Commencez avec des artefacts IA persistants

Obtenez votre clé API et appelez des modèles d'image, de vidéo et d'audio via une API unique basée sur les tasks.

Lire la documentation de l'API