Skip to main content

obyflow-python

Python instrumentation SDK for Obyflow — an AI-native, CLI-first observability platform for tracing, debugging, and understanding modern applications (LLM calls, vector-store queries, LangChain steps, and plain HTTP included).

Events are captured locally to SQLite (no external backend required) and can then be explored, correlated, and investigated with the obyflow CLI.

Installation

pip install obyflow-python

Requires Python ≥ 3.9.

Optional extras

pip install "obyflow-python[langchain]"   # LangChain callback instrumentation
pip install "obyflow-python[analysis]"    # scikit-learn/numpy-backed ML anomaly detection

Quick start

from obyflow import start
from obyflow.instrumentation.asgi import ObyflowASGIMiddleware

handle = start(service="checkout-api")
app.add_middleware(ObyflowASGIMiddleware, service="checkout-api", store=handle.store)

For synchronous WSGI apps (Flask, Django sync views), use ObyflowWSGIMiddleware instead:

from obyflow import start
from obyflow.instrumentation.wsgi import ObyflowWSGIMiddleware

handle = start(service="checkout-api")
app.wsgi_app = ObyflowWSGIMiddleware(app.wsgi_app, service="checkout-api", store=handle.store)

Unlike the Node SDK, which auto-instruments any http-based server via a runtime patch installed by start(), Python's inbound HTTP tracing requires this explicit middleware registration by design (Node's global http.Server.prototype.emit patch has no equivalent that's safe across Python's various sync/async server models).

start() auto-instruments outbound HTTP, including automatic cross-service trace propagation (x-obyflow-trace-id / x-obyflow-parent-span-id headers), so traces stay linked across service boundaries with no manual header wiring.

handle.instrument is pre-bound to service/store/deployment_id/resource_attributes, so vector-store and LangChain instrumentation don't need those threaded through every call site:

handle.instrument.pinecone(index)
handle.instrument.langchain()

For manual trace-context propagation, use with_trace_context as a scoped context manager instead of the lower-level set_trace_context/reset_trace_context pair:

from obyflow import TraceContext, with_trace_context

with with_trace_context(TraceContext(trace_id="trace_123", request_id="req_123")):
    ...

Then, from the same project:

npx obyflow init
npx obyflow traces
npx obyflow investigate --since 15m

What's included

  • Canonical event model — Event, EmbeddingAttributes, VectorOpAttributes, ChainAttributes, ToolCallAttributes, LlmCallAttributes, with validate_event/safe_validate_event
  • ASGI middleware (ObyflowASGIMiddleware) — automatic inbound request tracing for FastAPI/Starlette and other ASGI apps
  • WSGI middleware (ObyflowWSGIMiddleware) — automatic inbound request tracing for Flask and Django (sync) apps
  • Outbound HTTP instrumentation (instrument_outbound_http) — wraps outbound calls (requests/httpx) with automatic trace-context propagation
  • LangChain instrumentation (ObyflowLangChainCallbackHandler / create_langchain_callback_handler) — chain, tool, and LLM call events
  • Vector database instrumentation — Pinecone, Qdrant, Weaviate, Chroma, pgvector, and Milvus, plus OpenAI/Anthropic/Cohere embedding calls
  • Statistical anomaly detection (compute_baseline_stats, classify_severity) — plain mean/stddev z-scored deviation baselining; a separate, Python-only convenience toolkit, not a port of the TypeScript core's rolling/robust baseline engine (see "Anomaly detection: Node vs Python" below)
  • ML-based anomaly detection (detect_ml_anomalies, [analysis] extra) — scikit-learn-backed anomaly scoring over event duration/error-rate features; Python-exclusive, with no TypeScript/core equivalent

Anomaly detection: Node vs Python

Capability Node/CLI (packages/core) Python (obyflow.analysis)
Mean/stddev baselining Yes Yes
Median/MAD ("robust") baselining Yes No
Rolling time-windowed buckets Yes No
Deployment-aware bucketing Yes No
Configurable z-score threshold Yes No (fixed thresholds in classify_severity)
ML-based detection (IsolationForest) No Yes (detect_ml_anomalies, [analysis] extra)

obyflow.analysis.stats/obyflow.analysis.anomaly are a separate, Python-only convenience toolkit rather than a port of the CLI's packages/core/src/anomaly/baseline.ts engine. A Python caller of compute_baseline_stats should not expect the same rigor (robust/rolling/deployment-aware baselining) the CLI's investigate/ask/incident commands get from core.

  • Redaction (redaction.py) — scrubs sensitive fields (passwords, tokens, credit cards, SSNs, API keys) before events are stored
  • Resource attributes (resource_attributes.py) — every event is auto-tagged with hostname, PID, Python version, and the current git commit SHA (from CI env vars or a local git rev-parse HEAD), powering commit-based "what changed" correlation in the CLI with no extra setup
  • Trace context propagation (context.py) — get_active_trace_id, get_active_request_id, get_active_span_id, get_active_parent_span_id, get_active_trace_context, and the scoped with_trace_context context manager for manual instrumentation

Links

License

MIT © Anupam Kumar

Metadata

Release files for obyflow-python 1.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for obyflow-python 1.1.1
File Size Uploaded
obyflow_python-1.1.1.tar.gz 32.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for obyflow-python 1.1.1
File Interpreter ABI Platform
obyflow_python-1.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 58.8 kB

Release files / obyflow_python-1.1.1.tar.gz

Download URL obyflow_python-1.1.1.tar.gz
Size 32.0 kB
Tags Source
SHA-256 checksum
How to use checksums
d64fd1d04ccccbef2d21c663da729a934296ce79af1f08984d05ff5cbf622590
BLAKE2b-256 checksum
How to use checksums
24a2ed550e3964cd094a93c0b9a6f87f8f0a5cd84c195915618175208be38550
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.7

Release files / obyflow_python-1.1.1-py3-none-any.whl

Download URL obyflow_python-1.1.1-py3-none-any.whl
Size 26.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f612e3e0e2ab8252a9686ff2140ace23ad428b959cd99fc735d84878aaa2d0ce
BLAKE2b-256 checksum
How to use checksums
7559d329c3c5f40ae4323c0843d79871597e7063611e5ef558a05e0eed2ba783
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.7

Release history Release notifications | RSS feed

1.1.2

2 release files

This release

1.1.1 This release

2 release files

0.0.7

2 release files

0.0.6

2 release files

0.0.5

2 release files

0.0.4

2 release files

0.0.3

2 release files

0.0.2

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page