Skip to main content

Ciphyrs — observability for AI agents

PyPI Python License: MIT

See every agent, tool call and model call your application makes, as one connected graph. Built on OpenTelemetry, so the spans are standard OTLP and sit beside whatever tracing you already have — and your model calls stay yours, made directly against your provider.

Install

pip install ciphyrs

One command. OpenTelemetry and httpx come with it. Python 3.9 through 3.14, including the free-threaded 3.14 build (PEP 703).

No framework-specific install, and none exists. @agent and @tool wrap plain functions, so they work with any agent framework, or none.

Monitor your agents

import ciphyrs

ciphyrs.init(api_key="cyp_live_...", project="customer-support")

@ciphyrs.tool
def issue_refund(order: str, amount: float) -> dict:
    return payments.refund(order, amount)   # traced, and checked against policy

@ciphyrs.agent("BillingAgent", role="worker")
def billing(question: str) -> str:
    answer = my_model.generate(question)      # your model call, unchanged
    issue_refund(order="A-1041", amount=12.0)
    return answer

@ciphyrs.agent("RouterAgent", role="router")
def router(message: str) -> str:
    return billing(message)      # called INSIDE router -> a RouterAgent→BillingAgent edge

with ciphyrs.session("conv-7f3a"):            # ties one conversation together
    router("I was charged twice for order A-1041")

ciphyrs.shutdown()                            # flush; short-lived scripts only

That is the whole integration. Nesting is the topology: because billing was called inside router, the dashboard draws the edge. Both agents appear in the fleet at start-up — decorators register themselves, before any traffic.

init() Configures an OTLP exporter to Ciphyrs, or attaches to a TracerProvider you already have and leaves your exporters alone. Falls back to CIPHYRS_API_KEY, CIPHYRS_PROJECT, CIPHYRS_BASE_URL.
@agent One span per call, named for the agent. Everything it calls nests underneath.
@tool One span per tool call, with arguments and result. Also checked against policy before it runs — enforce inherits init(enforce=True), so a block verdict raises ToolBlocked and the function never executes. Pass enforce=False to trace only.
session() Tags every span inside with session.id.
init(agents=...) Declares the roster and the designed peer graph at boot, so the fleet is complete before the first request. Starts a heartbeat (default 60 s) so idle and dead are distinguishable.

Async is automatic — declare the function async def and the decorators install async wrappers. Every platform call they make runs off your event loop.

See the inputs and outputs

On by default. Pass capture_io=False to an individual @agent or @tool whose arguments must not be recorded; its spans still carry timing, nesting and errors.

Agents in separate processes

Already on. Outgoing HTTP requests carry the trace context, so an agent that calls another service shows up as one connected graph rather than two disconnected fleets. init(propagate=False) turns it off.

Model and framework internals

Ciphyrs is not in the path of your model call and does not want to be. For spans inside a framework or provider — retriever calls, per-node detail — add that framework's own OpenTelemetry instrumentation (OpenInference or OpenLLMetry). Its spans travel through the exporter init() already installed and nest inside your agent spans.

Is it actually on?

state = ciphyrs.selfcheck()
if state["problems"]:
    log.error("Ciphyrs is not live in this process: %s", state["problems"])

Reports what is genuinely running and names each problem in words. Makes no network call, so it is safe in a readiness probe.

Beyond tracing

The platform also enforces policy on agent messages, masks PII, and can quarantine a misbehaving agent from the dashboard. Tool checks, message checks and PII masking are all on by default once init() has an API key, which means text leaves your process to be evaluated. The documentation says what each one sends and how to turn it off (enforce=, guard_input=, guard_output=, pii=).

Release files for ciphyrs 3.7.0

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

Source distribution (sdist)

Source distribution for ciphyrs 3.7.0
File Size Uploaded
ciphyrs-3.7.0.tar.gz 207.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ciphyrs 3.7.0
File Interpreter ABI Platform
ciphyrs-3.7.0-py3-none-any.whl Python 3 none any Details

Total release size: 360.7 kB

Release files / ciphyrs-3.7.0.tar.gz

Download URL ciphyrs-3.7.0.tar.gz
Size 207.6 kB
Tags Source
SHA-256 checksum
How to use checksums
c1da6ef8b582fade69579b948871e9756b3df2194b32fbf2af501cb48bd6b131
BLAKE2b-256 checksum
How to use checksums
a4d1fe508e4511ad5fd2148b10d88ed04f036a0dba3d19fffa27de2bf1ecdaa4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.6 {"installer":{"name":"uv","version":"0.12.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / ciphyrs-3.7.0-py3-none-any.whl

Download URL ciphyrs-3.7.0-py3-none-any.whl
Size 153.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
91b073caa4d604121fc442b92614422da2a7c313858bbd88166042d643c18712
BLAKE2b-256 checksum
How to use checksums
f25b395310c688eb836844bb6e3f06dd4e077f59972c27df76de032fda2bfa73
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.6 {"installer":{"name":"uv","version":"0.12.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release history Release notifications | RSS feed

4.1.1

2 release files

4.1.0

2 release files

4.0.0

2 release files

This release

3.7.0 This release

2 release files

3.6.0

2 release files

3.5.0

2 release files

3.4.0

2 release files

3.3.1

2 release files

3.3.0

1 release file

3.1.0

2 release files

2.5.0

2 release files

2.4.0

2 release files

2.2.0

2 release files

2.1.0

2 release files

2.0.0

2 release files

1.1.1

2 release files

1.1.0

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