Initial public release
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
import type { Message, Part } from "@opencode-ai/sdk";
|
||||
|
||||
type TokenBreakdown = {
|
||||
input?: number;
|
||||
output?: number;
|
||||
reasoning?: number;
|
||||
cache?: {
|
||||
read?: number;
|
||||
write?: number;
|
||||
};
|
||||
};
|
||||
|
||||
const sumTokenBreakdown = (breakdown: TokenBreakdown | null | undefined): number => {
|
||||
if (!breakdown || typeof breakdown !== 'object') {
|
||||
return 0;
|
||||
}
|
||||
|
||||
const inputTokens = breakdown.input ?? 0;
|
||||
const outputTokens = breakdown.output ?? 0;
|
||||
const reasoningTokens = breakdown.reasoning ?? 0;
|
||||
const cacheReadTokens = breakdown.cache && typeof breakdown.cache === 'object' ? breakdown.cache.read ?? 0 : 0;
|
||||
const cacheWriteTokens = breakdown.cache && typeof breakdown.cache === 'object' ? breakdown.cache.write ?? 0 : 0;
|
||||
|
||||
return inputTokens + outputTokens + reasoningTokens + cacheReadTokens + cacheWriteTokens;
|
||||
};
|
||||
|
||||
export const extractTokensFromMessage = (message: { info: Message; parts: Part[] }): number => {
|
||||
const tokens = (message.info as { tokens?: number | TokenBreakdown }).tokens;
|
||||
|
||||
if (typeof tokens === 'number') {
|
||||
return tokens;
|
||||
}
|
||||
|
||||
if (tokens && typeof tokens === 'object') {
|
||||
return sumTokenBreakdown(tokens);
|
||||
}
|
||||
|
||||
const tokenPart = message.parts.find(
|
||||
(part) => typeof (part as { tokens?: number | TokenBreakdown }).tokens !== 'undefined'
|
||||
) as { tokens?: number | TokenBreakdown } | undefined;
|
||||
|
||||
if (!tokenPart || typeof tokenPart.tokens === 'undefined') {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (typeof tokenPart.tokens === 'number') {
|
||||
return tokenPart.tokens;
|
||||
}
|
||||
|
||||
return sumTokenBreakdown(tokenPart.tokens);
|
||||
};
|
||||
Reference in New Issue
Block a user