simon mersich
volver

C3PO, parte 2: un agente de verdad y una interfaz de chat

c3po/2

En la parte 1, Claude Code manejaba un Unitree G1 simulado a través de un servidor MCP, desde mi terminal. Eso demostró que el loop funciona — y dejó claros los límites: todo corría solo en mi máquina, adentro de una herramienta hecha para editar código. Nadie más podía hablarle al robot.

Este mes fue convertir a C3PO en un sistema en vez de un hack.

El agente se muda al backend

C3PO ya era un monorepo con un frontend en SvelteKit y un backend en Elysia sobre Bun; el lado robot simplemente no los había tocado. Ahora el backend corre su propio agente: un loop con streaming sobre el Vercel AI SDK con Claude como modelo, thinking habilitado, y un tope de una docena de pasos de herramientas por turno.

La parte interesante es que nada del robot cambió. Las habilidades viven en un registro con esquemas JSON; el backend las convierte en herramientas para el modelo, y cada llamada se despacha por MCP (streamable HTTP esta vez, en vez de stdio) al mismo bridge de Python de la parte 1. La capa de habilidades no sabe ni le importa quién maneja — Claude Code, este agente, lo que venga después. Cambiar de anfitrión del cerebro no tocó las habilidades, el bridge ni el protocolo.

Dos detalles que me alegra haber metido temprano: las fallas de herramientas se devuelven al modelo como errores en vez de matar el stream, así puede reaccionar y reintentar — y el system prompt tiene una regla de honestidad, porque algunas habilidades son solo-log en el simulador: nunca afirmar que el robot se movió cuando no lo hizo.

Una interfaz de chat

La terminal es mi hábitat natural, pero “tipear en una CLI en mi laptop” no es la forma de hablarle a un robot. C3PO ahora tiene una consola de verdad: un chat donde las respuestas llegan en streaming y cada invocación de habilidad aparece como una pastillita monoespaciada con su estado — pendiente, lista, fallida. Hay un botón de stop, y al lado del chat, un mapa en vivo que consulta el estado del robot cada un par de segundos (pose, rumbo, recorrido, batería, latencia), una vista de cámara en vivo streameada por WebRTC desde las cámaras de cabeza y muñecas del simulador, y un gran botón rojo de PARAR cableado directo a stop_everything.

La parte que de verdad me entusiasma

El simulador fue el punto todo este tiempo — y está por dejar de serlo. Un Unitree G1 real está en camino, llega en unas semanas. El terreno ya está preparado en el repo: el robot real habla topics de DDS distintos a los del simulador, así que hay un catálogo completo del protocolo que mapea cada habilidad a la API del firmware real, y un decodificador de fallas que entiende sus códigos de error, hasta la parada de emergencia.

La parte 3 se va a escribir al lado de un robot.

Código: github.com/mercho40/C3PO.

enes