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_sendnotify_previewnotify_list_channelsnotify_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.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| agent_alerts-0.2.1.tar.gz | 17.0 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| agent_alerts-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 39.3 kB
Release files / agent_alerts-0.2.1.tar.gz
| Download URL | agent_alerts-0.2.1.tar.gz |
|---|---|
| Size | 17.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
84479b38fc852450c3762ca1c1ed788b02d9c4f07877403155b5824bdbf58381
|
|
BLAKE2b-256 checksum How to use checksums |
7ec4e7619b6ebe34d903f184ba8512345e091a1c605b1404a114fb2b8a8426b7
|
| 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.1-py3-none-any.whl
| Download URL | agent_alerts-0.2.1-py3-none-any.whl |
|---|---|
| Size | 22.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ff7da309285eea15633e008ed42c4fbe440e5fb9527504d6203a25aac8ee368a
|
|
BLAKE2b-256 checksum How to use checksums |
23de5e39c833049c30b772a34ef2a912ee08de12e7c4007ec414c0be50a8fa3a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.2
|
Security for agent-alerts 0.2.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.