HiAPI
Blog

Tutoriale

Come usare glm-5.3 tramite l'API hiapi: curl, Python e una richiesta eseguibile

Sep 17, 2026
Come usare glm-5.3 tramite l'API hiapi: curl, Python e una richiesta eseguibile

Cosa costruirai

Un'integrazione funzionante che chiama glm-5.3 tramite l'API Chat Completions compatibile con OpenAI di hiapi: una singola richiesta restituisce un completamento reale, e spiega la difficoltà più comune che si incontra effettivamente usando questo modello: i suoi token di ragionamento consumano il tuo budget di max_tokens.

Prerequisiti: una chiave API hiapi. Ottienila dalla dashboard: è semplicemente una stringa sk-..., e la stessa chiave funziona per tutti i modelli abilitati nel tuo account, non solo per questo modello.

Ogni richiesta e risposta riportata di seguito è stata ottenuta eseguendo realmente l'API in produzione al momento della stesura di questo articolo.

Esempio minimo eseguibile

glm-5.3 è un modello testuale sull'endpoint standard Chat Completions, non il flusso asincrono /v1/tasks che hiapi usa per i modelli di immagini/video/audio. Una richiesta, una risposta, nessun polling.

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
  }'

Risposta (troncata):

{
  "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 }
  }
}

La stessa chiamata in Python, usando solo 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"])

Poiché la struttura è compatibile con OpenAI, questo codice funziona senza modifiche anche con gli SDK Python/JS ufficiali openai: basta puntare base_url a https://api.hiapi.ai/v1 e passare la tua chiave hiapi.

Modelli per la produzione

I token di ragionamento consumano un budget max_tokens troppo basso

glm-5.3 pensa sempre prima di rispondere: ogni risposta include il campo reasoning_content accanto a content, e non esiste un flag di richiesta per disattivarlo. Quel contenuto di ragionamento viene conteggiato in max_tokens prima della risposta visibile. Se imposti il budget troppo basso, otterrai content: null e finish_reason: "length", perché il modello ha speso l'intera quota nel ragionamento e non è mai arrivato a scrivere la risposta:

{
  "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 } }
}

Anche con prompt semplici, lascia un margine sufficiente (200+ token è una soglia minima sicura) e controlla sempre finish_reason prima di fidarti di content: "length" significa che la risposta è stata troncata, o che potrebbe non essere nemmeno iniziata.

Output in streaming

Imposta "stream": true e leggi gli Server-Sent Events. Il contenuto di ragionamento e il testo della risposta arrivano come campi delta separati: prima i blocchi delta.reasoning_content, poi, quando il modello inizia la risposta effettiva, delta.content; lo stream termina sull'ultimo blocco con 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"}]}

Se fai streaming verso una UI, indirizza reasoning_content e content su pannelli diversi invece di concatenarli: non sono lo stesso flusso di testo.

Chiamata di strumenti

La chiamata di funzioni segue la struttura standard di OpenAI. Dichiara tools, e quando il modello decide di chiamare uno strumento, finish_reason viene restituito come "tool_calls" con un array tool_calls popolato (ragiona comunque prima, quindi apparirà anche reasoning_content):

{
  "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"
}

Nel turno successivo, riproduci il messaggio tool_calls dell'assistente e un messaggio di risultato con role: "tool", come in qualsiasi integrazione compatibile con OpenAI.

Gestione degli errori

Una chiave non valida o assente restituisce HTTP 401 con una struttura di errore coerente: controlla il codice di stato prima di analizzare 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"
  }
}

Risorse correlate

Domande frequenti

glm-5.3 supporta lo streaming? Sì: imposta "stream": true e leggi i blocchi SSE. Il contenuto di ragionamento e il contenuto della risposta vengono trasmessi come campi delta separati.

Perché content è null nella mia risposta? Quasi sempre perché il budget max_tokens è troppo piccolo per coprire sia il ragionamento sia la risposta. Controlla finish_reason: "length" indica che la risposta è stata troncata prima (o durante) la risposta effettiva. Aumenta max_tokens.

Posso disattivare la fase di ragionamento? No, non tramite parametri della richiesta: glm-5.3 ragiona prima di ogni risposta e reasoning_content viene sempre popolato. Prevedi un budget per questo, invece di provare a disattivarlo.

glm-5.3 supporta la chiamata di funzioni/strumenti? Sì, usando la struttura standard OpenAI tools / tool_calls, verificata sull'endpoint di produzione.

Posso usare l'SDK OpenAI ufficiale invece di HTTP grezzo? Sì. Punta base_url dell'SDK a https://api.hiapi.ai/v1 e usa la tua chiave hiapi sk-... come API key: nessun'altra modifica necessaria.

Come viene fatturato glm-5.3? A token, come gli altri modelli testuali hiapi. Consulta la pagina dei prezzi per le tariffe attuali, invece di affidarti a un numero specifico in questo articolo.

Inizia a creare con artefatti IA persistenti

Ottieni la tua chiave API e chiama modelli di immagini, video e audio tramite un'unica API basata sui task.

Leggi la documentazione API