Skip to content

Releases: LogneBudo/llmxray

v0.7.2 — Live: see what your other tools send to Ollama

Choose a tag to compare

@LogneBudo LogneBudo released this 12 Oct 11:53

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.2

Guide: https://lognebudo.github.io/llmxray/docs/en/guide/live

v0.7.1 — Image embeddings

Choose a tag to compare

@LogneBudo LogneBudo released this 11 Oct 20:43

Added

  • Image embeddings on the Embeddings page. On a model that reports both embedding and vision (Ollama 0.40 /api/embed object 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

Choose a tag to compare

@LogneBudo LogneBudo released this 11 Oct 20:19

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

Choose a tag to compare

@LogneBudo LogneBudo released this 14 Sep 15:36

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

Choose a tag to compare

@LogneBudo LogneBudo released this 14 Sep 15:07

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) and usage.cache_read_input_tokens (Anthropic-compatible). The envelope diff now shows all three side by side with this run's values.
  • audio capability, 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_tokens now 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

Choose a tag to compare

@LogneBudo LogneBudo released this 15 Aug 01:12

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 think parameter. On sends true and 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_length and embedding_length in /api/tags, so capability icons and model filtering are correct as soon as the list loads rather than after a per-model /api/show round-trip. /api/show still 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.
  • embedding is 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

Choose a tag to compare

@LogneBudo LogneBudo released this 02 Jul 18:49

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)
  • Docs: the Models guide (EN/FR) now documents live /api/show capability 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)

Choose a tag to compare

@LogneBudo LogneBudo released this 26 May 11:08

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:

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.json realigned (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

Choose a tag to compare

@LogneBudo LogneBudo released this 24 May 21:52

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 with event: 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 think parameter, visible only when the active model has the thinking capability. 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 format parameter, which now accepts a full JSON Schema object. Includes a textarea with live schema validation.

🔌 Wire-level additions (for SDK users / integrators)

  • OllamaChatRequest and OllamaGenerateRequest now carry think?: boolean | 'max', widened format?: 'json' | Record<string, unknown>, and OllamaGenerateRequest.suffix?: string
  • streamChatOpenAI accepts reasoning_effort and response_format for 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 --noEmit clean
  • vite build clean
  • 190 unit tests pass
  • All 3 protocols smoke-tested live against local Ollama 0.24.0

🛠️ Process notes

  • Self-hosted .github/workflows/release.yml was renamed to .yml.disabled so tag pushes no longer fire any workflow (commit 1c16385). 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

Choose a tag to compare

@LogneBudo LogneBudo released this 24 May 21:33

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.descriptionKey field — vue-i18n key resolved by UI surfaces. The literal description is kept as English fallback for /help output and tests.
  • SlashCommandContext.t function — bound to vue-i18n's t from the consuming component. Command execute() callbacks use ctx.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's categoryLabel map entirely.
  • getCommandsByCategory(t?) — now accepts optional t for 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 t had to do interpolation — the registry tests call toContain('I like Vue') on notification text. The naive mock that returned key as-is broke that. Fixed by appending Object.values(args) to the key.

Install

```
npm install -g llmxray@0.4.6

or

docker pull djovaneli/llmxray:0.4.6
```