Compare commits

...

1 Commits

Author SHA1 Message Date
Haileyesus
6440f0c64d fix: stop button 2026-06-05 15:29:41 +03:00
4 changed files with 57 additions and 14 deletions

View File

@@ -304,7 +304,11 @@ function extractTokenBudget(sdkMessage) {
const messageUsage = sdkMessage.message?.usage || sdkMessage.usage; const messageUsage = sdkMessage.message?.usage || sdkMessage.usage;
if (messageUsage && typeof messageUsage === 'object') { if (messageUsage && typeof messageUsage === 'object') {
const inputTokens = readNumber(messageUsage.input_tokens ?? messageUsage.inputTokens); const directInputTokens = readNumber(messageUsage.input_tokens ?? messageUsage.inputTokens);
const cacheCreationTokens = readNumber(messageUsage.cache_creation_input_tokens ?? messageUsage.cacheCreationInputTokens ?? messageUsage.cacheCreationTokens);
const cacheReadTokens = readNumber(messageUsage.cache_read_input_tokens ?? messageUsage.cacheReadInputTokens ?? messageUsage.cacheReadTokens);
const cacheTokens = cacheCreationTokens + cacheReadTokens;
const inputTokens = directInputTokens + cacheTokens;
const outputTokens = readNumber(messageUsage.output_tokens ?? messageUsage.outputTokens); const outputTokens = readNumber(messageUsage.output_tokens ?? messageUsage.outputTokens);
const totalUsed = inputTokens + outputTokens; const totalUsed = inputTokens + outputTokens;
const contextWindow = parseInt(process.env.CONTEXT_WINDOW, 10) || 160000; const contextWindow = parseInt(process.env.CONTEXT_WINDOW, 10) || 160000;
@@ -314,6 +318,9 @@ function extractTokenBudget(sdkMessage) {
total: contextWindow, total: contextWindow,
inputTokens, inputTokens,
outputTokens, outputTokens,
cacheReadTokens,
cacheCreationTokens,
cacheTokens,
breakdown: { breakdown: {
input: inputTokens, input: inputTokens,
output: outputTokens, output: outputTokens,

View File

@@ -87,6 +87,11 @@ const installMode = fs.existsSync(path.join(APP_ROOT, '.git')) ? 'git' : 'npm';
console.log('SERVER_PORT from env:', process.env.SERVER_PORT); console.log('SERVER_PORT from env:', process.env.SERVER_PORT);
function readUsageNumber(value) {
const parsed = Number(value);
return Number.isFinite(parsed) ? parsed : 0;
}
const app = express(); const app = express();
const server = http.createServer(app); const server = http.createServer(app);
@@ -1386,6 +1391,8 @@ app.get('/api/projects/:projectId/sessions/:sessionId/token-usage', authenticate
const contextWindow = Number.isFinite(parsedContextWindow) ? parsedContextWindow : 160000; const contextWindow = Number.isFinite(parsedContextWindow) ? parsedContextWindow : 160000;
let inputTokens = 0; let inputTokens = 0;
let outputTokens = 0; let outputTokens = 0;
let cacheReadTokens = 0;
let cacheCreationTokens = 0;
// Find the latest assistant message with usage data (scan from end) // Find the latest assistant message with usage data (scan from end)
for (let i = lines.length - 1; i >= 0; i--) { for (let i = lines.length - 1; i >= 0; i--) {
@@ -1397,8 +1404,11 @@ app.get('/api/projects/:projectId/sessions/:sessionId/token-usage', authenticate
const usage = entry.message.usage; const usage = entry.message.usage;
// Use token counts from latest assistant message only // Use token counts from latest assistant message only
inputTokens = usage.input_tokens || 0; const directInputTokens = readUsageNumber(usage.input_tokens ?? usage.inputTokens);
outputTokens = usage.output_tokens || 0; cacheReadTokens = readUsageNumber(usage.cache_read_input_tokens ?? usage.cacheReadInputTokens ?? usage.cacheReadTokens);
cacheCreationTokens = readUsageNumber(usage.cache_creation_input_tokens ?? usage.cacheCreationInputTokens ?? usage.cacheCreationTokens);
inputTokens = directInputTokens + cacheReadTokens + cacheCreationTokens;
outputTokens = readUsageNumber(usage.output_tokens ?? usage.outputTokens);
break; // Stop after finding the latest assistant message break; // Stop after finding the latest assistant message
} }
@@ -1409,12 +1419,16 @@ app.get('/api/projects/:projectId/sessions/:sessionId/token-usage', authenticate
} }
const totalUsed = inputTokens + outputTokens; const totalUsed = inputTokens + outputTokens;
const cacheTokens = cacheReadTokens + cacheCreationTokens;
res.json({ res.json({
used: totalUsed, used: totalUsed,
total: contextWindow, total: contextWindow,
inputTokens, inputTokens,
outputTokens, outputTokens,
cacheReadTokens,
cacheCreationTokens,
cacheTokens,
breakdown: { breakdown: {
input: inputTokens, input: inputTokens,
output: outputTokens output: outputTokens

View File

@@ -592,12 +592,14 @@ class ResponseCollector {
} }
} }
const inputTokens = totalInput + totalCacheRead + totalCacheCreation;
return { return {
inputTokens: totalInput, inputTokens,
outputTokens: totalOutput, outputTokens: totalOutput,
cacheReadTokens: totalCacheRead, cacheReadTokens: totalCacheRead,
cacheCreationTokens: totalCacheCreation, cacheCreationTokens: totalCacheCreation,
totalTokens: totalInput + totalOutput + totalCacheRead + totalCacheCreation totalTokens: inputTokens + totalOutput
}; };
} }
} }

View File

@@ -268,16 +268,35 @@ Custom commands can be created in:
tokenUsage.contextWindow ?? tokenUsage.contextWindow ??
0, 0,
) || 0; ) || 0;
const inputTokensRaw = const normalizedInputValue =
tokenUsage.inputTokens ??
tokenUsage.input ??
tokenUsage.cumulativeInputTokens ??
tokenUsage.breakdown?.input ??
tokenUsage.promptTokens;
const directInputTokens =
Number( Number(
tokenUsage.inputTokens ?? normalizedInputValue ??
tokenUsage.input ??
tokenUsage.input_tokens ?? tokenUsage.input_tokens ??
tokenUsage.cumulativeInputTokens ?? 0
tokenUsage.breakdown?.input ?? ) || 0;
tokenUsage.promptTokens ?? const cacheReadTokens =
Number(
tokenUsage.cacheReadTokens ??
tokenUsage.cache_read_input_tokens ??
tokenUsage.cacheReadInputTokens ??
0, 0,
) || 0; ) || 0;
const cacheCreationTokens =
Number(
tokenUsage.cacheCreationTokens ??
tokenUsage.cache_creation_input_tokens ??
tokenUsage.cacheCreationInputTokens ??
0,
) || 0;
const inputTokens = normalizedInputValue == null
? directInputTokens + cacheReadTokens + cacheCreationTokens
: directInputTokens;
const outputTokens = const outputTokens =
Number( Number(
tokenUsage.outputTokens ?? tokenUsage.outputTokens ??
@@ -288,8 +307,9 @@ Custom commands can be created in:
tokenUsage.completionTokens ?? tokenUsage.completionTokens ??
0, 0,
) || 0; ) || 0;
const hasTokenBreakdown = inputTokensRaw > 0 || outputTokens > 0; const computedUsed = inputTokens + outputTokens;
const used = reportedUsed || inputTokensRaw + outputTokens; const hasTokenBreakdown = computedUsed > 0;
const used = Math.max(reportedUsed, computedUsed);
return { return {
type: "builtin", type: "builtin",
@@ -302,7 +322,7 @@ Custom commands can be created in:
...(hasTokenBreakdown ...(hasTokenBreakdown
? { ? {
tokenBreakdown: { tokenBreakdown: {
input: inputTokensRaw, input: inputTokens,
output: outputTokens, output: outputTokens,
}, },
} }