Запрос#
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* | string | Id модели из каталога, например claude-opus-5-5. |
messages* | array | История диалога: объекты с role (system, user, assistant, tool) и content. |
max_tokens | integer | Предел длины ответа в токенах. |
reasoning_effort | string | Глубина рассуждений: none, low, medium или high. См. Рассуждения. |
temperature | number | Случайность ответа, обычно 0–2. Ниже — точнее, выше — разнообразнее. |
top_p | number | Nucleus sampling — альтернатива temperature. |
stream | boolean | Отдавать ответ по частям через Server-Sent Events. |
stream_options | object | {"include_usage": true} — добавить число токенов в последний чанк стрима. |
stop | string | array | Последовательности, на которых генерация остановится. |
tools | array | Функции, которые модель может вызвать. |
tool_choice | string | object | auto, none, required или конкретная функция. |
response_format | object | JSON-режим или JSON Schema для структурированного ответа. |
Ответ#
{
"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.
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 даёт модели подумать дольше — ответы точнее, но медленнее и дороже. Без параметра модель решает сама.
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) — для них параметр почти ничего не меняет.
"reasoning": {"effort": "high"}, в формате Anthropic — как "thinking": {"type": "enabled", "budget_tokens": 4000}.Вызов инструментов#
Опишите функции в tools. Если модель решит вызвать функцию, в ответе будет tool_calls — выполните её и верните результат сообщением с role: tool.
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.
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 (для моделей, которые это поддерживают).
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"],
},
},
},
)