Documentation

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ètreTypeDescription
modelstringObligatoire. id de modèle issu de /v1/models avec type text
messagesobject[]Obligatoire. Chaque élément {role, content} ; role vaut system, user ou assistant. 64 au maximum par requête
streambooleanFacultatif. true bascule en deltas SSE ; false par défaut renvoie la réponse en une fois
temperaturenumberFacultatif. Transmis tel quel au modèle
top_pnumberFacultatif. Transmis tel quel
max_tokensintegerFacultatif. Transmis tel quel
stopstring|string[]Facultatif. Transmis tel quel
presence_penalty / frequency_penaltynumberFacultatif. 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
}
ChampDescription
choices[0].message.contentLe texte de la réponse
choices[0].finish_reasonstop pour une fin normale, length si max_tokens a été atteint
usageDécompte de jetons. Le texte est facturé au jeton : c’est la base du débit
creditsCré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.