Chat Completions
Основной эндпоинт диалога, совместимый с форматом OpenAI Chat Completions. Поддерживает мультимодальный ввод, потоковую передачу, вызов инструментов и модели с рассуждениями.
Запрос
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
POST
https://test.kailin.com.cn/v1/chat/completionsResponseRESPONSE
Fill in the request and hit Send — the response shows up here
Тело запроса
| Параметр | Тип | Обязательно | Описание |
|---|---|---|---|
model | string | Да | Название модели, см. Спис ок моделей |
messages | array | Да | Сообщения диалога, см. структуру сообщения ниже |
stream | boolean | Нет | Потоковый вывод (SSE), по умолчанию false |
temperature | number | Нет | Температура сэмплирования 0–2, по умолчанию 1 — ниже значение, детерминированнее ответ |
top_p | number | Нет | Nucleus-сэмплирование; настраивайте либо его, либо temperature, но не оба сразу |
max_tokens | number | Нет | Максимум генерируемых токенов (в новых моделях используется max_completion_tokens) |
stop | string / array | Нет | Стоп-последовательности, до 4 штук |
tools | array | Нет | Определения инструментов (функций), см. вызов инструментов |
tool_choice | string / object | Нет | auto / none / required / конкретный инструмент |
response_format | object | Нет | {"type": "json_object"} или {"type": "json_schema", ...} |
seed | integer | Нет | Случайное зерно для воспроизводимости результата |
frequency_penalty | number | Нет | −2.0–2.0, снижает повторы |
presence_penalty | number | Нет | −2.0–2.0, поощряет новые темы |
reasoning_effort | string | Нет | Уровень усилий рассуждений для reasoning-моделей: low / medium / high |
user | string | Нет | Идентификатор конечного пользователя, полезен для контроля злоупотреблений |
Структура сообщения
| Поле | Тип | Описание |
|---|---|---|
role | string | system / user / assistant / tool |
content | string / array | Строка или массив мультимодальных частей (см. мультимодальный ввод) |
name | string | Необязательное имя участника |
tool_calls | array | Вызовы инструментов, иниц иированные моделью, в сообщениях assistant |
tool_call_id | string | Обязательно в сообщениях tool — указывает, на какой вызов отвечает сообщение |
Ответ (без потоковой передачи)
{
"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
}
}
| Поле | Описание |
|---|---|
choices[].message.content | Ответ модели |
choices[].finish_reason | stop — завершено / length — достигнут лимит токенов / tool_calls — требуется выполнение инструмента |
usage | Расход токенов — основа для биллинга |
usage.completion_tokens_details.reasoning_tokens | Токены рассуждений, возвращаемые reasoning-моделями |
Потоковый ответ
При "stream": true ответ представляет собой поток 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]
Инкрементальный контент приходит в choices[].delta.content, в конце приходит data: [DONE]. Последний фрагмент может содержать usage в зависимости от апстрима.
Мультимодальный ввод
Передайте content в виде массива, чтобы смешать текст с изображениями и аудио. Изображения принимаются как URL или Base64 data URL:
{
"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"
}
}
]
}
]
}
| Часть контента | Поля | Описание |
|---|---|---|
text | text | Текст |
image_url | image_url.url | URL изображения или data:image/jpeg;base64,... |
input_audio | input_audio.data / input_audio.format | Аудио в Base64 (wav / mp3), требуется поддержка со стороны модели |
Вызов инструментов
- Объявите инструменты через
tools; модель ответитtool_calls. - Выполните инструменты, добавьте результаты как сообщения
role: "tool"и вызовите снова.
{
"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"]
}
}
}
]
}
Ответ модели:
{
"choices": [
{
"message": {
"role": "assistant",
"tool_calls": [
{
"id": "call_abc123",
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{\"city\": \"Shanghai\"}"
}
}
]
},
"finish_reason": "tool_calls"
}
]
}
После выполнения отправьте результат обратно:
{
"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" }
]
}
Использование 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 ?? '');
}
Примечание
Reasoning-модели (серия o, DeepSeek-R1 и др.) могут возвращать процесс размышлений в reasoning_content или delta.reasoning_content — это зависит от апстрим-канала.