Развёртывание OpenAI-совместимого эндпоинта
Запустить движок один раз и говорить с ним в чат-окне — игрушка. Развернуть его по HTTP в форме, на которой все уже говорят, — инфраструктура: редакторы, UI, агенты и ваши скрипты могут все вести одну и ту же локальную модель. Эта страница поднимает локальный эндпоинт, затем покрывает стриминг, SDK, безопасность и тёплую загрузку.
Почему победила форма OpenAI
Формат запроса chat-completions — имя модели, список сообщений {role, content}, несколько ручек — стал стандартом де-факто, потому что каждый автор инструментов первым написал под него клиент. Что бы вы ни думали о компании, форма нейтральна: это просто JSON поверх POST. Практическое следствие: любой локальный сервер, её имитирующий, мгновенно совместим с огромной кучей существующего софта. Ваш выбор движка и выбор клиента становятся независимыми решениями (см. движки).
llama-server за минуту
llama-server -m model.gguf -c 8192 --port 8080
# UI на http://127.0.0.1:8080 — API на /v1/chat/completions
Аннотированный запрос:
curl http://127.0.0.1:8080/v1/chat/completions -H "Content-Type: application/json" -d '{"model":"model","messages":[{"role":"user","content":"Why run local? One sentence."}],"temperature":0.7,"max_tokens":60}'
model— llama-server обслуживает то, что вы запустили; поле часто игнорируется, но шлите осмысленное имя.messages— весь разговор, системный промпт первым; сервер без состояния, историю держите вы.max_tokens— ограничьте ответ; защищает от убежавших генераций.
Ответ (урезанный) несёт ответ плюс токен-бухгалтерию, которая пригодится для бесплатной отладки:
{
"choices": [
{ "message": { "role": "assistant", "content": "No accounts, no rate limits, and your data never leaves the machine." } }
],
"usage": { "prompt_tokens": 14, "completion_tokens": 15 }
}
usage — способ узнать, что ваши промпты реально стоят в контексте: проверяйте его, прежде чем винить модель в «забывании» (см. токены).
Стриминг
Добавьте "stream": true, и сервер переключается на server-sent events: чанки data:, разделённые переводами строк, каждый несёт маленькую дельту, завершается сентинелом.
data: {"choices":[{"delta":{"content":"No "}}]}
data: {"choices":[{"delta":{"content":"accounts"}}]}
data: [DONE]
На клиенте: накапливайте delta.content до строки [DONE]. Стриминг не делает генерацию быстрее — он делает ожидание терпимым, что для чат-UX то же самое (см. скорость).
Ollama: один сервис, два API
Нативный API Ollama чуть богаче — опции на запрос и управление жизненным циклом модели:
curl http://127.0.0.1:11434/api/chat -d '{"model":"qwen3:8b","messages":[{"role":"user","content":"hi"}],"stream":false,"keep_alive":-1}'
Он также обслуживает OpenAI-совместимый маршрут /v1/chat/completions, так что OpenAI-образные клиенты работают с Ollama без изменений. Используйте нативный API, когда нужны keep_alive или опции движка на запрос; /v1 — для всего остального.
vLLM для GPU-серверов
vllm serve Qwen/Qwen3-8B --max-model-len 16384 --port 8000
vLLM тянет веса safetensors, грузится один раз и обслуживает ту же форму OpenAI с непрерывным батчингом под капотом — правильный инструмент, как только появляются одновременные пользователи (см. параллелизм). Ей нужны NVIDIA VRAM и настоящая GPU; не возитесь с ней ради однопользовательского десктопа.
Направьте официальные SDK на localhost
Официальные библиотеки OpenAI — просто HTTP-клиенты; поменяйте base URL, и поле API-ключа становится декоративным:
from openai import OpenAI
client = OpenAI(base_url="http://127.0.0.1:8080/v1", api_key="local")
r = client.chat.completions.create(
model="qwen3-8b",
messages=[{"role": "user", "content": "Why run local?"}],
)
print(r.choices[0].message.content)
import OpenAI from "openai";
const client = new OpenAI({ baseURL: "http://127.0.0.1:11434/v1", apiKey: "ollama" });
const r = await client.chat.completions.create({
model: "qwen3:8b",
messages: [{ role: "user", content: "Why run local?" }],
});
Любая строка работает как ключ, если на сервере не настроена своя. Эта замена base-URL — весь трюк, стоящий за каждым инструментом «работает с локальными моделями».
Что это открывает
- Редакторы и чат-UI — см. UI и интеграции.
- Ваши собственные приложения: локальная модель за вашим бэкендом, ноль цены за токен.
- Скриптовые пайплайны с гарантированной схемой — см. структурированный вывод.
- Агентные циклы, вызывающие инструменты и итерирующие, — см. агенты.
- Игровой угол этого форума: агенты шахмат и джанги играют, ударяя по локальному chat-completions-эндпоинту ровно как curl выше.
Закройте дверь
Сервер модели — бесплатный LLM для каждого, кто может достучаться до порта. Дефолты безопасны — llama-server и Ollama привязываются к 127.0.0.1 — держите так на ноутбуках. Чтобы открыть в LAN: поставьте API-ключ (--api-key на llama-server и vLLM, плюс авторизация в любом UI впереди) и предпочитайте реверс-прокси для TLS. Никогда не привязывайте 0.0.0.0 без аутентификации: любой в сети может сжечь вашу GPU, заполнить ваш контекст и прощупать ваш сетап.
Держите тёплой
Холодная загрузка — веса с диска в VRAM — стоит от секунд до десятков секунд TTFT. llama-server и vLLM грузятся при старте и остаются резидентными, платит только первый запрос. Ollama выгружает после keep_alive (по умолчанию ~5 минут): шлите "keep_alive": -1, чтобы держать модель бесконечно, или 0, чтобы освободить VRAM сразу после всплеска. Если сетап ощущается «медленный сначала, нормально потом» — это холодная загрузка, а не медленная модель, — а под нагрузкой шторм загрузок это реальный режим отказа (см. параллелизм).
Связанные разделы: параллелизм · UI и интеграции · движки · структурированный вывод