Skip to content

Commit 9eaea08

Browse files
sre-helmcodebarckcodeclaude
authored
Describe agents in product terms in the public docs (#149)
The Agents and Hermes guides (EN + ES) named the virtualization stack (microVM, QEMU, KVM), the orchestrator (Kubernetes Pod events, kubelet, Prometheus/cadvisor, Deployment, block-mode PVC) and filesystem details. Rewrite them as a private cloud machine with its own persistent disk. New test: every docs page and the legal pages are checked for infrastructure names. Co-authored-by: barckcode <cristian@helmcode.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
1 parent d248ac4 commit 9eaea08

5 files changed

Lines changed: 89 additions & 34 deletions

File tree

‎src/content/docs-es/agents.md‎

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
---
22
title: Agentes
3-
description: "Despliega agentes de IA en una microVM aislada con QEMU: Hermes, terminal web, subida de ficheros y observabilidad."
3+
description: "Despliega agentes de IA en una máquina privada en la nube aislada: Hermes, terminal web, subida de ficheros y observabilidad."
44
order: 19
55
group: Guías
66
---
77

88
# Agentes.
99

10-
NaN Cloud te permite desplegar agentes de IA en tu propia **microVM**: una máquina virtual ligera con QEMU y KVM, con su propio kernel, su propio sistema de ficheros y acceso root completo. Aislada del host y del resto de miembros. El primer tipo de agente disponible es **Hermes**.
10+
NaN Cloud te permite desplegar agentes de IA en tu propia **máquina privada en la nube**: una máquina virtual ligera con su propio kernel, su propio sistema de ficheros y acceso root completo. Aislada del host y del resto de miembros. El primer tipo de agente disponible es **Hermes**.
1111

1212
## Arquitectura
1313

14-
Cada agente corre dentro de su propia microVM de QEMU. En vez de compartir el kernel del host (como haría un contenedor normal), arranca con su propio kernel de Linux. La VM monta un disco ext4 de 20 GiB sobre un volumen persistente en modo bloque. Todo lo que hagas dentro (`apt install`, `pip install`, cambios en `/etc`, ficheros que subas) vive en ese disco y sobrevive a los reinicios.
14+
Cada agente corre dentro de su propia máquina aislada. En vez de compartir el kernel del host (como haría un contenedor normal), arranca con su propio kernel de Linux. La máquina tiene su propio disco persistente de 20 GiB. Todo lo que hagas dentro (`apt install`, `pip install`, cambios en `/etc`, ficheros que subas) vive en ese disco y sobrevive a los reinicios.
1515

16-
El apagado es *limpio*: cuando reinicias o borras el agente, el sistema fuerza un `sync` y espera a que el journal de ext4 termine de volcarse antes de matar la VM. Sin corrupción.
16+
El apagado es *limpio*: cuando reinicias o borras el agente, el sistema fuerza un `sync` y espera a que el disco termine de volcarse antes de parar la máquina. Sin corrupción.
1717

1818
## Hermes
1919

@@ -31,7 +31,7 @@ Entra en [cloud.nan.builders/agents/new](https://cloud.nan.builders/agents/new)
3131

3232
### 3. Espera a que esté Running
3333

34-
Después de crear el agente, espera unos 30 segundos a que arranque la microVM, se formatee el disco por primera vez (`mkfs.ext4`) y se siembre el sistema de ficheros. El estado pasa a `Running` y Hermes a `Ready`.
34+
Después de crear el agente, espera unos 30 segundos a que arranque la máquina, se prepare su disco por primera vez y se siembre el sistema de ficheros. El estado pasa a `Running` y Hermes a `Ready`.
3535

3636
### 4. Habla con tu agente
3737

@@ -44,7 +44,7 @@ Busca tu bot en Telegram y mándale un mensaje. Hermes responderá con el modelo
4444
4545
## Console: terminal web
4646

47-
La pestaña **Console** abre una terminal interactiva (`bash --login`) dentro de tu microVM, sin necesidad de configurar SSH. El stream va por WebSocket con xterm.js: se redimensiona sola al ajustar el panel, tiene una pastilla de estado arriba a la derecha y un botón de reconexión por si se cae la sesión.
47+
La pestaña **Console** abre una terminal interactiva (`bash --login`) dentro de la máquina de tu agente, sin necesidad de configurar SSH. El stream va por WebSocket con xterm.js: se redimensiona sola al ajustar el panel, tiene una pastilla de estado arriba a la derecha y un botón de reconexión por si se cae la sesión.
4848

4949
Casos de uso típicos:
5050

@@ -58,7 +58,7 @@ Casos de uso típicos:
5858
5959
## Files: subida de ficheros
6060

61-
La pestaña **Files** permite subir ficheros a la microVM arrastrándolos o desde el selector. Admite varios a la vez, con cola secuencial y barra de progreso en vivo con MiB/s. Los ficheros aterrizan en `/persist/uploads/` y desde ahí puedes moverlos con la Console.
61+
La pestaña **Files** permite subir ficheros a la máquina del agente arrastrándolos o desde el selector. Admite varios a la vez, con cola secuencial y barra de progreso en vivo con MiB/s. Los ficheros aterrizan en `/persist/uploads/` y desde ahí puedes moverlos con la Console.
6262

6363
- Tamaño máximo: **200 MiB** por fichero.
6464
- Transporte: WebSocket con trozos de 256 KiB y backpressure de extremo a extremo.
@@ -70,8 +70,8 @@ La pestaña **Files** permite subir ficheros a la microVM arrastrándolos o desd
7070
La pestaña **Observability** agrupa tres sub-pestañas:
7171

7272
- **Logs**: stream en vivo del stdout y stderr del agente por WebSocket. Búfer de las últimas 500 líneas en el cliente.
73-
- **Events**: eventos del Pod de Kubernetes (BackOff, Scheduled, Pulled, Killing...) con tipo, motivo, mensaje, antigüedad y recuento. Se refresca solo cada 15s.
74-
- **Metrics**: consumo real de CPU, RAM y disco frente a los límites configurados. CPU y RAM vía Prometheus (kubelet-cadvisor), disco con `df` dentro de la microVM (el sistema de ficheros es de modo bloque y kubelet no lo ve). Se refresca cada 10s.
73+
- **Events**: eventos del ciclo de vida del agente (planificación, descarga de imágenes, reinicios, back-offs...) con tipo, motivo, mensaje, antigüedad y recuento. Se refresca solo cada 15s.
74+
- **Metrics**: consumo real de CPU, RAM y disco frente a los límites configurados. La CPU y la RAM se miden desde fuera de la máquina y el disco desde dentro. Se refresca cada 10s.
7575

7676
## Web: exposición pública
7777

@@ -93,21 +93,21 @@ Hermes incluye una UI web ligera ([nesquena/hermes-webui](https://github.com/nes
9393

9494
## Variables de entorno
9595

96-
La pestaña **Env** te permite añadir, editar y borrar variables de entorno del agente sin tocar el Deployment. Útil para inyectar API keys de terceros, configurar el comportamiento de Hermes, etc.
96+
La pestaña **Env** te permite añadir, editar y borrar variables de entorno del agente sin tener que redesplegarlo tú. Útil para inyectar API keys de terceros, configurar el comportamiento de Hermes, etc.
9797

9898
Hay dos variables **protegidas** (solo se pueden editar, no borrar): `OPENAI_API_KEY` (tu key del clúster, que gestiona la plataforma) y `TELEGRAM_BOT_TOKEN`. El resto las puedes crear, editar o borrar libremente.
9999

100100
## Recursos y límites
101101

102-
Cada microVM se aprovisiona con:
102+
La máquina de cada agente se aprovisiona con:
103103

104104
| Recurso | Request | Límite |
105105
|---|---|---|
106-
| CPU | 200m | 1 vCPU |
107-
| RAM | 512 Mi | 2 GiB |
108-
| Disco | (sin request) | 20 GiB (PVC en modo bloque) |
106+
| CPU | 0,2 vCPU | 1 vCPU |
107+
| RAM | 512 MiB | 2 GiB |
108+
| Disco | (sin request) | 20 GiB (persistente) |
109109

110-
La CPU y la RAM son los límites máximos de la microVM; el consumo real suele quedar muy por debajo. El disco es persistente: todo lo que instales o modifiques (paquetes, ficheros, configuraciones) se conserva entre reinicios. Si el disco se llena (por encima del 90%), libéralo desde la Console (`du -sh /persist/*`).
110+
La CPU y la RAM son los límites máximos de la máquina; el consumo real suele quedar muy por debajo. El disco es persistente: todo lo que instales o modifiques (paquetes, ficheros, configuraciones) se conserva entre reinicios. Si el disco se llena (por encima del 90%), libéralo desde la Console (`du -sh /persist/*`).
111111

112112
> **Límite actual**
113-
> Ahora mismo cada miembro puede desplegar **1 agente en microVM**. Este límite se ampliará en versiones futuras.
113+
> Ahora mismo cada miembro puede desplegar **1 agente**. Este límite se ampliará en versiones futuras.

‎src/content/docs-es/hermes.mdx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ Hay dos formas de tenerlo, y la primera no requiere configurar nada.
1717

1818
## Camino 1: desplegado en NaN Cloud
1919

20-
NaN Cloud despliega Hermes por ti en una **microVM propia**, y sale conectado al clúster de fábrica: la plataforma le inyecta tu clave y no tienes que tocar ninguna configuración de proveedor.
20+
NaN Cloud despliega Hermes por ti en una **máquina privada en la nube propia**, y sale conectado al clúster de fábrica: la plataforma le inyecta tu clave y no tienes que tocar ninguna configuración de proveedor.
2121

2222
<Callout title="Esta es la vía corta">
2323
Creas el agente desde el panel, eliges modelo, le das el token de tu bot de Telegram y ya está hablando. Está explicado paso a paso en [Agentes](/es/docs/agents), con capturas.

‎src/content/docs/agents.md‎

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
---
22
title: Agents
3-
description: "Deploy AI agents in an isolated microVM with QEMU: Hermes, web terminal, file uploads, and observability."
3+
description: "Deploy AI agents in an isolated private cloud machine: Hermes, web terminal, file uploads, and observability."
44
order: 19
55
group: Guides
66
---
77

88
# Agents.
99

10-
NaN Cloud lets you deploy AI agents in your own **microVM**: a lightweight virtual machine with QEMU + KVM, its own kernel, its own filesystem, and full root access. Isolated from the host and from other members. The first available agent type is **Hermes**.
10+
NaN Cloud lets you deploy AI agents in your own **private cloud machine**: a lightweight virtual machine with its own kernel, its own filesystem, and full root access. Isolated from the host and from other members. The first available agent type is **Hermes**.
1111

1212
## Architecture
1313

14-
Each agent runs inside its own QEMU microVM. Instead of sharing the host kernel (like a regular container), it starts with its own Linux kernel. The VM mounts a 20 GiB ext4 disk on a block-mode persistent volume. Everything you do inside — `apt install`, `pip install`, edits to `/etc`, files you upload — lives on that disk and survives restarts.
14+
Each agent runs inside its own isolated machine. Instead of sharing the host kernel (like a regular container), it starts with its own Linux kernel. The machine has its own 20 GiB persistent disk. Everything you do inside — `apt install`, `pip install`, edits to `/etc`, files you upload — lives on that disk and survives restarts.
1515

16-
Shutdown is *graceful*: when you restart or delete the agent, the system forces a `sync` and waits for the ext4 journal to finish flushing before killing the VM. No corruption.
16+
Shutdown is *graceful*: when you restart or delete the agent, the system forces a `sync` and waits for the disk to finish flushing before stopping the machine. No corruption.
1717

1818
## Hermes
1919

@@ -31,7 +31,7 @@ Go to [cloud.nan.builders/agents/new](https://cloud.nan.builders/agents/new) and
3131

3232
### 3. Wait for it to be Running
3333

34-
After creating the agent, wait ~30 seconds for the microVM to start, format the disk for the first time (`mkfs.ext4`), and seed the filesystem. The status changes to `Running` and Hermes to `Ready`.
34+
After creating the agent, wait ~30 seconds for the machine to start, prepare its disk for the first time, and seed the filesystem. The status changes to `Running` and Hermes to `Ready`.
3535

3636
### 4. Chat with your agent
3737

@@ -44,7 +44,7 @@ Find your bot on Telegram and send it a message. Hermes will respond using the m
4444
4545
## Console — web terminal
4646

47-
The **Console** tab opens an interactive terminal (`bash --login`) inside your microVM, without needing to configure SSH. The stream runs over WebSocket with xterm.js: auto-resize when you adjust the panel, status pill in the top right, and a reconnect button if the session drops.
47+
The **Console** tab opens an interactive terminal (`bash --login`) inside your agent's machine, without needing to configure SSH. The stream runs over WebSocket with xterm.js: auto-resize when you adjust the panel, status pill in the top right, and a reconnect button if the session drops.
4848

4949
Typical use cases:
5050

@@ -58,7 +58,7 @@ Typical use cases:
5858
5959
## Files — file uploads
6060

61-
The **Files** tab allows uploading files to the microVM with drag-and-drop or file picker. Multi-file, sequential queue, live progress bar with MiB/s. Files land in `/persist/uploads/` and from there you can move them with the Console.
61+
The **Files** tab allows uploading files to the agent's machine with drag-and-drop or file picker. Multi-file, sequential queue, live progress bar with MiB/s. Files land in `/persist/uploads/` and from there you can move them with the Console.
6262

6363
- Max size: **200 MiB** per file.
6464
- Transport: WebSocket with 256 KiB chunks and end-to-end backpressure.
@@ -70,8 +70,8 @@ The **Files** tab allows uploading files to the microVM with drag-and-drop or fi
7070
The **Observability** tab groups three sub-tabs:
7171

7272
- **Logs** — live stream of the agent's stdout/stderr via WebSocket. Buffer of the last 500 lines on the client.
73-
- **Events** — Kubernetes Pod events (BackOff, Scheduled, Pulled, Killing...) with type, reason, message, age, and count. Auto-refresh every 15s.
74-
- **Metrics** — actual CPU, RAM, and disk usage against configured limits. CPU/RAM via Prometheus (kubelet-cadvisor), disk via `df` inside the microVM (the filesystem is block-mode, kubelet can't see it). Refreshes every 10s.
73+
- **Events** — lifecycle events for the agent (scheduling, image pulls, restarts, back-offs...) with type, reason, message, age, and count. Auto-refresh every 15s.
74+
- **Metrics** — actual CPU, RAM, and disk usage against configured limits. CPU and RAM are measured from outside the machine, disk usage from inside it. Refreshes every 10s.
7575

7676
## Web — public exposure
7777

@@ -93,21 +93,21 @@ Hermes includes a lightweight web UI ([nesquena/hermes-webui](https://github.com
9393

9494
## Environment variables
9595

96-
The **Env** tab lets you add, edit, and delete agent environment variables without touching the Deployment. Useful for injecting third-party API keys, configuring Hermes behavior, etc.
96+
The **Env** tab lets you add, edit, and delete agent environment variables without redeploying the agent yourself. Useful for injecting third-party API keys, configuring Hermes behavior, etc.
9797

9898
Two variables are **protected** (edit-only, no delete): `OPENAI_API_KEY` (your cluster key, managed by the platform) and `TELEGRAM_BOT_TOKEN`. The rest are free to create, edit, or delete.
9999

100100
## Resources and limits
101101

102-
Each microVM is provisioned with:
102+
Each agent's machine is provisioned with:
103103

104104
| Resource | Request | Limit |
105105
|---|---|---|
106-
| CPU | 200m | 1 vCPU |
107-
| RAM | 512 Mi | 2 GiB |
108-
| Disk | — | 20 GiB (block-mode PVC) |
106+
| CPU | 0.2 vCPU | 1 vCPU |
107+
| RAM | 512 MiB | 2 GiB |
108+
| Disk | — | 20 GiB (persistent) |
109109

110-
CPU and RAM are the microVM's maximum limits; actual usage is usually well below. Disk is persistent — everything you install or modify (packages, files, configurations) is preserved across restarts. If the disk fills up (90%+), free it from the Console (`du -sh /persist/*`).
110+
CPU and RAM are the machine's maximum limits; actual usage is usually well below. Disk is persistent — everything you install or modify (packages, files, configurations) is preserved across restarts. If the disk fills up (90%+), free it from the Console (`du -sh /persist/*`).
111111

112112
> **Current limit**
113-
> Currently each member can deploy **1 microVM agent**. This limit will be expanded in future versions.
113+
> Currently each member can deploy **1 agent**. This limit will be expanded in future versions.

‎src/content/docs/hermes.mdx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ There are two ways to have it, and the first one requires configuring nothing.
1717

1818
## Path 1: deployed on NaN Cloud
1919

20-
NaN Cloud deploys Hermes for you in **its own microVM**, and it comes connected to the cluster out of the box: the platform injects your key and you do not have to touch any provider configuration.
20+
NaN Cloud deploys Hermes for you in **its own private cloud machine**, and it comes connected to the cluster out of the box: the platform injects your key and you do not have to touch any provider configuration.
2121

2222
<Callout title="This is the short way">
2323
You create the agent from the panel, pick a model, give it your Telegram bot token, and it is already talking. It is explained step by step in [Agents](/docs/agents), with screenshots.
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import { describe, expect, test } from 'vitest';
2+
import { readdirSync, readFileSync, statSync } from 'node:fs';
3+
import { fileURLToPath } from 'node:url';
4+
import { dirname, join, resolve } from 'node:path';
5+
6+
/**
7+
* Member-facing copy must not disclose how the platform is built underneath
8+
* (virtualization stack, hypervisor, host names, backup tooling, hosting
9+
* provider). Members read "workspace", "private cloud machine", "backups".
10+
*
11+
* Covers every docs page (EN + ES) and the legal pages. Kubernetes is not on
12+
* the list on purpose: Spaces hand members a kubeconfig, so it is the product,
13+
* not an implementation detail. LiteLLM is not either: the Claude Code guide
14+
* tells members to run it on their own machine.
15+
*/
16+
const here = dirname(fileURLToPath(import.meta.url));
17+
const src = resolve(here, '../..');
18+
19+
const FORBIDDEN =
20+
/firecracker|micro-?vms?\b|qemu|\bkvm\b|kubelet|cadvisor|cloud-hypervisor|jailer|restic|hetzner|nan-eu0\d\d|\beu00\d\b|nan-vmd|\bkata\b/i;
21+
22+
function walk(dir: string): string[] {
23+
return readdirSync(dir).flatMap((name) => {
24+
const p = join(dir, name);
25+
return statSync(p).isDirectory() ? walk(p) : [p];
26+
});
27+
}
28+
29+
const files = [
30+
...walk(join(src, 'content/docs')),
31+
...walk(join(src, 'content/docs-es')),
32+
...['terms', 'privacy', 'cookies'].flatMap((page) => [
33+
join(src, `pages/${page}.astro`),
34+
join(src, `pages/es/${page}.astro`),
35+
]),
36+
].filter((p) => /\.(md|mdx|astro)$/.test(p));
37+
38+
describe('member-facing copy does not disclose infrastructure internals', () => {
39+
test('there are pages to check', () => {
40+
expect(files.length).toBeGreaterThan(20);
41+
});
42+
43+
test.each(files.map((f) => [f.slice(src.length + 1), f]))('%s', (_rel, file) => {
44+
const text = readFileSync(file, 'utf8');
45+
const hit = text.match(FORBIDDEN);
46+
expect(hit?.[0] ?? null).toBeNull();
47+
});
48+
49+
test('the agents guide describes the machine in product terms', () => {
50+
const en = readFileSync(join(src, 'content/docs/agents.md'), 'utf8');
51+
const es = readFileSync(join(src, 'content/docs-es/agents.md'), 'utf8');
52+
expect(en).toContain('your own **private cloud machine**');
53+
expect(es).toContain('tu propia **máquina privada en la nube**');
54+
});
55+
});

0 commit comments

Comments
 (0)