You are accountable for a line item you cannot break down
Finance asks why the AI bill moved. The honest answer, with a provider dashboard, is that you do not know — the invoice has one line on it. You can guess from what shipped that month, but you cannot attribute, and you cannot promise it will not move again next month, because there is nothing in the path that would stop it.
What a provider dashboard leaves you with
01
One number, no breakdown, and a variance you cannot explain to the person who has to forecast it.
02
No ceiling: nothing in the system prevents next month being three times this month.
03
No per-team allocation, so the cost sits on your budget regardless of who spent it.
What Capsera does about it
- A breakdown that survives the question
- Spend per agent, per run, per team and per end customer, so the variance has a cause attached to it.
- A ceiling you can commit to
- Hard limits enforced before the provider call. The forecast holds because exceeding it is refused, not reported.
- Burn-rate forecasting
- A projected exhaustion date, so the conversation happens before the overspend rather than after it.
The number this is judged on
Forecast accuracy, and variance you can explain
None of this is assumed. We scanned 133 public agent repositories and found a cost defect in most of the ones making live model calls.
Read the method and limitationsimport capserafrom anthropic import Anthropiccapsera.init(agent="reasoning_agent",run_id=ctx.run_id,)# checked before the callcapsera.budget(monthly=500,on_exceed="block",)with capsera.agent("summarizer"):client = Anthropic()resp = client.messages.create(model="claude-sonnet-4-6",max_tokens=1024,)# no proxy, no gatewayassert resp.usage.cost < 0.02if capsera.over_budget():raise BudgetExceeded()@capsera.track()def extract(doc):return chain(doc)# cheaper route, same outputcapsera.route(prefer="cost")
on_exceed="block",)with capsera.agent("summarizer"):client = Anthropic()resp = client.messages.create(model="claude-sonnet-4-6",max_tokens=1024,)# no proxy, no gatewayassert resp.usage.cost < 0.02if capsera.over_budget():raise BudgetExceeded()@capsera.track()def extract(doc):return chain(doc)# cheaper route, same outputcapsera.route(prefer="cost")spend = capsera.usage(group_by="agent",window="30d",)for a, cost in spend:print(a, f"${cost:.2f}")# fails open, alwayscapsera.flush()
assert resp.usage.cost < 0.02if capsera.over_budget():raise BudgetExceeded()@capsera.track()def extract(doc):return chain(doc)# cheaper route, same outputcapsera.route(prefer="cost")spend = capsera.usage(group_by="agent",window="30d",)for a, cost in spend:print(a, f"${cost:.2f}")# fails open, alwayscapsera.flush()for task in queue:run(task)log("run complete")import capserafrom anthropic import Anthropiccapsera.init(agent="reasoning_agent",run_id=ctx.run_id,)
spend = capsera.usage(group_by="agent",window="30d",)for a, cost in spend:print(a, f"${cost:.2f}")# fails open, alwayscapsera.flush()for task in queue:run(task)log("run complete")import capserafrom anthropic import Anthropiccapsera.init(agent="reasoning_agent",run_id=ctx.run_id,)# checked before the callcapsera.budget(monthly=500,on_exceed="block",)with capsera.agent("summarizer"):client = Anthropic()resp = client.messages.create(model="claude-sonnet-4-6",
for task in queue:run(task)log("run complete")import capserafrom anthropic import Anthropiccapsera.init(agent="reasoning_agent",run_id=ctx.run_id,)# checked before the callcapsera.budget(monthly=500,on_exceed="block",)with capsera.agent("summarizer"):client = Anthropic()resp = client.messages.create(model="claude-sonnet-4-6",max_tokens=1024,)# no proxy, no gatewayassert resp.usage.cost < 0.02if capsera.over_budget():raise BudgetExceeded()@capsera.track()def extract(doc):
)# checked before the callcapsera.budget(monthly=500,on_exceed="block",)with capsera.agent("summarizer"):client = Anthropic()resp = client.messages.create(model="claude-sonnet-4-6",max_tokens=1024,)# no proxy, no gatewayassert resp.usage.cost < 0.02if capsera.over_budget():raise BudgetExceeded()@capsera.track()def extract(doc):return chain(doc)# cheaper route, same outputcapsera.route(prefer="cost")spend = capsera.usage(group_by="agent",window="30d",)for a, cost in spend:
model="claude-sonnet-4-6",max_tokens=1024,)# no proxy, no gatewayassert resp.usage.cost < 0.02if capsera.over_budget():raise BudgetExceeded()@capsera.track()def extract(doc):return chain(doc)# cheaper route, same outputcapsera.route(prefer="cost")spend = capsera.usage(group_by="agent",window="30d",)for a, cost in spend:print(a, f"${cost:.2f}")# fails open, alwayscapsera.flush()for task in queue:run(task)log("run complete")import capserafrom anthropic import Anthropic
def extract(doc):return chain(doc)# cheaper route, same outputcapsera.route(prefer="cost")spend = capsera.usage(group_by="agent",window="30d",)for a, cost in spend:print(a, f"${cost:.2f}")# fails open, alwayscapsera.flush()for task in queue:run(task)log("run complete")import capserafrom anthropic import Anthropiccapsera.init(agent="reasoning_agent",run_id=ctx.run_id,)# checked before the callcapsera.budget(monthly=500,on_exceed="block",)
for a, cost in spend:print(a, f"${cost:.2f}")# fails open, alwayscapsera.flush()for task in queue:run(task)log("run complete")import capserafrom anthropic import Anthropiccapsera.init(agent="reasoning_agent",run_id=ctx.run_id,)# checked before the callcapsera.budget(monthly=500,on_exceed="block",)with capsera.agent("summarizer"):client = Anthropic()resp = client.messages.create(model="claude-sonnet-4-6",max_tokens=1024,)# no proxy, no gatewayassert resp.usage.cost < 0.02
from anthropic import Anthropiccapsera.init(agent="reasoning_agent",run_id=ctx.run_id,)# checked before the callcapsera.budget(monthly=500,on_exceed="block",)with capsera.agent("summarizer"):client = Anthropic()resp = client.messages.create(model="claude-sonnet-4-6",max_tokens=1024,)# no proxy, no gatewayassert resp.usage.cost < 0.02if capsera.over_budget():raise BudgetExceeded()@capsera.track()def extract(doc):return chain(doc)# cheaper route, same outputcapsera.route(prefer="cost")spend = capsera.usage(
)with capsera.agent("summarizer"):client = Anthropic()resp = client.messages.create(model="claude-sonnet-4-6",max_tokens=1024,)# no proxy, no gatewayassert resp.usage.cost < 0.02if capsera.over_budget():raise BudgetExceeded()@capsera.track()def extract(doc):return chain(doc)# cheaper route, same outputcapsera.route(prefer="cost")spend = capsera.usage(group_by="agent",window="30d",)for a, cost in spend:print(a, f"${cost:.2f}")# fails open, alwayscapsera.flush()for task in queue:
if capsera.over_budget():raise BudgetExceeded()@capsera.track()def extract(doc):return chain(doc)# cheaper route, same outputcapsera.route(prefer="cost")spend = capsera.usage(group_by="agent",window="30d",)for a, cost in spend:print(a, f"${cost:.2f}")# fails open, alwayscapsera.flush()for task in queue:run(task)log("run complete")import capserafrom anthropic import Anthropiccapsera.init(agent="reasoning_agent",run_id=ctx.run_id,)
import capserafrom anthropic import Anthropiccapsera.init(agent="reasoning_agent",run_id=ctx.run_id,)# checked before the callcapsera.budget(monthly=500,on_exceed="block",)with capsera.agent("summarizer"):client = Anthropic()resp = client.messages.create(model="claude-sonnet-4-6",max_tokens=1024,)# no proxy, no gatewayassert resp.usage.cost < 0.02if capsera.over_budget():raise BudgetExceeded()@capsera.track()def extract(doc):return chain(doc)# cheaper route, same outputcapsera.route(prefer="cost")
on_exceed="block",)with capsera.agent("summarizer"):client = Anthropic()resp = client.messages.create(model="claude-sonnet-4-6",max_tokens=1024,)# no proxy, no gatewayassert resp.usage.cost < 0.02if capsera.over_budget():raise BudgetExceeded()@capsera.track()def extract(doc):return chain(doc)# cheaper route, same outputcapsera.route(prefer="cost")spend = capsera.usage(group_by="agent",window="30d",)for a, cost in spend:print(a, f"${cost:.2f}")# fails open, alwayscapsera.flush()
assert resp.usage.cost < 0.02if capsera.over_budget():raise BudgetExceeded()@capsera.track()def extract(doc):return chain(doc)# cheaper route, same outputcapsera.route(prefer="cost")spend = capsera.usage(group_by="agent",window="30d",)for a, cost in spend:print(a, f"${cost:.2f}")# fails open, alwayscapsera.flush()for task in queue:run(task)log("run complete")import capserafrom anthropic import Anthropiccapsera.init(agent="reasoning_agent",run_id=ctx.run_id,)
spend = capsera.usage(group_by="agent",window="30d",)for a, cost in spend:print(a, f"${cost:.2f}")# fails open, alwayscapsera.flush()for task in queue:run(task)log("run complete")import capserafrom anthropic import Anthropiccapsera.init(agent="reasoning_agent",run_id=ctx.run_id,)# checked before the callcapsera.budget(monthly=500,on_exceed="block",)with capsera.agent("summarizer"):client = Anthropic()resp = client.messages.create(model="claude-sonnet-4-6",
for task in queue:run(task)log("run complete")import capserafrom anthropic import Anthropiccapsera.init(agent="reasoning_agent",run_id=ctx.run_id,)# checked before the callcapsera.budget(monthly=500,on_exceed="block",)with capsera.agent("summarizer"):client = Anthropic()resp = client.messages.create(model="claude-sonnet-4-6",max_tokens=1024,)# no proxy, no gatewayassert resp.usage.cost < 0.02if capsera.over_budget():raise BudgetExceeded()@capsera.track()def extract(doc):
)# checked before the callcapsera.budget(monthly=500,on_exceed="block",)with capsera.agent("summarizer"):client = Anthropic()resp = client.messages.create(model="claude-sonnet-4-6",max_tokens=1024,)# no proxy, no gatewayassert resp.usage.cost < 0.02if capsera.over_budget():raise BudgetExceeded()@capsera.track()def extract(doc):return chain(doc)# cheaper route, same outputcapsera.route(prefer="cost")spend = capsera.usage(group_by="agent",window="30d",)for a, cost in spend:
model="claude-sonnet-4-6",max_tokens=1024,)# no proxy, no gatewayassert resp.usage.cost < 0.02if capsera.over_budget():raise BudgetExceeded()@capsera.track()def extract(doc):return chain(doc)# cheaper route, same outputcapsera.route(prefer="cost")spend = capsera.usage(group_by="agent",window="30d",)for a, cost in spend:print(a, f"${cost:.2f}")# fails open, alwayscapsera.flush()for task in queue:run(task)log("run complete")import capserafrom anthropic import Anthropic
def extract(doc):return chain(doc)# cheaper route, same outputcapsera.route(prefer="cost")spend = capsera.usage(group_by="agent",window="30d",)for a, cost in spend:print(a, f"${cost:.2f}")# fails open, alwayscapsera.flush()for task in queue:run(task)log("run complete")import capserafrom anthropic import Anthropiccapsera.init(agent="reasoning_agent",run_id=ctx.run_id,)# checked before the callcapsera.budget(monthly=500,on_exceed="block",)
for a, cost in spend:print(a, f"${cost:.2f}")# fails open, alwayscapsera.flush()for task in queue:run(task)log("run complete")import capserafrom anthropic import Anthropiccapsera.init(agent="reasoning_agent",run_id=ctx.run_id,)# checked before the callcapsera.budget(monthly=500,on_exceed="block",)with capsera.agent("summarizer"):client = Anthropic()resp = client.messages.create(model="claude-sonnet-4-6",max_tokens=1024,)# no proxy, no gatewayassert resp.usage.cost < 0.02
from anthropic import Anthropiccapsera.init(agent="reasoning_agent",run_id=ctx.run_id,)# checked before the callcapsera.budget(monthly=500,on_exceed="block",)with capsera.agent("summarizer"):client = Anthropic()resp = client.messages.create(model="claude-sonnet-4-6",max_tokens=1024,)# no proxy, no gatewayassert resp.usage.cost < 0.02if capsera.over_budget():raise BudgetExceeded()@capsera.track()def extract(doc):return chain(doc)# cheaper route, same outputcapsera.route(prefer="cost")spend = capsera.usage(
)with capsera.agent("summarizer"):client = Anthropic()resp = client.messages.create(model="claude-sonnet-4-6",max_tokens=1024,)# no proxy, no gatewayassert resp.usage.cost < 0.02if capsera.over_budget():raise BudgetExceeded()@capsera.track()def extract(doc):return chain(doc)# cheaper route, same outputcapsera.route(prefer="cost")spend = capsera.usage(group_by="agent",window="30d",)for a, cost in spend:print(a, f"${cost:.2f}")# fails open, alwayscapsera.flush()for task in queue:
if capsera.over_budget():raise BudgetExceeded()@capsera.track()def extract(doc):return chain(doc)# cheaper route, same outputcapsera.route(prefer="cost")spend = capsera.usage(group_by="agent",window="30d",)for a, cost in spend:print(a, f"${cost:.2f}")# fails open, alwayscapsera.flush()for task in queue:run(task)log("run complete")import capserafrom anthropic import Anthropiccapsera.init(agent="reasoning_agent",run_id=ctx.run_id,)
import capserafrom anthropic import Anthropiccapsera.init(agent="reasoning_agent",run_id=ctx.run_id,)# checked before the callcapsera.budget(monthly=500,on_exceed="block",)with capsera.agent("summarizer"):client = Anthropic()resp = client.messages.create(model="claude-sonnet-4-6",max_tokens=1024,)# no proxy, no gatewayassert resp.usage.cost < 0.02if capsera.over_budget():raise BudgetExceeded()@capsera.track()def extract(doc):return chain(doc)# cheaper route, same outputcapsera.route(prefer="cost")
on_exceed="block",)with capsera.agent("summarizer"):client = Anthropic()resp = client.messages.create(model="claude-sonnet-4-6",max_tokens=1024,)# no proxy, no gatewayassert resp.usage.cost < 0.02if capsera.over_budget():raise BudgetExceeded()@capsera.track()def extract(doc):return chain(doc)# cheaper route, same outputcapsera.route(prefer="cost")spend = capsera.usage(group_by="agent",window="30d",)for a, cost in spend:print(a, f"${cost:.2f}")# fails open, alwayscapsera.flush()
assert resp.usage.cost < 0.02if capsera.over_budget():raise BudgetExceeded()@capsera.track()def extract(doc):return chain(doc)# cheaper route, same outputcapsera.route(prefer="cost")spend = capsera.usage(group_by="agent",window="30d",)for a, cost in spend:print(a, f"${cost:.2f}")# fails open, alwayscapsera.flush()for task in queue:run(task)log("run complete")import capserafrom anthropic import Anthropiccapsera.init(agent="reasoning_agent",run_id=ctx.run_id,)
spend = capsera.usage(group_by="agent",window="30d",)for a, cost in spend:print(a, f"${cost:.2f}")# fails open, alwayscapsera.flush()for task in queue:run(task)log("run complete")import capserafrom anthropic import Anthropiccapsera.init(agent="reasoning_agent",run_id=ctx.run_id,)# checked before the callcapsera.budget(monthly=500,on_exceed="block",)with capsera.agent("summarizer"):client = Anthropic()resp = client.messages.create(model="claude-sonnet-4-6",
for task in queue:run(task)log("run complete")import capserafrom anthropic import Anthropiccapsera.init(agent="reasoning_agent",run_id=ctx.run_id,)# checked before the callcapsera.budget(monthly=500,on_exceed="block",)with capsera.agent("summarizer"):client = Anthropic()resp = client.messages.create(model="claude-sonnet-4-6",max_tokens=1024,)# no proxy, no gatewayassert resp.usage.cost < 0.02if capsera.over_budget():raise BudgetExceeded()@capsera.track()def extract(doc):
)# checked before the callcapsera.budget(monthly=500,on_exceed="block",)with capsera.agent("summarizer"):client = Anthropic()resp = client.messages.create(model="claude-sonnet-4-6",max_tokens=1024,)# no proxy, no gatewayassert resp.usage.cost < 0.02if capsera.over_budget():raise BudgetExceeded()@capsera.track()def extract(doc):return chain(doc)# cheaper route, same outputcapsera.route(prefer="cost")spend = capsera.usage(group_by="agent",window="30d",)for a, cost in spend:
model="claude-sonnet-4-6",max_tokens=1024,)# no proxy, no gatewayassert resp.usage.cost < 0.02if capsera.over_budget():raise BudgetExceeded()@capsera.track()def extract(doc):return chain(doc)# cheaper route, same outputcapsera.route(prefer="cost")spend = capsera.usage(group_by="agent",window="30d",)for a, cost in spend:print(a, f"${cost:.2f}")# fails open, alwayscapsera.flush()for task in queue:run(task)log("run complete")import capserafrom anthropic import Anthropic
def extract(doc):return chain(doc)# cheaper route, same outputcapsera.route(prefer="cost")spend = capsera.usage(group_by="agent",window="30d",)for a, cost in spend:print(a, f"${cost:.2f}")# fails open, alwayscapsera.flush()for task in queue:run(task)log("run complete")import capserafrom anthropic import Anthropiccapsera.init(agent="reasoning_agent",run_id=ctx.run_id,)# checked before the callcapsera.budget(monthly=500,on_exceed="block",)
for a, cost in spend:print(a, f"${cost:.2f}")# fails open, alwayscapsera.flush()for task in queue:run(task)log("run complete")import capserafrom anthropic import Anthropiccapsera.init(agent="reasoning_agent",run_id=ctx.run_id,)# checked before the callcapsera.budget(monthly=500,on_exceed="block",)with capsera.agent("summarizer"):client = Anthropic()resp = client.messages.create(model="claude-sonnet-4-6",max_tokens=1024,)# no proxy, no gatewayassert resp.usage.cost < 0.02
from anthropic import Anthropiccapsera.init(agent="reasoning_agent",run_id=ctx.run_id,)# checked before the callcapsera.budget(monthly=500,on_exceed="block",)with capsera.agent("summarizer"):client = Anthropic()resp = client.messages.create(model="claude-sonnet-4-6",max_tokens=1024,)# no proxy, no gatewayassert resp.usage.cost < 0.02if capsera.over_budget():raise BudgetExceeded()@capsera.track()def extract(doc):return chain(doc)# cheaper route, same outputcapsera.route(prefer="cost")spend = capsera.usage(
)with capsera.agent("summarizer"):client = Anthropic()resp = client.messages.create(model="claude-sonnet-4-6",max_tokens=1024,)# no proxy, no gatewayassert resp.usage.cost < 0.02if capsera.over_budget():raise BudgetExceeded()@capsera.track()def extract(doc):return chain(doc)# cheaper route, same outputcapsera.route(prefer="cost")spend = capsera.usage(group_by="agent",window="30d",)for a, cost in spend:print(a, f"${cost:.2f}")# fails open, alwayscapsera.flush()for task in queue:
if capsera.over_budget():raise BudgetExceeded()@capsera.track()def extract(doc):return chain(doc)# cheaper route, same outputcapsera.route(prefer="cost")spend = capsera.usage(group_by="agent",window="30d",)for a, cost in spend:print(a, f"${cost:.2f}")# fails open, alwayscapsera.flush()for task in queue:run(task)log("run complete")import capserafrom anthropic import Anthropiccapsera.init(agent="reasoning_agent",run_id=ctx.run_id,)
Answer the question with a number.
Stop runaway agents before they become runaway invoices.