> ## Documentation Index
> Fetch the complete documentation index at: https://docs.steadwing.com/llms.txt
> Use this file to discover all available pages before exploring further.

# CrewAI

> OpenAlerts monitors your CrewAI agents in real-time, detecting LLM errors, stuck agents, token blowups, and tool failures instantly with a live dashboard and Slack/Discord/webhook alerts.

[CrewAI](https://github.com/crewAIInc/crewAI) is an open-source AI agent framework for orchestrating role-playing autonomous agents that collaborate to solve complex tasks through structured crews, agents, and task assignments.

## How do I install CrewAI?

```bash theme={null} theme={null}
pip install crewai
```

See the [CrewAI documentation](https://docs.crewai.com) for details.

## How do I set up OpenAlerts for CrewAI?

AI agents fail silently — LLM errors, stuck sessions, token blowups — nobody knows until a user complains. [OpenAlerts](https://github.com/steadwing/openalerts) watches your agent in real-time and alerts you the moment something goes wrong.

### Install

```bash theme={null} theme={null}
pip install openalerts
```

Add `openalerts.init` before your crew runs — everything is monitored automatically from that point:

```python theme={null} theme={null}
import asyncio
import openalerts
from crewai import Agent, Task, Crew

async def main():
    await openalerts.init({"framework": "crewai"})

    researcher = Agent(
        role="Researcher",
        goal="Research topics thoroughly",
        backstory="You are an expert researcher.",
        llm="gpt-4o-mini",
    )
    task = Task(
        description="Research the benefits of AI monitoring",
        expected_output="A short summary",
        agent=researcher,
    )
    crew = Crew(agents=[researcher], tasks=[task])
    result = crew.kickoff()
    print(result)

asyncio.run(main())
```

The CrewAI adapter uses CrewAI's native event bus — no monkey-patching. Every crew run, agent execution, task step, tool call, and LLM call is tracked automatically with full session correlation (Crew = session, Agent = subagent, Task = step). Cleanup runs on exit. Events are persisted to `~/.openalerts/` as JSONL.

To receive alerts on Slack, Discord, or a custom webhook, pass channels in the init config:

```python theme={null} theme={null}
await openalerts.init({
    "channels": [
        {"type": "slack", "webhook_url": "https://hooks.slack.com/services/..."},
        {"type": "discord", "webhook_url": "https://discord.com/api/webhooks/..."},
        {"type": "webhook", "webhook_url": "https://your-server.com/alerts"},
    ]
})
```

Or set environment variables instead (no code changes needed):

```bash theme={null} theme={null}
OPENALERTS_SLACK_WEBHOOK_URL="https://hooks.slack.com/services/..."
OPENALERTS_DISCORD_WEBHOOK_URL="https://discord.com/api/webhooks/..."
OPENALERTS_WEBHOOK_URL="https://your-server.com/alerts"
```

### Alert Rules

7 rules run against every event in real-time. All thresholds and cooldowns are configurable.

| Rule                 | Watches for                             | Severity | Default threshold |
| -------------------- | --------------------------------------- | -------- | ----------------- |
| `llm-errors`         | LLM/agent failures in 1 min window      | ERROR    | 1 error           |
| `tool-errors`        | Tool execution failures in 1 min window | WARN     | 1 error           |
| `agent-stuck`        | Agent idle too long                     | WARN     | 2 min             |
| `token-limit`        | Token limit exceeded                    | ERROR    | -                 |
| `step-limit-warning` | Agent reaches 80% of max\_steps         | WARN     | -                 |
| `high-error-rate`    | Failure rate over last 20 calls         | ERROR    | 50%               |
| `subagent-errors`    | Subagent failures in 1 min window       | WARN     | 1 error           |

Every rule also accepts `enabled` (default `true`) and `cooldown_seconds` (default `900`).

To tune rules:

```python theme={null} theme={null}
await openalerts.init({
    "channels": [...],
    "rules": {
        "llm-errors": {"threshold": 5},
        "high-error-rate": {"enabled": False},
        "tool-errors": {"cooldown_seconds": 1800},
    },
    "cooldown_seconds": 900,
    "max_alerts_per_hour": 5,
})
```

Set `"quiet": True` for log-only mode (no alerts sent to channels).

### Dashboard

A real-time web dashboard starts automatically at [http://localhost:9464/openalerts](http://localhost:9464/openalerts):

| Tab          | What it shows                                                     |
| ------------ | ----------------------------------------------------------------- |
| **Activity** | Step-by-step execution timeline with tool calls, LLM usage, costs |
| **Health**   | Rule status, alert history, system stats                          |
| **Debug**    | State snapshot for troubleshooting                                |

By default, the dashboard runs in-process and stops when your agent exits. For a persistent dashboard, run `openalerts serve` in a separate terminal and disable the in-process one with `"dashboard": False`.

Need additional help? Please reach out to us at [hello@steadwing.com](mailto:hello@steadwing.com)
