Show actual AI token usage and cost

This commit is contained in:
Wojtek
2026-10-16 13:08:59 +02:00
parent 6daca5be59
commit 7d9efd64f4
6 changed files with 73 additions and 2 deletions
@@ -73,9 +73,46 @@ class AiService
throw new \RuntimeException('AI zwróciło nieprawidłowy format oceny i punktów.');
}
$usage = $this->getUsage($body, $provider, $config['model']);
return [
'awarded_points' => min(max(0, $maxPoints), max(0, (int) $result['awarded_points'])),
'feedback' => trim((string) ($result['feedback'] ?? '')),
'usage' => $usage,
];
}
private function getUsage(array $body, string $provider, string $model): ?array
{
$usage = $body['usage'] ?? null;
if (!is_array($usage) || !isset($usage['input_tokens'], $usage['output_tokens'])) {
return null;
}
$inputTokens = max(0, (int) $usage['input_tokens']);
$outputTokens = max(0, (int) $usage['output_tokens']);
$cachedTokens = min($inputTokens, max(0, (int) ($usage['input_tokens_details']['cached_tokens'] ?? 0)));
$cost = null;
$costSource = '';
if ($provider === 'grok' && isset($usage['cost_in_usd_ticks']) && is_numeric($usage['cost_in_usd_ticks'])) {
$cost = (float) $usage['cost_in_usd_ticks'] / 10000000000;
$costSource = 'provider';
} elseif ($provider === 'openai' && $model === 'gpt-4.1-mini') {
$uncachedTokens = $inputTokens - $cachedTokens;
$cost = ($uncachedTokens * 0.40 + $cachedTokens * 0.10 + $outputTokens * 1.60) / 1000000;
$costSource = 'token_rates';
}
return [
'provider' => $provider,
'model' => $model,
'input_tokens' => $inputTokens,
'output_tokens' => $outputTokens,
'total_tokens' => (int) ($usage['total_tokens'] ?? ($inputTokens + $outputTokens)),
'cached_input_tokens' => $cachedTokens,
'cost_usd' => $cost,
'cost_source' => $costSource,
];
}