You will be asked to put a limit on this. Provider caps will not do it
Every other resource on your platform has a quota, an owner and a way to be cut off. LLM access usually has a key in a secret manager and a dashboard nobody reads. When the question arrives — who can spend what, and what happens when they hit it — the provider's own controls do not answer it, because they are scoped to a credential rather than to a workload.
What a provider dashboard leaves you with
01
Account-level caps stop every agent sharing the credential, not the one that misbehaved.
02
A gateway is another hop to run, secure and page someone about at 3am.
03
Per-team chargeback is impossible without per-team attribution, and one key produces one number.
What Capsera does about it
- One line, no new infrastructure
- The SDK patches provider libraries at init. No proxy, no gateway, no change to existing call sites.
- Fail-open
- If Capsera is down, calls still go through. It cannot become the dependency that takes production with it.
- Envelopes at org, team and agent level
- Limits scoped to the units you actually operate, enforced before the provider call rather than reported after.
The number this is judged on
Time to add a limit: one line
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,)