Complétions de chat
POST /v1/chat/completions
Appelle un modèle de texte. Contrairement à l’image et à la vidéo, ce point d’accès est synchrone : un aller-retour et vous avez la réponse, sans interrogation. Requête et réponse suivent chat/completions d’OpenAI, streaming compris ; n’importe quel SDK OpenAI fonctionne en changeant l’URL de base.
Paramètres
| Paramètre | Type | Description |
|---|---|---|
| model | string | Obligatoire. id de modèle issu de /v1/models avec type text |
| messages | object[] | Obligatoire. Chaque élément {role, content} ; role vaut system, user ou assistant. 64 au maximum par requête |
| stream | boolean | Facultatif. true bascule en deltas SSE ; false par défaut renvoie la réponse en une fois |
| temperature | number | Facultatif. Transmis tel quel au modèle |
| top_p | number | Facultatif. Transmis tel quel |
| max_tokens | integer | Facultatif. Transmis tel quel |
| stop | string|string[] | Facultatif. Transmis tel quel |
| presence_penalty / frequency_penalty | number | Facultatif. Transmis tel quel |
model est obligatoire et n’a pas de valeur par défaut : les modèles de texte diffèrent beaucoup en ton, en longueur et en prix, en choisir un en silence reviendrait à prendre pour vous une décision que vous n’avez jamais vue.
Requête
bash
curl https://open.pikpikgo.com/v1/chat/completions \
-H "Authorization: Bearer $PIKPIK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "text-fast-1",
"messages": [
{ "role": "system", "content": "Tu es scénariste, spécialisé dans les formats courts." },
{ "role": "user", "content": "Donne-moi l’ouverture d’un court-métrage de mystère urbain, en trois phrases maximum." }
]
}'Réponse
json
{
"id": "chatcmpl-2608102214300000123456",
"object": "chat.completion",
"created": 1786372470,
"model": "text-fast-1",
"choices": [
{
"index": 0,
"message": { "role": "assistant", "content": "À minuit, l’ascenseur s’arrête au 13e étage. L’immeuble n’en compte que douze." },
"finish_reason": "stop"
}
],
"usage": { "prompt_tokens": 38, "completion_tokens": 126, "total_tokens": 164 },
"credits": 4
}| Champ | Description |
|---|---|
| choices[0].message.content | Le texte de la réponse |
| choices[0].finish_reason | stop pour une fin normale, length si max_tokens a été atteint |
| usage | Décompte de jetons. Le texte est facturé au jeton : c’est la base du débit |
| credits | Crédits réellement débités (champ hors standard OpenAI) |
Le texte est facturé au jeton, pas à l’appel : crédits = jetons d’entrée × tarif d’entrée + jetons de sortie × tarif de sortie, arrondi au supérieur, avec un minimum de 1 par appel. Les tarifs sont exprimés au million de jetons sur la page des prix.
Réponse en streaming
Avec stream: true, la réponse devient text/event-stream et arrive en trames chat.completion.chunk : la première déclare le role, le contenu suit delta par delta, puis une trame porte finish_reason, puis une dernière avec choices vide plus usage et credits, closes par data: [DONE].
bash
curl -N https://open.pikpikgo.com/v1/chat/completions \
-H "Authorization: Bearer $PIKPIK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "text-fast-1",
"messages": [
{ "role": "user", "content": "Donne-moi l’ouverture d’un court-métrage de mystère urbain, en trois phrases maximum." }
],
"stream": true
}'text
data: {"id":"chatcmpl-2608102214300000123456","object":"chat.completion.chunk","created":1786372470,"model":"text-fast-1","choices":[{"index":0,"delta":{"role":"assistant"},"finish_reason":null}]}
data: {"id":"chatcmpl-2608102214300000123456","object":"chat.completion.chunk","created":1786372470,"model":"text-fast-1","choices":[{"index":0,"delta":{"content":"À minu"},"finish_reason":null}]}
data: {"id":"chatcmpl-2608102214300000123456","object":"chat.completion.chunk","created":1786372470,"model":"text-fast-1","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}
data: {"id":"chatcmpl-2608102214300000123456","object":"chat.completion.chunk","created":1786372470,"model":"text-fast-1","choices":[],"usage":{"prompt_tokens":38,"completion_tokens":126,"total_tokens":164},"credits":4}
data: [DONE]Avec le SDK officiel OpenAI, vous n’avez pas à analyser le SSE vous-même :
javascript
import OpenAI from 'openai'
const client = new OpenAI({
apiKey: process.env.PIKPIK_API_KEY,
baseURL: 'https://open.pikpikgo.com/v1',
})
// Streaming : deltas trame par trame, la dernière porte usage et les crédits
const stream = await client.chat.completions.create({
model: 'text-fast-1',
messages: [{ role: 'user', content: 'Donne-moi l’ouverture d’un court-métrage de mystère urbain, en trois phrases maximum.' }],
stream: true,
})
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content || '')
}En streaming, la facturation se base sur le usage de la dernière trame ; si l’amont ne le renvoie pas, le minimum de 1 crédit est appliqué. Autre point : dès que les trames circulent, le statut HTTP est déjà 200 — un échec en cours de route ne peut plus devenir un 4xx/5xx. Il arrive sous forme de trame {"error": {...}} dans le flux, suivie du [DONE] habituel ; prévoyez ce cas à la lecture.

