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