Cómo integrar GeneXus 18 con Globant Enterprise AI




Si trabajás con GeneXus 18, podés potenciar tus apps con Globant Enterprise AI (GEAI) para sumar inteligencia conversacional, recuperación de conocimiento (RAG) y automatización mediante agentes. En esta guía vas a ver: conceptos clave, arquitectura, paso a paso del lado de GEAI y del lado de GeneXus, y ejemplos de código listos para adaptar.

¿Qué es Globant Enterprise AI?

GEAI es una plataforma empresarial para crear y gobernar asistentes y agentes que combinan modelos generativos, herramientas externas y pipelines de recuperación (RAG) dentro de un entorno controlado. Actúa como capa de orquestación: desacopla tu aplicación del modelo, gestiona credenciales, costos, métricas, versiones y cumplimiento.

Componentes típicos

  • The Lab: diseño, test y despliegue de agentes/asistentes.
  • RAG: conexión a fuentes/documentos para respuestas con evidencia.
  • Tools: integraciones a APIs internas/externas.
  • Gobernanza: métricas, logs, versiones y seguridad.

¿Por qué usarlo?

  • Modelo-agnóstico (cambiás de modelo sin reescribir tu app).
  • Observabilidad y control de costos/tokens.
  • Escenarios multi-paso/autónomos con agentes.
  • Mejor time-to-value en equipos low-code.

Definiciones: Asistente, Agente y Asistente RAG

Tipo Qué hace Autonomía
Cuándo usar
Asistente Responde a un prompt (chat clásico). Baja
Q&A, redacción, transformaciones.
Asistente RAG Busca evidencia antes de responder. Media
Soporte, políticas, catálogos, procedimientos.
Agente Orquesta pasos y tools, toma decisiones. Alta
Flujos multi-paso, automatización, acciones.

Arquitectura de la integración

Usuario → App GeneXus (UI / evento)
       → Llamada REST a GEAI (endpoint de Asistente/Agente)
       → Ejecución en GEAI (opcional: RAG + Tools)
       → Respuesta estructurada
       → GeneXus (renderiza / ejecuta acciones de negocio)
Idea clave: GeneXus envía el prompt + contexto y recibe una respuesta (texto/JSON) y metadatos. Si es un agente, puede devolver también intenciones/acciones para que tu app las ejecute.

Paso a paso en GEAI (The Lab)

  1. Permisos y proyecto: accedé a The Lab y creá un Assistant o Agent.
  2. Definir propósito: qué resuelve, inputs esperados y formato de salida (texto/JSON).
  3. Probar: ajustar prompts, roles y límites (tokens, temperatura, timeouts).
  4. Tener claros estos datos para poder invocar:
    1. BaseURLhttps://api.saia.ai/chat o algo parecido.
    2. Nombre del agente/asistente 
      1. Para asistente :  "saia:assistant:%1"
      2. Para agente: "saia:agent:%1"
      3. Para RAG:   "saia:search:%1"
    3. Obtener el Token de autenticación : BaererToken="adadsfadsf....."
Los que yo programe, recibian un texto de entrada y tenian un texto estructurado de salida 
Es importante ponerle a los asistentes/agentes que la salida sea de un formato especifico (puede ser json, xml, CSV, HTML pero que se pueda procesar correctamente desde GeneXus. 
Tambien es importante explicitarle en el prompt  que no agregue nada mas a la salida y conviene ponerle ejemplo de lo que quiero como salida. 

Paso a paso en GeneXus 18

1) Variables y propiedades

Con las valores anteriores, ya podemos consumir los asistentes / agentes desarrollados. 
En mi caso, use procedimiento que haga el llamdo REST, pero tambien agregue el manejo de un CACHE 
DE INVOCACIONES, para ahorrar cuando se realizan invocaciones con el mismo texto. 
El texto puede incluir caracteres que hagan invalido el request, por lo que hay que hacer la sustitucion para que siempre sea valido, es lo que hago con el procedure TextoEscapado()

2) Llamada HTTP (REST) desde un Procedure o Event

&HttpClient.Timeout = 140

if not ExisteCacheAsistente(&Asistente,&TextoIN,&TextoOUT)  

	&HttpClient.AddHeader(!"Authorization", format(!"Bearer %1", BearerToken()))
	&HttpClient.AddHeader(!"Content-Type", !"application/json")

	&HttpClient.AddString(format(!'{"model":"%1",
            "messages": [{"role": "user","content": "%2"}],"stream": false}',
             &Asistente,TextoEscapado(&TextoIN)))
&HttpClient.Execute(!"POST", BaseURL()) if &HttpClient.ErrCode<> 0 &Msg = format("Error: %1 - %2 - %3", &Pgmname,&HttpClient.ErrCode, &HttpClient.ErrDescription) Log.Error(&Msg) Msg(&Msg,status) else &TextoOUT = &HttpClient.ToString() &AsistenteResponse.FromJson(&HttpClient.ToString()) &TextoOUT = &AsistenteResponse.choices.Item(1).message.content GraboCacheAsistente(&Asistente,&TextoIN,&TextoOUT) endif Endif
Simplifique un poco el codigo, para que quedara mas lindo, pero le falta chequeo de errores y 
ver si tiene mas de una respuesta. 

3) Parseo de respuesta

Si la salida es json, lo que hice es desde GX generar un SDT con el JSON (Tools / Application Integration / JSON Import)
y eso genera un SDT. 

En el código, se puede hacer

&SDT.FromJson(&SalidaDelAgente)
if NoHayErrores()
   Proceso(&SDT)
endif


Si la salida es un HTML se puede mostrar en pantalla, luego de hacer alguna validación que no contenga nada peligroso. 

Buenas prácticas y checklist

  • Prompts estructurados: preferí entradas con campos (“objetivo”, “restricciones”, “formato de salida”).
  • Manejo de errores: validá StatusCode y contemplá timeouts/reintentos.
  • Versionado: mantené IDs/versions de agentes y feature flags para canary.
  • Observabilidad: log de prompts/latencias/tokens (sin datos sensibles).
  • Seguridad: protegé el token de GEAI; sanitizá entradas (no confiar en el modelo).
  • Contratos claros: definí bien el JSON de ida/vuelta; documentá ejemplos.
  • Costos: cacheá resultados repetibles; limitá longitud de prompts.

Conclusiones. 

La combinación GeneXus 18 + Globant Enterprise AI te permite construir soluciones con bajo tiempo de desarrollo y alto impacto. Empezá con un Asistente, incorporá RAG para responder con evidencia y evolucioná a Agentes que orquestan procesos y herramientas.

GeneXus NEXT hace todo este proceso mucho mas facil y queda todo mucho mas integrado, pero quienes ya tenemos aplicaciones en Genexus vamos a necesitar un tiempo de transicion para incorporar agentes de IA a los sistemas que ya tenemos, por lo que este me parece un camino valido. 


Comentarios

  1. Estimado Enrique un saludo cordial desde Cuenca - Ecuador; ingrese a tu blog al ver que todas mis consultas realizadas en la web me dirigen a tí; por favor necesito tu ayuda; el caso es el siguiente: Al borrar el &context (el que genera la kb por defecto) e importar otro context que tenia otra ubicacion (General.context) en la kb donde la mayoría de objetos están referenciados a este 2do context, donde lo uso en el login; al momento de ejecutar la aplicación esta super lento en el arranque en genexus 18 u13 con wwplus 16 (no utilizo el context del wwplus), la lentitud se presenta al dar click en todas las opciones; no presenta errores de compilación Auxilio! gracias por tu ayuda.

    ResponderBorrar
  2. No entendi bien, pero parecen 2 problemas que no tienen nada que ver uno con el otro.
    Por un lado, creo entender que tenes 2 SDT que se llamana Context en tu KB, y lo tenes en diferentes modulos. Si queres quedarte con uno solo, deberias elegir cual es el correcto y corregir todas las referencias al segundo y cambiarlas por el primero.
    Algo que ayuda para no marearse con las referencias, es cambiarle el nombre a uno de ellos, y ponerle por ejemplo Context_A_Borrar al SDT que no quieras usar mas. De esta forma queda mas claro que todo lo que referencie a ese SDT tiene que ser corregido.

    La lentitud con WorkwithPlus, puede deberse a a varias cosas. Si pasa en todos lados, lo mas seguro que sea algun proceso de la masterpage que esta haciendo algun procesamiento o accediendo a tablas de forma lenta.
    Podes activar el log y ver que es lo que tu aplicacion esta haciendo y ver que operaciones se repiten mucho o demoran mucho.
    Suerte

    ResponderBorrar

Publicar un comentario

1) Lee el post
2) Poné tu opinión sobre el mismo.
Todos los comentarios serán leidos y la mayoría son publicados.

Entradas más populares de este blog

Migrando de GeneXus 9.0 a GeneXus X.

La nefasta influencia del golero de Cacho Bochinche en el fútbol uruguayo

Aplicación monolítica o distribuida?