( tokens: OpencodeTokens | undefined, )
| 52 | } |
| 53 | |
| 54 | function buildUsage( |
| 55 | tokens: OpencodeTokens | undefined, |
| 56 | ): TokenUsage | undefined { |
| 57 | if (!tokens) return undefined |
| 58 | const promptTokens = tokens.input ?? 0 |
| 59 | const completionTokens = tokens.output ?? 0 |
| 60 | const result = buildBaseUsage({ |
| 61 | promptTokens, |
| 62 | completionTokens, |
| 63 | totalTokens: promptTokens + completionTokens, |
| 64 | }) |
| 65 | if (tokens.cache?.read) { |
| 66 | result.promptTokensDetails = { cachedTokens: tokens.cache.read } |
| 67 | } |
| 68 | if (tokens.reasoning) { |
| 69 | result.completionTokensDetails = { reasoningTokens: tokens.reasoning } |
| 70 | } |
| 71 | return result |
| 72 | } |
| 73 | |
| 74 | type TextPart = Extract<OpencodePart, { type: 'text' }> |
| 75 | type ReasoningPart = Extract<OpencodePart, { type: 'reasoning' }> |
no test coverage detected