6ioAPI

Чат

Чат работает по протоколу OpenAI: POST /v1/chat/completions. Подойдёт любой SDK или программа, где можно поменять адрес и ключ. Модели — группы op (OpenRouter) и vn (Venice).

Запрос

curl https://api.6io.io/v1/chat/completions \
  -H "Authorization: Bearer sixio_sk_..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "op/openai/gpt-4o-mini",
    "messages": [
      {"role": "system", "content": "Отвечай коротко."},
      {"role": "user", "content": "Зачем нужен Idempotency-Key?"}
    ],
    "temperature": 0.3,
    "max_tokens": 200
  }'

Параметры (temperature, max_tokens, tools, response_format и другие) уходят поставщику как есть. Что они значат и какие модели их понимают, написано в документации поставщика: OpenRouter для op, Venice для vn.

Ответ приходит в формате OpenAI. В model стоит то название, которое вы отправили (op/…), номер запроса — в заголовке X-Sixio-Request-Id.

Укажите max_tokens. Перед отправкой мы резервируем деньги на самый длинный ответ, который вы разрешили, и чем меньше max_tokens, тем меньше резерв. Спишется только то, что реально потрачено. Подробнее — в разделе Баланс и цены.

Потоковый ответ

С "stream": true ответ приходит по мере генерации, как SSE.

from openai import OpenAI

client = OpenAI(base_url="https://api.6io.io/v1", api_key="sixio_sk_...")
stream = client.chat.completions.create(
    model="op/openai/gpt-4o-mini",
    messages=[{"role": "user", "content": "Расскажи короткую сказку"}],
    max_tokens=300,
    stream=True,
)
for chunk in stream:
    if chunk.choices:  # в последнем чанке только usage, текста в нём нет
        print(chunk.choices[0].delta.content or "", end="", flush=True)
  • В последнем чанке есть usage. Поле usage.cost в нём — стоимость у поставщика в долларах, а не наше списание. Сумму в кредитах покажет GET /v1/requests/{id}.
  • Если закрыть соединение раньше времени, генерация у поставщика могла уже идти. Она будет оплачена.
  • Если между вами и API стоит прокси (nginx и подобные), выключите буферизацию ответа. Мы отправляем заголовок X-Accel-Buffering: no.

Каталог и цены

GET /v1/models возвращает чат-модели в формате OpenAI. К каждой добавлено поле pricing:

{
  "id": "op/openai/gpt-4o-mini",
  "object": "model",
  "owned_by": "openai",
  "pricing": {
    "currency": "credits",
    "prompt_per_million": "11.850000000000",
    "completion_per_million": "47.400000000000",
    "request": "0.000000000000"
  }
}
Поле Что значит
prompt_per_million цена миллиона входных токенов, кредиты
completion_per_million цена миллиона выходных токенов, кредиты
request плата за сам запрос, если она есть у модели

В списке только чат-модели. Модели fal и Sixio смотрите в GET /native/fal/models и GET /native/sixio/models. Модели с плавающей ценой («динамические» у поставщика) не продаются.

Итоговая цена зависит от того, сколько токенов реально потрачено, поэтому она может отличаться от оценки по каталогу.

Бесплатные модели

Модели с ценой 0 в каталоге (у OpenRouter у таких названий суффикс :free) вызываются как все остальные, списание за них равно нулю. Условие: на API-балансе должно быть больше нуля. С нулевым балансом или в долге ответ — 402 insufficient_funds.

Чтобы найти их в каталоге:

import requests

models = requests.get(
    "https://api.6io.io/v1/models",
    headers={"Authorization": "Bearer sixio_sk_..."},
).json()["data"]

free = [
    m["id"] for m in models
    if float(m["pricing"]["prompt_per_million"]) == 0 and float(m["pricing"]["completion_per_million"]) == 0
]
print(free)

Квота на бесплатные модели у поставщика общая для всех его клиентов, поэтому они могут отвечать 503 upstream_busy. В этом случае ничего не списано: повторите после Retry-After.

Группы op и vn

Чат у обеих групп один и тот же, но у каждой есть свои особенности:

  • Модели OpenRouter (op): как найти провайдеров модели и их цены, выбрать провайдера и сортировку, что с плагинами и веб-поиском.
  • Модели Venice (vn): системный промпт, платный поиск, цена.

Что пока не поддерживается

Эти запросы отклоняются до списания с ответом 400 unsupported_parameter:

  • веб-поиск и платные серверные инструменты поставщика: поля plugins и web_search_options, суффикс модели :online, инструменты tools с типом openrouter:…;
  • выбор модели в обход поля model: поля models (список запасных моделей) и preset;
  • входные данные не в виде текста: картинки, аудио и файлы в messages.

Вызов функций (tools) и остальные параметры работают, как у поставщика.