feat(chat): display token usage and tps in message footers (#1094)

This commit is contained in:
M57 authored and GitHub committed 2026-09-12 16:04:13 +03:00
1 parent 0bb087c41e
commit 065c7fd75f
24 files changed
+448 -3

No files matched your search

@@ -4,6 +4,7 @@ import kotlinx.serialization.Serializable
import kotlinx.serialization.json.JsonElement
import kotlinx.serialization.json.JsonPrimitive
import kotlinx.serialization.json.doubleOrNull
import kotlinx.serialization.json.intOrNull
import kotlinx.serialization.json.longOrNull
@Serializable
@@ -50,10 +51,18 @@ data class SessionMessage(
val display_kind: String? = null,
/** Display-only metadata for the marker (e.g. delegation result counts). */
val display_metadata: JsonElement? = null,
/** Token count recorded by the backend. */
val token_count: JsonElement? = null,
) {
val timestampText: String?
get() = (timestamp as? JsonPrimitive)?.content
val tokenCount: Int?
get() {
val prim = token_count as? JsonPrimitive ?: return null
return prim.intOrNull ?: prim.content.toIntOrNull()
}
val timestampEpochMs: Long?
get() {
val prim = timestamp as? JsonPrimitive ?: return null
@@ -20,6 +20,8 @@ data class UsageSnapshotResponse(
val contextMax: Long? = null,
/** Cumulative session total tokens. */
val totalTokens: Long? = null,
/** Rolling tokens-per-second generation speed. */
val avgTps: Double? = null,
)
/**
@@ -38,5 +40,6 @@ fun parseUsageSnapshot(result: Any?): UsageSnapshotResponse? {
contextUsed = (usageMap["context_used"] as? Number)?.toLong(),
contextMax = (usageMap["context_max"] as? Number)?.toLong(),
totalTokens = (usageMap["total"] as? Number)?.toLong(),
avgTps = (usageMap["avg_tps"] as? Number)?.toDouble(),
)
}