Skip to content

feat: show prefill speed alongside decode speed in dashboard - #163

Closed
hendrikp wants to merge 1 commit into
Niko1221:mainfrom
hendrikp:feature/dashboard-prefill-speed
Closed

hendrikp wants to merge 1 commit into
Niko1221:mainfrom
hendrikp:feature/dashboard-prefill-speed

Conversation

@hendrikp

Copy link
Copy Markdown
Contributor

Adds prefill speed to the existing Speed graph, with independent scaling and a darker curve. Both rates use t/s, with prefill displayed on the right.

Exposes prefill_tok_s_mean using the engine’s existing running mean, excluding cached tokens.

Dashboard showing prefill and decode speed

Tested with passing server tests and a long prompt + manually.

Display both rates in t/s with independent graph scales and a darker
prefill curve. Expose prefill_tok_s_mean using the engine's existing
rate, excluding cached tokens.

Co-authored-by: Codex (gpt-6-astra-medium) <noreply@openai.com>
@Niko1221

Copy link
Copy Markdown
Owner

Released in 0.1.29: the prompt speed beside the answer speed in the dashboard (taken over #177's display). Merged under your name (cherry-picked, so GitHub doesn't show it as merged). Thank you!

@Niko1221 Niko1221 closed this Sep 30, 2026
orangeswim pushed a commit to orangeswim/Strata that referenced this pull request Sep 30, 2026
Follow-up to the prefill-speed PR (Niko1221#163 took that half): the parts that make a
long chat manageable.

- A context gauge (2.4k/200K with a fill bar) by the sampling button, amber at
  70% of the window, red at 90%. Updates from usage after each reply. Passive.
- A chevron on each reply opens its timings on one line - tokens read and their
  speed, cache reuse, TTFT, drafts accepted (the response's llama.cpp-named
  timings, kept in localStorage with the message).
- The fold button compacts the older turns into a summary: the newest turns stay
  verbatim up to a ~5k-token budget, the summary carries them as an exact
  client-built transcript, and the payload after any fold is [summary] + newer
  messages (web/fold.js, tested by web/test_fold.mjs through
  serve/test_web_fold.py). The page keeps every message - muted above the cut -
  and only the newest marker carries the put-back undo. Long user messages
  clamp with a Show-all toggle; display only.

Co-Authored-By: Claude Code <noreply@anthropic.com>
orangeswim pushed a commit to orangeswim/Strata that referenced this pull request Sep 30, 2026
Follow-up to the prefill-speed PR (Niko1221#163 took that half): the parts that make a
long chat manageable.

- A context gauge (2.4k/200K with a fill bar) by the sampling button, amber at
  70% of the window, red at 90%. Updates from usage after each reply. Passive.
- A chevron on each reply opens its timings on one line - tokens read and their
  speed, cache reuse, TTFT, drafts accepted (the response's llama.cpp-named
  timings, kept in localStorage with the message).
- The fold button compacts the older turns into a summary: the newest turns stay
  verbatim up to a ~5k-token budget, the summary carries them as an exact
  client-built transcript, and the payload after any fold is [summary] + newer
  messages (web/fold.js, tested by web/test_fold.mjs through
  serve/test_web_fold.py). The page keeps every message - muted above the cut -
  and only the newest marker carries the put-back undo. Long user messages
  clamp with a Show-all toggle; display only.

Co-Authored-By: Claude Code <noreply@anthropic.com>
orangeswim pushed a commit to orangeswim/Strata that referenced this pull request Sep 30, 2026
Follow-up to the prefill-speed PR (Niko1221#163 took that half): the parts that make a
long chat manageable.

- A context gauge (2.4k/200K with a fill bar) by the sampling button, amber at
  70% of the window, red at 90%. Updates from usage after each reply. Passive.
- A chevron on each reply opens its timings on one line - tokens read and their
  speed, cache reuse, TTFT, drafts accepted (the response's llama.cpp-named
  timings, kept in localStorage with the message).
- The fold button compacts the older turns into a summary: the newest turns stay
  verbatim up to a ~5k-token budget, the summary carries them as an exact
  client-built transcript, and the payload after any fold is [summary] + newer
  messages (web/fold.js, tested by web/test_fold.mjs through
  serve/test_web_fold.py). The page keeps every message - muted above the cut -
  and only the newest marker carries the put-back undo. Long user messages
  clamp with a Show-all toggle; display only.

Co-Authored-By: Claude Code <noreply@anthropic.com>
orangeswim pushed a commit to orangeswim/Strata that referenced this pull request Sep 30, 2026
Follow-up to the prefill-speed PR (Niko1221#163 took the Monitor half): the parts that
make a long chat manageable, plus a PP t/s column in the requests table
(prompt processing per request, the reused cache share excluded - the table's
decode column has its prefill counterpart).

- A context gauge (2.4k/200K with a fill bar) by the sampling button, amber at
  70% of the window, red at 90%. Updates from usage after each reply. Passive.
- A chevron on each reply opens its timings on one line - tokens read and their
  speed, cache reuse, TTFT, drafts accepted (the response's llama.cpp-named
  timings, kept in localStorage with the message).
- The fold button compacts the older turns into a summary: the newest turns stay
  verbatim up to a ~5k-token budget, the summary carries them as an exact
  client-built transcript, and the payload after any fold is [summary] + newer
  messages (web/fold.js, tested by web/test_fold.mjs through
  serve/test_web_fold.py). The page keeps every message - muted above the cut -
  and only the newest marker carries the put-back undo. Long user messages
  clamp with a Show-all toggle; display only.

Co-Authored-By: Claude Code <noreply@anthropic.com>
orangeswim pushed a commit to orangeswim/Strata that referenced this pull request Sep 30, 2026
Follow-up to the prefill-speed PR (Niko1221#163 took the Monitor half): the parts that
make a long chat manageable, plus a PP t/s column in the requests table
(prompt processing per request, the reused cache share excluded - the table's
decode column has its prefill counterpart).

- A context gauge (2.4k/200K with a fill bar) by the sampling button, amber at
  70% of the window, red at 90%. Updates from usage after each reply. Passive.
- A chevron on each reply opens its timings on one line - tokens read and their
  speed, cache reuse, TTFT, drafts accepted (the response's llama.cpp-named
  timings, kept in localStorage with the message).
- The fold button compacts the older turns into a summary: the newest turns stay
  verbatim up to a ~5k-token budget, the summary carries them as an exact
  client-built transcript, and the payload after any fold is [summary] + newer
  messages (web/fold.js, tested by web/test_fold.mjs through
  serve/test_web_fold.py). The page keeps every message - muted above the cut -
  and only the newest marker carries the put-back undo. Long user messages
  clamp with a Show-all toggle; display only.

Co-Authored-By: Claude Code <noreply@anthropic.com>
shiftySenpai pushed a commit to shiftySenpai/Strata that referenced this pull request Sep 30, 2026
…load() (the idle thread cannot unload between load and run); unload() sends QUIT before terminate; the VRAM guard checks the first GPU (docs); Niko1221#163's test engine answers poll()

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0154bwiad8gY7wRehCXy27pN
orangeswim pushed a commit to orangeswim/Strata that referenced this pull request Oct 1, 2026
Follow-up to the prefill-speed PR (Niko1221#163 took the Monitor half): the parts that
make a long chat manageable. No server change.

- A context gauge (2.4k/200K with a fill bar) by the sampling button, amber at
  70% of the window, red at 90%. Updates from usage after each reply. Passive.
- A chevron on each reply opens its timings on one line - tokens read and their
  speed, cache reuse, TTFT, drafts accepted (the response's llama.cpp-named
  timings, kept in localStorage with the message). The requests table gains a
  PP t/s column beside decode, computed in the UI from the history fields the
  server already returns (net of the reused cache share).
- The fold button compacts the older turns into a summary: the newest turns stay
  verbatim up to a ~5k-token budget, the summary carries them as an exact
  client-built transcript, and the payload after any fold is [summary] + newer
  messages (web/fold.js, tested by web/test_fold.mjs through
  serve/test_web_fold.py). The page keeps every message - muted above the cut -
  and only the newest marker carries the put-back undo. Long user messages
  clamp with a Show-all toggle; display only.

Co-Authored-By: Claude Code <noreply@anthropic.com>
orangeswim pushed a commit to orangeswim/Strata that referenced this pull request Oct 1, 2026
Follow-up to the prefill-speed PR (Niko1221#163 took the Monitor half): the parts that
make a long chat manageable. No server change.

- A context gauge (2.4k/200K with a fill bar) by the sampling button, amber at
  70% of the window, red at 90%. Updates from usage after each reply. Passive.
- A chevron on each reply opens its timings on one line - tokens read and their
  speed, cache reuse, TTFT, drafts accepted (the response's llama.cpp-named
  timings, kept in localStorage with the message). The requests table gains a
  PP t/s column beside decode, computed in the UI from the history fields the
  server already returns (net of the reused cache share).
- The fold button compacts the older turns into a summary: the newest turns stay
  verbatim up to a ~5k-token budget, the summary carries them as an exact
  client-built transcript, and the payload after any fold is [summary] + newer
  messages (web/fold.js, tested by web/test_fold.mjs through
  serve/test_web_fold.py). The page keeps every message - muted above the cut -
  and only the newest marker carries the put-back undo. Long user messages
  clamp with a Show-all toggle; display only.

Co-Authored-By: Claude Code <noreply@anthropic.com>
orangeswim pushed a commit to orangeswim/Strata that referenced this pull request Oct 1, 2026
Follow-up to the prefill-speed PR (Niko1221#163 took the Monitor half): the parts that
make a long chat manageable. No server change.

- A context gauge (2.4k/200K with a fill bar) by the sampling button, amber at
  70% of the window, red at 90%. Updates from usage after each reply. Passive.
- A chevron on each reply opens its timings on one line - tokens read and their
  speed, cache reuse, TTFT, drafts accepted (the response's llama.cpp-named
  timings, kept in localStorage with the message). The requests table gains a
  PP t/s column beside decode, computed in the UI from the history fields the
  server already returns (net of the reused cache share).
- The fold button compacts the older turns into a summary: the newest turns stay
  verbatim up to a ~5k-token budget, the summary carries them as an exact
  client-built transcript, and the payload after any fold is [summary] + newer
  messages (web/fold.js, tested by web/test_fold.mjs through
  serve/test_web_fold.py). The page keeps every message - muted above the cut -
  and only the newest marker carries the put-back undo. Long user messages
  clamp with a Show-all toggle; display only.

Co-Authored-By: Claude Code <noreply@anthropic.com>
orangeswim pushed a commit to orangeswim/Strata that referenced this pull request Oct 1, 2026
Follow-up to the prefill-speed PR (Niko1221#163 took the Monitor half): the parts that
make a long chat manageable. No server change.

- A context gauge (2.4k/200K with a fill bar) by the sampling button, amber at
  70% of the window, red at 90%. Updates from usage after each reply. Passive.
- A chevron on each reply opens its timings on one line - tokens read and their
  speed, cache reuse, TTFT, drafts accepted (the response's llama.cpp-named
  timings, kept in localStorage with the message). The requests table gains a
  PP t/s column beside decode, computed in the UI from the history fields the
  server already returns (net of the reused cache share).
- The fold button compacts the older turns into a summary: the newest turns stay
  verbatim up to a ~5k-token budget, the summary carries them as an exact
  client-built transcript, and the payload after any fold is [summary] + newer
  messages (web/fold.js, tested by web/test_fold.mjs through
  serve/test_web_fold.py). The page keeps every message - muted above the cut -
  and only the newest marker carries the put-back undo. Long user messages
  clamp with a Show-all toggle; display only.

Co-Authored-By: Claude Code <noreply@anthropic.com>
orangeswim pushed a commit to orangeswim/Strata that referenced this pull request Oct 1, 2026
Follow-up to the prefill-speed PR (Niko1221#163 took the Monitor half): the parts that
make a long chat manageable. No server change.

- A context gauge (2.4k/200K with a fill bar) by the sampling button, amber at
  70% of the window, red at 90%. Updates from usage after each reply. Passive.
- A chevron on each reply opens its timings on one line - tokens read and their
  speed, cache reuse, TTFT, drafts accepted (the response's llama.cpp-named
  timings, kept in localStorage with the message). The requests table gains a
  PP t/s column beside decode, computed in the UI from the history fields the
  server already returns (net of the reused cache share).
- The fold button compacts the older turns into a summary: the newest turns stay
  verbatim up to a ~5k-token budget, the summary carries them as an exact
  client-built transcript, and the payload after any fold is [summary] + newer
  messages (web/fold.js, tested by web/test_fold.mjs through
  serve/test_web_fold.py). The page keeps every message - muted above the cut -
  and only the newest marker carries the put-back undo. Long user messages
  clamp with a Show-all toggle; display only.

Co-Authored-By: Claude Code <noreply@anthropic.com>
orangeswim pushed a commit to orangeswim/Strata that referenced this pull request Oct 1, 2026
Follow-up to the prefill-speed PR (Niko1221#163 took the Monitor half): the parts that
make a long chat manageable. No server change.

- A context gauge (2.4k/200K with a fill bar) by the sampling button, amber at
  70% of the window, red at 90%. Updates from usage after each reply. Passive.
- A chevron on each reply opens its timings on one line - tokens read and their
  speed, cache reuse, TTFT, drafts accepted (the response's llama.cpp-named
  timings, kept in localStorage with the message). The requests table gains a
  PP t/s column beside decode, computed in the UI from the history fields the
  server already returns (net of the reused cache share).
- The fold button compacts the older turns into a summary: the newest turns stay
  verbatim up to a ~5k-token budget, the summary carries them as an exact
  client-built transcript, and the payload after any fold is [summary] + newer
  messages (web/fold.js, tested by web/test_fold.mjs through
  serve/test_web_fold.py). The page keeps every message - muted above the cut -
  and only the newest marker carries the put-back undo. Long user messages
  clamp with a Show-all toggle; display only.

Co-Authored-By: Claude Code <noreply@anthropic.com>
orangeswim pushed a commit to orangeswim/Strata that referenced this pull request Oct 1, 2026
Follow-up to the prefill-speed PR (Niko1221#163 took the Monitor half): the parts that
make a long chat manageable. No server change.

- A context gauge (2.4k/200K with a fill bar) by the sampling button, amber at
  70% of the window, red at 90%. Updates from usage after each reply. Passive.
- A chevron on each reply opens its timings on one line - tokens read and their
  speed, cache reuse, TTFT, drafts accepted (the response's llama.cpp-named
  timings, kept in localStorage with the message). The requests table gains a
  PP t/s column beside decode, computed in the UI from the history fields the
  server already returns (net of the reused cache share).
- The fold button compacts the older turns into a summary: the newest turns stay
  verbatim up to a ~5k-token budget, the summary carries them as an exact
  client-built transcript, and the payload after any fold is [summary] + newer
  messages (web/fold.js, tested by web/test_fold.mjs through
  serve/test_web_fold.py). The page keeps every message - muted above the cut -
  and only the newest marker carries the put-back undo. Long user messages
  clamp with a Show-all toggle; display only.

Co-Authored-By: Claude Code <noreply@anthropic.com>
orangeswim pushed a commit to orangeswim/Strata that referenced this pull request Oct 1, 2026
Follow-up to the prefill-speed PR (Niko1221#163 took the Monitor half): the parts that
make a long chat manageable. No server change.

- A context gauge (2.4k/200K with a fill bar) by the sampling button, amber at
  70% of the window, red at 90%. Updates from usage after each reply. Passive.
- A chevron on each reply opens its timings on one line - tokens read and their
  speed, cache reuse, TTFT, drafts accepted (the response's llama.cpp-named
  timings, kept in localStorage with the message). The requests table gains a
  PP t/s column beside decode, computed in the UI from the history fields the
  server already returns (net of the reused cache share).
- The fold button compacts the older turns into a summary: the newest turns stay
  verbatim up to a ~5k-token budget, the summary carries them as an exact
  client-built transcript, and the payload after any fold is [summary] + newer
  messages (web/fold.js, tested by web/test_fold.mjs through
  serve/test_web_fold.py). The page keeps every message - muted above the cut -
  and only the newest marker carries the put-back undo. Long user messages
  clamp with a Show-all toggle; display only.

Co-Authored-By: Claude Code <noreply@anthropic.com>
orangeswim pushed a commit to orangeswim/Strata that referenced this pull request Oct 1, 2026
Follow-up to the prefill-speed PR (Niko1221#163 took the Monitor half): the parts that
make a long chat manageable. No server change.

- A context gauge (2.4k/200K with a fill bar) by the sampling button, amber at
  70% of the window, red at 90%. Updates from usage after each reply. Passive.
- A chevron on each reply opens its timings on one line - tokens read and their
  speed, cache reuse, TTFT, drafts accepted (the response's llama.cpp-named
  timings, kept in localStorage with the message). The requests table gains a
  PP t/s column beside decode, computed in the UI from the history fields the
  server already returns (net of the reused cache share).
- The compact button summarizes the older turns: the newest turns stay verbatim
  up to a ~5k-token budget, the summary carries them as an exact client-built
  transcript, and the payload after any compaction is [summary] + newer messages
  (web/fold.js, tested by web/test_fold.mjs through serve/test_web_fold.py).
  The page keeps every message - muted above the cut - and only the newest
  summary can be put back. Long user messages clamp with a Show-all toggle;
  display only.

Co-Authored-By: Claude Code <noreply@anthropic.com>
orangeswim pushed a commit to orangeswim/Strata that referenced this pull request Oct 1, 2026
Follow-up to the prefill-speed PR (Niko1221#163 took the Monitor half): the parts that
make a long chat manageable. No server change.

- A context gauge (2.4k/200K with a fill bar) by the sampling button, amber at
  70% of the window, red at 90%. Updates from usage after each reply. Passive.
- A chevron on each reply opens its timings on one line - tokens read and their
  speed, cache reuse, TTFT, drafts accepted (the response's llama.cpp-named
  timings, kept in localStorage with the message). The requests table gains a
  PP t/s column beside decode, computed in the UI from the history fields the
  server already returns (net of the reused cache share).
- The compact button summarizes the older turns: the newest turns stay verbatim
  up to a ~5k-token budget, the summary carries them as an exact client-built
  transcript, and the payload after any compaction is [summary] + newer messages
  (web/compaction.js, tested by web/test_compaction.mjs through
  serve/test_compaction.py). The page keeps every message - muted above the cut -
  and only the newest summary can be put back. Long user messages clamp with a
  Show-all toggle; display only.

Co-Authored-By: Claude Code <noreply@anthropic.com>
orangeswim pushed a commit to orangeswim/Strata that referenced this pull request Oct 1, 2026
Follow-up to the prefill-speed PR (Niko1221#163 took the Monitor half): the parts that
make a long chat manageable. No server change.

- A context gauge (2.4k/200K with a fill bar) by the sampling button, amber at
  70% of the window, red at 90%. Updates from usage after each reply. Passive.
- A chevron on each reply opens its timings on one line - tokens read and their
  speed, cache reuse, TTFT, drafts accepted (the response's llama.cpp-named
  timings, kept in localStorage with the message). The requests table gains a
  PP t/s column beside decode, computed in the UI from the history fields the
  server already returns (net of the reused cache share).
- The compact button summarizes the older turns: the newest turns stay verbatim
  up to a ~5k-token budget, the summary carries them as an exact client-built
  transcript, and the payload after any compaction is [summary] + newer messages
  (web/compaction.js, tested by web/test_compaction.mjs through
  serve/test_compaction.py). The page keeps every message - muted above the cut -
  and only the newest summary can be put back. Long user messages clamp with a
  Show-all toggle; display only.
orangeswim added a commit to orangeswim/Strata that referenced this pull request Oct 3, 2026
Follow-up to the prefill-speed PR (Niko1221#163 took the Monitor half): the parts that
make a long chat manageable. No server change.

- A context gauge (2.4k/200K with a fill bar) by the sampling button, amber at
  70% of the window, red at 90%. Updates from usage after each reply. Passive.
- A chevron on each reply opens its timings on one line - tokens read and their
  speed, cache reuse, TTFT, drafts accepted (the response's llama.cpp-named
  timings, kept in localStorage with the message). The requests table gains a
  PP t/s column beside decode, computed in the UI from the history fields the
  server already returns (net of the reused cache share).
- The compact button summarizes the older turns: the newest turns stay verbatim
  up to a ~5k-token budget, the summary carries them as an exact client-built
  transcript, and the payload after any compaction is [summary] + newer messages
  (web/compaction.js, tested by web/test_compaction.mjs through
  serve/test_compaction.py). The page keeps every message - muted above the cut -
  and only the newest summary can be put back. Long user messages clamp with a
  Show-all toggle; display only.
orangeswim added a commit to orangeswim/Strata that referenced this pull request Oct 5, 2026
Follow-up to the prefill-speed PR (Niko1221#163 took the Monitor half): the parts that
make a long chat manageable. No server change.

- A context gauge (2.4k/200K with a fill bar) by the sampling button, amber at
  70% of the window, red at 90%. Updates from usage after each reply. Passive.
- A chevron on each reply opens its timings on one line - tokens read and their
  speed, cache reuse, TTFT, drafts accepted (the response's llama.cpp-named
  timings, kept in localStorage with the message). The requests table gains a
  PP t/s column beside decode, computed in the UI from the history fields the
  server already returns (net of the reused cache share).
- The compact button summarizes the older turns: the newest turns stay verbatim
  up to a ~5k-token budget, the summary carries them as an exact client-built
  transcript, and the payload after any compaction is [summary] + newer messages
  (web/compaction.js, tested by web/test_compaction.mjs through
  serve/test_compaction.py). The page keeps every message - muted above the cut -
  and only the newest summary can be put back. Long user messages clamp with a
  Show-all toggle; display only.
Hugua700 pushed a commit to Hugua700/Strata that referenced this pull request Oct 6, 2026
…load() (the idle thread cannot unload between load and run); unload() sends QUIT before terminate; the VRAM guard checks the first GPU (docs); Niko1221#163's test engine answers poll()
anon761 pushed a commit to anon761/Strata-upstream that referenced this pull request Oct 6, 2026
…load() (the idle thread cannot unload between load and run); unload() sends QUIT before terminate; the VRAM guard checks the first GPU (docs); Niko1221#163's test engine answers poll()
anon761 pushed a commit to anon761/Strata-upstream that referenced this pull request Oct 6, 2026
…load() (the idle thread cannot unload between load and run); unload() sends QUIT before terminate; the VRAM guard checks the first GPU (docs); Niko1221#163's test engine answers poll()

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0154bwiad8gY7wRehCXy27pN
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants