internal/server,ui: add new Acitivty page column - Drafted (#859)

Add draft metrics to activity log
This commit is contained in:
Wojciech
2026-06-19 05:55:02 +02:00
committed by GitHub
parent a15e47922c
commit 9bcddad91b
3 changed files with 21 additions and 0 deletions
+10
View File
@@ -25,6 +25,8 @@ import (
// TokenMetrics holds token usage and performance metrics. // TokenMetrics holds token usage and performance metrics.
type TokenMetrics struct { type TokenMetrics struct {
CachedTokens int `json:"cache_tokens"` CachedTokens int `json:"cache_tokens"`
DraftTokens int `json:"draft_tokens"`
DraftAccTokens int `json:"draft_acc_tokens"`
InputTokens int `json:"input_tokens"` InputTokens int `json:"input_tokens"`
OutputTokens int `json:"output_tokens"` OutputTokens int `json:"output_tokens"`
PromptPerSecond float64 `json:"prompt_per_second"` PromptPerSecond float64 `json:"prompt_per_second"`
@@ -345,6 +347,8 @@ func buildMetrics(modelID string, start time.Time, inputTokens, outputTokens, ca
durationMs := wallDurationMs durationMs := wallDurationMs
tokensPerSecond := -1.0 tokensPerSecond := -1.0
promptPerSecond := -1.0 promptPerSecond := -1.0
draftTokens := -1
draftAccTokens := -1
if timings.Exists() { if timings.Exists() {
inputTokens = timings.Get("prompt_n").Int() inputTokens = timings.Get("prompt_n").Int()
@@ -358,6 +362,10 @@ func buildMetrics(modelID string, start time.Time, inputTokens, outputTokens, ca
if cachedValue := timings.Get("cache_n"); cachedValue.Exists() { if cachedValue := timings.Get("cache_n"); cachedValue.Exists() {
cachedTokens = cachedValue.Int() cachedTokens = cachedValue.Int()
} }
if timings.Get("draft_n").Exists() && timings.Get("draft_n_accepted").Exists() {
draftTokens = int(timings.Get("draft_n").Int())
draftAccTokens = int(timings.Get("draft_n_accepted").Int())
}
} }
return ActivityLogEntry{ return ActivityLogEntry{
@@ -365,6 +373,8 @@ func buildMetrics(modelID string, start time.Time, inputTokens, outputTokens, ca
Model: modelID, Model: modelID,
Tokens: TokenMetrics{ Tokens: TokenMetrics{
CachedTokens: int(cachedTokens), CachedTokens: int(cachedTokens),
DraftTokens: draftTokens,
DraftAccTokens: draftAccTokens,
InputTokens: int(inputTokens), InputTokens: int(inputTokens),
OutputTokens: int(outputTokens), OutputTokens: int(outputTokens),
PromptPerSecond: promptPerSecond, PromptPerSecond: promptPerSecond,
+2
View File
@@ -25,6 +25,8 @@ export interface Model {
export interface TokenMetrics { export interface TokenMetrics {
cache_tokens: number; cache_tokens: number;
draft_tokens: number;
draft_acc_tokens: number;
input_tokens: number; input_tokens: number;
output_tokens: number; output_tokens: number;
prompt_per_second: number; prompt_per_second: number;
+9
View File
@@ -26,6 +26,7 @@
{ key: "cached", label: "Cached", defaultVisible: true }, { key: "cached", label: "Cached", defaultVisible: true },
{ key: "prompt", label: "Prompt", defaultVisible: true }, { key: "prompt", label: "Prompt", defaultVisible: true },
{ key: "generated", label: "Generated", defaultVisible: true }, { key: "generated", label: "Generated", defaultVisible: true },
{ key: "drafted", label: "Drafted", defaultVisible: false },
{ key: "prompt_speed", label: "Prompt Speed", defaultVisible: true }, { key: "prompt_speed", label: "Prompt Speed", defaultVisible: true },
{ key: "gen_speed", label: "Gen Speed", defaultVisible: true }, { key: "gen_speed", label: "Gen Speed", defaultVisible: true },
{ key: "duration", label: "Duration", defaultVisible: true }, { key: "duration", label: "Duration", defaultVisible: true },
@@ -158,6 +159,10 @@
return speed < 0 ? "unknown" : speed.toFixed(2) + " t/s"; return speed < 0 ? "unknown" : speed.toFixed(2) + " t/s";
} }
function formatDrafted(drafted: number, accepted: number): string {
return drafted > 0 ? (accepted * 100 / drafted).toFixed(1) + "% (" + accepted + "/" + drafted + ")" : "-";
}
function formatDuration(ms: number): string { function formatDuration(ms: number): string {
return (ms / 1000).toFixed(2) + "s"; return (ms / 1000).toFixed(2) + "s";
} }
@@ -273,6 +278,8 @@
Cached <Tooltip content="prompt tokens from cache" /> Cached <Tooltip content="prompt tokens from cache" />
{:else if key === "prompt"} {:else if key === "prompt"}
Prompt <Tooltip content="new prompt tokens processed" /> Prompt <Tooltip content="new prompt tokens processed" />
{:else if key === "drafted"}
Drafted <Tooltip content="acceptance rate (accepted/drafted)" />
{:else} {:else}
{columnLabelMap[key] ?? key} {columnLabelMap[key] ?? key}
{/if} {/if}
@@ -310,6 +317,8 @@
{metric.tokens.input_tokens.toLocaleString()} {metric.tokens.input_tokens.toLocaleString()}
{:else if key === "generated"} {:else if key === "generated"}
{metric.tokens.output_tokens.toLocaleString()} {metric.tokens.output_tokens.toLocaleString()}
{:else if key === "drafted"}
{formatDrafted(metric.tokens.draft_tokens, metric.tokens.draft_acc_tokens)}
{:else if key === "prompt_speed"} {:else if key === "prompt_speed"}
{formatSpeed(metric.tokens.prompt_per_second)} {formatSpeed(metric.tokens.prompt_per_second)}
{:else if key === "gen_speed"} {:else if key === "gen_speed"}