This guide is for the people who operate, deploy, secure, scale, and extend LocalAI: system administrators, DevOps/platform engineers, and software architects. It documents LocalAI's architecture, its complete configuration surface, security model, distributed/clustered operation, day-2 operations, and internals deep enough that an engineer could reason about — or rebuild — the system.
If you simply want to install LocalAI and call its API, start with the companion User Guide; this document assumes that baseline and goes deeper.
Note
LocalAI is a Go application (
module github.com/mudler/LocalAI, Go 1.26) licensed MIT. The HTTP server is built on Echo v4; the CLI uses kong; inference backends communicate over gRPC. This guide reflects the v4.3.0-era codebase.
Table of Contents
- Executive Summary
- Architecture
- System Requirements
- Configuration Mastery
- Authentication & Multi-User
- Security Hardening
- Distributed Mode & Horizontal Scaling
- P2P & Federated Mode
- Operations
- Observability
- Repository Structure (for Developers)
- Internals Deep Dive
- Code Quality & Conventions
- Potential Improvements
- Quick Reference
1. Executive Summary
LocalAI is a self-hosted inference platform that presents OpenAI-, Anthropic-, Ollama-, ElevenLabs-, and Jina-compatible APIs over a fleet of pluggable inference backends. Its defining architectural choice is a small composable core: the Go binary contains the API server, model/backend management, routing, auth, and orchestration, while the actual inference engines (llama.cpp, vLLM, transformers, whisper.cpp, diffusers, MLX, kokoro, parakeet, and 30+ more) are separate processes packaged as OCI images and pulled on demand.
Key operational properties:
- One binary, many roles. The
local-aibinary runs the server, CLI media tools, distributed workers, agent workers, the P2P explorer, and a stdio MCP control surface. - On-demand backends. Backends install themselves from a gallery (OCI images) the first time a model needs them; integrity can be enforced with cosign keyless verification and SHA256 checks.
- Scales from laptop to cluster. A single CPU-only container at one extreme; a PostgreSQL + NATS + S3-backed distributed cluster with VRAM-aware routing at the other.
- Multi-tenant ready. API-key and OIDC/GitHub/local auth, per-user roles, quotas, and usage attribution.
- Privacy-first. No data leaves the operator's infrastructure; outbound calls are limited to fetching explicitly requested models/backends.
2. Architecture
2.1 High-level component map
┌─────────────────────────────────────────────┐
Clients (OpenAI/Anthropic/ │ local-ai (Go core) │
Ollama/ElevenLabs SDKs, │ │
Web UI, MCP clients) │ ┌───────────────────────────────────────┐ │
│ │ │ HTTP server (Echo v4) │ │
▼ │ │ • middleware: auth, CSRF, security │ │
┌──────────────────┐ │ │ headers, request mapping, usage, │ │
│ HTTP :8080 │──────▶│ │ admission, PII, baseurl, node hdr │ │
│ (+ React UI) │ │ │ • routes: openai, anthropic, ollama, │ │
└──────────────────┘ │ │ elevenlabs, jina, localai, agents, │ │
│ │ auth, nodes, pii, finetuning, │ │
│ │ quantization, ui_api, usage │ │
│ └───────────────┬───────────────────────┘ │
│ ▼ │
│ ┌───────────────────────────────────────┐ │
│ │ core/application + core/startup │ │
│ │ ModelLoader · ConfigLoader · Gallery │ │
│ │ services: agents, nodes, router, │ │
│ │ galleryop, finetune, quantization, │ │
│ │ messaging(NATS), storage(S3), jobs │ │
│ └───────────────┬───────────────────────┘ │
└──────────────────┼───────────────────────────┘
│ gRPC (localhost:50051+)
┌────────────────────┼────────────────────┐
▼ ▼ ▼
┌────────────────┐ ┌────────────────┐ ┌────────────────┐
│ Go backends │ │ Python backends│ │ C++ / Rust │
│ (purego dlopen │ │ (gRPC servers, │ │ backends │
│ of .so libs) │ │ one per model)│ │ (llama.cpp, │
│ whisper, piper,│ │ vllm, diffusers│ │ ik-llama, ds4,│
│ sherpa, opus, │ │ transformers, │ │ kokoros/Rust │
│ sd-ggml, sam3, │ │ mlx, sglang, │ │ via tonic) │
│ rfdetr, voxtral│ │ kokoro, nemo… │ │ │
└────────────────┘ └────────────────┘ └────────────────┘
▲ pulled on demand as OCI images from the backend gallery
2.2 The composable core
The core is intentionally minimal. It owns:
- API translation — every supported dialect (OpenAI, Anthropic, Ollama, ElevenLabs, Jina) is normalized into LocalAI's internal request schema (
core/schema), then dispatched to a backend. - Model lifecycle —
pkg/model(theModelLoader) starts, tracks, and stops backend processes;core/configloads and validates model YAML and application options. - Backend lifecycle —
core/gallery+core/services/galleryopinstall/upgrade/remove backends from galleries. - Cross-cutting services — auth, routing, agents, distributed messaging, object storage, jobs, PII filtering, tracing, metrics.
2.3 Backends are separate processes
Each backend is a gRPC server that implements LocalAI's backend proto. The core launches a backend process (allocating an address like localhost:50051) and talks to it over gRPC (pkg/grpc). This isolation is what makes the core small and lets backends ship independently:
- Go backends (
backend/go/*) usepuregotodlopena native shared library at runtime (e.g.WHISPER_LIBRARY,SD_LIBRARY,PARAKEET_LIBRARY) and register its C ABI symbols — no CGo at build time. The library path is overridable by env var, with a fallback.sonext to the binary. - Python backends (
backend/python/*) are gRPC servers (one process per loaded model) started with--addr. Each has its ownrequirements.txtand is shipped as its own image (vLLM, diffusers, transformers, MLX, kokoro, nemo, sglang, whisperx, and many more). - C++ backends (
backend/cpp/*) wrap engines likellama.cpp,ik-llama-cpp,ds4, andturboquant. - Rust backend (
backend/rust/kokoros) usestonicfor gRPC andclapfor its CLI.
Note
Because backends are external processes, a crashing or hanging backend does not take down the core. Watchdogs and the memory reclaimer (see §9) manage misbehaving or idle backends.
2.4 Request lifecycle (chat completion)
- Request hits Echo at e.g.
POST /v1/chat/completions. - Middleware chain runs: strip-path-prefix, security headers, logging, recover, metrics, CSRF, auth, request mapping (normalize to internal schema), admission control (per-model concurrency limits), PII filtering, usage attribution.
- The route handler resolves the model config, ensures the backend is loaded (via
ModelLoader, installing the backend from the gallery if needed), and applies the model's prompttemplate. - The core issues a gRPC
Predict/PredictStreamto the backend. - Output is post-processed (stopwords,
cutstrings,trimspace,extract_regex), optionally filtered for PII, and returned (streamed as SSE if requested). - Usage is recorded per API key/user.
2.5 Process entry points
| Entry point | Role |
|---|---|
cmd/local-ai/main.go |
The local-ai binary; loads .env files, parses kong CLI, dispatches to a command |
core/cli/cli.go |
Top-level CLI command tree |
core/http/app.go |
Builds the Echo app, registers middleware and routes, embeds the React UI and static assets |
cmd/launcher/main.go |
Desktop Launcher (Fyne GUI + system tray) for macOS/Linux |
backend/*/main.go (+ kokoros/src/main.rs) |
Per-backend gRPC servers, started internally by the core |
pkg/grpc/server.go |
gRPC server scaffolding shared by backends |
pkg/mcp/localaitools/server.go |
Admin tool surface exposed as a stdio MCP server |
3. System Requirements
| Dimension | Minimum | Recommended |
|---|---|---|
| OS | Linux, macOS (Apple Silicon or Intel), Windows | Linux for servers |
| CPU | x86-64 or ARM64 | Many physical cores; set --threads to physical core count |
| RAM | Enough to hold the model + KV cache | 16 GB+ for small models, more for large |
| GPU (optional) | — | NVIDIA (CUDA 12/13), AMD (ROCm), Intel (oneAPI/SYCL), Apple (Metal/MLX), Vulkan, Jetson L4T |
| Disk | Room for core image + backend images + model weights | SSD; backends and models can total tens of GB |
| Runtime | Docker/Podman (for containers) | Docker with the matching GPU runtime |
GPU acceleration is selected by the image tag (containers) and/or model config (f16, gpu_layers, cuda). LocalAI auto-detects GPU capabilities and pulls the matching backend.
Important
Backend images are pulled on demand and can be large (multi-GB for GPU engines). Provision disk and network accordingly, and consider pre-installing backends (
local-ai backends install …) on air-gapped or slow links.
4. Configuration Mastery
LocalAI is configured at two levels: server-level (CLI flags / environment variables on the run command) and model-level (per-model YAML).
4.1 Configuration precedence and sources
.envfiles, loaded at startup in order:.env,localai.env,~/localai.env,~/.config/localai.env,/etc/localai.env.- Environment variables (
LOCALAI_*, plus legacy unprefixed aliases likeMODELS_PATH). - CLI flags on
local-ai run. - Dynamic config directory (
--localai-config-dir, default./configuration) — holdsapi_keys.jsonandexternal_backends.json, hot-reloaded via fsnotify (or polled if--localai-config-dir-poll-intervalis set). - Model YAML files in the models directory, and the models config file (
--models-config-file, legacy alias--config-file).
4.2 Server flags by group
local-ai run flags are organized into groups. Every flag has a LOCALAI_* environment equivalent.
Storage & paths
| Flag / Env | Default | Purpose |
|---|---|---|
--models-path / LOCALAI_MODELS_PATH |
./models |
Model storage |
--backends-path / LOCALAI_BACKENDS_PATH |
./backends |
Backend storage |
--backends-system-path / LOCALAI_BACKENDS_SYSTEM_PATH |
/var/lib/local-ai/backends |
System backends |
--generated-content-path / LOCALAI_GENERATED_CONTENT_PATH |
/tmp/generated/content |
Generated images/audio/video |
--upload-path / LOCALAI_UPLOAD_PATH |
/tmp/localai/upload |
Files API uploads |
--data-path / LOCALAI_DATA_PATH |
./data |
Persistent data (collection DB, agent state, tasks, jobs) |
--localai-config-dir / LOCALAI_CONFIG_DIR |
./configuration |
Hot-reloaded dynamic config |
--models-config-file / LOCALAI_MODELS_CONFIG_FILE |
— | YAML list of model configs |
Models & galleries
| Flag / Env | Default | Purpose |
|---|---|---|
--galleries / LOCALAI_GALLERIES |
localai | Model galleries (JSON) |
--autoload-galleries / LOCALAI_AUTOLOAD_GALLERIES |
true | Auto-load model galleries |
--preload-models / LOCALAI_PRELOAD_MODELS |
— | Models to apply at startup (JSON) |
--preload-models-config / LOCALAI_PRELOAD_MODELS_CONFIG |
— | YAML path of models to apply at startup |
--models / LOCALAI_MODELS |
— | Model config URLs to load |
--load-to-memory / LOCALAI_LOAD_TO_MEMORY |
— | Models to load into memory at startup |
Backends
| Flag / Env | Default | Purpose |
|---|---|---|
--backend-galleries / LOCALAI_BACKEND_GALLERIES |
localai | Backend galleries (JSON) |
--autoload-backend-galleries / LOCALAI_AUTOLOAD_BACKEND_GALLERIES |
true | Auto-load backend galleries |
--external-backends / LOCALAI_EXTERNAL_BACKENDS |
— | External backends to load on boot |
--external-grpc-backends / LOCALAI_EXTERNAL_GRPC_BACKENDS |
— | External gRPC backends |
--auto-upgrade-backends / LOCALAI_AUTO_UPGRADE_BACKENDS |
false | Auto-upgrade backends |
--backend-images-release-tag / LOCALAI_BACKEND_IMAGES_RELEASE_TAG |
latest | Fallback release tag |
--max-active-backends / LOCALAI_MAX_ACTIVE_BACKENDS |
0 (unlimited) | Max backends loaded at once (LRU eviction) |
--single-active-backend / LOCALAI_SINGLE_ACTIVE_BACKEND |
— | Deprecated; use --max-active-backends=1 |
--preload-backend-only / LOCALAI_PRELOAD_BACKEND_ONLY |
false | Start preloaded models/backends only, no API |
Performance
| Flag / Env | Default | Purpose |
|---|---|---|
--f16 / LOCALAI_F16 |
false | Enable GPU acceleration (half precision) |
--threads (-t) / LOCALAI_THREADS |
— | Computation threads (use physical core count) |
--context-size / LOCALAI_CONTEXT_SIZE |
— | Default model context size |
API & web
| Flag / Env | Default | Purpose |
|---|---|---|
--address / LOCALAI_ADDRESS |
:8080 |
Bind address |
--cors / LOCALAI_CORS |
false | Enable CORS |
--cors-allow-origins / LOCALAI_CORS_ALLOW_ORIGINS |
— | Allowed CORS origins |
--upload-limit / LOCALAI_UPLOAD_LIMIT |
15 | Upload limit (MB) |
--disable-webui / LOCALAI_DISABLE_WEBUI |
false | API-only mode |
--ollama-api-root-endpoint / LOCALAI_OLLAMA_API_ROOT_ENDPOINT |
false | Ollama-style health check on / |
--disable-runtime-settings |
false | Don't load runtime_settings.json |
--disable-gallery-endpoint |
— | Disable gallery endpoints |
--disable-mcp / LOCALAI_DISABLE_MCP |
false | Disable MCP support |
--disable-metrics-endpoint |
false | Disable /metrics |
--machine-tag / LOCALAI_MACHINE_TAG |
— | Machine-Tag response header (P2P tracking) |
--enable-tracing / LOCALAI_ENABLE_TRACING |
— | Enable API tracing (--tracing-max-items, --tracing-max-body-bytes) |
--agent-job-retention-days |
30 | Agent job history retention |
Backend lifecycle (watchdogs & reclaimer)
| Flag / Env | Default | Purpose |
|---|---|---|
--enable-watchdog-idle / LOCALAI_WATCHDOG_IDLE |
false | Stop backends idle past the timeout |
--watchdog-idle-timeout |
15m | Idle threshold |
--enable-watchdog-busy / LOCALAI_WATCHDOG_BUSY |
false | Stop backends busy past the timeout |
--watchdog-busy-timeout |
5m | Busy threshold |
--watchdog-interval |
500ms | Watchdog check interval |
--enable-memory-reclaimer / LOCALAI_MEMORY_RECLAIMER |
false | Auto-evict backends when memory exceeds threshold |
--memory-reclaimer-threshold |
0.95 | Memory threshold (0.0–1.0) triggering eviction |
--force-eviction-when-busy |
false | Evict even with active calls |
4.3 Model YAML reference
The model YAML (core/config.ModelConfig) is the per-model contract. Core keys:
name: my-model # model name in API requests
backend: llama-cpp # engine
f16: true # half precision
threads: 8
context_size: 4096
gpu_layers: 35 # layers offloaded to GPU
mmap: true
embeddings: false # serve embeddings endpoint?
cuda: false # explicitly enable CUDA for backends that need it
known_usecases: [chat] # declared capabilities
concurrency_groups: [gpu0] # mutual-exclusion groups on a node
download_files: [] # files fetched on install
parameters: # OpenAI-style request defaults (PredictionOptions)
temperature: 0.7
top_p: 0.9
top_k: 40
max_tokens: 512
seed: -1
repeat_penalty: 1.1
template: # Go prompt templates
chat: "{{.Input}}"
use_tokenizer_template: false
stopwords: ["</s>"]
Specialized blocks: diffusers, tts, function, reasoning, feature_flags, mcp, agent, pii, router, proxy, mitm, limits, grpc. The most operationally relevant:
limits:— admission control.max_concurrentcaps simultaneous in-flight requests for the model (0 = unlimited); the admission middleware returns503with aRetry-Afterheader (retry_after_seconds, default 1s) when exceeded. Use this to protect rate-limited cloud upstreams or memory-bound local backends.proxy:— the cloud-proxy backend.upstream_url,mode(passthroughkeeps the wire format end-to-end;translateconverts via internal proto for cross-provider routing),provider(openai/anthropic),api_key_env/api_key_file(mutually exclusive; the file form integrates with K8s secret mounts / Vault),upstream_model,request_timeout_seconds.router:— route a request acrosscandidatesbypolicies, with aclassifier, optionalclassifier_model, embedding cache, and afallback.mitm:— declarehoststhis model intercepts when the cloud-proxy MITM listener is enabled; the model'spii:settings then filter intercepted traffic. A host claimed by two configs is a configuration error and disables the MITM listener.mcp:— remote + stdio MCP servers the model can call.
LLM tuning keys live inline (the LLMConfig struct): gpu_layers, tensor_split, main_gpu, low_vram, mmap/mmlock, flash_attention, cache_type_k/cache_type_v, prompt_cache_*, mirostat*, rope_scaling/yarn_*, lora_*, grammar, draft_model/n_draft (speculative decoding), and vLLM-specific gpu_memory_utilization, tensor_parallel_size, max_model_len, dtype, quantization, trust_remote_code, enforce_eager, swap_space, limit_mm_per_prompt, and engine_args (raw passthrough).
Tip
prompt_cache_all/ llama.cpp prompt caching is on by default in recent releases — repeated system prompts collapse from minutes to seconds. Keep it enabled for chat workloads with stable system prompts.
5. Authentication & Multi-User
LocalAI supports two complementary auth models: static API keys (simplest) and full user authentication (multi-tenant).
5.1 Static API keys
local-ai run --api-key "sk-key-one" --api-key "sk-key-two"
When any key is set, all requests must present Authorization: Bearer <key>. Keys can also be managed dynamically through api_keys.json in the config directory (hot-reloaded).
5.2 Full user auth
| Flag / Env | Default | Purpose |
|---|---|---|
--auth-enabled / LOCALAI_AUTH |
false | Enable user authentication/authorization |
--auth-database-url / LOCALAI_AUTH_DATABASE_URL |
{DataPath}/database.db |
Auth DB (postgres:// or SQLite path) |
GITHUB_CLIENT_ID / GITHUB_CLIENT_SECRET |
— | GitHub OAuth (auto-enables auth when set) |
--oidc-issuer / --oidc-client-id / --oidc-client-secret |
— | OIDC SSO (auto-enables auth) |
--auth-base-url / LOCALAI_BASE_URL |
— | Base URL for OAuth callbacks |
--auth-admin-email / LOCALAI_ADMIN_EMAIL |
— | Email auto-promoted to admin |
--auth-registration-mode / LOCALAI_REGISTRATION_MODE |
open | open, approval, or invite |
--disable-local-auth / LOCALAI_DISABLE_LOCAL_AUTH |
false | OAuth/OIDC-only (no local email/password) |
--auth-api-key-hmac-secret / LOCALAI_AUTH_HMAC_SECRET |
auto-gen | HMAC secret for API-key hashing |
--default-api-key-expiry / LOCALAI_DEFAULT_API_KEY_EXPIRY |
none | Default API-key expiry (e.g. 90d, 1y) |
The auth subsystem (core/http/auth, routes in core/http/routes/auth.go) provides registration/login (local, GitHub, OIDC), session management, per-user API key issuance, roles, per-user model access, per-user quotas, and usage attribution (per API key and per user). Admin endpoints under /api/auth/admin/* manage users, roles, permissions, quotas, and invites.
Important
Setting
GITHUB_CLIENT_ID, an OIDC client ID, or an OIDC issuer auto-enables authentication even without--auth-enabled. Plan callback URLs (--auth-base-url) and the admin email before exposing the server.
6. Security Hardening
LocalAI ships several guardrails. Review each before exposing the server beyond localhost.
6.1 Network bind safety
By default, LocalAI refuses to start when binding to a public-internet address with no auth configured. Loopback, RFC 1918 LAN, ULA, link-local, and CGNAT/Tailscale ranges are always allowed.
| Flag | Default | Effect |
|---|---|---|
--allow-insecure-public-bind / LOCALAI_ALLOW_INSECURE_PUBLIC_BIND |
false | Permit public bind with no auth (not recommended) |
6.2 Request-surface hardening
| Flag | Default | Effect |
|---|---|---|
--disable-csrf / LOCALAI_DISABLE_CSRF |
false (CSRF on) | Disable CSRF middleware |
--subtle-key-comparison / LOCALAI_SUBTLE_KEY_COMPARISON |
false | Constant-time API-key comparison (timing-attack resistance) |
--opaque-errors / LOCALAI_OPAQUE_ERRORS |
false | Replace all error bodies with blank 500s (anti-leak) |
--disable-api-key-requirement-for-http-get |
false | Allow unauthenticated GETs to parts of the UI |
--http-get-exempted-endpoints |
(UI/static/swagger regexes) | Endpoints exempt when the above is enabled |
Security headers (CSP, X-Content-Type-Options, X-Frame-Options, Referrer-Policy) are applied early to every response, including 404s and errors (core/http/middleware).
6.3 Supply-chain integrity
Backends are OCI images. LocalAI supports cosign keyless verification of backend images and SHA256 verification of tarball/HTTP backends. The gallery's verification: block declares the expected issuer/identity (with regex variants).
| Flag | Default | Effect |
|---|---|---|
--require-backend-integrity / LOCALAI_REQUIRE_BACKEND_INTEGRITY |
false | Reject backend installs lacking a verification policy (OCI) or SHA256 (tarball/HTTP) |
--disable-predownload-scan / LOCALAI_DISABLE_PREDOWNLOAD_SCAN |
false | Disable the best-effort security scan before downloads |
Caution
In production with a populated gallery
verification:block, set--require-backend-integrity. Without it, integrity issues only warn and install proceeds. Leaving the predownload scan enabled is also recommended.
6.4 PII filtering
LocalAI can detect and filter PII (core/services/routing/pii, routes under /api/pii/*). PII rules can be tested (POST /api/pii/test), decided (POST /api/pii/decide), and persisted. The streaming PII filter also runs on cloud-proxy passthrough traffic (operating on extracted token text), and on MITM-intercepted bodies for declared hosts.
6.5 Hardening checklist
- [ ] Auth configured (
--api-keyor full auth) before any non-loopback bind - [ ]
--require-backend-integrityset with a populated galleryverification:block - [ ] Predownload scan left enabled
- [ ] CSRF left enabled;
--subtle-key-comparisonon for public endpoints - [ ]
/metricsandX-LocalAI-Nodeheader not exposed publicly (topology leak) - [ ] TLS terminated at a reverse proxy (LocalAI binds plain HTTP)
- [ ] Per-user quotas set in multi-tenant deployments
7. Distributed Mode & Horizontal Scaling
Distributed mode turns a set of LocalAI instances into a cluster with VRAM-aware smart routing and autoscaling. It requires PostgreSQL + NATS (and optionally S3-compatible object storage).
local-ai run --distributed \
--nats-url nats://nats:4222 \
--auth-database-url postgres://user:pass@pg:5432/localai \
--storage-url http://minio:9000 --storage-bucket localai \
--storage-access-key KEY --storage-secret-key SECRET
7.1 Roles
- Frontend — the
run --distributedinstance: serves the API/UI, routes requests, mints worker credentials, schedules models, tracks nodes. - Worker node —
local-ai worker(generic, backend-agnostic): registers with the frontend, runs models, reports heartbeats. - Agent worker —
local-ai agent-worker: a pure executor that subscribes to the NATSagent.executequeue and runs agent chats via cogito; it also handles MCP tool execution, MCP discovery, and MCP CI jobs routed over NATS. Config and skills arrive in the job payload, so it needs no direct DB access.
7.2 Key distributed flags
| Flag / Env | Default | Purpose |
|---|---|---|
--distributed / LOCALAI_DISTRIBUTED |
false | Enable distributed mode |
--instance-id / LOCALAI_INSTANCE_ID |
auto UUID | Unique instance ID |
--nats-url / LOCALAI_NATS_URL |
— | NATS server URL |
--storage-url / --storage-bucket / --storage-region / --storage-access-key / --storage-secret-key |
— | S3-compatible object storage |
--registration-token / LOCALAI_REGISTRATION_TOKEN |
— | Token nodes must present to register |
--auto-approve-nodes / LOCALAI_AUTO_APPROVE_NODES |
false | Skip admin approval for new nodes |
--distributed-prefix-cache |
true | Prefix-cache-aware routing (else round-robin) |
--distributed-prefix-cache-ttl |
5m | Idle timeout for prefix-cache index entries |
--expose-node-header / LOCALAI_EXPOSE_NODE_HEADER |
false | Add X-LocalAI-Node to inference responses (topology leak — keep off publicly) |
7.3 NATS security
NATS auth uses JWT + nkey seeds. The frontend mints per-node worker JWTs at registration (--nats-account-seed, --nats-service-jwt, --nats-service-seed, --nats-worker-jwt-ttl). Enforce credentials with --nats-require-auth, and use mTLS with --nats-tls-ca/--nats-tls-cert/--nats-tls-key and a tls:// URL. Workers auto-refresh minted credentials before expiry; if refresh permanently fails, the worker shuts down so it can re-register rather than linger unauthenticated.
7.4 Routing and scheduling
The frontend exposes node and scheduling APIs (core/http/routes/nodes.go): register/heartbeat/drain/resume/deregister nodes, set per-node labels and max-replicas-per-model, and query/define scheduling decisions. The router (core/services/routing) supports prefix-cache-aware placement, admission control, billing, and PII adaptation. Decision introspection is available via /api/router/decisions and /api/router/cache/stats.
Note
Backend install/upgrade requests are sent to worker nodes over NATS request-reply with generous timeouts (
--nats-backend-install-timeout/--nats-backend-upgrade-timeout, default 15m) — increase for slow links pulling multi-GB images.
8. P2P & Federated Mode
For peer-to-peer inference without a central control plane, LocalAI integrates libp2p (via mudler/edgevpn).
# Start with P2P; if no token is given, one is generated and printed
local-ai run --p2p
# On a worker node, join with the token
export TOKEN="<token>"
local-ai worker p2p-llama-cpp-rpc
P2P-related flags: --p2p, --p2p-token (TOKEN), --p2p-network-id (group instances), --p2p-dht-interval, --p2p-otp-interval. Library-level behavior is tuned with LOCALAI_P2P_* env vars (DHT disable, listen multiaddrs, bootstrap peers, log level). The explorer (local-ai explorer) discovers P2P networks. Federated mode (--federated / local-ai federated) lets a federated instance balance requests across peers.
9. Operations
9.1 Start / stop / restart
# Containers
docker start -i local-ai # resume existing
docker stop local-ai
docker logs -f local-ai # follow logs
# Binary — graceful shutdown on SIGINT/SIGTERM
9.2 Managing backends and models
local-ai backends list
local-ai backends install <backend>
local-ai backends upgrade # all, or name specific ones
local-ai backends uninstall <backend>
Backend management is also available over the API (/backends/*, /api/backends/*) and the UI, including upgrade checks (/backends/upgrades, POST /backends/upgrades/check).
9.3 Backend logs and monitoring
| Endpoint | Purpose |
|---|---|
GET /api/backend-logs/:modelId |
Per-backend logs |
GET /ws/backend-logs/:modelId |
Live backend logs (WebSocket) |
GET /backend/monitor |
Backend status |
POST /backend/shutdown |
Stop a backend |
GET /api/operations |
In-flight operations (installs, jobs) |
9.4 Memory management
- Idle/busy watchdogs stop backends that sit idle or run too long.
- Memory reclaimer evicts backends when GPU VRAM (or RAM) usage crosses
--memory-reclaimer-threshold(default 0.95). --max-active-backendscaps loaded backends with LRU eviction.concurrency_groupsin a model config prevent co-loading models that share a group on a node (see VRAM-management docs).
9.5 Backup
Persist and back up these paths:
| Path | Contents |
|---|---|
--models-path |
Model weights + YAML configs |
--backends-path |
Installed backends |
--data-path |
Collection DB, agent state, tasks, jobs |
Auth DB (--auth-database-url) |
Users, API keys, quotas, usage (SQLite file or Postgres) |
--localai-config-dir |
api_keys.json, external_backends.json |
9.6 Health checks & readiness
curl http://localhost:8080/healthz # liveness
curl http://localhost:8080/readyz # readiness
Use /readyz for load-balancer/orchestrator readiness gates.
10. Observability
- Metrics — Prometheus metrics at
GET /metrics(OpenTelemetry-based; disable with--disable-metrics-endpoint). The project depends ongo.opentelemetry.io/otelwith a Prometheus exporter. - Tracing — enable in-app API tracing with
--enable-tracing; inspect via/api/tracesand/api/backend-traces. Bound memory with--tracing-max-itemsand--tracing-max-body-bytes. - Usage — per API key and per user usage via
/api/usageand/api/auth/usage(with source breakdowns). - Logging —
xlog-based structured logging. Set level with--log-level/--debug; format withLOCALAI_LOG_FORMAT(text vs. structured). Quiet paths (UI polling,/healthz,/readyz,/api/resources) log at DEBUG to reduce noise.
Tip
In containers where stdout is captured to a file, set
LOCALAI_LOG_FORMAT=text(backends do this automatically when stdout isn't a TTY) to avoid ANSI color codes in logs.
11. Repository Structure (for Developers)
LocalAI/
├── cmd/
│ ├── local-ai/ # main binary entry point (kong CLI, .env loading)
│ └── launcher/ # Fyne desktop launcher + system tray
├── core/
│ ├── cli/ # CLI command tree (run, models, backends, worker, agent, …)
│ ├── config/ # ApplicationConfig + ModelConfig (YAML schema), gallery, gguf, hooks
│ ├── http/ # Echo app, routes/, middleware/, endpoints/, auth/, react-ui/, views/
│ ├── schema/ # internal request/response schema (OpenAI-compatible types)
│ ├── application/ # app bootstrap and wiring
│ ├── startup/ # startup sequence
│ ├── backend/ # backend invocation glue (predict, embeddings, tts, image, …)
│ ├── gallery/ # model + backend gallery (install/upgrade/verify)
│ ├── services/ # agents, nodes, router, messaging(NATS), storage(S3), jobs,
│ │ # galleryop, finetune, quantization, cloudproxy, pii, mcp, skills
│ ├── p2p/ # libp2p/edgevpn integration
│ ├── explorer/ # P2P explorer
│ └── trace/ # tracing buffer
├── backend/
│ ├── go/ # Go backends (purego dlopen of native libs)
│ ├── python/ # Python gRPC backends (vllm, diffusers, transformers, mlx, …)
│ ├── cpp/ # C++ backends (llama-cpp, ik-llama-cpp, ds4, turboquant)
│ └── rust/ # Rust backend (kokoros, tonic gRPC)
├── pkg/
│ ├── model/ # ModelLoader: backend process lifecycle
│ ├── grpc/ # gRPC server/client scaffolding
│ ├── functions/ # function calling, grammars (PEG), JSON-schema → grammar
│ ├── downloader/ # model/file download (HF, OCI, HTTP) with URI schemes
│ ├── gallery / oci # OCI image handling, cosign verification
│ ├── mcp/ # MCP tool surface (localaitools)
│ ├── reasoning/ # reasoning/thinking extraction
│ ├── vram / xsysinfo # VRAM + system probing
│ └── … # audio, sound, store, radixtree, clusterrouting, natsauth, etc.
├── gallery/ # model gallery index + definitions
├── swagger/ # generated OpenAPI spec
├── prompt-templates/ # default prompt templates
├── docs/ # Hugo (Docsy) documentation site
└── tests/ # e2e (aio, backends, ui, distributed), integration, fixtures
Core engine modules at a glance
| Module | Responsibility |
|---|---|
pkg/model |
Start/track/stop backend processes; the ModelLoader |
core/config |
Load/validate application options and model YAML; gallery + GGUF parsing; backend capability hooks |
core/http |
Echo app, middleware chain, all route groups, embedded React UI |
core/schema |
Internal, OpenAI-compatible request/response types |
core/gallery + core/services/galleryop |
Backend/model install, upgrade, verification |
core/services/agents |
Agent execution, NATS dispatcher, event bridge (cogito) |
core/services/messaging |
NATS client wrapper (subjects, queues, JWT/mTLS) |
pkg/functions |
Tool/function calling and grammar constraint generation |
pkg/grpc |
The backend gRPC contract |
12. Internals Deep Dive
12.1 CLI parsing (kong)
cmd/local-ai/main.go builds the kong model from core/cli.CLI. Kong Vars inject defaults: basepath (.), the default model and backend galleries (github:mudler/LocalAI/...@master), and version. The run command is default:"withargs", so bare local-ai <model> runs the server with that model. Logging level resolves from --debug/--log-level, with optional dedup (--log-dedup-logs).
12.2 The backend gRPC contract
Every backend implements the backend proto served via pkg/grpc. The core launches a backend, connects over gRPC, and calls LoadModel, then Predict/PredictStream, Embeddings, TTS/transcription/image RPCs as appropriate. Go backends register native C functions through purego at startup (RegisterLibFunc), allowing a single Go process to drive a native engine without CGo. Backends probe optional ABI symbols (Dlsym) so a newer Go shim still loads against an older library, degrading gracefully.
12.3 Cloud-proxy (backend/go/cloud-proxy)
A backend that forwards traffic to an external provider. Passthrough mode serves a Forward RPC and preserves the client wire format end-to-end. Translate mode serves Predict/PredictStream and converts LocalAI's internal proto to the provider's wire format, enabling cross-provider routing (an OpenAI client hitting an Anthropic upstream). API keys are resolved once at load time from api_key_env or api_key_file.
12.4 Agents and cogito
Agents are built on mudler/cogito (the execution engine) and mudler/LocalAGI (agent state/types). The agent worker (core/cli/agent_worker.go) is a NATS-driven executor: it streams reasoning/content/tool-call events back over NATS as ProgressEvents, buffering tokens and flushing on stream-type changes. It handles three NATS surfaces — agent execution (agent.execute), MCP tool/discovery request-reply, and MCP CI jobs — and cleans up MCP sessions on backend-stop events.
12.5 MCP
The mcp-server command exposes LocalAI's admin tool surface as a stdio MCP server (controlling a remote LocalAI over HTTP). In-process, the LocalAI Assistant is an admin MCP server (disable with --disable-assistant). MCP sessions are created from per-model config (remote + stdio servers), discovered, and cached; tool calls are dispatched to the right session.
12.6 Inference defaults
core/config/gen_inference_defaults is a go generate tool that fetches unsloth's inference_defaults.json, validates and remaps it (e.g. repetition_penalty → repeat_penalty), filters to allowed sampling fields, and writes inference_defaults.json. This seeds sensible per-family sampling defaults (temperature/top_p/top_k/min_p/repeat_penalty/presence_penalty) matched by model-name patterns.
12.7 Persistence
LocalAI uses GORM with SQLite (gorm.io/driver/sqlite, WAL) by default and PostgreSQL (gorm.io/driver/postgres) for distributed/multi-user deployments. The auth DB defaults to {DataPath}/database.db. Agent collections, tasks, and jobs persist under the data path; vector knowledge bases default to the chromem engine.
13. Code Quality & Conventions
- Language/build: Go 1.26; native engines via purego/
dlopen(no build-time CGo for Go backends); Rust backend viatonic; Python backends as standalone gRPC servers with pinnedgrpcio. - HTTP: Echo v4 with an explicit, ordered middleware chain; SPA fallback serves the React UI for HTML 404s while returning JSON errors otherwise.
- Config: struct-tag-driven — kong tags (
env:,group:,default:) for CLI, and dualyaml:/json:tags for model config, so the same structs serialize to YAML files and JSON API bodies. - Testing: Ginkgo/Gomega specs across unit, integration, and e2e suites (
tests/e2e-aio,tests/e2e-backends,tests/e2e-ui,tests/e2e/distributed), with testcontainers for NATS/Postgres. Face-recognition e2e fixtures download from public NASA images at runtime (or use_FILEenv overrides for offline runs). - Observability-by-default: structured
xlog, OpenTelemetry metrics, optional tracing with bounded buffers, quiet-path log demotion. - Safety-by-default: public-bind refusal without auth, CSRF on, security headers on every response, optional constant-time key comparison and opaque errors.
14. Potential Improvements
These are observations for operators and contributors, derived from the codebase — not defects.
- Backend integrity defaults to warn-only.
--require-backend-integrityisfalseby default; integrity problems only warn. Production deployments should flip it on once the galleryverification:block is populated, and the default could move toward enforcement as galleries mature. - Topology leakage knobs.
--expose-node-headerand/metricsreveal internal topology; they're correctly off/guardable but warrant explicit review in any public deployment. - Large surface area. Five API dialects plus extensive management APIs (395 routes) is a broad attack/compatibility surface; per-dialect contract tests and clear deprecation of legacy unprefixed env aliases (e.g.
MODELS_PATH) would reduce drift. - Deprecated flags linger.
--single-active-backendis superseded by--max-active-backends=1, and--p2ptokenby--p2p-token; a deprecation timeline would tidy the CLI. - On-demand backend downloads make first-use latency unpredictable on slow links. Operators should pre-install backends or preload models; a documented "warm" step in orchestration manifests would help.
- Known community issues to track for stability: GLIBCXX mismatches on some CUDA backends (issue #10056), diffusers/SD regressions (issue #9979), embedding-dimension mismatches for some models (issue #8721), and container RAM misreporting (issue #8059).
15. Quick Reference
Commands
| Command | Purpose |
|---|---|
local-ai run [models…] |
Run the server (default) |
local-ai models … |
Manage models |
local-ai backends list|install|upgrade|uninstall |
Manage backends |
local-ai worker |
Distributed worker (generic) |
local-ai p2p-worker |
P2P worker (llama.cpp) |
local-ai agent-worker |
Distributed agent worker |
local-ai agent run|list |
Standalone agents |
local-ai federated |
Federated mode |
local-ai explorer |
P2P explorer |
local-ai mcp-server |
stdio MCP control surface |
local-ai tts|transcript|sound-generation |
One-off media tasks |
local-ai completion bash|zsh|fish |
Shell completions |
Operational endpoints
| Endpoint | Purpose |
|---|---|
GET /healthz, /readyz |
Liveness / readiness |
GET /metrics |
Prometheus metrics |
GET /version |
Version |
GET /system |
System info |
GET /api/backend-logs/:modelId |
Backend logs |
GET /backend/monitor |
Backend status |
GET /api/traces, /api/backend-traces |
Tracing |
GET /api/usage, /api/auth/usage |
Usage attribution |
GET /swagger/ |
OpenAPI docs |
*/nodes/*, */scheduling/* |
Distributed node & scheduling control |
Critical env vars
| Variable | Purpose |
|---|---|
LOCALAI_ADDRESS |
Bind address |
LOCALAI_API_KEY |
Static API key(s) |
LOCALAI_AUTH + DB/OIDC/GitHub vars |
Full user auth |
LOCALAI_MODELS_PATH / LOCALAI_BACKENDS_PATH / LOCALAI_DATA_PATH |
Storage |
LOCALAI_DISTRIBUTED + LOCALAI_NATS_URL + LOCALAI_STORAGE_* |
Cluster mode |
LOCALAI_REQUIRE_BACKEND_INTEGRITY |
Enforce backend signatures |
LOCALAI_ALLOW_INSECURE_PUBLIC_BIND |
Override public-bind guard |
LOCALAI_MAX_ACTIVE_BACKENDS |
Cap loaded backends |
LOCALAI_WATCHDOG_IDLE / LOCALAI_MEMORY_RECLAIMER |
Reclaim resources |
Default ports
| Port | Service |
|---|---|
8080 |
LocalAI HTTP API + web UI |
50051+ |
Backend gRPC servers (internal, one per model) |
4222 |
NATS (distributed mode, external) |
5432 |
PostgreSQL (distributed/auth, external) |