21/Documentation
Entrada de voz y Web Push
El micrófono en el editor y notificaciones cuando un agente está esperando una respuesta
Ambas funciones están desactivadas de forma predeterminada. Se puede habilitar un botón de micrófono en el compositor y notificaciones del navegador que se activan cuando un agente está esperando una entrada.
Entrada de voz (opcional)
Un botón de micrófono en el editor y un interruptor de manos libres en Ajustes → Voz. Pulse el botón, hable y la transcripción aparecerá en el cuadro de mensaje para que pueda revisarla y enviarla. Con el modo manos libres activado, se envía automáticamente por la misma ruta de respuesta protegida que sigue un mensaje escrito, nunca al margen de ella. El micrófono es el botón redondo al final de la fila mientras el cuadro esté vacío; el primer carácter que escriba lo convierte de nuevo en Enviar. Se dicta un mensaje o se escribe, de modo que hay una sola acción principal en lugar de dos compitiendo por el ancho del campo.
Mientras habla, una grabadora cubre todo el compositor, la barra y el cuadro, sin añadir altura, de modo que la pantalla superior no se desplaza. OK se sitúa donde estaba el micrófono y finaliza la grabación. La papelera en el extremo opuesto la descarta, y aún cancela mientras el fragmento se está transcribiendo. Una vez que termine de hablar, dos segundos de silencio finalizan la grabación automáticamente; un anillo se cierra alrededor de OK para indicarlo, y volver a hablar reinicia la cuenta. Antes de la primera palabra, nada la finaliza por sí solo.
No existe hasta que configure un proveedor. Ejecute collie stt setup, o configure Whistle (más abajo). No se muestra ningún botón, ningún audio sale del teléfono, no se guarda ninguna credencial, no se ejecuta ningún proceso secundario. Ausente, no deshabilitado. Cuatro proveedores:
| proveedor | qué es |
|---|---|
openai-compatible | Cualquier endpoint compatible con POST /audio/transcriptions: la API pública de OpenAI, un clon de Whisper en la nube o un motor local en la misma máquina, que es la opción sin salida de datos (abajo). |
codex | Toma prestado el binario de codex en el que ya confía para obtener un token de corta duración. Sin cuentas nuevas ni claves nuevas, pero con un endpoint privado, no soportado que incluye un paso de consentimiento: debe escribir yes en el terminal o pulsar Acepto en Ajustes (abajo). |
local-cli | Ejecuta un comando de transcripción ya presente en el host, como whisper-cli o muesli-cli, una vez por grabación, y lee la transcripción de su stdout. No se necesita servidor HTTP (abajo). |
whistle | El motor propio de Collie, Whistle. Sin claves ni comandos que configurar. Una grabación de hasta 4 minutos se envía como archivo WAV, y el audio permanece en el host. Un teléfono también puede ejecutar Whistle localmente, sin subidas. |
La configuración se realiza mediante la CLI por la misma razón que emparejamiento: esta superficie admite una credencial, por lo que corresponde al teclado del host. No hay ningún formulario web para una clave, un endpoint o un comando. Dos excepciones no requieren nada de eso. Whistle no guarda credenciales, no ejecuta comandos elegidos por usted y no envía audio fuera del host, por lo que un dispositivo con acceso de escritura puede configurarlo desde Ajustes (por qué). Y en Ajustes → Voz → Voz del host, un dispositivo con acceso de escritura puede alternar el host entre Whistle, la suscripción a ChatGPT (el proveedor codex) y Desactivado. ChatGPT solo está disponible tras el mismo consentimiento que muestra el terminal y tras pulsar en Acepto (abajo). Un proveedor configurado en el terminal con una clave o un comando, o uno definido por el entorno, se muestra allí y nunca se modifica desde la aplicación. Para esos dos, la página muestra los comandos que se deben ejecutar en el host, con Copiar y Comprobar de nuevo, y ningún formulario.
$ bin/collie stt setup
Which speech-to-text provider?
openai-compatible any endpoint that speaks POST /audio/transcriptions —
the public OpenAI API, or a local whisper.cpp / parakeet.cpp
server, which is the zero-egress choice and the one to prefer.
codex borrow your own `codex` sign-in. No new key, no new account —
and a private endpoint that may break without notice.
local-cli run a transcription command already on this machine, such as
whisper-cli or muesli-cli. Its stdout is the transcript.
provider [openai-compatible]:
The API base, INCLUDING its version prefix — the provider appends /audio/transcriptions.
local http://127.0.0.1:8080/v1 (whisper.cpp / parakeet.cpp — nothing leaves the host)
cloud https://api.openai.com/v1 (room audio leaves this machine)
base URL: http://127.0.0.1:8080/v1
The model the endpoint understands. Empty takes Collie's default, gpt-transcribe.
model [gpt-transcribe]: whisper-1
API key [none]:
The language you speak, as a two-letter ISO-639-1 code — en, de, tr, ja.
LEAVE IT EMPTY to let the model detect it, which is what you want if you mix languages in one
sentence. Name one only if short clips keep coming back in a language you did not speak: a few
seconds of accented audio is too little for the model to detect from, and it guesses.
spoken language [auto-detect]: en
✓ speech-to-text configured — /home/you/.local/state/collie/stt.json (owner-only)
Live immediately — no restart needed. The bridge re-reads this file per request.
Check it end to end with `collie stt test`.Cada pregunta anterior tiene un flag (--provider · --url · --model · --key · --lang), por lo que una ejecución de aprovisionamiento no necesita terminal. Dejar la clave vacía es un modo soportado: un endpoint sin clave se conecta sin ningún encabezado Authorization, en lugar de uno vacío.
Solo vale la pena configurar el idioma hablado ante un error concreto. Si se deja en blanco (el valor predeterminado), el modelo detecta el idioma automáticamente, lo cual es adecuado si se mezclan dos idiomas en una frase. Se debe configurar si los fragmentos cortos se transcriben repetidamente en un idioma no hablado: unos pocos segundos de audio con acento son insuficientes para detectarlo y el modelo hace una suposición. Un código de dos letras o una etiqueta regional que Collie simplifica (en-GB → en). Solo se aplica al proveedor openai-compatible; el endpoint codex no acepta idioma, y collie stt status lo indica explícitamente en lugar de omitirlo.
Una grabación larga obtiene un límite de tiempo largo. El tiempo asignado por el navegador para un fragmento depende de su tamaño, no es un número fijo: asume una subida constante de 256 kb/s y añade el límite de tiempo del propio proveedor del puente, permitiendo un poco menos de seis minutos para el máximo de 8 MiB. Un fragmento que Collie aceptó grabar es un fragmento que está dispuesto a esperar. Mientras la subida está en curso, Collie detiene el sondeo y no escala el aviso de conexión: el propio audio saturando la subida de un teléfono no es una caída del servicio y no debe reportarse como tal.
Una grabación se detiene a los cinco minutos. Un host que ejecuta Whistle admite cuatro, ya que el teléfono le envía un archivo WAV, que tiene aproximadamente cuatro veces el tamaño del fragmento comprimido. La grabadora muestra el límite aplicable.
¿Funcionó? stt test envía un quinto de segundo de silencio generado a través del proveedor real, una vez por cada contenedor que un teléfono puede grabar:
$ bin/collie stt test
provider: openai-compatible (http://127.0.0.1:8080/v1, model whisper-1, language en)
sending: 0.2 s of generated silence as audio/wav (the setup probe) … ✓ 214 ms
transcript: (empty) — expected from silence, and the empty answer still proves the pipeline.
sending: 0.2 s of generated silence as audio/webm;codecs=opus (Chrome, Android, Firefox) … ✓ 198 ms
sending: 0.2 s of generated silence as audio/mp4 (Safari, iOS) … ✓ 190 msCon Whistle en el host, stt test envía un solo fragmento, un archivo WAV a 16 kHz, e indica que se omiten webm y mp4, ya que el teléfono convierte su grabación a WAV a 16 kHz antes de enviarla a ese proveedor.
Una transcripción vacía se considera aprobada: el silencio se transcribe en nada y se valida el trayecto de ida y vuelta. Si falla, el error especifica el tipo (autenticación, endpoint, formato de respuesta). Luego se recarga Collie en el teléfono: aparecerá un micrófono junto al cuadro de mensaje. collie stt status indica qué está configurado y el origen de cada ajuste (el archivo o una variable de entorno con mayor prioridad); collie stt off elimina stt.json y el botón desaparece de nuevo, sin requerir reinicio en ningún caso.
Whistle: conversión de voz a texto en su teléfono o en su host
Whistle es un modelo de voz ligero desarrollado por Cactus Compute. El archivo ocupa 16.9 MB y la licencia es Apache-2.0. Admite inglés, alemán, francés, español, italiano, neerlandés y polaco, y detecta el idioma de forma automática. No requiere cuentas, claves ni programas adicionales. Collie incluye el motor que lo ejecuta, por lo que funciona en Linux, macOS, Windows y NixOS.
Whistle puede ejecutarse en dos ubicaciones. Se elige por cada teléfono.
| Motor | Dónde se procesan las palabras | Selecciónelo cuando |
|---|---|---|
| Host | En el equipo que ejecuta Collie, en un proceso secundario de corta duración del propio binario de Collie. | El teléfono es poco potente o antiguo. La grabación se sube como archivo WAV y un fragmento tarda uno o dos segundos. |
| Este teléfono | En el navegador del teléfono, dentro de un worker. | El teléfono es reciente. No se sube nada, por lo que el audio nunca sale del teléfono y funciona sin conexión una vez que el modelo está en el teléfono. |
Ambos motores leen el mismo modelo. El host conserva una copia. Un teléfono que desee ejecutar Whistle por sí mismo la copia del host, nunca de internet. Un fragmento tarda aproximadamente un segundo en un teléfono reciente.
Configurar desde Settings. Se necesita un dispositivo con acceso de escritura (un dispositivo con vinculado). Un dispositivo de solo lectura ve "Un dispositivo con acceso de escritura puede configurar esto." y no puede iniciar la descarga.
Ajustes → Voz es una página con dos páginas debajo:
- Voz sitúa primero lo que está en uso. La tarjeta superior lleva por título lo que está configurado: el comando que ejecuta el host, como
whisper-clicon Modelo ggml-base.bin y Comando propio en su host debajo; el modelo de un servicio de voz, comowhisper-large-v3con Un servicio de voz en api.groq.com; Whistle de Cactus Compute con Modelo ca52876 y En este teléfono o En su host; o Suscripción a ChatGPT (OpenAI) con Mediante Codex en su host. Si el comando es el antiguo envoltoriowhistle-stt, la tarjeta lo indica y ofrece Cambiar al Whistle integrado, lo que abre Voz del host. Luego el estado, que detalla de qué depende, por ejemplo "Listo. Whistle ca52876 está en este teléfono." o "No listo. La sesión de Codex está cerrada en su host.", adónde va el Audio y cómo fue Configurar (desde Settings, por qué dispositivo y cuándo, o en una terminal del host). Debajo de la tarjeta se encuentra el interruptor de manos libres. Todo lo demás se ubica tras una fila, Cambiar el funcionamiento de la voz. Mientras la voz funciona, esa fila permanece cerrada en cada visita. Cuando no funciona (nada configurado, un teléfono en pausa, una opción del host que no responde), permanece abierta y la tarjeta superior presenta una única acción: Configurar voz en este teléfono, Restaurar o Corregir. Al abrirse, muestra la elección propia de este teléfono, En este teléfono (marcada como Recomendado) o En su host (el equipo que ejecuta sus agentes), que se conserva por dispositivo. La opción en uso tiene un borde resaltado, un matiz y una insignia En uso, y alternar entre las dos no mueve nada en la página. Luego, una fila para lo que usa el host, una fila que abre las cinco opciones y una fila para el modelo. Cada opción cuenta con un botón de información que enumera cinco datos: adónde va el audio, si funciona sin conexión, cuánto cuesta, qué configuración requiere y qué tan rápida es. Tocar el botón de información no selecciona nada. - Voz del host enumera las cinco opciones del host. Whistle y su comando propio mantienen el audio en sus máquinas. Un servicio de voz y la suscripción a ChatGPT lo envían fuera de su host. Desactivado se ubica de forma independiente debajo de ellos. Un cambio aquí aplica a todos los dispositivos emparejados con el host. Una opción que envíe el audio más lejos que la que reemplaza solicita confirmación primero; el retroceso se envía de inmediato al tocar. Cada opción incluye Cómo configurar: pasos numerados, los comandos a copiar y los botones propios de la aplicación donde esta puede actuar. El siguiente paso a seguir está marcado como Siguiente. Solo se abre por sí solo en la opción en uso cuando esta no funciona. La opción en uso también indica lo que está configurado, por ejemplo "Configurado: whisper-cli, modelo ggml-base.bin".
- Modelo Whistle indica el creador, Cactus Compute, la licencia y enlaza a la página del modelo en Hugging Face. Muestra la copia en el host y la copia en este teléfono, cada una con su propio estado.
Para configurar Whistle:
- En un teléfono donde la función de voz aún no funcione, pulse Configurar voz en este teléfono en la tarjeta superior en Voz. Una sola pulsación completa todo el proceso: el host descarga el modelo si no lo tiene, este teléfono lo copia desde el host y se selecciona En este teléfono. Una barra muestra el progreso e indica qué paso se está ejecutando: "Descargando al host…" o "Copiando a este teléfono…". Si un paso falla, el proceso se detiene allí, indica el motivo y ofrece Reintentar. Un dispositivo de solo lectura puede copiar, ya que copiar es una lectura, pero no puede solicitar la descarga al host. Los mismos dos pasos también se encuentran en Cambiar el funcionamiento de la voz: Configurar (16.9 MB) en un teléfono sin copia, o Copiar a este teléfono cuando el host ya tiene el modelo.
- O abra Modelo Whistle y pulse Descargar al host (16.9 MB). Una barra muestra el progreso. Si falla, la página indica el motivo. Pulse Reintentar. Cuando el modelo esté disponible, la página muestra su versión (los primeros siete caracteres de la revisión de Hugging Face y un enlace a dicha revisión) y su tamaño. Detalles muestra una suma de comprobación corta y cuándo lo descargó el host.
- Para el dictado a través del host, abra Voz del host y elija Whistle en su host, luego Cambiar para todos los dispositivos. O abra Cómo configurar debajo de este y pulse Usar en el host. Si se configura otro proveedor en la terminal mediante una clave o un comando, la página lo muestra y no ofrece opciones. Los pasos de Whistle comienzan entonces con
collie stt offen el host, seguido decollie stt whistle --host. - En la copia de este teléfono, Modelo Whistle indica la versión y ofrece Eliminar de este teléfono. También indica si el navegador aceptó conservar la copia ("Conservado") o si puede eliminarla cuando quede poco espacio. Si el host obtiene más adelante un modelo más reciente, la copia lo indicará y ofrecerá Actualizar.
- En Voz, abra Cambiar el funcionamiento de la voz y elija En este teléfono o En su host. En este teléfono permanece desactivado hasta que el teléfono tenga una copia. En su host permanece desactivado mientras el host no tenga una opción de voz. La línea bajo la selección indica qué utiliza el host.
- Para eliminar el modelo del host, pulse Eliminar del host en Modelo Whistle y confirme. Si Whistle era el motor del host, la función de voz en el host se detiene hasta que se descargue de nuevo.
Quién realizó la modificación. Cuando un dispositivo emparejado cambia la opción del host desde Ajustes, el host registra el nombre de ese dispositivo y la hora. Voz y Voz del host muestran entonces "Modificado por última vez por Pixel 8", junto con la hora. Un cambio en la terminal borra este registro.
O configúrelo en la terminal.
$ bin/collie stt whistle # fetch the model once
$ bin/collie stt whistle --host # also make Whistle this host's engine
$ bin/collie stt whistle --from <path> # use a copy you already have, same hash check
$ bin/collie stt whistle --remove # remove the model, and the host engine if it is Whistle
$ bin/collie stt status # shows the model line--host solicita confirmación antes de reemplazar un proveedor configurado expresamente. --yes responde a esa pregunta para ejecuciones sin terminal. La confirmación se solicita antes de la descarga, por lo que una ejecución rechazada no descarga nada. --remove no altera proveedores de otro tipo. collie stt off elimina el proveedor e indica que el modelo se conserva. collie doctor advierte cuando el modelo en el host no coincide con el aceptado por esta versión. El motor queda activo de inmediato, sin reiniciar. Compruébelo con collie stt test.
Qué se descarga y desde dónde. El host obtiene whistle.cact desde una dirección fija de Hugging Face, sigue las redirecciones hacia su CDN (como máximo cinco, solo HTTPS y nunca hacia direcciones locales o privadas) y conserva el archivo solo si su sha256 coincide con el hash incluido en esta versión. Cualquier discrepancia elimina el archivo y reporta ambos hashes. La descarga está limitada a 32 MiB y tiene un tiempo límite de 10 minutos. El archivo se almacena en la carpeta whistle dentro del directorio de estado. El código del motor (aproximadamente 1 MB) forma parte de cada versión de Collie y proviene de los propios archivos de Collie.
Nada se descarga de forma automática. No ocurre al instalar, ni al actualizar, ni al seleccionar un motor. El modelo se descarga cuando un usuario pulsa Descargar al host, Configurar o ejecuta collie stt whistle. Un teléfono lo copia desde el host cuando su usuario pulsa Configurar, Copiar a este teléfono o Restaurar, y desde ningún otro lugar. El host envía el modelo a un máximo de dos teléfonos simultáneamente. Un tercero recibe el mensaje "inténtelo de nuevo en un momento".
Límites. El motor del host admite grabaciones de hasta 4 minutos, ya que un archivo WAV cuadruplica aproximadamente el tamaño del clip comprimido y el límite de subida se mantiene en 8 MiB. La grabadora muestra dicho límite. El motor del teléfono admite hasta 5 minutos. El proceso secundario del host tiene un tiempo límite equivalente a la mitad de la duración del clip, con un mínimo de 60 segundos y un máximo de 3 minutos; se ejecutan como máximo dos clips de forma simultánea en el host. El teléfono requiere espacio libre para el modelo (solicita el doble del tamaño del archivo) y una conexión segura (HTTPS, según proporciona tailscale serve).
Cuando el teléfono no puede procesarlo. Si En este teléfono falla en un clip, la pantalla de voz indica el motivo y ofrece Enviar al host, únicamente mientras el host disponga de un proveedor de voz operativo. El clip permanece en memoria, en estado de error, hasta que se pulse Enviar al host o se descarte. Collie nunca lo envía por su cuenta, dado que se seleccionó un motor concebido para que el audio no salga del dispositivo. Dos fallos del motor en una misma sesión desactivan En este teléfono hasta recargar la aplicación.
Cuando la copia del teléfono desaparece. Un navegador puede borrar la copia para liberar espacio. La preferencia se mantiene en este teléfono y el dictado se pausa: Voz indica "Dictation is paused" y ofrece Restaurar, que vuelve a copiar el modelo desde el host. El micrófono sigue grabando y el clip permanece en el teléfono con Enviar al host como se indicó antes. Collie no cambia al host por sí solo. Para usar el host, seleccione En su host.
Navegadores. Este teléfono requiere un navegador que asigne al speech worker su propia política de seguridad. Chrome en Android está probado. WebKit está probado en una compilación de WebKit. Safari en iPhone aún no se ha verificado en un dispositivo físico. Un navegador que no puede ejecutarlo muestra En este teléfono como desactivado con el motivo, y En su host permanece disponible.
Si utilizó el contenedor anterior. Las versiones anteriores de esta página mostraban un contenedor local-cli alrededor de un ejecutor nativo, ffmpeg y jq. Esa configuración está retirada, pero no se modifica ninguna que ya tenga instalada y sigue funcionando. Para migrar al motor integrado, ejecute bin/collie stt whistle --host --yes, o ejecute collie stt off primero y luego bin/collie stt whistle --host. También puede mantener el contenedor. Su archivo de modelo no se reutiliza de forma automática. Páselo con --from <path> para omitir la descarga.
El aspecto de seguridad de este motor, y por qué se permite la configuración desde Settings, se detalla en Seguridad y ADR 0096.
El soporte de contenedores depende del proveedor
El teléfono nunca graba WAV. Graba Opus en un contenedor WebM en Chrome, Android y Firefox, o AAC en un contenedor MP4 en Safari e iOS, y envía esos bytes tal cual. Un proveedor que transcribe WAV aún puede responder 400 a ambos, y cada dictado falla entonces con "refused" mientras stt test parece correcto. Por eso stt test envía los tres clips: el rechazo se detecta durante la configuración, no en el teléfono.
Un caso, verificado el 2026-09-01 con POST /v1/audio/transcriptions de OpenRouter:
| formato | mistralai/voxtral-small-24b-2507-stt | openai/whisper-large-v3-turbo |
|---|---|---|
| wav | sí | sí |
| ogg/opus | sí | sí |
| webm/opus | no, 400 | sí |
| mp4/m4a AAC | no, 400 | sí |
La solución alternativa es el modelo, no la clave: apunte la misma clave de OpenRouter a openai/whisper-large-v3-turbo, que acepta los cuatro.
bin/collie stt setup --provider openai-compatible \
--url https://openrouter.ai/api/v1 --model openai/whisper-large-v3-turbo --key <key>Una transcripción rechazada ahora indica el estado del upstream y el contenedor con el que se envió, de modo que el error en el teléfono muestra qué formato rechazó el proveedor. (#148, gracias @drewbitt)
Sin salida de datos: apunte a su propio motor
La razón por la que openai-compatible es el proveedor a elegir: asígnele una URL base local y ningún audio de la sala sale del host. Dos motores ofrecen un endpoint de transcripción compatible con OpenAI: el server integrado de whisper.cpp y mudler/parakeet.cpp (MIT). Compile o instale cualquiera de ellos según sus propias instrucciones, ejecútelo en loopback y apunte --url hacia él:
bin/collie stt setup --provider openai-compatible --url http://127.0.0.1:8080/v1Esa es toda la integración: Collie no tiene preferencia sobre qué motor responde.
Voxtral de Mistral no necesita soporte propio, y tampoco nada más que use este contrato; ese es el propósito de la unión. vLLM sirve los modelos abiertos Voxtral en /v1/audio/transcriptions, por lo que uno local es el mismo --url que cualquier otro motor. Los modelos alojados son la misma solicitud en la base propia de Mistral:
bin/collie stt setup --provider openai-compatible \
--url https://api.mistral.ai/v1 --model voxtral-mini-latest --key <key> --lang enVoxtral Mini Transcribe cubre 13 idiomas y acepta el mismo campo ISO-639-1 language que Collie ya envía. Pruébelo con collie stt test antes de confiar en él: "compatible con OpenAI" es una afirmación que cada endpoint hace por sí mismo, y ese verbo existe para verificarlo.
El proveedor codex: lo que se acepta
collie stt setup --provider codex imprime un bloque de consentimiento y se detiene hasta que se escribe yes, porque la realidad es esta: las grabaciones van a un endpoint de ChatGPT no documentado y sin soporte autorizado mediante el inicio de sesión de a su, por lo que la cuenta de ChatGPT asume el límite de velocidad y el riesgo de suspensión, y puede dejar de funcionar sin previo aviso.
Collie consulta a ese endpoint primero bajo su propio nombre. Solo si se rechaza la identidad real, recurre a las cabeceras de Codex CLI; y ese mecanismo de reserva queda registrado en la configuración, en un término que collie stt status le muestra. Collie nunca lee ni almacena ~/.codex/auth.json; el binario en el que ya confía sigue siendo lo único que interactúa con él.
También puede seleccionarlo en Settings. Abra Ajustes → Voz → Voz del host en un dispositivo con acceso de escritura. La página muestra lo que el host utiliza actualmente. Para la suscripción a ChatGPT también muestra la identidad registrada: honest, o codex-cli cuando se requirió el método de reserva. La fila Suscripción a ChatGPT solo está disponible cuando codex está instalado en el host y la sesión está iniciada con ChatGPT. Collie consulta a codex login status para verificarlo. De lo contrario, la fila explica el motivo en una sola frase, y su Cómo configurar marca el siguiente paso: instalar Codex en el host, iniciar sesión con codex login, y luego pulsar Usar suscripción a ChatGPT. Al pulsar la fila, una hoja muestra el mismo consentimiento, palabra por palabra, debajo de una línea que indica que el cambio afecta a todos los dispositivos emparejados con el host. No se envía nada al host hasta que pulse Acepto. Luego, el host ejecuta la misma comprobación que collie stt setup, primero la identidad real, y escribe la misma configuración. Si la comprobación falla, no se escribe nada y la hoja indica el motivo. Desactivado en la misma página elimina el proveedor. La terminal sigue funcionando de la misma manera.
Ejecutar un comando propio: el proveedor local-cli
local-cli ejecuta un comando de transcripción ya disponible, una vez por grabación, sin servidor HTTP intermedio:
bin/collie stt setup --provider local-cli \
--command /Applications/Muesli.app/Contents/MacOS/muesli-cli --args transcribe
bin/collie stt testCollie escribe la grabación en un archivo temporal privado y ejecuta <command> [args…] <file>. La ruta del archivo es siempre el último argumento. El stdout del comando, recortado, es la transcripción.
| ajuste | flag | variable de entorno | qué es |
|---|---|---|---|
command | --command | COLLIE_STT_COMMAND | Una ruta absoluta o un nombre en PATH. |
args | --args | ninguno | Los argumentos antes de la ruta del archivo. |
Un nombre simple se busca al ejecutar setup, y se guarda la ruta completa. El servicio se ejecuta con un PATH corto, por lo que un nombre que su shell encuentre podría no resolverse allí. Se rechaza una ruta relativa como ./whisper-cli.
--args acepta palabras separadas por espacios. Ningún shell las lee, por lo que las comillas se conservan tal como se escriben. Un argumento con un espacio requiere el formato JSON:
bin/collie stt setup --provider local-cli --command whisper-cli \
--args '["-m", "/srv/my models/ggml-base.bin", "-nt"]'Requisitos del comando:
- Ser un archivo regular que su usuario pueda ejecutar. Un enlace simbólico a uno es válido, ya que Collie lo sigue.
collie stt setuprechaza cualquier otra cosa, ycollie stt statusindica el error. - Finalizar con estado 0 e imprimir la transcripción en stdout. Cualquier otro resultado hace fallar el dictado.
- Finalizar dentro de 60 segundos. Luego Collie lo finaliza, junto con cada proceso que haya iniciado, mediante SIGKILL.
- Imprimir como máximo 256 KiB en stdout. Collie lo finaliza en cuanto imprima más.
- No dejar nada en ejecución. Cuando el comando finaliza, Collie termina cualquier proceso iniciado por este que aún permanezca. Un proceso auxiliar que deba mantenerse activo debe iniciar su propia sesión, por ejemplo con
setsid.
En Windows, Collie termina todo el árbol de procesos del comando en los mismos momentos, y tras una salida limpia finaliza cualquier proceso iniciado por el comando que aún siga en ejecución. Queda un caso: un proceso iniciado por un asistente que ya haya finalizado puede sobrevivir al comando.
Como máximo dos dictados ejecutan el comando al mismo tiempo. Un tercero recibe la misma respuesta de "ocupado" ya conocida por el teléfono, y Collie no inicia nada para él.
Un stdout vacío representa un error en el teléfono, ya que no hay nada que colocar en el campo. collie stt test lo cuenta como correcto, dado que sus fragmentos son silencio.
Nota. El comando se ejecuta con el propio usuario del puente, con los permisos de dicho usuario, una vez por dictado. No recibe shell, ni stdin, ni la variable de entorno COLLIE_*. Su stderr nunca se lee, y el teléfono nunca ve la línea de comandos ni una ruta, solo que el comando falló y su estado de salida.El archivo temporal reside en una carpeta que solo su usuario puede abrir, y Collie lo elimina después de cada ejecución. Si el puente se cerró forzosamente durante la ejecución, el siguiente inicio del puente elimina dichas carpetas cuando tienen una hora de antigüedad. El destino posterior del audio depende del comando: un motor local lo mantiene en el host.
El razonamiento detrás de todo lo anterior (por qué se rechazó dos veces, qué cambió y por qué la unión tiene esta forma) está en ADR 0029.
Web Push (opcional)
Desactivado por defecto. La configuración requiere tres pasos. La biblioteca del remitente (web-push) se incluye como dependencia opcional durante la compilación:
collie push-keys # 1. generate + write the VAPID keys
collie restart # 2. Collie reads them at start
# 3. on your phone: Settings → AlertsEl comando push-keys genera el par de claves y escribe COLLIE_VAPID_PUBLIC y COLLIE_VAPID_PRIVATE con permisos de archivo 600 en el .env activo, que es ~/.config/collie/.env en una instalación binaria o el ubicado en el directorio de configuración de plugins de Herdr en una instalación de Herdr.
Pase un URI de contacto como argumento para definir la notificación de asunto de RFC 8292:
collie push-keys mailto:you@example.comEn instalaciones gestionadas por Herdr, ambos pasos están disponibles como acciones (herdr plugin action invoke push-keys --plugin herdr.collie y restart). Las acciones de Herdr no aceptan argumentos posicionales, por lo que definir un asunto requiere ejecutar el comando directamente en la shell.
Detalles del manejo de claves:
El comando no sobrescribe las claves existentes a menos que se pase --force. Reemplazar las claves invalida todas las suscripciones actuales, lo que exige que cada dispositivo se vuelva a suscribir antes de poder recibir notificaciones de nuevo. Proporcionar un argumento de asunto en una configuración existente solo actualiza la dirección de contacto y conserva las claves actuales.
Nota. En versiones de Herdr anteriores a 0.8.0, las acciones permanecen fijadas al conjunto almacenado en caché durante la instalación inicial del plugin (ADR 0006). Las accionespush-keysypush-testno aparecerán hasta que se ejecuteherdr plugin install. Ejecutebash scripts/collie-ctl.sh push-keysdirectamente en su lugar. El script contenedor pasa el comando directamente al binario.
Pruebe la ruta de entrega en todos los dispositivos suscritos:
collie push-test # or: push-test "Title" "Body"La entrega tarda entre uno y dos segundos. Si el comando indica que push está desactivado, reinicie el servicio para que cargue las claves generadas. Si indica que no hay dispositivos suscritos, complete el paso 3 en el navegador del teléfono.
Web Push requiere un contexto seguro (HTTPS). Esto lo proporciona tailscale serve (certificados de MagicDNS) o un proxy inverso externo que termine TLS (Variante C). Las configuraciones HTTP simples (COLLIE_SERVE_MODE=http) carecen de un contexto seguro y el navegador desactiva los controles de suscripción en Settings.
Collie envía notificaciones cuando un agente entra en el estado blocked o done, colocando el mensaje del agente en el cuerpo. Al seleccionar la notificación se navega directamente a ese agente en la interfaz web.
Qué alertas envía Collie
Cinco tipos, cada uno con su propio interruptor en Configuración → Alertas → Notificar cuando.
| Alerta | Se activa cuando | Predeterminado |
|---|---|---|
| Requiere intervención | un agente está esperando una respuesta | activado |
| Completado | un agente completa su tarea | desactivado |
| Actualizaciones de la aplicación | hay disponible una versión más reciente de Collie | activado |
| La carga de la máquina se mantiene alta | la CPU, la memoria o el disco más lleno de una máquina se mantienen por encima de la regla establecida | activado |
| Caché a punto de enfriarse | la caché de prompts de un panel caduca en unos cinco minutos | desactivado |
Finished se activa cuando un agente pasa de estar trabajando a estar inactivo, por lo que un agente que se interrumpe también se considera finalizado.
La carga de la máquina no envía nada hasta que se define una regla en la página de la máquina. El interruptor desactiva todas las reglas a la vez. Se envía una alerta cada vez que un valor sube y permanece alto, y una pulsación abre la vista Estado de esa máquina. Consulte Máquinas.
Cada dispositivo muestra el título de una alerta en su propio idioma, y en inglés en un dispositivo que no haya abierto Collie desde que se actualizó. El cuerpo permanece tal como lo escribió el puente.
Cada conmutador afecta a todo el bridge. Un push se difunde a todos los dispositivos suscritos, por lo que no hay nada que configurar por dispositivo.
El aviso de caché también se puede activar para un panel a la vez, desde la propia configuración de ese panel: abra el panel, pulse en ⋮ y luego en Configuración del panel. Dichos paneles figuran bajo el conmutador global en Settings, cada uno con un botón Remove.
Los dos estados se suman en lugar de anularse. Se avisa a un panel cuando el conmutador global está activado o el panel está en esa lista; por tanto, desactivar el conmutador global no silencia un panel supervisado manualmente.
Un panel monitoreado recibe una advertencia una vez por ciclo activo. La siguiente solicitud del agente desplaza la fecha límite, y solo entonces el mismo panel puede advertir de nuevo. Se aplican las horas de silencio: un puente pospuesto no envía nada, y una posposición que termina dentro de la ventana de tiempo aún advierte. Un panel que ya está frío nunca recibe advertencias, y eso incluye uno que un cambio de /model enfrió cuando aún quedaba tiempo.
COLLIE_CACHE_WARN_SECONDS modifica la ventana, 300 segundos por defecto (configure.md).
Nota. Esta alerta necesita la lectura de la caché de prompts, por lo que cubre solo los paneles que muestran una cuenta atrás de caché: el harness debe mantener una transcripción que Collie pueda leer y el agente debe haber completado al menos un turno. La ventana en la que realmente avisa un panel equivale a los segundos configurados, o a la mitad del tiempo de vida de la propia caché de ese panel, lo que sea menor. Una caché de Claude de una hora mantiene la ventana completa de 300 segundos. Una caché de cinco minutos (Codex, OpenCode, pi y omp) avisa en cambio unos dos minutos y medio antes de enfriarse.
Las suscripciones obsoletas pueden acumularse con el tiempo, ya que las reinstalaciones en la pantalla de inicio y los reinicios del service worker crean nuevos endpoints sin devolver siempre un HTTP 410. Collie actualiza el registro cuando un dispositivo se vuelve a registrar. Puede ver y eliminar endpoints almacenados directamente:
# one line per device: service, since, user agent, endpoint tail
bin/collie push list
bin/collie push forget <substring> # or: push forget --allNotificaciones push de un agente duradero
La tarjeta de pregunta de un agente duradero puede enviar notificaciones push al teléfono, y Collie limita la cantidad de notificaciones que realiza un agente duradero.
La notificación push indica "Permiso necesario en" y el nombre asignado al panel. Nunca incluye el título propio que el agente duradero da a la pregunta. Un agente duradero puede elegir sus palabras: su título (60 caracteres como máximo) sigue al nombre del panel tras dos puntos, y su línea (120 como máximo) es el cuerpo. Las palabras modifican el texto de la notificación, pero nunca la frecuencia con la que se envía.
| Límite máximo | Límite | Superado |
|---|---|---|
| Un panel | 3 notificaciones push por minuto | La pregunta se muestra en el teléfono y no envía notificación push |
| Un agente duradero en una máquina | 10 notificaciones push por minuto | Lo mismo |
| Un agente duradero en una máquina | 30 notificaciones push por hora | Una notificación push de resumen y, a continuación, ninguna notificación de ese agente duradero durante una hora |
El resumen indica "Un agente duradero en {host} está generando muchas solicitudes", usando el nombre de la máquina para host. En un grupo, indica el nombre del miembro. El conmutador Requiere intervención y la opción de posponer también retienen el resumen. Un límite nunca oculta una pregunta: cada pregunta abierta permanece en el teléfono.
Collie envía una notificación push por pregunta una sola vez. Recuerda cada una por máquina, agente duradero y llamada a herramienta, de modo que un agente duradero que se reinicia y vuelve a hacer la misma pregunta la muestra en el teléfono sin enviar una segunda notificación. Una pregunta se descarta una hora después de cerrarse. El registro se guarda en durable-asks.json, dentro del directorio de estado. En un grupo, el líder ejecuta estas reglas y conserva ese archivo, y el miembro no envía notificaciones push para sus propias preguntas (ADR 0100).