# Чат

```text
POST /v1/chat/completions
```

Синхронный OpenAI-совместимый эндпоинт. Работает с любым OpenAI SDK — меняешь `base_url` и `api_key`, остальное без изменений. Тело запроса пробрасывается модели целиком («полная мощь по желанию»): стандартные параметры OpenAI поддерживаются как есть.

## Параметры

| Поле | Тип | Описание |
|---|---|---|
| `model` | string, **обяз.** | ID модели, например `souz/gpt-5.4-mini` — [каталог](/models) |
| `messages` | array, **обяз.** | Сообщения в формате OpenAI (`system` / `user` / `assistant` / `tool`) |
| `stream` | boolean | `true` → стриминг SSE |
| `temperature`, `top_p`, `max_tokens`, `stop`, … | — | Стандартные параметры OpenAI, пробрасываются модели |
| `tools`, `tool_choice` | — | Вызов инструментов (function calling) — для моделей с поддержкой |
| `response_format` | object | Например `{"type": "json_object"}` |
| `reasoning_effort` | string | `low` / `medium` / `high` — глубина размышлений для thinking-моделей (gpt-5.5, o3, …) |

Лимит тела запроса — 25 МБ (vision-картинки едут внутри JSON).

## Пример

```python
from openai import OpenAI

client = OpenAI(base_url="https://api.souz.ai/v1", api_key="sk-souz-...")

resp = client.chat.completions.create(
    model="souz/claude-sonnet-4-6",
    messages=[
        {"role": "system", "content": "Отвечай кратко."},
        {"role": "user", "content": "Объясни, что такое вебхук."},
    ],
)
print(resp.choices[0].message.content)
print("кредитов:", resp.usage.cost)
```

В ответе — стандартный объект OpenAI. Дополнительно `usage.cost` — фактически списанные кредиты (как у OpenRouter).

## Стриминг

```python
stream = client.chat.completions.create(
    model="souz/gpt-5.4-mini",
    messages=[{"role": "user", "content": "Напиши хокку про API"}],
    stream=True,
)
for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="")
    if chunk.usage:  # последний чанк
        print("\nкредитов:", chunk.usage.cost)
```

Поток — стандартный SSE (`data: {...}`, в конце `data: [DONE]`). Последний чанк всегда содержит `usage` с полем `cost`.

## Vision — картинки в сообщениях

Модели с пометкой «vision» в [каталоге](/models) принимают картинки в сообщениях (data URL, как у OpenAI):

```python
resp = client.chat.completions.create(
    model="souz/gemini-2.5-flash-lite",  # самый дешёвый vision
    messages=[{
        "role": "user",
        "content": [
            {"type": "text", "text": "Что на фото?"},
            {"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,..."}},
        ],
    }],
)
```

## Reasoning (thinking-модели)

```python
resp = client.chat.completions.create(
    model="souz/gpt-5.5",
    messages=[{"role": "user", "content": "Сложная задача..."}],
    reasoning_effort="high",
)
```

Токены размышлений учитываются как выходные — это видно в `usage`.

## Ошибки

| HTTP | `code` | Когда |
|---|---|---|
| 401 | `invalid_api_key` | Нет/неверный ключ |
| 402 | `insufficient_credits` | Не хватает кредитов |
| 404 | `model_not_found` | Неизвестная модель |
| 413 | `invalid_request` | Тело больше 25 МБ |
| 429 | `rate_limited` | Превышен лимит запросов ([лимиты](/limits)) |
| 502 | `model_unavailable` | Все провайдеры модели недоступны — повтори позже |

Формат ошибок общий для всего API — см. [Ошибки](/errors).
