Repository navigation
Releases: LogneBudo/llmxray
Release list
v0.7.2 — Live: see what your other tools send to Ollama
Live
LLMxRay now opens a second port, 11435, that behaves exactly like Ollama and forwards everything to it. Point any other tool at http://localhost:11435 and every turn it sends appears on the new Live page.
- Works with what you already run: VS Code Copilot (through the Ollama extension's
ollama.endpoint), Open WebUI, Continue, n8n, the Ollama CLI and SDKs, any script. The page's empty state is the setup: one address to copy and the steps for each tool. - Turn by turn: client, model, prompt tokens, how many came from the cache, prefill and generation speed, tool calls.
- Inside a turn: what the prompt is made of (system, tool schemas, history, your message) and the exact point where it stopped matching the previous turn, which is where the cache broke.
- Findings in plain sentences, each linked to the turn that proves it: a prompt larger than the context the model was loaded with, a model running partly on CPU, a client re-reading most of its prompt every turn, tool schemas that dominate the prompt.
- Per client: turns, tokens, tool calls, prefill time, and an estimate of what a cache fix would save.
Only counts and timings are kept, in memory. Prompt text is an opt-in that writes to a file under your home directory. Nothing leaves your machine.
Verified on a real Copilot agent session: 108 tool schemas, 46K-token prompts, 99% served from cache once the context was raised to 64K.
CLI: --observe-port <n>, --no-observe. Docker: -p 11435:11435, OBSERVE_PORT, OBSERVE=0.
npx llmxray@0.7.2
docker pull djovaneli/llmxray:0.7.2Guide: https://lognebudo.github.io/llmxray/docs/en/guide/live
v0.7.1 — Image embeddings
Added
- Image embeddings on the Embeddings page. On a model that reports both
embeddingandvision(Ollama 0.40/api/embedobject input), attach an image in the playground or on either side of the Similarity Calculator: photo against sentence, photo against photo, or an image alone. Text-only models show no image controls. - Every embedding result shows the prompt tokens it cost. An image is a fixed block on top of the text: 7 tokens for a short sentence, 265 with a tiny image, measured on embeddinggemma-2.
- Guide section "Embedding Images" in English, French and Chinese, including how to forward a Mac's daemon over SSH from a Windows or Linux machine.
The only model that embeds images today, embeddinggemma-2, runs on Ollama's MLX runtime, which exists on Apple Silicon only.
npx llmxray
docker pull djovaneli/llmxray:0.7.1
v0.7.0 — Decision Lab, verified against Ollama 0.40.3
Verified against Ollama 0.40.3 (October 2026). Everything LLMxRay reads is unchanged since 0.33.3; the recommended floor stays 0.33.3.
Added
- Decision Lab: ask Ollama's decision models (nimble, tev1, clef, clef-flash) typed questions and see the probability behind every answer, drawn as bars. Choice, yes/no probability, and score on an ordered scale, on
/v1/systemone. - Protocol Observatory: prefill time, the daemon-stated prefill rate and the rate over evaluated tokens, side by side. The OpenAI-compatible
timings.prompt_per_second(Ollama 0.35.1+) is inflated by the cache hit ratio; the cell turns amber when it disagrees with the honest figure from the same chunk. - Runner shown on models, running models and new benchmark results (Ollama 0.40), so the same model on llama.cpp and MLX can be told apart.
- Removal of the backups Ollama 0.40.2 keeps after upgrading a model, from the Models tab.
- Guide for the Decision Lab in English, French and Chinese; Decision category in the model catalog.
Fixed
- Decision models no longer appear in the chat or embedding selectors.
- A model listed once per runner no longer appears twice.
Changed
- The Thinking control offers the levels a model advertises via
/api/show(Ollama 0.34.3+), with the legacy Low / Medium / High / Max names otherwise. - READMEs in five languages and the docs state the Ollama version actually probed.
npx llmxray
docker pull djovaneli/llmxray:0.7.0
v0.6.0 — Cache Lab
Find out why your prompt misses the model's cache, and what that costs you every turn.
Added
Cache Lab — a new page, and a new kind of measurement.
A local model doesn't re-read your whole prompt each turn: it reuses a KV cache of the tokens it has already processed. But that cache survives only on a shared prefix — it holds only for as long as the prompt still matches from the very first token. The moment one token differs, everything after it is thrown away and re-evaluated, however identical it was.
So a single timestamp at the top of a system prompt costs you the entire system prompt, every turn. Measured against a live daemon with the same 324-token prompt:
| Where the timestamp sits | Prompt tokens | Reused from cache | Prefill |
|---|---|---|---|
| At the start | 324 | 4 | 64.6 ms |
| At the end | 324 | 290 | 18.6 ms |
Same model, same words, same token count. 3.5× the prefill time, purely because of where one value sat.
Cache Lab does three things:
- Diagnoses — finds the values that change between turns (timestamps, dates, ids, long numbers) and renders your prompt in three colours: the prefix the cache can keep, the first value that breaks it, and everything forfeited downstream. That last region is usually most of the prompt, and usually has nothing wrong with it.
- Measures — sends two layouts, each twice, the second send carrying a changed value because that is what real traffic does. It is the second send that is reported; measuring the first would only show how well a prompt matches itself, which is ~100% for any layout and tells you nothing.
- Reports a verdict — tokens saved per turn, milliseconds saved per turn, speed-up. Every number came back from your own daemon. Nothing is estimated.
Sidebar item Cache Lab, route /cache-lab. Guide pages in English and French. Requires Ollama 0.33.3 or newer; on older daemons it shows "not reported" rather than a misleading 0%.
Fixed
README images were broken on npm. Seven screenshots per README used repo-relative paths, which npm could not resolve because package.json declared no repository. All image URLs are now absolute, and repository, homepage and bugs are declared.
Install
npx llmxray
docker pull djovaneli/llmxray:0.6.0
v0.5.1 — Ollama 0.33.x prompt-cache metrics
Tracks Ollama 0.33.x, and fixes a prefill-speed regression that arrived with it.
Fixed
Prompt tokens/second over-reported whenever the prompt cache was warm.
Ollama 0.33.3 redefined prompt_eval_duration to time only the uncached prompt tokens, while prompt_eval_count still counts the whole prompt. Dividing one by the other inflated the figure by the cache hit ratio — measured against a live 0.33.3 daemon, a prompt with 37 of its 38 tokens served from cache read 4375 tok/s instead of 115. The rate is now taken over the tokens actually evaluated.
Component tests mounted without the i18n plugin, so the SlashCommandDropdown suite failed outright. The test harness now installs the real English catalog, and those tests assert against the shipped strings.
Added
- Prompt cache reuse is visible. Session metrics show a Cached Prompt card and split the token distribution bar into its cached and evaluated halves. Benchmark question results record the cached share too.
- The Protocol Observatory names the divergence. The same fact arrives under three different fields depending on the protocol —
prompt_eval_cached_count(native NDJSON),usage.prompt_tokens_details.cached_tokens(OpenAI-compatible) andusage.cache_read_input_tokens(Anthropic-compatible). The envelope diff now shows all three side by side with this run's values. audiocapability, which Ollama 0.33.3 began reporting for models carrying an audio tower.
Changed
- Cache metrics stay undefined rather than zero when a daemon never reports them — "not reported" and "nothing was cached" are different claims, and only the second is worth showing as 0%.
- Anthropic-compatible
input_tokensnow means the prompt total minus cached tokens on Ollama 0.33.3. The Observatory reconciles it back to the prompt size so the three protocols stay comparable. - READMEs (EN/FR/ZH/AR/SR) updated for Ollama 0.33.x; new Observatory strings across all six locales.
Install
npx llmxray
docker pull djovaneli/llmxray:0.5.1
v0.5.0 — Ollama 0.32 support + usage-totals fix
Tracks Ollama 0.32, and fixes a token-count regression that arrived with it.
Fixed
Benchmark and Protocol Observatory token counts read zero on Ollama 0.32.6+.
That release aligned /v1/chat/completions with OpenAI's wire format: the final usage totals are now only emitted when the request opts in via stream_options.include_usage. LLMxRay now sends it — and reads the totals from the trailing chunk, which carries an empty choices array, so the read also had to move ahead of the per-choice guard. Restores tokenCount and tokensPerSecond in the Surgical Benchmark, and the OpenAI lane's token count in the Protocol Observatory.
Added
- Reasoning effort levels — the thinking control offers Off, On, Low, Medium, High and Max, mapping to Ollama's
thinkparameter. On sendstrueand lets the model choose its own effort; the named levels request an explicit reasoning budget. - Embedding dimensions — the Embeddings Lab can request a narrower output vector via
dimensions(Matryoshka truncation), with the model's native width as the placeholder.
Changed
- Capabilities now come from the model listing. Ollama 0.32 reports
capabilities,context_lengthandembedding_lengthin/api/tags, so capability icons and model filtering are correct as soon as the list loads rather than after a per-model/api/showround-trip./api/showstill enriches parameters, template, license and architecture metadata in the background. - A reported capability set is authoritative — if the daemon lists a model's capabilities and omits
thinking, that is believed rather than overridden by a name guess. Name patterns apply only to models that report nothing at all. embeddingis a first-class capability, replacing the duplicate name-pattern filter the Embeddings page carried separately from the model store.- Fallback patterns extended:
qwen3.x,muse-glimmer,glm-*,kimi-k*(reasoning),gemma3(vision). - READMEs (EN/FR/ZH/AR/SR) and the Models guide updated for Ollama 0.32.x.
Fixed (i18n)
The thinking control's strings were missing entirely from the Chinese and Arabic catalogs. Both are now complete, alongside the new effort-level and embedding-dimension strings across all six locales.
Install
npx llmxray
docker pull djovaneli/llmxray:0.5.0
Tested against Ollama 0.32.9. Unit tests 190 → 203, covering the usage-chunk shape, capability resolution, and the request bodies that carry the fix.
v0.4.9 — Ollama 0.31.x compatibility
Maintenance release tracking the recent Ollama cadence — verified compatible with Ollama 0.31.x.
Changed
- Verified compatibility with Ollama 0.31.x (current latest). No API changes required: LLMxRay reads model capabilities live from
/api/show, surfaces API error detail (incl. the new "message exceeds context window" error from Ollama 0.30.9), and pins no minimum Ollama version — so new releases and models work out of the box. - Extended the capability name-pattern fallbacks (used only when a model doesn't self-report) to recognize newer families:
- Reasoning:
gpt-oss,magistral,nemotron - Vision:
moondream,mllama(Llama vision)
- Reasoning:
- Docs: the Models guide (EN/FR) now documents live
/api/showcapability detection and the refreshed fallbacks.
Install: npm i -g llmxray@0.4.9 · docker pull djovaneli/llmxray:0.4.9
v0.4.8 — Multilingual coverage (FR/ZH/AR/SR READMEs + ZH/AR i18n)
Highlights
A small-but-real multilingual coverage release. No new features, no API changes — focuses entirely on making LLMxRay more discoverable and usable for non-English speakers.
New localized READMEs
The project README is now available in five languages, cross-linked via a language switcher row at the top:
- README.md — English
- README.fr.md — Français
- README.zh-CN.md — 简体中文
- README.ar.md — العربية (RTL)
- README.sr.md — Srpski (Latin)
Chinese and Arabic i18n gap closed
Chinese and Arabic users now get fully translated UI for the two pages added in v0.4.7:
- Fill-in-the-Middle Playground (
/fim) - Protocol Observatory (
/protocols)
These were the only two remaining English-fallback pages for zh and ar. With 0.4.8, those locales are at 18/18 namespace coverage — fully on par with English, French, and Serbian (Latin + Cyrillic).
Other
package-lock.jsonrealigned (had drifted to 0.4.3 since the 0.4.4 release).- README "Multilingual" claim is now factually accurate across all five languages.
Install
```bash
npx llmxray@0.4.8
```
Or Docker:
```bash
docker run -p 5174:5174 djovaneli/llmxray:0.4.8
```
Compatibility
Same as v0.4.7 — Ollama 0.20+ supported, Ollama 0.24+ recommended for full feature parity (including `think: "max"` and Anthropic-compat endpoint).
v0.4.7 — Ollama 0.24 Compatibility + Protocol Observatory + FIM Playground
Released: 2026-05-24 · Published to: npm llmxray@0.4.7 · Docker djovaneli/llmxray:0.4.7
Brings LLMxRay up to full feature parity with Ollama 0.24.0 (current latest stable) and adds two new dedicated pages that exercise capabilities the Ollama daemon has shipped over the last several versions.
✨ Two new routes
🧩 Fill-in-the-Middle Playground — /fim
Code completion the way IDEs do it. Provide a prefix and suffix, the model fills the gap. Streams in real time, then shows a stitched preview as the code would appear in your editor. Works with Qwen-Coder, CodeLlama, Codestral, DeepSeek-Coder, and StarCoder. Uses Ollama's suffix field on /api/generate.
🔬 Protocol Observatory — /protocols
Fire the same prompt through Ollama's three serving protocols in parallel against the same local model:
/api/chat(native NDJSON)/v1/chat/completions(OpenAI-compatible SSE)/v1/messages(Anthropic-compatible SSE withevent:tags)
Three-column streaming, per-protocol metrics, an Envelope Diff tab that shows how each protocol frames finish reasons, token counts, and error envelopes. All local — no cloud, no API keys.
🆕 Chat Settings additions
- Thinking control (Off / On / Max) — toggles Ollama's
thinkparameter, visible only when the active model has thethinkingcapability. Max mode requests the largest reasoning budget (added in Ollama 0.21.3). - Response format control (Free-form / Valid JSON / JSON Schema strict) — exposes Ollama's
formatparameter, which now accepts a full JSON Schema object. Includes a textarea with live schema validation.
🔌 Wire-level additions (for SDK users / integrators)
OllamaChatRequestandOllamaGenerateRequestnow carrythink?: boolean | 'max', widenedformat?: 'json' | Record<string, unknown>, andOllamaGenerateRequest.suffix?: stringstreamChatOpenAIacceptsreasoning_effortandresponse_formatfor OpenAI-style structured outputs / reasoning control- New
anthropic-client.ts+types/anthropic.ts— full Anthropic Messages API client and SSE event-tagged parser, targeting local/v1/messages
🌍 i18n
- Full translations for new strings in English, French, Serbian (Latin), Serbian (Cyrillic)
- Nav labels added in Arabic and Chinese (other strings fall back to English)
- Serbian added to the README multilingual mention
📚 Documentation
- 4 new VitePress pages: FIM Playground and Protocol Observatory (EN + FR)
- Sidebar updated, guide indexes updated (10 → 12 sidebar items)
- Chat Diagnostics doc updated with the new Thinking and Response Format sections
- README: new Ollama Compatibility section listing every endpoint LLMxRay uses
🧪 Verification
vue-tsc --noEmitcleanvite buildclean- 190 unit tests pass
- All 3 protocols smoke-tested live against local Ollama 0.24.0
🛠️ Process notes
- Self-hosted
.github/workflows/release.ymlwas renamed to.yml.disabledso tag pushes no longer fire any workflow (commit1c16385). All artifacts are now manual. - Previous releases v0.4.4 / v0.4.5 / v0.4.6 had been shipped to npm + Docker but skipped tags + Releases — those tags + Releases were backfilled before this release so all seven version surfaces stay in sync.
Install
```bash
npx llmxray@0.4.7
or pin via npm
npm install -g llmxray@0.4.7
or docker
docker run -p 5174:5174 djovaneli/llmxray:0.4.7
```
Requires Ollama running locally (0.20+; 0.24+ recommended for full feature parity including the Anthropic-compat endpoint and the think: "max" mode).
v0.4.6 — Slash Command Palette i18n
Released: 2026-04-13 · Published to: npm llmxray@0.4.6 · Docker djovaneli/llmxray:0.4.6 · (GitHub Release backfilled 2026-05-24)
The slash command dropdown was rendering hard-coded English everywhere — descriptions, category labels, and runtime notification messages. The memory category had no label mapping at all (showed as raw memory text in the badge). v0.4.6 fixes all of it.
What shipped
SlashCommand.descriptionKeyfield — vue-i18n key resolved by UI surfaces. The literaldescriptionis kept as English fallback for/helpoutput and tests.SlashCommandContext.tfunction — bound to vue-i18n'stfrom the consuming component. Commandexecute()callbacks usectx.t(key, args)to produce localized notifications.- 50+ notification strings translated for en / fr / sr (sr-Cyrl auto-mirrored). ar / zh fall back to en.
- Memory category label added (
dashboard.slashCommands.memory) — was missing from the dropdown'scategoryLabelmap entirely. getCommandsByCategory(t?)— now accepts optionaltfor localized labels; falls back to English when called without one (e.g. tests).
Gotchas hit during this work
- vue-i18n parses
<word>as inline HTML — the original help text used<number>,<fact>, etc. as placeholder syntax. Build refused to compile messages containing<…>with "Detected HTML in '…' message". Switched to[…]notation across all locales. Lesson: never use angle brackets in vue-i18n message strings. - Test mock
thad to do interpolation — the registry tests calltoContain('I like Vue')on notification text. The naive mock that returnedkeyas-is broke that. Fixed by appendingObject.values(args)to the key.
Install
```
npm install -g llmxray@0.4.6
or
docker pull djovaneli/llmxray:0.4.6
```