feat: Strata support (detect via /health, read /metrics.live)

This commit is contained in:
Troed Sångberg committed 2026-10-08 09:21:34 +00:00
1 parent 55f5e52a6c
commit f127895ecd
4 files changed
+307 -23

No files matched your search

+64
View File
@@ -308,3 +308,67 @@ export function selectSessionUrls(
}
return []
}
// --- Strata adapter ---------------------------------------------------------
// Strata is a llama.cpp-derived server whose HTTP layer is Python. Its /slots
// route is a minimal compatibility stub, but /metrics.live carries the live
// rates directly: prefill_tok_s_mean while reading, tok_s while generating.
export type ServerType = "llama" | "strata"
/** Returns the explicit server type from the plugin option, or undefined for auto. */
export function serverTypeOverride(value: unknown): ServerType | undefined {
if (value === "llama" || value === "strata") return value
return undefined
}
/** True when a parsed /health body identifies the server as Strata. */
export function isStrataHealth(health: unknown): boolean {
if (!health || typeof health !== "object") return false
return (health as Record<string, unknown>).service === "strata"
}
function finiteOrZero(value: unknown): number {
return typeof value === "number" && Number.isFinite(value) ? value : 0
}
/**
* Map a Strata `/metrics.live` object onto the shared tracker. Strata reports
* the rates itself, so no delta classification is needed: `state` says which
* phase is active and `prefill_tok_s_mean` / `tok_s` carry the rate.
*/
export function mapStrataLive(live: unknown, tracker: TrackerState): void {
const l = live && typeof live === "object" ? (live as Record<string, unknown>) : {}
const state = typeof l.state === "string" ? l.state : ""
if (state === "reading") {
tracker.isPrefilling = true
tracker.isGenerating = false
tracker.prefillSlotId = 0
tracker.lastPrefillRate = finiteOrZero(l.prefill_tok_s_mean)
tracker.generateSlotId = null
tracker.generatePrevNd = 0
tracker.generateStartAt = 0
tracker.lastGeneratedTps = 0
} else if (state === "generating") {
tracker.isGenerating = true
tracker.isPrefilling = false
tracker.generateSlotId = 0
tracker.lastGeneratedTps = finiteOrZero(l.tok_s)
tracker.prefillSlotId = null
tracker.prefillCapturedTokens = null
tracker.prefillStartAt = 0
tracker.lastPrefillRate = 0
} else {
tracker.isPrefilling = false
tracker.isGenerating = false
tracker.prefillSlotId = null
tracker.prefillCapturedTokens = null
tracker.prefillStartAt = 0
tracker.lastPrefillRate = 0
tracker.generateSlotId = null
tracker.generatePrevNd = 0
tracker.generateStartAt = 0
tracker.lastGeneratedTps = 0
}
}