Skip to main content

Quick Example

import videodb

conn = videodb.connect()
ws = conn.connect_websocket()
await ws.connect()

# Create detection rule (reusable)
event_id = conn.create_event(
    event_prompt="Detect intruder",
    label="security_alert"
)

# Wire to index with delivery method
index.create_alert(
    event_id=event_id,
    callback_url="https://your-backend.com/alerts",  # Webhook
    ws_connection_id=ws.connection_id                 # Real-time
)

# Alerts fire in <1 second
async for event in ws.stream():
    if event.get("channel") == "alert":
        print(f"ALERT: {event['data']['text']}")

Events vs Alerts

ConceptPurposeExample
EventWhat to detect (reusable rule)“Detect person without helmet”
AlertWhere to deliver (wiring)Webhook URL, WebSocket ID
# Events are reusable across streams
safety_event = conn.create_event(
    event_prompt="Detect safety violation",
    label="safety"
)

# Alerts wire events to specific indexes
for rtstream in streams:
    index = rtstream.get_scene_index(index_id)
    index.create_alert(event_id=safety_event)

Delivery Methods

MethodLatencyUse Case
WebSocketReal-timeDashboards, interactive apps
WebhookNear real-timeAutomation, integrations

WebSocket

ws = conn.connect_websocket()
await ws.connect()

async for event in ws.stream():
    channel = event.get("channel")
    # transcript, scene_index, audio_index, alert

Webhook

index.create_alert(
    event_id=event_id,
    callback_url="https://your-backend.com/alerts"
)
Payload:
{
  "event_label": "intrusion",
  "rtstream_id": "rts-xxx",
  "timestamp": 1710000012340,
  "data": {"text": "Person in restricted area"}
}

Latency Profile

OperationTypical Latency
Alert trigger< 1 second
Transcript event1-2 seconds
Visual index event2-5 seconds
Search query< 500ms

Delivery Guarantees

MethodGuaranteeHandle
WebSocketAt-most-onceClient reconnects
WebhookAt-least-onceIdempotency checks
# Webhook idempotency
@app.post("/webhooks")
async def handle(request):
    event = await request.json()
    if already_processed(event["event_id"]):
        return {"status": "ok"}
    process(event)

Event Channels

ChannelSourceContent
transcriptstart_transcript()Speech-to-text
scene_indexindex_visuals()Visual analysis
audio_indexindex_audio()Audio analysis
alertcreate_alert()Alert notifications

Best Practices

  1. Make events reusable - Define once, use across streams
  2. Be specific in prompts - “Detect person falling” beats “detect problems”
  3. Use both methods - WebSocket for UI, webhooks for automation
  4. Handle idempotency - Webhooks may deliver duplicates

What You Can Build


Next Steps