Документация · Chat Completions

API

Chat Completions

Основной эндпоинт для текстовых моделей в формате OpenAI: диалоги, стриминг, инструменты и изображения на входе.

POST/v1/chat/completions

Запрос#

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.flua.ink/v1",
    api_key=os.environ["FLUA_API_KEY"],
)

response = client.chat.completions.create(
    model="gpt-6-astra",
    messages=[
        {"role": "user", "content": "Объясни, что такое токен, в одном абзаце."},
    ],
)
print(response.choices[0].message.content)

Параметры#

ПараметрТипОписание
model*stringId модели из каталога, например claude-opus-5-5.
messages*arrayИстория диалога: объекты с role (system, user, assistant, tool) и content.
max_tokensintegerПредел длины ответа в токенах.
reasoning_effortstringГлубина рассуждений: none, low, medium или high. См. Рассуждения.
temperaturenumberСлучайность ответа, обычно 0–2. Ниже — точнее, выше — разнообразнее.
top_pnumberNucleus sampling — альтернатива temperature.
streambooleanОтдавать ответ по частям через Server-Sent Events.
stream_optionsobject{"include_usage": true} — добавить число токенов в последний чанк стрима.
stopstring | arrayПоследовательности, на которых генерация остановится.
toolsarrayФункции, которые модель может вызвать.
tool_choicestring | objectauto, none, required или конкретная функция.
response_formatobjectJSON-режим или JSON Schema для структурированного ответа.
Набор поддерживаемых параметров зависит от модели. Параметры, которые модель не поддерживает, могут быть проигнорированы.

Ответ#

200 OK
{
  "id": "chatcmpl-…",
  "object": "chat.completion",
  "created": 1790964838,
  "model": "gpt-6-astra",
  "choices": [
    {
      "index": 0,
      "message": { "role": "assistant", "content": "…" },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 18,
    "completion_tokens": 104,
    "total_tokens": 122
  }
}

Стриминг#

При stream: true сервер отправляет события data: с кусочками ответа в delta.content и завершает поток строкой data: [DONE]. С include_usage последний чанк содержит usage.

text/event-stream
data: {"object":"chat.completion.chunk","choices":[{"index":0,"delta":{"role":"assistant"}}]}

data: {"object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"Токен"}}]}

data: {"object":"chat.completion.chunk","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}

data: {"object":"chat.completion.chunk","choices":[],"usage":{"prompt_tokens":18,"completion_tokens":104,"total_tokens":122}}

data: [DONE]

Рассуждения#

Модели с рассуждениями сначала «думают», потом отвечают. Глубину задаёт reasoning_effort: none выключает рассуждения там, где это возможно, high даёт модели подумать дольше — ответы точнее, но медленнее и дороже. Без параметра модель решает сама.

reasoning.py
response = client.chat.completions.create(
    model="gemini-3.8-flash",
    reasoning_effort="high",
    messages=[{"role": "user", "content": "Сколько будет 17 × 23?"}],
)

message = response.choices[0].message
print(getattr(message, "reasoning_content", None))  # ход мыслей, если модель его отдаёт
print(message.content)
print(response.usage.completion_tokens_details.reasoning_tokens)
  • Токены рассуждений оплачиваются как выходные и приходят в usage.completion_tokens_details.reasoning_tokens.
  • Gemini, Claude и DeepSeek отдают сам ход мыслей в message.reasoning_content, при стриминге — в delta.reasoning_content. Модели GPT рассуждают скрыто: видно только число токенов.
  • Некоторые модели рассуждают всегда (например, DeepSeek V4.1 Flash) — для них параметр почти ничего не меняет.
В формате Responses глубина задаётся как "reasoning": {"effort": "high"}, в формате Anthropic — как "thinking": {"type": "enabled", "budget_tokens": 4000}.

Вызов инструментов#

Опишите функции в tools. Если модель решит вызвать функцию, в ответе будет tool_calls — выполните её и верните результат сообщением с role: tool.

tools.py
import json, os
from openai import OpenAI

client = OpenAI(base_url="https://api.flua.ink/v1", api_key=os.environ["FLUA_API_KEY"])

tools = [{
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "Current weather in a city",
        "parameters": {
            "type": "object",
            "properties": {"city": {"type": "string"}},
            "required": ["city"],
        },
    },
}]

messages = [{"role": "user", "content": "Какая погода в Киеве?"}]
first = client.chat.completions.create(model="claude-sonnet-5-5", messages=messages, tools=tools)
call = first.choices[0].message.tool_calls[0]

messages.append(first.choices[0].message)
messages.append({
    "role": "tool",
    "tool_call_id": call.id,
    "content": json.dumps({"temperature_c": 14, "sky": "cloudy"}),
})
final = client.chat.completions.create(model="claude-sonnet-5-5", messages=messages, tools=tools)
print(final.choices[0].message.content)

Изображения на входе#

Мультимодальные модели принимают картинки частью content: по ссылке или как data URL в base64.

vision.py
response = client.chat.completions.create(
    model="gemini-3.8-flash",
    messages=[{
        "role": "user",
        "content": [
            {"type": "text", "text": "Что на этой картинке?"},
            {"type": "image_url", "image_url": {"url": "https://example.com/photo.jpg"}},
        ],
    }],
)

Структурированный ответ#

Чтобы получить ответ строго по схеме, передайте response_format с типом json_schema (для моделей, которые это поддерживают).

json_schema.py
response = client.chat.completions.create(
    model="gpt-6-astra",
    messages=[{"role": "user", "content": "Придумай название и слоган для кофейни"}],
    response_format={
        "type": "json_schema",
        "json_schema": {
            "name": "brand",
            "schema": {
                "type": "object",
                "properties": {"name": {"type": "string"}, "tagline": {"type": "string"}},
                "required": ["name", "tagline"],
            },
        },
    },
)