Metadata-Version: 2.4
Name: risicare
Version: 0.1.11
Summary: AI agent observability and self-healing for Python — trace LLM calls, detect errors, get AI-generated fixes
Project-URL: Homepage, https://risicare.ai
Project-URL: Documentation, https://risicare.ai/docs
Project-URL: Repository, https://github.com/risicare/risicare-sdk
Project-URL: Changelog, https://github.com/risicare/risicare-sdk/blob/main/CHANGELOG.md
Project-URL: Bug Tracker, https://github.com/risicare/risicare-sdk/issues
Author-email: Risicare <founders@risicare.ai>
License: MIT
Keywords: agent,agentic-ai,ai,ai-agent,anthropic,claude,gemini,gpt,langchain,llm,llm-observability,monitoring,observability,openai,opentelemetry,self-healing,tracing
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT 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: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Topic :: System :: Monitoring
Requires-Python: >=3.10
Requires-Dist: httpx>=0.27.0
Requires-Dist: risicare-core>=0.1.0
Requires-Dist: wrapt>=1.16.0
Provides-Extra: all
Requires-Dist: autogen-agentchat>=0.4.0; extra == 'all'
Requires-Dist: boto3>=1.34.0; extra == 'all'
Requires-Dist: cerebras-cloud-sdk>=1.0.0; extra == 'all'
Requires-Dist: crewai>=0.50.0; extra == 'all'
Requires-Dist: dspy>=2.5.0; extra == 'all'
Requires-Dist: google-cloud-aiplatform>=1.40.0; extra == 'all'
Requires-Dist: groq>=0.4.0; extra == 'all'
Requires-Dist: huggingface-hub>=0.20.0; extra == 'all'
Requires-Dist: instructor>=1.0.0; extra == 'all'
Requires-Dist: langchain-core>=0.2.0; extra == 'all'
Requires-Dist: langgraph>=0.2.0; extra == 'all'
Requires-Dist: litellm>=1.30.0; extra == 'all'
Requires-Dist: llama-index-core>=0.10.20; extra == 'all'
Requires-Dist: ollama>=0.1.0; extra == 'all'
Requires-Dist: openai-agents>=0.1.0; extra == 'all'
Requires-Dist: opentelemetry-api>=1.20.0; extra == 'all'
Requires-Dist: opentelemetry-sdk>=1.20.0; extra == 'all'
Requires-Dist: pydantic-ai>=0.1.0; extra == 'all'
Requires-Dist: together>=1.0.0; extra == 'all'
Provides-Extra: autogen
Requires-Dist: autogen-agentchat>=0.4.0; extra == 'autogen'
Provides-Extra: bedrock
Requires-Dist: boto3>=1.34.0; extra == 'bedrock'
Provides-Extra: cerebras
Requires-Dist: cerebras-cloud-sdk>=1.0.0; extra == 'cerebras'
Provides-Extra: crewai
Requires-Dist: crewai>=0.50.0; extra == 'crewai'
Provides-Extra: dev
Requires-Dist: mypy>=1.8.0; extra == 'dev'
Requires-Dist: pytest-asyncio>=0.21.0; extra == 'dev'
Requires-Dist: pytest-cov>=4.1.0; extra == 'dev'
Requires-Dist: pytest>=7.4.0; extra == 'dev'
Requires-Dist: ruff>=0.1.0; extra == 'dev'
Provides-Extra: dspy
Requires-Dist: dspy>=2.5.0; extra == 'dspy'
Provides-Extra: frameworks
Requires-Dist: autogen-agentchat>=0.4.0; extra == 'frameworks'
Requires-Dist: crewai>=0.50.0; extra == 'frameworks'
Requires-Dist: dspy>=2.5.0; extra == 'frameworks'
Requires-Dist: instructor>=1.0.0; extra == 'frameworks'
Requires-Dist: langchain-core>=0.2.0; extra == 'frameworks'
Requires-Dist: langgraph>=0.2.0; extra == 'frameworks'
Requires-Dist: litellm>=1.30.0; extra == 'frameworks'
Requires-Dist: llama-index-core>=0.10.20; extra == 'frameworks'
Requires-Dist: openai-agents>=0.1.0; extra == 'frameworks'
Requires-Dist: pydantic-ai>=0.1.0; extra == 'frameworks'
Provides-Extra: groq
Requires-Dist: groq>=0.4.0; extra == 'groq'
Provides-Extra: huggingface
Requires-Dist: huggingface-hub>=0.20.0; extra == 'huggingface'
Provides-Extra: instructor
Requires-Dist: instructor>=1.0.0; extra == 'instructor'
Provides-Extra: langchain
Requires-Dist: langchain-core>=0.2.0; extra == 'langchain'
Provides-Extra: langgraph
Requires-Dist: langchain-core>=0.2.0; extra == 'langgraph'
Requires-Dist: langgraph>=0.2.0; extra == 'langgraph'
Provides-Extra: litellm
Requires-Dist: litellm>=1.30.0; extra == 'litellm'
Provides-Extra: llamaindex
Requires-Dist: llama-index-core>=0.10.20; extra == 'llamaindex'
Provides-Extra: ollama
Requires-Dist: ollama>=0.1.0; extra == 'ollama'
Provides-Extra: openai-agents
Requires-Dist: openai-agents>=0.1.0; extra == 'openai-agents'
Provides-Extra: otel
Requires-Dist: opentelemetry-api>=1.20.0; extra == 'otel'
Requires-Dist: opentelemetry-sdk>=1.20.0; extra == 'otel'
Provides-Extra: providers
Requires-Dist: boto3>=1.34.0; extra == 'providers'
Requires-Dist: cerebras-cloud-sdk>=1.0.0; extra == 'providers'
Requires-Dist: google-cloud-aiplatform>=1.40.0; extra == 'providers'
Requires-Dist: groq>=0.4.0; extra == 'providers'
Requires-Dist: huggingface-hub>=0.20.0; extra == 'providers'
Requires-Dist: ollama>=0.1.0; extra == 'providers'
Requires-Dist: together>=1.0.0; extra == 'providers'
Provides-Extra: pydantic-ai
Requires-Dist: pydantic-ai>=0.1.0; extra == 'pydantic-ai'
Provides-Extra: together
Requires-Dist: together>=1.0.0; extra == 'together'
Provides-Extra: vertexai
Requires-Dist: google-cloud-aiplatform>=1.40.0; extra == 'vertexai'
Description-Content-Type: text/markdown

# risicare

AI agent observability and self-healing for Python.

[![PyPI version](https://img.shields.io/pypi/v/risicare.svg)](https://pypi.org/project/risicare/)
[![Downloads](https://img.shields.io/pypi/dm/risicare.svg)](https://pypi.org/project/risicare/)
[![Python](https://img.shields.io/pypi/pyversions/risicare.svg)](https://pypi.org/project/risicare/)
[![License: MIT](https://img.shields.io/pypi/l/risicare.svg)](https://opensource.org/licenses/MIT)

Monitor your AI agents in production. Trace every LLM call, detect errors automatically, and get AI-generated fixes — with a single `init()`.

## Quickstart

```bash
pip install risicare
```

```python
import risicare
from openai import OpenAI

# Initialize — auto-instruments all detected LLM providers
risicare.init(
    api_key="rsk-...",
    endpoint="https://app.risicare.ai",
)

client = OpenAI()  # Automatically traced by risicare

@risicare.agent(name="research-agent")
def research(query: str) -> str:
    response = client.chat.completions.create(
        model="gpt-4",
        messages=[{"role": "user", "content": query}],
    )
    return response.choices[0].message.content

result = research("What is quantum computing?")
risicare.shutdown()
```

**That's it.** Your agent's LLM calls, latency, token usage, and costs now appear in the [Risicare dashboard](https://app.risicare.ai).

## Features

- **Auto-instrumentation** — Detects and patches LLM providers on `init()`, zero code changes
- **12 LLM providers** — OpenAI, Anthropic, Google, Mistral, Groq, Cohere, Together, Ollama, HuggingFace, Cerebras, Bedrock, Vertex AI
- **8 host-detected** — DeepSeek, xAI, Fireworks, Baseten, Novita, BytePlus, vLLM, and any OpenAI-compatible API via `base_url`
- **10 framework integrations** — LangChain, LangGraph, CrewAI, AutoGen, Instructor, LlamaIndex, LiteLLM, DSPy, Pydantic AI, OpenAI Agents
- **Self-healing** — Automatic error diagnosis and AI-generated fix suggestions
- **13 built-in scorers** — Faithfulness, relevance, toxicity, hallucination, and more
- **Streaming support** — Full streaming trace enrichment with token counts
- **OpenTelemetry bridge** — Compatible with existing OTel pipelines
- **Non-blocking** — All telemetry is async, never slows your app

## LLM Providers

```python
# Auto-patching (default) — detects installed providers automatically
risicare.init(api_key="rsk-...", endpoint="https://app.risicare.ai")

# Disable auto-patching if needed
risicare.init(api_key="rsk-...", endpoint="https://app.risicare.ai", auto_patch=False)
```

All 12 native providers:

| Provider | Package | Provider | Package |
|----------|---------|----------|---------|
| OpenAI | `openai` | Anthropic | `anthropic` |
| Google Gemini | `google-generativeai` | Mistral | `mistralai` |
| Cohere | `cohere` | Groq | `groq` |
| Together AI | `together` | Ollama | `ollama` |
| AWS Bedrock | `boto3` | Google Vertex AI | `google-cloud-aiplatform` |
| Cerebras | `cerebras-cloud-sdk` | HuggingFace | `huggingface-hub` |

Plus 8 auto-detected via OpenAI `base_url`: DeepSeek, xAI, Fireworks, Baseten, Novita, BytePlus, vLLM, and any OpenAI-compatible API.

## Framework Integrations

```bash
pip install risicare[langchain]    # LangChain + LangGraph
pip install risicare[crewai]       # CrewAI
pip install risicare[autogen]      # AutoGen
pip install risicare[instructor]   # Instructor
pip install risicare[litellm]      # LiteLLM
pip install risicare[dspy]         # DSPy
pip install risicare[pydantic-ai]  # Pydantic AI
pip install risicare[llamaindex]   # LlamaIndex
pip install risicare[all]          # Everything
```

## Core API

```python
import risicare

risicare.init(api_key, endpoint)            # Initialize (auto-patches providers)
risicare.shutdown(timeout_ms=5000)          # Flush pending spans and close

@risicare.agent(name="my-agent")            # Trace a function with agent identity
@risicare.trace                             # Trace any function (decorator or CM)
@risicare.session(session_id="sess-1")      # Group traces into user sessions

risicare.report_error(exception)            # Report caught errors for diagnosis
risicare.score(trace_id, "quality", 0.92)   # Record evaluation score [0.0-1.0]

risicare.enable() / risicare.disable()      # Runtime tracing control
risicare.is_enabled()                       # Check tracing status
```

## Decision Phases

Structure your traces to see how your agent thinks, decides, and acts:

```python
@risicare.agent(name="planner")
def plan(query: str):
    @risicare.trace_think
    def analyze():
        return llm.chat("Analyze this query...")

    @risicare.trace_decide
    def choose_action(analysis):
        return llm.chat("Pick the best action...")

    @risicare.trace_act
    def execute(action):
        return run_tool(action)

    analysis = analyze()
    action = choose_action(analysis)
    return execute(action)
```

## Self-Healing

When your agent fails, Risicare automatically:

1. **Classifies** the error (154 codes across TOOL, MEMORY, REASONING, OUTPUT, etc.)
2. **Diagnoses** the root cause using AI analysis
3. **Generates** a fix you can review and apply

```python
try:
    result = my_agent(user_input)
except Exception as e:
    risicare.report_error(e)  # Triggers automatic diagnosis pipeline
```

## Scoring & Evaluation

```python
# Custom scores
risicare.score(trace_id="tr-123", name="quality", value=0.92)

# 13 built-in scorers available in the dashboard:
# faithfulness, answer_relevance, context_precision, context_recall,
# hallucination, toxicity, bias, coherence, conciseness,
# fluency, g_eval, goal_accuracy, summarization
```

## OpenTelemetry

```bash
pip install risicare[otel]
```

```python
risicare.init(api_key="rsk-...", otel_bridge=True)
# Compatible with any OTel-instrumented application
```

## Requirements

- Python 3.10+

## Documentation

- [Full docs](https://risicare.ai/docs)
- [Quickstart guide](https://risicare.ai/docs/start/quickstart)
- [Python SDK reference](https://risicare.ai/docs/reference/sdk)
- [LLM providers](https://risicare.ai/docs/instrument/providers)
- [Self-healing](https://risicare.ai/docs/heal)
- [Evaluations](https://risicare.ai/docs/observe/evaluations)
- [JS/TS SDK](https://www.npmjs.com/package/risicare)

## License

[MIT](LICENSE)
