Skip to main content

Drop-in async-reporting wrapper for the OpenAI and Anthropic Python SDKs — live cost attribution without changing your base_url.

Project description

cognocient

A drop-in wrapper around the OpenAI and Anthropic Python SDKs that reports usage to Cognocient asynchronously, so you get live cost attribution without changing your base_url or routing traffic through a proxy.

pip install cognocient[openai]      # or cognocient[anthropic], or both
# Before
from openai import OpenAI
client = OpenAI(api_key="sk-...")

# After
from cognocient import CognocientOpenAI as OpenAI
client = OpenAI(
    api_key="sk-...",              # your own real OpenAI key, used exactly as before
    cognocient_key="sk-cog-...",   # auths the async usage report only — no traffic routes through Cognocient
)

client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "hello"}],
    cognocient_feature="support-bot",   # optional attribution — same field names the proxy accepts as X-Cost-* headers
)

Every method the real SDK exposes still works unchanged. This wrapper only intercepts chat.completions.create() (messages.create() for Anthropic) to time the call and report its usage after the fact; everything else is forwarded to the real client untouched.

What is cognocient_key, exactly?

It's just an authentication credential — the same kind of API key you'd generate for the proxy — but here it does one thing only: it lets the wrapper's background reporting call prove to Cognocient's ingestion API which account a usage report belongs to. It has nothing to do with your actual OpenAI/Anthropic request. That request still goes straight to api.openai.com / api.anthropic.com with your own real provider key, exactly like it would with no Cognocient wrapper installed at all — no base_url change, no network hop, no dependency on Cognocient being up. The wrapper just fires a second, separate, best-effort call afterward to log what happened, off the critical path, on a background thread. Losing that reporting call (Cognocient down, key wrong, network blip) never affects your real API call — see "Reliability" below.

This is one of three ways to see your Cognocient dashboard

Live attribution Pre-call enforcement (block/degrade) Code change
Proxy (base_url swap) Yes Yes One line
This wrapper Yes No — see below Swap the import, add a key
CSV/OTel import No (historical only) No None

Security — read this before you decide

This wrapper is not more secure than the proxy. It is a different tradeoff, not a strictly better one.

With the proxy, your real provider API key lives server-side, under Cognocient's control, in one place. With this wrapper, your real provider key stays in your own application process, exactly as it does today without Cognocient at all — the wrapper calls the provider directly, using your key, inside your runtime. Some security teams prefer that (no third-party network hop in the request path); others are less comfortable with third-party code executing inside their process with key access. Both are reasonable positions. We're not going to tell you this "removes a security roadblock" — it trades one shape of exposure for a different one.

What this wrapper honestly gives you over the proxy:

  • Zero added request latency. Reporting happens after your real call already returned, on a background thread, off the critical path.
  • Zero risk of a Cognocient outage affecting your production call. If Cognocient's ingestion API is down or unreachable, your call to OpenAI/Anthropic still completes normally — see "Reliability" below.

What you give up versus the proxy: pre-call enforcement. Because Cognocient only hears about a call after it already happened, budgets configured in Cognocient cannot block or degrade a call made through this wrapper before it fires. The dashboard will say so explicitly for any account using this path.

Reliability

Reporting is fire-and-forget on a background thread with a bounded local queue, flushed every few seconds or every 50 calls, whichever comes first. If the ingestion API is slow, down, or unreachable:

  • Your real provider call is completely unaffected — it already happened before reporting was attempted.
  • No exception is ever raised into your code from a reporting failure.
  • No retry loop that could pile up work in your process — a failed batch is dropped and logged locally at DEBUG level via the cognocient logger, not retried.

See tests/test_reporter_failure_isolation.py for a test that simulates an unreachable ingestion endpoint and asserts the real call still completes normally.

Known limitation: streaming isn't reported yet

stream=True calls are passed through to the real SDK completely unmodified — your application behaves identically — but are not currently reported to Cognocient. Usage totals aren't available until a stream completes, and reliably capturing them requires wrapping the stream iterator itself, which this version doesn't do. If most of your traffic streams, this wrapper will under-report your usage today. Use the proxy or the CSV/OTel importer if that matters for your evaluation.

Attribution fields

Same field names the proxy accepts as X-Cost-* headers, passed as keyword arguments instead:

Wrapper kwarg Proxy header
cognocient_feature X-Cost-Feature
cognocient_department X-Cost-Department
cognocient_user X-Cost-User
cognocient_session X-Cost-Session
cognocient_tier X-Cost-Tier
cognocient_project X-Cost-Project
cognocient_gl_account X-Cost-GL-Account
cognocient_workload X-Cost-Workload
cognocient_outcome X-Cost-Outcome
cognocient_run_id X-Cost-Run-ID

Development

pip install -e ".[dev]"
pytest
python benchmark/benchmark_wrapper_overhead.py

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

cognocient-0.1.2.tar.gz (11.5 kB view details)

Uploaded Source

Built Distribution

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

cognocient-0.1.2-py3-none-any.whl (11.0 kB view details)

Uploaded Python 3

File details

Details for the file cognocient-0.1.2.tar.gz.

File metadata

  • Download URL: cognocient-0.1.2.tar.gz
  • Upload date:
  • Size: 11.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for cognocient-0.1.2.tar.gz
Algorithm Hash digest
SHA256 0ccab37c2ac437ab1bf6b5981f193772d3e08561a4aedd26e4b6de3d616f4261
MD5 53290eb65a871a4a2259c758038ac5c5
BLAKE2b-256 199ccdedf40e649d4e9c0fc7a66c4c0a69ad5ad3a00db416dce1a9d656107361

See more details on using hashes here.

Provenance

The following attestation bundles were made for cognocient-0.1.2.tar.gz:

Publisher: publish_python_wrapper.yml on mandarvshinde/Cognocient

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

File details

Details for the file cognocient-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: cognocient-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 11.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for cognocient-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 d3f4484e3bc50f4dcf5c9b926d5fbf2ebca3813f9ad009aa73864bec5b2e819e
MD5 664f83a859814bfa7165296ac9f52d11
BLAKE2b-256 3f5868149300406325dc8a18a766c5e4c2e42db495b4a50e7aa6759c985decc2

See more details on using hashes here.

Provenance

The following attestation bundles were made for cognocient-0.1.2-py3-none-any.whl:

Publisher: publish_python_wrapper.yml on mandarvshinde/Cognocient

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