Skip to main content

agent-alerts

Structured alert routing to humans and AI agents.

Install

pip install agent-alerts
pip install "agent-alerts[mcp]"

Python imports stay under alerts.

Quick Start

Send a simple alert directly to Telegram:

from alerts import send

send("Screen complete: 4 names passed", channel="telegram")

That reads TELEGRAM_BOT_TOKEN and TELEGRAM_CHAT_ID from your environment unless you pass token= and chat_id= explicitly.

Use AlertRouter for structured routing, thresholds, quiet hours, and agent follow-up:

from alerts import Alert, AlertCategory, AlertLevel, AlertRouter

router = AlertRouter(config_path="alerting.yaml")

result = router.send(
    Alert(
        title="Estimate revisions turning negative",
        body="NVDA revisions rolled over after guidance.",
        level=AlertLevel.HIGH,
        category=AlertCategory.SIGNAL,
        source="portfolio-system",
        source_type="estimate_revisions",
        metadata={"passed_count": 1},
    )
)

print(result.delivered_channels)
print(result.agent_dispatched)

Channels

Channel Purpose Required config
telegram Fast human notification TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_ID
imessage Local macOS delivery IMESSAGE_TARGET or channels.imessage.recipient; optional backend, service
email SMTP delivery smtp_host, smtp_port, from, to plus EMAIL_USERNAME, EMAIL_PASSWORD
agent Background agent analysis agent_name, dispatch_fn on router; optional notify

Named Channel Variants

Define multiple instances of the same channel type for different contexts:

channels:
  telegram-analyst:
    enabled: true
    bot_token_env: ANALYST_BOT_TOKEN
    chat_id_env: TELEGRAM_CHAT_ID
  telegram-finance:
    enabled: true
    bot_token_env: FINANCE_BOT_TOKEN
    chat_id_env: TELEGRAM_CHAT_ID
  agent-analyst:
    enabled: true
    agent_name: alerts-agent
    notify: telegram
  agent-finance:
    enabled: true
    agent_name: finance-agent
    notify: telegram

routing:
  critical: [telegram-analyst, agent-analyst]
  high: [telegram-analyst, agent-analyst]
  normal: [telegram-analyst]
  by_category:
    budget:
      high: [telegram-finance, agent-finance]
      normal: [telegram-finance]

Channel names are resolved by prefix: telegram-* → TelegramChannel, agent-* → AgentChannel, etc. Each variant reads its own credentials from channel_config. Plain names (telegram, agent) still work for backward compatibility.

Variants must be defined in channels: — undefined names are rejected to prevent typos silently falling back to default credentials.

Agent Channel

The agent channel dispatches alerts to an AI agent for analysis. The caller provides a dispatch_fn when constructing the router:

def my_dispatch(agent_name, task, notify, env, alert_context):
    """Called on a background thread by AgentChannel."""
    # invoke the agent, send notification, etc.
    ...

router = AlertRouter(
    config_path="alerting.yaml",
    agent_dispatch_fn=my_dispatch,
)

Config:

channels:
  agent:
    enabled: true
    agent_name: alerts-agent
    notify: telegram          # where to send agent findings

Independent Agent Rate Limiting

The agent channel can have its own rate budget, independent of human channels:

rate_limits:
  enabled: true
  global_max_per_hour: 20
  agent_max_per_hour: 5       # opt-in, 0 or absent = agent follows human limits

When human channels are rate-limited, the agent can still fire if under its own agent_max_per_hour budget. This prevents losing agent analysis during alert bursts.

Router Config

Example alerting.yaml:

schema_version: 1
on_config_error: use_last_good

channels:
  telegram:
    enabled: true
  agent:
    enabled: true
    agent_name: alerts-agent
    notify: telegram

routing:
  critical: [telegram, agent]
  high: [telegram, agent]
  normal: [telegram]
  low: []
  by_category:
    signal:
      critical: [telegram, agent]
    screen_result:
      high: [telegram, agent]

quiet_hours:
  enabled: true
  start: "22:00"
  end: "07:00"
  timezone: "America/New_York"
  per_channel:
    agent:
      enabled: false

rate_limits:
  enabled: true
  global_max_per_hour: 20
  agent_max_per_hour: 5

thresholds:
  _default:
    min_passed_count: 1
    default_level: normal
    max_per_hour: 3
  estimate_revisions:
    min_passed_count: 1
    level_rules:
      - when:
          passed_count_gte: 3
        level: critical

MCP Server

The package exposes an MCP server entry point:

alerts-mcp
python -m alerts.mcp_server

It provides four tools:

  • notify_send
  • notify_preview
  • notify_list_channels
  • notify_test_channel

notify_send always requires the confirmation token returned for the exact payload by notify_preview; environment variables and caller-supplied mode flags do not bypass that gate.

License

MIT

Metadata

Release files for agent-alerts 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for agent-alerts 0.2.0
File Size Uploaded
agent_alerts-0.2.0.tar.gz 17.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for agent-alerts 0.2.0
File Interpreter ABI Platform
agent_alerts-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 39.4 kB

Release files / agent_alerts-0.2.0.tar.gz

Download URL agent_alerts-0.2.0.tar.gz
Size 17.0 kB
Tags Source
SHA-256 checksum
How to use checksums
0f1248eb6b92d7278f1ca7b2dc25ac0ea0d5547d5c28acd989241f4f56406d21
BLAKE2b-256 checksum
How to use checksums
60268b7719d861ac969d40105947acbe91223b83ffc62965e9314d814cea7fc1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.2

Release files / agent_alerts-0.2.0-py3-none-any.whl

Download URL agent_alerts-0.2.0-py3-none-any.whl
Size 22.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
72b07109cfd89aab7d4a0b666cf1cd4b1ba35b3e73949af7784df0f03756c1be
BLAKE2b-256 checksum
How to use checksums
7d6546f508bdeb229af0acb500d2e33cefc8e534041a63c8004e816106b7affd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.2

Release history Release notifications | RSS feed

0.2.1

2 release files

This release

0.2.0 This release

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page