# Chat Completions

`POST /v1/chat/completions`

Основной метод. Запрос и ответ как в OpenAI. Принимаем только поля из списка: на другое поле ответ 400 с его именем в param. Поле со значением null считаем отсутствующим, даже незнакомое.

- `model` (string, обязательно) — Модель с kind chat, например `openai/gpt-6.1-sol`
- `messages` (array, обязательно) — Непустой массив сообщений. content: строка или части типа text, refusal и image_url (ссылка или data URL изображения, только в сообщении user)
- `max_completion_tokens`, `max_tokens` (integer) — Лимит ответа, от 1 до максимума модели, только одно из двух. Больше максимума: 400, максимум назван в message. У моделей с рассуждением в лимит входят и токены рассуждения, при малом лимите content бывает null. Без лимита модель отвечает полностью
- `stream` (boolean) — true: ответ приходит частями, см. «Стриминг»
- `stream_options` (object) — Настройки потока, например include_usage, см. «Стриминг»
- `tools` (array) — Функции для function calling, см. «Function calling»
- `tool_choice` (string | object) — Вызывать ли функцию и какую, см. «Function calling»
- `response_format` (object) — text, json_object или json_schema
- `n` (integer) — Только 1
- `service_tier` (string) — Только auto или default
- `temperature` (и другие) — Передаём модели как есть: temperature, top_p, stop, seed, frequency_penalty, presence_penalty, logit_bias, logprobs, top_logprobs, reasoning_effort, verbosity, prediction, parallel_tool_calls, functions, function_call, user, safety_identifier

**Пример запроса**

curl:

```bash
curl https://api.polyapi.ru/v1/chat/completions \
  -H "Authorization: Bearer $POLYAPI_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-6.1-sol",
    "messages": [{"role": "user", "content": "Привет"}]
  }'
```

Python:

```python
import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["POLYAPI_KEY"],
    base_url="https://api.polyapi.ru/v1",
)

r = client.chat.completions.create(
    model="openai/gpt-6.1-sol",
    messages=[{"role": "user", "content": "Привет"}],
)
print(r.choices[0].message.content)
```

Node.js:

```js
import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.POLYAPI_KEY,
  baseURL: "https://api.polyapi.ru/v1",
});

const r = await client.chat.completions.create({
  model: "openai/gpt-6.1-sol",
  messages: [{ role: "user", content: "Привет" }],
});
console.log(r.choices[0].message.content);
```

n8n:

```
# Узел OpenAI Chat Model → Credential → Create new credential (OpenAI)

API Key     sk-…
Base URL    https://api.polyapi.ru/v1

# Узел: Model — из списка или By ID
Model       openai/gpt-6.1-sol
```

Codex:

```toml
# ~/.codex/config.toml
model = "gpt-6.1-sol"
model_provider = "polyapi"

[model_providers.polyapi]
name = "polyapi"
base_url = "https://api.polyapi.ru/v1"
env_key = "POLYAPI_KEY"

# в терминале:
# export POLYAPI_KEY="sk-…"
# codex
```

**Ответ**

```json
{
  "id": "chatcmpl-5f0c2b9e7d3a4e18a6c1d2b3e4f5a6b7",
  "object": "chat.completion",
  "created": 1794052800,
  "model": "openai/gpt-6.1-sol",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "Привет! Чем помочь?"
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 9,
    "completion_tokens": 7,
    "total_tokens": 16
  }
}
```

Изображения принимают модели, у которых в `input_modalities` списка моделей есть `image`: GPT, Grok, почти все Claude и Gemini, часть Qwen, Mistral и GLM. Изображение в запросе к другой модели даёт 400. Изображение стоит столько входных токенов, сколько их насчитала модель. На время запроса резервируем 5 000 входных токенов на изображение. Data URL входит в лимит тела запроса 8 МиБ.

Не поддерживаем, ответ 400: аудио и файлы в content, `audio`, `modalities` кроме ["text"], `web_search_options`. `store`, `metadata`, `prompt_cache_retention` и `prompt_cache_options` принимаем и не передаём: ничего не храним, кэшем управляет шлюз. `prompt_cache_key` заменяем своим ключом разговора в пределах аккаунта, чтобы ходы одного диалога попадали в кэш.

Источник: https://polyapi.ru/docs/chat
