Subscribes to MQTT. Drafts an incident summary on anomaly. POSTs to your incident webhook.
Long-running MQTT subscriber wired into a small LLM that drafts a two-paragraph incident summary on anomalies. Healthy readings drop at the conditional - the LLM is never invoked on noise.
No black box. Each step is a typed-frame node you can edit, monitor, and replace.
MQTT broker publishes a sensor reading. The streaming-mqtt-source emits a TextFrame with the topic, QoS, and retain flag attached.
The streaming-conditional matches anomaly markers (alarm/alert/anomaly true, or severity critical/high) on the JSON payload via regex.
Anomalies route to the streaming-prompt-template and a small LLM. Healthy readings drop at a streaming-filter sink - zero LLM cost.
The drafted incident summary fans out to streaming-webhook-response. Routes through STRONGLY_SERVICES (Slack, PagerDuty, ServiceNow) - no raw URLs in the workflow.
Streaming graph contract, observability, and cost discipline come standard. The agent ships with a full test suite that runs in CI on every node version bump.
aiomqtt-backed long-running subscriber. QoS 0/1/2, TLS via the addon, configurable client_id prefix. Topic patterns honour MQTT wildcards (+, #).
The LLM only runs on payloads matching the anomaly regex. Healthy heartbeat traffic - 99% of broker volume in most factory deployments - costs nothing.
When payloadFormat=json the source parses and re-serialises with sorted keys + tight separators, so downstream regex / context-projection nodes see a stable shape regardless of broker quirks.
streaming-conditional supports the full predicate vocabulary: regex, contains, gt/lt, in/not_in, dotted field paths. Swap the default regex for a typed predicate after lifting JSON onto a ContextFrame.
streaming-webhook-response routes every incident through your registered HTTP datasource. Slack incoming webhooks, PagerDuty events API, ServiceNow incident endpoints - same node, different datasource alias.
Topic / QoS / verdict / latency land on every span. Filter the canvas overlay by topic to find the device that's flapping or the policy gap that's letting noise through.
Every dependency is a registered Strongly service or a model you control. Swap any one of them in the install wizard. The graph stays intact.
The marketplace template is the graph. Every customisation below is a config change or a single-node addition - never a rewrite.
Edit mqtt_in.config.topics. One topic per line. Wildcards honoured.
Replace the regex with a typed predicate after lifting JSON onto a ContextFrame (gt / lt / in).
Edit prompt.config.template to inject your equipment list, tagging conventions, or runbook references.
Add streaming-conditional after the LLM to route by severity into different webhook nodes - critical to PagerDuty, high to Slack, low to email.
Add streaming-conversation-store between LLM and webhook so every drafted incident lands alongside the original sensor payload.
We don't leave until it runs. Talk to a forward-deployed engineer about deploying IoT Anomaly Responder into your environment with your STT, your LLM, your TTS, your data.
Schedule a Demo