Initial public release

This commit is contained in:
Bohdan Triapitsyn
2025-12-07 19:32:53 +02:00
commit 4b2edf7318
319 changed files with 81600 additions and 0 deletions
@@ -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);
};