Skip to main content

The open-source FinOps proxy for AI spend across OpenAI, Anthropic, and Google.

Project description

BurnLens — The open-source FinOps proxy for AI spend

Track every dollar by feature, team, and customer across OpenAI, Anthropic, Google, Groq, Mistral, Together, and Azure OpenAI. Hard-cap budgets before the API call — not after the bill arrives. Additional providers are on the roadmap.

PyPI Python 3.10+ License: Apache 2.0 GitHub stars

pip install burnlens
burnlens start
# Dashboard at http://127.0.0.1:8420/ui

The Problem

Bills tell you the model, not the why. Your invoice says gpt-4o: $4,287. It doesn't say which feature, which team, or which customer burned it. By the time you trace the spike, it's already on next month's card.

Alerts arrive after the damage. A bad deploy, a runaway agent, or one abusive customer can trigger thousands of API calls before any dashboard turns red. You find out when you open the bill — or when your CEO does.

Every provider is a different silo. OpenAI's usage page. Anthropic's console. Azure Cost Management. Bedrock CloudWatch. No unified view, no way to ask "which feature is our biggest AI spend across all providers."


How It Works

  1. Drop-in proxy. Point your SDK's BASE_URL at localhost:8420. Existing code works unchanged. The proxy is designed for low overhead and supports streaming passthrough.

  2. Tag what matters. Three request headers (X-BurnLens-Tag-Feature, X-BurnLens-Tag-Team, X-BurnLens-Tag-Customer) attribute any call to any dimension. Tags are stripped before reaching the AI provider — they never leave your machine.

  3. Cap before you call. Register an API key with a daily dollar limit. At 100%, BurnLens returns 429 before the upstream request is made — not after the bill arrives. 50% and 80% thresholds fire Slack or email alerts.

  4. One dashboard for supported providers. OpenAI, Anthropic, Google, Groq, Mistral, Together, and Azure OpenAI spend in one unified view. Model breakdowns, waste detection, and budget tracking use versioned provider pricing.


Code Example

import os, openai

os.environ["OPENAI_BASE_URL"] = "http://127.0.0.1:8420/proxy/openai"

client = openai.OpenAI(default_headers={
    "X-BurnLens-Tag-Feature": "chat",
    "X-BurnLens-Tag-Team": "backend",
    "X-BurnLens-Tag-Customer": "acme-corp",
})

Tags are stripped before the request reaches OpenAI. They never appear in any API payload.


Use Cases

Coding agents. Cursor, Claude Code, Cline, Windsurf — attribute cost per PR, repo, or developer. Set a hard daily cap per API key so one runaway agent can't blow the team's monthly budget overnight.

Customer-facing AI. Tag each request with a customer ID. See which customers drive the most cost, alert on thresholds, and optionally route to cheaper models.

RAG and agents. Tag retrieval calls, tool calls, and generation separately. See whether your vector search or synthesis step is the cost driver — and whether it justifies the output quality.

Internal tools. Set per-team monthly budgets, get Slack alerts at 80% and 100%, and export monthly records for comparison with provider invoices.


Supported Providers

Provider Status Notes
OpenAI Stable All models, streaming, reasoning tokens
Anthropic Stable All models, streaming, prompt caching tokens
Google Stable Gemini 1.5–2.5 (+ 3.x previews), requires patch_google()
Groq Beta OpenAI-compatible: point GROQ_BASE_URL at /proxy/groq
Together Beta OpenAI-compatible: set client base_url to /proxy/together
Mistral Beta OpenAI-compatible: set client base_url to /proxy/mistral
Azure OpenAI Beta Point client azure_endpoint at /proxy/azure; set BURNLENS_AZURE_ENDPOINT to your resource URL
AWS Bedrock Roadmap

Why BurnLens

BurnLens Helicone / Langfuse Vantage / CloudZero
Open source Partial
Local-first (prompts stay local)
Hard caps before API call
Per-customer attribution
Multi-cloud (Azure / AWS / GCP) Roadmap Partial

Dashboard

BurnLens dashboard — LLM cost tracking by model, feature, team, and customer


Configuration

Zero config required — sensible defaults out of the box. Optional burnlens.yaml:

budget_limit_usd: 500.00
budgets:
  teams:
    backend: 200.00
    research: 100.00
  customers:
    acme-corp: 50.00
alerts:
  slack_webhook: https://hooks.slack.com/...

CLI

burnlens start                  # proxy + dashboard on :8420
burnlens top                    # live cost by model (htop-style)
burnlens report                 # weekly cost summary
burnlens analyze                # waste detection report
burnlens export                 # CSV of last 7 days
burnlens run -- python app.py   # auto-tag a process with repo / dev / pr / branch
burnlens key register <name>    # label an API key + set a daily cap
burnlens key list               # list registered keys with caps
burnlens keys                   # today's spend per registered key
burnlens scan claude            # import Claude Code session costs from disk
burnlens scan cursor            # import Cursor IDE session costs from disk
burnlens scan codex             # import OpenAI Codex session costs from disk
burnlens scan gemini            # import Gemini CLI session costs from disk

Contributing

Issues and PRs welcome. See CONTRIBUTING.md.

git clone https://github.com/sairintechnologycom/burnlens
cd burnlens
pip install -e ".[dev]"
pytest

License

Apache License 2.0

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

burnlens-1.6.1.tar.gz (187.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

burnlens-1.6.1-py3-none-any.whl (220.6 kB view details)

Uploaded Python 3

File details

Details for the file burnlens-1.6.1.tar.gz.

File metadata

  • Download URL: burnlens-1.6.1.tar.gz
  • Upload date:
  • Size: 187.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for burnlens-1.6.1.tar.gz
Algorithm Hash digest
SHA256 751c9755616cafa64a32cbbba30c13ca9466e2835934937e977a38d150f9e3ab
MD5 4c3cdd344df80fa9e1bd340e7a3bc4d6
BLAKE2b-256 bde7fb3ada8b690ac5a6ecf1e1b725229643aca2a6e19a48fcf84844caf7195f

See more details on using hashes here.

Provenance

The following attestation bundles were made for burnlens-1.6.1.tar.gz:

Publisher: publish.yml on sairintechnologycom/burnlens

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file burnlens-1.6.1-py3-none-any.whl.

File metadata

  • Download URL: burnlens-1.6.1-py3-none-any.whl
  • Upload date:
  • Size: 220.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for burnlens-1.6.1-py3-none-any.whl
Algorithm Hash digest
SHA256 5da3545dd83069494b8e7a8958481644a52add8e23911e5083de00bd549b1e93
MD5 cc1c01f9b5b3e62cb2d6c3e14bc8692c
BLAKE2b-256 a8cac15b0b6ea608c4a9bf9e262b5a280f7c7a23b449ac00c854607bbc1d61c7

See more details on using hashes here.

Provenance

The following attestation bundles were made for burnlens-1.6.1-py3-none-any.whl:

Publisher: publish.yml on sairintechnologycom/burnlens

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page