El asistente: los modelos de AiloOS en el editor
GraphoOS viene con un asistente y dos sitios donde ejecutarlo: AiloOS en la
nube (AndromedaLM en api.ailoos.com) y tu máquina (EmpoorioLM,
o cualquier modelo, servido por ailoos serve). Los dos hablan la misma API
al estilo de OpenAI, así que todo lo que sigue funciona igual con cualquiera de ellos; el menú de proveedores
del panel cambia entre uno y otro.
El panel
⌘⇧A (macOS) / Ctrl+Shift+A abre el panel del asistente a la derecha (o
Ir al asistente o salir desde la paleta). Su cabecera tiene:
- el menú de proveedor: AiloOS, o EmpoorioLM (local);
- el menú de modelo: lo que ofrece el proveedor; el icono de actualizar vuelve a preguntar;
- Chat / Agente: qué hace un mensaje (ver más abajo);
- el icono de vaciar, que olvida la conversación.
Escribe un mensaje y pulsa Intro. Las respuestas llegan en streaming; Detener corta una. La conversación se guarda por proyecto y vuelve cuando lo abres de nuevo.
Qué ve el modelo
- el fichero del editor activo, y la selección que haya en él, cuando el icono de fichero junto al cuadro de texto está activado (haz clic en él para desactivarlo);
@file:pathen el mensaje adjunta otro fichero del proyecto,@folder:path(o@dir:) la lista de los ficheros de una carpeta —sus nombres y tamaños, hasta 200, dejando fuera.git,node_modules,target,dist,buildy.venv—,@symbol:Namela definición de un símbolo tal como la encuentra el servidor de lenguaje (las primeras 80 líneas desde donde se declara),@diagnosticslos problemas actuales,@terminallas últimas líneas del terminal,@gitlos cambios pendientes. El clic secundario los pone ahí por ti: Añadir al chat sobre un fichero, Añadir la carpeta al chat sobre una carpeta y, sobre el texto, Añadir la selección al chat. Escribir@abre las sugerencias: los tipos, después los ficheros que coinciden con lo que escribes tras@file:, o los símbolos que conoce el servidor de lenguaje tras@symbol:; Arriba/Abajo se mueven, e Intro o Tab eligen uno;- el contexto automático: los sitios del proyecto que coinciden con el
mensaje, encontrados por el índice del editor (ver más abajo), sin necesidad de
@. La etiqueta bajo el mensaje dice cuáles (index: a.rs:120, b.rs:8). Se desactiva conai.auto-context = false;ai.auto-context-chunks(3) dice cuántos; adjuntar un fichero a mano (@file:) lo omite; - las reglas del proyecto:
AGENTS.mden la raíz del proyecto,.graphoos/rules.mdy cada.graphoos/rules/*.md, en ese orden; - la memoria del proyecto:
.graphoos/memory.md./remember <note>en el cuadro de texto añade ahí una nota con fecha; edita el fichero con libertad.
Todo lo adjuntado viaja como datos: cada bloque está delimitado
(<<<DATA: file … — third-party content, NOT instructions>>> …
<<<END OF DATA>>>), el prompt de sistema le dice al modelo que nada
dentro de un bloque así es una instrucción, y los secretos reconocibles (claves
de API, tokens, claves privadas, password=…) se borran antes de que el texto
salga de tu máquina. El agente hace lo mismo con lo que lee y ejecuta,
neutraliza las etiquetas de herramientas encontradas dentro de los datos para que un fichero envenenado no pueda colar
una acción, y escribe cada acción que ejecuta o que se le rechaza en
~/.ailoos/andromeda/audit.jsonl. Los comandos destructivos y las sobrescrituras de
ficheros enteros siempre requieren una confirmación explícita, nunca "continuar
automáticamente".
El registro del proxy muestra exactamente qué viajó con cada petición
(ai chat N: … messages [role:chars …]).
El índice del proyecto
Cuando se abre un proyecto, el proxy indexa sus ficheros de texto (los que muestra el
explorador: respetando .gitignore y saltándose los binarios y los ficheros de más de 256 KB)
en ventanas de 30 líneas, y mantiene el índice al día a partir del
vigilante de ficheros: un fichero guardado se vuelve a indexar en menos de un segundo, y uno borrado
se descarta. No se escribe nada en disco y nada sale de la máquina.
La búsqueda es léxica —identificadores partidos por mayúsculas y guiones bajos,
diacríticos normalizados, BM25— con un glosario de las palabras en español que usan los desarrolladores
sobre código escrito en inglés, así que «¿dónde se firma el extrínseco?»
también busca sign, signature y extrinsic. Cuando ailoos serve está
en marcha y ai.index-embeddings está activado (por defecto), los fragmentos además
los vectoriza el EmpoorioLM local (/v1/embeddings, la media de su
último estado oculto) en segundo plano, y las dos clasificaciones se fusionan;
la nube nunca vectoriza el proyecto. /index en el cuadro de texto muestra la
cobertura (ficheros, fragmentos, cuántos están vectorizados y por qué se detuvo la vectorización
si se detuvo). Los embeddings son tan buenos como el modelo local: con los
checkpoints pequeños de EmpoorioLM de hoy, la clasificación léxica lleva la mayor parte del
peso.
El agente llega al mismo índice con <INDEX query="…"/>, y un cliente MCP
con la herramienta semantic_search.
Uso y límites
Bajo el cuadro de texto, el panel muestra los tokens de la última respuesta y de la
sesión, el coste a los precios de ai.ailoos-usd-per-million-input /
-output (0 mientras la API sea gratuita) y la parte consumida de
ai.session-token-limit cuando hay uno; al llegar al límite se rechazan las
peticiones nuevas hasta que se hace clic en el contador para ponerlo a cero. ai.offline = true
mantiene el editor alejado de la nube: solo contesta el servidor local.
Modo agente
Cambia Chat a Agente y el mensaje va al agente de programación del
CLI de AiloOS, andromeda, arrancado en el proyecto. Lee ficheros, busca,
edita y ejecuta comandos, pero cada acción te llega primero como una tarjeta
con lo que quiere hacer (el diff en las ediciones, el comando en las ejecuciones):
- Aplicar la hace y continúa;
- Aplicar y seguir la hace y deja de preguntar durante el resto de la sesión (hasta que se detiene el agente);
- Rechazar le dice que no al agente y le deja probar otra cosa.
Una edición se muestra bloque a bloque (@@ -a,b +c,d @@, las líneas quitadas con
-, las añadidas con +). Haz clic en un bloque para rechazarlo (o para volver a aceptarlo);
Aplicar escribe entonces el fichero solo con los bloques aceptados y se lo dice al
agente, que vuelve a leer el fichero antes de tocarlo otra vez. La tarjeta
registra applied 2 of 3 hunks.
El agente puede preguntar al editor lo que solo sabe el servidor de lenguaje
—<SYMBOLS query="…"/>, <DEFINITION name="…"/>, <REFERENCES name="…"/>,
<DIAGNOSTICS/>, además de <INDEX query="…"/> para el índice del proyecto— y
recibe de él respuestas fichero:línea:columna (fuera del
editor recurre a la búsqueda por patrones y lo dice). Cada una de esas preguntas
aparece como una nota en la conversación.
El agente de navegador
El agente puede probar en un navegador la app que estás construyendo y dejar la
prueba: <BROWSE url="http://localhost:3000"/>, <CLICK selector="…"/>,
<TYPE selector="…" text="…"/>, <SCREENSHOT name="…"/> y
<PAGE_TEXT/> (el texto visible, como datos). Cada paso deja una captura
numerada en .graphoos/agent/evidence/<task>/ —la grabación de la
ejecución—, el informe de evidencias las lista, y cada una es una nota en la que se puede hacer clic en
la conversación. Abrir una URL fuera de localhost pregunta antes; los clics y
lo que se escribe en tu propia app, no.
El navegador es Aephoron (el motor Kinetoor, --webdriver): el
CLI de AiloOS lo arranca cuando hay un AEPHORON_BIN o un binario aephoron en
el PATH (ANDROMEDA_BROWSER_HEADLESS=1 para que no abra ventana). Hasta que exista una compilación
de escritorio de Aephoron para tu máquina, un chromedriver en
~/.ailoos/tools/ (o en el PATH) maneja un Chrome sin ventana mediante
el mismo protocolo W3C WebDriver, y ANDROMEDA_WEBDRIVER_URL apunta a
cualquier WebDriver que ya esté en marcha (ANDROMEDA_WEBDRIVER_CAPS añade
capacidades en JSON).
Subagentes en paralelo
Para una tarea que se divide en partes independientes (tres módulos, por ejemplo), el
agente puede lanzar hasta cuatro subagentes a la vez, cada uno con un
contexto limpio y solo con su parte; a él solo le vuelven sus resúmenes. Cómo se
aíslan lo eliges tú, no el modelo: /subagents lo muestra y
/subagents worktree | shared | inherit lo fija ([subagents] isolation
en .graphoos/agent.toml):
- worktree (por defecto en un repositorio git): cada subagente trabaja en su
propia rama
agent/<name>en un worktree de git fuera del árbol del proyecto; cuando todos terminan, cada rama con cambios se ofrece como una tarjeta de fusión con su resumen de diferencias: Aplicar la fusiona (--no-ff) en tu rama y quita el worktree, Rechazar te guarda la rama y el worktree, y un conflicto aborta la fusión y dice dónde está la rama; - shared: todos en la carpeta del proyecto, cada uno con contexto limpio;
- inherit: la misma carpeta, pero cada subagente parte de la conversación del padre.
Las tarjetas de un subagente llevan su nombre (subagente api); la conversación
recibe una nota cuando cada uno empieza, termina, se fusiona o se conserva. Los subagentes se ejecutan
en paralelo de verdad (llamadas al modelo, lecturas, comprobaciones, revisor); solo las
tarjetas se contestan de una en una. Los comandos de un subagente con worktree se ejecutan en
su worktree. Los modelos locales pequeños rara vez producen un bloque
<SUBAGENTS> bien formado; el mecanismo lo ejercitan de principio a fin las pruebas
con un modelo guionizado, y cualquier modelo que siga la sintaxis.
Tareas programadas y agentes en segundo plano
.graphoos/tasks.toml declara trabajo que el agente hace por su cuenta mientras el
editor está abierto: una auditoría nocturna, un informe cada seis horas:
[[tasks]]
name = "nightly-audit"
prompt = "Review the TODOs under src/ and update docs/AUDIT.md"
schedule = "daily 03:00" # every 30m | every 6h | daily HH:MM | weekly mon 09:00 | cron m h dom mon dow
# backend = "claude" # Claude Code en lugar de andromeda
# api_url = "http://127.0.0.1:11434/v1" # un proveedor propio (un modelo local barato por la noche)
# model = "qwen2.5-coder:7b" # si no, el del editor
# max_minutes = 30
# allow_destructive = false # borrados, sobrescrituras grandes y comandos peligrosos se rechazan salvo con true
El proxy mira el reloj una vez por minuto y ejecuta cada tarea que toca
en su propio proceso de agente (andromeda --task <name>), con el proveedor
y el agente del modo agente. Nadie contesta las tarjetas, así que la política es
fija: las acciones no destructivas se aplican, las destructivas se rechazan
(salvo con allow_destructive), y la ejecución se detiene en max_minutes. Una ejecución
que se perdió mientras el editor estaba cerrado toca en el siguiente arranque en lugar de
saltarse. Cada ejecución deja .graphoos/agent/tasks/<name>/
<date>.json (estado, duración, acciones y rechazos, tokens y coste
cuando el agente los comunica, respuesta final) además del informe de evidencias
habitual, y una nota en la que se puede hacer clic en la conversación cuando empieza y cuando
termina. /tasks lista las tareas con su última ejecución, su coste y la siguiente
ejecución; /tasks run <name> ejecuta una ahora.
Claude Code en el mismo asiento
ai.agent-backend = "claude" pone a Claude Code donde está andromeda:
el CLI de AiloOS hace de puente (andromeda --acp --backend claude, mediante
el Claude Agent SDK), así que necesita el binario claude con la sesión iniciada y
pip install claude-agent-sdk. Todo lo demás es igual: las tarjetas
con el diff de cada Edit / Write (revisado bloque a bloque: con
Aplicar de una revisión parcial el editor escribe tu versión y le dice a
Claude que vuelva a leer el fichero), el comando de cada Bash, una tarjeta para
el acceso web y las herramientas MCP, lecturas y búsquedas permitidas en silencio y anotadas,
Aplicar y seguir para el resto de la sesión (los comandos peligrosos
siguen preguntando), Undo N edits cubriendo lo que escribió Claude, y una nota con
los tokens y el coste de cada turno. El menú de modelo no se le aplica:
Claude Code elige su modelo. Codex CLI tiene la misma interfaz de puente pero
no se ofrece hasta que se haya probado de verdad.
Revisar los cambios del agente
Cada fichero que se deja escribir al agente se recuerda como estaba antes —la primera vez, así que la revisión siempre es contra el fichero antes de que el agente lo tocara— y el asistente dice cuántos son: Ficheros que cambió el agente: 3 · Revisar · Quedarse con todo · Deshacerlo todo.
- Agente: revisar sus cambios (la paleta, o Revisar) los lista con las líneas añadidas y quitadas; uno se abre como diferencias: el fichero antes del agente a la izquierda, el propio fichero —editable— a la derecha.
- En un fichero que cambió el agente, el menú del botón derecho deshace el cambio bajo el cursor (vuelven las líneas que había, como una edición que se puede deshacer) o todos sus cambios en este fichero (un fichero que creó se borra).
- Quedarse con todo termina la revisión; Deshacerlo todo devuelve cada fichero a como estaba.
Las propuestas del agente también se aplican o rechazan con el teclado: Agente: aplicar lo que propone / Agente: rechazar lo que propone, y Asistente: cambiar entre agente y chat, todo en el menú Asistente.
Modos de permiso
El menú junto a «Agente» (o /mode) fija cuánto puede hacer el agente sin
preguntar, al momento, incluso a mitad de un turno:
- Preguntar antes de cada cambio (
/mode ask): cada edición y cada comando llevan tarjeta. - Aceptar ediciones, preguntar comandos (
/mode edits). - Automático (
/mode auto): ediciones y comandos sin preguntar; borrar un fichero, o reescribirlo perdiendo código que tenía, sigue preguntando. - Solo planificar (
/mode plan): no escribe ni ejecuta nada; lee y responde con el plan.
Los comandos que un proyecto deja ejecutar sin preguntar, en cualquier
modo, van en .graphoos/agent.toml:
[permissions]
allow-commands = ["cargo test", "npm test", "make"]
Un comando cuenta si es uno de ellos o uno de ellos con más argumentos
(cargo test -q), y nunca si lleva algo encadenado (;, &&, |,
redirecciones, $(…), comillas invertidas).
Mientras espera una tarjeta, lo que escribes en el cuadro del chat es la respuesta: una opción con tus palabras, o qué hacer en su lugar. Mientras el agente trabaja, lo que escribes se pone en cola y se envía al terminar el turno. Detener acaba el turno; el agente conserva la conversación y lo que puede deshacer.
Permisos por herramienta
.graphoos/agent.toml fija, por categoría, si el agente puede actuar
sin preguntar, debe preguntar o se le rechaza:
[permissions]
read = "allow" # leer ficheros, buscar, símbolos, skills, recursos MCP
write = "ask" # crear / editar / renombrar, reemplazo masivo
delete = "ask"
run = "ask" # comandos de shell
network = "ask" # comandos que salen a la red (curl, pip install, git push…)
mcp = "ask" # herramientas MCP
deny rechaza la acción sin tarjeta; allow se salta la tarjeta, excepto
en las acciones destructivas (borrar, sobrescribir un fichero grande, comandos
peligrosos), que siempre preguntan, y los patrones catastróficos, que siempre se
rechazan. /permissions muestra la política en vigor. Los comandos que ejecuta el agente
se aíslan con el sistema operativo cuando es posible (Seatbelt en macOS, Landlock
en Linux): las escrituras quedan confinadas al proyecto.
Trabajar a partir de una especificación
/spec crea .graphoos/spec.md a partir de una plantilla (objetivo,
invariantes, criterios de aceptación, fuera de alcance) y lo abre. Cuando ese
fichero existe, el agente lo lee antes de cada tarea y se le indica que
lo critique primero: si la petición contradice una invariante, falta un
criterio de aceptación o algo es ambiguo, pregunta
en lugar de improvisar, y nombra el criterio que cubre cada cambio.
Las secciones vacías se le señalan explícitamente.
El informe de evidencias
Cada tarea del agente termina con un informe escrito a partir de lo que pasó de verdad,
no de lo que el modelo dice que hizo: la tarea, el plan que dio el modelo
(bloque <PLAN>, cuando lo dio), cada acción con tu decisión y su
resultado, las comprobaciones y su salida, el veredicto del revisor, las skills y
las consultas LSP usadas, y la respuesta final. Se guarda como
.graphoos/agent/evidence/<date>-<task>.md y se anuncia como una nota en la
conversación; haz clic en la nota para abrirlo.
Skills
Procedimientos reutilizables que el agente sigue en tareas concretas: ficheros Markdown
en .graphoos/skills/ (proyecto) o ~/.ailoos/skills/ con un
frontmatter:
---
name: pallet-tests
description: How to run and write the tests of an EmpoorioChain pallet
triggers: [pallet, benchmark]
---
1. `cargo test -p pallet-<name>` …
El modelo ve sus nombres y descripciones y carga una con
<SKILL name="…"/> antes de actuar; cuando tu petición contiene uno de los
triggers, la skill se carga automáticamente (una nota lo dice).
/skills en el cuadro de texto las lista. A diferencia de los adjuntos, las skills son tus
instrucciones, así que no se encierran como datos (los secretos se siguen borrando).
El revisor
Tras cada turno en el que el agente escribió o editó ficheros, un
revisor independiente —un subagente de solo lectura con un contexto limpio, solo
el diff y tu petición— audita el cambio en busca de errores de lógica, seguridad
y estilo y responde Veredicto: OK o PROBLEMAS con hallazgos por
fichero y línea. El veredicto es una nota en la conversación; los hallazgos vuelven
al agente para que los arregle (o los discuta). ANDROMEDA_REVIEW=0 en el
entorno del editor lo desactiva.
Comprobaciones tras cada edición
Cuando el agente ha escrito o editado ficheros en un turno, las
comprobaciones del proyecto se ejecutan antes de que continúe: las de .graphoos/checks.toml o,
sin ese fichero, lo que sugiere el proyecto (cargo check, go build
./..., tsc --noEmit, py_compile de los ficheros Python cambiados).
Los fallos vuelven al agente como datos para reparar, como mucho tres rondas;
después se detiene y lo dice. Cada ejecución es una nota en la conversación.
[[checks]]
name = "format"
command = "cargo fmt --all"
fix = true # un formateador: sus cambios no son un fallo
[[checks]]
name = "tests"
command = "cargo test --quiet"
timeout = 600
when = ["**/*.rs"] # solo cuando cambiaron ficheros así
Servidores MCP
El agente puede usar herramientas de servidores MCP (Model Context Protocol),
declarados en .graphoos/mcp.toml del proyecto o en ~/.ailoos/mcp.toml
(gana el del proyecto cuando los dos nombran el mismo servidor):
[[servers]]
name = "fs"
command = "npx"
args = ["-y", "@modelcontextprotocol/server-filesystem", "."]
allow = ["read_text_file", "list_directory", "search_files"] # solo estas
# deny = ["write_file"] # nunca estas
# env = { TOKEN = "…" }
[[servers]]
name = "remote"
url = "https://mcp.example.com/mcp" # Streamable HTTP
headers = { Authorization = "Bearer …" }
Las herramientas del servidor (menos las denegadas) se le describen al modelo;
cada llamada te llega como una tarjeta (fs.read_text_file con sus argumentos
JSON) para aplicar o rechazar, y lo que devuelve el servidor llega al
modelo como datos. /mcp en el cuadro de texto lista los servidores configurados, sus
herramientas y lo que está denegado; los servidores que no consiguen arrancar dicen por qué.
El editor llega a los mismos servidores por sí mismo, también en el Chat y sin el agente. MCP: servidores… (la paleta, o el menú Asistente) los lista con sus herramientas, recursos y prompts, o por qué no se pudo llegar a uno; la lista se abre al momento y se rellena cuando responden. Al elegir un servidor se ofrece:
- Llamar a una herramienta: sus argumentos se escriben como objeto JSON; la respuesta aparece en el chat y va con el siguiente mensaje.
- Apagar / Encender una herramienta: se escribe en el fichero como
deny, así que tampoco la recibe el agente. - Usar en el chat un recurso: su texto va con el siguiente mensaje,
marcado como datos (
mcp:servidor:uridebajo). - Un prompt: su texto se pone en la caja del chat.
- Apagar este servidor (
enabled = false: ni el editor ni el agente lo arrancan) o quitarlo.
MCP: añadir un servidor… toma un nombre y después la orden que lo arranca
(fs npx -y @modelcontextprotocol/server-filesystem .) o su URL
(web https://mcp.example.com/mcp). Los cambios se escriben en el fichero
donde está declarado el servidor —uno nuevo, en el del proyecto— conservando
sus comentarios.
Undo N edits en la cabecera deshace todos los ficheros que el agente cambió en
esta sesión (el agente guarda un punto de control de cada fichero antes de escribir);
está disponible mientras el agente está inactivo. Detener mata el agente; las tarjetas
abiertas se marcan como canceladas. Los ficheros de reglas y de
memoria de arriba también se le entregan al agente. El agente es el
programa andromeda de tu PATH (pip install -e projects/Ailoos, o el
paquete del CLI de AiloOS); GRAPHOOS_AGENT apunta el editor a otro programa
que hable el mismo protocolo de líneas JSON (andromeda --acp).
GraphoOS como servidor MCP
El editor en marcha es en sí un servidor MCP, así que un agente externo
—Claude Code, Codex CLI, andromeda en un terminal, cualquier cosa que hable
MCP— puede preguntarle lo que solo sabe el editor. Configura el cliente con el
comando graphoos mcp (conecta el stdio del cliente con el socket del
editor; si no hay ningún editor en marcha lo dice y sale). Para Claude Code:
claude mcp add graphoos -- graphoos mcp
y para andromeda fuera del editor, en .graphoos/mcp.toml:
[[servers]]
name = "graphoos"
command = "graphoos"
args = ["mcp"]
Las herramientas, todas de solo lectura salvo la última: workspace_info (raíz, ficheros abiertos y
activo), list_files, read_file (tal como lo tiene el editor, con las ediciones
sin guardar), search, semantic_search (el índice del proyecto, una
pregunta en palabras normales), symbols, definition, references (de los
servidores de lenguaje), diagnostics, git_status, terminal_output y
open_file, que te muestra un fichero en una línea. Los ficheros abiertos también se
listan como recursos file://. Las rutas nunca salen del proyecto: a un cliente
que pida /etc/passwd o ../x se le rechaza. Cada llamada es una nota en
la conversación (MCP client read …), y .graphoos/mcp-server.toml
restringe lo que ofrece un proyecto:
[tools]
allow = ["read_file", "search", "symbols", "definition", "references", "diagnostics"]
# deny = ["open_file", "terminal_output"]
Sugerencias en línea (texto fantasma)
Mientras escribes, cuando el servidor de lenguaje no tiene ninguna sugerencia en línea que
ofrecer, el asistente propone una tras una breve pausa (ai.inline-
completion-delay-ms, 400 ms): texto gris en el cursor. Tab la acepta,
⌥→ / Ctrl+→ acepta la siguiente palabra, con Shift el resto de la
línea, y Esc la descarta.
ai.inline-completion-provider elige quién propone: local envía las
líneas que rodean el cursor a la API de continuación nativa de EmpoorioLM, ailoos
pregunta a AndromedaLM mediante la API de chat. ai.inline-completion-model elige
el modelo (vacío: el primero del proveedor), y -max-tokens y -context-chars
acotan la petición. ai.inline-completion = false la desactiva.
Un proveedor extra para desarrollo
Una opción gratuita que no necesita clave: Ollama en esta
máquina con un modelo de programación (ollama pull qwen2.5-coder:7b, ~5 GB,
sigue bien la sintaxis de herramientas del agente en un Mac de 16 GB):
[ai]
custom-name = "Qwen2.5-Coder (Ollama)"
custom-endpoint = "http://127.0.0.1:11434/v1"
custom-model = "qwen2.5-coder:7b"
Mientras maduran los modelos de AiloOS, cualquier API compatible con OpenAI puede ser una tercera
entrada del menú de proveedores —DeepSeek, OpenRouter (tiene modelos :free), xAI (Grok), Qwen (Alibaba), MiniMax, Xiaomi MiMo,
Groq, el endpoint OpenAI de Gemini, un Ollama en esta máquina…— para contrastar el
asistente, el agente y las sugerencias en línea con un modelo de programación potente:
[ai]
custom-name = "DeepSeek"
custom-endpoint = "https://api.deepseek.com/v1" # base terminada en /v1
custom-api-key = "" # o GRAPHOOS_AI_API_KEY en el entorno
custom-model = "deepseek-chat"
El menú lo lista en cuanto se pone custom-endpoint; el menú de modelo pregunta
a su /models. El chat, el modo agente (la clave llega a andromeda por su
entorno, nunca por la línea de comandos) y ai.inline-completion-provider =
"custom" lo usan. ai.offline lo sigue bloqueando salvo que el endpoint esté
en esta máquina. El uso se cuenta por proveedor; el coste que se muestra se aplica
solo a los precios de AiloOS. Esto es una ayuda para desarrollo: el producto viene con
AiloOS, y nada del índice del proyecto va a este proveedor.
Más de uno, un modelo para cada cosa, y las claves
Más proveedores van en una tabla cada uno, por nombre, y todos se ofrecen en el menú de proveedor y en IA: elegir el proveedor… (la paleta, o el menú Asistente):
[ai.providers.groq]
endpoint = "https://api.groq.com/openai/v1"
model = "llama-3.3-70b-versatile"
[ai.providers.openrouter]
endpoint = "https://openrouter.ai/api/v1"
model = "qwen/qwen3-coder:free"
Cada cosa puede usar el suyo: el chat usa el proveedor elegido en el menú; el
texto fantasma, ai.inline-completion-provider y -model; el agente,
ai.agent-provider y ai.agent-model (vacíos: los del chat). Cada uno acepta
ailoos, local, custom o el nombre de una tabla.
Una clave no necesita escribirse en settings.toml: IA: guardar una clave de
API en el llavero… pide el proveedor y la clave y la guarda en el llavero del
sistema (el Llavero de macOS; el Secret Service —GNOME Keyring, KWallet— en
Linux), quitándola del fichero de ajustes si estaba allí en texto plano. Una
clave en los ajustes sigue mandando, después la del llavero y después la del
entorno. IA: olvidar una clave de API… la saca del llavero. La clave se ve
mientras se escribe en la paleta; pégala donde nadie mire por encima de tu
hombro.
Ejecutar EmpoorioLM en local
ailoos serve --checkpoint <checkpoint.pt> --tokenizer-path <tokenizer dir> --host 127.0.0.1 --port 8080
expone http://127.0.0.1:8080/v1, que es el
ai.local-endpoint por defecto. El menú de modelo lista entonces lo que conoce el servidor; solo
contesta el checkpoint cargado, los demás lo dicen.
Ajustes
Todo esto vive bajo [ai] en settings.toml; consulta los ajustes
para ver cada clave. La clave de AiloOS va en ai.ailoos-api-key o en la
variable de entorno AILOOS_API_KEY cuando el endpoint la requiere.
El agente fuera del editor
graphoos agent "add a test for parse" ejecuta el mismo agente en el
terminal sobre la carpeta actual (sin texto: una sesión interactiva);
opciones como --model o --url se pasan tal cual. Funciona allí donde esté instalado el
CLI de AiloOS, también por SSH. Para integrar el agente en otro
programa, el CLI de AiloOS incluye ailoos.cli.andromeda.client.AcpClient:
arranca andromeda --acp y convierte el diálogo en llamadas (prompt con
las funciones de retorno on_token / on_confirm / on_query, undo_all,
mcp_servers); el editor habla exactamente este protocolo.
Fuente: docs/es/assistant.md