(fpsMetrics?: FpsMetrics)
| 141 | * Call this before switching sessions to avoid losing accumulated costs. |
| 142 | */ |
| 143 | export function saveCurrentSessionCosts(fpsMetrics?: FpsMetrics): void { |
| 144 | saveCurrentProjectConfig(current => ({ |
| 145 | ...current, |
| 146 | lastCost: getTotalCostUSD(), |
| 147 | lastAPIDuration: getTotalAPIDuration(), |
| 148 | lastAPIDurationWithoutRetries: getTotalAPIDurationWithoutRetries(), |
| 149 | lastToolDuration: getTotalToolDuration(), |
| 150 | lastDuration: getTotalDuration(), |
| 151 | lastLinesAdded: getTotalLinesAdded(), |
| 152 | lastLinesRemoved: getTotalLinesRemoved(), |
| 153 | lastTotalInputTokens: getTotalInputTokens(), |
| 154 | lastTotalOutputTokens: getTotalOutputTokens(), |
| 155 | lastTotalCacheCreationInputTokens: getTotalCacheCreationInputTokens(), |
| 156 | lastTotalCacheReadInputTokens: getTotalCacheReadInputTokens(), |
| 157 | lastTotalWebSearchRequests: getTotalWebSearchRequests(), |
| 158 | lastFpsAverage: fpsMetrics?.averageFps, |
| 159 | lastFpsLow1Pct: fpsMetrics?.low1PctFps, |
| 160 | lastModelUsage: Object.fromEntries( |
| 161 | Object.entries(getModelUsage()).map(([model, usage]) => [ |
| 162 | model, |
| 163 | { |
| 164 | inputTokens: usage.inputTokens, |
| 165 | outputTokens: usage.outputTokens, |
| 166 | cacheReadInputTokens: usage.cacheReadInputTokens, |
| 167 | cacheCreationInputTokens: usage.cacheCreationInputTokens, |
| 168 | webSearchRequests: usage.webSearchRequests, |
| 169 | costUSD: usage.costUSD, |
| 170 | }, |
| 171 | ]), |
| 172 | ), |
| 173 | lastSessionId: getSessionId(), |
| 174 | })) |
| 175 | } |
| 176 | |
| 177 | function formatCost(cost: number, maxDecimalPlaces: number = 4): string { |
| 178 | return `$${cost > 0.5 ? round(cost, 100).toFixed(2) : cost.toFixed(maxDecimalPlaces)}` |
no test coverage detected