Happy Halloween!
Lots of small and big treats in this release.
- captures can now be persisted to disk and not lost on restart.
- the metrics capture backend has been refactored to make it easy
to add support for new inference servers. - the UI can show models sorted by categories, great if you have
many different types configured! - metrics can be exported as a PNG to make sharing easier.
- add support for the embedding model capability
- small bug and UI improvements
Details below:
- PR #1274 go.mod,ui/package-lock.json: dependency updates: picks up security updates for node and moves
shirou/gopsutilback to the main upstream repository by @mostlygeek - PR #1275 feat(config): add embeddings capability flag: adds
capabilities.embeddings, mirroring the existingrerankerflag and rendered into the/v1/modelscapabilities map, because capability discovery reads llama-server/propswhich reports nothing about embeddings, so a probed embed model surfaced as plain text->text and clients and the UI could only pick them out by name prefix by @noctrex - PR #1276 feat(ui): group Models list into capability-derived class sections: derives each model's class (Chat, Image, Video, Audio, Embeddings, Rerank) client-side from the capability flags and modality lists
/v1/modelsalready carries and renders one collapsible section per class with a status dot that aggregates its rows, because a long flat list is hard to scan once many models are configured;/api/eventsmodelStatus now includesmodalities: {in, out}from the samerenderCapabilitiescall so the dashboard and the OpenAI listing cannot disagree by @noctrex - PR #1279 ui: move Models display options into a dropdown menu: moves the Categories and Show unlisted models switches into a "Display options" menu pinned to the right of the Models header (with the unlisted count shown in the item) and drops
flex-wrap, because the header added in #1276 wrapped onto extra rows and made the page too tall; mobile layout improved too by @mostlygeek - PR #1280 Makefile: add native target for the host platform: makes
nativethe default target so a baremakebuilds for the platform you are on instead of cross-compiling everything, and fixesmake allto actually cover Windows and FreeBSD, with$(LDFLAGS)factored out and shared by every platform target by @mostlygeek - PR #1282 internal/capcompat: detect context length from yamz servers: reads
max_contextfrom/v1/models(tried aftercontext_length) so yamz (kyojin) servers report their context length through the default prober by @mostlygeek - PR #1285 ui: export the activity table as a client-side PNG image: rasterizes the visible table in the browser with html-to-image (SVG foreignObject -> canvas) and adds Markdown / Screenshot tabs to the export dialog with clipboard copy, download and a background resolved from the nearest opaque ancestor, so exporting works without a new backend endpoint; Meta and Capture columns are excluded from the render (#1284) by @mostlygeek
- PR #1287 ui: make markdown code highlighting theme aware in light mode: drives highlight.js token colors from
--hljs-*custom properties (with a per-theme--linkcolor and a lighter--mutedfor Midnight Commander) instead of one globally imported dark-only stylesheet, because code was measured at 1.12-1.40:1 contrast and was effectively invisible in all 11 light themes; light-mode code contrast is now 10.76-13.35:1 with dark mode unchanged by @mostlygeek - PR #1290 internal/capcompat: read /props fields with gjson: extracts each
/propsfield individually with gjson, so one unexpected field no longer takes the whole probe down, because llama-server b12017 added a list tochat_template_capsalongside its booleans which broke the whole-body unmarshal and made capability discovery fail against those builds; bad fields now log a WARN and read as their zero value (#1281) by @mostlygeek - PR #1292 Extract usage parsing into pluggable upstream-specific handlers: splits usage extraction into per-upstream extractors (llama-server, vLLM, Anthropic, OpenAI, TabbyAPI, oMLX and an "auto" fallback that reads every known format) fed by the new
internal/hintpackage which carries upstream and task information through the request context, and records task type, route, peer and reasoning tokens in the activity log, so token counts and performance metrics are accurate per upstream instead of assuming one format by @mostlygeek - PR #1293 ui: fix the Model page Logs panel scrolling the whole page: gives the page its own scroll container and a minimum height for the Activity/Logs tabs, so a long log scrolls inside the panel instead of pushing the whole page by @mostlygeek
- PR #1294 Store request/response captures in separate SQLite database: moves captures out of the in-memory
internal/cacheinto a capture repository backed by its own SQLite database (newstore.persistCaptures,captureBufferunchanged), so captures can persist across restarts without fragmenting the metrics db, are pruned asynchronously by compressed size and are addressed by ayymmddhh-xxxxcapture id that activity rows link to;internal/cacheis removed (#1115) by @mostlygeek