set serveroutput on set long 9999999 set pagesize 1000 set linesize 200 -- ============================================================================ -- Lab: AI Agents con DBMS_CLOUD_AI_AGENT -- ============================================================================ -- Este lab crea un tool SQL, un agente, una tarea y un team. -- El agente usa el profile PROFILE_GPT_5_5_SELECTAI, que ya fue creado con el -- scope de tablas del workshop y con annotations habilitadas. -- -- Tablas del ejemplo: -- - T_COMERCIOS: comercios participantes, rubros y procesadora de pago. -- - T_BENEFICIOS_POR_NIVEL: reglas de reintegro por nivel de cliente. -- ============================================================================ -- Limpieza para poder repetir el lab -- ============================================================================ -- El orden evita dependencias: primero team, despues task, agente y tool. BEGIN DBMS_CLOUD_AI_AGENT.DROP_TEAM( team_name => 'TEAM_PROMO_BENEFICIOS', force => TRUE ); END; / BEGIN DBMS_CLOUD_AI_AGENT.DROP_TASK( task_name => 'TASK_ANALIZAR_PROMO_BENEFICIOS', force => TRUE ); END; / BEGIN DBMS_CLOUD_AI_AGENT.DROP_AGENT( agent_name => 'AGENT_ANALISTA_PROMOCIONES', force => TRUE ); END; / BEGIN DBMS_CLOUD_AI_AGENT.DROP_TOOL( tool_name => 'TOOL_SQL_PROMO_BENEFICIOS', force => TRUE ); END; / -- ============================================================================ -- Tool SQL -- ============================================================================ -- El tool SQL usa Select AI para traducir preguntas de negocio a SQL. -- El profile restringe el contexto a las tablas del lab y envia las annotations -- de tablas, columnas y relaciones al modelo. BEGIN DBMS_CLOUD_AI_AGENT.CREATE_TOOL( tool_name => 'TOOL_SQL_PROMO_BENEFICIOS', attributes => '{"tool_type": "SQL", "tool_params": {"profile_name": "PROFILE_GPT_5_5_SELECTAI"}}', description => 'Tool SQL para consultar comercios y beneficios por nivel usando Select AI.' ); END; / -- ============================================================================ -- Agente -- ============================================================================ -- El role define la especialidad del agente. El profile_name indica que sus -- respuestas usan el mismo LLM configurado para el lab de Select AI. BEGIN DBMS_CLOUD_AI_AGENT.CREATE_AGENT( agent_name => 'AGENT_ANALISTA_PROMOCIONES', attributes => '{"profile_name": "PROFILE_GPT_5_5_SELECTAI", "role": "Eres un analista de promociones bancarias. Respondes en espanol claro, usas datos en la base de datos para responder preguntas.", "enable_human_tool": "false"}', description => 'Agente analista para comercios participantes y beneficios por nivel.' ); END; / -- ============================================================================ -- Task -- ============================================================================ -- La instruccion usa {query}; RUN_TEAM reemplaza ese marcador con la pregunta -- enviada por el usuario. El tool SQL queda disponible para consultar la base. BEGIN DBMS_CLOUD_AI_AGENT.CREATE_TASK( task_name => 'TASK_ANALIZAR_PROMO_BENEFICIOS', attributes => '{"instruction": "Responde la siguiente pregunta del usuario: {query}. Identifica si requiere datos de comercios, categorias, procesadoras, niveles, porcentajes, compra minima o tope de reintegro. Si requiere datos, usa TOOL_SQL_PROMO_BENEFICIOS para consultar T_COMERCIOS y T_BENEFICIOS_POR_NIVEL. Devuelve una respuesta corta, util para negocio, incluyendo valores relevantes.", "tools": ["TOOL_SQL_PROMO_BENEFICIOS"], "enable_human_tool": "false"}', description => 'Task para responder preguntas de negocio sobre promociones, comercios y beneficios.' ); END; / -- ============================================================================ -- Team -- ============================================================================ -- El team orquesta que agente ejecuta que tarea. En este lab hay un solo agente -- y una sola tarea, pero el patron permite agregar mas pasos despues. BEGIN DBMS_CLOUD_AI_AGENT.CREATE_TEAM( team_name => 'TEAM_PROMO_BENEFICIOS', attributes => '{"agents": [{"name": "AGENT_ANALISTA_PROMOCIONES", "task": "TASK_ANALIZAR_PROMO_BENEFICIOS"}], "process": "sequential"}', description => 'Team para consultas agenticas sobre comercios y beneficios por nivel.' ); END; / -- ============================================================================ -- Chat rapido con RUN_TEAM -- ============================================================================ -- RUN_TEAM inicia la conversacion con el team y pasa el texto a {query}. -- conversation_id permite aislar una conversacion cuando una aplicacion llama -- el team de forma stateless, por ejemplo desde APEX o una API. DECLARE l_conversation_id VARCHAR2(4000); l_response CLOB; BEGIN l_conversation_id := DBMS_CLOUD_AI.CREATE_CONVERSATION; DBMS_CLOUD_AI.SET_CONVERSATION_ID(l_conversation_id); l_response := DBMS_CLOUD_AI_AGENT.RUN_TEAM( team_name => 'TEAM_PROMO_BENEFICIOS', user_prompt => 'Que Zapaterias tienen beneficios y cuales son los topes por nivel', params => JSON_OBJECT('conversation_id' VALUE l_conversation_id) ); DBMS_OUTPUT.PUT_LINE(DBMS_LOB.SUBSTR(l_response, 4000, 1)); DBMS_CLOUD_AI_AGENT.CLEAR_TEAM; DBMS_CLOUD_AI.CLEAR_CONVERSATION_ID; END; /