Este tutorial crea un agente con llamadas a funciones donde la herramienta expuesta al modelo nunca ejecuta SQL arbitrario. Combina dos mecanismos ya verificados en el código de Aurabase: el validador NL2SQL y una transacción Postgres de solo lectura, dos ladrillos de la IA nativaintegrada en el backend. Requisitos previos: un proyecto de Aurabase, su clave service_roley una cuenta con uno de los tres proveedores nativos de LLM (OpenAI, Anthropic, Gemini).
Lo esencial
- El riesgo real no es la función que se llama a sí misma, sino la herramienta expuesta al modelo: un
execute_sql(query)sin formato le da acceso completo a SQL. - La arquitectura segura expone una herramienta
query_database(question)que delega a un validador de árbol de sintaxis (solo SELECCIONAR, LÍMITE limitado, esquema aislado) en lugar de ejecución directa. - Aurabase expone este validador de forma nativa (
/nl2sql): reutilizarlo como una implementación de la herramienta evita tener que recodificar la validación SQL usted mismo. - El SQL confirmado luego se ejecuta a través de
aura.db.sql()en modoreadOnly: true, una transacción Postgres real de solo lectura, no un simple filtro textual. - El punto final nativo
/chatde Aurabase aún no acepta una funcióntoolni un parámetrotools(verificado en el código): el bucle del agente actualmente se ejecuta a través del SDK del proveedor LLM, no a través del proxy de Aurabase. - La clave
service_roleomite RLS por diseño: nunca debe abandonar su servidor y el agente hereda un acceso más amplio que un usuario autenticado típico.
que construiras
Creará un agente que responda preguntas en lenguaje natural sobre datos en un proyecto de Postgres, sin dejar que el modelo escriba SQL que se ejecute tal cual. El modelo llama a una herramienta llamada query_database, esta herramienta traduce la pregunta a SQL validado mediante NL2SQL, luego ejecuta este SQL de solo lectura y devuelve las líneas al modelo para que formule su respuesta.
Este tutorial utiliza el SDK de JavaScript @aurabase/aurabase-js en el lado del servidor (nunca en el lado del navegador, la clave service_role no debe estar expuesta al cliente) y la función OpenAI que llama a la API para el bucle del agente. El mismo principio se aplica con Anthropic o Gemini SDK.
Por qué una herramienta "ejecutar este SQL" es peligrosa
La mayoría de los tutoriales del agente Postgres, incluidas algunas guías oficiales, definen una única herramienta: una función execute_sql que toma una cadena SQL como argumento y la ejecuta tal cual. El modelo escribe esta cadena por sí mismo, según la pregunta del usuario y el esquema que se le proporciona en contexto.
Esta elección transfiere al modelo una responsabilidad que no puede cumplir de forma fiable. Una inyección rápida en la pregunta puede producir SQL destructivo que la herramienta ejecuta indiscriminadamente, ya que no tiene concepto de cómo debería ser una consulta "legítima". Nuestro artículo dedicado detalla este vector de ataque: asegurando NL2SQL contra inyección SQL.
La alternativa creada en este tutorial expone una herramienta más limitada, query_database(question). El modelo ya no puede escribir SQL directamente: sólo puede hacer una pregunta en su propia llamada a la herramienta. Es el motor Aurabase NL2SQL el que traduce esta pregunta a SQL, antes de pasarla por un validador de árbol sintáctico (SELECT solo, sin subconsultas, diez funciones autorizadas, LIMIT limitado).
Una herramienta execute_sql(query: string) le brinda al modelo acceso completo a SQL, independientemente de qué tan bueno sea el indicador del sistema. Una instrucción ("solo ejecuta SELECT") sigue siendo una instrucción que el modelo puede seguir, malinterpretar o ver eludida mediante una inyección deslizada en la pregunta del usuario.
Definir el esquema de la herramienta expuesta al modelo.
Los tres proveedores nativos de LLM de Aurabase (OpenAI, Anthropic, Gemini) aceptan una tabla de definiciones de herramientas en formato JSON Schema. A este agente le basta una sola herramienta: query_database, que responde una pregunta en lenguaje natural y nada más. El modelo no ve el esquema SQL ni un campo query que pueda completar por sí mismo.
Implementar la herramienta: NL2SQL luego de solo lectura
El controlador de herramientas se ejecuta en su backend, nunca en el navegador. Lleva la clave de proyecto service_role, que omite RLS por diseño y, por lo tanto, nunca debe exponerse a un cliente. Realiza dos llamadas al SDK de Aurabase.
La primera llamada traduce la pregunta a SQL validado mediante aura.ai.nl2sql(): solo SELECT, LIMIT limitado, sin acceso al catálogo del sistema. El segundo ejecuta este SQL ya validado a través de aura.db.sql(), con la opción readOnly: true: el propio Postgres rechaza entonces cualquier escritura en esta transacción, independientemente de la validación textual ya aplicada por NL2SQL upstream.
readOnly: true desencadena una transacción Postgres real de solo lectura: el motor rechaza la escritura, no es un filtro aplicado al texto de la solicitud. Combinado con la validación exclusiva SELECT de NL2SQL, el agente tiene dos capas independientes: si una tiene un defecto, la otra aún se mantiene.
El bucle del agente: función que llama en el lado del SDK del proveedor
Aurabase expone tres proveedores LLM nativos, pero su punto final /chat aún no transmite un parámetro tools o función tool. ChatOptions solo transporta temperature, max_tokens y model, y los roles aceptados están limitados a system, user y assistant (verificados en llm/mod.rs y handlers/chat.rs). Por lo tanto, el bucle de llamada a la función se ejecuta hoy directamente a través del SDK del proveedor, no a través del proxy de Aurabase.
Siempre que Aurabase no organice de forma nativa llamadas a herramientas, su backend debe administrar el bucle con OpenAI, Anthropic o Gemini SDK. La ejecución de NL2SQL y SQL siguen siendo llamadas clásicas de Aurabase dentro de este bucle.
El principio sigue siendo el mismo si organiza el agente con LangChain o un servicio como Azure AI Agent: la herramienta declarada en el marco debe seguir siendo la misma query_database, nunca un ejecutor de SQL sin formato. Nuestra comparación detalla dónde LangChain y LlamaIndex brindan valor real en Postgres, y dónde agregan complejidad especialmente: Agentes de Postgres con LangChain o LlamaIndex.
Prueba con una pregunta real
Pregunta enviada al agente: "¿Cuántos clientes premium realizaron un pedido este mes?" ". La plantilla llama a query_database con esta pregunta tal cual, sin ver ni escribir ningún SQL. Aquí está el resultado de las dos llamadas internas activadas por la herramienta.
La respuesta final del modelo se basa en estas líneas reales, no en una suposición. Si la herramienta devuelve cero filas, una alucinación numérica se vuelve significativamente menos probable que con un modelo que respondería sin datos verificados.
Asegure al agente antes de entrar en producción.
- La clave
service_rolenunca sale de su backend: ni en el mensaje enviado al modelo, ni en un registro, ni en una variable de entorno del lado del cliente. readOnly: truepermanece activo enaura.db.sql()para esta herramienta específica, incluso si su proyecto necesita escribirse en otra parte de la aplicación.service_roleomite RLS por diseño. Si el agente debe responder de manera diferente según el usuario que hace la pregunta, filtre explícitamente en SQL o recurra a los puntos finales clásicos de PostgREST, que respetan RLS. Consulte aislamiento RLS multiinquilino.- Registre cada llamada a la herramienta (pregunta formulada, SQL validado, número de líneas): este es el único seguimiento utilizable si una pregunta produce un resultado inesperado.
- La limitación de tarifas y la cuota mensual de Aurabase ya se aplican por proyecto en
/nl2sql: un agente hablador no puede exceder silenciosamente su presupuesto de IA.
Límites actuales a tener en cuenta
La herramienta query_database hereda todas las limitaciones del validador NL2SQL: sin subconsultas, sin CTE/WITH, sin UNION y una lista cerrada de diez funciones SQL. Una pregunta que naturalmente requiere una subconsulta (“clientes que nunca han realizado pedidos”) debe reformularse o procesarse con una segunda herramienta dedicada en lugar de forzarla a NL2SQL.
Actualmente no existe ninguna orquestación de llamadas a herramientas dentro del proxy Aurabase /chat: el bucle del agente descrito aquí reside en el código de su aplicación, no en un servicio administrado. Si el agente debe encadenar varias herramientas (base de datos y RAG documental, por ejemplo), es su backend quien organiza las dos llamadas.
RAG y llamada a funciones combinadas
Este tutorial cubre preguntas estructuradas sobre datos relacionales. Para preguntas sobre contenido no estructurado (documentos, tickets, notas), el mismo agente puede exponer una segunda herramienta conectada al RAG nativo de Aurabase (pgvector, búsqueda HNSW). Las dos capacidades y su articulación se detallan en la página AI nativa en Postgres.