Konductor

API Konductor

Справочник собирается из файла OpenAPI 3.1 — openapi.json. Ключ компании подставь в переменную KONDUCTOR_KEY.

POST /v1/chat/completions

Ответ модели на диалог (со стримом и без)

Перед отправкой модели шлюз резервирует деньги: оценка входа × цена входа + max_tokens × цена выхода (без max_tokens — потолок вывода модели). После ответа резерв закрывается и списывается факт по usage. Не хватает доступного баланса на резерв — 402. Модель вне политики компании или ключа (allowed_models) — 403 model_not_allowed до резерва, деньги не трогаются. Пробный ключ: модель из списка запрета пробы — 403 model_not_in_trial до резерва; больше trial_rate_per_minute запросов в минуту на пробный кошелёк — 429 rate_limit_exceeded с limit_scope trial. С stream: true ответ — text/event-stream: чанки chat.completion.chunk и комментарии поставщика (: OPENROUTER PROCESSING) как есть, последний чанк несёт usage с cost_rub, затем data: [DONE]; списание — по usage этого чанка. Ошибки до первого байта (402, 429, отказ поставщика) — обычный JSON без стрима. Стрим — не дольше 900 с и без тишины поставщика дольше 290 с. Стрим, оборванный до usage-чанка или закрытый клиентом, — резерв ждёт сверки с поставщиком; клиенту на связи приходит чанк {error: {code: upstream_unknown, reservation_id}}. Чанк ошибки поставщика (error, finish_reason: error) пересылается как есть.

Авторизация

  • Ключ компании: Authorization: Bearer sk-kz-…

Тело запроса

ПолеТипОписание
modelstring, обязательноМодель из каталога действующей версии тарифа.
messagesarray, обязательно
max_tokensintegerПредел ответа. Без него резерв считается по потолку вывода модели.
max_completion_tokensinteger
streambooleantrue — ответ text/event-stream (SSE).
toolsarray
providerobjectПоля data_collection, allow_fallbacks и max_price задаёт шлюз; only — поставщики модели из каталога, клиентский only не действует.

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

curl -X POST https://llm.kodzavod.ru/v1/chat/completions \
  -H "Authorization: Bearer $KONDUCTOR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "<model-id>",
    "messages": [
      {
        "role": "user",
        "content": "Привет!"
      }
    ],
    "max_tokens": 256
  }'

Ответы

КодЧто значит
200Ответ модели; usage.cost_rub — списано с баланса, ₽. Со стримом — text/event-stream: чанки chat.completion.chunk, usage-чанк с usage.cost_rub, data: [DONE].
400Неверный запрос.
401Ключ не передан, неверный или отозван.
402Доступного баланса недостаточно для резерва запроса (insufficient_balance) или резерв выходит за лимит ключа или компании (key_limit_exceeded, company_limit_exceeded).
403Ключ на паузе или заблокирован, компания заблокирована, модель закрыта политикой компании или ключа (model_not_allowed).
413Неверный запрос.
429Превышен лимит запросов в минуту ключа или компании.
500Ошибка шлюза или модели.
502Ошибка шлюза или модели.
503Шлюз временно не принимает запросы. service_unavailable — шлюз не прочитал ключ, аварийный стоп или счётчик частоты из базы, запрос не принят; повтори через Retry-After; gateway_stopped — включён аварийный стоп; trial_unavailable — у пробного ключа не прочитан счётчик частоты или выключатели пробы, запрос к модели не отправлен; остальные коды — поставщик модели или конфигурация шлюза.

GET /v1/key

Статус ключа, его лимит и остаток

Ключ компании — в Authorization: Bearer или x-api-key (как у /v1/messages); разные ключи в двух заголовках — 401. Отвечает только активному ключу. Расход окна считается так же, как проверка лимита перед резервом: списания за окно плюс деньги в резерве незавершённых запросов. Баланс кошелька и лимит компании — в поле company, только если компания разрешила ключам их видеть; иначе company — null. Запрос не резервирует деньги, не пишется в журнал запросов и не расходует лимит запросов в минуту.

Авторизация

  • Ключ компании: Authorization: Bearer sk-kz-…
  • Ключ компании для Anthropic SDK: x-api-key: sk-kz-…

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

curl -X GET https://llm.kodzavod.ru/v1/key \
  -H "Authorization: Bearer $KONDUCTOR_KEY"

Ответы

КодЧто значит
200Ключ и его лимит; деньги — копейки строкой.
401Ключ не передан, неверный или отозван.
403Ключ на паузе или заблокирован, компания заблокирована, модель закрыта политикой компании или ключа (model_not_allowed).
500Ошибка шлюза или модели.
503Шлюз временно не принимает запросы. service_unavailable — шлюз не прочитал ключ, аварийный стоп или счётчик частоты из базы, запрос не принят; повтори через Retry-After; gateway_stopped — включён аварийный стоп; trial_unavailable — у пробного ключа не прочитан счётчик частоты или выключатели пробы, запрос к модели не отправлен; остальные коды — поставщик модели или конфигурация шлюза.

POST /v1/messages

Ответ модели в формате Anthropic Messages (со стримом и без)

Совместим с Anthropic SDK и Claude Code: base URL https://llm.kodzavod.ru, ключ компании в x-api-key или Authorization: Bearer. Заголовки anthropic-version и anthropic-beta передаются модели. Модели передаются только поля messages, system, tools, tool_choice, temperature, top_p, top_k, stop_sequences, thinking; остальные (metadata, service_tier, mcp_servers, container …) отбрасываются. Серверные инструменты Anthropic (tools с type, кроме custom) — 400: их цена не входит в резерв. В content сообщений принимаются блоки text, tool_use, tool_result (content строкой или text-блоками), thinking и redacted_thinking; system — строкой или text-блоками. image, document и любой другой тип блока, в том числе внутри tool_result и в system, — 400 invalid_request_error с code unsupported_content_part и param до резерва. Перед отправкой шлюз резервирует деньги: оценка входа (system, messages, tools и служебный промпт инструментов) × цена входа + max_tokens × цена выхода; после ответа резерв закрывается и списывается факт по usage (в стриме — накопительный usage из message_delta; токены записи и чтения кэша оплачиваются по цене входа). Не хватает доступного баланса на резерв — 402 billing_error (code insufficient_balance); резерв выходит за лимит ключа или компании — 402 billing_error (code key_limit_exceeded / company_limit_exceeded); превышен лимит запросов в минуту — 429 rate_limit_error (code rate_limit_exceeded). Ошибки — в формате Anthropic: {type: 'error', error: {type, message, code}}. Стрим, оборванный до message_stop, завершается событием error с code upstream_unknown: резерв ждёт сверки с поставщиком. Модель вне политики компании или ключа (allowed_models) — 403 permission_error (code model_not_allowed) до резерва, деньги не трогаются. Пробный ключ: модель из списка запрета пробы — 403 permission_error (code model_not_in_trial); больше trial_rate_per_minute запросов в минуту на пробный кошелёк — 429 rate_limit_error с limit_scope trial.

Авторизация

  • Ключ компании для Anthropic SDK: x-api-key: sk-kz-…
  • Ключ компании: Authorization: Bearer sk-kz-…

Заголовки и параметры

ИмяГдеОписание
anthropic-versionheaderПередаётся модели как есть.
anthropic-betaheaderПередаётся модели как есть.

Тело запроса

ПолеТипОписание
modelstring, обязательноМодель из каталога действующей версии тарифа.
max_tokensinteger, обязательноПредел ответа, не больше потолка вывода модели в версии тарифа.
messagesarray, обязательно
systemstring | array
toolsarray
streamboolean
providerobjectПоля data_collection, allow_fallbacks и max_price задаёт шлюз; only — поставщики модели из каталога, клиентский only не действует.

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

curl -X POST https://llm.kodzavod.ru/v1/messages \
  -H "x-api-key: $KONDUCTOR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "<model-id>",
    "max_tokens": 256,
    "messages": [
      {
        "role": "user",
        "content": "Привет!"
      }
    ]
  }'

Ответы

КодЧто значит
200Ответ модели. Без стрима — объект Message, usage.cost_rub — списано с баланса, ₽. Со стримом — text/event-stream: message_start … message_stop; message_delta несёт usage.cost_rub по накопительному usage.
400Неверный запрос: invalid_request_error (в том числе code unsupported_content_part — блок content, который шлюз не оценивает) или request_too_large.
401Ключ не передан, неверный, отозван или в x-api-key и Authorization разные ключи (authentication_error).
402billing_error: доступного баланса недостаточно для резерва запроса (code insufficient_balance) или резерв выходит за лимит ключа или компании (code key_limit_exceeded, company_limit_exceeded).
403Ключ на паузе или заблокирован, компания заблокирована, модель закрыта политикой компании или ключа — model_not_allowed (permission_error).
413Неверный запрос: invalid_request_error (в том числе code unsupported_content_part — блок content, который шлюз не оценивает) или request_too_large.
429rate_limit_error: превышен лимит запросов в минуту ключа или компании (code rate_limit_exceeded).
500Ошибка шлюза или модели (api_error, overloaded_error).
502Ошибка шлюза или модели (api_error, overloaded_error).
503Шлюз временно не принимает запросы (api_error; при перегрузке поставщика — overloaded_error). service_unavailable — шлюз не прочитал ключ, аварийный стоп или счётчик частоты из базы, запрос не принят; повтори через Retry-After; gateway_stopped — включён аварийный стоп; trial_unavailable — у пробного ключа не прочитан счётчик частоты или выключатели пробы, запрос к модели не отправлен; остальные коды — поставщик модели или конфигурация шлюза.

POST /v1/responses

Ответ модели в формате OpenAI Responses без хранения ответов (со стримом и без)

Ответы не хранятся ни у шлюза, ни у поставщика: передавай всю историю диалога в input каждого запроса. previous_response_id (не null), store: true, background: true и conversation — 400 invalid_request с param до резерва, деньги не резервируются. Модели передаются только поля input, instructions, tools, tool_choice, parallel_tool_calls, temperature, top_p, top_logprobs, frequency_penalty, presence_penalty, text; остальные (reasoning, include, metadata, plugins, models, service_tier, prompt …) отбрасываются. Инструменты — только type function и custom; остальные (web_search_preview, file_search, code_interpreter, mcp, openrouter:* …) — 400: их цена не входит в резерв. В input принимаются строка и элементы message (части input_text, output_text, refusal), function_call, function_call_output, custom_tool_call, custom_tool_call_output, reasoning; input_image, input_file, item_reference и любой другой тип — 400 unsupported_content_part с param до резерва. Перед отправкой шлюз резервирует деньги: оценка входа (instructions, input, tools) × цена входа + max_output_tokens × цена выхода (без max_output_tokens — потолок вывода модели). После ответа резерв закрывается и списывается факт по usage: input_tokens по цене входа (кэш внутри), output_tokens по цене выхода (рассуждения внутри). Не хватает доступного баланса на резерв — 402. Со stream: true — text/event-stream: события response.created … response.completed как есть; response.completed (или response.incomplete, response.failed) несёт usage с cost_rub, списание — по нему. Ошибки до первого байта — обычный JSON без стрима. Стрим — не дольше 900 с и без тишины поставщика дольше 290 с. Стрим без response.completed или закрытый клиентом — резерв ждёт сверки с поставщиком; клиенту на связи приходит event: error с code upstream_unknown и reservation_id. Модель вне политики компании или ключа (allowed_models) — 403 model_not_allowed до резерва, деньги не трогаются. Пробный ключ: модель из списка запрета пробы — 403 model_not_in_trial до резерва; больше trial_rate_per_minute запросов в минуту на пробный кошелёк — 429 rate_limit_exceeded с limit_scope trial.

Авторизация

  • Ключ компании: Authorization: Bearer sk-kz-…

Тело запроса

ПолеТипОписание
modelstring, обязательноМодель из каталога действующей версии тарифа.
inputstring | array, обязательноВся история диалога: шлюз и поставщик ответы не хранят.
instructionsstring | null
max_output_tokensintegerПредел ответа вместе с рассуждениями. Без него резерв считается по потолку вывода модели.
streambooleantrue — ответ text/event-stream (SSE).
toolsarrayТолько type function и custom.
storeboolean | nulltrue — 400: ответы не хранятся.
previous_response_idnullНе null — 400: передавай всю историю в input.
providerobjectПоля data_collection, allow_fallbacks и max_price задаёт шлюз; only — поставщики модели из каталога, клиентский only не действует.

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

curl -X POST https://llm.kodzavod.ru/v1/responses \
  -H "Authorization: Bearer $KONDUCTOR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "<model>",
    "input": "<input>"
  }'

Ответы

КодЧто значит
200Ответ модели. Без стрима — объект response, usage.cost_rub — списано с баланса, ₽. Со стримом — text/event-stream: response.created … response.completed; usage.cost_rub — в response.completed.
400Неверный запрос. previous_response_id, store: true, background: true или conversation — code invalid_request, param с именем поля и текст «Передавай всю историю в запросе: сохранение ответов не поддерживается.»; деньги не резервируются.
401Ключ не передан, неверный или отозван.
402Доступного баланса недостаточно для резерва запроса (insufficient_balance) или резерв выходит за лимит ключа или компании (key_limit_exceeded, company_limit_exceeded).
403Ключ на паузе или заблокирован, компания заблокирована, модель закрыта политикой компании или ключа (model_not_allowed).
413Неверный запрос.
429Превышен лимит запросов в минуту ключа или компании.
500Ошибка шлюза или модели.
502Ошибка шлюза или модели.
503Шлюз временно не принимает запросы. service_unavailable — шлюз не прочитал ключ, аварийный стоп или счётчик частоты из базы, запрос не принят; повтори через Retry-After; gateway_stopped — включён аварийный стоп; trial_unavailable — у пробного ключа не прочитан счётчик частоты или выключатели пробы, запрос к модели не отправлен; остальные коды — поставщик модели или конфигурация шлюза.

GET /v1/models

Каталог моделей действующей версии тарифа

Без ключа — публично: весь каталог, лимит 60 запросов в минуту с одного IP на каждом экземпляре шлюза (при N экземплярах — до N × 60), CORS только для https://kodzavod.ru. С ключом компании — та же форма ответа, но в data только модели, разрешённые политиками компании и ключа (allowed_models; без политик — весь каталог; у пробного ключа — без моделей из списка запрета пробы), и тот же вход, что у /v1/chat/completions: лимит запросов в минуту ключа и компании (429 rate_limit_exceeded), 503 service_unavailable и gateway_stopped; анонимный лимит не применяется. Цены — рубли за миллион токенов, подпись НДС — price_version.vat_label. availability и p50_24h — за 24 ч, null при меньше чем 20 запросах; пересчёт не чаще раза в 60 с.

Авторизация

  • Ключ компании: Authorization: Bearer sk-kz-…

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

curl -X GET https://llm.kodzavod.ru/v1/models \
  -H "Authorization: Bearer $KONDUCTOR_KEY"

Ответы

КодЧто значит
200Каталог действующей версии тарифа.
401Ключ не передан, неверный или отозван.
403Ключ на паузе или заблокирован, компания заблокирована, модель закрыта политикой компании или ключа (model_not_allowed).
429Без ключа — анонимный лимит по IP (code rate_limited); с ключом — лимит частоты ключа или компании (code rate_limit_exceeded).
500Ошибка шлюза или модели.
503Шлюз временно не принимает запросы. service_unavailable — шлюз не прочитал ключ, аварийный стоп или счётчик частоты из базы, запрос не принят; повтори через Retry-After; gateway_stopped — включён аварийный стоп; trial_unavailable — у пробного ключа не прочитан счётчик частоты или выключатели пробы, запрос к модели не отправлен; остальные коды — поставщик модели или конфигурация шлюза.