arbis
Runtime workflow observation for agent systems.
Arbis instruments SDK boundaries, collects execution events, and infers workflow graphs from observed behavior. It reconstructs what happened during representative executions without requiring manual instrumentation of every call.
Install
pip install arbis
Quick Start
import arbis
# Start observing — instruments OpenAI, Anthropic, Gemini, Bedrock,
# OpenRouter, LiteLLM, LangChain, CrewAI, AutoGen, LlamaIndex, and more.
tracker = arbis.discover()
# ... run your agent code as normal ...
# Stop and get the inferred workflow graph.
tracker.stop()
graph = tracker.graph()
print(f"{len(graph.nodes)} nodes, {len(graph.edges)} edges")
That's it. No decorators required for basic observation — discover() patches supported SDK boundaries automatically.
What Gets Captured
| Layer | Automatic | Explicit API needed |
|---|---|---|
| LLM calls (input, output, tokens, tools, thinking) | Yes | — |
| Streaming (sync + async) | Yes | — |
| Tool call loops (ReAct) | Yes | — |
| Agent groups and handoffs | Yes | — |
| Multi-agent orchestration topology | Yes | — |
| Named workflows / agents | — | @arbis.workflow, @arbis.agent |
| Declared handoffs between known agents | — | arbis.step("handoff", input_data={"from": ..., "to": ...}) |
| Custom tool spans | — | @arbis.tool, tracker.tool_call(...) |
| Routing decisions | — | arbis.route(...) |
| Human-in-the-loop gates | — | arbis.human_input(...) |
Supported Providers & Frameworks
LLM Providers:
- OpenAI (Chat Completions, Responses API, Embeddings)
- OpenAI Agents SDK
- Anthropic Messages
- Google Gemini (
google.generativeaiandgoogle.genai) - AWS Bedrock (Converse / Converse Stream)
- OpenRouter
- LiteLLM
Orchestration Frameworks:
- LangChain / LangGraph
- CrewAI
- AutoGen
- LlamaIndex
Transport:
httpxandrequests(HTTP-level LLM detection and tool execution spans)
Explicit Context API
For richer graphs, add structure with decorators:
import arbis
tracker = arbis.discover()
@arbis.workflow("loan_processing")
def process_loan(application):
@arbis.agent("underwriter")
def underwrite():
# LLM calls here are automatically grouped under this agent
...
@arbis.tool("credit_check")
def check_credit(applicant_id):
# Tool execution captured as a first-class span
...
underwrite()
check_credit(application["id"])
process_loan(app)
tracker.stop()
Persistence
Save workflow runs for later analysis:
# SQLite (default file-based)
tracker = arbis.discover(store="workflows.sqlite")
# JSON directory
tracker = arbis.discover(store="output/", store_backend="json")
# PostgreSQL (requires: pip install 'arbis[postgres]')
tracker = arbis.discover(store="postgresql://user:pass@host/db", store_backend="postgres")
# HTTP ingest to the Arbis backend (minted workflow_id / agent_id on @workflow / @agent)
tracker = arbis.discover(store_backend="http", org_id=ORG_ID, project_id=PROJECT_ID)
See minted-identities.md for attaching dashboard UUIDs and for identity-force-mode ingest warnings.
Export to OpenTelemetry
Mirror runs to OpenTelemetry as traces (the workflow → agent → llm_call → tool
span tree, for Jaeger/Tempo/Honeycomb/Datadog) and/or metrics (token usage,
latency, call/error/retry counts) — independently of, or alongside, Arbis's own
stores. Requires pip install 'arbis[otel]'.
import arbis
# Arbis-owned OTLP export to a collector/Jaeger
tracker = arbis.discover(otel=True, otel_endpoint="localhost:4317")
# Add metrics, and/or plug into your existing OpenTelemetry providers
from opentelemetry import trace, metrics
tracker = arbis.discover(
otel=True, otel_metrics=True,
otel_tracer_provider=trace.get_tracer_provider(),
otel_meter_provider=metrics.get_meter_provider(),
)
Spans follow OTel GenAI semantic conventions plus an arbis.* namespace. See the
OpenTelemetry section of the guide
for setup, both export modes, and the attribute/metric reference.
Workflow Viewer (TUI)
Browse workflow definitions, run history, and agent topology in the terminal:
pip install textual rich
python -m arbis.viewer
The viewer launches with realistic demo data by default. To connect to a live PostgreSQL store:
# Set connection details
export ARBIS_POSTGRES_DSN="postgresql://user:pass@host/db"
export ARBIS_PROJECT_ID="your-project-uuid"
# Initialize the database (first time only)
psql -d arbis -f scripts/init_db.sql
# Or reset from scratch:
./scripts/reset_db.sh
# Launch
python -m arbis.viewer --store "$ARBIS_POSTGRES_DSN" --project-id "$ARBIS_PROJECT_ID"
Viewer keybindings:
| Key | Action |
|---|---|
| Arrow keys | Navigate |
| Enter | Select / drill in |
| Escape | Back |
d |
Diff workflow versions |
n |
Rename workflow or agent |
l |
View lineage link suggestions |
c |
Compliance breakdown |
r |
Refresh data |
q |
Quit |
Three-pane layout:
- Left: Workflow definitions (named or auto-discovered)
- Middle: Run history for the selected workflow
- Right: Run detail — agent groups, handoffs, tool calls, thinking traces, token usage, and event timeline
Workflow Diffing
Compare how workflows evolve over time:
import arbis
diff_result = arbis.diff(graph_a, graph_b)
# Returns structural fingerprint comparison, agent/tool changes, topology deltas
In the viewer, press d on a workflow with multiple versions to see agent prompt changes, topology edits, and performance deltas.
Optional Dependencies
pip install 'arbis[postgres]' # PostgreSQL storage backend
pip install 'arbis[otel]' # OpenTelemetry traces + metrics export
pip install 'arbis[dev]' # Development & testing
pip install 'arbis[arbis-litellm]' # LiteLLM support
pip install 'arbis[arbis-frameworks]' # LangChain + AutoGen
pip install 'arbis[arbis-crewai]' # CrewAI
pip install 'arbis[arbis-llamaindex]' # LlamaIndex
pip install 'arbis[arbis-bedrock]' # AWS Bedrock
pip install 'arbis[arbis-gemini]' # Google Gemini SDK
Documentation
All documentation is bundled inside the installed package. After pip install arbis:
from importlib.resources import files
# Get the path to bundled docs
docs = files("arbis") / "docs"
# Read a specific doc
print((docs / "guide.md").read_text())
Bundled docs:
| File | Contents |
|---|---|
docs/SKILL.md |
Complete API reference — 17 integration patterns covering every public API |
docs/guide.md |
Mental model, automatic vs explicit matrix, SDK coverage |
docs/architecture.md |
Module map, instrumentor details, inference pipeline |
docs/overview.md |
Overview: workflows, tools, supported SDKs/frameworks, and performance |
docs/viewer-guide.md |
TUI viewer usage, PostgreSQL setup, layout and navigation |
docs/streaming-runs.md |
HTTP streaming ingest + arbis.wait |
docs/minted-identities.md |
Minted workflow_id / agent_id, identity force mode, ingest 400s |
License
MIT. See LICENSE.
Metadata
Release files for arbis 0.4.5
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 |
|---|---|---|---|---|
| arbis-0.4.5.tar.gz | 245.1 kB | With provenance | Details for arbis-0.4.5.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| arbis-0.4.5-py3-none-any.whl | Python 3 | none | any | Details for arbis-0.4.5-py3-none-any.whl |
Total release size: 530.1 kB
Release files / arbis-0.4.5.tar.gz
| Download URL | arbis-0.4.5.tar.gz |
|---|---|
| Size | 245.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
893aac50ace075bbdbe341410d8470cec57a2efdb5b96e537179e33ea02f9eab
|
|
BLAKE2b-256 checksum How to use checksums |
729f2de155134afca8df41ad70ae37f3cc8705ba50f8ccfa099643953add7f36
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 Nov 9, 2026.
Transparency logRelease files / arbis-0.4.5-py3-none-any.whl
| Download URL | arbis-0.4.5-py3-none-any.whl |
|---|---|
| Size | 285.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b686c9e2002a77b4f8ba8d75a9346168bbfc2a7daec8e5e8ebada32313c3c139
|
|
BLAKE2b-256 checksum How to use checksums |
de77c012438c03a870ef5da3846d3104f3d83737d23fd8e944233c53b3df232a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 Nov 9, 2026.
Transparency logSecurity for arbis 0.4.5
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
Both files in this release have been uploaded with provenance metadata.
Attestation for arbis-0.4.5.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 Nov 9, 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.