llama-swap: как держать много локальных LLM и автоматически менять модели по запросу
llama-swap · llama.cpp · vLLM · hot swap · local AI

llama-swap: как держать много локальных LLM и автоматически менять модели по запросу

На одном компьютере может лежать десять моделей, но в VRAM одновременно помещаются одна-две. llama-swap решает именно эту проблему: клиент всегда обращается к одному API, а proxy сам запускает нужный inference server, ждёт его готовности, направляет запрос и позже выгружает модель по TTL. Переключаться между coding LLM, обычным chat, embeddings, image/audio backend можно без ручного перезапуска сервисов.

v256 актуальный release от 17 сентября 2026 года
MIT один Go binary + YAML configuration
Windows · Linux · macOS · FreeBSD готовые binaries; WinGet/Homebrew/Docker
Proxy + process manager

llama-swap не считает токены сам — он управляет inference servers

Это важное отличие от Ollama, llama.cpp или vLLM. llama-swap получает request, смотрит поле model, находит соответствующую запись в YAML и запускает указанную команду. Саму генерацию выполняет внешний server.

Open WebUI / Codex / appодин Base URL
→
llama-swaprouting · start · stop · TTL
→
llama-server / vLLM / ComfyUIреальный inference
→
GPU / CPUmodel weights
01Один endpoint

Клиенту не нужно знать, на каком случайном локальном порту поднята модель.

02Lifecycle

Server запускается по требованию и может автоматически завершаться после простоя.

03Backend-neutral

Команда запуска задаётся вами, поэтому proxy не привязан к одной inference library.

04Resource routing

Groups или matrix определяют, какие модели могут одновременно занимать GPU/RAM.

Практическая проблема

24 ГБ VRAM может хватать каждой модели по отдельности, но не всем сразу

Coding 27B coder

Загружается, когда Codex/IDE запрашивает llm-code.

Chat 14B general LLM

Автоматически заменяет coder, когда приходит обычный chat request.

Embeddings Маленькая embedding model

Можно держать постоянно загруженной в отдельной persistent group.

Image Stable Diffusion / ComfyUI

Запускается отдельным backend только когда нужен image generation.

Это не увеличивает физический объём VRAM.

llama-swap экономит память за счёт lifecycle: ненужная сейчас модель выгружается, а нужная занимает её место.

Что происходит при запросе

Поле model становится командой маршрутизации

1Приходит API request

Например model: "coder".

2Proxy проверяет состояние

Если нужный backend уже ready, request идёт сразу дальше.

3Освобождаются несовместимые модели

По group/matrix rules.

4Выполняется cmd

Например запуск llama-server с конкретным GGUF.

5Ожидание readiness

llama-swap проксирует запрос после готовности upstream.

6Idle TTL

После периода простоя модель может быть остановлена автоматически.

В v256 idle-time window начинает отсчитываться после того, как модель стала ready или была перезапущена — это отдельное изменение release v256.

Windows, Linux, macOS

Установить сам proxy проще, чем inference stack

Windows

winget install llama-swap

llama-swap -version

WinGet package поддерживается community contributor, а официальные pre-built binaries проекта доступны для Windows напрямую в GitHub Releases.

macOS / Linux через Homebrew

brew tap mostlygeek/llama-swap
brew install llama-swap

llama-swap \
  --config ./config.yaml \
  --listen localhost:8080

Docker

В 2026 основной рекомендуемый Docker-вариант — unified image. Он уже включает llama-server, ik-llama-server, stable-diffusion.cpp, whisper.cpp, audio.cpp и llama-swap. Есть CUDA 12/13 и Vulkan variants.

docker pull ghcr.io/mostlygeek/llama-swap:unified-cuda13
Native llama-swap binary сам не приносит llama-server.

Если в cmd указан llama-server, этот executable должен быть установлен отдельно и доступен по указанному пути.

Minimum viable config

Для первой модели достаточно четырёх строк YAML

models:
  coder:
    cmd: >
      llama-server
      --port ${PORT}
      --model D:/models/coder.gguf

${PORT} назначается автоматически. Если proxy не задан явно, default для модели строится как http://localhost:${PORT}.

Две модели

models:
  coder:
    cmd: >
      llama-server
      --port ${PORT}
      --model D:/models/coder.gguf

  general:
    cmd: >
      llama-server
      --port ${PORT}
      --model D:/models/general.gguf

В basic routing по умолчанию работает логика «одна модель за раз»: запрос general остановит несовместимый coder и загрузит нужный backend.

Автоматически освобождаем VRAM

TTL определяет, сколько idle-модель остаётся загруженной

models:
  coder:
    cmd: >
      llama-server
      --port ${PORT}
      --model D:/models/coder.gguf
    ttl: 300
ttl: 3005 минут

После idle-window backend выгружается.

ttl: 0Никогда автоматически не выгружать

Подходит для постоянно нужной маленькой модели.

ttl: -1Global default

Используется глобальное TTL-значение.

Слишком короткий TTL ухудшает UX.

Если модель весит 20–40 ГБ, постоянная выгрузка и повторная загрузка увеличит TTFT. TTL лучше подбирать по реальному интервалу между запросами.

Несколько моделей одновременно

Groups и matrix позволяют описать, что реально помещается в память

Current config имеет два routing engines: group — более простой, и matrix — более гибкий DSL для допустимых комбинаций моделей.

routing:
  mode: group
  settings:
    groups:
      main-llm:
        swap: true
        exclusive: true
        members:
          - coder
          - general

      always-on:
        persistent: true
        swap: false
        exclusive: false
        members:
          - embeddings
swap: true Один member за раз

Две большие LLM делят одну и ту же VRAM.

swap: false Members могут оставаться вместе

Используется, если памяти достаточно.

persistent: true Другие groups не выгружают эту

Полезно для embedding/reranker моделей.

matrix Явно задаёт допустимые combinations

Solver старается освободить минимально необходимое количество running models.

Один virtual ID — разные реальные модели

Profiles позволяют переключать routing без изменения приложений

profiles:
  coding:
    description: "Coding-focused model routing"
    pins:
      llm-code: coder-big
      llm-plan: qwen-plan

  economy:
    description: "Lower memory usage"
    pins:
      llm-code: coder-small
      llm-plan: general-small

Клиент продолжает запрашивать llm-code, а active profile решает, какая конкретная local/peer model стоит за этим ID. С v252 profile можно автоматически выбирать через startup hook.

Это удобно для coding-agents.

Codex/IDE можно один раз настроить на стабильное имя модели, а мощный/экономичный вариант переключать уже внутри llama-swap.

Не только Chat Completions

Current llama-swap проксирует большой набор OpenAI и Anthropic endpoints

/v1/chat/completionsChat

Основной OpenAI-compatible chat path.

/v1/responsesResponses

Современный OpenAI Responses-compatible endpoint.

/v1/embeddingsEmbeddings

Можно выделить отдельную embedding model.

/v1/messagesAnthropic Messages

Claude-style compatible API surface.

/v1/images/*Images

Image generation/edit backends.

/v1/audio/*Audio

Speech/transcription/voice endpoints.

curl http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "coder",
    "messages": [
      {
        "role": "user",
        "content": "Напиши функцию проверки конфигурации."
      }
    ]
  }'
Встроенный Web UI

Playground показывает не только chat, но и состояние всего inference-host

ModelsLoad / unload вручную

Видно, что сейчас заняло ресурсы.

ActivityRequests и timing

Удобно искать slow TTFT и длинные generations.

MetricsGPU/system telemetry

Есть Prometheus endpoint /metrics.

LogsReal-time streaming

Можно смотреть proxy и upstream logs отдельно.

ChatБыстрый playground

v256 улучшил mobile layout, timings и generation stats.

HelpLocal docs agent

Задаёт вопросы собственной документации llama-swap.

UI — административная поверхность, а не публичный чат для интернета.

Activity/logs способны раскрывать prompts, responses и operational details. Отдельная configurable UI authentication на момент статьи всё ещё обсуждается как feature request.

Неожиданная свежая функция

Help Agent использует документацию llama-swap, а те же tools доступны через MCP

Начиная с свежей 2026-линии у проекта есть встроенная knowledge base и Help page, которая отвечает по реальному config.example.yaml и docs. Эти documentation tools также публикуются как MCP endpoint: /api/mcp.

Help Agent Локальная модель читает реальные docs

Можно спросить, как настроить group, filter или backend command.

MCP Внешний MCP client получает те же docs tools

Полезно для Claude/Codex и других клиентов при настройке сервера.

MCP здесь — не общий доступ к вашим моделям.

Этот endpoint предназначен прежде всего для tools по документации/configuration. Сам inference остаётся на обычных API endpoints.

Несколько inference-hosts

Peers превращают один llama-swap в entry point к другим серверам

peers:
  gpu-pc:
    proxy: http://192.168.1.23:8080
    models:
      - coder-large
      - vision-model

Peer может быть другим llama-swap либо любым server, который предоставляет поддерживаемые generative API endpoints. Remote model можно адресовать как gpu-pc/coder-large.

Tailcat в v255+

В сентябре 2026 llama-swap получил интеграцию Tailcat: можно создать защищённое peer-соединение без обычного port forwarding. Конфигурация поддерживает connection token, node public-key allowlist, список публикуемых model IDs и отдельный флаг admin, который по умолчанию выключен.

Для домашнего доступа извне это интереснее прямого проброса 8080/9292.

Но access token и private key остаются credentials: их нельзя публиковать в статье, Git repository или screenshot.

Главная ошибка — считать local proxy автоматически защищённым

API keys не включены по умолчанию, а UI заслуживает отдельной защиты

Current config прямо указывает: apiKeys — optional array, default пустой; при пустом списке authentication inference endpoints не проверяется.

apiKeys:
  - "${env.LLAMA_SWAP_API_KEY}"
1 Bind localhost, если доступ нужен только этому ПК

--listen localhost:8080 уменьшает сетевую поверхность.

2 API key для inference

Не оставляйте default-allow на shared LAN без причины.

3 UI за VPN/reverse proxy

Отдельный password-login для UI не стоит считать встроенной зрелой RBAC-системой.

4 Prompts могут попасть в activity/logs

Это чувствительные telemetry data.

5 cmd запускается с правами llama-swap process

YAML configuration фактически управляет выполнением локальных команд.

6 Peer API keys держать в env

Config поддерживает environment macros, чтобы не хранить secrets прямо в YAML.

На GitHub Security page проекта на дату проверки нет опубликованных advisories и отдельного SECURITY.md. Это не доказательство отсутствия уязвимостей — только состояние публичного GitHub security feed.

Docker unified image по умолчанию слушает 0.0.0.0:8080 внутри container.

Это нужно, чтобы Docker port publishing работал. Ограничивайте публикацию на host/firewall уровне либо используйте host networking с loopback bind, если endpoint должен быть доступен только локально.

Где находится в стеке

llama-swap, Ollama и LiteLLM решают разные проблемы

ИнструментГлавная задачаЧто запускает модель
OllamaПростой local model runtimeСам Ollama
llama-swapLifecycle/hot-swap разных local serversllama.cpp, vLLM и другие upstreams
LiteLLMUnified AI gateway, routing/providers/budgetsВнешний provider/runtime
Open WebUIПользовательский chat/interfaceПодключённый backend

Их можно комбинировать. Например: Open WebUI → LiteLLM → llama-swap → несколько локальных llama-server/vLLM backends. Но для одного пользователя это может быть избыточно: добавляйте каждый слой только если он решает конкретную задачу.

Ограничения

Hot swap экономит VRAM, но за это платите временем загрузки и сложностью

01Cold-start

Большая модель после swap может загружаться секунды или дольше.

02Prompt cache теряется при остановке

Следующий cold run снова платит TTFT.

03Нужны сами upstream servers

Native binary не превращает GGUF в модель без llama-server/vLLM.

04YAML становится инфраструктурой

Сложные groups/matrix/profiles нужно документировать и version-control.

05UI не enterprise IAM

Не использовать как публичную многопользовательскую панель без внешней защиты.

06Совместимость endpoint ≠ одинаковое поведение

Разные upstream servers поддерживают разные параметры и features.

Если у вас одна модель — llama-swap, скорее всего, не нужен.

Он начинает окупать сложность, когда один host обслуживает несколько тяжёлых моделей или разные inference backends, которые конкурируют за GPU/RAM.

Практические сценарии

Где llama-swap особенно полезен

01Coding + chat на одной GPU

Большой coder и general LLM автоматически делят VRAM.

02Постоянные embeddings

Маленькая модель остаётся loaded, большие LLM меняются.

03LLM + image generation

Один proxy управляет llama-server и Stable Diffusion/ComfyUI.

04Домашний AI-server

Клиенты используют стабильные model IDs, сервер сам управляет lifecycle.

05Несколько GPU-hosts

Peers объединяют модели разных машин под одним entry point.

06Profiles для разных задач

Переключать quality/VRAM policy без перенастройки клиентов.

Первоисточники

llama-swap: release, config, installation, security и новые функции

Материал проверен 21 сентября 2026 года.

Latest release — v256 от 17 сентября 2026 года. Проект лицензируется по MIT.

Вывод

llama-swap нужен не для запуска первой LLM, а когда локальный AI-server уже вырос из одной модели

Его ключевое преимущество — отделить client configuration от реальной model lifecycle. Open WebUI, coding-agent или приложение всегда просит стабильный ID, а server решает, какой процесс поднять, что выгрузить и какие модели разрешено держать вместе.

Особенно разумна схема на ПК с одной GPU: несколько больших GGUF/vLLM models лежат на SSD, embeddings остаются loaded, а heavy LLM автоматически занимают VRAM только на время работы.

FAQ

Частые вопросы про llama-swap

Что такое llama-swap простыми словами?

Proxy и process manager, который автоматически запускает нужный local inference server по полю model и выгружает несовместимые/простаивающие модели.

Это замена Ollama?

Не совсем. Ollama сам является model runtime. llama-swap управляет внешними runtimes: llama.cpp, vLLM, image/audio servers и другими OpenAI/Anthropic-compatible backends.

Работает ли на Windows?

Да. Есть pre-built Windows binaries и community-maintained WinGet package.

Можно ли держать две модели одновременно?

Да. Groups и matrix позволяют явно описать compatible combinations. Если VRAM не хватает, другие модели можно автоматически swapping/unload.

Что делает TTL?

Останавливает простаивающий model backend после указанного времени. Значение 0 отключает automatic unloading.

Есть ли OpenAI-compatible API?

Да. Поддерживаются Chat Completions, Responses, embeddings и другие endpoints. Также есть Anthropic Messages-compatible endpoints.

Есть ли Web UI?

Да. Встроенный UI показывает models, chat/playground, activity, timing, logs и metrics.

Можно ли безопасно открыть UI в интернет?

Не рекомендуется напрямую. API keys защищают inference endpoints, но отдельная configurable UI-auth на дату статьи всё ещё фигурирует как открытый feature request. Используйте localhost, VPN или внешний reverse proxy/auth.

Какая версия актуальна?

На 21 сентября 2026 года latest release — llama-swap v256.

Домашний AI-server

На одном ПК уже несколько локальных моделей и постоянно приходится вручную освобождать VRAM?

Можно разложить модели по groups, оставить embeddings постоянно загруженной, настроить TTL для тяжёлых LLM и дать клиентам один стабильный OpenAI-compatible endpoint.