Sigmoda Python SDK for logging LLM events and OpenAI chat completions.
Project description
Sigmoda Python SDK
Sigmoda is an LLM observability and guardrails platform. This SDK gives you:
- Thin wrappers around OpenAI Responses (recommended) and Chat Completions that measure latency, capture prompt/response/token usage, log to Sigmoda, and return the original OpenAI response.
- A
log_eventhelper to send custom LLM events (for other providers or bespoke flows).
Install
pip install sigmoda
Quickstart (2 minutes)
- Set your keys (env vars):
export SIGMODA_PROJECT_KEY="YOUR_SIGMODA_PROJECT_KEY"
export OPENAI_API_KEY="YOUR_OPENAI_API_KEY"
- Call OpenAI (Responses API recommended):
import sigmoda
sigmoda.init() # reads env vars
resp = sigmoda.openai.responses.create(
model="gpt-5.2", # or "gpt-5-mini"
input="Explain vector DBs like I'm 12",
sigmoda_metadata={"route": "quickstart"},
)
sigmoda.flush(timeout=2.0)
print(resp.output_text)
Quick troubleshooting
ValueError: Missing OPENAI_API_KEY→ setOPENAI_API_KEYor setopenai.api_keybefore usingsigmoda.openai.*.ValueError: Sigmoda is not initialized→ setSIGMODA_PROJECT_KEY(orSIGMODA_API_KEY), callsigmoda.init(...), or setSIGMODA_DISABLED=1.
Configure
Set keys via environment variables (recommended):
export SIGMODA_PROJECT_KEY="YOUR_SIGMODA_PROJECT_KEY"
export OPENAI_API_KEY="YOUR_OPENAI_API_KEY"
# Optional (only if your Sigmoda setup requires it)
export SIGMODA_PROJECT_ID="YOUR_SIGMODA_PROJECT_ID"
# Optional
export SIGMODA_ENV="prod" # prod|stage|dev
export SIGMODA_API_URL="https://api.sigmoda.com"
export SIGMODA_DISABLED="0" # set to 1 to disable logging
export SIGMODA_DEBUG="0" # set to 1 for debug logs
export SIGMODA_SAMPLE_RATE="1.0" # 0.0 - 1.0
export SIGMODA_MAX_PAYLOAD_BYTES="100000"
If you only use environment variables, you can skip calling sigmoda.init(); the wrapper will auto-initialize on first use. Call sigmoda.init() to override defaults or pass options programmatically.
import sigmoda
sigmoda.init(
# Reads env vars by default:
# - SIGMODA_PROJECT_KEY (required unless SIGMODA_DISABLED=1)
# - SIGMODA_PROJECT_ID (optional)
# - SIGMODA_ENV / SIGMODA_API_URL / SIGMODA_DISABLED / SIGMODA_DEBUG (optional)
# Privacy controls (optional)
# capture_content=False, # don't send prompt/response text
# redact=lambda s: "[REDACTED]", # redact prompt/response + string metadata values
)
Wrap OpenAI chat completions
resp = sigmoda.openai.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "Draft a friendly greeting."}],
sigmoda_metadata={"route": "welcome-flow", "user_id": "123"},
)
# Use the OpenAI response as usual
print(resp.choices[0].message.content)
Wrap OpenAI Responses (recommended)
resp = sigmoda.openai.responses.create(
model="gpt-5.2",
input="Draft a friendly greeting.",
sigmoda_metadata={"route": "welcome-flow", "user_id": "123"},
)
print(resp.output_text)
What happens:
- SDK times the call, reads token usage if present, and sends a best-effort log to Sigmoda (prompt/response text only if
capture_content=True). - Logging is fire-and-forget on a single background worker with a bounded queue; when full, events are dropped (never break your app).
- Network sends use short timeouts + small retries for transient errors.
- Tool call names (if any) are captured in
metadata["_sigmoda"]["tool_call_names"]. - OpenAI SDK retry count (when available) is captured in
metadata["_sigmoda"]["openai_retries"].
You can inspect drop/retry counters and flush on shutdown:
print(sigmoda.get_stats())
sigmoda.flush(timeout=2.0)
Streaming
Streaming is supported for both Chat Completions and Responses: if you pass stream=True, the SDK returns the OpenAI stream and logs an event once the stream is fully consumed.
Notes
- Metadata is sanitized (JSON-safe) and bounded by defaults (
max_metadata_items=50,max_metadata_bytes=8192). - Set
SIGMODA_DISABLED=1(ordisabled=True) to fully no-op logging. - In
SIGMODA_ENV=prod,capture_contentdefaults toFalse(no prompt/response text captured). Setcapture_content=Trueonly if you’re sure it’s safe. - Defaults:
timeout=2s,max_retries=2,max_queue_size=1000,sample_rate=1.0,max_payload_bytes=100000,max_prompt_chars=8000,max_response_chars=8000. - Use
sigmoda_metadata={...}for Sigmoda metadata; OpenAI’s ownmetadata=...parameter (if you pass it) is forwarded to OpenAI.
OpenAI SDK compatibility
- Tested with OpenAI Python SDK 1.x and 2.x.
- OpenAI SDK 2.x requires Python 3.9+; Python 3.8 users should install OpenAI SDK 1.x.
- This SDK wraps Chat Completions and Responses; Responses is the primary API going forward.
Troubleshooting
export SIGMODA_DEBUG=1
import sigmoda
print(sigmoda.get_stats()) # queue_size, dropped_queue_full, failed, retries, sent
Common issues:
OPENAI_API_KEYnot set (preflight error).SIGMODA_DISABLED=1set (no logs by design).- Wrong
SIGMODA_API_URL(checkfailed/retriescounters). - Missing
SIGMODA_PROJECT_KEY(init will raise unless disabled).
Log a custom event
sigmoda.log_event(
provider="my-llm",
model="alpha-1",
type="chat_completion",
prompt="Translate 'hello' to French.",
response="Bonjour",
tokens_in=4,
tokens_out=2,
duration_ms=85,
status="ok",
metadata={"route": "translator"},
)
Development
- Python 3.8+.
- Runtime deps:
requests,openai>=1,<3. - Tests:
pytest. Run locally with:
python3 -m venv .venv
. .venv/bin/activate
pip install -e ".[test]"
pytest
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 sigmoda-0.2.1.tar.gz.
File metadata
- Download URL: sigmoda-0.2.1.tar.gz
- Upload date:
- Size: 26.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bfaf02f3c497aeaa5cecdda668c8638f3cc5cb63d7d0c839853b1e10fe9175ef
|
|
| MD5 |
90a8b1af797c48b9c07c302c3db69840
|
|
| BLAKE2b-256 |
cbf441e514e39b0685ddeb8be654a73c7a180930cff4a402a4acda187dba2e1f
|
Provenance
The following attestation bundles were made for sigmoda-0.2.1.tar.gz:
Publisher:
publish.yml on seljawhari/sigmoda-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sigmoda-0.2.1.tar.gz -
Subject digest:
bfaf02f3c497aeaa5cecdda668c8638f3cc5cb63d7d0c839853b1e10fe9175ef - Sigstore transparency entry: 779261222
- Sigstore integration time:
-
Permalink:
seljawhari/sigmoda-python@51ef0ef33fd92954e64dc6b49a7822bfe6fa037c -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/seljawhari
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@51ef0ef33fd92954e64dc6b49a7822bfe6fa037c -
Trigger Event:
push
-
Statement type:
File details
Details for the file sigmoda-0.2.1-py3-none-any.whl.
File metadata
- Download URL: sigmoda-0.2.1-py3-none-any.whl
- Upload date:
- Size: 16.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
30175522b0b5e8c3ca0f890a0ee9836a7abcf83970f08da4caca67ea8b6fb007
|
|
| MD5 |
6e21f9d7ea7762c8dc03a7f67e5eeca3
|
|
| BLAKE2b-256 |
1a70641d4f97730d1a2ade89a5e902572567a9d7ddd95689675ac7c422eacbd0
|
Provenance
The following attestation bundles were made for sigmoda-0.2.1-py3-none-any.whl:
Publisher:
publish.yml on seljawhari/sigmoda-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sigmoda-0.2.1-py3-none-any.whl -
Subject digest:
30175522b0b5e8c3ca0f890a0ee9836a7abcf83970f08da4caca67ea8b6fb007 - Sigstore transparency entry: 779261227
- Sigstore integration time:
-
Permalink:
seljawhari/sigmoda-python@51ef0ef33fd92954e64dc6b49a7822bfe6fa037c -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/seljawhari
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@51ef0ef33fd92954e64dc6b49a7822bfe6fa037c -
Trigger Event:
push
-
Statement type: