6ioAPI

Модели OpenRouter (группа op)

Группа op открывает чат-модели из каталога OpenRouter. Название модели — op/<автор>/<модель>, например op/openai/gpt-4o-mini. Запрос и ответ как у OpenAI: POST /v1/chat/completions (см. раздел Чат).

Тело запроса уходит в OpenRouter как есть, поэтому параметры модели описаны в документации OpenRouter: Parameters и Provider routing. Здесь написано только то, что отличается у нас: как найти модель и провайдера, что поддерживается и что нет.

Как найти модель

  • GET /v1/models возвращает все продаваемые модели с ценами в кредитах. Модели OpenRouter начинаются с op/.
  • Названия те же, что на openrouter.ai/models. Нужно добавить только префикс op/.
  • Бесплатные варианты (…:free) тоже продаются, но только при положительном API-балансе: см. Чат.
  • Суффикс работает только там, где такой вариант есть в каталоге отдельной записью (как у :free). Суффиксы-ярлыки OpenRouter :nitro, :floor и :online не работают: ответ 404 model_not_found. :nitro и :floor заменяет поле provider.sort, ниже.

Провайдеры модели: список и цены

Одну модель обычно запускают несколько провайдеров, у них разные цена, точность вычислений и скорость. Список с ценами в кредитах:

curl https://api.6io.io/v1/models/op/meta-llama/llama-3.3-70b-instruct/providers \
  -H "Authorization: Bearer sixio_sk_..."

Ответ (сокращённо):

{
  "id": "op/meta-llama/llama-3.3-70b-instruct",
  "name": "Meta: Llama 3.3 70B Instruct",
  "context": 131072,
  "pricing": {"currency": "credits", "prompt_per_million": "9.480000000000", "completion_per_million": "30.810000000000", "request": "0.000000000000"},
  "providers": [
    {
      "name": "DeepInfra",
      "tag": "deepinfra/turbo",
      "quantization": "fp8",
      "context": 131072,
      "max_output": 16384,
      "uptime_30m": 99.8,
      "default": true,
      "pricing": {"currency": "credits", "prompt_per_million": "9.480000000000", "completion_per_million": "30.810000000000", "request": "0.000000000000"}
    }
  ]
}
  • Провайдеры идут по возрастанию цены. default: true у того, к кому запрос уйдёт первым, если вы не выбирали провайдера.
  • tag — то, что подставляется в provider.order, only и ignore. Короткое имя (deepinfra) подходит ко всем вариантам провайдера (deepinfra/turbo).
  • quantization — точность вычислений (fp8, fp16, bf16, int4…), uptime_30m — доступность за 30 минут в процентах.
  • Это работает только для op/. У vn/ списка провайдеров нет: Venice сама запускает свои модели.

То же видно в консоли: вкладка «Модели», нажмите на модель.

Как выбрать провайдера

Без выбора запрос уходит самому дешёвому провайдеру с точностью fp8 или выше (fp8, mxfp8, fp16, bf16, fp32), а при его сбое следующему по цене. У закрытых моделей точность не указывается, для них фильтра нет.

Свой выбор задаёт поле provider в теле запроса, формат OpenRouter:

{
  "model": "op/meta-llama/llama-3.3-70b-instruct",
  "messages": [{"role": "user", "content": "Привет"}],
  "provider": {"order": ["novita", "deepinfra"], "allow_fallbacks": false}
}
Поле provider Что делает
order каких провайдеров пробовать и в каком порядке
only только этих провайдеров
ignore всех, кроме этих
allow_fallbacks false — не переходить к другим провайдерам, если выбранные недоступны
quantizations допустимая точность: int4, int8, fp4, fp6, fp8, fp16, bf16, fp32, unknown и другие из документации OpenRouter
sort порядок выбора: price, throughput или latency (подробнее ниже)
require_parameters true — только провайдеры, которые понимают все параметры запроса
data_collection deny — только провайдеры, которые не сохраняют данные
zdr true — только провайдеры с нулевым хранением данных
max_price потолок цены (prompt, completion, request, image); в единицах и долларах OpenRouter, а не в кредитах, см. их документацию
preferred_min_throughput, preferred_max_latency предпочтительная скорость и задержка (мягкое условие)

Как мы обрабатываем provider:

  • Если вы не задали sort или order, мы добавляем sort: "price".
  • Если вы не задали quantizations, only и order, мы добавляем фильтр точности fp8 и выше (только когда у модели есть такой провайдер).
  • Всё остальное передаётся как есть.
  • Резерв считается по ценам провайдера, к которому запрос уйдёт первым. Если он заранее не известен (например, задан order), берётся наибольшая цена среди подходящих провайдеров. Списывается всегда фактическая стоимость.

Примеры:

{"provider": {"sort": "throughput"}}
{"provider": {"sort": "latency"}}
{"provider": {"only": ["deepinfra"], "allow_fallbacks": false}}
{"provider": {"quantizations": ["fp16", "bf16"]}}
{"provider": {"ignore": ["novita"]}}

Сортировка

  • "sort": "price" — самый дешёвый провайдер (у нас это уже по умолчанию). В OpenRouter то же делает суффикс :floor.
  • "sort": "throughput" — самый быстрый по числу токенов в секунду. В OpenRouter то же делает суффикс :nitro.
  • "sort": "latency" — с наименьшей задержкой до первого токена.
  • Объектная форма {"sort": {"by": "throughput", "partition": "none"}} тоже принимается: partition управляет тем, сортируются ли провайдеры внутри каждой модели или все вместе. Она нужна только когда моделей несколько, а поле models у нас не поддерживается, так что обычно хватает строки.

Плагины и веб-поиск

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

  • поле plugins (веб-поиск {"id": "web"}, разбор PDF и другие плагины OpenRouter);
  • поле web_search_options (суффикс модели :online даёт 404 model_not_found);
  • серверные инструменты OpenRouter в tools: типы openrouter:…;
  • поле models (список запасных моделей) и preset.

Причина в деньгах. Веб-поиск и плагины стоят отдельно от токенов (по документации OpenRouter, у поиска Exa сейчас $0,007 за запрос плюс $0,001 за каждый результат сверх десяти), и эта сумма не входит в резерв. Пока мы её не учитываем, принимать такие запросы нельзя.

Что можно сделать сейчас:

  • искать в интернете самим и класть найденный текст в messages;
  • использовать обычный вызов функций (tools с типом function): он работает как у OpenAI;
  • вместо models отправить запрос с provider.order и allow_fallbacks, а при ошибке повторить его с другой моделью в своём коде.

Что работает как у OpenRouter

Остальные параметры запроса уходят как есть: temperature, top_p, max_tokens, stop, tools и tool_choice, response_format (структурированный вывод), reasoning и другие. Какие из них понимает конкретная модель и провайдер, показывает GET https://openrouter.ai/api/v1/models/<автор>/<модель>/endpoints (поле supported_parameters) или страница модели на openrouter.ai.

Деньги

Цена в кредитах считается от стоимости у поставщика (usage.cost в ответе), см. Баланс и цены. Бесплатные модели и ошибки провайдеров описаны в разделах Чат и Повторы и сбои.