Cost Tracking
Every completion carries a cost estimate derived from reported token counts
Every completion carries a cost estimate โ PraisonAI derives it from the token counts your provider reports.
Cost is computed from the input_tokens and output_tokens your provider returns, multiplied by a per-model rate. When litellm is installed it covers 1000+ models; otherwise a built-in fallback table prices the most common models.
Quick Start
- Run an agent and read its token counts
A bare
Agent(llm="gpt-4o-mini")records usage automatically. Read the counts back with the global collector:python from praisonaiagents import Agent from praisonaiagents.telemetry.token_collector import get_token_collector agent = Agent(llm="gpt-4o-mini") agent.start("Summarise the theory of relativity in one paragraph") summary = get_token_collector().get_session_summary() print(summary["total_metrics"]["input_tokens"], summary["total_metrics"]["output_tokens"]) # cost is derived from these counts via calculate_llm_cost() - Estimate the cost from those counts
Pass the counts and the model name to
calculate_llm_cost():python from praisonaiagents.utils.cost_utils import calculate_llm_cost cost = calculate_llm_cost( prompt_tokens=1000, completion_tokens=500, model="gpt-4o-mini", ) print(f"${cost}") # $0.00045 โ (1000/1M ร $0.15) + (500/1M ร $0.60) - Read cost from an async agent
An async run reports the same telemetry as sync โ every tool-loop iteration emits
llm_endwith tokens, cost, and latency.python import asyncio from praisonaiagents import Agent from praisonaiagents.telemetry.token_collector import get_token_collector agent = Agent(llm="gpt-4o-mini") async def main(): await agent.astart("Summarise the theory of relativity in one paragraph") asyncio.run(main()) summary = get_token_collector().get_session_summary() print(summary["total_metrics"]["input_tokens"], summary["total_metrics"]["output_tokens"]) # Same non-zero counts you would see from a sync agent.start(...)
How It Works
Cost is input_tokens ร input_rate + output_tokens ร output_rate. The only question is which rate applies to a given model name.
How Pricing Is Resolved
The fallback matcher resolves a model name to a rate in three steps:
- Strip the provider prefix.
openai/gpt-4o-minibecomesgpt-4o-mini, so provider-qualified names resolve the same as bare names. - Match longest-key-first, on exact match or prefix boundary. The table is searched from the longest key down, and a key only matches when the model name is exactly that key or starts with
<key>-โฆ. Sogpt-4o-miniis billed at$0.15/1M, notgpt-4o‘s$2.50/1M, ando1-minino longer matcheso1. - Fall back to
default. If no key matches, thedefaultrate applies.defaultis never matched by name โ it is only the last resort.
Fallback Pricing Table
These are the built-in rates the SDK ships in _FALLBACK_PRICING (USD per 1M tokens). They apply when litellm is not installed.
| Model | Input ($/1M) | Output ($/1M) |
|---|---|---|
gpt-4o | 2.50 | 10.00 |
gpt-4o-mini | 0.15 | 0.60 |
gpt-4-turbo | 10.00 | 30.00 |
gpt-4 | 30.00 | 60.00 |
gpt-3.5-turbo | 0.50 | 1.50 |
o1 | 15.00 | 60.00 |
o1-mini | 1.10 | 4.40 |
o1-preview | 15.00 | 60.00 |
o3-mini | 1.10 | 4.40 |
claude-3-5-sonnet | 3.00 | 15.00 |
claude-3-5-haiku | 0.80 | 4.00 |
claude-3-opus | 15.00 | 75.00 |
claude-3-sonnet | 3.00 | 15.00 |
claude-3-haiku | 0.25 | 1.25 |
gemini-1.5-pro | 1.25 | 5.00 |
gemini-1.5-flash | 0.075 | 0.30 |
gemini-2.0-flash | 0.10 | 0.40 |
gemini-2.0-flash-exp | 0.10 | 0.40 |
gemini-pro | 0.50 | 1.50 |
deepseek-chat | 0.14 | 0.28 |
deepseek-reasoner | 0.55 | 2.19 |
default | 1.00 | 3.00 |
Common Patterns
Price a whole session
Read the session totals, then price them once:
from praisonaiagents import Agent
from praisonaiagents.telemetry.token_collector import get_token_collector
from praisonaiagents.utils.cost_utils import calculate_llm_cost
agent = Agent(llm="gpt-4o-mini")
agent.start("Draft a product announcement")
totals = get_token_collector().get_session_summary()["total_metrics"]
cost = calculate_llm_cost(totals["input_tokens"], totals["output_tokens"], model="gpt-4o-mini")
print(f"${cost}")Read spend from a provider/model agent
from praisonaiagents import Agent
agent = Agent(llm="anthropic/claude-3-5-sonnet-20240620")
agent.start("Summarise the theory of relativity in one paragraph")
print(agent.total_cost) # non-zero
print(agent.cost_summary["llm_calls"]) # >= 1Provider-prefixed model names resolve correctly
openai/gpt-4o-mini is stripped to gpt-4o-mini before matching, so it prices at the mini rate:
from praisonaiagents.utils.cost_utils import calculate_llm_cost
print(calculate_llm_cost(1000, 500, model="openai/gpt-4o-mini")) # 0.00045
print(calculate_llm_cost(1000, 500, model="gpt-4o-mini")) # 0.00045 โ sameBest Practices
Use realistic model names
Pass the exact model string you run with (e.g. gpt-4o-mini, claude-3-5-sonnet). The longest-key-first matcher relies on the full name to avoid billing a -mini model at its larger sibling’s rate.
Install litellm for uncommon models
The fallback table covers common models only. For anything outside it, install litellm and call calculate_llm_cost(..., use_litellm=True) for accurate, up-to-date pricing.
Cost is an estimate, not a bill
These numbers estimate spend from token counts and published rates. Use your provider’s dashboard for authoritative billing.