Install
openclaw skills install @drandrewlaw/trio-visionTurn any live camera into a smart camera — describe what to watch for in plain English, get alerts in your chat when it happens. Ask questions about any live stream (YouTube, Twitch, security cameras, RTSP), set up continuous monitoring with custom conditions, or get periodic summaries of what's happening. No ML expertise required.
openclaw skills install @drandrewlaw/trio-visionStop getting dumb motion alerts for every shadow. Describe what actually matters in plain English — get notified only when it happens, right in your chat. Powered by Trio by MachineFi.
export TRIO_API_KEY=your_key_herehttps://trio.machinefi.com/apiAsk a yes/no question about what's currently visible on a stream. Costs 1 credit ($0.01).
curl -s -X POST "https://trio.machinefi.com/api/check-once" \
-H "Authorization: Bearer $TRIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"stream_url": "STREAM_URL_HERE",
"condition": "NATURAL_LANGUAGE_CONDITION_HERE"
}' | python3 -m json.tool
Optional parameters:
"include_frame": true — returns the analyzed frame as base64 image"input_mode": "clip" — analyze a short video clip instead of a single frame (better for motion detection)"clip_duration_seconds": 5 — clip length (1-10 seconds, only with clip/hybrid mode)Response fields:
triggered (boolean) — whether the condition matchedexplanation (string) — VLM's reasoning about what it seeslatency_ms — processing time in millisecondsInput mode guidance:
"frames" (default) for static objects: "Is there a car in the driveway?", "Is the door open?""clip" for motion/actions: "Is someone walking?", "Did a package get delivered?""hybrid" for maximum accuracy (costs more)Monitor a stream continuously and get alerted when a condition becomes true. Costs 2 credits/min ($0.02/min).
curl -s -X POST "https://trio.machinefi.com/api/live-monitor" \
-H "Authorization: Bearer $TRIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"stream_url": "STREAM_URL_HERE",
"condition": "NATURAL_LANGUAGE_CONDITION_HERE",
"interval_seconds": 10,
"monitor_duration_seconds": 600,
"max_triggers": 1
}' | python3 -m json.tool
Optional parameters:
"webhook_url": "https://your-server.com/webhook" — receive HTTP POST notifications on trigger"interval_seconds": 10 — check frequency (5-300 seconds)"monitor_duration_seconds": 600 — how long to monitor (min 5 seconds)"trigger_cooldown_seconds": 60 — minimum seconds between triggers"max_triggers": null — set to null for unlimited triggers"input_mode": "clip" — default for live-monitor, good for motionResponse: Returns a job_id. Use it to check status or cancel.
Delivery modes (automatic based on request):
webhook_url is set → events POST to your webhookAccept: text/event-stream header is set (no webhook) → SSE streamGET /jobs/{job_id}Get narrative summaries of what's happening on a stream at regular intervals. Costs 2 credits/min ($0.02/min).
curl -s -X POST "https://trio.machinefi.com/api/live-digest" \
-H "Authorization: Bearer $TRIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"stream_url": "STREAM_URL_HERE",
"window_minutes": 10,
"capture_interval_seconds": 60
}' | python3 -m json.tool
Optional parameters:
"window_minutes": 10 — summary window length (1-60 minutes)"capture_interval_seconds": 60 — frame capture frequency (10-300 seconds)"webhook_url": "https://..." — receive summaries via webhook"max_windows": 3 — number of summary windows before stopping"include_frames": true — embed frames in summariesResponse: Returns a job_id.
curl -s "https://trio.machinefi.com/api/jobs/JOB_ID_HERE" \
-H "Authorization: Bearer $TRIO_API_KEY" | python3 -m json.tool
Job statuses: pending, running, stopped, completed, failed
curl -s "https://trio.machinefi.com/api/jobs?limit=20&offset=0" \
-H "Authorization: Bearer $TRIO_API_KEY" | python3 -m json.tool
Optional query params: status=running, type=live-monitor, limit=20, offset=0
curl -s -X DELETE "https://trio.machinefi.com/api/jobs/JOB_ID_HERE" \
-H "Authorization: Bearer $TRIO_API_KEY" | python3 -m json.tool
triggered result and explanation to the userAll errors return this structure:
{
"error": {
"code": "ERROR_CODE",
"message": "Human-readable description",
"remediation": "Actionable fix suggestion"
}
}
Common error codes:
NOT_LIVESTREAM — URL is not a live stream. Confirm it's actively broadcasting.STREAM_FETCH_FAILED — Cannot reach the stream. Check URL and network.STREAM_OFFLINE — Stream exists but is offline. Wait for it to go live.MAX_JOBS_REACHED — Too many concurrent jobs. Cancel old ones with DELETE /jobs/{id}.If you get an error, always show the remediation field to the user — it contains actionable guidance.
| Action | Cost |
|---|---|
| Check once | $0.01 / request |
| Live monitor | $0.02 / minute |
| Live digest | $0.02 / minute |
Free tier: 100 credits ($1.00) on signup at https://console.machinefi.com
explanation field from check-once responses — it provides the VLM's reasoning.