mirror of
https://git.sync.wtf/troed/oc-ls-stats.git
synced 2026-10-12 12:38:22 +03:00
feat: Strata support (detect via /health, read /metrics.live)
This commit is contained in:
1 parent
55f5e52a6c
commit
f127895ecd
4 files changed
+307
-23
No files matched your search
@@ -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
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user