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-…
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
| model | string, обязательно | Модель из каталога действующей версии тарифа. |
| messages | array, обязательно | |
| max_tokens | integer | Предел ответа. Без него резерв считается по потолку вывода модели. |
| max_completion_tokens | integer | |
| stream | boolean | true — ответ text/event-stream (SSE). |
| tools | array | |
| provider | object | Поля 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-version | header | Передаётся модели как есть. |
| anthropic-beta | header | Передаётся модели как есть. |
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
| model | string, обязательно | Модель из каталога действующей версии тарифа. |
| max_tokens | integer, обязательно | Предел ответа, не больше потолка вывода модели в версии тарифа. |
| messages | array, обязательно | |
| system | string | array | |
| tools | array | |
| stream | boolean | |
| provider | object | Поля 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). |
| 402 | billing_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. |
| 429 | rate_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-…
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
| model | string, обязательно | Модель из каталога действующей версии тарифа. |
| input | string | array, обязательно | Вся история диалога: шлюз и поставщик ответы не хранят. |
| instructions | string | null | |
| max_output_tokens | integer | Предел ответа вместе с рассуждениями. Без него резерв считается по потолку вывода модели. |
| stream | boolean | true — ответ text/event-stream (SSE). |
| tools | array | Только type function и custom. |
| store | boolean | null | true — 400: ответы не хранятся. |
| previous_response_id | null | Не null — 400: передавай всю историю в input. |
| provider | object | Поля 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 — у пробного ключа не прочитан счётчик частоты или выключатели пробы, запрос к модели не отправлен; остальные коды — поставщик модели или конфигурация шлюза. |