Repository navigation
v4.12.0 #12830
mudler
announced in
Announcements
v4.12.0
#12830
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
🎉 LocalAI 4.12.0 Release! 🚀
LocalAI 4.12.0 is out!
This release redesigns the web UI and adds streaming voice responses, native decision routing, and more control over model memory and prompt state. It also adds image upscaling, live motion capture, Qdrant stores, and authenticated chat history. It is also a preparation for the upcoming release which will include addon support. Our plan is to move few components (e.g. Studio, Talk) to separate add-ons that can be installed on-demand from LocalAI.
Highlights:
/v1/decisionsadapter for predicates, choices, and scores./v1/images/upscaleAPI.The shared navigation and composer organize the web UI around models, chat, Studio, and operations.
📊 This release in numbers
Counts compare
v4.11.0with the release-preparation snapshot. Direct commits include user-facing features as well as gallery and maintenance work.📌 TL;DR
/v1/decisionsadapts predicates, choices, and scores to the existing SystemOne pipeline./stores/*, with explicit backend selection, TLS, and chunked writes.moe_cache_mib,lazy_mode, and opt-in slot save/restore add workload-specific controls without changing them into universal performance guarantees.🚀 New Features & Major Enhancements
🖥️ A shared web UI and clearer model operations
The web UI uses a shared CSS/SVG kit, ink-and-teal themes, consistent controls, and permission-aware Build and Operate hubs. Existing URLs remain available. Models exposes model details, variants, placement information, and disk usage. Studio shares a compose, job, result, and recent-results layout across its workflows.
Per-model storage accounting distinguishes shared files from model-specific files. Aggregate totals deduplicate shared bytes. A model's displayed size is not necessarily the space deleting it reclaims.
Remote manual imports now run as tracked gallery jobs. The import page and editor wait for acquisition to succeed and show failures or cancellation. Local-file imports without downloads retain synchronous behavior. Queued imports can apply recommended inference defaults, so set important parameters explicitly when reproducing a configuration.
Backends supports confirmed removal of one concrete build from one selected node. Protection checks and conflict locks prevent removal during conflicting operations. Refresh failures retain the last known inventory instead of reporting an unverified empty state.
💬 Chat history, reasoning controls, and richer input
Signed-in users can synchronize conversations through
/api/conversations. Account-scoped caches, persistent deletion intents, and tombstones prevent stale clients from restoring deleted conversations. This requires authentication, the WebUI enabled, and thechat_historypermission. Anonymous and legacy-key-only sessions keep browser-local history; old shared browser history is not automatically assigned to an account.One effort picker controls the per-chat
reasoning_effortrequest. None also hides returned reasoning traces for new replies./effortremains available; the separate/reasoningaction is removed. This UI choice does not prove that every backend suppresses internal reasoning computation.Microphone dictation appends editable text through an installed transcription model. Scanned PDFs without a text layer render their first ten pages as image attachments for a vision-capable model.
Canvas serves HTML previews with their own CSP in a sandbox without
allow-same-origin. Previews expire after ten minutes and live in process memory. Allowed external HTTPS resources can load, so previews are not necessarily offline. Multi-frontend deployments need routing that reaches the process holding the preview.Choose reasoning effort per conversation and edit dictated text before sending.
🎙️ Streaming voice responses and bundled audio analysis
Qwen TTS accepts incremental text through the optional
TTSLivebackend RPC. With LLM and TTS streaming enabled, one native utterance can start producing audio before the complete LLM reply arrives. Cancellation and backpressure propagate through the live path; a failed utterance does not replay after audio commitment.For non-native engines,
pipeline.streaming.clause_chunking: trueexplicitly enables bounded clause synthesis. Leaving it unset preserves whole-reply synthesis. Native Qwen input does not use this clause splitter.The gallery adds
qwen3-streaming-assistant,vits-streaming-assistant, andpiper-streaming-assistant. These presets install pipeline configuration only. Install their component LLM, transcription model, VAD, and TTS model separately.Parakeet bundles can carry multiple audio roles, including ASR, VAD, diarization, sound detection, and a speaker encoder. Available roles depend on the bundle; they do not imply one fused inference pass. Diarization can return timed sound events with
include_sounds.Speaker-equipped Parakeet models can also serve voice embedding and verification. Encoder fingerprints distinguish compatible weights, and voice stores separate different embedding dimensions.
voice_verify_thresholduses cosine distance, defaults to0.5, and accepts values between0and2. This backend does not add anti-spoofing or voice-analysis support.Realtime responses now wait for earlier audio commits to finish transcription. A waiting response ends with
input_not_committedif its pending commit produces no user item, instead of starting the LLM without that turn.interrupt_response: falsepreserves an active response while retaining overlapping transcripts and sound events.🎵 Structured Sound expansion and speech controls
YuE2 joins the audio.cpp sound-generation path. Ordinary Studio captions supply its style unless an explicit style parameter overrides them. YuE2 weights use CC-BY-NC-4.0 and are limited to non-commercial use.
Simple Sound can optionally use
expansion_modelto turn a short description into validated music fields. Final release behavior requires allama-cppmodel withuse_tokenizer_template: trueand native tool support. LocalAI requires exactly one strictexpand_soundcall; prose JSON and reasoning text are not fallback arguments. Invalid expansion stops before audio generation.OmniVoice exposes bounded duration and postprocessing controls through speech parameters. Duration is capped at 30 seconds and quantized to generation frames. This does not guarantee an exact final WAV duration. Pocket TTS also accepts a model-load language option, such as
options: ["language:french"].🖼️ Image upscaling and additional generation controls
POST /v1/images/upscaleprovides dedicated upscaling with explicit model capability checks. Studio records the output as a child image so you can continue working within the same project. Native ESRGAN mode supports tiling without loading a diffusion context. Requested scale must match the model's native scale; it is not arbitrary-scale interpolation.custom_sigmasexposes checkpoint-specific denoising schedules. New Qwen Image assemblies use those schedules; the selected encoders make these entries text-to-image only. Their model and encoder licenses still apply.MiniMax-H3 gains additive reference-image, reference-video, and WAV-audio fields with partition checks and bounded inputs. These fields are API-only in this release; React does not expose them. Source support does not establish end-to-end generation on every checkpoint or device.
🧭 Native decision routing and
/v1/decisionsDecision models can classify requests directly for a router instead of using a general chat response as the classification protocol. The native path also supports bounded inline image decisions with a compatible format and projector.
POST /v1/decisionsadapts the existing SystemOne pipeline to predicates, choices, and scores. It supports up to 64 questions and preserves typed boolean or string choices./v1/systemoneremains available.Image input requires an image-capable decision model and inline PNG or JPEG data. Unsupported inputs fail rather than silently becoming text-only decisions. Existing Decisions permissions and usage accounting apply.
Older installed llama.cpp images may lack native Decisions support even when the server is current. Recognized stale-backend errors now return an upgrade-oriented
501and mark the backend for upgrade. This detection does not itself rebuild an image.🛡️ Privacy controls, model profiles, and remote MCP authentication
PII middleware now covers incoming Responses instructions, text items, function arguments, and serialized tool output.
pii.block_unscanned_media: trueoptionally rejects media the text detectors cannot inspect. It blocks rather than OCRs or transcribes media.Adjacent-word extension and protected-term files add opt-in control over NER masking. Protected terms apply to NER only, not pattern detectors. They pass wherever the same term occurs, so allowlist only values safe to disclose. Extensions can over-mask.
These changes do not provide complete filtering across every request path. Agent interception and resolved historical Responses content remain gaps. Responses WebSockets with an active detector policy are refused rather than filtered; use HTTP POST for that policy.
Aliases can carry
profile.system_prompt, MCP configuration, and client-tool policy while sharing one loaded target model.mcp.autoactivates configured servers only within instance and user permissions. Optional numerical evidence notes are a warning heuristic, not factual verification.Remote MCP servers support OAuth2
client_credentials, including environment-backed secrets and automatic token refresh. Token endpoints require HTTPS except explicit loopback hosts. Credential rotation through environment variables requires restarting the connection-owning process. Legacy SSE discovery remains available with constrained fallback.🕺 GEM-X live motion capture
The new
gemxcppbackend converts streamed RGB frames into human poses through/api/motion/sessionsand a duplex WebSocket. Clients can select SOMA-77 or SMPL-24 output and use single-use, origin-bound browser tickets.The API bounds ingress and session counts rather than accumulating an unlimited capture backlog. Limits include one session per model, four per user, and sixteen per frontend. Clients must follow flow-control credits.
This integration is API-only and supports CPU or Vulkan; macOS uses CPU, not Metal inference. It does not provide a body mesh, robot controller, or person re-identification. Session state is frontend-local. GEM-X weights carry their own NVIDIA model-license terms.
🗄️ Qdrant-backed vector stores
Use
backend: qdrant-storethrough the existing/stores/*API to persist vectors in Qdrant. Configuration supports TLS, custom certificate authorities, and environment-backed API keys. Qdrant's gRPC default is port6334, not REST port6333.Writes use chunks of at most 500 points with a timeout per chunk. Earlier chunks can remain written if a later chunk fails; a whole set is not atomic.
COSINEis the default metric. Other metrics return raw scores that do not match existing cosine-based thresholds.💾 Model memory controls and saved prompt state
options: ["moe_cache_mib:4096"]sets an opt-in GPU cache budget for host-resident MoE experts. It consumes VRAM and is workload-dependent; undersized caches can thrash.options: ["lazy_mode:on"]enables lazy reads for upstream-marked tensors.autoretains upstream selection rules;offloads them at startup. Forks without the field warn and ignore the option.options: ["slot_save_path:/var/lib/localai/slots"]enables admin slot save/restore through/v1/slots/saveand/v1/slots/restore. Saved prompt state survives model unloading. Use compatible model, quantization, and context settings; saved files are sensitive data.Slot persistence is POSIX-only, keeps at most 32 saves per model, and does not coordinate multiple processes sharing a directory. A busy slot waits for its active request. These controls do not imply a release-wide latency or memory improvement.
🔧 Distributed recovery and opt-in diagnostics
PostgreSQL/NATS deployments gain load generations, leases, worker watchdogs, and attempt-specific cancellation through
POST /api/models/:id/load-cancel. Upgrade frontends first. Model config resync defaults to 30 seconds through--model-config-resync-interval.Root PostgreSQL collection discovery now uses a shared registry across frontends. Per-user collections are outside that change. Targeted unloading frees the named model rather than an arbitrary worker backend. These are NATS distributed-mode changes, not libp2p federation features.
Admin stop intent is not made durable by config resync: replica policies can still restart a stopped model. Do not treat resync as a persisted stop policy.
Opt-in
--pprofexposes a separate numeric-loopback-only profiler.--request-phase-timingrecords frontend phases without adding filesystem probes. Profiles can contain sensitive data and add overhead; do not expose the profiler through public ingress. These measurements cover the Go frontend, not GPU inference on workers.🧰 Smaller features worth knowing about
--prefer-development-backends. Activation requires a frontend restart and separate worker configuration/restarts. fix(backends): prefer installed development builds #12782.--download-staging-path. fix(oci): stage image downloads in a configured directory, not in /tmp #12280.🐛 Bug Fixes (recap)
fix(realtime): preserve committed speech across barge-in, order transcription before response generation, and honor interruption controls. fix(realtime): detach VAD-commit transcription from barge-in cancellation #12446 and direct follow-ups.fix(nodes): stage dedicated diarization audio on remote workers. fix(nodes): stage dedicated diarization audio #12474.fix(audio-cpp): forward saved voice reference transcripts. fix(audio-cpp): forward voice reference transcripts #11997.fix(sound): preserve distinct recordings after FLAC normalization. fix(audio): preserve generated sound recordings #12641.fix(chat-history): initialize the store after opening the auth database. fix(chat-history): create the store after the auth database is opened #12788.fix(openresponses): retain synchronous server-side MCP calls and results for follow-up replay. fix(openresponses): keep server-side MCP tool items on synchronous paths #12711.fix(rocm): locate bundled Tensile data in architecture directories. fix(rocm): point *_TENSILE_LIBPATH at the architecture folder #12411.fix(packaging): skip Linux GPU-library collection on Darwin. fix(packaging): skip Linux GPU libraries on Darwin #12466.fix(model): remove exited backends from loaded-model listings. fix(model): stop listing a backend that exited on its own #12497.fix(vram): reject oversized GGUF metadata before allocation. fix(vram): reject oversized GGUF metadata before allocation #12560.fix(distributed): target model unloads and recover abandoned load attempts. fix(distributed): bound, stop and cancel model loads with leases and worker operations #12524, fix(distributed): free only the named model on model.unload #12537.fix(ui): repair mobile variant tables and model-import advanced controls. fix(ui): repair model layout and CI assertions #12587, fix(ui): repair model import advanced controls #12599.fix(gallery): move context options to the correct config level. Existing installed configs may need manual correction. fix(gallery): place context options at the root #12590.fix(vllm-cpp): pin the MLX version expected by the engine. fix(vllm-cpp): pin MLX 0.32.0, the version the engine builds against #12734.fix(diffusers): drop negative prompts only when negative embeddings are supplied. Commit.🧠 Models
The gallery index grows from 1,660 to 1,896 top-level named entries (+236). This counts separate top-level variants, not nested variant references.
The Models category contains 29 PRs: 11 addition or aggregate PRs and 18 checksum-maintenance PRs. Direct gallery commits add further variants; these are change counts, not counts of distinct model architectures.
Additions include Fluid Speech Mini, multilingual Parakeet bundles with speaker support, Moondream VAD slices, LFM2.5 24B variants, MiniCPM-V 4.7 1B variants, Iris-3B, FLUX.3 Image Klein, MOSS-Image, and experimental Fish Drama 3. Runtime-backed additions elsewhere in these notes include Qwen image schedules, RealESRGAN, streaming assistant presets, and native Decisions models.
Check each model card for weight licenses, hardware requirements, and experimental limitations. A gallery entry is not proof of validation on every backend or device.
👒 Dependencies
The range includes 90 dependency PRs. Repository names below remain distinct, including llama.cpp forks.
CrispStrobe/CrispASRikawrakow/ik_llama.cpp0xShug0/audio.cppleejet/stable-diffusion.cppPrismML-Eng/llama.cppggml-org/whisper.cppggml-org/llama.cppServeurpersoCom/omnivoice.cppmudler/vllm.cppmudler/parakeet.cppTheTom/llama-cpp-turboquantantirez/ds4localai-org/voice-detect.cppmudler/LocalRecallFeature PRs also update some pins. Dependency counts alone do not describe every final engine revision.
📖 Documentation
Feature documentation covers streaming pipelines, Decisions, alias profiles, PII middleware, model imports, motion sessions, Qdrant stores, diagnostics, and backend selection. Additional docs-only PRs repair internal links, refresh news and version references, and publish the previous release post. #12786, #12484, #12458, #12442.
🙌 New Contributors
Thanks to the contributors making their first merged PRs:
Thanks also to @anush008 for the Qdrant backend and follow-up direct commits.
Full Changelog: v4.11.0...v4.12.0
This discussion was created from the release v4.12.0.
All reactions