Volver al blog
ia agentes glm function-calling portfolio

Un asistente agéntico para mi portfolio, con GLM y function calling

3 min de lectura

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:

  1. 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.
  2. 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.
  3. 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.