mirror of
https://github.com/siteboon/claudecodeui.git
synced 2026-06-05 20:45:45 +08:00
Compare commits
1 Commits
fix/file-t
...
fix/stop-b
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6440f0c64d |
@@ -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,
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user