Captura de cámara (agente)

OpenClaw soporta captura de cámara para flujos de trabajo del agente:

  • Nodo iOS (vinculado vía Gateway): captura una foto (jpg) o un clip de video corto (mp4, con audio opcional) mediante node.invoke.
  • Nodo Android (vinculado vía Gateway): captura una foto (jpg) o un clip de video corto (mp4, con audio opcional) mediante node.invoke.
  • App macOS (nodo vía Gateway): captura una foto (jpg) o un clip de video corto (mp4, con audio opcional) mediante node.invoke.

Todo el acceso a la cámara está protegido por ajustes controlados por el usuario.

Nodo iOS

Ajuste del usuario (activado por defecto)

  • Pestaña de Ajustes en iOS → CámaraPermitir cámara (camera.enabled)
    • Por defecto: activado (la clave ausente se trata como habilitada).
    • Cuando está desactivado: los comandos camera.* devuelven CAMERA_DISABLED.

Comandos (vía Gateway node.invoke)

  • camera.list

    • Payload de respuesta:
      • devices: array de { id, name, position, deviceType }
  • camera.snap

    • Parámetros:
      • facing: front|back (por defecto: front)
      • maxWidth: número (opcional; por defecto 1600 en el nodo iOS)
      • quality: 0..1 (opcional; por defecto 0.9)
      • format: actualmente jpg
      • delayMs: número (opcional; por defecto 0)
      • deviceId: string (opcional; de camera.list)
    • Payload de respuesta:
      • format: "jpg"
      • base64: "<...>"
      • width, height
    • Límite de payload: las fotos se recomprimen para mantener el payload base64 por debajo de 5 MB.
  • camera.clip

    • Parámetros:
      • facing: front|back (por defecto: front)
      • durationMs: número (por defecto 3000, limitado a un máximo de 60000)
      • includeAudio: booleano (por defecto true)
      • format: actualmente mp4
      • deviceId: string (opcional; de camera.list)
    • Payload de respuesta:
      • format: "mp4"
      • base64: "<...>"
      • durationMs
      • hasAudio

Requisito de primer plano

Al igual que canvas.*, el nodo iOS solo permite comandos camera.* en primer plano. Las invocaciones en segundo plano devuelven NODE_BACKGROUND_UNAVAILABLE.

Ayudante CLI (archivos temporales + MEDIA)

La forma más fácil de obtener adjuntos es mediante el ayudante CLI, que escribe el medio decodificado en un archivo temporal e imprime MEDIA:<ruta>.

Ejemplos:

openclaw nodes camera snap --node <id>               # por defecto: frontal + trasera (2 líneas MEDIA)
openclaw nodes camera snap --node <id> --facing front
openclaw nodes camera clip --node <id> --duration 3000
openclaw nodes camera clip --node <id> --no-audio

Notas:

  • nodes camera snap por defecto captura ambas orientaciones para darle al agente ambas vistas.
  • Los archivos de salida son temporales (en el directorio temporal del SO) a menos que crees tu propio wrapper.

Nodo Android

Ajuste del usuario en Android (activado por defecto)

  • Hoja de Ajustes de Android → CámaraPermitir cámara (camera.enabled)
    • Por defecto: activado (la clave ausente se trata como habilitada).
    • Cuando está desactivado: los comandos camera.* devuelven CAMERA_DISABLED.

Permisos

  • Android requiere permisos en tiempo de ejecución:
    • CAMERA tanto para camera.snap como para camera.clip.
    • RECORD_AUDIO para camera.clip cuando includeAudio=true.

Si faltan permisos, la app solicitará cuando sea posible; si se deniegan, las solicitudes camera.* fallan con un error *_PERMISSION_REQUIRED.

Requisito de primer plano en Android

Al igual que canvas.*, el nodo Android solo permite comandos camera.* en primer plano. Las invocaciones en segundo plano devuelven NODE_BACKGROUND_UNAVAILABLE.

Comandos Android (vía Gateway node.invoke)

  • camera.list
    • Payload de respuesta:
      • devices: array de { id, name, position, deviceType }

Límite de payload

Las fotos se recomprimen para mantener el payload base64 por debajo de 5 MB.

App macOS

Ajuste del usuario (desactivado por defecto)

La app complementaria de macOS expone una casilla:

  • Ajustes → General → Permitir cámara (openclaw.cameraEnabled)
    • Por defecto: desactivado
    • Cuando está desactivado: las solicitudes de cámara devuelven “Camera disabled by user”.

Ayudante CLI (node invoke)

Usa el CLI principal de openclaw para invocar comandos de cámara en el nodo macOS.

Ejemplos:

openclaw nodes camera list --node <id>            # listar ids de cámaras
openclaw nodes camera snap --node <id>            # imprime MEDIA:<ruta>
openclaw nodes camera snap --node <id> --max-width 1280
openclaw nodes camera snap --node <id> --delay-ms 2000
openclaw nodes camera snap --node <id> --device-id <id>
openclaw nodes camera clip --node <id> --duration 10s          # imprime MEDIA:<ruta>
openclaw nodes camera clip --node <id> --duration-ms 3000      # imprime MEDIA:<ruta> (flag legacy)
openclaw nodes camera clip --node <id> --device-id <id>
openclaw nodes camera clip --node <id> --no-audio

Notas:

  • openclaw nodes camera snap usa por defecto maxWidth=1600 a menos que se sobreescriba.
  • En macOS, camera.snap espera delayMs (por defecto 2000ms) tras el calentamiento/estabilización de exposición antes de capturar.
  • Los payloads de fotos se recomprimen para mantener el base64 por debajo de 5 MB.

Seguridad y límites prácticos

  • El acceso a la cámara y al micrófono activa los avisos habituales de permisos del SO (y requiere cadenas de uso en Info.plist).
  • Los clips de video están limitados (actualmente <= 60s) para evitar payloads de nodo sobredimensionados (overhead de base64 + límites de mensaje).

Video de pantalla en macOS (nivel SO)

Para video de pantalla (no de cámara), usa la app complementaria de macOS:

openclaw nodes screen record --node <id> --duration 10s --fps 15   # imprime MEDIA:<ruta>

Notas:

  • Requiere permiso de Grabación de pantalla en macOS (TCC).