Metadata-Version: 2.4
Name: evalytic-sdk
Version: 0.3.3
Summary: Zero-throw LLM observability SDK for OpenAI, Anthropic, Gemini, Groq, Mistral, and Cohere
License: MIT
Keywords: anthropic,gemini,llm,observability,openai,tracing
Requires-Python: >=3.10
Requires-Dist: httpx>=0.27.0
Provides-Extra: anthropic
Requires-Dist: anthropic>=0.20.0; extra == 'anthropic'
Provides-Extra: dev
Requires-Dist: mypy>=1.9.0; extra == 'dev'
Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
Requires-Dist: pytest-cov>=5.0.0; extra == 'dev'
Requires-Dist: pytest>=8.0.0; extra == 'dev'
Requires-Dist: ruff>=0.4.0; extra == 'dev'
Provides-Extra: gemini
Requires-Dist: google-generativeai>=0.7.0; extra == 'gemini'
Provides-Extra: openai
Requires-Dist: openai>=1.0.0; extra == 'openai'
Description-Content-Type: text/markdown

# Evalytic Python SDK

Zero-throw LLM observability — one line of code, full visibility into every call.

## Install

```bash
pip install evalytic-sdk
```

## Quickstart

Set your API key (get one at [evalytic-dashboard.vercel.app](https://evalytic-dashboard.vercel.app)):

```bash
export EVALYTIC_API_KEY=evl_...
```

```python
from evalytic import wrap
import anthropic

client = wrap(anthropic.Anthropic())
response = client.messages.create(...)  # all calls are automatically logged
```

That's it. No init, no config, no boilerplate.

## Per-user tracking

Pass a `user` ID to attribute calls to specific users. The dashboard groups calls by user and shows per-user cost, call count, and last-seen time.

```python
from evalytic import wrap
import anthropic

# Attach a user to this client — every call made with it is attributed to that user
client = wrap(anthropic.Anthropic(), user=request.user_id)
response = client.messages.create(...)
```

```python
# Attach extra context via metadata
client = wrap(anthropic.Anthropic(), user=request.user_id, metadata={"plan": "pro", "env": "production"})
```

## Supported providers

```python
from evalytic import wrap

# Anthropic
import anthropic
client = wrap(anthropic.Anthropic())

# OpenAI
from openai import OpenAI
client = wrap(OpenAI())

# Groq
from groq import Groq
client = wrap(Groq())

# Mistral
from mistralai import Mistral
client = wrap(Mistral(api_key="..."))

# Cohere
import cohere
client = wrap(cohere.Client("..."))

# Google Gemini (new SDK)
from google import genai
client = wrap(genai.Client(api_key="..."))

# Google Gemini (legacy SDK)
import google.generativeai as genai
model = wrap(genai.GenerativeModel("gemini-2.0-flash"))
```

## Server apps

For long-running servers, call `configure()` once at startup to control batching:

```python
import evalytic
evalytic.configure()  # reads EVALYTIC_API_KEY from env

# Then use wrap() anywhere
from evalytic import wrap
client = wrap(anthropic.Anthropic(), user=user_id)
```

## Config file

Create `.evalytic` in your project root as an alternative to environment variables:

```
EVALYTIC_API_KEY=evl_...
```

## Dashboard

[evalytic-dashboard.vercel.app](https://evalytic-dashboard.vercel.app)
