fix: pricing show 0 when it is defined (#1266)

This commit is contained in:
Ralph Khreish
2025-10-03 16:21:32 +02:00
committed by GitHub
parent 738ec51c04
commit f1393f47b1
3 changed files with 60 additions and 17 deletions

View File

@@ -93,31 +93,55 @@ function _getProvider(providerName) {
// Helper function to get cost for a specific model // Helper function to get cost for a specific model
function _getCostForModel(providerName, modelId) { function _getCostForModel(providerName, modelId) {
const DEFAULT_COST = { inputCost: 0, outputCost: 0, currency: 'USD' }; const DEFAULT_COST = {
inputCost: 0,
outputCost: 0,
currency: 'USD',
isUnknown: false
};
if (!MODEL_MAP || !MODEL_MAP[providerName]) { if (!MODEL_MAP || !MODEL_MAP[providerName]) {
log( log(
'warn', 'warn',
`Provider "${providerName}" not found in MODEL_MAP. Cannot determine cost for model ${modelId}.` `Provider "${providerName}" not found in MODEL_MAP. Cannot determine cost for model ${modelId}.`
); );
return DEFAULT_COST; return { ...DEFAULT_COST, isUnknown: true };
} }
const modelData = MODEL_MAP[providerName].find((m) => m.id === modelId); const modelData = MODEL_MAP[providerName].find((m) => m.id === modelId);
if (!modelData?.cost_per_1m_tokens) { if (!modelData) {
log( log(
'debug', 'debug',
`Cost data not found for model "${modelId}" under provider "${providerName}". Assuming zero cost.` `Model "${modelId}" not found under provider "${providerName}". Assuming unknown cost.`
); );
return DEFAULT_COST; return { ...DEFAULT_COST, isUnknown: true };
}
// Check if cost_per_1m_tokens is explicitly null (unknown pricing)
if (modelData.cost_per_1m_tokens === null) {
log(
'debug',
`Cost data is null for model "${modelId}" under provider "${providerName}". Pricing unknown.`
);
return { ...DEFAULT_COST, isUnknown: true };
}
// Check if cost_per_1m_tokens is missing/undefined (also unknown)
if (modelData.cost_per_1m_tokens === undefined) {
log(
'debug',
`Cost data not found for model "${modelId}" under provider "${providerName}". Pricing unknown.`
);
return { ...DEFAULT_COST, isUnknown: true };
} }
const costs = modelData.cost_per_1m_tokens; const costs = modelData.cost_per_1m_tokens;
return { return {
inputCost: costs.input || 0, inputCost: costs.input || 0,
outputCost: costs.output || 0, outputCost: costs.output || 0,
currency: costs.currency || 'USD' currency: costs.currency || 'USD',
isUnknown: false
}; };
} }
@@ -867,8 +891,8 @@ async function logAiUsage({
const timestamp = new Date().toISOString(); const timestamp = new Date().toISOString();
const totalTokens = (inputTokens || 0) + (outputTokens || 0); const totalTokens = (inputTokens || 0) + (outputTokens || 0);
// Destructure currency along with costs // Destructure currency along with costs and unknown flag
const { inputCost, outputCost, currency } = _getCostForModel( const { inputCost, outputCost, currency, isUnknown } = _getCostForModel(
providerName, providerName,
modelId modelId
); );
@@ -890,7 +914,8 @@ async function logAiUsage({
outputTokens: outputTokens || 0, outputTokens: outputTokens || 0,
totalTokens, totalTokens,
totalCost, totalCost,
currency // Add currency to the telemetry data currency, // Add currency to the telemetry data
isUnknownCost: isUnknown // Flag to indicate if pricing is unknown
}; };
if (getDebugFlag()) { if (getDebugFlag()) {

View File

@@ -2310,7 +2310,8 @@ function displayAiUsageSummary(telemetryData, outputType = 'cli') {
outputTokens, outputTokens,
totalTokens, totalTokens,
totalCost, totalCost,
commandName commandName,
isUnknownCost
} = telemetryData; } = telemetryData;
let summary = chalk.bold.blue('AI Usage Summary:') + '\n'; let summary = chalk.bold.blue('AI Usage Summary:') + '\n';
@@ -2320,7 +2321,10 @@ function displayAiUsageSummary(telemetryData, outputType = 'cli') {
summary += chalk.gray( summary += chalk.gray(
` Tokens: ${totalTokens} (Input: ${inputTokens}, Output: ${outputTokens})\n` ` Tokens: ${totalTokens} (Input: ${inputTokens}, Output: ${outputTokens})\n`
); );
summary += chalk.gray(` Est. Cost: $${totalCost.toFixed(6)}`);
// Show "Unknown" if pricing data is not available, otherwise show the cost
const costDisplay = isUnknownCost ? 'Unknown' : `$${totalCost.toFixed(6)}`;
summary += chalk.gray(` Est. Cost: ${costDisplay}`);
console.log( console.log(
boxen(summary, { boxen(summary, {

View File

@@ -176,12 +176,19 @@ export class BaseAIProvider {
`${this.name} generateText completed successfully for model: ${params.modelId}` `${this.name} generateText completed successfully for model: ${params.modelId}`
); );
const inputTokens =
result.usage?.inputTokens ?? result.usage?.promptTokens ?? 0;
const outputTokens =
result.usage?.outputTokens ?? result.usage?.completionTokens ?? 0;
const totalTokens =
result.usage?.totalTokens ?? inputTokens + outputTokens;
return { return {
text: result.text, text: result.text,
usage: { usage: {
inputTokens: result.usage?.promptTokens, inputTokens,
outputTokens: result.usage?.completionTokens, outputTokens,
totalTokens: result.usage?.totalTokens totalTokens
} }
}; };
} catch (error) { } catch (error) {
@@ -296,12 +303,19 @@ export class BaseAIProvider {
`${this.name} generateObject completed successfully for model: ${params.modelId}` `${this.name} generateObject completed successfully for model: ${params.modelId}`
); );
const inputTokens =
result.usage?.inputTokens ?? result.usage?.promptTokens ?? 0;
const outputTokens =
result.usage?.outputTokens ?? result.usage?.completionTokens ?? 0;
const totalTokens =
result.usage?.totalTokens ?? inputTokens + outputTokens;
return { return {
object: result.object, object: result.object,
usage: { usage: {
inputTokens: result.usage?.promptTokens, inputTokens,
outputTokens: result.usage?.completionTokens, outputTokens,
totalTokens: result.usage?.totalTokens totalTokens
} }
}; };
} catch (error) { } catch (error) {