voxeye
OpenTelemetry observability for LiveKit Agents. One
pip install, three lines of code, and every transcript, tool call, system prompt, span, and
per-component model identifier flows to a self-hosted retina ingest service.
No event listeners, no content buffering, no proprietary SDK lock-in — just OTel done right for voice agents.
Install
pip install voxeye
Use
from voxeye import Observability
from livekit.agents import AgentSession, JobContext
obs = Observability(api_key="sk_...", endpoint="https://your-retina-host") # module-level, pure
async def entrypoint(ctx: JobContext):
session = AgentSession(stt=..., llm=..., tts=...)
obs.attach(session, ctx) # sync, fail-open
await session.start(agent=MyAgent(), room=ctx.room) # your existing line
That's it. attach():
- Resets any prior
TracerProvider— LiveKit worker subprocesses are pooled and reused, so a provider from a previous job can leak into the next one. - Resolves
call_id = ctx.job.id(room.sidisn't available untilctx.connect()). - Resolves
agent_idviaagent_id=override →ctx.job.agent_name→"unknown"(the real label is reconciled server-side from theagent_sessionspan). - Introspects
session.stt/.llm/.tts/.vadfor{component}.provider/.model, set as resource attributes on every span — closing gaps LiveKit's plugin instrumentation leaves. - Installs an OTLP exporter (gzip, bearer auth) and an async shutdown flush.
- Fires a lifecycle ping to
/v1/callsfor instant call existence + crash detection.
Every step is wrapped fail-open: attach() never raises into your entrypoint.
Redaction (opt out of exporting sensitive data)
By default everything is exported. Pass a Redaction to stop specific data from ever
leaving the process — it's filtered client-side (sensitive resource attrs aren't set, and
span attributes are dropped at the export boundary; live spans are never mutated):
from voxeye import Observability, Redaction
obs = Observability(
api_key="sk_...",
redact=Redaction(
prompts=True, # drop the system prompt / instructions
model_names=True, # drop stt/llm/tts/vad provider+model (resource AND gen_ai.* attrs)
transcripts=True, # drop user transcripts + agent response text
tool_io=True, # drop function-tool arguments + outputs
attributes=("my.custom.attr",), # escape hatch: extra exact keys to drop
),
)
Spans, durations, token counts, span tree, and tool names still flow — only the fields
you flag are withheld. Each flag defaults to False (export).
Notes
endpointdefaults tohttp://localhost:8000(local retina). Point it at your host in prod.- Call
attach()once per entrypoint. Calling it twice replaces the provider mid-call. - Requires
livekit-agents >= 1.0.
Develop
uv sync --extra dev
uv run pytest
uv run ruff check src tests && uv run mypy src
Build & publish
uv build # → dist/voxeye-<version>-py3-none-any.whl + .tar.gz
uvx twine check dist/* # validate metadata + README rendering
pip install dist/voxeye-*.whl # try it in a clean env
Publishing to PyPI is automated via GitHub Actions trusted publishing (OIDC, no API
tokens) in .github/workflows/publish.yml — it runs on a published GitHub Release. Before
the first release: reserve the voxeye name on PyPI and add this repo as a
trusted publisher. Until then the workflow is
inert. To publish manually instead: uvx twine upload dist/*.
Metadata
Release files for voxeye 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| voxeye-0.1.0.tar.gz | 11.4 kB | With provenance | Details for voxeye-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| voxeye-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for voxeye-0.1.0-py3-none-any.whl |
Total release size: 24.9 kB
Release files / voxeye-0.1.0.tar.gz
| Download URL | voxeye-0.1.0.tar.gz |
|---|---|
| Size | 11.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
151ae142a46ce9cc9814fcf47594920511b6851f315235f3233ce6b37fa58474
|
|
BLAKE2b-256 checksum How to use checksums |
d078355bbb44948cdbff86e49b8d02bcd3eb0ad35ad14a1adc4a4937b77f4faf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 11, 2026.
Transparency logRelease files / voxeye-0.1.0-py3-none-any.whl
| Download URL | voxeye-0.1.0-py3-none-any.whl |
|---|---|
| Size | 13.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
48d6d4c042516eeaadbaf475646c274eb2d28ce0dfc00a59d7249f7c992ad34c
|
|
BLAKE2b-256 checksum How to use checksums |
a24cde3713d301fa64b8e5d18e9af65cd3fdb693434795813c600fcdca58473a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 11, 2026.
Transparency logSecurity for voxeye 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for voxeye-0.1.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 11, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.