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;
/

