LM-Kit OneDocs2026.10.10lm-kit.comEULA
Changelog

LM-Kit One Changelog

Notable changes to LM-Kit One, newest first. Versions follow YYYY.M.PATCH. A version marked "not yet published" is on the development branch and has not shipped.

2026.10.102026-10-26#

Changed

  • Improved document parsing accuracy.

Fixed

  • Search reindex: newly ingested documents no longer raise a false "backlog present but not draining" error after a long idle period.
  • A client that drops off mid-response (connection timed out or unreachable) is logged at Debug instead of as two Kestrel errors.

2026.10.92026-10-23#

Added

  • POST /lmkit/v1/barcode-splitting: splits a PDF, TIFF or image batch into documents by barcodes (separator sheets, cover codes, document values).
  • POST /lmkit/v1/barcode-reading: every barcode on the pages of a PDF, TIFF or image, with format, text and position.
  • MCP tools document_split_by_barcodes and document_read_barcodes, and the Barcode Splitting and Reading guide.
  • POST /lmkit/v1/document-parsing: markdown_underline and markdown_underscore_emphasis.

Changed

  • Admin > Models: the model memory popover shows memory composition, slot or input occupancy and the pool's shape as designed blocks, and opens at its final size.
  • Embedding models: the pinned context opens at the window its inputs need and grows up to Inference:EmbeddingContextSize (was always the full window).

Fixed

  • OCR: a 1-bit page (fax or scanner TIFF) could crash the server; pages of any bit depth are now read.
  • Attachment requests on a GPU short of memory no longer fail as "torn down twice" or flood the log with CUDA out-of-memory errors.
  • Admin > Models: the context popover no longer names a KV cache type for a model that keeps none (embedding models).

2026.10.82026-10-20#

Added

  • Usage metering on every API response: a root usage field on /lmkit/v1 JSON bodies and the X-LMKit-Usage header on every metered response (/lmkit/v1, /v1, /api).
  • usage fields: operation, input (llm, vlm, ocr, layout, image, embedding, speech, training, tools), output (tokens, characters, items), partial, duration_ms, models.
  • GET /lmkit/v1/jobs/{job_id}: usage once the job has ended, also as the X-LMKit-Usage header.
  • POST /v1/chat/completions streamed with stream_options.include_usage: lmkit_usage on the usage chunk.
  • Chat, chat with documents and grounded answer streams: usage on the terminal event.
  • POST /lmkit/v1/file-info: usage_estimate (images, characters, audio_seconds).
  • Guide: Usage Metering and Billing.
  • Model embeddinggemma-2 (EmbeddingGemma 2): text, code and image embeddings; Search Service catalog model 6.
  • POST /lmkit/v1/document-parsing: markdown_scripts (HtmlTags, Latex), markdown_table_cell_emphasis, markdown_running_text, markdown_charts, markdown_task_list_markers, markdown_page_separator.

Changed

  • Chat, completions, Responses, Ollama and Anthropic requests: an omitted temperature, top_p, top_k or min_p takes the publisher's recommended value for the mode (was a server value).
  • POST /v1/messages and its token count: a request without thinking does not reason, as the Messages API defines; adaptive keeps the model's own level.
  • DefaultTextEmbeddingsModel defaults to embeddinggemma-2 (was embeddinggemma-300m); a new Search Service tenant takes it. Existing tenants keep their model.
  • DefaultImageEmbeddingsModel defaults to embeddinggemma-2 (was nomic-embed-vision); a server that sets it keeps its value.
  • CUDA engine built with CUDA 13.4 (was 13.1); Linux hosts outside the container need CUDA 13.4 runtime libraries (cuda-libraries-13-4).
  • Admin > Search: the tenant embedding picker lists models by family and size, and offers a replaced model (embeddinggemma-300m) only to a tenant still using it.
  • Admin > Search: during an embedding model switch, the tenant row, Search setup and re-embedding progress name the new model.

Fixed

  • Improved document parsing accuracy.
  • Improved PII and named entity detection accuracy.
  • Search Service (local cluster, or MySQL / SQL Server with Qdrant): changing a tenant's embedding model no longer interrupts semantic search; queries switch once every document is re-embedded.
  • presence_penalty, frequency_penalty and repeat_penalty had no effect on chat, completions and Ollama requests; they now act over the last 64 tokens.
  • Linux arm64: the CUDA 12 engine linked the CUDA 13 runtime libraries; it now links CUDA 12.
  • Agent and chat tools with Gemma 4: a file id the model wrote unquoted (e.g. 66d6...) failed as invalid JSON; it now reaches the tool.
  • Server log: a chat tool that returns an error is logged as a Warning with its message.
  • Search Service: a tenant re-embedding with a new model keeps its old and new embedding models loaded together; they no longer unload each other on every search and batch.
  • Admin > Models: model pickers show full model names, and their list stays within the visible area.
  • Admin > Search: cluster and tenant pages no longer jump while their sections load; each section opens at its final height.
  • Admin > Search: a tenant page could list the collections of another tenant that was re-indexing; it now lists only its own.

2026.10.72026-10-15#

Added

  • Admin > Requests: the request inspector shows where a search request's time went, stage by stage, with the costliest stage marked.
  • Server log: a search taking 1 s or more is logged as a Warning with its time per stage and the document frequency of each query term.
  • Admin > Requests: a semantic or hybrid search notes whether its vector retrieval scanned the scope exactly or walked the HNSW index; the vector query plan diagnostic follows the same choice.
  • Admin > Search > Slow queries: names the database sessions hidden from the admin role, and the remedy.
  • Admin > Search: tabs in the header; Activity is a full-width cockpit (KPIs with history, time by stage, hotspots, indexing, database now) whose details open in a side panel.
  • Admin > Search > Activity > Query statistics: database time by area and the costliest statements named by what they do, with their SQL on demand.
  • Admin > Server memory diagnostics: an Idle conversation states row, released by Collect LM-Kit cache.
  • Office documents through the LibreOffice engine: legacy Word, Excel and PowerPoint, OpenDocument, RTF, Visio, Publisher, Apple iWork and more get thumbnails, a PDF export, and indexing, parsing and extraction.
  • Admin > Settings > Engines: one card per engine (LibreOffice, FFmpeg) with a guided install, test and remove; paths and tuning under Advanced settings.
  • Managed LibreOffice install, under /lmkit/v1/admin/libreoffice/: GET status, POST download, POST test, POST libraries, DELETE managed.
  • Conversion cache: LibreOffice:CacheDirectory setting; GET libreoffice/cache/disk-usage, POST libreoffice/cache/delete-all; folder, usage and Clear cache on the LibreOffice card.
  • LibreOffice on Linux: the system libraries it needs are fetched from the host's package repositories and kept for LibreOffice alone, without changing the host.
  • Settings: LibreOfficePath and LMKIT_LIBREOFFICE_PATH; LibreOffice:Workers, ConversionTimeoutSeconds, IdleWorkerMinutes, RecycleAfterConversions, CacheSizeMB, WarmOnStart.
  • GET /lmkit/v1/files/supported-extensions and GET /lmkit/v1/document-thumbnail/supported-formats: office.
  • POST /lmkit/v1/document-to-pdf: office formats as source_format, and renderer in the response.
  • Error codes office_runtime_unavailable, encrypted_document, conversion_timeout, conversion_failed.
  • Guide: Office Documents and LibreOffice.
  • Playground > Parse > Markdown: Rendered shows the whole document's Markdown in the document viewer, tables with their spans included; Source keeps each element's Markdown.
  • Search access levels: a tenant grant is Read, Write or Manage, over every collection or a chosen few; existing grants stay Manage over every collection.
  • Admin POST clusters/search/{clusterId}/tenants/{tenantId}/access: role and collectionIds; GET: each key's role, collectionScope, grantedAt, grantedBy, and the tenant's collections.
  • Admin POST apikeys: tenantGrants, written with the key in one request. Admin POST clusters/search/{clusterId}/tenants: grantRole.
  • Admin GET access/search (every grant, for the overview and its CSV export) and GET access/search/explain (the access checker).
  • GET /lmkit/v1/search/collections: access. Tenant responses: access, collection_scope.
  • Admin > Access > Search access: grants by key or by tenant, CSV export, and Check access, which walks the gates and opens the fix.
  • Guide: Access Model covers levels, collection scope and the access tools.

Changed

  • POST /lmkit/v1/search/search: full-text facets count the ranked pool, like the other search types; facets_exact is false when the pool was truncated.
  • Dashboard > Loaded models: a model is listed from the moment it is requested, with its phase (downloading, waiting to load, loading) and a progress bar, instead of only once resident.
  • Chat, agent and compatibility requests with no reasoning level follow the model's default (the default chat model now thinks first); reasoning_effort: "none" or its surface equivalent answers directly.
  • POST /lmkit/v1/chat-with-document: answers without a reasoning phase by default.
  • DefaultVisionOcrModel defaults to lightonocr-3:0.8b (was lightonocr-2:1b).
  • Admin: FFmpeg Path moved from Settings > General to Settings > Engines.
  • POST /lmkit/v1/document-to-pdf: Word documents are laid out by LibreOffice when it is installed.
  • Container image: LibreOffice inside (the release Settings > Engines installs), with every library it links; office formats work with nothing to install.
  • Read-only API keys may call Search retrieval (search, documents/list, documents/get, documents/similar); query modes other than Original stay refused.
  • Admin: the create-key dialog, a key's Search access and a tenant's Access section share one grant editor; a key's cluster access applies on each change.
  • Admin: toasts no longer move one another as they appear and leave.
  • Admin: API keys, clusters, tenants and collections each carry one icon wherever their name appears, selects included.

Fixed

  • Faster full-text and hybrid search on large tenants, notably for questions written in natural language; results are unchanged.
  • Faster semantic and hybrid search scoped to a few collections of a large tenant; such searches now return the exact nearest passages.
  • Full-text and hybrid search no longer time out (HTTP 500 after 30 s) on questions of moderately common words over many collections.
  • Faster search result assembly (titles, snippets, proximity, context expansion) and similar-document page counts on large tenants.
  • Lower background database load from the embedding backlog checks, the telemetry backlog counters and the document-centroid self-heal.
  • Search clusters on PostgreSQL keep their full-text tables vacuumed: the server vacuums one due partition at a time and sets proportionate autovacuum thresholds, so searches stay fast once the data is out of cache.
  • Admin > Search > Slow queries: search queries run by the data-plane role are captured; the admin role is granted that role at startup.
  • Search cluster setup: the data-plane role gets its password when the admin role lacks BYPASSRLS.
  • Linux: dotnet-trace, dotnet-counters and dotnet-gcdump attach to the server again; the process is listed under its own name instead of exe.
  • Admin > Telemetry: GC counters read their current total, not the sum of every poll; per-generation heap sizes read as the whole heap; up-down counters read their current level.
  • Server memory no longer grows over hours of traffic until the host runs out: the memory kept for idle conversations is one budget for the whole server, shared by every model and task.
  • JPEG files whose scan header carries nonstandard spectral parameters are read instead of failing.
  • An image that cannot be decoded answers HTTP 415 with error code invalid_image, instead of 500.
  • Multi-GPU with distributed inference: a model that fits one GPU but not with its context window is spread over the GPUs at load, instead of its window being halved.
  • Admin > Settings > Inference: the Slot pool summary counts per-model overrides as they are added or removed.
  • Requests wait for GPU memory instead of failing with 503 or 500 when the device is momentarily full.
  • Admin > Models: a download requested while the same model is already transferring shows its progress instead of staying at 0%.
  • Playground > Parse: selecting an element inside a panel outlines that element, not the whole panel.
  • Playground > Parse: selecting a table outlines each of its cells.
  • Improved document parsing accuracy.
  • Parsing a multipage TIFF could crash the server when its pages were read concurrently.
  • Admin: the create-key dialog's tenant list rendered its checkboxes as empty full-width fields with a horizontal scrollbar.
  • Agents: document_detect_pii and entity detection on an image or a scanned page returned an error instead of the detected values.
  • Server log: no more native "inconsistent sequence positions" errors during structured generation with models that carry a draft.
  • Playground: a message can be sent with an attached file and no text.

Security

  • A read-only key refused for a write is refused, never served as an anonymous local caller.

2026.10.62026-10-08#

Added

  • POST /lmkit/v1/document-to-pdf: renders a Word document, an e-mail (.eml, .msg, its attachments embedded), an HTML, Markdown or text file, or an image as a PDF the page tools can act on.
  • Search tenants: parsing_effort (Minimal, Low, Medium, High) and parsing_backlog; above Minimal a document is searchable at once, then parsed again in the background.
  • Admin > Search > tenant: Parsing on the setup card and in the settings dialog (replaces the OCR switch, which shows only for a tenant that turned OCR off).
  • Document parsing: effort Minimal (no model) on POST /lmkit/v1/document-parsing, the MCP document_parse tool and Playground > Parse.
  • Guide: Parsing Effort for RAG.
  • POST /lmkit/v1/document-parsing streaming: progress events while a page is read (stage, characters read, fraction).

Changed

  • Search indexing reads documents through the document parser at Minimal: same text, layout and OCR as before; tables index their cells.
  • Playground > Parse: the document parser or the Markdown converter (Fast, Fast + OCR, Balanced, Accurate); a conversion shows its paragraphs in reading order, its Markdown, how it was read, export and code.
  • Improved document parsing accuracy.

Fixed

  • Read-only model directory (/data/models mounted :ro): a model it lacks downloads into models/ under the work directory instead of answering 503 model_store_read_only.
  • Read-only model directory: a catalog model placed on it by hand, without its .origin file, loads instead of failing with Read-only file system; it is recognized by the catalog checksum, offline included.
  • POST /lmkit/v1/image-redact honors the EXIF orientation: areas are read on the image as displayed and a stripped photo stays upright (apply_orientation).
  • Playground > Parse: clicking a region on the page scrolls its row into view from the row's start, tall rows (tables) included.
  • Playground > Parse: on images, clicking a region on the page selects it (the hand tool captured every press).

2026.10.52026-10-04#

Changed

  • Improved document parsing accuracy.
  • Improved query rewriting support for RAG.

2026.10.42026-10-03#

Added

  • POST /lmkit/v1/document-parsing: turns a PDF, scan or image into typed, positioned elements; effort, pages, output_format (Json, Markdown, Html, DocLang), include_figure_images.
  • lmkit run document-parsing: writes .json, .md, .html or .dclg after --output-format.
  • MCP tool document_parse: Markdown inline or linked, the JSON parse as a resource.
  • Playground > Parse: parse at Low, Medium or High effort in the document viewer; pages streamed, elements boxed and linked to the export, type filter, effort comparison, SDK and REST code, samples.
  • Guide: Document Parsing.
  • POST /lmkit/v1/admin/area-ticket?persist=true: the area ticket of a remembered session survives a browser restart, for its 12-hour validity.

Changed

  • Switching areas holds the current page until the next one can paint, then swaps without a crossfade.

Removed

  • The osd OCR dictionary is no longer shipped under lm-kit/tessdata-fast/: the OCR engine recognizes with LSTM only and reads page orientation with its own classifier.

Fixed

  • App bar: a signed-in browser without a valid area ticket completes the bar in place instead of missing the operator areas until a reload.
  • Opening a gated area behind an expired ticket no longer flashes the sign-in prompt before the area.
  • Playground: the sidebar, history and model name paint once on open instead of redrawing after the configuration loads.

Security

  • POST /lmkit/v1/admin/logout clears the area-ticket cookie.

2026.9.82026-09-25#

Added

  • POST /lmkit/v1/admin/memory/release-device: returns idle attachment prefill contexts, backend scratch and vision encoder buffers to the device.
  • Admin dashboard, VRAM attribution: Attachment prefill, Vision encoder and Backend scratch segments, and a Release idle action.
  • Inference:IdleDeviceMemoryReleaseSeconds (default 300, 0 never), editable from Settings > Inference > Contexts & defaults.
  • Memory page inventory: attachment prefill contexts, vision encoder buffers and backend scratch rows; Collect LM-Kit cache returns them too.
  • POST /lmkit/v1/admin/2fa/setup and the sign-in enrollment answers carry qrSvg: the otpauth URI drawn as a QR code on the server.
  • lmkit run <task> --in <path> --out <folder>: a REST task on local files without a server, options from its request; document-to-markdown first.
  • Every package ships the default OCR dictionaries (English, orientation) under lm-kit/tessdata-fast/: OCR works offline and pays no download on its first document.
  • POST /lmkit/v1/image-convert watermark: a visible text or logo watermark (tiled, centered or in a corner) at the output size; a character no font draws answers 422 unsupported_characters.
  • POST /lmkit/v1/image-convert rights: copyright notice, creator, credit line, usage terms and rights page written into the file as XMP, even with keep_metadata false.
  • GET /lmkit/v1/image-convert/capabilities: watermark_layouts, watermark_max_text_length, watermark_installed_fonts.
  • POST /lmkit/v1/pdf-watermark: a vector text or logo watermark over every page or pages; marking again replaces it; 422 signed_document, pdfa_forbids_transparency, unsupported_characters.
  • POST /lmkit/v1/pdf-remove-watermark: removes the watermarks pdf-watermark laid.
  • POST /lmkit/v1/image-watermark: burns a watermark into an image, keeping its size, format and metadata.
  • GET /lmkit/v1/pdf-watermark/capabilities, GET /lmkit/v1/image-watermark/capabilities: layouts, longest text, installed fonts.
  • MCP tools pdf_watermark and pdf_remove_watermark.
  • The container image bootstrap install DejaVu, WenQuanYi Micro Hei and Lohit Devanagari for watermark text.

Changed

  • Admin dashboard, VRAM attribution: the legend is an aligned table with each segment's value and share of the bar.
  • Admin dashboard: CUDA runtime + reserved is now the true remainder; memory the runtime holds between requests no longer reads as growth there.
  • Settings > Access, two-factor: the setup dialog shows a QR code beside the setup key, grouped in blocks of four.
  • Settings > Access, two-factor: the 6-digit code confirms itself once typed, and one footer carries Cancel and the action.
  • Settings > Access, two-factor: recovery codes appear in the same dialog, with Copy all and Download.
  • The sign-in enrollment step shows the same two-factor QR code.
  • A farm node whose model volume is read-only refuses to start until ModelWorkDirectory names a shared mount; the per-node fallback below would split the fleet's imports.
  • The startup line, the dashboard and lmkit doctor give the file system's reason when a model or work directory refuses writes.
  • document-to-markdown with the TextExtraction strategy no longer takes a completion slot (MaxConcurrentCompletions): it runs no model.
  • lmkit run document-to-markdown splits a large text-extraction batch without OCR across processes of about eight documents each.
  • The LM-Kit OCR engine is built on first use; a server start still builds it during startup.
  • On Linux only the server caps malloc arenas (MALLOC_ARENA_MAX); command-line verbs no longer re-execute under the cap.

Fixed

  • Search: a deletion-journal flush the store could not take kept only its first tenant and dropped the rest of the batch, leaving their content unreconciled; every entry now stays on the node for the next flush.
  • Admin dashboard, VRAM attribution: a "?" tooltip no longer blinks while the dashboard refreshes.
  • Repointing the model directory left training jobs and imports writing under the previous one, which refused them once it was gone; the default work directory is decided again per model directory.
  • Training jobs and model imports on a read-only model directory answered 503 model_store_read_only until ModelWorkDirectory was set; with the setting empty they now write under work/ in the state directory.
  • The startup line, the dashboard, the Models strip and lmkit doctor name the effective work directory.
  • Settings > Storage: Browse and Download all read as disabled while the upload directory is empty, and their hints say why; before, they looked live and did nothing.
  • Packages carried the .json files of build output left in the project directory; publish takes declared content only, and packaging refuses an unexpected top-level directory.
  • Admin dashboard: the first telemetry payload no longer shifts the page; every card is laid out at its loaded size before data arrives.
  • Admin dashboard: Downloads in progress sits last, so it appearing or leaving moves nothing.
  • Admin dashboard: Recent requests times older than a day read as a date and no longer overlap the method column.
  • Admin: a collapsed sidebar is applied before the first paint instead of reflowing the page.

2026.9.72026-09-17#

Added

  • Image Utilities: image-deskew, image-enhance, image-analysis, image-redact and image-color-palette routes.
  • image-normalization: flip, deskew, crop, fit_box and output_dpi stages; deskew_angle in the response.
  • page_index on every image route (multi-page TIFF); tiff as an output format.
  • image-convert route: format, size (never past the master unless allow_upscale), colour space (sRGB, gray, CMYK via ICC), metadata, every TIFF page, inline or file_id delivery; GET image-convert/capabilities.
  • HEIC / HEIF images decode on every platform.
  • Container image: vulkaninfo included; the release smoke test proves the Vulkan loader, Mesa drivers and SDK backend inside the image (deploy/containers/check-vulkan-stack.sh).
  • Container image: ffmpeg included; AMD and Intel GPUs served; a GPU that did not reach the container is diagnosed in the Hardware panel and the startup log.
  • ModelWorkDirectory setting: a writable home for training jobs and imported models beside a read-only model volume.
  • Guides: search on pgvector in containers; Podman GPU pass-through through CDI.
  • Changelog page in the documentation, beside Guides and API reference.

Changed

  • pdf-unlock reports the security the original carried: encryption, revision, algorithm, author permissions, which password opened it.
  • Access: a new API key preselects the default Search cluster, the choices state their consequence, the token reveal states the key's reach.
  • A key without Search access and a read-only model store are refused with their own fact; every refusal keeps its reason in the request trail.
  • A training job refused for device memory waits up to ten minutes instead of failing.
  • A request value the decoded content rejects (a page index past the last page, a crop outside the image) answers 400 invalid_argument instead of 500.
  • EULA: free production use requires a visible LM-Kit acknowledgement; outgrowing the free thresholds keeps the grant for 90 days.

Fixed

  • Windows portable zip: Windows Explorer refused to extract it (entries carried a ./ prefix); the release archive now lists the payload files directly and a guard rejects any archive Explorer cannot open.
  • Setup wizard: the model download step failed with (entries || []).filter is not a function; the progress poll now reads the downloads list the endpoint returns.
  • A fresh server reachable from the network could not be signed into: the API access policy layered over the admin endpoints.
  • Read-only model store: downloads, imports and the Ollama-compatible pull refuse before a byte streams, naming the remedy.
  • OpenAI-compatible vector stores pass the Search cluster gate.
  • Exported documentation: every link is site-absolute; a directory URL redirects to its trailing-slash form.

2026.9.62026-09-14#

Initial public release.

Added

  • REST API under /lmkit/v1: chat, chat with documents, embeddings, reranking, summarization, translation, rewriting, correction.
  • Text analysis: categorization, sentiment, language detection, keyword, entity, PII and structured data extraction.
  • Documents: OCR, document to Markdown, splitting, validation, thumbnails, search highlight, image to PDF.
  • PDF: info, layout, merge, split, edit, unlock, redact, OCR, sign, verify signatures, timestamp, LTV, PDF/A, to images, search.
  • Media: audio transcription, voice activity detection, video frames.
  • Image Utilities: background removal, normalization.
  • Agents, skills, MCP server, training jobs.
  • Search: hybrid keyword and vector search with clusters, tenants, collections and per-key grants over SQLite, PostgreSQL, SQL Server and MySQL.
  • Compatible APIs: OpenAI, Ollama, Anthropic (Claude Desktop gateway).
  • Admin console, Playground, Guides, API reference.
  • Deployment: Windows (MSI, portable, service, tray), Linux, macOS, container image (Docker Hub, GHCR); SSO, API keys, network posture, TLS, declarative configuration.