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
DEBUGlevel via thecognocientlogger, 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
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 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
29da4385dde6dfb5cf676167c6dd797fbda7a1e4f0aa9506a50d39a1cd71a153
|
|
| MD5 |
1bd7720470ba8154a5bbe21355ff1a58
|
|
| BLAKE2b-256 |
c7c8890e021cb273494fcbaf519cebeac762f810baa5a6c531ef0b65e816470d
|
Provenance
The following attestation bundles were made for cognocient-0.1.1.tar.gz:
Publisher:
publish_python_wrapper.yml on mandarvshinde/Cognocient
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cognocient-0.1.1.tar.gz -
Subject digest:
29da4385dde6dfb5cf676167c6dd797fbda7a1e4f0aa9506a50d39a1cd71a153 - Sigstore transparency entry: 2312701220
- Sigstore integration time:
-
Permalink:
mandarvshinde/Cognocient@f9e77c03e599d3c2411c58ece697f309e9131bbb -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/mandarvshinde
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish_python_wrapper.yml@f9e77c03e599d3c2411c58ece697f309e9131bbb -
Trigger Event:
release
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7a70632697fe740ddf6522800fd851650a5f0c7d576a359f6c912de69f0911d2
|
|
| MD5 |
db63d1023ec7642248e6303f5e073b89
|
|
| BLAKE2b-256 |
aca6250921c19a0176ded0827a27d9929e42115c6ef98e677eb9e32f35c9e1e6
|
Provenance
The following attestation bundles were made for cognocient-0.1.1-py3-none-any.whl:
Publisher:
publish_python_wrapper.yml on mandarvshinde/Cognocient
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cognocient-0.1.1-py3-none-any.whl -
Subject digest:
7a70632697fe740ddf6522800fd851650a5f0c7d576a359f6c912de69f0911d2 - Sigstore transparency entry: 2312701225
- Sigstore integration time:
-
Permalink:
mandarvshinde/Cognocient@f9e77c03e599d3c2411c58ece697f309e9131bbb -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/mandarvshinde
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish_python_wrapper.yml@f9e77c03e599d3c2411c58ece697f309e9131bbb -
Trigger Event:
release
-
Statement type: