Skip to content
9 changes: 9 additions & 0 deletions packages/backend/src/services/inspectors/usage-logging.ts
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,15 @@ export class UsageInspector extends PassThrough {
// Some providers emit `: cost {"request_cost_usd": ...}` as SSE comments
if (reconstructed?.providerReportedCost) {
applyProviderReportedCost(this.usageRecord, reconstructed.providerReportedCost);
if (reconstructed?.usage) {
const usageCostDetails = extractUsageCostDetails(reconstructed.usage);
if (usageCostDetails) {
logger.warn(
`[ProviderCost] Both SSE :cost and usage.cost_details present for ${this.usageRecord.requestId}; ` +
`SSE value ($${this.usageRecord.providerReportedCost}) takes priority over cost_details total ($${usageCostDetails.total_cost})`
);
}
}
}

// Override with provider-reported cost from usage.cost_details if available
Expand Down
9 changes: 9 additions & 0 deletions packages/backend/src/services/response-handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -502,6 +502,15 @@ async function finalizeUsage(
const reconstructed = debugManager.getReconstructedRawResponse(usageRecord.requestId!);
if (reconstructed?.providerReportedCost) {
applyProviderReportedCost(usageRecord, reconstructed.providerReportedCost);
if (reconstructed?.usage) {
const usageCostDetails = extractUsageCostDetails(reconstructed.usage);
if (usageCostDetails) {
logger.warn(
`[ProviderCost] Both SSE :cost and usage.cost_details present for ${usageRecord.requestId}; ` +
`SSE value ($${usageRecord.providerReportedCost}) takes priority over cost_details total ($${usageCostDetails.total_cost})`
);
}
}
}

// Also check for cost_details in the usage block (some providers embed costs there)
Expand Down
Loading