Ubuntu TechHive

Pi Coding Agent - Architecture and Hands-on Guide

Pi Coding Agent - Architecture and Hands-on Guide

Pi es un agente de programación de IA minimalista y extensible que se ejecuta principalmente en la terminal.

Agente de Programación Pi - Arquitectura y Guía Práctica

¿Qué es el Agente de Programación Pi?

Pi es un agente de programación con IA, minimalista y extensible, que se ejecuta principalmente en la terminal.

Permite a los desarrolladores utilizar modelos de lenguaje grandes (LLMs) para interactuar con su entorno de desarrollo local.

Pi puede:

  • Leer y comprender código existente.
  • Crear nuevos archivos y aplicaciones.
  • Modificar código existente.
  • Ejecutar comandos de terminal.
  • Ejecutar pruebas y depurar errores.
  • Gestionar el historial de conversaciones.
  • Conectarse a diferentes proveedores de LLM.
  • Ampliar sus capacidades con herramientas y habilidades personalizadas.
  • Integrar servicios externos a través de MCP.

Pi es un ejemplo de un "Agent Harness" (entorno de ejecución de agentes).

¿Qué es un Agent Harness?

Un Agent Harness es la infraestructura de software que rodea a un modelo de lenguaje y le permite realizar acciones.

El harness es responsable de:

  • Construir el contexto del modelo.
  • Comunicarse con el LLM.
  • Proporcionar herramientas al LLM.
  • Ejecutar las llamadas a herramientas solicitadas.
  • Devolver los resultados de las herramientas al modelo.
  • Gestionar conversaciones y sesiones.
  • Controlar el ciclo de vida de la ejecución.

El LLM proporciona capacidades de razonamiento.

El harness proporciona el entorno en el que ese razonamiento puede traducirse en acciones.

Pi vs. un Chatbot Tradicional

Un chatbot tradicional generalmente sigue este patrón:

flowchart LR
    A["Usuario"] --> B["Prompt"]
    B --> C["LLM"]
    C --> D["Respuesta"]

Un agente de programación con IA añade un entorno de ejecución:

flowchart TD
    A["Usuario"] --> B["Agente Pi"]
    B --> C["LLM"]
    C --> D{"¿Se necesita herramienta?"}
    D -->|Sí| E["Ejecutar Herramienta"]
    E --> F["Devolver Resultado"]
    F --> C
    D -->|No| G["Respuesta Final"]

Ejemplo:

Chatbot: "Aquí tienes código Python que calcula gastos."

Pi: "Creé los archivos de Python, ejecuté el programa, realicé pruebas y corregí un error."

La diferencia importante es la capacidad de interactuar con un entorno real.

Filosofía de Diseño de Pi

Pi sigue una filosofía minimalista.

En lugar de proporcionar todas las funciones posibles como parte de su implementación principal, enfatiza la extensibilidad.

La idea guía es:

"Adapta Pi a tu flujo de trabajo, no al revés."

Principios Fundamentales

Minimalismo:

  • Mantener el núcleo relativamente pequeño.
  • Evitar abstracciones innecesarias.
  • Construir sobre herramientas existentes del sistema operativo.

Extensibilidad:

  • Crear herramientas personalizadas.
  • Construir extensiones.
  • Usar habilidades reutilizables.
  • Conectar servicios externos.

Independencia del Modelo:

  • Usar diferentes proveedores de LLM.
  • Cambiar de modelo dentro del mismo entorno.
  • Comparar el comportamiento de los modelos.

Transparencia:

  • Observar las respuestas del modelo.
  • Inspeccionar las ejecuciones de herramientas.
  • Revisar las modificaciones.
  • Examinar el historial de sesiones.

Lo que Pi no requiere

Una configuración básica de Pi no requiere:

  • Una base de datos vectorial.
  • Un servidor de orquestación separado.
  • Kubernetes.
  • Docker.
  • Un marco de trabajo multi-agente complejo.
  • Una aplicación backend personalizada.

Para una demostración básica, una terminal, un LLM compatible y un directorio local son suficientes.

Descripción General de la Arquitectura de Pi

Pi contiene varias capas lógicas.

Arquitectura de Alto Nivel

flowchart TB
    USER["Desarrollador"]

    subgraph PI["Agente de Programación Pi"]
        UI["Interfaz de Terminal"]
        CORE["Runtime del Agente"]
        CONTEXT["Gestor de Contexto"]
        SESSION["Gestor de Sesiones"]
        TOOLS["Ejecución de Herramientas"]
        EXT["Extensiones / Habilidades"]
        API["Abstracción de API de LLM"]
    end

    subgraph MODELS["Proveedores de LLM"]
        OPENAI["OpenAI"]
        ANTHROPIC["Anthropic"]
        GOOGLE["Google"]
        LOCAL["Modelos Locales"]
    end

    subgraph SYSTEM["Entorno de Desarrollo"]
        FILES["Sistema de Archivos"]
        BASH["Shell"]
        GIT["Git"]
        TESTS["Pruebas"]
    end

    USER <--> UI
    UI <--> CORE

    CORE <--> CONTEXT
    CORE <--> SESSION
    CORE <--> TOOLS
    CORE <--> API

    EXT --> CORE

    API <--> OPENAI
    API <--> ANTHROPIC
    API <--> GOOGLE
    API <--> LOCAL

    TOOLS <--> FILES
    TOOLS <--> BASH
    TOOLS <--> GIT
    TOOLS <--> TESTS

Esta es una arquitectura conceptual, que muestra las principales responsabilidades en lugar de cada dependencia interna.

Paquetes Internos de Pi

Pi se desarrolla como una colección de paquetes de TypeScript.

pi-ai

Una interfaz unificada para trabajar con diferentes proveedores de LLM.

Responsabilidades:

  • Solicitudes al modelo.
  • Respuestas del modelo.
  • Streaming.
  • Integraciones específicas del proveedor.
  • Representación de llamadas a herramientas.

pi-agent-core

El runtime del agente.

Responsabilidades:

  • Bucle de ejecución del agente.
  • Llamadas a herramientas.
  • Estado del agente.
  • Manejo de mensajes.
  • Eventos de ejecución.

pi-coding-agent

La aplicación del agente de programación.

Responsabilidades:

  • CLI.
  • Herramientas de programación.
  • Sesiones.
  • Archivos de contexto.
  • Extensiones.
  • Habilidades.
  • Configuración del usuario.

pi-tui

Componentes de la Interfaz de Usuario de Terminal.

Responsabilidades:

  • Renderizado de terminal.
  • Manejo de entrada.
  • Componentes interactivos.
  • Visualización de la actividad del agente.

Relación de Paquetes

flowchart TD
    USER["Desarrollador"]
    TUI["pi-tui"]
    CODING["pi-coding-agent"]
    CORE["pi-agent-core"]
    AI["pi-ai"]
    LLM["Proveedores de LLM"]

    USER <--> TUI
    TUI <--> CODING
    CODING <--> CORE
    CORE <--> AI
    AI <--> LLM

    CODING --> FS["Herramientas"]
    CODING --> SESSION["Sesiones"]
    CODING --> EXT["Extensiones"]

La misma infraestructura de agente también se puede utilizar a través de interfaces no interactivas.

Cómo funciona Pi

Pi sigue un ciclo de interacción repetido entre el usuario, el runtime del agente, el modelo de lenguaje y las herramientas.

Esto se conoce comúnmente como el Bucle del Agente (Agent Loop).

Paso 1 - El usuario envía una solicitud

Ejemplo:

"Crea una aplicación de Python que rastree gastos."

Pi recibe esta solicitud a través de su interfaz de terminal.

Paso 2 - Ensamblaje del contexto

Antes de contactar al LLM, Pi prepara el contexto.

Esto puede incluir:

  • Instrucciones del sistema.
  • Solicitud del usuario.
  • Historial de conversación activo.
  • Herramientas disponibles.
  • Instrucciones del proyecto desde AGENTS.md.
  • Descripciones de habilidades.
  • Contenido de archivos relevantes.
  • Configuración del modelo.

La rama de sesión activa determina qué mensajes históricos se incluyen.

Paso 3 - Solicitud al modelo

Pi envía la solicitud preparada al proveedor de LLM seleccionado.

El LLM puede producir:

  • Texto en lenguaje natural.
  • Llamadas a herramientas estructuradas.
  • Una combinación de ambos.

Ejemplo de solicitud de herramienta:

Herramienta: write Archivo: expenses.py Contenido: Código fuente de Python

El LLM no escribe el archivo directamente.

Solicita que Pi ejecute la operación.

Paso 4 - Ejecución de la herramienta

Pi recibe la llamada a la herramienta solicitada.

El ejecutor de herramientas realiza la acción.

Ejemplos:

  • Leer un archivo.
  • Escribir un archivo.
  • Modificar código.
  • Ejecutar un comando de shell.

Pi luego captura el resultado.

Paso 5 - Devolver resultados de la herramienta

La salida se devuelve al runtime del agente.

Ejemplo:

Herramienta: bash Comando: python expenses.py

Resultado: Traceback: NameError …

El resultado se convierte en parte del contexto disponible para el LLM.

Paso 6 - Continuar o finalizar

El LLM puede decidir:

  • Llamar a otra herramienta.
  • Modificar el código.
  • Ejecutar pruebas adicionales.
  • Proporcionar una respuesta final.

Pi repite el proceso mientras se requiera más ejecución.

Esta interacción es la base del comportamiento agéntico.

Diagrama completo del bucle del agente

flowchart TD
    START["Solicitud del Usuario"]
    CTX["Construir Contexto"]
    CALL["Llamar al LLM"]
    RESPONSE["Recibir Respuesta del Modelo"]
    DECISION{"¿Llamadas a herramientas?"}
    EXEC["Ejecutar Herramientas"]
    RESULT["Recopilar Resultados de Herramientas"]
    FINISH["Respuesta Final"]

    START --> CTX
    CTX --> CALL
    CALL --> RESPONSE
    RESPONSE --> DECISION

    DECISION -->|Sí| EXEC
    EXEC --> RESULT
    RESULT --> CALL

    DECISION -->|No| FINISH

Diagrama de secuencia

sequenceDiagram
    autonumber
    actor Usuario
    participant Pi as Agente Pi
    participant LLM
    participant Tools as Herramientas
    participant OS as Sistema Operativo

    Usuario->>Pi: Crea un rastreador de gastos
    Pi->>Pi: Ensamblar contexto
    Pi->>LLM: Enviar prompt y definiciones de herramientas

    LLM-->>Pi: Solicitar herramienta write
    Pi->>Tools: write expenses.py
    Tools->>OS: Crear archivo
    OS-->>Tools: Éxito
    Tools-->>Pi: Resultado de la herramienta

    Pi->>LLM: Continuar con el resultado
    LLM-->>Pi: Solicitar herramienta bash
    Pi->>Tools: Ejecutar programa Python
    Tools->>OS: Ejecutar comando
    OS-->>Tools: Salida
    Tools-->>Pi: Resultado de la ejecución

    Pi->>LLM: Continuar
    LLM-->>Pi: Respuesta final
    Pi-->>Usuario: Tarea completada

Por qué esto es importante

Se separan tres responsabilidades:

  1. LLM: Genera razonamiento y propone acciones.
  2. Agent Harness: Coordina la ejecución y gestiona el contexto.
  3. Herramientas: Realizan operaciones en el entorno.

Esta arquitectura también es fundamental para muchas otras implementaciones de agentes de IA.

Herramientas en Pi

La configuración de programación mínima de Pi utiliza cuatro herramientas fundamentales.

read

Leer el contenido de archivos.

Ejemplo de prompt:

"Lee app.py y explica su estructura."

write

Crear o sobrescribir archivos.

Ejemplo de prompt:

"Crea un programa en Python que imprima Hello TechHive."

edit

Modificar archivos existentes.

Ejemplo de prompt:

"Modifica el programa para aceptar un nombre de usuario."

bash

Ejecutar comandos de shell.

Ejemplo de prompt:

"Ejecuta el programa y muestra el resultado."

Ejemplo de ejecución de herramienta

flowchart TD
    A["Usuario: Corrige el error"]
    B["El LLM analiza la solicitud"]
    C["read: Inspeccionar código"]
    D["edit: Corregir código"]
    E["bash: Ejecutar pruebas"]
    F{"¿Pasan las pruebas?"}
    G["Respuesta final"]

    A --> B
    B --> C
    C --> D
    D --> E
    E --> F
    F -->|No| B
    F -->|Sí| G

Pueden estar disponibles herramientas y extensiones integradas adicionales según la versión y la configuración.

Gestión de contexto y sesiones

¿Qué es el contexto?

El contexto es la información suministrada al LLM para una solicitud de modelo.

Puede incluir:

  • Solicitud actual del usuario.
  • Historial de conversación.
  • Resultados de herramientas.
  • Instrucciones del sistema.
  • Instrucciones del proyecto.
  • Descripciones de habilidades.
  • Contenido de archivos referenciados.

Pi no carga automáticamente cada archivo en un repositorio en el contexto del LLM.

Selecciona y ensambla el contexto según la sesión y los recursos configurados.

AGENTS.md

AGENTS.md es un archivo de instrucciones del proyecto.

Ejemplo:

# Instrucciones del Proyecto

Este proyecto es para un taller de agentes de programación.

Directrices:
- Usa Python.
- Prefiere la biblioteca estándar.
- Mantén el código simple.
- Escribe funciones legibles.
- Añade pruebas para nuevas funciones.
- Explica los cambios importantes.

Estas instrucciones ayudan a guiar el comportamiento del agente dentro del proyecto.

Sesiones

Pi mantiene sesiones de conversación.

Las sesiones pueden incluir:

  • Mensajes del usuario.
  • Mensajes del asistente.
  • Llamadas a herramientas.
  • Resultados de herramientas.
  • Cambios de modelo.
  • Eventos de compactación de contexto.

Las sesiones persistentes utilizan archivos JSONL.

Ramificación de sesiones

Pi admite una estructura de conversación basada en árbol.

flowchart TD
    A["Iniciar Sesión"]
    B["Crear Aplicación"]
    C["Añadir Almacenamiento de Datos"]

    D["Enfoque CSV"]
    E["Enfoque SQLite"]

    F["Probar CSV"]
    G["Probar SQLite"]

    A --> B
    B --> C
    C --> D
    C --> E
    D --> F
    E --> G

Las ramas permiten la exploración de enfoques alternativos desde estados de conversación anteriores.

Compactación de contexto

Las conversaciones largas pueden exceder la ventana de contexto de un modelo.

Pi puede resumir el contexto antiguo para reducir la cantidad de información enviada en futuras solicitudes al modelo.

Comando:

/compact

La compactación ayuda a gestionar el tamaño del contexto, pero puede perder algunos detalles de mensajes antiguos.

Las entradas de sesión originales pueden permanecer en el historial de sesiones almacenado.

Proveedores de modelos

Pi puede trabajar con múltiples proveedores de LLM.

Ejemplos:

  • OpenAI.
  • Anthropic.
  • Google.
  • Otros proveedores compatibles.
  • Modelos locales configurados.

Independencia del modelo

flowchart TD
    USER["Desarrollador"]
    PI["Agente Pi"]
    API["Interfaz de Modelo Unificada"]

    USER --> PI
    PI --> API

    API --> A["OpenAI"]
    API --> B["Anthropic"]
    API --> C["Google"]
    API --> D["Modelo Local"]

Ventajas:

  • Flexibilidad.
  • Comparación de modelos.
  • Elección del proveedor.
  • Optimización de costos.
  • Experimentación.

Las capacidades y la compatibilidad de los modelos pueden variar.

Ampliando Pi

Pi se puede personalizar sin modificar su núcleo.

AGENTS.md

Instrucciones específicas del proyecto.

Plantillas de prompt

Prompts reutilizables para actividades recurrentes.

Ejemplos:

  • Revisión de código.
  • Documentación.
  • Generación de pruebas.
  • Refactorización.

Habilidades

Instrucciones reutilizables y recursos de apoyo para flujos de trabajo especializados.

Ejemplos:

  • Flujo de trabajo de pruebas en Python.
  • Flujo de trabajo de despliegue.
  • Generación de documentación.
  • Desarrollo de API.

Extensiones

Personalización basada en TypeScript.

Las extensiones pueden:

  • Definir herramientas personalizadas.
  • Registrar comandos.
  • Reaccionar a eventos del ciclo de vida.
  • Integrar servicios externos.
  • Personalizar el comportamiento interactivo.

Integración MCP

MCP significa Model Context Protocol (Protocolo de Contexto de Modelo).

Proporciona una forma estandarizada para que las aplicaciones accedan a herramientas y recursos externos.

Las versiones modernas de Pi proporcionan soporte MCP integrado.

Ejemplos de integraciones:

  • GitHub.
  • Bases de datos.
  • Aplicaciones internas.
  • Servicios remotos.

Arquitectura de extensiones

flowchart TD
    PI["Agente Pi"]

    PI --> A["AGENTS.md"]
    PI --> B["Plantillas de Prompt"]
    PI --> C["Habilidades"]
    PI --> D["Extensiones"]
    PI --> E["MCP"]

    D --> F["Comandos Personalizados"]
    D --> G["Herramientas Personalizadas"]
    D --> H["Manejadores de Eventos"]

    E --> I["Servicios Externos"]

Modos de ejecución de Pi

Pi admite múltiples interfaces.

Interactivo

Lanzar la interfaz de terminal.

pi

Modo de impresión

Ejecutar un prompt e imprimir su respuesta.

pi -p "Explica los decoradores de Python"

Modo JSON

Transmitir eventos de agente estructurados.

pi --mode json -p "Explica este proyecto"

Modo RPC

Controlar Pi usando mensajes JSONL a través de entrada y salida estándar.

SDK

Integrar las capacidades del agente Pi en aplicaciones TypeScript.

flowchart TD
    CORE["Runtime del Agente Pi"]

    CORE --> A["TUI Interactiva"]
    CORE --> B["Imprimir / JSON"]
    CORE --> C["RPC"]
    CORE --> D["SDK de TypeScript"]

    A --> E["Desarrollador"]
    B --> F["Scripts de Automatización"]
    C --> G["Aplicación Externa"]
    D --> H["Aplicación de Agente Personalizada"]

Instalación y configuración mínima

Instalar Pi

macOS / Linux:

curl -fsSL https://pi.dev/install.sh | sh

Windows PowerShell:

irm https://pi.dev/install.ps1 | iex

Alternativa usando npm:

npm install -g --ignore-scripts @earendil-works/pi-coding-agent

La instalación de npm requiere Node.js 22.19 o superior.

Verificar la instalación

pi --version

Crear un proyecto

mkdir pi-techhive-demo
cd pi-techhive-demo
git init

Iniciar Pi

pi

Configurar la autenticación

Dentro de Pi:

/login

Selecciona un proveedor compatible y autentícate.

Luego:

/model

Selecciona el modelo que deseas usar.

Comandos esenciales

Comando Propósito
/login Autenticar un proveedor de modelo
/model Seleccionar un modelo
/thinking Establecer nivel de pensamiento
/settings Abrir configuración
/new Iniciar nueva sesión
/resume Reanudar sesión
/session Información de la sesión
/tree Navegar por el historial de conversación
/fork Bifurcar desde un mensaje anterior
/compact Compactar contexto
/mcp Gestionar servidores MCP
/reload Recargar recursos
/export Exportar sesión
/share Compartir sesión
/quit Salir de Pi

Escribe / en la interfaz de terminal para descubrir los comandos disponibles en la versión instalada.

Demostración práctica: Rastreador de gastos

Crear un directorio de proyecto

mkdir expense-tracker
cd expense-tracker
git init
pi

Explorar el proyecto

Prompt:

Inspecciona el directorio actual.

Explica qué archivos están presentes.

No modifiques nada.

Concepto: Exploración del sistema de archivos y operaciones de lectura.

Generar una aplicación

Prompt:

Crea un rastreador de gastos simple en Python.

Requisitos:
- Añadir un gasto.
- Listar gastos.
- Calcular el total de gastos.
- Almacenar gastos en un archivo CSV.
- Usa solo la biblioteca estándar de Python.

Mantén la implementación simple.

Concepto: Generación de código y creación de archivos.

Ejecutar el programa

Prompt:

Ejecuta la aplicación.

Crea tres ejemplos de gastos.

Verifica que el total se calcule correctamente.

Concepto: Ejecución de shell y observación de resultados.

Añadir pruebas automatizadas

Prompt:

Crea pruebas unitarias usando unittest de Python.

Prueba la creación de gastos y el cálculo del total.

Ejecuta las pruebas y corrige cualquier error.

Concepto: Pruebas autónomas y corrección iterativa.

Ampliar la aplicación

Prompt:

Añade una función para agrupar gastos por categoría.

Muestra el total para cada categoría.

Actualiza las pruebas y ejecútalas.

Concepto: Modificación de código y retención de contexto.

Explorar la gestión de sesiones

Comandos:

/session /tree /model

Concepto: Historial de sesiones, ramificación y cambio de modelo.

Consideraciones de seguridad

Pi puede ejecutar comandos con los permisos disponibles para su proceso en ejecución.

No solicita necesariamente aprobación antes de cada llamada a herramienta.

Prácticas recomendadas:

  • Trabaja dentro de un directorio de proyecto dedicado.
  • Usa Git antes de modificar código importante.
  • Evita exponer credenciales.
  • Inspecciona el código generado.
  • Revisa las extensiones externas.
  • No utilices datos confidenciales en demostraciones públicas.
  • Usa contenedores o entornos aislados (sandboxes) para tareas no confiables.
  • Revisa el contenido de la sesión antes de compartirlo.

Un agente de programación con IA no es un reemplazo para las prácticas de seguridad y revisión de código.

Pi comparado con otras herramientas

Pi

Entorno de agente de programación minimalista y extensible.

Fortalezas:

  • Personalización.
  • Múltiples proveedores de LLM.
  • Ejecución de herramientas.
  • Gestión de sesiones.
  • Extensibilidad.

Claude Code

Agente de programación con un conjunto integrado de herramientas y flujos de trabajo de desarrollo.

Codex CLI

Agente de programación diseñado para trabajar con bases de código, comandos de terminal y flujos de trabajo de desarrollo.

LangChain / LangGraph

Marcos de trabajo para desarrollar aplicaciones de LLM personalizadas y flujos de trabajo agénticos.

Pi es principalmente un entorno de agente listo para usar y extensible, en lugar de un marco de trabajo de grafos de flujo de trabajo de propósito general.

Conclusiones clave

  1. Pi es un Agent Harness, no un LLM.
  2. El LLM propone acciones; Pi coordina la ejecución.
  3. El Bucle del Agente permite la ejecución de tareas en varios pasos.
  4. Las herramientas permiten a Pi interactuar con un entorno de desarrollo.
  5. El contexto y las sesiones mantienen la continuidad de la conversación.
  6. Pi no está vinculado a un solo proveedor de LLM.
  7. Las extensiones y habilidades permiten la personalización.
  8. Las arquitecturas minimalistas aún pueden admitir flujos de trabajo agénticos sofisticados.
  9. La supervisión humana y el aislamiento adecuado siguen siendo importantes.