zespan-fastapi package adds ASGI middleware to your FastAPI application that automatically creates a trace context for every incoming HTTP request. You can then use the @observe_llm and @observe_span decorators to attach LLM call details and custom spans to that context without passing trace objects through your call stack.
Installation
zespan-fastapi requires httpx for flushing traces. Install it alongside the package if it is not already in your environment:
Adding the middleware
ImportZespanFastAPIMiddleware and ZespanConfig, then register the middleware with your FastAPI app using add_middleware.
ZespanConfig options
string
required
Your Zespan API key. Must start with
zsp_.string
default:"https://api.zespan.com"
Override the Zespan API base URL. Use this only if you are self-hosting the ingest endpoint.
boolean
default:"True"
When
False, the middleware passes all requests through without tracing. Useful for disabling tracing in test environments.float
default:"1.0"
Fraction of requests to trace, between
0.0 and 1.0. Set to 0.1 to trace 10% of requests in high-traffic environments.boolean
default:"False"
When
True, the request body is captured and attached to the trace. Enable only after reviewing your data retention policy — request bodies may contain sensitive data.boolean
default:"False"
When
True, the response body is captured and attached to the trace.list[str]
default:"[\"password\", \"token\", \"api_key\"]"
Field names whose values are redacted before any data is stored. Applied regardless of
capture_request_body.boolean
default:"False"
When
True, logs flush errors to stdout. Enable during integration testing.Tracing LLM calls with @observe_llm
Use the @observe_llm decorator on any async function that makes an LLM call. The decorator captures the model name, provider, duration, and token usage (extracted automatically from the response object if it has a .usage attribute).
@observe_llm parameters:
string
The model identifier to record on the span. Example:
"gpt-4o", "claude-sonnet-4-6".string
The provider name to record on the span. Example:
"openai", "anthropic".Tracing custom operations with @observe_span
Use @observe_span to instrument any async function as a named span. The decorator records the function name, duration, and status (success or error) as attributes on the current request’s trace context.
@observe_span parameters:
string
required
The span name. Appears as the operation label in the trace view.
string
default:"custom"
A hint for the span type. Common values:
"llm", "retriever", "custom".Setting custom attributes
Useset_attribute to attach arbitrary key-value data to the current request’s trace context. Call it from anywhere in your request handler — the attribute is included in the trace when it flushes.
Getting the current trace ID
Useget_current_trace_id() to retrieve the trace ID for the current request. This is useful for logging or for correlating Zespan data with your own observability stack.

