(prev: Message[] | null, next: Message[])
| 73 | |
| 74 | /** Compare this turn's prompt against the previous turn's to estimate KV-cache reuse. */ |
| 75 | export function describeCacheReuse(prev: Message[] | null, next: Message[]): CacheReuse { |
| 76 | if (!prev || prev.length === 0) { |
| 77 | return { reusedMessages: 0, totalMessages: next.length, changedAt: 0, reuseRatio: 0, reusedChars: 0 }; |
| 78 | } |
| 79 | const reused = commonPrefixLength(prev, next); |
| 80 | return { |
| 81 | reusedMessages: reused, |
| 82 | totalMessages: next.length, |
| 83 | changedAt: reused < next.length ? reused : -1, |
| 84 | reuseRatio: next.length === 0 ? 0 : reused / next.length, |
| 85 | reusedChars: prefixChars(next, reused), |
| 86 | }; |
| 87 | } |
| 88 | |
| 89 | /** Output tokens per second. Returns 0 for non-positive latency to avoid Infinity. */ |
| 90 | export function computeThroughput(outputTokens: number, latencyMs: number): number { |
no test coverage detected