Completamenti chat
L’endpoint compatibile con OpenAI Chat Completions: richiesta, risposta, streaming, strumenti, errori
POST /chat/completions è l’endpoint che genera le risposte. Gli mandi una lista
di messaggi, ti restituisce il messaggio successivo. Richiesta e risposta hanno
la forma di OpenAI Chat Completions, così puoi usare l’SDK ufficiale cambiando
solo indirizzo di base e chiave.
Serve una chiave con il permesso Completion: le chiavi personali ce l’hanno sempre. → Autenticazione e chiavi
La richiesta
Ogni messaggio ha un role fra system, developer, user, assistant e
tool. Il content è una stringa oppure una lista di parti (testo, immagini,
file: vedi più sotto).
I campi fuori da questa tabella vengono ignorati senza errore. n,
parallel_tool_calls, service_tier e stream_options compresi: l’API
restituisce sempre una sola risposta, e nello streaming il conteggio dei token
arriva comunque.
La risposta
Il testo è in choices[0].message.content. model è l’id del modello che ha
risposto, usage il conteggio dei token su cui la chiamata viene addebitata.
Guarda sempre finish_reason. stop vuol dire che la risposta è finita;
length che si è fermata al tetto di max_tokens, e quindi è tagliata.
Esempi
Con curl:
Con l’SDK OpenAI per Python:
Con l’SDK OpenAI per JavaScript e TypeScript:
Streaming
Con "stream": true la risposta arriva come flusso di eventi (Server-Sent
Events): ogni evento è un oggetto chat.completion.chunk con un pezzo di testo
in choices[0].delta.content. L’ultimo pezzo porta finish_reason e usage,
poi il flusso si chiude con data: [DONE].
Se il credito o il budget finiscono mentre la risposta è in corso, il flusso si interrompe con un evento di errore al posto del pezzo successivo. Il tuo client deve trattarlo come una risposta incompleta, non come una risposta finita.
Strumenti
In tools descrivi le funzioni del tuo sistema. Quando il modello decide che ne
serve una, la risposta ha finish_reason uguale a tool_calls e, in
message.tool_calls, il nome della funzione con gli argomenti in JSON.
Userbot non esegue niente: la funzione la chiami tu. Poi rimandi la
conversazione aggiungendo la risposta del modello con i suoi tool_calls e un
messaggio con ruolo tool, che porta il risultato e il tool_call_id
corrispondente. Il modello userà quel risultato per rispondere.
Immagini e file nei messaggi
Il content di un messaggio può essere una lista di parti, come in OpenAI:
{"type": "text", "text": "..."}per il testo;{"type": "image_url", "image_url": {"url": "..."}}per un’immagine, con un indirizzo pubblico o un data URL in base64;{"type": "file", "file": {"filename": "offerta.pdf", "file_data": "..."}}per un file, con il contenuto codificato in base64.
Non tutti i modelli leggono immagini e file: per questi messaggi scegline uno che lo fa. Il corpo della richiesta non può superare 30 MB, allegati compresi.
Risposte in JSON
Con "response_format": {"type": "json_object"} chiedi al modello un JSON
valido; con json_schema gli passi anche lo schema da rispettare. Scrivilo
comunque anche nelle istruzioni: non tutti i modelli rispettano il formato allo
stesso modo, quindi valida sempre la risposta prima di usarla.
Tenere il filo di una conversazione
L’endpoint non ha memoria: ogni chiamata parte da zero. Per continuare un dialogo rimandi tutti i messaggi precedenti, compresa la risposta ricevuta, e in fondo la nuova domanda.
La lista cresce a ogni turno, e con lei il costo. Se la conversazione è lunga,
taglia i turni vecchi o sostituiscili con un riassunto nel messaggio system.
Gli errori
Gli errori arrivano con il codice HTTP corrispondente e un corpo JSON. La forma
del corpo non è uguale per tutti i casi: decidi in base al codice HTTP e leggi il
campo code quando c’è.

