Un asistente agéntico para mi portfolio, con GLM y function calling
Un asistente agéntico para mi portfolio, con GLM y function calling
Esta web tiene un asistente en la esquina inferior derecha. No es el típico chatbot que te suelta párrafos: abre demos, filtra proyectos, te genera mi CV en PDF al momento y hasta te hace un tour guiado por la página. En este post te cuento cómo está montado, porque cabe en una tarde y se aprende mucho por el camino.
La arquitectura en tres líneas
El navegador habla con /api/chat, un endpoint que sirve un proxy propio de unas 200 líneas de Node sin dependencias. El proxy inyecta el system prompt, las herramientas y los límites, y reenvía la conversación al endpoint OpenAI-compatible de GLM. La clave de API nunca sale del servidor.
Navegador ──/api/chat──> proxy (Node, mismo dominio) ──> GLM
Al servir el proxy bajo el mismo dominio que la web no hay CORS, no hay clave expuesta y no hay forma de que alguien manipule el prompt desde fuera. El proxy valida cada mensaje contra una lista blanca de campos y rechaza cualquier intento de colar un rol system.
Las herramientas viven en dos sitios
Aquí está la parte que más me gusta. Las definiciones de las herramientas (qué existe y qué parámetros acepta) viven en el servidor, dentro del prompt. Pero la ejecución ocurre en el navegador: cuando GLM decide llamar a open_project_demo, el cliente recibe la tool call, abre la pestaña y devuelve el resultado para que el modelo remate la respuesta.
Eso da cosas que un chatbot normal no puede hacer: el asistente navega la página contigo, scrollea hasta un proyecto o dispara la generación del CV. El PDF, por cierto, se construye en tu navegador con pdf-lib a partir de los mismos datos que ves en la web, así que nunca está desactualizado.
Streaming de verdad
La primera versión esperaba la respuesta completa y la soltaba de golpe. Se sentía lenta aunque no lo fuera. Ahora el proxy reenvía el stream SSE tal cual llega y el widget pinta cada token; las tool calls llegan fragmentadas en deltas y un pequeño parser las va ensamblando por índice. Ese parser tiene sus propios tests, porque los chunks se parten donde les da la gana y el bug clásico es asumir que cada evento llega entero.
Lo que aprendí
Tres cosas que me llevo:
- El prompt es producto. El asistente sabe mi trayectoria con fechas, responde en el idioma del visitante y puede analizar el encaje con una oferta de trabajo. Todo eso es prompt, no código.
- Un proxy fino da mucho control. Límites de tokens, rate limit por IP y validación estricta en 200 líneas que puedo leer enteras.
- La demo es el argumento. Si te dedicas a construir sistemas agénticos, tu web puede demostrarlo en vez de contarlo.
Pruébalo: dale al botón de la esquina y pídele un tour. Y si se equivoca, la culpa es mía, que lo construí yo.