Skip to main content

Carbon emissions tracking for LLM agent frameworks

Project description

agent-carbon

Carbon emissions tracking for LLM agent frameworks.

Tokens ✓ · Cost ✓ · CO₂e — until now, missing.

agent-carbon is a drop-in callback that plugs into LangChain, LangGraph, CrewAI, and AutoGen the same way token/cost callbacks do — no code changes to your agent, no network calls, no telemetry.


Install

pip install agent-carbon

With optional framework integrations:

pip install "agent-carbon[langgraph]"
pip install "agent-carbon[crewai]"
pip install "agent-carbon[autogen]"

3-line usage

from agent_carbon import CarbonCallbackHandler

handler = CarbonCallbackHandler(region="us-east-1")
chain.invoke({"input": "..."}, config={"callbacks": [handler]})
print(handler.receipt)

Sample receipt

CarbonReceipt(total_tokens=4823, total_gco2e=0.1802, total_wh=0.3650,
              savings_vs_frontier_gco2e=1.0241, calls=3)
## Carbon Receipt

| Metric                          | Value                                 |
|---------------------------------|---------------------------------------|
| Total tokens                    | 4,823 (3,201 in / 1,622 out)          |
| Total energy                    | 0.3650 Wh                             |
| Total CO₂e                      | 0.1802 gCO₂e                          |
| Savings vs `claude-opus-4-6`    | 1.0241 gCO₂e                          |
| Region                          | us-east-1                             |
| LLM calls                       | 3                                     |
| Estimate                        | True                                  |
| Duration                        | 4.21s                                 |

> *Emissions estimated from token counts × model-specific energy factors
> (Wh/1M tokens) × regional grid intensity (gCO₂e/kWh).
> All values are approximate; see factors_meta.json for sources and caveats.*

### Per-call Breakdown

| # | Model               | In tok | Out tok | gCO₂e  | Wh     |
|---|---------------------|--------|---------|--------|--------|
| 1 | `claude-sonnet-4-6` | 1,234  |   512   | 0.0724 | 0.1465 |
| 2 | `claude-sonnet-4-6` | 1,489  |   601   | 0.0843 | 0.1707 |
| 3 | `claude-sonnet-4-6` |   478  |   509   | 0.0235 | 0.0476 |

API reference

CarbonCallbackHandler

handler = CarbonCallbackHandler(
    region="us-east-1",           # optional — cloud region for grid intensity
    frontier_model="claude-opus-4-6",  # optional — savings comparison baseline
)

Pass it as a LangChain callback and read .receipt after the run:

result = chain.invoke(input, config={"callbacks": [handler]})
receipt = handler.receipt          # CarbonReceipt
receipt.to_markdown()              # human-readable string
receipt.to_dict()                  # JSON-serializable dict
handler.reset()                    # clear for next run (keeps region/config)

@track_carbon decorator

For plain functions that use LangChain under the hood:

from agent_carbon import track_carbon

@track_carbon(region="us-west-2")
def run_my_chain(query, config=None):
    return chain.invoke({"input": query}, config=config)

result, receipt = run_my_chain("What is solar energy?")

LangGraph helper

from agent_carbon.integrations.langgraph import invoke_with_carbon

result, receipt = invoke_with_carbon(graph, state, region="us-west-2")

CrewAI helper

from agent_carbon.integrations.crewai import kickoff_with_carbon

result, receipt = kickoff_with_carbon(crew, region="eu-west-1")

AutoGen wrapper

from agent_carbon.integrations.autogen import CarbonModelClient

client = CarbonModelClient(base_openai_client, region="us-east-1")
# pass client to AssistantAgent(model_client=client)
print(client.receipt)

Supported models

Model Provider
gpt-5, gpt-5-mini, gpt-5-nano OpenAI
claude-opus-4-6, claude-sonnet-4-6, claude-haiku-4-5 Anthropic
gemini-2.5-pro, gemini-2.5-flash Google
llama-3.3-70b, llama-3.3-8b Meta
mistral-large, mistral-small Mistral

Unknown models emit gco2e=0 and wh=0 with estimated=True rather than raising. Add entries to factors_meta.json and call agent_carbon.factors.FACTORS.update(...) to extend the table at runtime.


Region awareness

Pass any major AWS, GCP, or Azure region slug to get grid-adjusted CO₂e:

# Oregon's clean grid (~135 gCO₂/kWh) vs. global avg (~494 gCO₂/kWh)
handler = CarbonCallbackHandler(region="us-west-2")

Omit region to use the IEA 2022 global average (494 gCO₂e/kWh). See src/agent_carbon/regions.py for the full table.


Methodology & honesty

Every receipt includes:

  • estimate: true — always. No precise published inference energy data exists for any major commercial LLM as of 2026.
  • methodology — a one-line disclaimer describing the calculation.
  • Per-entry source comments in factors.py and factors_meta.json citing the basis for each estimate.

Energy factors are derived from GPU hardware benchmarks for commercial-scale inference (high-batch-size, tensor-parallel, H100/A100 deployments). Estimates should be treated as order-of-magnitude guidance, not accounting figures.


Contributing

Contributions to improve factor accuracy — especially from published energy audits or provider sustainability reports — are very welcome. Update both src/agent_carbon/factors.py and factors_meta.json, cite the source, and open a PR.


License

MIT

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

agent_carbon-0.1.1.tar.gz (21.3 kB view details)

Uploaded Source

Built Distribution

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

agent_carbon-0.1.1-py3-none-any.whl (18.5 kB view details)

Uploaded Python 3

File details

Details for the file agent_carbon-0.1.1.tar.gz.

File metadata

  • Download URL: agent_carbon-0.1.1.tar.gz
  • Upload date:
  • Size: 21.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for agent_carbon-0.1.1.tar.gz
Algorithm Hash digest
SHA256 e944e8fc6027cc8b9b597f9f0574ed2d660388ff57cec5bfeadbab66bf3a1ea2
MD5 eddf69cd8167735f0708e93f4a56ea54
BLAKE2b-256 5454e71fc07dcb0ec4788134a18f0b3e977d5bbd8daa6138f4befaeafbe6a608

See more details on using hashes here.

File details

Details for the file agent_carbon-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: agent_carbon-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 18.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for agent_carbon-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 5c71846c1eb2397069bcd69b141330c0cc2df84b140fc981deb755d18e2c853c
MD5 50a7836de5eeabda4eef786e2c35441b
BLAKE2b-256 7b92f813c04dc80725ff8c272d75e32ea28774bf00e6ff863ceb0c25877314e7

See more details on using hashes here.

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