Todas las páginas
En esta página

config.json

config.json es el archivo de configuración propio del relay: su puerto, quién puede llegar a él, el token de acceso, los temporizadores que deciden cuándo un turn se considera atascado, y los túneles y la preview lane opcionales. oar setup lo crea. Lo editas a mano para todo lo que la configuración inicial no pregunta.

La mayor parte de lo que ajustas en la interfaz web no está en este archivo. Consulta Ajustes en la interfaz web y en el entorno.

Dónde está el archivo #

Instalación Ruta
Instalación global en macOS, Linux y WSL ~/.oar/config.json
Instalación global en Windows %APPDATA%\oar\config.json
Instalación global con OAR_STATE_ROOT definida config.json en esa carpeta
Checkout de git server/config.json en el checkout

OAR_STATE_ROOT traslada toda la carpeta de estado de una instalación global (configuración, datos y registros); consulta Dónde guarda OAR sus archivos.

COPILOT_WEB_RELAY_CONFIG apunta el relay a un archivo concreto, esté donde esté, pero solo cuando el relay se inicia sin el lanzador propio de oar: node server/server.js, u oar copilot (cuando el archivo existe). oar setup, oar start, oar restart y el servicio usan siempre el config.json propio de la instalación, diga lo que diga la variable. En un checkout sin server/config.json, oar copilot crea su archivo en ~/.config/copilot-remote en su lugar (%LOCALAPPDATA%\copilot-remote en Windows). Consulta Variables de entorno.

El relay mantiene el archivo legible solo para su propietario (modo 0600 en macOS y Linux), porque contiene el token de acceso en texto plano. Trata una copia del archivo como una contraseña.

Quién lo escribe #

  • oar setup escribe el token, localhostOnly y port, y deja cada una de las demás claves tal como la encuentra. Un archivo que crea, o uno al que le faltan, recibe además pollIntervalMs, processingTimeoutMs (600000) y conversationSessionMode. Consulta oar setup y el primer arranque.
  • El relay escribe cliBinaries cuando instalas o actualizas la CLI de un proveedor desde Settings (Ajustes). Solo cambia esa clave. Si no puede leer el archivo como JSON, se niega a escribir y conserva la asociación solo para el proceso en marcha.
  • El relay crea el archivo cuando no existe ninguno al arrancar, con un authToken vacío, el puerto 3333, localhostOnly: true, pollIntervalMs y conversationSessionMode. También elimina una clave features que haya quedado de versiones anteriores (consulta Claves obsoletas, ignoradas e internas).
  • Tú, en cualquier editor de texto.

Editarlo a mano #

El archivo es un único objeto JSON. Las claves que omites toman su valor predeterminado, y un bloque anidado como previews se lee entero. Edítalo y luego reinicia el relay: el relay lee el archivo una sola vez, al arrancar. Nada de lo que tiene un relay en marcha cambia cuando guardas el archivo. Reinicia con oar restart (instalaciones globales), o con 🌄 Restart web relay (Reiniciar el relay web) en el menú ⋯ de una conversación.

  • Una clave desconocida se ignora y se conserva. La configuración inicial y las escrituras propias del relay la dejan en su sitio.
  • Un JSON no válido no detiene el relay. Registra Failed to read config.json, using defaults. y funciona con los valores predeterminados: puerto 3333, solo esta máquina y un token aleatorio que es nuevo en cada arranque y se imprime en el registro. Tu token guardado deja de funcionar hasta que arreglas el archivo. Un segundo lector, el que elige la carpeta de datos, recurre a la carpeta predeterminada. El relay no toca el archivo roto.
  • Un valor incorrecto se trata clave por clave. Los valores predeterminados de abajo son los que usa el relay cuando falta un temporizador o un límite o no se puede usar. Los túneles y la preview lane se quedan desactivados y registran el motivo; el relay en sí sigue funcionando.
  • La línea de comandos gana al archivo durante una ejecución: --token <value> y --port <number> en node server/server.js (oar copilot también los pasa; oar start no) anulan authToken y port y nunca se guardan en el archivo. Un --port que no sea un número del 1 al 65535 se ignora con una advertencia.

No ejecutes oar setup sobre un archivo que no sea JSON válido

oar setup trata un archivo que no puede analizar como si no existiera. Entonces escribe encima un config.json nuevo con un token nuevo, y se pierden todas las demás claves del archivo antiguo. Arregla primero el JSON. Guarda una copia de cualquier archivo que edites a mano.

Red y acceso #

Clave Tipo Predeterminado Qué hace
authToken cadena ninguno: un token aleatorio en cada arranque El token con el que inician sesión todos los navegadores, workers y clientes de la API. Si está vacío, el relay crea uno aleatorio en cada arranque, lo imprime en su registro y no lo guarda. oar setup escribe uno estable.
port número 3333 El puerto HTTP y WebSocket, un número entero del 1 al 65535.
localhostOnly booleano true true vincula el relay a 127.0.0.1, de modo que solo esta máquina llega a él. Cualquier otro valor, incluidos false, null, 1 y "yes", lo vincula a todas las interfaces (0.0.0.0), de modo que tu LAN puede llegar a él. Solo true y el texto "true" (en mayúsculas o minúsculas) cuentan como activado; el valor predeterminado solo se aplica cuando falta la clave. No afecta a los túneles de abajo.
remotePath cadena "" Un prefijo de ruta, cuando un proxy inverso sirve el relay bajo una subruta, por ejemplo /oar. Se añade una barra inicial y se quitan las barras finales. El relay quita el prefijo de las peticiones entrantes y lo pone en la ruta de la cookie de inicio de sesión, en la ruta del socket y en las direcciones de los archivos y de los enlaces compartidos.
trustProxy valor de trust proxy de Express "loopback" Qué proxies pueden fijar las cabeceras X-Forwarded-* a las que el relay hace caso. La dirección del cliente (límites de frecuencia, el bloqueo de inicio de sesión, el registro de accesos de los enlaces compartidos) y el host y el esquema de los enlaces compartidos nuevos se leen a través de él, de modo que un cliente directo no puede falsificarlos. El valor predeterminado sirve para un proxy o un túnel en la misma máquina. Usa un número de saltos (1), una dirección o subred ("10.0.0.0/8"), o una lista de ellos cuando un proxy de otro host reenvía al relay (Proxy inverso).
allowedOrigins array de cadenas [] Nuevo en 0.9.11 Orígenes de navegador adicionales (esquema, host y un puerto distinto del predeterminado, como "https://relay.example.com") que la conexión Socket.IO en vivo acepta además del propio del relay. Hace falta para un proxy que reescribe la cabecera Host. Consulta Proxy inverso.
publicHostnames array de cadenas [] Nombres de host que llegan al propio relay. La preview lane rechaza un previews.publicBaseUrl en uno de ellos (y también localhost y 127.0.0.1), para que una app en vista previa nunca comparta una cookie de inicio de sesión con el relay.
tunnelMarkerHeaders array de cadenas [] Nombres de cabecera adicionales que el borde de un túnel añade al tráfico. Una petición que lleva cf-ray o una de estas cabeceras no puede llegar a las rutas de los workers de sesión (los sockets que usan los workers de tus propios agentes, que solo se ejecutan en esta máquina). cf-ray está siempre en la lista. También sirve una cadena separada por comas. Los nombres de la variable de entorno COPILOT_TUNNEL_MARKER_HEADERS (separados por comas) se suman a estos; una lista vacía aquí no los desactiva.
pushVapidSubject cadena mailto:copilot-remote@example.com La dirección de contacto que el relay envía a los servicios push con las peticiones de Web Push (notificaciones). Ponle una dirección mailto: tuya.
sharedPresenceMaxPerConversation número 200 Máximo de espectadores en vivo que se cuentan para el enlace de una conversación compartida. Como mínimo 1. Cuando se alcanza, se descarta al espectador que lleva más tiempo inactivo para hacer sitio.
sharedPresenceMaxGlobal número 5000 Máximo de espectadores en vivo de enlaces compartidos que se cuentan en total, con la misma regla. Nunca menor que el límite por conversación.

Para la primera conexión, el token y el acceso por LAN, consulta el primer arranque.

Turns y temporizadores #

Clave Tipo Predeterminado Qué hace
processingTimeoutMs número, ms 600000 Cuánto tiempo puede pasar un turn sin señales de vida de su worker antes de que el relay lo devuelva a la queue. No es un límite de la duración de un turn. Un valor de 0 o menor usa el predeterminado. Consulta Cuando un turn se atasca.
maxRequeueRetries número 5 Cuántas veces se puede intentar un mensaje antes de que falle definitivamente. Como mínimo 1. Consulta Volver a poner en cola.
contextIndicatorMode "default" o "bar" "default" Cómo muestra el área de redacción lo lleno que está el contexto, con una línea a lo largo de su borde superior. default es una línea de ancho completo cuyo color pasa de verde a rojo a medida que se llena el contexto. bar es la misma línea creciendo desde la izquierda hasta la proporción de contexto usada. Cualquier otro valor, en mayúsculas o minúsculas, equivale a default.

La duración máxima del turn, el tiempo límite de las tareas en segundo plano y las vigilancias de inactividad no están aquí: consulta Cuando un turn se atasca.

Reinicios y apagado #

Estas claves determinan el reinicio planificado del relay (🌄 Restart web relay). Consulta Reinicios y reanudación. Cada temporizador se expresa en milisegundos; un valor de 0 o menor, o uno que no sea un número, usa el predeterminado.

Clave Tipo Predeterminado Qué hace
restartShutdownTimeoutMs número, ms 45000 Cuánto espera un reinicio a que termine el turn en curso antes de rendirse con un fallo shutdown-timeout.
restartGracefulTimeoutMs número, ms 8000 Cuánto espera el relay a una parada ordenada antes de forzar el reinicio.
restartSpawnTimeoutMs número, ms 18000 Cuánto espera un intento a la fase de reinicio o reanudación antes de contar como fallido (spawn-timeout).
restartRebindTimeoutMs número, ms 20000 Cuánto espera un intento a que las sesiones se vuelvan a vincular tras el reinicio (rebind-timeout).
restartReadyCooldownMs número, ms 1000 Cuánto tiempo sigue en pausa la queue justo después de que un reinicio informe de que está listo.
restartMaxAttempts número 3 Cuántos intentos tiene un reinicio antes de que el resultado sea definitivo. Como mínimo 1.
restartRetryBackoffMs array de números, ms [1000, 3000, 7000] La espera antes del intento 2, 3, etc. Cuando hay más intentos que entradas, se repite la última entrada. Las entradas que no son números positivos se descartan; un resultado vacío usa el predeterminado.

Memoria Nuevo en 0.9.19 #

Clave Tipo Predeterminado Qué hace
heapLimitMb número, MB 60 % de la RAM, de 2.048 a 8.192 El límite de heap del relay, un número entero de al menos 512. Lo leen todas las formas de iniciar el relay: oar start, el servicio de systemd, el inicio automático de Windows y la extensión de la CLI. Se aplica desde el siguiente inicio. Un valor que no sea un número entero de al menos 512 se ignora con una línea en el registro; uno por encima de la RAM de la máquina, o del límite de memoria de un contenedor, se reduce a ese valor. Gana un --max-old-space-size en NODE_OPTIONS, o en la línea de comandos de node que inicia server.js. Consulta El relay se quedó sin memoria.

Workspace y datos #

Clave Tipo Predeterminado Qué hace
workspaceRootAllowList array de cadenas sin definir Carpetas absolutas en las que pueden iniciarse las conversaciones, junto con todo lo que contienen. Sin definir o vacía permite cualquier carpeta existente. Una entrada que no es una carpeta existente se registra y se omite. La variable de entorno COPILOT_WORKSPACE_ROOT_ALLOW_LIST gana cuando está definida. Consulta Limitar dónde pueden iniciarse los chats.
dataDir cadena data/ junto al servidor Dónde están la base de datos y el archivo de bloqueo del relay, y Nuevo en 0.9.17 deepseek-claude, el estado de Claude Code de los chats de DeepSeek. Una ruta relativa cuenta desde la carpeta que contiene config.json. Los archivos subidos la siguen y van a uploads/ dentro de ella; solo un relay con el data/ predeterminado junto al servidor, sin COPILOT_WEB_RELAY_DATA_DIR, los guarda en uploads/ junto al servidor. COPILOT_WEB_RELAY_DATA_DIR gana cuando está definida. oar start, oar restart y el servicio systemd de Linux la definen siempre (como ~/.oar/data, %APPDATA%\oar\data o tu propio valor), así que para un relay iniciado así esta clave no tiene efecto. Es para un checkout iniciado directamente. El lanzador de inicio de Windows fija solo el archivo de configuración, no esta variable.

CLI de los proveedores #

Clave Tipo Predeterminado Qué hace
cliBinaries objeto lo escribe el relay Rutas a las CLI de los proveedores, por proveedor: claude y grok. El relay lo escribe cuando una instalación desde Settings resuelve una ruta, y lo usa en el siguiente arranque para volver a encontrar el mismo programa. Puedes fijar una ruta a mano. Una entrada que no es un archivo ejecutable se registra y se ignora. Otros nombres, incluido copilot, no se usan.
sdkPath cadena detectado Ruta al index.js del SDK de Copilot. La búsqueda de una CLI de Copilot instalada solo se omite cuando sdkPath y cliPath están definidos los dos. Por sí solo, también le indica al relay dónde buscar, a su lado, el archivo de arranque del motor de extensión.
cliPath cadena detectado Ruta a la entrada de la runtime de la CLI de Copilot (app.js). Se usa con sdkPath. El relay también se la pasa como programa de CLI a los workers de Copilot que inicia, salvo que el entorno ya indique uno.
sdkVersion cadena la más reciente encontrada Una versión exacta como 1.0.63. La búsqueda de una CLI de Copilot instalada acepta entonces solo esa versión. Se ignora cuando sdkPath y cliPath están definidos los dos.

Esto importa allí donde el relay habla él mismo con la CLI de Copilot instalada, por ejemplo para importar sesiones de Copilot existentes y para listar modelos. La búsqueda mira en la caché de paquetes de la CLI de Copilot (COPILOT_PKG_DIR añade una carpeta en la que buscar primero). Consulta GitHub Copilot.

Vistas previas #

El bloque previews activa la preview lane: un segundo listener con su propio puerto y nombre de host que publica servidores de desarrollo y carpetas locales. La configuración, los nombres de host y el proxy frontal están en la página de la herramienta preview.

Clave Tipo Predeterminado Qué hace
previews.enabled booleano false Activa la lane. Solo cuenta true.
previews.port número port del relay + 1 El puerto del listener de vistas previas. Como mínimo 1024, y no el puerto del relay; 0 elige un puerto libre en cada arranque.
previews.bindHost cadena 127.0.0.1 La dirección a la que se vincula el listener. Una dirección que no sea de loopback necesita previews.allowPublicBind.
previews.allowPublicBind booleano false Permite un previews.bindHost que no sea de loopback. Entonces cada vista previa es accesible desde la red sin el proxy frontal.
previews.publicBaseUrl cadena ninguno La dirección pública http(s) de la lane. Obligatoria cuando las vistas previas están activadas. Su nombre de host debe ser distinto del del relay (consulta publicHostnames). Se quita la barra final.
previews.allowedTargetHosts array de cadenas [] Hosts, además de esta máquina, a los que puede apuntar una vista previa de puerto, como la dirección de un contenedor o de una VM.
previews.maxLive número 8 Máximo de vistas previas a la vez para todo el relay. Un valor que no sea un número entero positivo usa 8.

Si una de estas reglas no se cumple con las vistas previas activadas, el relay registra PREVIEW LANE disabled con el motivo, deja la lane desactivada y sigue funcionando.

Estas variables de entorno anulan las claves correspondientes: COPILOT_PREVIEWS_ENABLED (1, true, 0, false), COPILOT_PREVIEWS_PORT, COPILOT_PREVIEWS_BIND_HOST, COPILOT_PREVIEWS_PUBLIC_BASE_URL y COPILOT_PREVIEWS_ALLOWED_TARGET_HOSTS (separados por comas).

Túneles #

Dos túneles pueden llegar al relay desde fuera de tu red. Son independientes y pueden funcionar a la vez. Los dos están desactivados de forma predeterminada, y un túnel gestionado al que le falta un valor obligatorio se queda desactivado y registra por qué.

sshTunnel #

Un túnel SSH inverso hacia un servidor tuyo. Consulta Túnel SSH.

Clave Tipo Predeterminado Qué hace
sshTunnel.mode "disabled" o "managed" "disabled" managed hace que el relay ejecute y reinicie el túnel.
sshTunnel.required booleano false Mientras el túnel gestionado no está conectado, incluso antes de su primera conexión y cuando falta un valor obligatorio, el relay deja de tomar mensajes de la queue.
sshTunnel.user cadena ninguno El usuario SSH en el servidor. Obligatorio en modo gestionado.
sshTunnel.host cadena ninguno El nombre de host o la dirección del servidor. Obligatorio en modo gestionado.
sshTunnel.remotePort número ninguno El puerto que se abre en el servidor (del 1 al 65535). Obligatorio en modo gestionado.
sshTunnel.remoteBind "loopback" o "public" "loopback" Si el puerto remoto se abre solo en el propio servidor o en todas sus interfaces. Independiente de localhostOnly.
sshTunnel.command cadena ssh El programa SSH. Usa un nombre que esté en el PATH o una ruta absoluta: una ruta relativa cuenta desde la carpeta del programa del relay.
sshTunnel.identityFile cadena ninguno La clave privada que se usa; ~ se expande. Sin ella, SSH usa su agente o sus claves predeterminadas.
sshTunnel.autoReclaimPort booleano true Cuando el puerto remoto ya está ocupado, ejecuta una limpieza en el servidor y lo vuelve a intentar. Solo false lo desactiva.
sshTunnel.reclaimStaleSshSessions booleano false Como parte de esa limpieza, termina también tus propias sesiones SSH en el servidor que no ejecutan nada.
sshTunnel.remoteCleanupCommand cadena integrado Tu propio comando de limpieza para ejecutar en el servidor en lugar del integrado.

cloudflaredTunnel #

Ejecuta cloudflared de Cloudflare, que instalas tú; OAR no incluye ninguno. Consulta Cloudflare Tunnel.

Clave Tipo Predeterminado Qué hace
cloudflaredTunnel.mode "disabled" o "managed" "disabled" managed hace que el relay ejecute cloudflared. COPILOT_CLOUDFLARED_MODE lo anula.
cloudflaredTunnel.required booleano false Mientras el túnel gestionado no está conectado, incluso cuando falta un valor obligatorio, el relay deja de tomar mensajes de la queue.
cloudflaredTunnel.token cadena ninguno El token de tu propio túnel de Cloudflare. Obligatorio en modo gestionado. COPILOT_CLOUDFLARED_TOKEN lo anula.
cloudflaredTunnel.binary cadena cloudflared El programa, como ruta absoluta o como nombre que se busca en el PATH. COPILOT_CLOUDFLARED_BINARY lo anula.
cloudflaredTunnel.extraArgs array de cadenas [] Argumentos que se añaden después de cloudflared tunnel run --token <token>.

Ajustes en la interfaz web y en el entorno #

Los ajustes de la interfaz web no están en este archivo. Los interruptores y las claves de los proveedores, las listas de modelos, la duración máxima del turn, el tiempo límite de las tareas en segundo plano y los flags de funciones se guardan en la base de datos del relay, en la carpeta de datos. El archivo contiene lo que el relay necesita antes de abrir la base de datos (la carpeta de datos, el puerto, el token) y datos sobre la máquina (rutas de CLI, túneles). Lo único que la interfaz escribe en el archivo es cliBinaries. Nuevo en 0.9.17 DeepSeek tampoco tiene ninguna clave aquí: su clave de API, su URL base y su presupuesto se guardan desde Settings → Providers → DeepSeek (Ajustes → Proveedores → DeepSeek) en la base de datos.

Variables de entorno. La lista completa está en Variables de entorno. Cuando existe una variable para una clave, la variable gana al archivo: COPILOT_WEB_RELAY_DATA_DIR (dataDir), COPILOT_WORKSPACE_ROOT_ALLOW_LIST, COPILOT_CLOUDFLARED_* y COPILOT_PREVIEWS_* (enumeradas en sus secciones). COPILOT_TUNNEL_MARKER_HEADERS es la excepción: sus nombres se suman a tunnelMarkerHeaders. Las opciones --token y --port ganan a ambos durante una ejecución. COPILOT_WEB_RELAY_CONFIG se explica en Dónde está el archivo.

Un ejemplo #

Todos los valores son inventados. Borra los bloques que no uses.

{
  "authToken": "0f3c1a9e-example-token-do-not-copy",
  "port": 3333,
  "localhostOnly": false,
  "remotePath": "",
  "trustProxy": "loopback",
  "allowedOrigins": [],
  "publicHostnames": ["relay.example.com"],
  "tunnelMarkerHeaders": ["x-edge-request-id"],
  "processingTimeoutMs": 600000,
  "maxRequeueRetries": 5,
  "contextIndicatorMode": "bar",
  "workspaceRootAllowList": ["/home/dev/projects", "/srv/sites"],
  "dataDir": "data",
  "cliBinaries": {
    "claude": "/home/dev/.local/bin/claude",
    "grok": "/home/dev/.grok/bin/grok"
  },
  "restartShutdownTimeoutMs": 45000,
  "restartGracefulTimeoutMs": 8000,
  "restartSpawnTimeoutMs": 18000,
  "restartRebindTimeoutMs": 20000,
  "restartReadyCooldownMs": 1000,
  "restartMaxAttempts": 3,
  "restartRetryBackoffMs": [1000, 3000, 7000],
  "previews": {
    "enabled": true,
    "port": 3334,
    "bindHost": "127.0.0.1",
    "allowPublicBind": false,
    "publicBaseUrl": "https://preview.example.com",
    "allowedTargetHosts": [],
    "maxLive": 8
  },
  "sshTunnel": {
    "mode": "managed",
    "required": false,
    "user": "ubuntu",
    "host": "vps.example.com",
    "remotePort": 4444,
    "remoteBind": "loopback",
    "identityFile": "~/.ssh/id_ed25519"
  },
  "cloudflaredTunnel": {
    "mode": "disabled",
    "token": "",
    "binary": "cloudflared",
    "extraArgs": []
  }
}

Claves obsoletas, ignoradas e internas #

Si encuentras una de estas en un archivo, puedes dejarla o borrarla:

Clave Qué es
features Retirada. Los flags de funciones se guardan ahora en la base de datos del relay, en Settings → Features (Ajustes → Funciones). Al arrancar, el relay copia los valores que encuentra aquí en la base de datos, salvo que ya haya un valor guardado allí, y elimina la clave del archivo.
sshTunnel.enabled, cloudflaredTunnel.enabled Forma antigua de mode. true significa managed, y solo se lee cuando mode no es disabled ni managed.
pollIntervalMs Se escribe en los archivos nuevos, pero el relay no la lee. No tiene efecto.
conversationSessionMode isolated o shared. Se escribe en los archivos nuevos. El relay guarda el valor en el registro de cada sesión y lo indica en su estado, pero nada en OAR se comporta de forma distinta con uno u otro valor. Para ti no tiene efecto.
cliPort, model Solo los usa un modo independiente que inicias a mano (una vía de escape para desarrolladores; ningún comando oar lo inicia). El relay que inicias con oar start ignora model. Lee cliPort para una sola cosa: la preview lane nunca elige ese puerto.
host Solo lo leen los programas que se conectan al relay (los workers de sesión y la extensión de Copilot), para construir la dirección que usan; el listener del propio relay lo ignora (consulta localhostOnly). Omítela.