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-...",   # the same proxy key you'd use with the Cognocient proxy
)

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.

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.1.tar.gz (11.2 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.1-py3-none-any.whl (10.7 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: cognocient-0.1.1.tar.gz
  • Upload date:
  • Size: 11.2 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.1.tar.gz
Algorithm Hash digest
SHA256 29da4385dde6dfb5cf676167c6dd797fbda7a1e4f0aa9506a50d39a1cd71a153
MD5 1bd7720470ba8154a5bbe21355ff1a58
BLAKE2b-256 c7c8890e021cb273494fcbaf519cebeac762f810baa5a6c531ef0b65e816470d

See more details on using hashes here.

Provenance

The following attestation bundles were made for cognocient-0.1.1.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.1-py3-none-any.whl.

File metadata

  • Download URL: cognocient-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 10.7 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.1-py3-none-any.whl
Algorithm Hash digest
SHA256 7a70632697fe740ddf6522800fd851650a5f0c7d576a359f6c912de69f0911d2
MD5 db63d1023ec7642248e6303f5e073b89
BLAKE2b-256 aca6250921c19a0176ded0827a27d9929e42115c6ef98e677eb9e32f35c9e1e6

See more details on using hashes here.

Provenance

The following attestation bundles were made for cognocient-0.1.1-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