Aller au contenu principal

Chat Completions

POST /v1/chat/completions

Le point de terminaison central de conversation, compatible avec le format Chat Completions d'OpenAI. Prend en charge la saisie multimodale, le streaming, l'appel d'outils et les modèles de raisonnement.

Requête​

curl https://test.kailin.com.cn/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-your-token" \
-d '{
"model": "deepseek-v4-1-flash-261017",
"messages": [
{ "role": "system", "content": "You are a concise assistant" },
{ "role": "user", "content": "Hello" }
],
"stream": false
}'
RequestREQUEST
POSThttps://test.kailin.com.cn/v1/chat/completions
ResponseRESPONSE
Fill in the request and hit Send — the response shows up here

Corps de la requête​

ParamètreTypeObligatoireDescription
modelstringOuiNom du modèle, voir Lister les modèles
messagesarrayOuiMessages de la conversation, voir la structure des messages ci-dessous
streambooleanNonSortie en streaming (SSE), false par défaut
temperaturenumberNonTempérature d'échantillonnage de 0 à 2, défaut 1 — plus basse = plus déterministe
top_pnumberNonÉchantillonnage nucleus ; ajustez celui-ci ou temperature, pas les deux
max_tokensnumberNonNombre maximal de tokens à générer (les modèles récents utilisent max_completion_tokens)
stopstring / arrayNonSéquences d'arrêt, jusqu'à 4
toolsarrayNonDéfinitions d'outils (fonctions), voir l'appel d'outils
tool_choicestring / objectNonauto / none / required / un outil spécifique
response_formatobjectNon{"type": "json_object"} ou {"type": "json_schema", ...}
seedintegerNonGraine aléatoire pour la reproductibilité
frequency_penaltynumberNon-2.0–2.0, réduit les répétitions
presence_penaltynumberNon-2.0–2.0, encourage de nouveaux sujets
reasoning_effortstringNonEffort de raisonnement pour les modèles de raisonnement : low / medium / high
userstringNonIdentifiant de l'utilisateur final, utile pour la surveillance des abus

Structure des messages​

ChampTypeDescription
rolestringsystem / user / assistant / tool
contentstring / arrayUne chaîne, ou un tableau de parties multimodales (voir la saisie multimodale)
namestringNom optionnel du participant
tool_callsarrayAppels d'outils initiés par le modèle, sur les messages assistant
tool_call_idstringRequis sur les messages tool — l'appel auquel on répond

Réponse (sans streaming)​

{
"id": "chatcmpl-B3xK1abc123",
"object": "chat.completion",
"created": 1730000000,
"model": "deepseek-v4-1-flash-261017",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "Hello! How can I help you today?"
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 20,
"completion_tokens": 12,
"total_tokens": 32
}
}
ChampDescription
choices[].message.contentLa réponse du modèle
choices[].finish_reasonstop terminé / length limite de tokens atteinte / tool_calls exécution d'outil requise
usageConsommation de tokens — base de la facturation
usage.completion_tokens_details.reasoning_tokensTokens de réflexion renvoyés par les modèles de raisonnement

Réponse en streaming​

Avec "stream": true, la réponse est un flux d'événements SSE :

data: {"id":"chatcmpl-xxx","choices":[{"index":0,"delta":{"role":"assistant"},"finish_reason":null}]}

data: {"id":"chatcmpl-xxx","choices":[{"index":0,"delta":{"content":"Hello"},"finish_reason":null}]}

data: {"id":"chatcmpl-xxx","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}

data: [DONE]

Le contenu incrémental arrive dans choices[].delta.content et se termine par data: [DONE]. Le dernier fragment peut contenir usage selon l'amont.

Saisie multimodale​

Passez content sous forme de tableau pour mélanger texte et images/audio. Les images acceptent une URL ou une data URL en Base64 :

{
"model": "gpt-4o-mini",
"messages": [
{
"role": "user",
"content": [
{ "type": "text", "text": "What's in this image?" },
{
"type": "image_url",
"image_url": {
"url": "https://upload.wikimedia.org/wikipedia/commons/3/3c/Shaki_waterfall.jpg"
}
}
]
}
]
}
Partie de contenuChampsDescription
texttextTexte
image_urlimage_url.urlURL d'image ou data:image/jpeg;base64,...
input_audioinput_audio.data / input_audio.formatAudio en Base64 (wav / mp3), nécessite la prise en charge par le modèle

Appel d'outils​

  1. Déclarez les outils via tools ; le modèle répond avec tool_calls.
  2. Exécutez les outils, ajoutez les résultats sous forme de messages role: "tool", puis appelez à nouveau.
{
"model": "deepseek-v4-1-flash-261017",
"messages": [{ "role": "user", "content": "What's the weather in Shanghai today?" }],
"tools": [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get the current weather for a city",
"parameters": {
"type": "object",
"properties": {
"city": { "type": "string", "description": "City name" }
},
"required": ["city"]
}
}
}
]
}

Réponse du modèle :

{
"choices": [
{
"message": {
"role": "assistant",
"tool_calls": [
{
"id": "call_abc123",
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{\"city\": \"Shanghai\"}"
}
}
]
},
"finish_reason": "tool_calls"
}
]
}

Après exécution, renvoyez le résultat :

{
"model": "deepseek-v4-1-flash-261017",
"messages": [
{ "role": "user", "content": "What's the weather in Shanghai today?" },
{
"role": "assistant",
"tool_calls": [
{
"id": "call_abc123",
"type": "function",
"function": { "name": "get_weather", "arguments": "{\"city\": \"Shanghai\"}" }
}
]
},
{ "role": "tool", "tool_call_id": "call_abc123", "content": "Sunny, 26°C" }
]
}

Utilisation du SDK​

from openai import OpenAI

client = OpenAI(
api_key="sk-your-token",
base_url="https://test.kailin.com.cn/v1",
)

stream = client.chat.completions.create(
model="deepseek-v4-1-flash-261017",
messages=[{"role": "user", "content": "Write a short poem about autumn"}],
stream=True,
)
for chunk in stream:
delta = chunk.choices[0].delta
if delta.content:
print(delta.content, end="", flush=True)
import OpenAI from 'openai';

const client = new OpenAI({
apiKey: 'sk-your-token',
baseURL: 'https://test.kailin.com.cn/v1',
});

const stream = await client.chat.completions.create({
model: 'deepseek-v4-1-flash-261017',
messages: [{ role: 'user', content: 'Write a short poem about autumn' }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? '');
}
Remarque

Les modèles de raisonnement (série o, DeepSeek-R1, etc.) peuvent renvoyer le processus de réflexion dans reasoning_content ou delta.reasoning_content, selon le canal amont.