import type { Message, Part } from "@opencode-ai/sdk/v2"; 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); };