Agent Unit Economics SDK — track end-to-end business-task costs for AI agents.
Project description
dexcost
Agent Unit Economics SDK — track end-to-end business-task costs for AI agents.
dexcost attributes LLM calls, non-LLM service fees, and retry waste to customers, projects, and workflows so you can answer "what does each AI task actually cost?"
Install
pip install dexcost
With all LLM provider SDKs:
pip install dexcost[all]
Quick Start
Global API (recommended)
import dexcost
dexcost.init(api_key="dx_live_...") # or set DEXCOST_API_KEY env var
dexcost.set_context(customer_id="acme-corp")
with dexcost.task(task_type="summarise_doc") as t:
# LLM calls are auto-captured — just use OpenAI/Anthropic/etc normally
response = openai.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "Summarise this document"}],
)
# Record non-LLM costs manually
t.record_cost(service="pdf_parser", cost_usd="0.002")
dexcost.close()
Instance API (for multi-tracker scenarios)
from dexcost import CostTracker
from dexcost.storage.sqlite import SQLiteStorage
tracker = CostTracker(storage=SQLiteStorage("/tmp/demo.db"))
with tracker.task(task_type="summarise_doc", customer_id="acme") as t:
t.record_llm_call("openai", "gpt-4o", input_tokens=800, output_tokens=150)
t.record_cost(service="pdf_parser", cost_usd="0.002")
Auto-Instrumentation
dexcost auto-instruments 6 LLM providers and 5 HTTP libraries.
LLM Providers
| Provider | Package | Auto-Patched Method |
|---|---|---|
| OpenAI | openai |
chat.completions.create (sync + async) |
| Anthropic | anthropic |
messages.create (sync + async) |
| LiteLLM | litellm |
completion / acompletion |
| Google Gemini | google-genai |
models.generate_content |
| AWS Bedrock | boto3 (botocore) |
invoke_model |
| Cohere | cohere |
chat / generate |
Every LLM call inside a tracked task is captured automatically — cost, tokens, latency, model, provider. No manual record_llm_call needed.
HTTP Libraries (Non-LLM Cost Capture)
| Library | What's Patched |
|---|---|
requests |
Session.send |
httpx |
Client.send |
aiohttp |
ClientSession._request |
botocore (boto3) |
URLLib3Session.send |
urllib3 |
HTTPConnectionPool.urlopen |
HTTP calls to domains in the 163-service catalog (Pinecone, Twilio, SendGrid, Stripe, Firecrawl, Exa, etc.) are automatically captured as external_cost events with cost extracted from the response.
Controlling Instrumentation
# Instrument only specific providers
dexcost.init(auto_instrument=["openai", "gemini"])
# Disable all auto-instrumentation
dexcost.init(auto_instrument=[])
# Disable HTTP tracking
dexcost.init(track_http=False)
Configuration
dexcost.init() Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
api_key |
str |
DEXCOST_API_KEY env |
API key for cloud push |
auto_instrument |
list[str] |
All 6 providers | Which LLM SDKs to patch |
track_http |
bool |
True |
Patch HTTP libraries for non-LLM cost capture |
batch_size |
int |
100 |
Events per sync batch |
flush_interval |
float |
5.0 |
Seconds between sync pushes |
redact_fields |
list[str] |
None |
Field names to redact from event details |
hash_customer_id |
bool |
False |
SHA-256 hash customer_id before storage |
environment |
str |
None |
Set to "development" for dev console mode |
storage |
str |
None |
Storage mode ("local" or auto-detect) |
buffer_path |
str |
~/.dexcost/buffer.db |
Path to local SQLite buffer |
Environment Variables
| Variable | Description |
|---|---|
DEXCOST_API_KEY |
API key (if not passed to init()) |
DEXCOST_ENDPOINT |
Control Layer URL (default: https://api.dexcost.io) |
DEXCOST_ENV |
Set to development for dev console output |
Task Tracking
Context Manager
with dexcost.task(task_type="resolve_ticket") as t:
# All LLM/HTTP calls inside are automatically captured
pass
Decorator
@tracker.track_task(task_type="generate_report", customer_id="acme")
def generate_report(data):
# LLM calls here are tracked
pass
Manual Start/End
t = tracker.start_task(task_type="batch_job", customer_id="acme")
# ... do work ...
t.end(status="success")
TrackedTask Methods
with dexcost.task(task_type="...") as t:
# Record LLM call manually (usually auto-captured)
t.record_llm_call("openai", "gpt-4o", input_tokens=800, output_tokens=150)
# Record non-LLM cost
t.record_cost(service="pinecone", cost_usd="0.001")
# Record usage (cost computed from registered rates)
t.record_usage(service="s3_storage", units=1024)
# Mark a retry
t.mark_retry(reason="rate_limit", cost_usd="0.005")
# Link to external trace
t.link_trace(provider="datadog", trace_id="abc123")
Customer Attribution
dexcost.set_context(customer_id="acme-corp", project_id="proj-alpha")
# All tasks created after this inherit customer_id and project_id
with dexcost.task(task_type="...") as t:
pass # t.task.customer_id == "acme-corp"
Dev Mode
Set DEXCOST_ENV=development or pass environment="development" to init(). In dev mode:
- Cost events are printed to the terminal
- No data is pushed to the cloud
- Useful for local development and debugging
CLI
dexcost status # DB location, event count, sync status
dexcost rates --list # Show registered cost rates
dexcost scan . # Find untracked cost points in your code
dexcost scan . --generate-stubs # Generate record_cost() stubs for manual points
Development
pip install -e ".[all]"
pip install ruff black mypy pytest
make lint # ruff
make format # black
make typecheck # mypy strict
make test # pytest
Privacy
When you connect to the Dexcost Control Layer, the SDK transmits usage data subject to our Privacy Policy.
License
MIT — see LICENSE.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dexcost-0.1.1.tar.gz.
File metadata
- Download URL: dexcost-0.1.1.tar.gz
- Upload date:
- Size: 580.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4c7249a6096ce32bb0f8eb47ff217d657b8fe507d1417bf2c8c1678d5ca3f42e
|
|
| MD5 |
e7362d6a088ac68c55a107107792233d
|
|
| BLAKE2b-256 |
d6eca278677ba8f0b96d6ac3bc4edd7eb6c7679bec5cf094b5a46ece9bd76535
|
Provenance
The following attestation bundles were made for dexcost-0.1.1.tar.gz:
Publisher:
release-python.yml on DexwoxBusiness/dexcost-sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dexcost-0.1.1.tar.gz -
Subject digest:
4c7249a6096ce32bb0f8eb47ff217d657b8fe507d1417bf2c8c1678d5ca3f42e - Sigstore transparency entry: 1676337266
- Sigstore integration time:
-
Permalink:
DexwoxBusiness/dexcost-sdk@ec856e55a6d52fea6e8de57a4ed3948fd9071a6f -
Branch / Tag:
refs/tags/python/v0.1.1 - Owner: https://github.com/DexwoxBusiness
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-python.yml@ec856e55a6d52fea6e8de57a4ed3948fd9071a6f -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file dexcost-0.1.1-py3-none-any.whl.
File metadata
- Download URL: dexcost-0.1.1-py3-none-any.whl
- Upload date:
- Size: 262.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a29c5db1ad1d6da9d797e0a4161d5f5168afb90c38ebd82ebb7be138bdd7dcc6
|
|
| MD5 |
31538926413e1877f6630c24a3228888
|
|
| BLAKE2b-256 |
b9132927f02cf56d74f68c253b70945c5fb57b38dd5dedfc44a301d3b8b1dfd3
|
Provenance
The following attestation bundles were made for dexcost-0.1.1-py3-none-any.whl:
Publisher:
release-python.yml on DexwoxBusiness/dexcost-sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dexcost-0.1.1-py3-none-any.whl -
Subject digest:
a29c5db1ad1d6da9d797e0a4161d5f5168afb90c38ebd82ebb7be138bdd7dcc6 - Sigstore transparency entry: 1676337308
- Sigstore integration time:
-
Permalink:
DexwoxBusiness/dexcost-sdk@ec856e55a6d52fea6e8de57a4ed3948fd9071a6f -
Branch / Tag:
refs/tags/python/v0.1.1 - Owner: https://github.com/DexwoxBusiness
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-python.yml@ec856e55a6d52fea6e8de57a4ed3948fd9071a6f -
Trigger Event:
workflow_dispatch
-
Statement type: