--- created: '2026-04-10T01:19:06+00:00' id: c693060b-7794-4d1c-995d-53b6c951352c keywords: - llama-server - llama.cpp - HTTP server - GGUF - OpenAI API - Anthropic API - inference - completion - chat completions - embeddings - reranking - speculative decoding - continuous batching - KV cache - sampling - router mode - multimodal - LoRA - function calling links: [] modified: '2026-04-10T01:19:06+00:00' summary: Comprehensive reference for llama-server (LLaMA.cpp HTTP Server) covering all command-line parameters (common, sampling, server-specific), API endpoints (native and OpenAI/Anthropic-compatible), router mode for multi-model serving, build instructions, and usage examples. tags: - reference - llama-cpp - llama-server - inference-server - api - openai-compatible title: LLaMA.cpp HTTP Server (llama-server) — Settings & API Reference --- # LLaMA.cpp HTTP Server (llama-server) Fast, lightweight, pure C/C++ HTTP server based on [httplib](https://github.com/yhirose/cpp-httplib), [nlohmann::json](https://github.com/nlohmann/json) and **llama.cpp**. Set of LLM REST APIs and a web UI to interact with llama.cpp. **Features:** - LLM inference of F16 and quantized models on GPU and CPU - [OpenAI API](https://github.com/openai/openai-openapi) compatible chat completions, responses, and embeddings routes - [Anthropic Messages API](https://docs.anthropic.com/en/api/messages) compatible chat completions - Reranking endpoint (https://github.com/ggml-org/llama.cpp/pull/9510) - Parallel decoding with multi-user support - Continuous batching - Multimodal ([documentation](../../docs/multimodal.md)) / with OpenAI-compatible API support - Monitoring endpoints - Schema-constrained JSON response format - Prefilling of assistant messages similar to the Claude API - [Function calling](../../docs/function-calling.md) / tool use for ~any model - Speculative decoding - Easy-to-use web UI For the full list of features, please refer to [server's changelog](https://github.com/ggml-org/llama.cpp/issues/9291) ## Usage ### Common params | Argument | Explanation | | -------- | ----------- | | `-h, --help, --usage` | print usage and exit | | `--version` | show version and build info | | `--license` | show source code license and dependencies | | `-cl, --cache-list` | show list of models in cache | | `--completion-bash` | print source-able bash completion script for llama.cpp | | `-t, --threads N` | number of CPU threads to use during generation (default: -1) (env: `LLAMA_ARG_THREADS`) | | `-tb, --threads-batch N` | number of threads to use during batch and prompt processing (default: same as --threads) | | `-C, --cpu-mask M` | CPU affinity mask: arbitrarily long hex. Complements cpu-range (default: "") | | `-Cr, --cpu-range lo-hi` | range of CPUs for affinity. Complements --cpu-mask | | `--cpu-strict <0\|1>` | use strict CPU placement (default: 0) | | `--prio N` | set process/thread priority : low(-1), normal(0), medium(1), high(2), realtime(3) (default: 0) | | `--poll <0...100>` | use polling level to wait for work (0 - no polling, default: 50) | | `-Cb, --cpu-mask-batch M` | CPU affinity mask: arbitrarily long hex. Complements cpu-range-batch (default: same as --cpu-mask) | | `-Crb, --cpu-range-batch lo-hi` | ranges of CPUs for affinity. Complements --cpu-mask-batch | | `--cpu-strict-batch <0\|1>` | use strict CPU placement (default: same as --cpu-strict) | | `--prio-batch N` | set process/thread priority : 0-normal, 1-medium, 2-high, 3-realtime (default: 0) | | `--poll-batch <0\|1>` | use polling to wait for work (default: same as --poll) | | `-c, --ctx-size N` | size of the prompt context (default: 0, 0 = loaded from model) (env: `LLAMA_ARG_CTX_SIZE`) | | `-n, --predict, --n-predict N` | number of tokens to predict (default: -1, -1 = infinity) (env: `LLAMA_ARG_N_PREDICT`) | | `-b, --batch-size N` | logical maximum batch size (default: 2048) (env: `LLAMA_ARG_BATCH`) | | `-ub, --ubatch-size N` | physical maximum batch size (default: 512) (env: `LLAMA_ARG_UBATCH`) | | `--keep N` | number of tokens to keep from the initial prompt (default: 0, -1 = all) | | `--swa-full` | use full-size SWA cache (default: false) (env: `LLAMA_ARG_SWA_FULL`) | | `-fa, --flash-attn [on\|off\|auto]` | set Flash Attention use ('on', 'off', or 'auto', default: 'auto') (env: `LLAMA_ARG_FLASH_ATTN`) | | `--perf, --no-perf` | whether to enable internal libllama performance timings (default: false) (env: `LLAMA_ARG_PERF`) | | `-e, --escape, --no-escape` | whether to process escapes sequences (\n, \r, \t, \', \", \\) (default: true) | | `--rope-scaling {none,linear,yarn}` | RoPE frequency scaling method, defaults to linear unless specified by the model (env: `LLAMA_ARG_ROPE_SCALING_TYPE`) | | `--rope-scale N` | RoPE context scaling factor, expands context by a factor of N (env: `LLAMA_ARG_ROPE_SCALE`) | | `--rope-freq-base N` | RoPE base frequency, used by NTK-aware scaling (default: loaded from model) (env: `LLAMA_ARG_ROPE_FREQ_BASE`) | | `--rope-freq-scale N` | RoPE frequency scaling factor, expands context by a factor of 1/N (env: `LLAMA_ARG_ROPE_FREQ_SCALE`) | | `--yarn-orig-ctx N` | YaRN: original context size of model (default: 0 = model training context size) (env: `LLAMA_ARG_YARN_ORIG_CTX`) | | `--yarn-ext-factor N` | YaRN: extrapolation mix factor (default: -1.00, 0.0 = full interpolation) (env: `LLAMA_ARG_YARN_EXT_FACTOR`) | | `--yarn-attn-factor N` | YaRN: scale sqrt(t) or attention magnitude (default: -1.00) (env: `LLAMA_ARG_YARN_ATTN_FACTOR`) | | `--yarn-beta-slow N` | YaRN: high correction dim or alpha (default: -1.00) (env: `LLAMA_ARG_YARN_BETA_SLOW`) | | `--yarn-beta-fast N` | YaRN: low correction dim or beta (default: -1.00) (env: `LLAMA_ARG_YARN_BETA_FAST`) | | `-kvo, --kv-offload, -nkvo, --no-kv-offload` | whether to enable KV cache offloading (default: enabled) (env: `LLAMA_ARG_KV_OFFLOAD`) | | `--repack, -nr, --no-repack` | whether to enable weight repacking (default: enabled) (env: `LLAMA_ARG_REPACK`) | | `--no-host` | bypass host buffer allowing extra buffers to be used (env: `LLAMA_ARG_NO_HOST`) | | `-ctk, --cache-type-k TYPE` | KV cache data type for K. Allowed: f32, f16, bf16, q8_0, q4_0, q4_1, iq4_nl, q5_0, q5_1 (default: f16) (env: `LLAMA_ARG_CACHE_TYPE_K`) | | `-ctv, --cache-type-v TYPE` | KV cache data type for V. Allowed: f32, f16, bf16, q8_0, q4_0, q4_1, iq4_nl, q5_0, q5_1 (default: f16) (env: `LLAMA_ARG_CACHE_TYPE_V`) | | `-dt, --defrag-thold N` | KV cache defragmentation threshold (DEPRECATED) (env: `LLAMA_ARG_DEFRAG_THOLD`) | | `--mlock` | force system to keep model in RAM rather than swapping or compressing (env: `LLAMA_ARG_MLOCK`) | | `--mmap, --no-mmap` | whether to memory-map model (if mmap disabled, slower load but may reduce pageouts if not using mlock) (default: enabled) (env: `LLAMA_ARG_MMAP`) | | `-dio, --direct-io, -ndio, --no-direct-io` | use DirectIO if available (default: disabled) (env: `LLAMA_ARG_DIO`) | | `--numa TYPE` | attempt optimizations that help on some NUMA systems. Options: distribute, isolate, numactl (env: `LLAMA_ARG_NUMA`) | | `-dev, --device ` | comma-separated list of devices to use for offloading (none = don't offload) (env: `LLAMA_ARG_DEVICE`) | | `--list-devices` | print list of available devices and exit | | `-ot, --override-tensor =,...` | override tensor buffer type (env: `LLAMA_ARG_OVERRIDE_TENSOR`) | | `-cmoe, --cpu-moe` | keep all Mixture of Experts (MoE) weights in the CPU (env: `LLAMA_ARG_CPU_MOE`) | | `-ncmoe, --n-cpu-moe N` | keep the MoE weights of the first N layers in the CPU (env: `LLAMA_ARG_N_CPU_MOE`) | | `-ngl, --gpu-layers, --n-gpu-layers N` | max number of layers to store in VRAM: exact number, 'auto', or 'all' (default: auto) (env: `LLAMA_ARG_N_GPU_LAYERS`) | | `-sm, --split-mode {none,layer,row}` | how to split model across multiple GPUs (default: layer) (env: `LLAMA_ARG_SPLIT_MODE`) | | `-ts, --tensor-split N0,N1,N2,...` | fraction of model to offload to each GPU, comma-separated proportions (env: `LLAMA_ARG_TENSOR_SPLIT`) | | `-mg, --main-gpu INDEX` | GPU to use for model or intermediate results (default: 0) (env: `LLAMA_ARG_MAIN_GPU`) | | `-fit, --fit [on\|off]` | whether to adjust unset arguments to fit in device memory (default: 'on') (env: `LLAMA_ARG_FIT`) | | `-fitt, --fit-target MiB0,MiB1,...` | target margin per device for --fit, comma-separated (default: 1024) (env: `LLAMA_ARG_FIT_TARGET`) | | `-fitc, --fit-ctx N` | minimum ctx size that can be set by --fit option (default: 4096) (env: `LLAMA_ARG_FIT_CTX`) | | `--check-tensors` | check model tensor data for invalid values (default: false) | | `--override-kv KEY=TYPE:VALUE,...` | override model metadata by key. Types: int, float, bool, str | | `--op-offload, --no-op-offload` | whether to offload host tensor operations to device (default: true) | | `--lora FNAME` | path to LoRA adapter (comma-separated for multiple) | | `--lora-scaled FNAME:SCALE,...` | path to LoRA adapter with user defined scaling | | `--control-vector FNAME` | add a control vector (comma-separated for multiple) | | `--control-vector-scaled FNAME:SCALE,...` | add a control vector with user defined scaling | | `--control-vector-layer-range START END` | layer range to apply the control vector(s) to | | `-m, --model FNAME` | model path to load (env: `LLAMA_ARG_MODEL`) | | `-mu, --model-url MODEL_URL` | model download url (env: `LLAMA_ARG_MODEL_URL`) | | `-dr, --docker-repo [/][:quant]` | Docker Hub model repository (env: `LLAMA_ARG_DOCKER_REPO`) | | `-hf, -hfr, --hf-repo /[:quant]` | Hugging Face model repository (env: `LLAMA_ARG_HF_REPO`) | | `-hfd, -hfrd, --hf-repo-draft /[:quant]` | Same as --hf-repo, but for the draft model (env: `LLAMA_ARG_HFD_REPO`) | | `-hff, --hf-file FILE` | Hugging Face model file, overrides quant in --hf-repo (env: `LLAMA_ARG_HF_FILE`) | | `-hfv, -hfrv, --hf-repo-v /[:quant]` | Hugging Face model repository for vocoder model (env: `LLAMA_ARG_HF_REPO_V`) | | `-hffv, --hf-file-v FILE` | Hugging Face model file for vocoder model (env: `LLAMA_ARG_HF_FILE_V`) | | `-hft, --hf-token TOKEN` | Hugging Face access token (env: `HF_TOKEN`) | | `--log-disable` | Log disable | | `--log-file FNAME` | Log to file (env: `LLAMA_LOG_FILE`) | | `--log-colors [on\|off\|auto]` | Set colored logging (default: 'auto') (env: `LLAMA_LOG_COLORS`) | | `-v, --verbose, --log-verbose` | Set verbosity level to infinity | | `--offline` | Offline mode: forces use of cache, prevents network access (env: `LLAMA_OFFLINE`) | | `-lv, --verbosity, --log-verbosity N` | Set verbosity threshold. 0=generic, 1=error, 2=warning, 3=info, 4=debug (default: 3) (env: `LLAMA_LOG_VERBOSITY`) | | `--log-prefix` | Enable prefix in log messages (env: `LLAMA_LOG_PREFIX`) | | `--log-timestamps` | Enable timestamps in log messages (env: `LLAMA_LOG_TIMESTAMPS`) | | `-ctkd, --cache-type-k-draft TYPE` | KV cache data type for K for the draft model (default: f16) (env: `LLAMA_ARG_CACHE_TYPE_K_DRAFT`) | | `-ctvd, --cache-type-v-draft TYPE` | KV cache data type for V for the draft model (default: f16) (env: `LLAMA_ARG_CACHE_TYPE_V_DRAFT`) | ### Sampling params | Argument | Explanation | | -------- | ----------- | | `--samplers SAMPLERS` | samplers used for generation, separated by ';' (default: penalties;dry;top_n_sigma;top_k;typ_p;top_p;min_p;xtc;temperature) | | `-s, --seed SEED` | RNG seed (default: -1, use random seed for -1) | | `--sampler-seq, --sampling-seq SEQUENCE` | simplified sequence for samplers (default: edskypmxt) | | `--ignore-eos` | ignore end of stream token and continue generating | | `--temp, --temperature N` | temperature (default: 0.80) | | `--top-k N` | top-k sampling (default: 40, 0 = disabled) (env: `LLAMA_ARG_TOP_K`) | | `--top-p N` | top-p sampling (default: 0.95, 1.0 = disabled) | | `--min-p N` | min-p sampling (default: 0.05, 0.0 = disabled) | | `--top-nsigma, --top-n-sigma N` | top-n-sigma sampling (default: -1.00, -1.0 = disabled) | | `--xtc-probability N` | xtc probability (default: 0.00, 0.0 = disabled) | | `--xtc-threshold N` | xtc threshold (default: 0.10, 1.0 = disabled) | | `--typical, --typical-p N` | locally typical sampling, parameter p (default: 1.00, 1.0 = disabled) | | `--repeat-last-n N` | last n tokens to consider for penalize (default: 64, 0 = disabled, -1 = ctx_size) | | `--repeat-penalty N` | penalize repeat sequence of tokens (default: 1.00, 1.0 = disabled) | | `--presence-penalty N` | repeat alpha presence penalty (default: 0.00, 0.0 = disabled) | | `--frequency-penalty N` | repeat alpha frequency penalty (default: 0.00, 0.0 = disabled) | | `--dry-multiplier N` | DRY sampling multiplier (default: 0.00, 0.0 = disabled) | | `--dry-base N` | DRY sampling base value (default: 1.75) | | `--dry-allowed-length N` | allowed length for DRY sampling (default: 2) | | `--dry-penalty-last-n N` | DRY penalty for the last n tokens (default: -1, 0 = disable, -1 = context size) | | `--dry-sequence-breaker STRING` | add sequence breaker for DRY sampling; use "none" for no breakers | | `--adaptive-target N` | adaptive-p: select tokens near this probability (default: -1.00, disabled) | | `--adaptive-decay N` | adaptive-p: decay rate for target adaptation (default: 0.90) | | `--dynatemp-range N` | dynamic temperature range (default: 0.00, 0.0 = disabled) | | `--dynatemp-exp N` | dynamic temperature exponent (default: 1.00) | | `--mirostat N` | use Mirostat sampling (default: 0, 0 = disabled, 1 = Mirostat, 2 = Mirostat 2.0) | | `--mirostat-lr N` | Mirostat learning rate, parameter eta (default: 0.10) | | `--mirostat-ent N` | Mirostat target entropy, parameter tau (default: 5.00) | | `-l, --logit-bias TOKEN_ID(+/-)BIAS` | modifies the likelihood of token appearing in the completion | | `--grammar GRAMMAR` | BNF-like grammar to constrain generations | | `--grammar-file FNAME` | file to read grammar from | | `-j, --json-schema SCHEMA` | JSON schema to constrain generations | | `-jf, --json-schema-file FILE` | File containing a JSON schema to constrain generations | | `-bs, --backend-sampling` | enable backend sampling (experimental) (env: `LLAMA_ARG_BACKEND_SAMPLING`) | ### Server-specific params | Argument | Explanation | | -------- | ----------- | | `-lcs, --lookup-cache-static FNAME` | path to static lookup cache for lookup decoding | | `-lcd, --lookup-cache-dynamic FNAME` | path to dynamic lookup cache for lookup decoding | | `-ctxcp, --ctx-checkpoints, --swa-checkpoints N` | max context checkpoints per slot (default: 32) (env: `LLAMA_ARG_CTX_CHECKPOINTS`) | | `-cpent, --checkpoint-every-n-tokens N` | checkpoint every n tokens during prefill (default: 8192) (env: `LLAMA_ARG_CHECKPOINT_EVERY_NT`) | | `-cram, --cache-ram N` | maximum cache size in MiB (default: 8192, -1 = no limit, 0 = disable) (env: `LLAMA_ARG_CACHE_RAM`) | | `-kvu, --kv-unified, -no-kvu, --no-kv-unified` | single unified KV buffer shared across all sequences (env: `LLAMA_ARG_KV_UNIFIED`) | | `--clear-idle, --no-clear-idle` | save and clear idle slots on new task (default: enabled) (env: `LLAMA_ARG_CLEAR_IDLE`) | | `--context-shift, --no-context-shift` | context shift on infinite text generation (default: disabled) (env: `LLAMA_ARG_CONTEXT_SHIFT`) | | `-r, --reverse-prompt PROMPT` | halt generation at PROMPT | | `-sp, --special` | special tokens output enabled (default: false) | | `--warmup, --no-warmup` | perform warmup with empty run (default: enabled) | | `--spm-infill` | use Suffix/Prefix/Middle pattern for infill (default: disabled) | | `--pooling {none,mean,cls,last,rank}` | pooling type for embeddings (env: `LLAMA_ARG_POOLING`) | | `-np, --parallel N` | number of server slots (default: -1, -1 = auto) (env: `LLAMA_ARG_N_PARALLEL`) | | `-cb, --cont-batching, -nocb, --no-cont-batching` | continuous batching / dynamic batching (default: enabled) (env: `LLAMA_ARG_CONT_BATCHING`) | | `-mm, --mmproj FILE` | path to multimodal projector file (env: `LLAMA_ARG_MMPROJ`) | | `-mmu, --mmproj-url URL` | URL to multimodal projector file (env: `LLAMA_ARG_MMPROJ_URL`) | | `--mmproj-auto, --no-mmproj, --no-mmproj-auto` | auto-detect multimodal projector (default: enabled) (env: `LLAMA_ARG_MMPROJ_AUTO`) | | `--mmproj-offload, --no-mmproj-offload` | GPU offloading for multimodal projector (default: enabled) (env: `LLAMA_ARG_MMPROJ_OFFLOAD`) | | `--image-min-tokens N` | minimum tokens per image for vision models with dynamic resolution (env: `LLAMA_ARG_IMAGE_MIN_TOKENS`) | | `--image-max-tokens N` | maximum tokens per image for vision models with dynamic resolution (env: `LLAMA_ARG_IMAGE_MAX_TOKENS`) | | `-otd, --override-tensor-draft =,...` | override tensor buffer type for draft model | | `-cmoed, --cpu-moe-draft` | keep all MoE weights in CPU for draft model (env: `LLAMA_ARG_CPU_MOE_DRAFT`) | | `-ncmoed, --n-cpu-moe-draft N` | keep MoE weights of first N layers in CPU for draft model (env: `LLAMA_ARG_N_CPU_MOE_DRAFT`) | | `-a, --alias STRING` | model name aliases, comma-separated (env: `LLAMA_ARG_ALIAS`) | | `--tags STRING` | model tags, comma-separated (env: `LLAMA_ARG_TAGS`) | | `--host HOST` | ip address to listen, or UNIX socket if ends with .sock (default: 127.0.0.1) (env: `LLAMA_ARG_HOST`) | | `--port PORT` | port to listen (default: 8080) (env: `LLAMA_ARG_PORT`) | | `--reuse-port` | allow multiple sockets to bind to same port (env: `LLAMA_ARG_REUSE_PORT`) | | `--path PATH` | path to serve static files from (env: `LLAMA_ARG_STATIC_PATH`) | | `--api-prefix PREFIX` | prefix path the server serves from (env: `LLAMA_ARG_API_PREFIX`) | | `--webui-config JSON` | JSON for default WebUI settings (env: `LLAMA_ARG_WEBUI_CONFIG`) | | `--webui-config-file PATH` | JSON file for default WebUI settings (env: `LLAMA_ARG_WEBUI_CONFIG_FILE`) | | `--webui-mcp-proxy, --no-webui-mcp-proxy` | enable MCP CORS proxy - experimental, do not enable in untrusted environments (env: `LLAMA_ARG_WEBUI_MCP_PROXY`) | | `--tools TOOL1,TOOL2,...` | enable built-in tools: read_file, file_glob_search, grep_search, exec_shell_command, write_file, edit_file, apply_diff (env: `LLAMA_ARG_TOOLS`) | | `--webui, --no-webui` | enable the Web UI (default: enabled) (env: `LLAMA_ARG_WEBUI`) | | `--embedding, --embeddings` | restrict to embedding use case only (env: `LLAMA_ARG_EMBEDDINGS`) | | `--rerank, --reranking` | enable reranking endpoint (env: `LLAMA_ARG_RERANKING`) | | `--api-key KEY` | API key(s) for authentication, comma-separated (env: `LLAMA_API_KEY`) | | `--api-key-file FNAME` | path to file containing API keys | | `--ssl-key-file FNAME` | PEM-encoded SSL private key (env: `LLAMA_ARG_SSL_KEY_FILE`) | | `--ssl-cert-file FNAME` | PEM-encoded SSL certificate (env: `LLAMA_ARG_SSL_CERT_FILE`) | | `--chat-template-kwargs STRING` | additional params for json template parser (env: `LLAMA_CHAT_TEMPLATE_KWARGS`) | | `-to, --timeout N` | server read/write timeout in seconds (default: 600) (env: `LLAMA_ARG_TIMEOUT`) | | `--threads-http N` | threads for HTTP request processing (default: -1) (env: `LLAMA_ARG_THREADS_HTTP`) | | `--cache-prompt, --no-cache-prompt` | prompt caching (default: enabled) (env: `LLAMA_ARG_CACHE_PROMPT`) | | `--cache-reuse N` | min chunk size for KV shifting cache reuse (default: 0) (env: `LLAMA_ARG_CACHE_REUSE`) | | `--metrics` | enable prometheus compatible metrics endpoint (env: `LLAMA_ARG_ENDPOINT_METRICS`) | | `--props` | enable changing global properties via POST /props (env: `LLAMA_ARG_ENDPOINT_PROPS`) | | `--slots, --no-slots` | expose slots monitoring endpoint (default: enabled) (env: `LLAMA_ARG_ENDPOINT_SLOTS`) | | `--slot-save-path PATH` | path to save slot kv cache | | `--media-path PATH` | directory for loading local media files | | `--models-dir PATH` | directory containing models for router server (env: `LLAMA_ARG_MODELS_DIR`) | | `--models-preset PATH` | path to INI file containing model presets (env: `LLAMA_ARG_MODELS_PRESET`) | | `--models-max N` | max models to load simultaneously in router (default: 4, 0 = unlimited) (env: `LLAMA_ARG_MODELS_MAX`) | | `--models-autoload, --no-models-autoload` | auto-load models in router mode (default: enabled) (env: `LLAMA_ARG_MODELS_AUTOLOAD`) | | `--jinja, --no-jinja` | use jinja template engine for chat (default: enabled) (env: `LLAMA_ARG_JINJA`) | | `--reasoning-format FORMAT` | thought tag handling: none, deepseek, deepseek-legacy (default: auto) (env: `LLAMA_ARG_THINK`) | | `-rea, --reasoning [on\|off\|auto]` | reasoning/thinking in chat (default: auto) (env: `LLAMA_ARG_REASONING`) | | `--reasoning-budget N` | token budget for thinking: -1 unrestricted, 0 immediate end, N>0 budget (default: -1) (env: `LLAMA_ARG_THINK_BUDGET`) | | `--reasoning-budget-message MESSAGE` | message injected when reasoning budget exhausted (env: `LLAMA_ARG_THINK_BUDGET_MESSAGE`) | | `--chat-template JINJA_TEMPLATE` | custom jinja chat template or built-in name (env: `LLAMA_ARG_CHAT_TEMPLATE`) | | `--chat-template-file JINJA_TEMPLATE_FILE` | custom jinja chat template file (env: `LLAMA_ARG_CHAT_TEMPLATE_FILE`) | | `--skip-chat-parsing, --no-skip-chat-parsing` | force pure content parser (env: `LLAMA_ARG_SKIP_CHAT_PARSING`) | | `--prefill-assistant, --no-prefill-assistant` | prefill assistant response (default: enabled) (env: `LLAMA_ARG_PREFILL_ASSISTANT`) | | `-sps, --slot-prompt-similarity SIMILARITY` | prompt similarity threshold for slot reuse (default: 0.10) | | `--lora-init-without-apply` | load LoRA adapters without applying | | `--sleep-idle-seconds SECONDS` | seconds of idleness before server sleeps (default: -1, disabled) | | `-td, --threads-draft N` | threads for draft model generation | | `-tbd, --threads-batch-draft N` | threads for draft model batch processing | | `--draft, --draft-n, --draft-max N` | tokens to draft for speculative decoding (default: 16) (env: `LLAMA_ARG_DRAFT_MAX`) | | `--draft-min, --draft-n-min N` | minimum draft tokens for speculative decoding (default: 0) (env: `LLAMA_ARG_DRAFT_MIN`) | | `--draft-p-min P` | minimum speculative decoding probability (default: 0.75) (env: `LLAMA_ARG_DRAFT_P_MIN`) | | `-cd, --ctx-size-draft N` | prompt context size for draft model (env: `LLAMA_ARG_CTX_SIZE_DRAFT`) | | `-devd, --device-draft ` | devices for draft model offloading | | `-ngld, --gpu-layers-draft N` | draft model GPU layers (default: auto) (env: `LLAMA_ARG_N_GPU_LAYERS_DRAFT`) | | `-md, --model-draft FNAME` | draft model for speculative decoding (env: `LLAMA_ARG_MODEL_DRAFT`) | | `--spec-replace TARGET DRAFT` | translate strings between main and draft model | | `--spec-type [none\|ngram-cache\|ngram-simple\|ngram-map-k\|ngram-map-k4v\|ngram-mod]` | speculative decoding type without draft model (env: `LLAMA_ARG_SPEC_TYPE`) | | `--spec-ngram-size-n N` | ngram size N for ngram speculative decoding (default: 12) | | `--spec-ngram-size-m N` | ngram size M for ngram speculative decoding (default: 48) | | `--spec-ngram-min-hits N` | minimum hits for ngram-map speculative decoding (default: 1) | | `-mv, --model-vocoder FNAME` | vocoder model for audio generation | | `--tts-use-guide-tokens` | Use guide tokens to improve TTS word recall | | `--embd-gemma-default` | use default EmbeddingGemma model | | `--fim-qwen-1.5b-default` | use default Qwen 2.5 Coder 1.5B | | `--fim-qwen-3b-default` | use default Qwen 2.5 Coder 3B | | `--fim-qwen-7b-default` | use default Qwen 2.5 Coder 7B | | `--fim-qwen-7b-spec` | use Qwen 2.5 Coder 7B + 0.5B draft | | `--fim-qwen-14b-spec` | use Qwen 2.5 Coder 14B + 0.5B draft | | `--fim-qwen-30b-default` | use default Qwen 3 Coder 30B A3B Instruct | | `--gpt-oss-20b-default` | use gpt-oss-20b | | `--gpt-oss-120b-default` | use gpt-oss-120b | | `--vision-gemma-4b-default` | use Gemma 3 4B QAT | | `--vision-gemma-12b-default` | use Gemma 3 12B QAT | ## Environment Variables If both command line argument and environment variable are set for the same param, the argument takes precedence. For boolean options like `--mmap` or `--kv-offload`, environment variable handling: - `LLAMA_ARG_MMAP=true` / `1` / `on` / `enabled` → enabled - `LLAMA_ARG_MMAP=false` / `0` / `off` / `disabled` → disabled - Presence of `LLAMA_ARG_NO_MMAP` → disabled ### Docker Compose Example ```yml services: llamacpp-server: image: ghcr.io/ggml-org/llama.cpp:server ports: - 8080:8080 volumes: - ./models:/models environment: LLAMA_ARG_MODEL: /models/my_model.gguf LLAMA_ARG_CTX_SIZE: 4096 LLAMA_ARG_N_PARALLEL: 2 LLAMA_ARG_ENDPOINT_METRICS: 1 LLAMA_ARG_PORT: 8080 ``` ## Multimodal Support Multimodal support is currently an experimental feature. Available in: - OAI-compatible chat endpoint - Non-OAI-compatible completions endpoint - Non-OAI-compatible embeddings endpoint The multimodal projector is auto-detected when using `-hf`. Use `--no-mmproj` to disable. ## Built-in Tools Built-in tools enable the LLM to access the local file system from the Web UI. Start with `--tools all` or specify individual tools: `--tools read_file,file_glob_search,...`. Available tools: `read_file`, `file_glob_search`, `grep_search`, `exec_shell_command`, `write_file`, `edit_file`, `apply_diff` > ⚠️ Do not enable in untrusted environments. ## Build ### Standard Build ```bash cmake -B build cmake --build build --config Release -t llama-server ``` Binary: `./build/bin/llama-server` ### Build with SSL (OpenSSL 3) ```bash cmake -B build -DLLAMA_OPENSSL=ON cmake --build build --config Release -t llama-server ``` ## Quick Start ### Unix (Linux, macOS) ```bash ./llama-server -m models/7B/ggml-model.gguf -c 2048 ``` ### Windows ```powershell llama-server.exe -m models\7B\ggml-model.gguf -c 2048 ``` Listens on `127.0.0.1:8080` by default. ### Docker ```bash docker run -p 8080:8080 -v /path/to/models:/models ghcr.io/ggml-org/llama.cpp:server -m models/7B/ggml-model.gguf -c 512 --host 0.0.0.0 --port 8080 # With CUDA: docker run -p 8080:8080 -v /path/to/models:/models --gpus all ghcr.io/ggml-org/llama.cpp:server-cuda -m models/7B/ggml-model.gguf -c 512 --host 0.0.0.0 --port 8080 --n-gpu-layers 99 ``` ## Using with cURL ```sh curl --request POST \ --url http://localhost:8080/completion \ --header "Content-Type: application/json" \ --data '{"prompt": "Building a website can be done in 10 simple steps:","n_predict": 128}' ``` --- ## API Endpoints ### GET `/health` — Health Check Public endpoint (no API key). `/v1/health` also works. - **503**: `{"error": {"code": 503, "message": "Loading model", "type": "unavailable_error"}}` - **200**: `{"status": "ok"}` --- ### POST `/completion` — Text Completion > ⚠️ Not OAI-compatible. Use `/v1/completions` for OAI clients. **Request options:** | Field | Type | Default | Description | |-------|------|---------|-------------| | `prompt` | string/array/object | required | Prompt as string, token array, mixed, or JSON with multimodal data | | `temperature` | float | 0.8 | Randomness of generated text | | `dynatemp_range` | float | 0.0 | Dynamic temperature range | | `dynatemp_exponent` | float | 1.0 | Dynamic temperature exponent | | `top_k` | int | 40 | Limit to K most probable tokens | | `top_p` | float | 0.95 | Nucleus sampling threshold | | `min_p` | float | 0.05 | Minimum probability relative to most likely token | | `n_predict` | int | -1 | Max tokens to predict (-1 = infinity) | | `n_indent` | int | 0 | Min line indentation (for code completion) | | `n_keep` | int | 0 | Tokens to retain when context exceeded (-1 = all) | | `n_cmpl` | int | - | Number of completions per prompt | | `n_cache_reuse` | int | 0 | Min chunk size for KV shifting cache reuse | | `stream` | bool | false | Stream tokens in real-time via SSE | | `stop` | array | [] | Stopping strings (not included in output) | | `typical_p` | float | 1.0 | Locally typical sampling parameter | | `repeat_penalty` | float | 1.1 | Repetition penalty | | `repeat_last_n` | int | 64 | Tokens to consider for repeat penalty | | `presence_penalty` | float | 0.0 | Presence penalty | | `frequency_penalty` | float | 0.0 | Frequency penalty | | `dry_multiplier` | float | 0.0 | DRY repetition penalty multiplier | | `dry_base` | float | 1.75 | DRY penalty base | | `dry_allowed_length` | int | 2 | DRY allowed repeating length | | `dry_penalty_last_n` | int | -1 | Tokens to scan for DRY | | `dry_sequence_breakers` | array | ['\n',':','"','*'] | DRY sequence breakers | | `xtc_probability` | float | 0.0 | XTC token removal chance | | `xtc_threshold` | float | 0.1 | XTC minimum probability threshold | | `mirostat` | int | 0 | Mirostat mode (0=off, 1, 2) | | `mirostat_tau` | float | 5.0 | Mirostat target entropy | | `mirostat_eta` | float | 0.1 | Mirostat learning rate | | `grammar` | string | - | BNF grammar for constrained generation | | `json_schema` | object | - | JSON schema for constrained generation | | `seed` | int | -1 | RNG seed (-1 = random) | | `ignore_eos` | bool | false | Ignore EOS token | | `logit_bias` | array/object | [] | Modify token likelihoods | | `n_probs` | int | 0 | Return top N token probabilities | | `min_keep` | int | 0 | Force minimum tokens from samplers | | `t_max_predict_ms` | int | 0 | Time limit for prediction phase (ms) | | `id_slot` | int | -1 | Assign to specific slot | | `cache_prompt` | bool | true | Re-use KV cache from previous request | | `return_tokens` | bool | false | Return raw token IDs | | `samplers` | array | [dry,top_k,typ_p,top_p,min_p,xtc,temperature] | Sampler order | | `timings_per_token` | bool | false | Include speed info per token | | `return_progress` | bool | false | Include prompt processing progress in stream mode | | `post_sampling_probs` | bool | false | Return probabilities after sampling | | `response_fields` | array | - | List of specific response fields to return | | `lora` | array | - | Per-request LoRA adapters: `[{"id": 0, "scale": 0.5}]` | **Prompt input shapes:** - Single string: `"string"` - Single token sequence: `[12, 34, 56]` - Mixed tokens and strings: `[12, 34, "string", 56, 78]` - JSON object with multimodal: `{"prompt_string": "string", "multimodal_data": ["base64"]}` - Multiple prompts: `["string1", "string2"]` **Response format:** ```json { "content": "", "tokens": [], "stop": true, "stop_type": "eos|limit|word|none", "stopping_word": "", "completion_probabilities": [...], "generation_settings": {...}, "model": "", "prompt": "", "tokens_cached": 0, "tokens_evaluated": 0, "truncated": false, "timings": {...} } ``` --- ### POST `/tokenize` — Tokenize Text **Options:** | Field | Type | Default | Description | |-------|------|---------|-------------| | `content` | string | required | Text to tokenize | | `add_special` | bool | false | Insert special tokens (BOS) | | `parse_special` | bool | true | Parse special tokens | | `with_pieces` | bool | false | Return token pieces with IDs | **Response:** Without pieces: `{"tokens": [123, 456, 789]}` With pieces: `{"tokens": [{"id": 123, "piece": "Hello"}, ...]}` --- ### POST `/detokenize` — Convert Tokens to Text **Options:** | Field | Type | Description | |-------|------|-------------| | `tokens` | array | Token IDs to detokenize | --- ### POST `/apply-template` — Apply Chat Template Formats chat messages to a single prompt string without performing inference. **Options:** | Field | Type | Description | |-------|------|-------------| | `messages` | array | Chat turns (same format as `/v1/chat/completions`) | **Response:** `{"prompt": ""}` --- ### POST `/embedding` — Generate Embedding > ⚠️ Not OAI-compatible. Use `/v1/embeddings` for OAI clients. Supports multimodal embeddings. **Options:** | Field | Type | Description | |-------|------|-------------| | `content` | string | Text to embed | | `embd_normalize` | int | -1=none, 0=max abs, 1=taxicab, 2=euclidean, >2=p-norm | --- ### POST `/reranking` — Rerank Documents Aliases: `/rerank`, `/v1/rerank`, `/v1/reranking` Requires reranker model with `--embedding --pooling rank`. **Options:** | Field | Type | Description | |-------|------|-------------| | `query` | string | Query to rank against | | `documents` | array | Array of document strings | | `top_n` | int | Top N results | **Example:** ```shell curl http://127.0.0.1:8012/v1/rerank \ -H "Content-Type: application/json" \ -d '{ "model": "some-model", "query": "What is panda?", "top_n": 3, "documents": ["hi", "it is a bear", "The giant panda..."] }' ``` --- ### POST `/infill` — Code Infilling Takes prefix and suffix, returns predicted completion. **Options:** | Field | Type | Description | |-------|------|-------------| | `input_prefix` | string | Code prefix | | `input_suffix` | string | Code suffix | | `input_extra` | array | Additional context: `[{"filename": "...", "text": "..."}]` | | `prompt` | string | Added after FIM_MID token | Also accepts all `/completion` options. **Repo-level pattern** (if model has `FIM_REPO` and `FIM_FILE_SEP`): ``` myproject {chunk filename} {chunk text} ... filename [prefix][suffix][prompt] ``` --- ### GET `/props` — Server Properties Returns server global properties including default generation settings, model path, chat template, modalities, and build info. Enable POST modification with `--props`. **Response includes:** - `default_generation_settings` — default params for `/completion` - `total_slots` — number of parallel slots - `model_path` — model file path - `chat_template` — Jinja2 template - `chat_template_caps` — template capabilities - `modalities` — supported modalities - `is_sleeping` — sleep mode status --- ### GET `/slots` — Slot Monitoring Returns per-slot processing state, metrics, speed, tokens, sampling parameters. Disable with `--no-slots`. Query param `?fail_on_no_slot=1` returns 503 if no slots available. --- ### GET `/metrics` — Prometheus Metrics Enable with `--metrics`. **Available metrics:** - `llamacpp:prompt_tokens_total` — prompt tokens processed - `llamacpp:tokens_predicted_total` — generation tokens processed - `llamacpp:prompt_tokens_seconds` — avg prompt throughput (tokens/s) - `llamacpp:predicted_tokens_seconds` — avg generation throughput (tokens/s) - `llamacpp:kv_cache_usage_ratio` — KV-cache usage (1 = 100%) - `llamacpp:kv_cache_tokens` — KV-cache tokens - `llamacpp:requests_processing` — requests currently processing - `llamacpp:requests_deferred` — requests deferred - `llamacpp:n_tokens_max` — high watermark context size --- ### POST `/slots/{id_slot}?action=save` — Save Slot Cache **Options:** `filename` — file name (saved in `--slot-save-path`) **Response:** `{"id_slot": 0, "filename": "...", "n_saved": N, "n_written": N, "timings": {...}}` ### POST `/slots/{id_slot}?action=restore` — Restore Slot Cache **Options:** `filename` — file to restore from `--slot-save-path` ### POST `/slots/{id_slot}?action=erase` — Erase Slot Cache **Response:** `{"id_slot": 0, "n_erased": N}` --- ### GET `/lora-adapters` — List LoRA Adapters Returns loaded LoRA adapters with id, path, and scale. ### POST `/lora-adapters` — Set LoRA Adapter Scales Sets global scale for LoRA adapters. Overridden by per-request `lora` field. ```json [{"id": 0, "scale": 0.2}, {"id": 1, "scale": 0.8}] ``` --- ## OpenAI-Compatible API Endpoints ### GET `/v1/models` — Model Info Returns loaded model information. Always returns single-element list. `id` defaults to model file path; override with `--alias`. ### POST `/v1/completions` — OAI Completions Standard OpenAI Completions API. Supports llama.cpp-specific features like `mirostat`. **Example (Python):** ```python import openai client = openai.OpenAI( base_url="http://localhost:8080/v1", api_key="sk-no-key-required" ) completion = client.completions.create( model="davinci-002", prompt="I believe the meaning of life is", max_tokens=8 ) ``` ### POST `/v1/chat/completions` — OAI Chat Completions Supports ChatML-formatted messages, streaming, function calling, tool use, reasoning, and multimodal input. **Response includes `timings` object:** - `cache_n` — prompt tokens reused from cache - `prompt_n` — prompt tokens being processed - `predicted_n` — predicted tokens Total context tokens = `prompt_n + cache_n + predicted_n` **Additional options:** - `response_format` — JSON output with optional schema - `chat_template_kwargs` — additional template parameters - `reasoning_format` — reasoning parsing mode - `generation_prompt` — prefilled generation prompt - `parse_tool_calls` — parse tool calls - `parallel_tool_calls` — enable parallel tool calls **Example:** ```python client = openai.OpenAI(base_url="http://localhost:8080/v1", api_key="sk-no-key-required") completion = client.chat.completions.create( model="gpt-3.5-turbo", messages=[ {"role": "system", "content": "You are ChatGPT..."}, {"role": "user", "content": "Write a limerick about python exceptions"} ] ) ``` ### POST `/v1/responses` — OAI Responses API Converts Responses request into Chat Completions request internally. **Example:** ```python response = client.responses.create( model="gpt-4.1", instructions="You are ChatGPT...", input="Write a limerick about python exceptions" ) ``` ### POST `/v1/embeddings` — OAI Embeddings Requires model with pooling type other than `none`. Embeddings normalized using Euclidean norm. Supports string or array of strings as input. ### POST `/v1/messages` — Anthropic-Compatible Messages API Supports streaming via SSE. Tool use requires `--jinja`. **Options:** | Field | Type | Description | |-------|------|-------------| | `model` | string | Model identifier (required) | | `messages` | array | Message objects with role and content (required) | | `max_tokens` | int | Max tokens to generate (default: 4096) | | `system` | string/array | System prompt | | `temperature` | float | Sampling temperature 0-1 (default: 1.0) | | `top_p` | float | Nucleus sampling (default: 1.0) | | `top_k` | int | Top-k sampling | | `stop_sequences` | array | Stop sequences | | `stream` | bool | Enable streaming (default: false) | | `tools` | array | Tool definitions | | `tool_choice` | object | `{"type": "auto"}` / `{"type": "any"}` / `{"type": "tool", "name": "..."}` | ### POST `/v1/messages/count_tokens` — Token Counting Counts tokens without generating. Same params as `/v1/messages` except `max_tokens`. **Response:** `{"input_tokens": 10}` --- ## Multiple Models (Router Mode) Launch without specifying a model to enter router mode: ```sh llama-server ``` ### Model Sources 1. **Cached models** (controlled by `LLAMA_CACHE` env var) 2. **Custom directory** (`--models-dir`) 3. **Custom preset** (`--models-preset`) Add Hugging Face models to cache: ```sh llama-server -hf /: ``` ### Directory Structure for `--models-dir` ``` models_directory/ ├─ llama-3.2-1b-Q4_K_M.gguf # single file ├─ Qwen3-8B-Q4_K_M.gguf # single file ├─ gemma-3-4b-it-Q8_0/ # multimodal │ ├─ gemma-3-4b-it-Q8_0.gguf │ └─ mmproj-F16.gguf ├─ Kimi-K2-Thinking-UD-IQ1_S/ # multi-shard │ ├─ ...-00001-of-00006.gguf │ └─ ...-00006-of-00006.gguf ``` ### Model Presets (INI File) ```ini version = 1 [*] c = 8192 n-gpu-layers = 8 [ggml-org/MY-MODEL-GGUF:Q8_0] chat-template = chatml n-gpu-layers = 123 jinja = true c = 4096 [custom_model] model = /path/to/my-awesome-model-Q4_K_M.gguf ``` **Precedence:** CLI args > model-specific preset > global preset `[*]` **Preset-exclusive options:** - `load-on-startup` (bool) — auto-load on server start - `stop-timeout` (int, seconds) — wait before forcing termination (default: 10) ### Routing POST endpoints use `"model"` field in JSON body. GET endpoints use `model` query parameter. Auto-load can be disabled with `--no-models-autoload` or per-request `?autoload=true|false`. ### Router API Endpoints #### GET `/models` — List Available Models Returns all models with status (loaded, loading, sleeping, unloaded, failed). #### POST `/models/load` — Load a Model ```json {"model": "ggml-org/gemma-3-4b-it-GGUF:Q4_K_M"} ``` #### POST `/models/unload` — Unload a Model ```json {"model": "ggml-org/gemma-3-4b-it-GGUF:Q4_K_M"} ``` --- ## Error Format Errors follow the OpenAI format: ```json { "error": { "code": 401, "message": "Invalid API Key", "type": "authentication_error" } } ``` **Custom error types:** - `not_supported_error` (501) — disabled endpoint - `invalid_request_error` (400) — invalid grammar --- ## Sleeping on Idle Enable with `--sleep-idle-seconds N`. Unloads model and KV cache after N seconds of inactivity. Any new task triggers reload. **Exempt endpoints** (don't trigger reload or reset timer): `/health`, `/props`, `/models` Check status via `GET /props` (`is_sleeping` field). --- ## Web UI ### Custom Default Preferences ```bash ./llama-server -m model.gguf --webui-config '{"pasteLongTextToFileLen": 0, "renderUserContentAsMarkdown": true}' ``` ### Legacy Completion UI ```sh ./llama-server -m my_model.gguf -c 8192 --path ./tools/server/public_legacy ``` ### Custom Front End Serve from `--path ./your-directory` and import `/completion.js` for `llamaComplete()`. ```html
      
    
```