Compare commits
2 Commits
docs/auto-
...
ralph/fix/
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
33386cdce8 | ||
|
|
f3deacb74e |
@@ -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()) {
|
||||||
|
|||||||
@@ -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, {
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user