localaiforum
Войти
Руководство › Запуск и обслуживание

Развёртывание 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 и интеграции · движки · структурированный вывод