LLM Engine

Provision LLM Engine

Языковые модели Llama 3, Qwen, Mistral и другие — в вашем периметре. Совместимый с OpenAI API интерфейс. Данные не покидают инфраструктуру. Скорость в 3–5× выше облачных API.

Инструкция по установке

Выберите платформу для пошаговой инструкции.

⚠️ Лицензионные и технические ограничения триальной версии

Trial-версия Provision OCR предназначена для ознакомления и тестирования. Ограничения: макс. 100 страниц/день, водяной знак в ответе, отсутствует техподдержка.
📄 Полный документ с ограничениями (PDF)

🪟 Windows

Установка

Скачайте архив: provision_llm_trial.exe
Разархивируйте скачанный файл
Запустите: ProvisionLLMEngine-Setup.exe
В открывшемся окне выберите: язык и путь для установки файла
Из папки, в которой установлен LLM Engine, запустите файл ProvisionLLMEngine.bat
В открывшемся консольном окне дождитесь загрузки компонентов
В поле WebUI / API будет указан URL для API
CUDA на Windows: убедитесь, что установлен CUDA Toolkit 11.8+ и драйвер NVIDIA ≥ 520.

🐧 Linux

В разработке. Нативный Linux-пакет находится в разработке. Для Linux рекомендуется использовать Docker-образ.

🐳 Docker

Shell
# Скачайте docker образ:
docker pull registry.provlabs.tech/hub/trial/provision_llm:latest
Shell
# Запустите контейнер:
docker run --rm -it registry.provlabs.tech/hub/trial/provision_llm:latest
После успешного старта сервис доступен по адресам:
  • API: http://localhost:8080/
  • Swagger UI: http://localhost:8080/docs
  • Health check: http://localhost:8080/health

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

Provision LLM Engine оптимизирован для GPU с 12+ GB VRAM. Запуск на CPU также поддерживается, но значительно медленнее.

GPU

Вендор Серия VRAM (мин.) Бэкенд Статус
NVIDIA RTX 3060 / 4060 / 4070 12 GB CUDA 11.8+ Рекомендуется
NVIDIA RTX 4070 Ti / 4080 / 4090 12 GB CUDA 12.x Рекомендуется
NVIDIA A10 / A100 / H100 / L40 16 GB CUDA 12.x Протестировано
AMD RX 6800 / 6900 / 7900 XT 12 GB ROCm 5.6+ Экспериментально
Apple M1 / M2 / M3 / M4 16 GB unified Metal / MLX Протестировано
CPU only Любой x86_64 / ARM64 Медленнее

Операционные системы

ОС Архитектура RAM (мин.) Статус
Ubuntu 20.04 / 22.04 / 24.04 x86_64, ARM64 32 GB Рекомендуется
Debian 11 / 12 x86_64 32 GB Протестировано
Windows 10 / 11 x86_64 32 GB Протестировано
macOS 13+ (Ventura) ARM64 (Apple Silicon) 32 GB Протестировано
Docker (Linux образ) x86_64 32 GB Рекомендуется
Внимание: для 7B-модели в Q4_K_M требуется ~5–6 GB VRAM; для 13B — не менее 10 GB. Рекомендуется GPU с ≥ 12 GB VRAM.

API Reference

Base URL: http://localhost:8080. Совместим с OpenAI API и Anthropic API. Аутентификация — заголовок Authorization: Bearer <token> или x-api-key: <token>.

Health

GET /health Проверка готовности сервера. Без аутентификации. Алиас: /v1/health
Response 200
{ "status": "ok" }
Response 503 — модель загружается
{
  "error": {
    "code": 503,
    "message": "Loading model",
    "type": "unavailable_error"
  }
}

Инференс

POST /completion Генерация текста по промпту. Не совместим с OpenAI — используйте /v1/completions для OAI-клиентов
promptstring / array / objectПромпт: строка, массив токенов или мультимодальный объект required
n_predictintМаксимум токенов для генерации. -1 = без ограничения
temperaturefloatСлучайность генерации (по умолчанию: 0.8)
streambooleanПотоковая передача токенов через SSE
stoparrayМассив стоп-строк
json_schemaobjectJSON-схема для ограничения формата ответа
grammarstringBNF-подобная грамматика для ограничения генерации
return_tokensbooleanВернуть сырые ID токенов
loraarrayКонфигурация LoRA на запрос: [{"id": 0, "scale": 0.5}]
Response 200
{
  "content": "Сгенерированный текст...",
  "stop": true,
  "stop_type": "eos",
  "model": "my-model",
  "tokens_evaluated": 12,
  "tokens_cached": 0,
  "truncated": false,
  "timings": { "predicted_per_second": 42.5 }
}
POST /infill Fill-in-the-Middle (FIM): генерация кода между префиксом и суффиксом
input_prefixstringКод до курсора required
input_suffixstringКод после курсора required
input_extraarrayДоп. контекст: [{"filename": "...", "text": "..."}]
promptstringДобавляется после токена FIM_MID

Принимает все параметры /completion. Ответ аналогичен.

Embeddings и ранжирование

POST /embedding Генерация эмбеддинга для текста. Для OAI-клиентов используйте /v1/embeddings
contentstringТекст для эмбеддинга required
embd_normalizeintНормализация: -1=нет, 0=max_abs, 1=taxicab, 2=L2 (по умолчанию)
Response 200
{ "embedding": [0.12, -0.34, 0.56] }
POST /embeddings Поддерживает все типы пулинга, включая none (эмбеддинги на каждый токен)
inputstring / arrayОдин текст или массив текстов required
POST /reranking Ранжирование документов по запросу. Алиасы: /rerank, /v1/rerank, /v1/reranking
querystringЗапрос для ранжирования required
documentsarrayСписок документов required
top_nintВернуть только топ N результатов

Утилиты

POST /tokenize Токенизация текста
contentstringТекст для токенизации required
add_specialbooleanДобавить специальные токены (BOS и др.), по умолчанию: false
with_piecesbooleanВозвращать текстовые куски токенов вместе с ID, по умолчанию: false
Response 200
{ "tokens": [1234, 5678, 910] }

// с with_pieces: true
{ "tokens": [{"id": 1234, "piece": "Hello"}, {"id": 5678, "piece": " world"}] }
POST /detokenize Преобразование массива ID токенов обратно в текст
tokensarrayМассив ID токенов required
Response 200
{ "content": "Hello world" }
POST /apply-template Форматирует сообщения чата с шаблоном модели без запуска инференса
messagesarrayСообщения в формате /v1/chat/completions required
Response 200
{ "prompt": "<|system|>...<|user|>Привет<|assistant|>" }

Управление сервером

GET /props Глобальные свойства сервера: параметры генерации, путь к модели, chat template
POST /props Изменение глобальных свойств сервера. Требует флага --props
GET /slots Состояние всех слотов обработки. Требует --slots (включено по умолчанию)
POST /slots/{id_slot} Управление KV-кэшем слота. Параметр action: save / restore / erase
GET /metrics Метрики в формате Prometheus. Требует флага --metrics

LoRA-адаптеры

GET /lora-adapters Список загруженных LoRA-адаптеров с ID и текущим масштабом
Response 200
[{ "id": 0, "path": "/models/lora_a.gguf", "scale": 0.5 }]
POST /lora-adapters Установить масштаб LoRA-адаптеров. Адаптеры вне списка получают scale = 0.0
Request Body
[{ "id": 0, "scale": 0.2 }, { "id": 1, "scale": 0.8 }]

OpenAI-совместимые

GET /v1/models Список загруженных моделей
Response 200
{
  "object": "list",
  "data": [
    { "id": "my-model", "object": "model", "created": 1700000000, "owned_by": "Provision LLM" }
  ]
}
POST /v1/completions OpenAI-совместимый completions. Обязательные поля: model, prompt
POST /v1/chat/completions OpenAI-совместимый chat completions. Поддерживает streaming, tool calls, мультимодальный ввод
modelstringИмя модели required
messagesarrayМассив { role, content } required
max_tokensintegerМаксимум токенов
temperaturefloatТемпература (0.0–2.0)
streambooleanSSE стриминг
toolsarrayИнструменты (требует --jinja)
json_schemaobjectJSON-схема для ограничения формата ответа
reasoning_formatstringnone | deepseek | deepseek-legacy
POST /v1/embeddings OpenAI-совместимые embeddings. Возвращает L2-нормализованные эмбеддинги
inputstring / arrayОдин текст или массив required
modelstringИмя модели required
encoding_formatstringfloat (по умолчанию) | base64
POST /v1/responses OpenAI Responses API. Внутри конвертируется в Chat Completions

Anthropic-совместимые

POST /v1/messages Anthropic Messages API. Поддерживает streaming (SSE). Tool use требует --jinja
modelstringИмя модели required
messagesarrayСообщения [{"role": "user"/"assistant", "content": "..."}] required
max_tokensintМаксимум токенов в ответе (по умолчанию: 4096) required
systemstring / arrayСистемный промпт
temperaturefloatТемпература 0–1 (по умолчанию: 1.0)
streambooleanПотоковый вывод через SSE
toolsarrayСписок инструментов
stop_sequencesarrayСтоп-последовательности
POST /v1/messages/count_tokens Подсчёт токенов запроса без генерации
Response 200
{ "input_tokens": 42 }

Router (мульти-модель)

GET /models Список всех доступных моделей в router-режиме
modelstring (query)Фильтр по имени модели
reloadint (query)1 — обновить список моделей
POST /models/load Загрузить модель в router-режиме
Request Body
{ "model": "ggml-org/gemma-3-4b-it-GGUF:Q4_K_M" }
POST /models/unload Выгрузить модель в router-режиме
Request Body
{ "model": "ggml-org/gemma-3-4b-it-GGUF:Q4_K_M" }

🎚Параметры сэмплинга

Применяются в /completion, /infill и через chat_template_kwargs в OAI-эндпоинтах.

Основные

Параметр По умолчанию Описание
temperature 0.8 Случайность генерации
top_k 40 Top-k сэмплинг. 0 = отключено
top_p 0.95 Top-p (nucleus) сэмплинг. 1.0 = отключено
min_p 0.05 Min-p сэмплинг. 0.0 = отключено
n_predict -1 Максимум токенов. -1 = без ограничения
seed -1 Зерно RNG. -1 = случайное
stream false Потоковая передача токенов через SSE
stop [] Массив стоп-строк
cache_prompt true Переиспользовать KV-кэш от предыдущего запроса

Штрафы за повторения

Параметр По умолчанию Описание
repeat_penalty 1.1 Штраф за повторяющиеся токены
repeat_last_n 64 Токенов для анализа. 0=откл, -1=весь контекст
presence_penalty 0.0 Штраф за присутствие токена
frequency_penalty 0.0 Штраф по частоте токена

Прочие

Параметр По умолчанию Описание
mirostat 0 Режим Mirostat: 0=откл, 1=Mirostat, 2=Mirostat 2.0
mirostat_tau 5.0 Целевая энтропия Mirostat
mirostat_eta 0.1 Скорость обучения Mirostat
grammar BNF-подобная грамматика для ограничения генерации
json_schema JSON-схема для ограничения формата ответа
n_probs 0 Возвращать топ-N вероятностей на каждый токен
lora LoRA на запрос: [{"id": 0, "scale": 0.5}]
ignore_eos false Игнорировать токен конца последовательности
timings_per_token false Включать скорость в каждый ответ (stream)

Примеры кода

Готовые сниппеты для работы с Provision LLM Engine API.

🐍 Python — OpenAI SDK

Python
from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:8080/v1",
    api_key="your-api-key",
)

response = client.chat.completions.create(
    model="my-model",
    messages=[
        {"role": "system", "content": "Ты полезный ассистент."},
        {"role": "user", "content": "Напиши Hello World на Python."},
    ],
    temperature=0.7,
    max_tokens=512,
)
print(response.choices[0].message.content)
Python
from openai import OpenAI

client = OpenAI(base_url="http://localhost:8080/v1", api_key="your-api-key")

stream = client.chat.completions.create(
    model="my-model",
    messages=[{"role": "user", "content": "Расскажи анекдот."}],
    stream=True,
)
for chunk in stream:
    print(chunk.choices[0].delta.content or "", end="", flush=True)
Python
from openai import OpenAI

client = OpenAI(base_url="http://localhost:8080/v1", api_key="your-api-key")

result = client.embeddings.create(
    model="my-model",
    input=["Первый текст", "Второй текст"],
)
for item in result.data:
    print(f"index={item.index}, dims={len(item.embedding)}")
Python
import requests, json

response = requests.post(
    "http://localhost:8080/completion",
    headers={"Authorization": "Bearer your-api-key"},
    json={
        "prompt": "Сгенерируй данные пользователя:",
        "json_schema": {
            "type": "object",
            "properties": {
                "name": {"type": "string"},
                "age":  {"type": "integer"},
                "email": {"type": "string"}
            },
            "required": ["name", "age", "email"]
        },
        "n_predict": 200,
    },
)
print(json.loads(response.json()["content"]))

🐍 Python — нативный /completion

Python
import requests

response = requests.post(
    "http://localhost:8080/completion",
    headers={"Authorization": "Bearer your-api-key"},
    json={
        "prompt": "Список планет Солнечной системы:",
        "n_predict": 200,
        "temperature": 0.5,
        "top_k": 40,
        "repeat_penalty": 1.1,
        "stop": ["\n\n"],
    },
)
print(response.json()["content"])

🐍 Python — Anthropic SDK

Python
import anthropic

client = anthropic.Anthropic(
    base_url="http://localhost:8080",
    api_key="your-api-key",
)

message = client.messages.create(
    model="my-model",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Объясни квантовую запутанность."}],
)
print(message.content[0].text)

⚡ curl

Bash — Health check
curl http://localhost:8080/health
Bash — Chat completions
curl http://localhost:8080/v1/chat/completions \
  -H "Authorization: Bearer your-api-key" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "my-model",
    "messages": [{"role": "user", "content": "Привет!"}],
    "temperature": 0.8
  }'
Bash — Токенизация
curl http://localhost:8080/tokenize \
  -H "Authorization: Bearer your-api-key" \
  -H "Content-Type: application/json" \
  -d '{"content": "Hello world", "with_pieces": true}'

FAQ / Поддержка

Ответы на часто задаваемые вопросы по Provision LLM Engine.

Какой минимальный объём VRAM для запуска LLM?
Для 7B-модели в квантизации Q4_K_M требуется около 5–6 GB VRAM. Рекомендуется GPU с 12 GB. Для 13B — не менее 10 GB. На CPU модель также запустится, но значительно медленнее.
Совместим ли LLM Engine с OpenAI SDK?
Да, API LLM Engine совместим с форматом OpenAI Chat Completions. Для миграции достаточно изменить base_url в клиенте на http://localhost:8080.
Как добавить свою модель?
Скопируйте файл модели в формате GGUF в директорию models/ и укажите путь в конфиге provision.yml. LLM Engine автоматически обнаружит и зарегистрирует модель при перезапуске.
Поддерживается ли WSL2?
Да. Установите Provision LLM в WSL2 как на Linux. GPU-проброс через NVIDIA CUDA поддерживается с драйвера 525+.
Как сообщить об ошибке?
Создайте issue на GitHub или напишите на help@provisionlabs.ru. Для срочных вопросов — Telegram-канал поддержки.