tiny camera worker
OpenAPI 3.1 draft · eyes for a tiny · openapi.json
Bind it
modify_ai worker: https://<this-site>/openapi.json
Set servers[0].variables.host to the real camera host before binding. Every operationId below mounts as a tool.
Tools
| tool | route | what |
|---|---|---|
| camera_health | GET /health | alive, cameras live/total, battery, thermal |
| camera_list | GET /cameras | roster by name · state · identity_drift |
| camera_snapshot | POST /cameras/{name}/snapshot | one still → hosted image_url (+ToF mm) |
| camera_clip | POST /cameras/{name}/clip | 1–30 s clip + keyframes the agent can see |
| camera_detect | POST /cameras/{name}/detect | FOMO boxes, labels, confidences, annotated frame |
| camera_stream_info | GET /cameras/{name}/stream | MJPEG/WebRTC URL + watchdog state |
| camera_settings_get / _set | GET·PATCH /cameras/{name}/settings | resolution, fps, exposure, flip, lamp, privacy shutter |
| camera_bind | POST /cameras/{name}/bind | pin a name to a device_id (clears drift, confirm:true) |
| sensor_distance | GET /sensors/distance | ToF mm + valid |
| sensor_imu | GET /sensors/imu | roll/pitch/yaw, moving |
Rules baked in
- Names, not indices. An OS camera index slides when a device is unplugged; the roster name is bound to a stable
device_id.identity_driftmakes the wrong-camera case visible and capture refuses (409) unless the caller admitsignore_identity_drift. - Three liveness rails:
stale(frame age),missing(not enumerated),drift(listed, different device answers). - Images are URLs. No base64 in JSON — the agent sees the hosted frame; the human gets the same link.
- Clips return keyframes — the model cannot watch video, so the still ladder is the truth.
- Privacy shutter is a setting only a human clears; while on, every capture is a 409.
frame_indexon every Frame so shots can be bound to an ECoT sidecar.
v0.1 · drafted by tiny for ./c² · tiny.technology/tiny