Metadata-Version: 2.3
Name: etaoi
Version: 0.0.13
Summary: Agent-native trace SDK for LangChain / LangGraph / deepagents (skeleton)
Keywords: langchain,langgraph,deepagents,tracing,observability,agents
Author: AAIRA / VIZ contributors
License: MIT
Classifier: Development Status :: 1 - Planning
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
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: Typing :: Typed
Requires-Dist: etaoi-schema>=0.3,<1
Requires-Dist: langchain-core>=1.0,<2
Requires-Dist: anyio>=4
Requires-Dist: msgpack>=1.1.2
Requires-Dist: tenacity>=9
Requires-Dist: websockets>=13,<17
Requires-Dist: livekit-agents>=1.2,<2 ; extra == 'livekit'
Requires-Dist: deepagents>=0.6.1,<0.7 ; extra == 'test'
Requires-Dist: langgraph>=1.1.0,<2 ; extra == 'test'
Requires-Dist: pytest>=8 ; extra == 'test'
Requires-Dist: pytest-asyncio>=0.24 ; extra == 'test'
Requires-Python: >=3.11
Project-URL: Homepage, https://github.com/etaoi/etaoi
Project-URL: Repository, https://github.com/etaoi/etaoi
Provides-Extra: livekit
Provides-Extra: test
Description-Content-Type: text/markdown

# etaoi

Python SDK for [VIZ](../../README.md) — an agent-native trace visualizer for the LangChain
ecosystem and LiveKit voice agents.

> **Status:** Skeleton. This package exists so CI is green from day one; the real
> implementation (LangChain `BaseCallbackHandler` adapter, WebSocket transport,
> MessagePack serialization, background flush) lands in Phase 2 of the
> [delivery roadmap](../../.planning/ROADMAP.md).

When complete, a developer will be able to:

```python
import etaoi

etaoi.attach(my_agent)  # streams telemetry to a local VIZ server
```

### Etaoi Cloud (project API keys)

To stream to the hosted ingest instead of a local self-host server, pass a
`host` plus your project's API keys:

```python
import etaoi

etaoi.attach(
    my_agent,
    host="wss://ingest.etaoi.dev",   # https:// → wss://, bare host → wss://, default path /ingest
    public_key="pk_live_…",
    secret_key="sk_live_…",
)
```

The keys are sent as `X-Etaoi-Public-Key` / `X-Etaoi-Secret-Key` request
headers on every (re)connect — and only when **both** are set, so self-host
stays key-less. You can also configure them via environment variables
(explicit params take precedence):

```bash
export ETAOI_HOST=ingest.etaoi.dev
export ETAOI_PUBLIC_KEY=pk_live_…
export ETAOI_SECRET_KEY=sk_live_…
```

```python
etaoi.attach(my_agent)  # picks up ETAOI_HOST / ETAOI_PUBLIC_KEY / ETAOI_SECRET_KEY
```

If the server rejects the keys (WS close code `4401`), the SDK logs a clear
error (`Etaoi: invalid API key — check public_key/secret_key`) and stops
reconnecting. It never raises into or blocks your agent.

For the wire schema this package depends on, see
[`etaoi-schema`](../etaoi-schema/python/README.md).
