Forge
csharpcf25d736
1namespace CascadeIDE.Services.Fm;
2
3/// <summary>Форматирование FM usage для Intercom chrome subtitle.</summary>
4public static class FmUsagePresentation
5{
6 public static string FormatSubtitle(
7 FmTurnUsage? lastTurn,
8 FmTurnUsage? sessionTotals,
9 int? maxModelLen,
10 int contextWarnPct)
11 {
12 if (lastTurn is null && sessionTotals is null)
13 return "";
14
15 var parts = new List<string>(4);
16 if (lastTurn is not null)
17 parts.Add($"ход in {FormatK(lastTurn.PromptTokens)} · out {FormatK(lastTurn.CompletionTokens)}");
18
19 if (sessionTotals is not null && (lastTurn is null || sessionTotals.TotalTokens != lastTurn.TotalTokens))
20 parts.Add($"сессия {FormatK(sessionTotals.TotalTokens)}");
21
22 if (maxModelLen is > 0 && lastTurn is not null)
23 {
24 var pct = (int)Math.Round(100.0 * lastTurn.PromptTokens / maxModelLen.Value);
25 parts.Add($"ctx {FormatK(lastTurn.PromptTokens)}/{FormatK(maxModelLen.Value)} ({pct}%)");
26 if (contextWarnPct > 0 && pct >= contextWarnPct)
27 parts.Add("⚠ budget");
28 }
29
30 return string.Join(" · ", parts);
31 }
32
33 private static string FormatK(int tokens) =>
34 tokens >= 10_000
35 ? string.Create(System.Globalization.CultureInfo.InvariantCulture, $"{tokens / 1000.0:0.#}k")
36 : tokens.ToString(System.Globalization.CultureInfo.InvariantCulture);
37}
38
View only · write via MCP/CIDE