SDK para Python
El SDK oficial de Pando para Python permite realizar una integración programática robusta en tus proyectos modernos desarrollados en Python (3.10+), flujos de trabajo automatizados, scripts de sistema, servicios de backend y utilidades CLI.
Repositorio en GitHub: madeindigio/pando-python-sdk
Requisitos Previos
- Python 3.10 o superior.
- La CLI de
pandoinstalada y disponible en elPATHde tu sistema (o definida mediante la variable de entornoPANDO_PATHo configurada en los parámetros del cliente).
Instalación
pip install pando-sdkPara añadir soporte del cliente de red HTTP REST (opcional):
pip install pando-sdk[http]1. Modo Subproceso (PandoClient)
PandoClient es la opción ideal para flujos de automatización de un solo turno donde deseas arrancar un subproceso de pando de manera transparente y capturar toda su salida.
from pando import PandoClient
client = PandoClient(
cwd="/ruta/a/tu/proyecto", # Directorio de trabajo
model="claude-sonnet-4-6", # Modelo de lenguaje
timeout=300, # Tiempo límite en segundos
)
# Ejecución síncrona
result = client.run("Ejecuta los tests del proyecto e informa cuáles fallaron", allow_all_tools=True)
print(result.response)
print(result.session_id)2. Modo Sesión ACP (PandoAgent y PandoSession)
Es la manera recomendada para desarrollar flujos de conversación de múltiples turnos y de tipo interactivo (tales como bots o interfaces persistentes). PandoAgent se conecta de manera continua sobre stdin/stdout utilizando el protocolo ACP y JSON-RPC.
Flujo Asíncrono Streaming (Recomendado)
import asyncio
from pando import PandoAgent
async def main():
async with PandoAgent(
cwd="/ruta/a/tu/proyecto",
model="claude-sonnet-4-6",
persona="software-engineer",
) as agent:
session = await agent.create_session("Refactorización de código")
async for event in session.send("Analiza y optimiza la lógica de autenticación"):
match event.type:
case "content_delta":
print(event.delta, end="", flush=True)
case "tool_call":
print(f"\n[Llamada a Herramienta] {event.tool_call['name']}")
case "tool_result":
print(f"[Resultado de Herramienta] {event.tool_result['content'][:80]}...")
case "response":
print("\n[Completado]")
case "error":
raise RuntimeError(event.error)
asyncio.run(main())Gestor de Contexto Síncrono
Si prefieres un enfoque clásico sin código asíncrono, puedes hacer uso de las siguientes funciones síncronas integradas en el SDK:
from pando import PandoAgent
with PandoAgent(cwd="/ruta/a/tu/proyecto") as agent:
session = agent.create_session_sync("Mi Tarea Síncrona")
for event in session.send_sync("Revisa el archivo config.py"):
if event.type == "content_delta":
print(event.delta, end="", flush=True)
print()Obtener Respuesta Directa Sin Streaming
Si quieres consultar a la IA y obtener la respuesta final consolidada directamente en una variable de texto:
async with PandoAgent(cwd="/ruta/a/tu/proyecto") as agent:
session = await agent.create_session()
response = await session.ask("Explica las migraciones de base de datos actuales")
print(response)3. Cliente HTTP REST (PandoHttpClient)
Si cuentas con un servidor o daemon centralizado ejecutando pando serve o pando app, puedes conectarte mediante HTTP utilizando la clase PandoHttpClient:
import asyncio
from pando import PandoHttpClient
async def main():
async with PandoHttpClient(
base_url="http://localhost:8765",
verify_ssl=False, # Útil para saltarse la validación de certificados autofirmados en desarrollo
) as client:
# Crear una sesión de trabajo de forma remota
session = await client.sessions.create("Mi Sesión REST")
# Escuchar de forma progresiva las respuestas por Server-Sent Events (SSE)
async for chunk in client.sessions.send_message(session.session_id, "Analizar métricas"):
if chunk.delta:
print(chunk.delta, end="", flush=True)
# Modificar el modelo de lenguaje de forma global en el servidor
await client.models.set_active("claude-sonnet-4-6")
asyncio.run(main())Manejo de Excepciones
Todas las excepciones del SDK heredan de la clase de excepción base común PandoError:
PandoError
├── PandoBinaryNotFoundError # No se encuentra la CLI de Pando en el sistema
├── PandoConnectionError # Error al levantar el proceso o de comunicación
├── PandoSessionError # Errores lógicos de estados en la sesión de trabajo
├── PandoTimeoutError # Se excedió el tiempo límite configurado
└── PandoRPCError(code, msg) # Código y mensaje de error de protocolo JSON-RPCfrom pando import PandoError, PandoBinaryNotFoundError
try:
result = client.run("Hola")
except PandoBinaryNotFoundError as e:
print(f"La CLI de Pando no está instalada. Detalle: {e}")
except PandoError as e:
print(f"Ocurrió un error en el SDK de Pando: {e}")