Чат
Чат работает по протоколу 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) и остальные параметры работают, как у поставщика.