Guías

Usar Pi

Corré los soldiers de un perfil de modelo en el agente de código Pi en lugar de Claude Code, incluidos los modelos gratuitos y de otros proveedores.

Un perfil de modelo puede nombrar un harness, el CLI de agente en el que corren sus soldiers. Claude Code es el default. Con "harness": "pi" los soldiers de ese perfil corren en Pi, que puede usar casi cualquier proveedor y modelo, incluidos los planes gratuitos. El commander es una sesión de Claude Code salvo que también lo corras en Pi (ver Pi como commander), y una tarea conserva su harness a través de vx redispatch, vx prompt, vx decide, vx land y vx strike.

Esta página describe lo que se verificó contra Pi 1.3.0. vx doctor advierte con cualquier otra serie mayor. Para perfiles de ejemplo con modelos gratuitos y baratos, mirá Modelos para otros harnesses.

Los planes gratuitos pueden quedarse con tu código

Un soldier le manda al proveedor del modelo todo lo que lee: tus prompts, los archivos que abre, la salida de los comandos y lo que haya en tu entorno que un comando imprima. Muchos planes gratuitos de modelos registran prompts y salidas y pueden usarlos para entrenar, con términos que cambian según el proveedor y con el tiempo. Leé los términos del proveedor antes de apuntar un perfil a un modelo gratuito, y no uses uno con código privado o propietario, ni en una máquina cuyos archivos o entorno guarden secretos. Pi, igual que Claude Code en vexillum, tiene acceso total al host con tu usuario.

Prepararlo

  1. Instalá Pi. Sirve el instalador o npm:

    curl -fsSL https://pi.dev/install.sh | sh
    npm install -g --ignore-scripts @earendil-works/pi-coding-agent
  2. Corré pi una vez e iniciá sesión en un proveedor con /login, o exportá la API key del proveedor. pi --list-models lista lo que tu cuenta puede usar.

  3. Instalá la integración de herdr para Pi, así herdr lee el estado de un soldier de Pi (working, idle) del propio Pi en lugar de leer la pantalla:

    herdr integration install pi
  4. Corré vx doctor. Cuando un perfil selecciona pi, o hay un binario pi en tu PATH, informa el binario, su versión y la integración. Solo advierten: una pieza faltante nunca deja el entorno como no listo, y una configuración sin Pi no ve ninguna de estas líneas.

Agregar un perfil

Agregá un perfil con "harness": "pi" a .vexillum/models.json (o al global ~/.vexillum/models.json):

{
  "profiles": {
    "pi-scout": {
      "model": "anthropic/claude-haiku-4-5",
      "effort": "low",
      "when": "Scout cuya pregunta se reduce a hechos verificables, corrido en Pi.",
      "harness": "pi"
    }
  }
}
vx dispatch "which flags does the build script accept?" --kind scout --profile pi-scout

En un perfil de Pi los dos campos significan:

CampoValorSe le pasa a Pi como
modelprovider/id, como anthropic/claude-haiku-4-5 u openrouter/meta-llama/llama-4-scout:free--model <provider/id>
effortun nivel de thinking: off, minimal, low, medium, high, xhigh o max--thinking <level>

vexillum revisa solo la forma: un model tiene que verse como provider/id, y effort tiene que ser uno de los niveles de Pi. Los modelos de Pi son los que ofrezcan tus proveedores, así que no puede comprobar que un modelo exista; eso lo informa Pi cuando arranca el soldier. Pi además ajusta un nivel de thinking que el modelo no soporta al más cercano que sí soporta, así que xhigh en un modelo que llega hasta high corre en high. Un alias de claude como sonnet no es un provider/id, y pasar un perfil existente a pi sin darle un modelo provider/id es un error que nombra el archivo y el campo. Una capa posterior se revisa contra el harness con el que termina el perfil, así que un archivo de proyecto puede retocar un perfil de pi de la base global.

Ids de modelo que terminan en :free

Pi lee un sufijo :level en --model como un nivel de thinking, y algunos ids terminan en un segmento con dos puntos propio, como el :free de OpenRouter. vexillum nunca arma ese sufijo: dejá el id completo en model y poné el nivel de thinking en effort, que se pasa con --thinking. Pi busca un id de modelo exacto antes de buscar un sufijo, así que openrouter/meta-llama/llama-4-scout:free se toma como el id que es. No escribas ...:free:high en model.

En qué se diferencia de un soldier de Claude Code

TemaSoldier de Claude CodeSoldier de Pi
Permisos--dangerously-skip-permissionsPi no tiene prompts de permisos ni un flag para saltearlos. Tiene el mismo acceso total al host, y aterrizar sigue siendo el control: nada llega a tu historial hasta que aprobás vx land.
Confianza del proyectovexillum descarta el diálogo "trust this folder" de ClaudeArranca con --approve. Pi pregunta "Trust project folder?" y se queda esperando hasta que alguien responda cuando el camp tiene en .pi/ settings, extensions, skills, prompts, themes o archivos de system prompt, o un directorio .agents/skills en él o en un padre. Nadie está en el pane de un soldier, y su respuesta por defecto guarda la decisión en ~/.pi/agent/trust.json. El costo: las extensions de .pi/ que el proyecto tenga commiteadas corren en el soldier. Un soldier ya puede correr cualquier comando como vos, así que eso no suma alcance, pero revisá el .pi/ de un repositorio antes de despachar sobre él.
Terminalnormal--tui-mode regular. Desde 1.0.0 Pi corre en pantalla completa sobre la pantalla alternativa de la terminal por defecto, que no tiene scrollback para leer.
ReglasCLAUDE.md, que importa AGENTS.mdPi lee AGENTS.md en cada carpeta y, solo si no hay, CLAUDE.md. No expande @AGENTS.md. No hace falta nada extra: el bloque de vexillum vive en AGENTS.md (o en CLAUDE.md cuando el proyecto no tiene AGENTS.md), y Pi lee el que lo tenga. Un proyecto con los dos archivos y contenido distinto le muestra a un soldier de Pi solo AGENTS.md.
Skillsel .claude/skills del proyectoninguna. Los soldiers no usan skills en este release.
Preguntasel selector de preguntas de Claude, que se responde con una pulsación de teclauna herramienta ask_user que vexillum le da al soldier, que se responde mediante un archivo (ver Soldiers blocked). Sin la herramienta, una línea needs-decision: que se responde como texto plano.
Despertarel sentinel lee el estado de herdrlo mismo. El sentinel no necesita ninguna extension para vigilar a un soldier de Pi, y el commander se despierta como siempre. (Un commander que corre en Pi tiene una extension propia para eso: ver Pi como commander.)
vx shipel reviewer y el fixer del tribunal corren claude -p en sonnet con effort highcorren pi -p --no-session con el modelo y el nivel de thinking con los que corrió la mission, o el default de Pi cuando el perfil no definió ninguno

Soldiers blocked

Cada soldier de Pi arranca con una extension chica de vexillum que le da una herramienta ask_user: una pregunta, las respuestas probables como opciones, y siempre una forma de escribir otra. La extension viene dentro del binario vx y se escribe en ~/.vexillum/projects/<key>/pi/ask_user.ts cuando despachás, y se carga con pi -e. No se agrega nada al camp, el aviso de confianza del proyecto de Pi nunca le aplica, y nada salvo el propio Pi la ejecuta (no hay que instalar Node ni Python).

Mientras el soldier espera en ask_user:

  1. la extension guarda la pregunta y sus opciones en ~/.vexillum/projects/<key>/asks/<task-id>/ y le avisa a herdr que el soldier está blocked, que es lo único para lo que la integración de herdr para Pi reporta eso;
  2. el sentinel marca la tarea blocked, despierta al commander y guarda la pregunta como la decision de la tarea con "kind": "ask", sus opciones y un question_id;
  3. vos respondés, y el soldier sigue con tu respuesta como resultado de la herramienta.
vx status
vx decide <task-id> 2                      # el número de una opción, desde 1
vx decide <task-id> "Use the existing helper"   # el texto exacto de una opción, o cualquier texto

vx decide escribe la respuesta en un archivo que la extension está esperando, dirigida al id de esa pregunta, y espera a que la extension la tome. No se teclea nada en el pane. Se usa un archivo y no pulsaciones de tecla porque lo que hace una tecla depende de cuál de los diálogos de Pi está abierto y dónde está su cursor, y un prompt enviado a Pi mientras corre una herramienta queda en cola como mensaje de dirección en vez de responder a la herramienta. También podés responder vos mismo en el pane del soldier: el diálogo se cierra igual, y la tarea vuelve sola a running. Si después corrés vx decide, se niega con un mensaje de que la pregunta ya no está abierta, y vx decide <task-id> --dismiss limpia la tarea.

Los archivos guardan solo la pregunta y las opciones que escribió el soldier y tu respuesta: un question.json y un answer.json, legibles solo por vos. Se borran apenas la pregunta se cierra.

Si la extension no se cargó (un Pi viejo, o un pi que falló al arrancar), el soldier no tiene ask_user. Su prompt le dice entonces que termine su turno con una línea needs-decision:, la tarea pasa a blocked con una decision de prosa, y vx decide escribe tu respuesta en el pane como texto plano, así que escribí la respuesta misma y no un número de opción. vx doctor no revisa la extension, porque se carga recién cuando arranca un soldier: si un soldier ignora ask_user, mirá su pane por una línea de Pi sobre la extension, y mirá la checklist del repositorio para confirmar que se cargó.

Si la integración de herdr para Pi no está instalada, herdr no ve al soldier como blocked mientras espera. El sentinel igual bloquea la tarea a partir del archivo de la pregunta abierta, en unos segundos. --dismiss funciona como en cualquier tarea. Ver Blocked e interrupted.

No está en este release

  • Skills para los soldiers de Pi.

Para una checklist con la que verificar una configuración de Pi en una máquina real, mirá docs/verification/pi-soldier-checklist.md en el repositorio.

Relacionado

En esta página