llm-stack.ru | API платформа

LLM Stack API

Создавайте AI-функции через OpenAI-совместимый API. LLM Stack API предоставляет простой интерфейс к языковым моделям для генерации текста, обработки естественного языка и многого другого. Если ваше приложение уже работает с OpenAI Chat Completions — обычно достаточно заменить API-ключ и base_url.

Генерация текста
Создавайте ответы модели из списка сообщений с помощью Chat Completions — основной эндпоинт для диалогов, генерации кода и анализа текста.
Streaming
Получайте ответ по мере генерации через stream: true — пользователи видят текст сразу, не дожидаясь полного ответа.
OpenAI SDK
Используйте официальные SDK для Python и JavaScript — просто укажите base_url и ваш API-ключ.
Usage и модели
Проверяйте доступные модели, лимиты и текущее использование через /v1/models и /v1/usage.

Доступные эндпоинты

Все эндпоинты следуют формату OpenAI API и доступны по базовому URL https://llm-stack.ru/v1.

ЭндпоинтМетодОписание
/v1/chat/completionsPOSTСгенерировать ответ модели на основе списка сообщений
/v1/modelsGETПолучить список моделей, доступных вашему API-ключу
/v1/usageGETПроверить текущее использование и лимиты по API-ключу

Быстрый старт

Начните работу с LLM Stack API за три шага: получите ключ, установите SDK, отправьте первый запрос.

Шаг 1. Получите API-ключ

API-ключ выглядит как llm_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx. Ключ можно получить через платформу, Telegram-бота или администратора платформы.

Храните API-ключ приватно. Не публикуйте его в публичных репозиториях, frontend-коде, мобильных приложениях и скриншотах. Любой, кто получит ваш ключ, сможет делать запросы от вашего имени.

Шаг 2. Установите OpenAI SDK

LLM Stack API совместим с официальными SDK OpenAI. Установите нужный пакет:

pip install openai
npm install openai

Шаг 3. Отправьте первый запрос

Создайте клиент, указав ваш API-ключ и base_url платформы, затем вызовите Chat Completions:

from openai import OpenAI # Инициализация клиента с вашим ключом и base_url платформы client = OpenAI( api_key="llm_your_key_here", base_url="https://llm-stack.ru/v1", ) # Отправка запроса к модели response = client.chat.completions.create( model="kimi-k2.6", messages=[ {"role": "user", "content": "Привет! Объясни, что такое API простыми словами."} ], ) # Вывод ответа модели print(response.choices[0].message.content)
import OpenAI from "openai"; // Инициализация клиента с вашим ключом и base_url платформы const client = new OpenAI({ apiKey: "llm_your_key_here", baseURL: "https://llm-stack.ru/v1", }); // Отправка запроса к модели const response = await client.chat.completions.create({ model: "kimi-k2.6", messages: [ { role: "user", content: "Привет! Объясни, что такое API простыми словами." }, ], }); // Вывод ответа модели console.log(response.choices[0].message.content);
curl https://llm-stack.ru/v1/chat/completions \ -H "Authorization: Bearer llm_your_key_here" \ -H "Content-Type: application/json" \ -d '{ "model": "kimi-k2.6", "messages": [ { "role": "user", "content": "Привет! Объясни, что такое API простыми словами." } ] }'
Если вы уже используете OpenAI API в своём проекте, просто замените api_key на ключ LLM Stack и добавьте base_url="https://llm-stack.ru/v1" — остальной код останется без изменений.

Авторизация

Все запросы к LLM Stack API требуют авторизации. Передавайте API-ключ в заголовке Authorization с префиксом Bearer:

httpзаголовок авторизации
Authorization: Bearer llm_your_key_here

При использовании OpenAI SDK ключ передаётся автоматически — укажите его как api_key в Python или apiKey в JavaScript при инициализации клиента.

Если ключ отсутствует, неверен, отключён или не имеет доступа к выбранной модели — API вернёт ошибку 401 или 403.

Chat Completions

Chat Completions — основной эндпоинт для генерации текста. Вы отправляете список сообщений (историю диалога), а модель возвращает свой ответ. Поддерживаются системные инструкции, многоходовые диалоги и управление параметрами генерации.

httpэндпоинт
POST https://llm-stack.ru/v1/chat/completions

Структура запроса

Запрос содержит модель, список сообщений и опциональные параметры генерации. Ниже — пример типичного запроса с системным промптом и сообщением пользователя:

jsonпример запроса
{ "model": "kimi-k2.6", "messages": [ { "role": "system", "content": "Ты полезный ассистент." }, { "role": "user", "content": "Напиши короткое описание продукта." } ], "temperature": 0.7, "max_tokens": 1000 }

Параметры запроса

Полный список параметров, принимаемых эндпоинтом:

ПараметрТипОбязательныйОписание
messagesarrayдаМассив сообщений диалога. Каждое сообщение содержит role и content
modelstringдаID модели. Список доступных моделей — через /v1/models
temperaturenumberнетОт 0 до 2. Управляет случайностью: ниже — предсказуемее, выше — креативнее
max_tokensintegerнетМаксимальное количество токенов в ответе
streambooleanнетВключает построковый streaming ответа через Server-Sent Events
top_pnumberнетNucleus sampling — альтернатива temperature для контроля разнообразия
frequency_penaltynumberнетОт -2 до 2. Штраф за повторение одинаковых токенов — выше значение, меньше повторов
presence_penaltynumberнетОт -2 до 2. Стимулирует модель обсуждать новые темы, а не повторять упомянутые

Роли сообщений

Каждое сообщение в массиве messages имеет роль, которая определяет его приоритет для модели:

РольОписание
systemИнструкции для ассистента — задают поведение, тон и формат ответа. Имеют наивысший приоритет
userСообщение пользователя — запрос или вопрос, на который модель должна ответить
assistantПредыдущий ответ ассистента — используется для многоходовых диалогов, чтобы модель помнила контекст
toolПринимается схемой запроса, но выполнение tools на стороне платформы пока не реализовано
Можно думать о system и user сообщениях как о функции и её аргументах: system задаёт логику и правила, а user — конкретные входные данные.

Структура ответа

Ответ содержит сгенерированный текст, информацию о модели и статистику использования токенов:

jsonпример ответа
{ "id": "chatcmpl-xxx", "object": "chat.completion", "created": 1710000000, "model": "kimi-k2.6", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "Конечно! Вот короткое описание..." }, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 25, "completion_tokens": 40, "total_tokens": 65 } }

Поле choices[0].message.content содержит текст ответа. finish_reason показывает, почему модель остановилась: stop — естественный конец, length — достигнут лимит max_tokens.

Streaming

Streaming позволяет показывать ответ по мере генерации, не дожидаясь полного завершения. Это особенно полезно для чат-интерфейсов — пользователь видит текст сразу, что значительно улучшает восприятие скорости.

Включается параметром stream: true в запросе. Ответ приходит частями через Server-Sent Events (SSE).

from openai import OpenAI client = OpenAI( api_key="llm_your_key_here", base_url="https://llm-stack.ru/v1", ) # Включаем streaming через stream=True stream = client.chat.completions.create( model="kimi-k2.6", messages=[ {"role": "user", "content": "Напиши короткий рассказ про космос."} ], stream=True, ) # Читаем чанки по мере поступления for chunk in stream: delta = chunk.choices[0].delta.content if delta: print(delta, end="", flush=True)
import OpenAI from "openai"; const client = new OpenAI({ apiKey: "llm_your_key_here", baseURL: "https://llm-stack.ru/v1", }); // Включаем streaming через stream: true const stream = await client.chat.completions.create({ model: "kimi-k2.6", messages: [ { role: "user", content: "Напиши короткий рассказ про космос." }, ], stream: true, }); // Читаем чанки по мере поступления for await (const chunk of stream) { const delta = chunk.choices?.[0]?.delta?.content; if (delta) process.stdout.write(delta); }
Каждый чанк содержит поле delta.content с фрагментом текста. Последний чанк имеет finish_reason: "stop" — это сигнал, что генерация завершена.

API моделей

Используйте Models API, чтобы узнать, какие модели доступны вашему API-ключу. Разные ключи могут иметь доступ к разным наборам моделей — этот эндпоинт возвращает только те, которые разрешены для вашего ключа.

httpэндпоинт
GET https://llm-stack.ru/v1/models
from openai import OpenAI client = OpenAI( api_key="llm_your_key_here", base_url="https://llm-stack.ru/v1", ) # Получаем список моделей, доступных этому ключу models = client.models.list() for model in models.data: print(model.id)
curl https://llm-stack.ru/v1/models \ -H "Authorization: Bearer llm_your_key_here"

Пример ответа

Ответ содержит массив моделей в формате, совместимом с OpenAI API:

jsonответ
{ "object": "list", "data": [ { "id": "kimi-k2.6", "object": "model", "created": 1710000000, "owned_by": "llm-stack" } ] }
Ответ содержит только модели, доступные вашему API-ключу. Если вы попытаетесь использовать модель, которой нет в этом списке, API вернёт ошибку 403.

API использования

Используйте Usage API, чтобы проверить текущее использование и лимиты по вашему API-ключу. Это полезно для отображения квоты в интерфейсе вашего приложения и для предотвращения превышения лимитов.

httpэндпоинт
GET https://llm-stack.ru/v1/usage
curlпроверить использование
curl https://llm-stack.ru/v1/usage \ -H "Authorization: Bearer llm_your_key_here"

Пример ответа

Ответ содержит статистику за сегодня и за текущий час, включая количество запросов, лимиты и использование токенов:

jsonответ
{ "key": "llm_your...", "today": { "requests": 45, "limit": 1000, "tokens": { "prompt": 12000, "completion": 8000, "total": 20000 } }, "this_hour": { "requests": 5, "limit": 100 }, "models": ["kimi-k2.6", "glm-5.1"] }

Поле models показывает, к каким моделям у ключа есть доступ. Сравните requests с limit, чтобы понять, сколько запросов осталось.

Лимиты

У API-ключа могут быть лимиты запросов. Они зависят от настроек ключа или тарифа. Превышение любого лимита приводит к ошибке 429 Too Many Requests.

Тип лимитаЗначениеОписание
На IP50 requests / minuteЗащита от DDoS — ограничение по IP-адресу клиента
На токеныЗависит от ключаБиллинг по токенам — лимит задаётся при создании ключа
Дневной лимит ключаЗависит от ключаМаксимальное количество запросов в сутки
Часовой лимит ключаЗависит от ключаМаксимальное количество запросов в час
При получении 429 реализуйте экспоненциальную задержку (exponential backoff): подождите 1 секунду, затем 2, 4, 8 — пока запрос не пройдёт.

Ошибки

Ошибки возвращаются в JSON-формате с полем detail, содержащим описание на русском языке. Ниже перечислены основные HTTP-коды и их значения.

КодЗначениеРекомендуемое действие
401API-ключ отсутствует или неверныйПроверьте ключ и заголовок Authorization
403Ключ отключён или модель недоступнаУбедитесь, что ключ активен и модель доступна через /v1/models
429Превышен лимит запросовПовторите запрос с задержкой (exponential backoff)
502Ошибка соединения с провайдеромВременная ошибка — повторите запрос
500Внутренняя ошибка сервераОшибка на нашей стороне — повторите позже

Примеры ошибок

401Неверный API-ключ
{ "detail": "Неверный API ключ" }
403Модель недоступна для ключа
{ "detail": "Model not available" }
429Превышен лимит запросов
{ "detail": "Слишком много запросов. Попробуйте позже." }

Совместимость с OpenAI SDK

LLM Stack API совместим с OpenAI SDK для Chat Completions. Это значит, что вы можете использовать привычные вызовы SDK, просто указав другой base_url:

textподдерживаемые вызовы
client.chat.completions.create(...) # генерация текста client.chat.completions.create(..., stream=True) # streaming client.models.list() # список моделей

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

Следующие функции OpenAI API сейчас недоступны в публичном API:

ФункцияОписание
Responses APIclient.responses.create(...)
Assistants APIУправляемые ассистенты
Realtime APIРеалтайм голос/текст
Files APIЗагрузка файлов
Vector stores / file searchПоиск по файлам
Embeddings APIВекторные представления
Images APIГенерация изображений
Audio transcriptionТранскрипция аудио
Batch APIПакетные запросы
Fine-tuningДообучение моделей
Built-in toolsВстроенные инструменты
Web searchВеб-поиск
Function callingВызов функций на стороне сервера
Если отправить неподдерживаемые поля, API может отклонить запрос.

Рекомендации

Следуйте этим практикам для надёжной и безопасной интеграции:

РекомендацияОписание
Храните ключи безопасноИспользуйте environment variables или secret manager. Никогда не хардкодьте ключи в исходном коде
Не раскрывайте ключи в браузереВызывайте API со своего backend, а не напрямую из frontend-кода
Используйте streaming для чатовПользователь увидит первый текст за доли секунды — интерфейс будет ощущаться значительно быстрее
Обрабатывайте 429При превышении лимита повторяйте запрос с экспоненциальной задержкой, а не сразу
Используйте /v1/modelsПроверяйте доступные модели перед выбором — набор может отличаться для разных ключей
Используйте /v1/usageПоказывайте пользователям их текущую квоту, чтобы они не столкнулись с неожиданным лимитом

Полные примеры

Ниже — готовые к запуску примеры чат-приложений, демонстрирующие основные возможности API: инициализацию клиента, системный промпт, многоходовый диалог с сохранением контекста и обработку ответа.

Консольный чат-бот

Готовый к запуску пример интерактивного чата. История сообщений сохраняется между ходами, чтобы модель помнила контекст диалога:

from openai import OpenAI # Инициализация клиента client = OpenAI( api_key="llm_your_key_here", base_url="https://llm-stack.ru/v1", ) # Системный промпт задаёт поведение ассистента messages = [ {"role": "system", "content": "Ты полезный ассистент. Отвечай кратко и понятно."} ] while True: user_input = input("You: ") if user_input.lower() in {"exit", "quit"}: break # Добавляем сообщение пользователя в историю messages.append({"role": "user", "content": user_input}) # Отправляем всю историю диалога в API response = client.chat.completions.create( model="kimi-k2.6", messages=messages, temperature=0.7, ) answer = response.choices[0].message.content # Сохраняем ответ ассистента для контекста следующих ходов messages.append({"role": "assistant", "content": answer}) print("AI:", answer)
import OpenAI from "openai"; import readline from "node:readline/promises"; import { stdin as input, stdout as output } from "node:process"; // Инициализация клиента const client = new OpenAI({ apiKey: "llm_your_key_here", baseURL: "https://llm-stack.ru/v1", }); const rl = readline.createInterface({ input, output }); // Системный промпт задаёт поведение ассистента const messages = [ { role: "system", content: "Ты полезный ассистент. Отвечай кратко и понятно." }, ]; while (true) { const userInput = await rl.question("You: "); if (["exit", "quit"].includes(userInput.toLowerCase())) { break; } // Добавляем сообщение пользователя в историю messages.push({ role: "user", content: userInput }); // Отправляем всю историю диалога в API const response = await client.chat.completions.create({ model: "kimi-k2.6", messages, temperature: 0.7, }); const answer = response.choices[0].message.content; // Сохраняем ответ ассистента для контекста следующих ходов messages.push({ role: "assistant", content: answer }); console.log("AI:", answer); } rl.close();

Подключение OpenCode

OpenCode — AI-агент для разработки. Подключите LLM Stack как провайдера одной командой — скрипт автоматически запросит список доступных моделей по вашему ключу и сгенерирует полный конфиг с reasoning_effort.

Автоматическая установка

Замените YOUR_API_KEY на ваш ключ из платформы.

bash <(curl -fsSL https://llm-stack.ru/install.sh) YOUR_API_KEY
$env:LLMSTACK_API_KEY='YOUR_API_KEY'; iex (irm https://llm-stack.ru/install.ps1)
powershell -Command "$env:LLMSTACK_API_KEY='YOUR_API_KEY'; iex (irm https://llm-stack.ru/install.ps1)"
Скрипт запрашивает GET /v1/models по вашему ключу и генерирует opencode.json со всеми доступными вам моделями, включая варианты reasoning_effort (low / medium / high / xhigh / max). Ничего не нужно прописывать вручную.

Ручная настройка

Добавьте в ~/.config/opencode/opencode.json:

mkdir -p ~/.config/opencode && cat > ~/.config/opencode/opencode.json << 'EOF' { "provider": { "llmstack": { "npm": "@ai-sdk/openai-compatible", "name": "LLM Stack", "options": { "baseURL": "https://llm-stack.ru/v1", "apiKey": "YOUR_API_KEY" } } } } EOF
New-Item -ItemType Directory -Force -Path "$env:USERPROFILE\.config\opencode" | Out-Null @' { "provider": { "llmstack": { "npm": "@ai-sdk/openai-compatible", "name": "LLM Stack", "options": { "baseURL": "https://llm-stack.ru/v1", "apiKey": "YOUR_API_KEY" } } } } '@ | Set-Content "$env:USERPROFILE\.config\opencode\opencode.json"
Создайте файл %USERPROFILE%\.config\opencode\opencode.json: { "provider": { "llmstack": { "npm": "@ai-sdk/openai-compatible", "name": "LLM Stack", "options": { "baseURL": "https://llm-stack.ru/v1", "apiKey": "YOUR_API_KEY" } } } }
После ручной настройки модели не будут перечислены в конфиге — OpenCode будет использовать ту, которую вы укажете через /model llmstack/<model-id>. Для автоматического списка используйте установочный скрипт выше.

Выбор модели

Запустите opencode и переключайте модель через /model. Модели, полученные через установочный скрипт, отображаются с префиксом llmstack/.

bashкоманды в OpenCode
/model # показать список моделей /model llmstack/gpt-5.6-sol # выбрать конкретную модель

Переменные окружения (без файла конфига)

Альтернативный способ — задать ключ и base URL через переменные окружения. Модели не будут автоматически перечислены — укажите нужную через /model.

export OPENAI_API_KEY="YOUR_API_KEY" export OPENAI_BASE_URL="https://llm-stack.ru/v1" opencode
$env:OPENAI_API_KEY='YOUR_API_KEY' $env:OPENAI_BASE_URL='https://llm-stack.ru/v1' opencode
set OPENAI_API_KEY=YOUR_API_KEY set OPENAI_BASE_URL=https://llm-stack.ru/v1 opencode
При использовании переменных окружения OpenCode подхватит провайдера автоматически — opencode.json не обязателен.