FOCUS-compatible CSV export

InferCost emits FOCUS-compatible CSV so on-prem inference spend drops into Kubecost, Cloudability, or any FOCUS-aware BI pipeline alongside your cloud spend — no custom importer, no schema translation.

The short version

# Export every UsageReport in the cluster to a CSV
infercost export focus --out april-2026.csv

# Filter by namespace and period
infercost export focus \
  --namespace engineering \
  --period 2026-04 \
  --out engineering-april.csv

# Tag with a region for multi-cluster rollups
infercost export focus --region us-east-1-prod --out prod.csv

# Or stream to stdout and pipe
infercost export focus | awk -F, 'NR==1 || $1+0 > 1.0'

Why FOCUS?

FOCUS v1 was designed around SaaS cloud billing. It has no column for "GPU amortization" or "tokens consumed" — the fields an on-prem AI FinOps program actually needs. Rather than invent a proprietary schema, InferCost populates the standard FOCUS columns with the closest natural analogue (ServiceCategory = AI and Machine Learning, UsageUnit = Tokens, etc.) and carries the on-prem specifics as x-Infer* extension columns.

FOCUS explicitly allows the x- prefix for vendor extensions and requires importers to tolerate unknown columns rather than reject them. A finance team that already pipes OpenCost → Kubecost → their BI stack can add InferCost's CSV as another source and slice total AI spend alongside cloud spend on the same dashboard.

Row shape

One row per (UsageReport, ModelCostBreakdown). A report with three models produces three rows. A report with no model breakdown (still warming up, pods missing) emits one rollup row so the namespace doesn't disappear from finance exports.

Column reference

Standard FOCUS v1 columns (always populated)

  • BilledCost, EffectiveCost, ListCost, ContractedCost — all equal (no discount model on-prem)
  • ChargePeriodStart, ChargePeriodEnd — RFC3339 timestamps from the UsageReport's period
  • BillingPeriodStart, BillingPeriodEnd — month boundaries around the charge
  • Currency = USD
  • ServiceName = On-Prem AI Inference
  • ServiceCategory = AI and Machine Learning (FOCUS v1 canonical enum)
  • ResourceId = <namespace>/<report>/<model>
  • UsageQuantity = total tokens; UsageUnit = Tokens
  • SubAccountId = Kubernetes namespace (for per-team chargeback)
  • ChargeCategory = Usage; ChargeClass = empty
  • Tags = JSON object with report/schedule/model/gpuModel

InferCost extensions (x-Infer*)

  • x-InferCostProfile — CostProfile name this row references
  • x-InferGpuModel, x-InferGpuCount
  • x-InferTokensInput, x-InferTokensOutput
  • x-InferAmortizationYears, x-InferElectricityRatePerKWh, x-InferPUEFactor
  • x-InferCloudEquivalentProvider, x-InferCloudEquivalentModel, x-InferCloudEquivalentCostUSD
  • x-InferSavingsUSD, x-InferSavingsPercent

The cloud-equivalent columns are populated from the highest-savings entry in the UsageReport's cloudComparison — that's the figure a finance audit actually needs ("what would this have cost us on cloud?"). Consumers who need the full per-provider comparison matrix should query the CRD directly.

FOCUS version alignment

InferCost tracks FOCUS v1.0. When FOCUS v1.1 lands with native AI-inference coverage, the x-Infer* columns will migrate to the standard names in a minor release with a documented alias period. Until then, the x- prefix guarantees import compatibility — FOCUS requires importers to tolerate unknown x- columns.

Importing into Kubecost and Cloudability

Both tools accept FOCUS CSV via their custom-import flows. The standard columns are enough for high-level spend dashboards. To unlock per-token and per-GPU-model views, register the x-Infer* columns as custom fields in the target tool. If a downstream tool rejects a specific row, open an issue — we adjust the emission rather than tell users to work around it.