← Agent Frameworks 🕐 21 min read
Agent Frameworks

Enterprise AI Spend Forecasting and Budgeting — Why Forecasts Miss and Methods That Work (2026)

80% of enterprises miss AI infrastructure cost forecasts by more than 25% (Mavvrik, 2025, n=372). Only 15% of companies forecast within ±10% of actual spend. Nearly one in four miss by more than 50%.

80% of enterprises miss AI infrastructure cost forecasts by more than 25% (Mavvrik, 2025, n=372). Only 15% of companies forecast within ±10% of actual spend. Nearly one in four miss by more than 50%. The consequence is concrete: 84% of enterprises report measurable gross margin erosion tied to AI workloads.

This note explains why standard cloud forecasting models structurally fail for LLM workloads, then provides specific methods — bottom-up token modeling, AWS-native tooling, statistical time-series approaches, and scenario planning — that FinOps leads, platform teams, and CFOs can apply before the next budget cycle.


1. Why AI Forecasting Fails — Five Structural Reasons

Standard cloud financial models were built for reserved-capacity infrastructure: you provision EC2, commit to a reservation, and the cost line is largely deterministic. LLM API spend violates every assumption in that model.

1.1 Token Consumption Is Usage-Driven, Not Capacity-Driven

EC2 reservations decouple cost from usage. A reserved instance costs the same whether it runs at 5% or 95% CPU. LLM APIs have no analogous decoupling. Every token exchanged generates a billing event. If user engagement doubles, spend doubles — with no warning in a cost forecast that was built on last quarter’s request volume.

The practical implication: capacity-based forecasting (provision → forecast → reserve) produces structurally low estimates. Token forecasting must be demand-driven and must incorporate usage growth separately from infrastructure growth.

1.2 Model Version Upgrades Change Per-Token Pricing Without Traffic Change

AWS Bedrock and Anthropic both change pricing when they release new model versions. Claude 3 Haiku replaced Instant at a different price-per-token. Claude Sonnet 3.5 replaced Sonnet 3 at higher capability but with complex pricing implications. AWS Nova models introduced new price tiers.

A team that auto-upgrades to a new model version — often by accepting a default API alias — can see a 2-5× price-per-token change with no change in traffic volume. Bedrock model pricing in 2026 ranges from $0.035 per million output tokens (Nova Micro) to $75.00 per million output tokens (Claude Opus), a 2,000× spread. A model version upgrade that moves one workload two tiers up the stack can blow a quarterly budget.

Forecasting implication: Every model alias that points to a non-pinned version is a budget risk event. Pin model versions in production; treat model upgrades as a budget change request, not a deployment decision.

1.3 Context Window Creep Is Invisible Until the CUR Arrives

LLM input tokens have a structural growth dynamic that does not appear in request-count metrics. As product teams build features — conversation history, RAG context injection, system prompt expansion, multi-turn agentic loops — the average token count per request grows without the request count growing.

RAG architectures inflate context windows 3-5× compared to baseline chatbot interactions. A RAG pipeline that retrieves five 500-token passages before each user message adds 2,500 input tokens per request. At Claude Sonnet-class pricing, that is $7.50 per thousand requests added to cost — silently, before any new traffic.

The failure mode: product teams instrument request counts and latency. Nobody instruments token-per-request drift. The cost anomaly surfaces 30 days later in the Cost and Usage Report, after the product feature has been shipped to 100% of users.

Forecasting implication: Instrument input_tokens_per_request and output_tokens_per_request as first-class metrics in CloudWatch. Alert on >10% week-over-week increase. Include a context creep factor (1.1-1.3×) in baseline forecasts for any workload with active product development.

1.4 Agentic Workloads Have Unbounded Step Counts

Standard chatbot interactions have a bounded token budget: one system prompt + one user message + one model response. Agentic workflows do not. Each agent step invokes the model, receives a response, processes tool results, and re-invokes the model with an expanded context that includes all prior turns.

Microsoft Research (arXiv:2604.22750, 2026) measured agentic coding workloads consuming 1,000× more tokens than code chat for equivalent task complexity. The costliest problems consumed 7 million more tokens than the cheapest problem in the same benchmark suite. For the same problem, one run cost 30× more than another due to behavioral stochasticity — agents do not take deterministic paths.

At the FinOps Foundation’s 2026 survey level, enterprises with agentic AI deployments report 5-30× token amplification per user task compared to standard chatbot equivalents. This is not a marginal correction factor. It is a categorical difference in cost structure.

Forecasting implication: Agentic and non-agentic workloads must be forecast separately. Agentic workloads require a step-count distribution (not just a mean) and a max-step circuit breaker. Without a step cap, a single runaway agent job can produce a cost anomaly that exceeds a weekly budget in hours.

1.5 New Use Cases Launch Without Cost Estimates

The fastest-growing category of forecast error is the unforecasted workload. In the Mavvrik 2025 report, data platforms were the top source of unexpected AI spend — because data engineering teams began embedding LLM calls in ETL pipelines, data quality checks, and schema inference tasks without routing those decisions through FinOps.

The FinOps Foundation’s 2026 State of FinOps report identifies this as the dominant pattern: 41% of enterprises are wasting more than 15% of AI spend on workloads that were never in the budget because no pre-deployment architecture costing review occurred.

Forecasting implication: Gate any new LLM-enabled feature on a cost estimate that goes through FinOps review before deployment. The State of FinOps 2026 report calls this “shift-left costing” — the same concept as shift-left security, applied to cost. Build it into the deployment checklist, not the post-mortem.


2. Bottom-Up Token Forecasting Model

The structural antidote to the above failures is workload decomposition: enumerate every LLM call type in your application, model its token budget, and multiply by expected volume. This section provides the framework and template.

2.1 Workload Decomposition

For each distinct LLM call pattern in your application, define:

Field Definition How to Measure
call_type Logical name (e.g., “rag-answer”, “code-review”, “summarization”) Instrument with a call-type tag in your LLM client
system_prompt_tokens Fixed overhead per request Count once; update when prompt is edited
p50_input_tokens Median user input + context injection Measure from production logs
p95_input_tokens 95th-percentile input size Critical: see section 2.2
p50_output_tokens Median output length Measure from production logs
p95_output_tokens 95th-percentile output length
requests_per_day_current Current daily volume CloudWatch or application metrics
growth_rate_monthly Expected MoM growth (%) From product roadmap or historical trend
model_id Bedrock model ARN (pinned version) From deployment config
price_per_1k_input Current input token price AWS Bedrock pricing page
price_per_1k_output Current output token price AWS Bedrock pricing page

2.2 Use P95, Not Mean — Tail Distribution Matters

Mean token usage underestimates actual cost because LLM token distributions are right-skewed. A few expensive requests dominate the cost profile.

For a workload with mean input of 1,000 tokens but p95 of 4,500 tokens:

  • If you forecast using mean: predicted cost is accurate only if all requests are near-mean
  • If 5% of requests hit p95: actual cost is ~18% higher than mean-based forecast

Budget at p80-p85 of the token distribution for expected cost. Use p95 for anomaly alerting thresholds.

import numpy as np

def token_cost_estimate(
    sample_input_tokens: list[int],
    sample_output_tokens: list[int],
    requests_per_day: float,
    price_per_1k_input: float,
    price_per_1k_output: float,
    forecast_percentile: int = 80,
    days: int = 30,
) -> dict:
    """
    Estimate LLM workload cost using a percentile-based token budget.
    
    Args:
        sample_input_tokens: Historical input token counts per request
        sample_output_tokens: Historical output token counts per request
        requests_per_day: Current daily request volume
        price_per_1k_input: USD per 1,000 input tokens
        price_per_1k_output: USD per 1,000 output tokens
        forecast_percentile: Percentile of token distribution to budget against (80 recommended)
        days: Forecast horizon in days
    """
    p_input = np.percentile(sample_input_tokens, forecast_percentile)
    p_output = np.percentile(sample_output_tokens, forecast_percentile)
    
    daily_input_cost = (p_input / 1000) * price_per_1k_input * requests_per_day
    daily_output_cost = (p_output / 1000) * price_per_1k_output * requests_per_day
    daily_total = daily_input_cost + daily_output_cost
    
    return {
        "p_input_tokens": round(p_input),
        "p_output_tokens": round(p_output),
        "daily_cost_usd": round(daily_total, 2),
        "monthly_cost_usd": round(daily_total * days, 2),
        "input_pct_of_total": round(daily_input_cost / daily_total * 100, 1),
    }

2.3 Seasonality Adjustments for B2B SaaS

B2B SaaS workloads have predictable seasonal patterns that should be encoded in the forecast:

  • Weekly: Monday–Thursday volume is typically 1.4-1.8× Friday volume; minimal weekend traffic
  • Monthly: End-of-month reporting spikes (finance, analytics workloads) can be 2-3× baseline
  • Quarterly: Q4 budget season and Q1 planning cycles drive elevated usage in enterprise tools
  • Annual: December/January dip; August dip in Northern Hemisphere markets

For each workload, multiply the baseline daily forecast by a seasonal index. The index can be derived from 6+ weeks of historical traffic data:

import pandas as pd

def seasonal_index(daily_requests: pd.Series) -> pd.Series:
    """
    Calculate a multiplicative seasonal index from historical daily request data.
    Returns a Series indexed by day-of-week (0=Monday) with the index value.
    
    Usage: multiply your baseline daily forecast by seasonal_index[day_of_week]
    """
    daily_requests.index = pd.to_datetime(daily_requests.index)
    daily_requests = daily_requests.copy()
    daily_requests.name = "requests"
    
    dow = daily_requests.index.dayofweek
    grand_mean = daily_requests.mean()
    dow_mean = daily_requests.groupby(dow).mean()
    return dow_mean / grand_mean

2.4 New Workload Ramp — S-Curve vs. Linear

New workload launches do not ramp linearly. Enterprise adoption follows a logistic (S-curve) pattern: slow initial adoption, rapid middle-phase growth, saturation. Using a linear ramp overestimates near-term cost (leads to conservative early budgets) but, critically, underestimates mid-ramp cost, when most actual overspending occurs.

from scipy.optimize import curve_fit
import numpy as np

def logistic_ramp(t, L, k, t0):
    """Logistic growth model: L = saturation volume, k = growth rate, t0 = midpoint."""
    return L / (1 + np.exp(-k * (t - t0)))

def forecast_new_workload(
    saturation_requests_per_day: float,  # Expected peak adoption
    ramp_weeks: int = 12,               # Weeks to reach ~75% of saturation
    price_per_request: float = 0.01,    # Cost per request at forecast token levels
    forecast_days: int = 90,
) -> np.ndarray:
    """
    Return daily cost forecast for a new workload ramp using logistic growth.
    """
    # Approximate logistic parameters for ramp_weeks
    k = 4.0 / ramp_weeks / 7   # growth rate
    t0 = ramp_weeks * 7 / 2     # midpoint at half the ramp window
    
    t = np.arange(forecast_days)
    daily_requests = logistic_ramp(t, saturation_requests_per_day, k, t0)
    return daily_requests * price_per_request

2.5 Excel Template Structure

For teams that prefer spreadsheet-based forecasting, the equivalent structure is:

Sheet: Workload_Registry
Columns: call_type | model_id | system_prompt_tokens | p50_input | p95_input | p50_output | p95_output | price_input_1k | price_output_1k

Sheet: Volume_Forecast  
Columns: call_type | Jan_requests | Feb_requests | ... | Dec_requests | growth_driver

Sheet: Cost_Roll_Up
Formula per cell: =VLOOKUP(call_type, Workload_Registry, p95_input_col, 0) / 1000 
                  * VLOOKUP(call_type, Workload_Registry, price_input_col, 0)
                  * Volume_Forecast[month_column]
                  + [same for output tokens]

Sheet: Summary_Dashboard
- Total monthly cost by workload
- Rolling 3-month trend
- Variance to budget
- Top 3 cost drivers by workload

3. AWS-Native Forecasting Tools for Bedrock

3.1 AWS Cost Explorer — 18-Month Forecasting

In November 2025, AWS released an updated Cost Explorer forecasting engine with 18-month horizons and explainable AI-powered forecasts. The engine analyzes up to 36 months of historical billing data to identify seasonal patterns and trend inflections.

How it works for Bedrock spend:

  1. Filter Cost Explorer to Service = Amazon Bedrock
  2. Group by Usage Type to see per-model breakdowns (e.g., USE1-Claude-V3-Sonnet-InputTokens)
  3. Apply the forecast tab; Cost Explorer projects forward using the ML model trained on your historical patterns
  4. Use the “Explainability” panel (released Nov 2025) to see which historical periods drove the forecast assumptions

Limitations for AI spend:

  • Cost Explorer forecasts are backward-looking. If your workload is in a ramp phase (new product launch), historical patterns will systematically underestimate future spend
  • Model version changes cause structural breaks in the time series. Cost Explorer’s ML model will average across pre- and post-version-change data, producing a blended forecast that is wrong for both regimes
  • Agentic workload volatility (30× run-to-run variance per Microsoft Research) produces wide confidence intervals that make Cost Explorer forecasts less actionable at the workload level
  • Best use: Stable, mature workloads with 6+ months of consistent traffic. Treat as a sanity check against bottom-up forecasts, not a replacement.

3.2 AWS Budgets — Forecasted Spend Alerts

AWS Budgets has two alert modes:

  • Actual spend alerts: Trigger when cumulative spend in the current period exceeds a threshold. Fires after the fact.
  • Forecasted spend alerts: Trigger when Cost Explorer’s forecast projects you will exceed budget before the period ends. Fires early.

For Bedrock workloads, recommended setup:

Budget type: Cost budget
Scope: Service = Amazon Bedrock (optionally + specific model usage types)
Period: Monthly
Budget amount: [bottom-up forecast × 1.25 contingency buffer]
Alerts:
  - Alert 1: Forecasted > 85% of budget → notify FinOps lead (early warning)
  - Alert 2: Actual > 90% of budget → notify engineering lead (action required)
  - Alert 3: Actual > 100% of budget → notify VP Engineering (escalation)

The forecasted spend alert fires 7-10 days before month-end when Cost Explorer’s model projects a miss. This gives a remediation window: throttle non-critical workloads, switch to a lower-cost model tier for batch jobs, or request a budget amendment.

3.3 Cost Anomaly Detection

AWS Cost Anomaly Detection uses ML to identify spend patterns that deviate from expected. For Bedrock workloads:

  • Set up a monitor scoped to Amazon Bedrock at the account or linked-account level
  • Configure alert thresholds: anomaly impact > $X or > Y% of expected spend
  • Recommended: individual alert per model family (Claude, Nova, Titan) so anomalies are attributable

Anomaly Detection catches the failure modes that static budget alerts miss:

  • Context window creep that gradually inflates spend (shows as a slow-drift anomaly)
  • Runaway agent jobs (shows as a spike anomaly)
  • Accidental production traffic hitting a premium model (shows as a composition-shift anomaly)

When AWS-native tools are sufficient:

  • Single-cloud (AWS-only) AI workloads
  • Stable workloads with 3+ months of history
  • Teams that operate primarily within the AWS console

When you need custom models:

  • Multi-cloud (Bedrock + Azure OpenAI + Google Vertex) — no cross-cloud aggregation in Cost Explorer
  • Active ramp phases with new product launches
  • Agentic workloads with high step-count variance
  • Granular chargeback requirements (per-team, per-feature, per-customer-segment unit economics)

3.4 CloudWatch Metric Math for Token Burn Rate

Bedrock publishes native CloudWatch metrics: InputTokenCount and OutputTokenCount per model. Use metric math to build a real-time token burn rate that projects monthly cost:

# CloudWatch Metric Math expression — paste into a dashboard widget

# Daily token burn at current rate (rolling 24h sum, projected to 30 days)
m1 = SUM(METRICS("AWS/Bedrock", "InputTokenCount", "ModelId", "anthropic.claude-sonnet-4-6-v1:0"), Period=86400)
m2 = SUM(METRICS("AWS/Bedrock", "OutputTokenCount", "ModelId", "anthropic.claude-sonnet-4-6-v1:0"), Period=86400)

# Monthly cost projection at today's burn rate
# Replace 0.003 and 0.015 with your actual per-1k-token prices
monthly_input_cost  = (m1 / 1000) * 0.003 * 30
monthly_output_cost = (m2 / 1000) * 0.015 * 30
monthly_total       = monthly_input_cost + monthly_output_cost

Create a CloudWatch alarm on monthly_total > [budget threshold] to alert before the cost appears in the billing console.


4. Statistical Forecasting Approaches for LLM Spend

4.1 Method Selection Matrix

Workload characteristic Recommended method
Stable, 6+ months history, no ramp ARIMA or Holt-Winters ETS
Trending growth, moderate seasonality Prophet (Meta)
High volatility, agentic workloads Monte Carlo simulation (Section 6)
Multi-cloud, needs standardized input Prophet post-FOCUS normalization
New workload, limited history Logistic ramp model (Section 2.4)

4.2 ARIMA for Stable Workloads

ARIMA (AutoRegressive Integrated Moving Average) is appropriate when your LLM spend series is stationary or can be made stationary via differencing. Best for mature workloads (6+ months of daily data) with no active ramp.

import pandas as pd
import numpy as np
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.tsa.stattools import adfuller
import warnings
warnings.filterwarnings('ignore')

def arima_bedrock_forecast(
    daily_spend: pd.Series,       # Index: date, Values: daily USD spend
    forecast_days: int = 90,
    confidence_level: float = 0.80,  # Use 0.80 for budget setting
) -> pd.DataFrame:
    """
    Fit ARIMA to historical Bedrock spend and return a forecast with confidence intervals.
    
    Budget at the upper CI bound (p80), not the mean.
    """
    # Test for stationarity
    adf_result = adfuller(daily_spend.dropna())
    d = 0 if adf_result[1] < 0.05 else 1  # Difference once if non-stationary
    
    # Fit ARIMA — auto-select p, q via AIC minimization
    best_aic = np.inf
    best_order = (1, d, 1)
    for p in range(0, 4):
        for q in range(0, 4):
            try:
                model = ARIMA(daily_spend, order=(p, d, q))
                result = model.fit()
                if result.aic < best_aic:
                    best_aic = result.aic
                    best_order = (p, d, q)
            except Exception:
                continue
    
    model = ARIMA(daily_spend, order=best_order)
    fitted = model.fit()
    
    forecast_result = fitted.get_forecast(steps=forecast_days)
    forecast_df = forecast_result.summary_frame(alpha=1 - confidence_level)
    
    forecast_df = forecast_df.rename(columns={
        'mean': 'forecast_mean',
        'mean_ci_lower': f'ci_lower_{int(confidence_level*100)}',
        'mean_ci_upper': f'ci_upper_{int(confidence_level*100)}',
    })
    forecast_df['budget_target'] = forecast_df[f'ci_upper_{int(confidence_level*100)}']
    
    return forecast_df[['forecast_mean', f'ci_lower_{int(confidence_level*100)}', 
                         f'ci_upper_{int(confidence_level*100)}', 'budget_target']]

Budget setting with ARIMA: Use the upper bound of the 80% confidence interval as your budget target. This means you budget above the mean forecast — accepting that ~20% of outcomes will exceed your budget — but avoiding the over-budgeting that comes from using p95.

When LLM spend is growing month-over-month (the common case in 2026), ARIMA’s stationarity assumption is violated. Holt-Winters Triple Exponential Smoothing handles level, trend, and seasonality:

from statsmodels.tsa.holtwinters import ExponentialSmoothing

def ets_forecast(
    daily_spend: pd.Series,
    forecast_days: int = 90,
    seasonal_periods: int = 7,  # Weekly seasonality for B2B SaaS
) -> pd.DataFrame:
    """
    Holt-Winters ETS forecast for trending LLM spend with weekly seasonality.
    """
    model = ExponentialSmoothing(
        daily_spend,
        trend='add',
        seasonal='add',
        seasonal_periods=seasonal_periods,
        damped_trend=True,  # Prevents over-optimistic long-range forecasts
    )
    fitted = model.fit(optimized=True)
    
    forecast = fitted.forecast(forecast_days)
    
    # Simulate prediction intervals via bootstrap residuals
    residuals = fitted.resid
    n_bootstrap = 1000
    sims = np.zeros((n_bootstrap, forecast_days))
    for i in range(n_bootstrap):
        noise = np.random.choice(residuals, size=forecast_days, replace=True)
        sims[i] = forecast.values + noise
    
    return pd.DataFrame({
        'forecast_mean': forecast.values,
        'ci_lower_80': np.percentile(sims, 10, axis=0),
        'ci_upper_80': np.percentile(sims, 90, axis=0),
        'budget_target': np.percentile(sims, 80, axis=0),
    }, index=forecast.index)

4.4 Prophet for Seasonality + Trend + Change Points

Meta’s Prophet library is well-suited for LLM spend forecasting because it explicitly handles:

  • Multiple seasonality layers (weekly + monthly + annual)
  • Trend change points (model version upgrades, new workload launches)
  • Missing data and outliers (model retries, incident-driven spikes)
from prophet import Prophet
import pandas as pd

def prophet_bedrock_forecast(
    daily_spend: pd.Series,        # Index: date, Values: daily USD spend
    forecast_days: int = 90,
    known_changepoints: list = None,  # List of date strings for model version upgrades
    holidays_df: pd.DataFrame = None, # Optional: company blackout dates / quarters
) -> pd.DataFrame:
    """
    Prophet forecast for Bedrock spend with known change-point injection.
    
    Known change points: dates when model versions changed, major feature launches,
    or pricing tier changes. Injecting these prevents Prophet from misinterpreting
    structural breaks as anomalies.
    """
    df = daily_spend.reset_index()
    df.columns = ['ds', 'y']
    df['ds'] = pd.to_datetime(df['ds'])
    
    model = Prophet(
        changepoints=known_changepoints or [],
        changepoint_prior_scale=0.05,    # Conservative: don't overfit to noise
        seasonality_mode='multiplicative', # Better for growing spend series
        weekly_seasonality=True,
        yearly_seasonality=True,
        daily_seasonality=False,
        holidays=holidays_df,
        interval_width=0.80,             # 80% CI for budget setting
    )
    
    # Add monthly seasonality for B2B end-of-month spikes
    model.add_seasonality(name='monthly', period=30.5, fourier_order=5)
    
    model.fit(df)
    
    future = model.make_future_dataframe(periods=forecast_days)
    forecast = model.predict(future)
    
    result = forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail(forecast_days)
    result = result.rename(columns={
        'yhat': 'forecast_mean',
        'yhat_lower': 'ci_lower_80',
        'yhat_upper': 'ci_upper_80',
    })
    result['budget_target'] = result['ci_upper_80']
    
    return result.set_index('ds')

Prophet’s key advantage for AI workloads: Change-point injection. When you upgrade from Claude Sonnet 3.5 to Sonnet 4.6 on March 15, tell Prophet. It will segment the time series and learn separate trend parameters for pre- and post-upgrade periods. Without this, the model averages across the structural break and produces a forecast that is wrong for the current pricing regime.

4.5 Handling Step-Function Changes

New workload launches appear as step functions in the spend series. ARIMA and ETS both struggle with step functions. Two approaches:

  1. Regime segmentation: Fit separate models to pre- and post-launch data. Use the post-launch model for forecasting. Requires at least 30 days of post-launch data.

  2. Logistic ramp (Section 2.4) for the new component + existing model for the baseline: Forecast the existing workload with its established model, add the logistic ramp forecast for the new workload. This is the most accurate approach during an active launch.


5. Budget Construction Patterns

5.1 Top-Down vs. Bottom-Up

Approach Method Use when
Top-down Allocate % of IT budget to AI Early-stage AI programs; limited workload visibility
Bottom-up Sum all workload forecasts + contingency 3+ months of production AI; multiple workloads
Hybrid Bottom-up for known workloads + top-down reserve for unknown Standard for 2026 enterprise programs

Top-down starting point for 2026: The FinOps Foundation’s State of FinOps 2026 report indicates enterprises are allocating 15-25% of cloud spend to AI workloads, up from single digits in 2024. For IT budget allocation, 8-15% of total IT budget for AI infrastructure is a reasonable starting anchor for a mid-maturity enterprise program.

The hybrid approach is recommended for most enterprises in 2026: Use bottom-up forecasting for all identified workloads (Sections 2 and 4), then add a top-down reserve for unidentified workloads and new launches. Set the reserve at 25-35% of the bottom-up sum.

5.2 Contingency Buffers — AI vs. Traditional IT

Traditional IT infrastructure contingency: 10-15% above the forecast.

AI workloads require 20-30% contingency. The structural reasons are the five failure modes in Section 1. Specific buffer guidance:

Workload type Recommended buffer Rationale
Stable chatbot / RAG, 6+ months history 20% Context creep + model version risk
Active product development, feature launches 30% New workloads, context window expansion
Agentic workloads 40-50% Unbounded step counts, stochastic behavior
Experimental / R&D Separate experimental budget Do not pool with production forecasts

Keep experimental and R&D spend in a separate budget line. These workloads have high variance by design and will pollute the variance analysis for production workloads if pooled.

5.3 Rolling 90-Day Reforecast Cadence

Annual budgets for AI workloads are wrong by construction. The model version upgrade cycle, new workload launches, and price cut dynamics (AWS and Anthropic have cut prices 2-3× per year) make annual forecasts stale within 90 days.

Recommended cadence:

Review Frequency Scope Owner
Token burn rate check Weekly CloudWatch dashboard review Platform engineer
Workload cost variance Monthly Actual vs. forecast by workload FinOps lead
Forecast rebase Quarterly Rerun statistical models on fresh data FinOps lead + engineering
Budget amendment As needed, triggered by anomaly Formal reforecast + CFO briefing FinOps lead + Finance

The quarterly reforecast is the critical mechanism. At each reforecast:

  1. Pull the last 90 days of actual spend by workload from Cost Explorer (or FOCUS-normalized export)
  2. Refit the statistical model (Section 4) on the extended historical window
  3. Inject any known future change points (planned model upgrades, new feature launches)
  4. Compare new forecast to remaining budget; flag variances > 15% for budget amendment review

5.4 How to Present AI Budget to CFO

Never present AI budget as cost per token. CFOs do not have a mental model for what a token is. Presenting in token units creates a credibility gap and makes budget requests harder to defend.

Present instead as:

  1. Cost per business outcome: Cost to process one support ticket, cost to generate one contract draft, cost to analyze one earnings call. This connects AI spend to the business capability it funds.

  2. Cost per unit of productivity: If the AI workload automates analyst work, present the unit economics: “$0.23 per analyst-hour equivalent delivered” against a $45-85/hour loaded analyst cost. The ROI is self-evident.

  3. Variance budget, not forecast budget: Rather than defending a point estimate, present: “Our forecast is $X ± 25%. We are requesting $X × 1.25 as the budget with a $X × 0.25 contingency reserve that returns to IT budget if unused.” This frames the AI cost structure honestly and gives the CFO a recoverable scenario.

  4. Trend narrative: AI infrastructure unit costs are declining 30-50% per year as providers cut prices. Include a “cost improvement roadmap” showing how optimization initiatives (model routing, caching, prompt compression) will improve the cost-per-outcome metric over the budget period. This converts a budget ask into an investment narrative.

5.5 Budget Variance Analysis Workflow

When actual spend deviates from forecast:

1. Classify the variance
   - Volume variance: more requests than forecast → pricing unchanged
   - Mix variance: more expensive model / higher token workloads than forecast
   - Rate variance: model pricing changed (version upgrade)
   - New workload variance: unforecasted workload launched

2. Quantify each component
   Volume variance = (actual_requests - forecast_requests) × forecast_cost_per_request
   Mix variance    = actual_requests × (actual_cost_per_request - forecast_cost_per_request)
   Rate variance   = actual_requests × (new_price - old_price) per token × actual_tokens
   New workload    = residual (actual - volume - mix - rate)

3. Assign accountability
   Volume variance → product/business team (demand driver)
   Mix variance    → engineering (model selection, prompt size)
   Rate variance   → FinOps / procurement (vendor contract, version pinning)
   New workload    → team that launched without cost review

4. Update forecast
   Rebase the forecast using current actuals as the new baseline
   Inject the variance root cause as a known change point

6. Scenario Planning for AI Spend

6.1 Three-Scenario Model

Build every AI cost projection with three scenarios. Single-point forecasts create false precision and make budget conversations adversarial when actuals miss.

Scenario Definition Typical probability Use
Base Current trajectory + planned launches + seasonality 50-60% Primary budget request
Bear Rapid agentic adoption + model price stability + no optimization 20-25% Contingency reserve sizing
Bull Price cuts materialize early + optimization initiatives hit targets 20-25% Return-to-budget planning

6.2 Modeling Rapid Agentic Adoption (Bear Case Driver)

If your product roadmap includes agentic features launching in the forecast period, model the token amplification explicitly:

Current workload: 10,000 requests/day at 2,000 tokens/request = 20M tokens/day
Agentic conversion: 30% of requests converted to agentic (5-step average)
Agentic token budget: 2,000 tokens × 5 steps × 3× context accumulation = 30,000 tokens/request

Agentic cost impact:
  Non-agentic requests: 7,000/day × 2,000 tokens = 14M tokens/day (unchanged)
  Agentic requests:     3,000/day × 30,000 tokens = 90M tokens/day (+76M tokens/day)
  Total:                104M tokens/day vs. 20M baseline → 5.2× cost increase

Bear case sensitivity: If agentic step count is 10 (not 5) or context accumulation is 5× (not 3×), 
the multiplier climbs to 15-25× baseline cost.

This calculation should be run before any agentic feature is approved for production. The step-count distribution, not the mean, drives the budget. Cap maximum steps at the 95th percentile of your test runs; implement a hard circuit breaker at 2× that value.

6.3 Modeling Model Price Cuts (Bull Case Driver)

AWS Bedrock and Anthropic have reduced model pricing 2-3× per year since 2023. Claude Haiku 3 was 4× cheaper than Haiku 3.5 for equivalent capability. Nova Micro undercuts Haiku on many workloads.

Model the bull case by assuming a 30-50% price reduction for the primary model over a 12-month forecast period. This is consistent with the historical pace of price cuts:

Base case:  $50,000/month at current pricing, no model change
Bull case:  $50,000/month → model upgrade to next-gen tier at 40% lower price
            Effective cost after 6-month full migration: $30,000/month
            12-month bull case total: ($50K × 6) + ($30K × 6) = $480K vs. $600K base
            Saving: $120K (20% of annual budget)

Build this into the CFO presentation as the “cost improvement roadmap” — it converts the AI budget from a cost center into a managed investment.

6.4 Modeling Cost Optimization Initiatives (Bull Case Operator)

Specific optimization initiatives with documented 30-50% cost reduction potential:

Initiative Typical saving Effort Timeline
Prompt caching (Bedrock / Anthropic) 50-90% reduction on repeated context Low 1-2 sprints
Model routing (cheap model for simple tasks) 30-60% reduction on mixed workloads Medium 4-8 weeks
Prompt compression / chunking optimization 15-30% input token reduction Medium 4-8 weeks
Output length guardrails 10-25% output token reduction Low 1-2 sprints
Request batching for async workloads 20-40% via Bedrock Batch API pricing Medium 4-8 weeks
Context window pruning for multi-turn 20-35% reduction in long-conversation workloads High 8-16 weeks

6.5 Monte Carlo Simulation for Budget Risk Quantification

For board-level budget presentations, replace confidence intervals with a probability distribution over annual cost outcomes. Monte Carlo simulation makes the tail risk visible.

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

def monte_carlo_ai_budget(
    base_monthly_cost: float,
    monthly_growth_rate_mean: float = 0.08,   # 8% MoM base growth
    monthly_growth_rate_std: float = 0.04,    # Uncertainty in growth rate
    price_change_mean: float = -0.03,         # -3%/month expected price decline
    price_change_std: float = 0.05,           # Uncertainty in price changes
    new_workload_monthly_prob: float = 0.20,  # 20% chance of new workload per month
    new_workload_cost_mean: float = 5000,     # Mean cost of new workload
    new_workload_cost_std: float = 3000,      # Std dev of new workload cost
    n_simulations: int = 10000,
    months: int = 12,
) -> dict:
    """
    Monte Carlo simulation of annual AI infrastructure cost.
    
    Returns percentile distribution for budget risk analysis.
    Use P50 as base budget, P80 for contingency sizing, P95 for stress test.
    """
    annual_costs = np.zeros(n_simulations)
    
    for sim in range(n_simulations):
        monthly_cost = base_monthly_cost
        annual_total = 0
        
        for month in range(months):
            # Apply stochastic growth rate
            growth = np.random.normal(monthly_growth_rate_mean, monthly_growth_rate_std)
            monthly_cost *= (1 + max(growth, -0.5))  # Floor at -50% MoM
            
            # Apply stochastic price changes (independent of volume)
            price_change = np.random.normal(price_change_mean, price_change_std)
            monthly_cost *= (1 + price_change)
            
            # New workload launch events (Poisson process)
            if np.random.random() < new_workload_monthly_prob:
                new_workload = max(0, np.random.normal(new_workload_cost_mean, new_workload_cost_std))
                monthly_cost += new_workload
            
            annual_total += max(monthly_cost, 0)
        
        annual_costs[sim] = annual_total
    
    return {
        'p10': np.percentile(annual_costs, 10),
        'p25': np.percentile(annual_costs, 25),
        'p50': np.percentile(annual_costs, 50),   # Base budget
        'p75': np.percentile(annual_costs, 75),
        'p80': np.percentile(annual_costs, 80),   # Contingency line
        'p90': np.percentile(annual_costs, 90),
        'p95': np.percentile(annual_costs, 95),   # Stress test / board risk disclosure
        'mean': np.mean(annual_costs),
        'std': np.std(annual_costs),
        'coefficient_of_variation': np.std(annual_costs) / np.mean(annual_costs),
    }

# Example output interpretation:
# p50 = $1.2M  → Request $1.2M as base AI infrastructure budget
# p80 = $1.6M  → Request $400K contingency reserve (access if actuals trend toward p80)
# p95 = $2.1M  → Board stress test: "In a bear scenario, exposure is $2.1M"

Key output metrics to present:

  • P50 = Base case budget ask
  • P80 − P50 = Contingency reserve request (access with FinOps lead approval)
  • P95 = Board-level stress test disclosure

The coefficient of variation (std / mean) measures forecast uncertainty. For mature AI workloads, aim for CV < 0.3. Agentic workloads commonly have CV > 0.5, which is the quantitative case for larger contingency buffers.


7. Forecasting Integration with FinOps Tooling

7.1 FOCUS 1.3 / 1.4 — The Foundation for Cross-Cloud Forecast Accuracy

The FinOps Open Cost & Usage Specification (FOCUS) standardizes billing data columns across AWS, Azure, GCP, and SaaS providers. For AI cost forecasting, FOCUS is important because:

  1. Cross-cloud aggregation: Enterprises running Bedrock (AWS) + Azure OpenAI + Google Vertex previously needed separate ETL pipelines per provider. FOCUS normalizes ServiceName, SkuId, UsageUnit, and BilledCost into a common schema. One forecasting model can train on multi-cloud AI spend without provider-specific mapping tables.

  2. Consistent usage units: Different providers denominate AI usage differently (tokens vs. characters vs. request-units). FOCUS 1.3 introduced ConsumedUnit normalization for AI/ML services, enabling token-based cost allocation across providers.

  3. Forecast model stability: Because FOCUS eliminates the per-provider ETL layer, structural breaks caused by provider billing format changes no longer corrupt the historical time series fed into ARIMA/Prophet models.

Practical adoption: AWS Cost and Usage Report can be exported in FOCUS format (enabled in CUR v2 settings). Azure Cost Management supports FOCUS export as of 2025. Ingest both into S3 or Azure Data Lake; query with Athena or Synapse using a single schema.

7.2 Apptio Cloudability (IBM) — Enterprise Forecast Module

Apptio Cloudability (now owned by IBM following the Apptio acquisition) provides multi-year AI cost forecasting with IT Financial Management integration. Key capabilities for AI workloads:

  • Showback/chargeback to business units: Allocate Bedrock costs to products or teams via tagging rules; generate internal invoices that drive accountability
  • Forecast scenarios: Model version upgrade scenarios and new workload launches within the Cloudability UI without custom code
  • Integration with IBM Cognos: For enterprises running Cognos for financial reporting, Cloudability forecasts flow directly into the FP&A model

Limitation: Cloudability’s AI forecasting module is built for trend extrapolation, not for structural-break handling. Model version upgrades still require manual intervention to prevent the blended-forecast problem (Section 3.1).

7.3 Vantage — AI-Native Cost Forecasting

Vantage positions itself as AI-native FinOps, with purpose-built support for Bedrock, OpenAI, and Anthropic direct API billing:

  • Per-model forecast views: Forecast cost by Bedrock model ID, not just by service — critical for multi-model environments
  • Unit cost tracking: Cost per LLM request, cost per token by model version; tracks unit cost trends over time to quantify optimization impact
  • Anomaly detection integration: Forecasts auto-update when anomalies are detected and resolved, preventing anomalies from corrupting the baseline

Best for: Teams managing 3+ LLM providers with a need for per-model visibility without building custom dashboards.

7.4 CloudZero — AI Unit Economics for Forecast Accuracy

CloudZero’s cost intelligence platform applies unit economics to AI infrastructure: cost per inference, cost per model version, cost per AI feature, and cost per customer segment.

The unit economics approach improves forecast accuracy because it separates two independent variables that aggregate billing conflates:

  • Usage growth (more requests per day)
  • Cost efficiency change (cost per request trending up or down)

If you forecast in aggregate dollar terms, a period where usage doubled but cost per request halved looks flat — and your growth model learns the wrong signal. CloudZero’s cost-per-unit metrics allow the forecasting model to see usage growth and efficiency change as separate trends.

Forecast accuracy improvement: CloudZero reports that teams using unit economics for AI cost forecasting reduce forecast variance by 30-40% compared to aggregate spend forecasting, by decoupling volume growth from unit cost changes.

7.5 AWS CUDOS Forecast Views

AWS’s Cloud Intelligence Dashboards (CUDOS) are free QuickSight dashboards that provide forecast views built on Cost Explorer’s ML models. For Bedrock specifically:

  • The AI/ML Spend Dashboard (available via the AWS Well-Architected FinOps lens deployment) shows Bedrock spend by model family, with Cost Explorer forecast overlaid
  • Token utilization metrics show input/output token ratios and average tokens per request — the primary inputs for bottom-up forecasting
  • Reserved capacity vs. on-demand analysis for Bedrock Provisioned Throughput planning

CUDOS is the right starting point for teams that don’t yet have a dedicated FinOps tool. It provides 80% of the visibility needed for basic AI cost forecasting with zero additional licensing cost.


8. Implementation Roadmap

Phase 1 — Instrument and Establish Baseline (Weeks 1-4)

  1. Tag every Bedrock API call with workload-type, team, environment, and model-version tags. Without tagging, workload-level forecasting is impossible.
  2. Deploy CloudWatch metrics for InputTokenCount and OutputTokenCount per model. Build the burn-rate dashboard from Section 3.4.
  3. Enable Cost Anomaly Detection for Bedrock. Set initial thresholds at 25% above current daily average.
  4. Export 90+ days of historical billing to S3 in FOCUS format (CUR v2).
  5. Document all LLM call types per the workload registry template in Section 2.1.

Phase 2 — Bottom-Up Forecast (Weeks 5-8)

  1. Instrument production services to log token counts per call type. Pull 30+ days of samples.
  2. Build the workload registry in Excel or Python (Section 2.5).
  3. Generate the first bottom-up forecast for the next 90 days.
  4. Compare to AWS Cost Explorer forecast — identify gaps (new workloads, context creep).
  5. Set AWS Budgets alerts at bottom-up forecast × 1.25.

Phase 3 — Statistical Model and Scenario Planning (Weeks 9-12)

  1. Fit Prophet or ETS model to historical spend series (Section 4).
  2. Run the Monte Carlo simulation to size contingency reserve (Section 6.5).
  3. Build the three-scenario model (Section 6.1).
  4. Draft the CFO budget presentation using cost-per-outcome framing (Section 5.4).
  5. Establish the quarterly reforecast process (Section 5.3).

Phase 4 — FinOps Tooling Integration (Months 4-6)

  1. Evaluate Vantage or CloudZero for per-model unit economics if managing 3+ providers.
  2. Implement FOCUS-normalized exports for cross-cloud aggregation.
  3. Establish shift-left costing gate: no new LLM feature ships without a cost estimate reviewed by FinOps.
  4. Build the budget variance analysis workflow into the monthly finance review.

Key Numbers to Cite

Statistic Source
80% of enterprises miss AI cost forecasts by >25% Mavvrik 2025 State of AI Cost Governance, n=372
Only 15% forecast within ±10% Mavvrik 2025
84% report significant gross margin erosion from AI infrastructure Mavvrik 2025
73% report AI costs exceeded original projections FinOps Foundation State of FinOps 2026
41% of enterprises waste >15% of AI spend FinOps Foundation State of FinOps 2026
Agentic tasks consume 1,000× more tokens than code chat Microsoft Research arXiv:2604.22750, 2026
Same agentic problem: one run costs 30× more than another Microsoft Research arXiv:2604.22750, 2026
RAG architectures inflate context windows 3-5× FinOps Foundation AI forecasting working group
Agentic AI models require 5-30× more tokens per task than standard chatbots FinOps Foundation State of FinOps 2026
Token caching reduces input costs ~90%, latency ~75% Microsoft Research arXiv:2604.22750, 2026
AWS price range: $0.035 (Nova Micro) to $75.00 (Claude Opus) per 1M output tokens AWS Bedrock pricing, June 2026
Poorly optimized LLM deployments inflate costs 30-70% Techment 2026 enterprise deployment analysis

Sources