Skip to main content

Notifications & Messages

NeoMind's message system routes device alerts, rule triggers, AI Agent analysis results, and system events to the channels you configure. It supports 9 message channels (2 built-in + 7 external) with simultaneous multi-channel fan-out and per-channel message filtering.

The message system lives under Messages (bell icon) in the left nav. Two tabs: Messages (notification center, browse alert history) and Channels (channel configuration).

Supported Channels​

ChannelTypeUse CaseAuthDisable
ConsoleBuilt-inPrint to server log, debuggingNoneNo (built-in)
MemoryBuilt-inWrite to AI Agent long-term memory, lets Agent learn from alertsNoneNo (built-in)
WebhookGeneric HTTPForward to any HTTP endpoint (custom systems, IFTTT, n8n, AlertManager)URL + 5 auth typesYes
EmailSMTPStandard email notificationsSMTP username / passwordYes
TelegramBot APIReal-time alerts for global teamsBot TokenYes
WeComGroup BotChina enterprise collaborationGroup Bot Webhook KeyYes
DingTalkCustom BotChina enterprise collaborationAccess Token + signingYes
SlackIncoming WebhookInternational team collaborationWebhook URLYes
FeishuCustom BotChina enterprise collaborationHook ID + signingYes

NeoMind does not support SMS. For SMS alerts, use a Webhook channel to bridge to a third-party SMS gateway (e.g. Twilio, Alibaba Cloud SMS).

Interface Overview​

Messages Tab (Notification Center)​

Open the Messages page β€” the default view is the notification center:

Messages list β€” severity, status, category, source, actions

Each message contains:

FieldDescription
Severityinfo / warning / critical / emergency (color coded light β†’ dark)
TitleMessage title
BodyMessage content (click row to expand full content)
Categoryalert / system / business / notification + backend-extensible arbitrary categories
SourceTriggering source: device / rule / telemetry / schedule / llm / system
Statusactive / acknowledged / resolved / archived / false_positive
TimeCreated and last-updated timestamps
ActionsAcknowledge / Resolve / Archive / Delete

Filtering: Click Filter in the toolbar to open the filter Popover. Filter by severity (multi-select), status (multi-select), and category (multi-select). Active filters appear as chips in the toolbar.

Channels Tab (Channel Management)​

Switch to the Channels tab to see all channels:

Channels list β€” name, type, status, stats, actions

The top shows summary cards (Total channels / Enabled / Channel type count). Below is the channel list. Each channel card shows:

  • Name + type icon: Channel identity
  • Enable switch: Toggle channel on/off in one click
  • Test button: Inline test result (success / failure + reason)
  • Action menu: View / Edit / Configure Filter / Manage Recipients (Email only) / Enable | Disable / Delete

Configuring a Channel​

Click Create to open the full-screen channel editor:

Channel editor β€” left sidebar type picker, right config form (Webhook selected by default)

The editor uses a split-pane layout:

  • Left sidebar: Lists the 7 external channel types; click to switch
  • Right form: Shows config fields for the selected type

Built-in channels (Console, Memory) require no configuration and cannot be disabled or deleted.

Common Fields​

All external channels need:

FieldDescription
NameUnique identifier used by rules and Agents. Use lowercase-hyphenated names (e.g. ops-feishu)
EnabledWhether the channel is active. Disabled channels receive no messages

Webhook Channel​

The most flexible channel β€” bridges to any HTTP endpoint.

Webhook channel config β€” URL, method, auth type, timeout
FieldDescriptionExample
URLHTTP(S) endpoint receiving messageshttps://api.example.com/alerts
MethodHTTP method (default POST)POST / PUT
AuthenticationAuth type: none / bearer / basic / apikey / customSee table below
HeadersCustom request headers (used with custom auth){"X-Tenant": "factory1"}
Timeout (secs)HTTP timeout, default 30, max 30030

Auth types in detail:

TypeExtra FieldsUse Case
noneNonePublic endpoints, intranet without auth
bearerBearer TokenOAuth 2.0, JWT
basicUsername + PasswordHTTP Basic Auth
apikeyAPI Key + Header Name (default X-API-Key)Third-party API gateways
customCustom Headers key-value tableCustom signatures, multi-header combos

Email Channel​

Email channel config β€” SMTP server, port, from address, auth
FieldDescriptionExample
SMTP ServerSMTP server hostsmtp.gmail.com
SMTP PortPort (default 587, STARTTLS)465 (SSL) / 587 (STARTTLS)
UsernameSMTP login usernamealert@example.com
PasswordSMTP password or app-specific passwordβ€’β€’β€’β€’β€’β€’β€’β€’
From AddressSender address (usually same as Username)alert@example.com

Recipients are managed separately: After saving the Email channel, use Manage Recipients in the channel action menu to add/remove recipient addresses β€” no need to reopen the channel editor.

Telegram Channel​

Telegram channel config β€” Bot Token, Chat ID
FieldDescriptionHow to Get
Bot TokenTelegram Bot access tokenCreate a Bot via @BotFather, format 123456:ABC-DEF...
Chat IDConversation ID receiving messages (group or DM)Add the Bot to a group, then visit https://api.telegram.org/bot<TOKEN>/getUpdates to read it

DM Chat IDs are pure numbers (your user ID). Group Chat IDs typically start with - (e.g. -1001234567890).

WeCom Channel​

FieldDescriptionHow to Get
KeyThe key portion of the group bot Webhook URL (not the full URL)Group Settings β†’ Add Group Bot β†’ copy Webhook URL, take the value after key=

NeoMind internally reconstructs https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=<KEY>, so fill in only the Key.

DingTalk Channel​

FieldDescriptionHow to Get
Access TokenThe access_token portion of the group bot Webhook URLGroup Settings β†’ Smart Group Assistant β†’ Add Custom Bot β†’ copy Webhook URL, take the value after access_token=
Secret (optional)Signing secretBot security settings β†’ choose "Sign" β†’ copy the Secret. Strongly recommended β€” otherwise the bot can be invoked maliciously

When signing is enabled, NeoMind computes an HMAC-SHA256 signature and appends timestamp and sign to the URL per DingTalk protocol.

Slack Channel​

FieldDescriptionHow to Get
Webhook URLFull Slack Incoming Webhook URLhttps://api.slack.com/apps β†’ Create New App β†’ Incoming Webhooks β†’ enable β†’ copy URL

URL format: https://hooks.slack.com/services/T000/B000/XXXX.

Feishu Channel​

FieldDescriptionHow to Get
Hook IDThe hook_id portion of the bot Webhook URL (not the full URL)Group Settings β†’ Group Bots β†’ Add Custom Bot β†’ copy Webhook URL, take the UUID after open.feishu.cn/open-apis/bot/v2/hook/
Secret (optional)Signing secretBot security settings β†’ choose "Signature Verification" β†’ copy the Secret

When signing is enabled, NeoMind computes timestamp and sign fields per Feishu protocol and includes them in the request body.

Testing a Channel​

After saving, click Test in the channel list. NeoMind sends a test message and shows the result inline:

  • βœ… Success: HTTP status code or channel response
  • ❌ Failure: Error reason (connection timeout, auth failed, Chat ID not found, etc.)

Always Test before enabling in production to avoid silent alert failures.

Channel Filters​

Each channel can have its own message filter deciding which messages get forwarded. Click Configure Filter in the channel action menu to open the filter dialog:

Channel filter config β€” source types, categories, minimum severity

Filters have three groups:

1. Source Types​

Multi-select, deciding which triggering sources get forwarded:

SourceDescription
deviceDevice events (online / offline / data anomaly)
ruleRule engine triggers
telemetryTelemetry threshold alerts
scheduleScheduled task triggers
llmAI Agent / Chat triggers
systemSystem events (extension crashes, storage alerts)

Empty = receive all sources (default).

2. Categories​

Multi-select message categories:

  • alert β€” Alerts (device anomaly, threshold breach)
  • system β€” System (service status, extension events)
  • business β€” Business (orders, workflows)
  • notification β€” General notifications

Empty = receive all categories (default). The backend can extend with custom categories which will also appear here.

3. Minimum Severity​

Single-select dropdown, filtering out messages below the chosen level:

ValueSeverities Received
(empty)All (info / warning / critical / emergency)
infoAll
warningwarning / critical / emergency
criticalcritical / emergency
emergencyemergency only

Typical usage:

  • Email channel: min warning (filter out info noise)
  • Feishu / DingTalk group: min critical (only important alerts)
  • Webhook β†’ monitoring dashboard: All (preserve full data)

No filter configured = receive all messages. Newly created rule notifications enter all enabled channels by default; use filters for tiered routing.

Triggering Notifications​

Messages don't appear in isolation β€” they are triggered by other modules:

1. Rule Engine (Most Common)​

Configure a notify action in an Automation Rule:

{
"name": "AlertHighTemp",
"condition": {
"type": "comparison",
"source": "device:sensor-01:temperature",
"operator": ">",
"value": 30
},
"actions": [
{
"type": "notify",
"config": {
"title": "High Temperature Alert",
"message": "sensor-01 temperature {{value}}Β°C exceeded threshold 30Β°C",
"severity": "critical",
"category": "alert"
}
}
],
"trigger": "state_change",
"cooldown": 60
}

A notify action generates a message that enters all enabled channels β€” each channel's filter then decides whether to forward. So after creating a rule, make sure to configure filters on the channels that should carry it.

2. AI Agent​

Let an AI Agent decide whether to notify after analysis:

  • Free-mode Agent: Write in the prompt "notify the ops group via email when an anomaly is detected" β€” the Agent calls the message tool
  • Focused-mode Agent: Automatically decides whether data is anomalous and triggers alerts

3. AI Chat (Manual)​

Just say in Chat: "Send a Feishu message to the group telling them device 3 is offline" β€” the LLM invokes the message tool.

4. System Events​

Some system events (device offline, extension crash, low storage) automatically enter the notification center. You can toggle whether to forward them to external channels in Settings.

Message Lifecycle​

Messages have 5 statuses forming a complete handling workflow:

active β†’ acknowledged β†’ resolved β†’ archived
↓ ↓ ↓
└──────── false_positive β”€β”€β”€β”€β”˜
StatusDescriptionAction
ActiveNew message, pending handlingAutomatic
AcknowledgedOps staff have seen it and are working on itClick Acknowledge
ResolvedIssue fixedClick Resolve
ArchivedArchived, no longer activeClick Archive
False PositiveMarked as a false alarm, used to train rules / AgentsClick Mark as False Positive

Actions:

  • Single message: click the corresponding button on the message row
  • Bulk: filter a batch via the filter Popover, then bulk-act
  • Delete: Delete removes from the database (irreversible β€” prefer Archive)

Value of false-positive marking: Messages archived as false_positive are referenced by the rule engine and Agents for learning, helping reduce similar future false alarms.

CLI Management​

The NeoMind CLI provides message subcommands for managing messages and channels:

# List the last 20 messages
neomind message list --limit 20

# Create a message (for testing channels)
neomind message create --json '{
"title": "Test Alert",
"content": "Manually created test message",
"severity": "warning",
"category": "alert",
"source_type": "system"
}'

# List all channels
neomind message channels

# Create a channel
neomind message channel create --json '{
"name": "ops-feishu",
"channel_type": "feishu",
"config": {
"hook_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"secret": "secxxxxxxxx"
},
"enabled": true
}'

# Enable / disable a channel
neomind message channel enable ops-feishu
neomind message channel disable ops-feishu

# Test a channel (send a test message)
neomind message channel test ops-feishu

# Configure channel filter
neomind message channel filter ops-feishu --json '{
"source_types": ["rule", "device"],
"categories": ["alert"],
"min_severity": "critical"
}'

# Manage email recipients
neomind message channel recipients ops-email --add "ops@example.com,oncall@example.com"
neomind message channel recipients ops-email --list
neomind message channel recipients ops-email --remove "ops@example.com"

# Acknowledge / resolve / archive a message
neomind message acknowledge <message_id>
neomind message resolve <message_id>
neomind message archive <message_id>

# Delete a channel
neomind message channel delete ops-feishu

REST API​

All features are accessible via HTTP API (default port 9375):

# List messages
curl http://localhost:9375/api/messages?limit=20 \
-H "X-API-Key: $NEOMIND_API_KEY"

# Create a message
curl -X POST http://localhost:9375/api/messages \
-H "X-API-Key: $NEOMIND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "High Temperature Alert",
"content": "sensor-01 temperature 35Β°C exceeds threshold",
"severity": "critical",
"category": "alert",
"source_type": "rule"
}'

# List channels
curl http://localhost:9375/api/messages/channels \
-H "X-API-Key: $NEOMIND_API_KEY"

# Create a channel
curl -X POST http://localhost:9375/api/messages/channels \
-H "X-API-Key: $NEOMIND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "ops-webhook",
"channel_type": "webhook",
"config": {
"url": "https://api.example.com/alerts",
"method": "POST",
"_authType": "bearer",
"bearer_token": "xxx"
},
"enabled": true
}'

# Update a channel
curl -X PUT http://localhost:9375/api/messages/channels/ops-webhook \
-H "X-API-Key: $NEOMIND_API_KEY" \
-H "Content-Type: application/json" \
-d '{"enabled": false}'

# Test a channel
curl -X POST http://localhost:9375/api/messages/channels/ops-webhook/test \
-H "X-API-Key: $NEOMIND_API_KEY"

# Enable / disable
curl -X POST http://localhost:9375/api/messages/channels/ops-webhook/enable \
-H "X-API-Key: $NEOMIND_API_KEY"

# Configure filter
curl -X PUT http://localhost:9375/api/messages/channels/ops-webhook/filter \
-H "X-API-Key: $NEOMIND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"source_types": ["rule"],
"categories": ["alert"],
"min_severity": "warning"
}'

# View filter
curl http://localhost:9375/api/messages/channels/ops-webhook/filter \
-H "X-API-Key: $NEOMIND_API_KEY"

# Email recipients management
curl -X POST http://localhost:9375/api/messages/channels/ops-email/recipients \
-H "X-API-Key: $NEOMIND_API_KEY" \
-H "Content-Type: application/json" \
-d '{"recipients": ["ops@example.com", "oncall@example.com"]}'

curl http://localhost:9375/api/messages/channels/ops-email/recipients \
-H "X-API-Key: $NEOMIND_API_KEY"

# Change message status
curl -X POST http://localhost:9375/api/messages/<message_id>/acknowledge \
-H "X-API-Key: $NEOMIND_API_KEY"

# Delete a channel
curl -X DELETE http://localhost:9375/api/messages/channels/ops-webhook \
-H "X-API-Key: $NEOMIND_API_KEY"

Delivery Tracking & Retry​

NeoMind records the delivery status of each message on each channel:

  • Pending: Queued
  • Sent: Accepted by the channel
  • Delivered: Channel returned success
  • Failed: Channel returned an error or timed out

Retry & dedup:

  • Exponential backoff retry: up to 5 attempts on failure (1s β†’ 2s β†’ 4s β†’ 8s β†’ 16s)
  • Dedup window: the same (channel, title, content) is sent at most once within the default 60-second window, preventing notification storms from high-frequency rule triggers
  • Batch merging: multiple similar alerts can be merged into a digest (advanced)

Typical Scenarios​

Scenario 1: Multi-Channel Redundancy for Critical Alerts​

  • Email channel: filter min_severity = critical, recipients oncall@example.com
  • Feishu channel: filter min_severity = critical, signing enabled
  • Webhook channel: forward to AlertManager for secondary routing

When a critical alert fires, all three channels receive it β€” no missed alerts on single-point failure.

Scenario 2: Tiered Notifications​

ChannelFilterUse Case
Emailmin_severity = warningOps mailing list
Feishumin_severity = critical24/7 ops group
Slacksource_types = ["llm"]Agent analysis channel
Webhookcategories = ["alert"]Forward to monitoring dashboard

Scenario 3: In-App Only (Silent)​

  • Create no external channels; all messages default to the in-app notification center
  • Check history via the top-right bell icon in the Web UI
  • Suitable for dev / test environments

Best Practices​

  • Test before enabling: After creating a channel, always test to catch config errors before they silently swallow alerts
  • Multi-channel redundancy for critical alerts: Configure both email + Feishu / DingTalk to avoid single-point failure
  • Tiered filtering: Use channel filters for severity-based routing β€” Info goes only to in-app, Critical fans out to email / group notifications
  • Enable signing: DingTalk and Feishu bots should always enable signing to prevent malicious calls if the URL leaks
  • Sensible dedup: Set cooldown in rules to prevent sensor jitter storms; high-priority alerts may use a shorter dedup window
  • Mark false positives: Tag false alarms as false_positive to help rules and Agents learn
  • Manage recipients separately: Use Manage Recipients for Email channel add/remove β€” no need to reopen the channel editor
  • Bridge via Webhook for unified alerting: Point a Webhook channel at AlertManager, Home Assistant, n8n, etc., and let the platform handle secondary routing and silencing rules

Integration with Other Modules​

ModuleDescription
Automation Rulesnotify action triggers a message routed by channel filters
AI AgentAgent invokes the message tool after analysis
Device ManagementDevice online / offline / data anomalies trigger messages automatically
ExtensionsExtension crashes and other system events enter the notification center
Data PushData Push handles data streams; the message system handles alert streams

Next Steps​

  • Automation Rules β€” Rule notify action routed to notification channels
  • AI Agent β€” Agent decides whether to notify after analysis
  • Data Push β€” Push data to external systems (vs. the message system)
  • Extensions β€” Bridge to external systems via the Webhook channel

Last updated: 2026-06-16