Metadata-Version: 2.4
Name: orbitrage
Version: 0.2.0
Summary: One-line observability + intelligent LLM routing for Python agents.
Author: Orbitrage
License: Apache-2.0
Project-URL: Homepage, https://orbitrage.xyz
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Topic :: System :: Monitoring
Requires-Python: >=3.10
Description-Content-Type: text/markdown
Requires-Dist: traceloop-sdk<1.0,>=0.50.0
Requires-Dist: opentelemetry-sdk>=1.27.0
Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.27.0
Provides-Extra: openai
Requires-Dist: openai>=1.0; extra == "openai"
Provides-Extra: anthropic
Requires-Dist: anthropic>=0.20; extra == "anthropic"
Provides-Extra: langchain
Requires-Dist: langchain-openai>=0.2; extra == "langchain"
Requires-Dist: langchain-core>=0.3; extra == "langchain"

# orbitrage

One-line observability + intelligent LLM routing for Python agents.

```python
import orbitrage
orbitrage.init("orb_xxx_yyy")          # one line. that's it.

# now any OpenAI / Anthropic / LangChain call you make is auto-traced
# AND can be auto-routed via:
from openai import OpenAI
client = OpenAI(base_url="https://orbitrage.xyz/api/v1", api_key="orb_xxx_yyy")
```

## What it does

- **Zero-latency observability**: non-blocking batch span export — your hot
  path stays at LLM-call speed, not LLM-call + telemetry RTT.
- **Auto-instruments** OpenAI, Anthropic, LangChain, LlamaIndex, etc. via
  OpenLLMetry under the hood.
- **One endpoint**: `https://orbitrage.xyz/api/telemetry` — auth via your
  Orbitrage API key.
- **Decorators** for grouping multi-step workflows:

```python
from orbitrage import workflow, task

@workflow("checkout_flow")
def checkout(user_id):
    plan = planner.invoke(...)
    out  = executor.invoke(...)
    return formatter.invoke(...)
```

## Install

```
pip install orbitrage
```

## Redacting prompts (opt-out)

Prompt + completion text is captured by default so it renders in the
Orbitrage dashboard. To redact content (token counts, costs, and routing
decisions still flow):

```python
orbitrage.init("orb_xxx", capture_content=False)
```

