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
}'
https://test.kailin.com.cn/v1/chat/completionsCorps de la requête
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
model | string | Oui | Nom du modèle, voir Lister les modèles |
messages | array | Oui | Messages de la conversation, voir la structure des messages ci-dessous |
stream | boolean | Non | Sortie en streaming (SSE), false par défaut |
temperature | number | Non | Température d'échantillonnage de 0 à 2, défaut 1 — plus basse = plus déterministe |
top_p | number | Non | Échantillonnage nucleus ; ajustez celui-ci ou temperature, pas les deux |
max_tokens | number | Non | Nombre maximal de tokens à générer (les modèles récents utilisent max_completion_tokens) |
stop | string / array | Non | Séquences d'arrêt, jusqu'à 4 |
tools | array | Non | Définitions d'outils (fonctions), voir l'appel d'outils |
tool_choice | string / object | Non | auto / none / required / un outil spécifique |
response_format | object | Non | {"type": "json_object"} ou {"type": "json_schema", ...} |
seed | integer | Non | Graine aléatoire pour la reproductibilité |
frequency_penalty | number | Non | -2.0–2.0, réduit les répétitions |
presence_penalty | number | Non | -2.0–2.0, encourage de nouveaux sujets |
reasoning_effort | string | Non | Effort de raisonnement pour les modèles de raisonnement : low / medium / high |
user | string | Non | Identifiant de l'utilisateur final, utile pour la surveillance des abus |
Structure des messages
| Champ | Type | Description |
|---|---|---|
role | string | system / user / assistant / tool |
content | string / array | Une chaîne, ou un tableau de parties multimodales (voir la saisie multimodale) |
name | string | Nom optionnel du participant |
tool_calls | array | Appels d'outils initiés par le modèle, sur les messages assistant |
tool_call_id | string | Requis 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
}
}
| Champ | Description |
|---|---|
choices[].message.content | La réponse du modèle |
choices[].finish_reason | stop terminé / length limite de tokens atteinte / tool_calls exécution d'outil requise |
usage | Consommation de tokens — base de la facturation |
usage.completion_tokens_details.reasoning_tokens | Tokens 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 contenu | Champs | Description |
|---|---|---|
text | text | Texte |
image_url | image_url.url | URL d'image ou data:image/jpeg;base64,... |
input_audio | input_audio.data / input_audio.format | Audio en Base64 (wav / mp3), nécessite la prise en charge par le modèle |
Appel d'outils
- Déclarez les outils via
tools; le modèle répond avectool_calls. - 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 ?? '');
}
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.