Exemplos de Uso do Select AI Agent Framework
Explore exemplos que mostram como criar, configurar e interagir com o Select AI Agent Framework para tarefas comuns, como análise de filmes, análise de logs e suporte ao cliente.
Exemplo: Criar um Agente
Crie um agente para executar uma tarefa definida.
Antes de Começar
Revisar:
Exemplo: Criar um Agente
Este exemplo cria um agente chamado Customer_Return_Agent responsável por tratar conversas relacionadas a devolução do produto.
Este exemplo ilustra o uso do Google como o provedor de IA, conforme especificado no perfil de IA chamado GOOGLE. O perfil de IA identifica o LLM que o agente usa para raciocínio e respostas. O atributo role fornece instruções para orientar o agente.
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_AGENT(
agent_name => 'CustomerAgent',
attributes =>'{
"profile_name": "GOOGLE",
"role": "You are an experienced customer agent who deals with customers return request."
}'
);
END;
/ Observação
Observação: cada agente em uma equipe de vários agentes pode ter um perfil de IA distinto e cada perfil pode usar outro provedor de IA e/ou LLM.
Exemplo: Criar Ferramentas Incorporadas
Crie ferramentas integradas, como SQL, RAG, Websearch, Email e Slack. Essas ferramentas permitem que agentes e tarefas consultem dados, recuperem conhecimento, pesquisem na Web e enviem notificações.
Antes de Começar
Revisar:
O Select AI Agent aceita os seguintes tipos de ferramentas:
-
SQL -
RAG -
WEBSEARCH -
NOTIFICATION-
EMAIL -
SLACK
-
Observação
Observação: As ferramentas incorporadas (por exemplo, SQL e RAG) incluem instruções internas. Opcionalmente, você pode anexar instruções fornecidas pelo usuário para adaptar o comportamento ao seu caso de uso. Anexar uma instrução pode adicionar contexto específico da tarefa (por exemplo, consultas de escopo a um esquema específico ou ajudar a impor um formato de resposta). Isso pode melhorar a relevância para cenários especializados. Instruções mal escritas ou excessivamente prescritivas podem prejudicar o desempenho da ferramenta. Mantenha as instruções curtas, específicas e consistentes com a finalidade da ferramenta.
Exemplo: Ferramenta SQL
Este exemplo cria uma ferramenta SQL que traduz consultas de linguagem natural em instruções SQL. A ferramenta SQL ajuda os agentes a responder perguntas relacionadas a dados mapeando prompts para consultas SQL.
Este exemplo mostra como usar o OCI como provedor de IA conforme especificado no perfil de IA chamado nl2sql_profile. O perfil de IA identifica o LLM que o agente usa para raciocínio e respostas. Neste exemplo, o perfil do AI nl2sql_profile define o conjunto de tabelas de esquema SH que o agente pode consultar, permitindo acesso em linguagem natural a dados de histórico de vendas comumente usados, como clientes, produtos, promoções e países. A ferramenta SQL usa os objetos de banco de dados especificados no perfil do AI, garantindo que as instruções SQL geradas permaneçam precisas e relevantes para o conjunto de dados SH.
BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
profile_name => 'nl2sql_profile',
attributes => '{"provider": "oci",
"credential_name": "GEN1_CRED",
"oci_compartment_id": "ocid
1.compartment.oc1..aaaa...",
object_list": [{"owner": "SH", "name": "customers"},
{"owner": "SH", "name": "countries"},
{"owner": "SH", "name": "supplementary_demographics"},
{"owner": "SH", "name": "profits"},
{"owner": "SH", "name": "promotions"},
{"owner": "SH", "name": "products"}]
}');
end;
/
EXEC DBMS_CLOUD_AI_AGENT.DROP_TOOL('SQL');
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
tool_name => 'SQL',
attributes => '{"tool_type": "SQL",
"tool_params": {"profile_name": "nl2sql_profile"}}'
);
END;
/Exemplo: Ferramenta RAG
Este exemplo cria uma ferramenta RAG (Retrieval Augmented Generation, Geração aumentada de recuperação). A ferramenta RAG permite que os agentes recuperem e fundamentem as respostas em documentos corporativos, melhorando a precisão das respostas baseadas no conhecimento.
Este exemplo ilustra a definição de um RAG_PROFILE com credenciais, um índice vetorial e a especificação de parâmetros de perfil. Em seguida, criando um índice vetorial RAG_INDEX no Object Storage para incorporações de documentos e criando o RAG_TOOL vinculado ao seu perfil.
BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
profile_name =>'RAG_PROFILE',
attributes =>'{"provider": "oci",
"credential_name": "GENAI_CRED",
"vector_index_name": "RAG_INDEX",
"oci_compartment_id": "ocid1.compartment.oc1..aaaa..",
"temperature": 0.2,
"max_tokens": 3000
}');
END;
/
BEGIN
DBMS_CLOUD_AI.CREATE_VECTOR_INDEX(
index_name => 'RAG_INDEX',
attributes => '{"vector_db_provider": "oracle",
"location": "https://swiftobjectstorage.us-phoenix-1.oraclecloud.com/v1/my_namespace/my_bucket/my_data_folder",
"object_storage_credential_name": "OCI_CRED",
"profile_name": "RAG_PROFILE",
"chunk_overlap":128,
"chunk_size":1024
}');
END;
/
EXEC DBMS_CLOUD_AI_AGENT.DROP_TOOL('RAG_TOOL');
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
tool_name => 'RAG_TOOL',
attributes => '{"tool_type": "RAG",
"tool_params": {"profile_name": "RAG_PROFILE"}}'
);
END;
/Exemplo: Ferramenta Websearch
Este exemplo cria uma ferramenta Websearch para recuperar detalhes da internet. A ferramenta Websearch permite que os agentes pesquisem informações da Web, como preços ou descrições de produtos.
Este exemplo ilustra a adição de uma entrada ACL para o provedor OpenAI. Criando credenciais OPENAI_CRED com sua chave de API e criando a ferramenta Websearch, descrevendo sua finalidade, vinculando-a à credencial.
Observação
Observação: O OpenAI é o único provedor de IA do Websearch suportado.
BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => 'api.openai.com',
ace => xs$ace_type(privilege_list => xs$name_list('http'),
principal_name => 'ADB_USER',
principal_type => xs_acl.ptype_db)
);
END;
/
BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'OPENAI_CRED',
username => 'OPENAI',
password => '<`OPENAI_API_KEY`>'
);
END;
/
EXEC DBMS_CLOUD_AI_AGENT.DROP_TOOL('Websearch');
BEGIN
DBMS_CLOUD_AI_AGENT.create_tool(
tool_name => 'Websearch',
attributes => '{"instruction": "This tool can be used for searching the details about topics mentioned in notes and prepare a summary about prices, details on web",
"tool_type": "WEBSEARCH",
"tool_params": {"credential_name": "OPENAI_CRED"}}'
);
END;
/Exemplo: Ferramenta de Notificação com Tipo de E-mail
Este exemplo cria uma ferramenta de notificação por e-mail. A ferramenta E-mail permite que os agentes enviem e-mails de notificação como parte de seu workflow.
Este exemplo ilustra a criação de credenciais EMAIL_CRED com sua senha, permitindo acesso SMTP para o usuário do banco de dados e criando uma ferramenta de notificação com o tipo EMAIL, incluindo detalhes SMTP, remetente e endereços de destinatário.
Observação
Observação: Gere credenciais SMTP no Oracle Cloud Infrastructure antes de criar a credencial no Autonomous AI Database. Consulte Gerar Credenciais SMTP para um Usuário para obter mais informações.
BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'EMAIL_CRED',
username => '<SMTP username>',
password => '<SMTP password>');
END;
/
-- Allow SMTP access for user
BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => 'smtp.email.us-ashburn-
1.oci.oraclecloud.com',
lower_port => 587,
upper_port => 587,
ace => xs$ace_type(privilege_list => xs$name_list('SMTP'),
principal_name => 'ADB_USER',
principal_type => xs_acl.ptype_db));
END;
/
EXEC DBMS_CLOUD_AI_AGENT.DROP_TOOL('Email');
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
tool_name => 'EMAIL',
attributes => '{"tool_type": "NOTIFICATION",
"tool_params": {"notification_type" : "EMAIL",
"credential_name": "EMAIL_CRED",
"recipient": "example_recipient@oracle.com",
"smtp_host": "smtp.email.us-ashburn-1.oci.oraclecloud.com",
"sender": "example_sender@oracle.com"}}'
);
END;
/Exemplo: Ferramenta de Notificação com Tipo do Slack
Este exemplo cria uma ferramenta de notificação do Slack. A ferramenta Slack permite que os agentes entreguem notificações diretamente para um canal de espaço de trabalho do Slack.
Este exemplo ilustra a adição de uma entrada ACL para o Slack e a criação de uma ferramenta de notificação com o tipo SLACK que a vincula ao SLACK_CRED e ao canal de destino.
BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE (
host => 'slack.com',
lower_port => 443,
upper_port => 443,
ace => xs$ace_type(
privilege_list => xs$name_list('http'),
principal_name => 'ADB_USER',
principal_type => xs_acl.ptype_db));
END;
/
BEGIN
DBMS_CLOUD_AI_AGENT.create_tool(
tool_name => 'slack',
attributes => '{"tool_type": "SLACK",
"tool_params": {"credential_name": "SLACK_CRED",
"channel": "<channel_number>"}}'
);
END;
/Exemplo: Descrever e Executar a Ferramenta Select AI Agent Framework
Use APIs de ferramenta para descrever uma ferramenta e executar uma ferramenta por nome. DESCRIBE_TOOL retorna a descrição da ferramenta, os atributos e o esquema do argumento. RUN_TOOL chama a ferramenta com um payload de entrada JSON e retorna o resultado da ferramenta como JSON.
Antes de Começar
Revisar:
- Executar Pré-requisitos para Selecionar IA
- Pré-requisitos para Usar o Select AI Agent Framework
- Função DESCRIBE_TOOL
- Função RUN_TOOL
- Procedimento CREATE_TOOL
Este exemplo cria dados de log de amostra, registra uma função PL/SQL como a ferramenta Select AI Agent Framework, demonstra como inspecionar o esquema da ferramenta antes de usá-lo e chama a ferramenta diretamente de SQL ou PL/SQL usando a entrada JSON. As mesmas APIs podem ser usadas por integrações compatíveis com MCP para expor a descoberta de ferramentas e os recursos de chamada de ferramentas.
Se nenhuma ferramenta do Agente tiver sido criada, as APIs de descoberta e chamada de ferramenta retornarão um resultado vazio. Crie uma ou mais ferramentas usando o DBMS_CLOUD_AI_AGENT.CREATE_TOOL para disponibilizar ferramentas para descoberta e chamada.
DECLARE
l_result CLOB;
BEGIN
l_result := DBMS_CLOUD_AI_AGENT.DESCRIBE_TOOL(
tool_name => 'FETCH_LOG_TOOL'
);
DBMS_OUTPUT.PUT_LINE(l_result);
END;
/
SELECT DBMS_CLOUD_AI_AGENT.RUN_TOOL(
tool_name => 'FETCH_LOG_TOOL',
input => '{"P_SINCE":"2026-01-01"}'
) AS tool_result
FROM dual;O exemplo a seguir mostra como criar uma ferramenta e usar DESCRIBE_TOOL e RUN_TOOL.
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE app_log_messages PURGE';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
RAISE;
END IF;
END;
/
CREATE TABLE app_log_messages (
log_timestamp DATE,
severity VARCHAR2(10),
message VARCHAR2(4000)
);
INSERT INTO app_log_messages VALUES (DATE '2026-01-01', 'INFO', 'Routine performance check completed.');
INSERT INTO app_log_messages VALUES (DATE '2026-01-03', 'WARN', 'Query response time exceeded the review threshold.');
COMMIT;
CREATE OR REPLACE FUNCTION fetch_logs (
p_since IN DATE
) RETURN CLOB IS
l_logs CLOB;
BEGIN
DBMS_LOB.CREATETEMPORARY(l_logs, TRUE);
FOR rec IN (
SELECT TO_CHAR(log_timestamp, 'YYYY-MM-DD') || ' ' ||
severity || ': ' || message AS line
FROM app_log_messages
WHERE log_timestamp >= p_since
ORDER BY log_timestamp
) LOOP
DBMS_LOB.WRITEAPPEND(l_logs, LENGTH(rec.line) + 1, rec.line || CHR(10));
END LOOP;
RETURN l_logs;
END;
/
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
tool_name => 'FETCH_LOG_TOOL',
attributes => '{"instruction":"Returns log messages on or after the requested date.","function":"FETCH_LOGS"}',
description => 'Fetch application log messages by date.'
);
END;
/
DECLARE
l_result CLOB;
BEGIN
l_result := DBMS_CLOUD_AI_AGENT.DESCRIBE_TOOL(
tool_name => 'FETCH_LOG_TOOL'
);
DBMS_OUTPUT.PUT_LINE(l_result);
END;
/
SELECT DBMS_CLOUD_AI_AGENT.RUN_TOOL(
tool_name => 'FETCH_LOG_TOOL',
input => '{"P_SINCE":"2026-01-01"}'
) AS tool_result
FROM dual;Exemplo: Criar uma Tarefa
Crie uma tarefa que um agente possa executar.
Antes de Começar
Revisar:
Observação
Observação: Somente um DBA pode conceder privilégios EXECUTE e procedimento de ACL de rede.
Exemplo: Criar uma Tarefa de E-mail
Este exemplo cria o Generate_Email_Task que instrui o LLM a produzir um e-mail de confirmação padrão usando dados estruturados.
O exemplo a seguir ilustra o uso do atributo instruction e fornece instruções sobre o que o e-mail deve incluir.
BEGIN DBMS_CLOUD_AI_AGENT.DROP_TASK('Generate_Email_Task');
EXCEPTION WHEN OTHERS THEN NULL; END;
/
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TASK(
task_name => 'Generate_Email_Task',
attributes => '{"instruction": "Use the customer information and product details to generate an email in a professional format. The email should:' \|\|
'
1. Include a greeting to the customer by name' \|\|
'2. Specify the item being returned, the order number, and the reason for the return' \|\|
'3. If it is a refund, state the refund will be issued to the credit card on record.' \|\|
'4. If it is a replacement, state that the replacement will be shipped in 3-5 business days."}'
);
END;Exemplo: Criar uma Tarefa de Extração de Log
Este exemplo cria um FETCH_LOGS_TASK que recupera logs com base na solicitação.
Este exemplo ilustra a criação de uma tarefa que usa a ferramenta log_fetcher para recuperar logs. Essa ferramenta personalizada especifica o procedimento PL/SQL fetch_logs. A instrução da tarefa especifica o que a tarefa precisa realizar. O atributo enable_human_tool é definido como verdadeiro para que uma pessoa possa intervir para orientar ou aprovar o fluxo de tarefas, se necessário. Consulte Exemplo: Extrair e Analisar Relatórios de Log para obter um exemplo completo.
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TASK(
task_name =>'FETCH_LOGS_TASK',
attributes =>'{
"instruction": "Fetch the log entries from the database based on user request: {query}",
"tools": ["log_fetcher"],
"enable_human_tool" : "true"
}'
);
END;
/Exemplo: Criar uma Tarefa de Análise de Log
Este exemplo cria um ANALYZE_LOG_TASK que analisa os logs extraídos.
O exemplo a seguir ilustra como usar FETCH_LOGS_TASK como o atributo input. A tarefa chamada ANALYZE_LOG_TASK é iniciada após a coleta dos logs para ter a saída FETCH_LOGS_TASK como entrada. A instrução da tarefa especifica o que a tarefa precisa realizar. O atributo enable_human_tool é definido como falso, indicando a ausência de revisão humana no loop.
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TASK(
task_name =>'ANALYZE_LOG_TASK',
attributes =>'{"instruction": "Analyze the fetched log entries retrieved based on user request: {query} ' ||
'Generate a detailed report include issue analysis and possible solution.",
"input" : "FETCH_LOGS_TASK",
"enable_human_tool" : "false"
}'
);
END;
/Exemplo: Criar uma Equipe do Agente
Crie equipes de agentes para realizar suas tarefas.
Antes de Começar
Revisar:
Exemplo: Criar uma Equipe do Agente
Este exemplo cria a equipe ReturnAgency e inclui um único agente Customer_Return_Agent. A tarefa Return_And_Price_Match está designada ao agente. Esta tarefa gerencia solicitações de devolução solicitando o motivo e atualizando o status da prescrição no banco de dados. O process é definido como sequential para executar as tarefas em uma ordem definida.
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TEAM(
team_name => 'ReturnAgency',
attributes => '{"agents": [{"name":"Customer_Return_Agent","task" : "Return_And_Price_Match"}],
"process": "sequential"}');
END;
/Consulte Exemplo: Criar um Agente de Devolução de Produto para obter um exemplo completo.
Exemplo: Criar Equipe de Vários Agentes
Este exemplo cria a equipe Ops_Issues_Solution_Team e inclui dois agentes para tratar a análise de log e a solução de problemas: Data_Engineer e Ops_Manager. O agente Data_Engineer executa a tarefa fetch_logs_task e o agente Ops_Manager executa a tarefa analyze_log_task. O process é definido como sequential para executar as tarefas em uma ordem definida.
BEGIN
DBMS_CLOUD_AI_AGENT.create_team(
team_name => 'Ops_Issues_Solution_Team',
attributes => '{"agents": [{"name":"Data_Engineer","task" : "fetch_logs_task"},
{"name":"Ops_Manager","task" : "analyze_log_task"}],
"process": "sequential"
}');
END;
/Consulte Exemplo: Extrair e Analisar Relatórios de Log para obter um exemplo completo.
Exemplo: Descobrir uma Equipe do Agente e Verificar Estado da Equipe
Use APIs de descoberta de equipe para listar equipes disponíveis, descrever uma equipe selecionada e recuperar o estado de execução mais recente de uma conversa de equipe. As descrições da equipe incluem as habilidades que as equipes expõem. Essas habilidades representam as ferramentas subjacentes do Select AI Agent Framework e não são objetos de banco de dados separados.
Antes de Começar
Revisar:
- Executar Pré-requisitos para Selecionar IA
- Pré-requisitos para Usar o Select AI Agent Framework
- Procedimento CREATE_TEAM
- Função LIST_TEAMS
- Função GET_TEAM_STATE
Este exemplo lista as equipes de agente disponíveis, descreve os recursos expostos por uma equipe selecionada e recupera o estado de execução mais recente de uma conversa. Essas APIs também podem oferecer suporte a integrações compatíveis com Agent2Agent que descobrem equipes de agentes publicadas e inspecionam as habilidades que elas expõem.
Se nenhuma equipe de agentes tiver sido criada, a descoberta da equipe de agentes e as APIs de estado de execução retornarão um resultado vazio. Crie uma ou mais equipes de agentes usando DBMS_CLOUD_AI_AGENT.CREATE_TEAM para ativar a descoberta e a execução da equipe.
Para a delegação Agent2Agent, use LIST_TEAMS para retornar equipes que o usuário de chamada possui e que contêm exatamente um agente. Antes de selecionar uma equipe, use DESCRIBE_TEAM para revisar seus recursos.
Use o mesmo ID de conversa que foi passado para RUN_TEAM quando precisar do estado de execução de uma conversa específica. Para integração Agent2Agent, use um identificador de conversa para a execução da equipe e a pesquisa de estado subsequente. O aplicativo pode descobrir uma equipe, inspecionar suas habilidades, delegar trabalho e, em seguida, sondar o estado de execução.
SELECT DBMS_CLOUD_AI_AGENT.LIST_TEAMS() AS teams
FROM dual;
SELECT DBMS_CLOUD_AI_AGENT.DESCRIBE_TEAM(
team_name => 'CUSTOMER_AGENT_ONLY_TEAM'
) AS team_description
FROM dual;
SELECT DBMS_CLOUD_AI_AGENT.GET_TEAM_STATE(
team_name => 'CUSTOMER_AGENT_ONLY_TEAM',
params => '{"conversation_id":"<CONVERSATION_ID>"}'
) AS team_state
FROM dual;Para integração Agent2Agent, use um identificador de conversa para a execução da equipe e a pesquisa de estado subsequente. O aplicativo pode descobrir uma equipe, inspecionar suas habilidades, delegar trabalho e, em seguida, sondar o estado de execução.
DECLARE
l_conversation_id VARCHAR2(36);
l_response CLOB;
l_state VARCHAR2(30);
BEGIN
l_conversation_id := DBMS_CLOUD_AI.CREATE_CONVERSATION();
l_response := DBMS_CLOUD_AI_AGENT.RUN_TEAM(
team_name => 'CUSTOMER_AGENT_ONLY_TEAM',
user_prompt => 'I need help returning a damaged item.',
params => '{"conversation_id":"' || l_conversation_id || '"}'
);
l_state := DBMS_CLOUD_AI_AGENT.GET_TEAM_STATE(
team_name => 'CUSTOMER_AGENT_ONLY_TEAM',
params => '{"conversation_id":"' || l_conversation_id || '"}'
);
DBMS_OUTPUT.PUT_LINE(l_response);
DBMS_OUTPUT.PUT_LINE('Current state: ' || l_state);
END;
/O resultado do estado reporta o estado de execução mais recente da conversa, como RUNNING, WAITING_FOR_HUMAN, SUCCEEDED ou FAILED.
Exemplo: Criar um Agente que Chama Ferramentas Diretamente
As chamadas de ferramentas diretas do agente suportam sessões interativas abertas. Nesse modo, a entrada da equipe contém o nome do agente e não designa uma tarefa do Agente ao agente. O aplicativo ou o usuário controla a conclusão da sessão chamando SET_EXECUTION_STATE.
Antes de Começar
Revisar:
- Executar Pré-requisitos para Selecionar IA
- Pré-requisitos para Usar o Select AI Agent Framework
- Procedimento CREATE_AGENT
Este exemplo cria um agente que chama as ferramentas configuradas diretamente sem usar a execução baseada em tarefas. Ele demonstra uma sessão agente-direta na qual o aplicativo determina quando a interação é concluída. Use workflows baseados em tarefas quando o workflow deve seguir instruções de tarefa predefinidas e critérios de conclusão. Use a execução direta do agente quando o aplicativo precisar manter a conversa aberta e determinar quando a sessão será encerrada.
As APIs de chamada de ferramenta agente-direto retornarão um resultado vazio se nenhum agente com ferramentas associadas tiver sido criado. Crie um agente e associe uma ou mais ferramentas a ele antes de chamar chamadas de ferramentas diretas do agente.
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_AGENT(
agent_name => 'CUSTOMER_AGENT_ONLY',
attributes => '{
"profile_name": "<AI_PROFILE_NAME>",
"role": "You help customers with return requests. Ask for the return reason, collect the order number, confirm the requested action, and call EMAIL_TOOL only after the customer confirms the action.",
"enable_human_tool": "true",
"short_term_memory_length": 4,
"tools": ["EMAIL_TOOL"]
}'
);
END;
/
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TEAM(
team_name => 'CUSTOMER_AGENT_ONLY_TEAM',
attributes => '{"agents":[{"name":"CUSTOMER_AGENT_ONLY"}],
"process":"sequential"}'
);
END;
/
DECLARE
l_response CLOB;
l_conversation_id VARCHAR2(128);
BEGIN
l_conversation_id := DBMS_CLOUD_AI.CREATE_CONVERSATION();
l_response := DBMS_CLOUD_AI_AGENT.RUN_TEAM(
team_name => 'CUSTOMER_AGENT_ONLY_TEAM',
user_prompt => 'I need help returning order 7820.',
params => '{"conversation_id":"' || l_conversation_id || '"}'
);
DBMS_OUTPUT.PUT_LINE(l_response);
END;
/
BEGIN
DBMS_CLOUD_AI_AGENT.SET_EXECUTION_STATE(
team_name => 'CUSTOMER_AGENT_ONLY_TEAM',
state => 'SUCCEEDED',
params => '{"conversation_id":"<CONVERSATION_ID>"}'
);
END;
/Exemplo: Configurar o Tamanho da Memória de Curto Prazo e Longo Prazo
O tamanho da memória controla quanto contexto anterior está disponível quando um agente chama o LLM. short_term_memory_length controla as conversações recentes incluídas em cada chamada do LLM para a execução atual. long_term_memory_length controla os resumos anteriores no nível da tarefa incluídos quando uma nova execução é iniciada.
| Tipo de Memória | Atributo | Escopo | Padrão |
|---|---|---|---|
| Memória de curto prazo | short_term_memory_length |
Configurado em um agente. | 30 |
| Memória de longo prazo | long_term_memory_length |
Configurado em uma equipe. | 30 |
A memória da conversa usa uma profundidade de memória padrão de 30 giros de conversa. Use o valor padrão para a maioria das cargas de trabalho. Aumente a profundidade da memória quando o agente precisar de contexto de conversação adicional em interações mais longas ou diminua-o para reduzir o processamento de contexto para conversas mais curtas e orientadas a tarefas.
Antes de Começar
Revisar:
- Executar Pré-requisitos para Selecionar IA
- Pré-requisitos para Usar o Select AI Agent Framework
- Procedimento CREATE_AGENT
- Procedimento CREATE_TEAM
Este exemplo configura a memória de curto prazo para um agente e a memória de longo prazo para uma equipe, mostrando como controlar a quantidade de contexto de conversação disponível para o LLM para diferentes requisitos de carga de trabalho.
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_AGENT(
agent_name => 'MEMORY_AWARE_RETURN_AGENT',
attributes => '{
"profile_name": "<AI_PROFILE_NAME>",
"short_term_memory_length": 5,
"role": "You help customers with product return requests and keep the current conversation context concise."
}'
);
END;
/
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TEAM(
team_name => 'MEMORY_AWARE_RETURN_TEAM',
attributes => '{"agents":[{"name":"MEMORY_AWARE_RETURN_AGENT","task":"RETURN_REQUEST_TASK"}],
"long_term_memory_length": 5,
"process":"sequential"}'
);
END;
/Exemplo: Criar um Agente de Análise de Filme com Ferramentas Incorporadas
Este exemplo mostra como você pode criar um agente de análise de filme usando a Estrutura Selecionar Agente AI. Neste exemplo, você configura um agente de análise de filmes que recupera dados, responde perguntas, pesquisa na Web e envia por e-mail a análise ou envia notificações do Slack.
Antes de Começar
Revisar:
O exemplo a seguir pressupõe que os dados estejam disponíveis para você.
Este exemplo cria um agente MOVIE_ANALYST e usa várias ferramentas incorporadas, como SQL, RAG, WEBSEARCH e NOTIFICATION, do tipo EMAIL e SLACK. O agente responde perguntas relacionadas ao filme usando prompts de linguagem natural.
Neste exemplo, depois que seu DBA concede privilégios EXECUTE para: os pacotes DBMS_CLOUD_AI_AGENT, DBMS_CLOUD_AI, DBMS_CLOUD_PIPELINE, acesso ACL para seu provedor de AI, acesso SMTP e acesso ao Slack, você começa criando o agente MOVIE_ANALYST.
Criar um Agente
Você cria um agente chamado MOVIE_ANALYST com um perfil (GROK) e a função de responder perguntas sobre filmes, atores e gêneros.
Criar Tarefa
Você cria uma tarefa chamada ANALYZE_MOVIE_TASK com instruções para responder a consultas relacionadas a filmes.
Criar Equipe
Você cria uma equipe MOVIE_AGENT_TEAM com MOVIE_ANALYST como o agente e a tarefa como ANALYZE_MOVIE_TASK e a define como uma equipe ativa.
Posteriormente, você poderá anexar ferramentas como SQL, RAG, Websearch ou Notification para estender seus recursos.
Executar a Seleção da Equipe do Agente AI
Agora você executa a equipe do agente usando select ai agent como prefixo para seus prompts.
Criar Ferramentas
Em seguida, você anexa diferentes ferramentas de agente incorporadas:
-
SQL: Usa um perfil NL2SQL para traduzir perguntas em consultas SQL e outras ações Select AI suportadas. -
RAG: Recuperar contexto baseado em conhecimento de documentos armazenados. -
WEBSEARCH: Reúna detalhes de filmes ou preços on-line. -
NOTIFICATION:-
EMAIL: Envie respostas para prompts de usuário, relatórios de filmes ou revisões para um destinatário. -
SLACK: Envie respostas para prompts de usuário, resumos ou atualizações diretamente para o Slack.
-
O exemplo completo é o seguinte:
--Grants EXECUTE privilege to ADB_USER
--
GRANT EXECUTE on DBMS_CLOUD_AI_AGENT to ADB_USER;
GRANT EXECUTE on DBMS_CLOUD_AI to ADB_USER;
GRANT EXECUTE on DBMS_CLOUD_PIPELINE to ADB_USER;
-- Websearch tool accesses OPENAI endpoint, allow ACL access
BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => 'api.openai.com',
ace => xs$ace_type(privilege_list => xs$name_list('http'),
principal_name => 'ADB_USER',
principal_type => xs_acl.ptype_db)
);
END;
/
-- To allow Email tool in Autonomous AI Database, allow SMTP access
BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => 'smtp.email.us-ashburn-1.oci.oraclecloud.com',
lower_port => 587,
upper_port => 587,
ace => xs$ace_type(privilege_list => xs$name_list('SMTP'),
principal_name => 'ADB_USER,
principal_type => xs_acl.ptype_db));
END;
/
-- Allow ACL access to Slack
BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE (
host => 'slack.com',
lower_port => 443,
upper_port => 443,
ace => xs$ace_type(
privilege_list => xs$name_list('http'),
principal_name => 'ADB_USER',
principal_type => xs_acl.ptype_db));
END;
/
PL/SQL procedure successfully completed.
--Create an agent
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_AGENT(
agent_name => 'MOVIE_ANALYST',
attributes => '{"profile_name": "GROK",
"role": "You are an AI Movie Analyst. Your can help answer a variety of questions related to movies. "
}'
);
END;
/
PL/SQL procedure successfully completed.
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TASK(
task_name => 'ANALYZE_MOVIE_TASK',
attributes => '{"instruction": "Help the user with their request about movies. User question: {query}",
"enable_human_tool" : "true"
}'
);
END;
/
PL/SQL procedure successfully completed.
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TEAM(
team_name => 'MOVIE_AGENT_TEAM',
attributes => '{"agents": [{"name":"MOVIE_ANALYST","task" : "ANALYZE_MOVIE_TASK"}],
"process": "sequential"
}');
END;
/
PL/SQL procedure successfully completed.
EXEC DBMS_CLOUD_AI_AGENT.SET_TEAM('MOVIE_AGENT_TEAM');
PL/SQL procedure successfully completed.
select ai agent who are you?;
RESPONSE
--------------------------------------------------------------------------------
I'm MOVIE_ANALYST, an AI Movie Analyst here to assist with any questions or topi
cs related to movies. Whether you need information on films, actors, directors,
genres, or recommendations, I'm ready to help. What can I assist you with regard
ing movies?
-- SQL TOOL
BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
profile_name =>'nl2sql_profile',
attributes => '{"provider": "oci",
"credential_name": "GENAI_CRED",
"oci_compartment_id" : "ocid1.compartment.oc1..aaaaa...",
"object_list": [{"owner": "ADB_USER", "name": "GENRE"},
{"owner": "ADB_USER", "name": "CUSTOMER"},
{"owner": "ADB_USER", "name": "WATCH_HISTORY"},
{"owner": "ADB_USER", "name": "STREAMS"},
{"owner": "ADB_USER", "name": "MOVIES"},
{"owner": "ADB_USER", "name": "ACTORS"}]
}');
END;
/
PL/SQL procedure successfully completed.
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
tool_name => 'SQL',
attributes => '{"tool_type": "SQL",
"tool_params": {"profile_name": "nl2sql_profile"}}'
);
END;
/
PL/SQL procedure successfully completed.
EXEC DBMS_CLOUD_AI_AGENT.drop_task('ANALYZE_MOVIE_TASK');
PL/SQL procedure successfully completed.
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TASK(
task_name => 'ANALYZE_MOVIE_TASK',
attributes =>'{"instruction": "Help the user with their request about movies. User question: {query}. ' ||
'You can use SQL tool to search the data from database",
"tools": ["SQL"],
"enable_human_tool" : "true"
}'
);
END;
/
PL/SQL procedure successfully completed.
EXEC DBMS_CLOUD_AI_AGENT.CLEAR_TEAM;
PL/SQL procedure successfully completed.
EXEC DBMS_CLOUD_AI_AGENT.SET_TEAM('MOVIE_AGENT_TEAM');
PL/SQL procedure successfully completed.
-- SQL tool retrieves the movie with the highest popularity view count from the watch_history table
select ai agent what is the most popular movie?;
RESPONSE
----------------------------------------------------------------
The most popular movie is "Laugh Out Loud" released in 2008.
-- RAG TOOL
BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
profile_name => 'RAG_PROFILE',
attributes =>'{"provider": "oci",
"credential_name": "GENAI_CRED",
"vector_index_name": "RAG_INDEX",
"oci_compartment_id": "ocid1.compartment.oc1..aaaaa...",
"temperature": 0.2,
"max_tokens": 3000
}');
END;
/
PL/SQL procedure successfully completed.
BEGIN
DBMS_CLOUD_AI.CREATE_VECTOR_INDEX(
index_name => 'RAG_INDEX',
attributes => '{"vector_db_provider": "oracle",
"location": "https://swiftobjectstorage.us-phoenix-1.oraclecloud.com/v1/my_namespace/my_bucket/my_data_folder",
"object_storage_credential_name": "MY_OCI_CRED",
"profile_name": "RAG_PROFILE",
"vector_dimension": 1024,
"vector_distance_metric": "cosine",
"chunk_overlap":128,
"chunk_size":1024
}');
END;
/
PL/SQL procedure successfully completed.
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
tool_name => 'RAG_TOOL',
attributes => '{"tool_type": "RAG",
"tool_params": {"profile_name": "RAG_PROFILE"}}'
);
END;
/
PL/SQL procedure successfully completed.
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TASK(
task_name =>'ANALYZE_MOVIE_TASK',
attributes => '{"instruction": "Help the user with their request about movies. User question: {query}. ' ||
'You can use RAG tool to search the information from the knowledge base user give.",
"tools": ["RAG_TOOL"],
"enable_human_tool" : "true"
}'
);
END;
/
PL/SQL procedure successfully completed.
EXEC DBMS_CLOUD_AI_AGENT.CLEAR_TEAM;
PL/SQL procedure successfully completed.
EXEC DBMS_CLOUD_AI_AGENT.SET_TEAM('MOVIE_AGENT_TEAM');
PL/SQL procedure successfully completed.
-- Rag seach the object store to find review or comments of Movie Laugh out Loud
select ai agent Please find the comments of Movie Laugh out Loud;
RESPONSE
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
The comments for the movie "Laugh Out Loud" (2008) are as follows:
1. A lighthearted comedy that delivers plenty of laughs, though the plot is fairly predictable.
2. The performances are fun, especially from the lead actor who keeps the energy high.
3. Some jokes feel a bit outdated, but overall it is an enjoyable watch for a casual movie night.
4. Good chemistry between the cast members, which makes the humor more natural.
5. Not a groundbreaking comedy, but it does what it promises makes you laugh out loud.
-- WEBSEARCH TOOL
BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'OPENAI_CRED',
username => 'OPENAI',
password => '<API_KEY>'
);
END;
/
PL/SQL procedure successfully completed.
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
tool_name => 'WEBSEARCH_TOOL',
attributes => '{"instruction": "This tool can be used for searching the details about topics mentioned in notes and prepare a summary about prices, details on web",
"tool_type": "WEBSEARCH",
"tool_params": {"credential_name": "OPENAI_CRED"}}'
);
END;
/
PL/SQL procedure successfully completed.
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TASK(
task_name => 'ANALYZE_MOVIE_TASK',
attributes => '{"instruction": "Help the user with their request about movies. User question: {query}. ' ||
'You can use WEBSEARCH_TOOL tool to search the information from internet.",
"tools": ["WEBSEARCH_TOOL"],
"enable_human_tool" : "true"
}'
);
END;
/
PL/SQL procedure successfully completed.
EXEC DBMS_CLOUD_AI_AGENT.CLEAR_TEAM;
PL/SQL procedure successfully completed.
EXEC DBMS_CLOUD_AI_AGENT.SET_TEAM('MOVIE_AGENT_TEAM');
PL/SQL procedure successfully completed.
select ai agent What is the most popular movie of 2023?;
RESPONSE
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Determining the most popular movie of 2023 can depend on various metrics such as box office earnings, streaming viewership, critical acclaim, or audience reception. Based on global box office data, which is often a strong indicator of popularity, the most successful movie of 2023 is "Barbie," directed by Greta Gerwig. Released in July 2023, it grossed over $1.4 billion worldwide, making it the highest-grossing film of the year and one of the biggest cultural phenomena, often discussed alongside "Oppenheimer" due to the "Barbenheimer" trend. Its widespread appeal, marketing, and social media buzz further solidify its status as the most popular movie of 2023. However, if you are looking for popularity based on a different metric (like streaming numbers or awards), please let me know, and I can adjust the analysis accordingly.
-- NOTIFICATION TOOL WITH EMAIL TYPE
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
tool_name => 'EMAIL',
attributes => q'[{"tool_type": "Notification",
"tool_params": {"notification_type" : "EMAIL",
"credential_name": "EMAIL_CRED",
"recipient": "example@oracle.com",
"smtp_host": "smtp.email.us-ashburn-1.oci.oraclecloud.com",
"sender": "example@oracle.com"}}]'
);
END;
/
PL/SQL procedure successfully completed.
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TASK(
task_name => 'ANALYZE_MOVIE_TASK',
attributes =>'{"instruction": "Help the user with their request about movies. User question: {query}. ' ||
'You can use EMAIL TOOL tool to send email to the user.",
"tools": ["EMAIL"],
"enable_human_tool" : "true"
}'
);
END;
/
PL/SQL procedure successfully completed.
EXEC DBMS_CLOUD_AI_AGENT.CLEAR_TEAM;
PL/SQL procedure successfully completed.
EXEC DBMS_CLOUD_AI_AGENT.SET_TEAM('MOVIE_AGENT_TEAM');
PL/SQL procedure successfully completed.
select ai agent Please help me write a review of Movie "Barbie" and send the review to my email;
RESPONSE
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
I have written a review for the movie "Barbie" (2023) and sent it to your email. Please check your inbox for the detailed review. If you have any additional feedback or would like me to revise the review, let me know!
-- NOTIFICATION TOOL WITH SLACK TYPE
DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
tool_name => 'SLACK_TOOL',
attributes => '{"tool_type": "SLACK",
"tool_params": {"credential_name": "SLACK_CRED",
"channel": "<channel_number>"}}'
);
END;
/
PL/SQL procedure successfully completed.
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TASK(
task_name => 'ANALYZE_MOVIE_TASK',
attributes => '{"instruction": "Help the user with their request about movies. User question: {query}. ' ||
'You can use SLACK TOOL to send the notification to the user.",
"tools": ["SLACK_TOOL"],
"enable_human_tool" : "true"
}'
);
END;
/
PL/SQL procedure successfully completed.
select ai agent Please help me find the top 3 most-watched movies of 2023 and send them to me on slack;
RESPONSE
------------------------------------------------------------------------------------------------------------------------------------
I have sent the list of the top 3 most-watched movies of 2023 to you via Slack. Please check your Slack notifications for the details.Exemplo: Criar um Agente de Devolução de Produto
Este exemplo mostra como você pode criar um agente de conversação de várias turnos usando a Estrutura Selecionar Agente AI. Neste exemplo, você configura um agente de atendimento ao cliente que trata de devoluções de produtos e atualiza o status de devolução em seu banco de dados.
Antes de Começar
Revisar:
Este exemplo cria um agente denominado Customer_Return_Agent e uma ferramenta denominada Update_Order_Status_Tool e, em seguida, define uma tarefa e uma equipe para tratar o retorno do produto.
Neste exemplo, depois que o DBA concede privilégios EXECUTE para: DBMS_CLOUD_AI_AGENT e DBMS_CLOUD_AI, você começa criando uma amostra de dados de clientes, status da ordem do cliente e uma função para atualizar o status da ordem do cliente. Em seguida, crie um agente chamado Customer_Return_Agent.
Criar um Agente
Você cria um agente chamado Customer_Return_Agent com um perfil (OCI_GENAI_GROK) e uma função para gerenciar solicitações de devolução.
Criar Ferramentas
Em seguida, você cria uma ferramenta de agente chamada Update_Order_Status_Tool para atualizar o status da ordem no seu banco de dados.
Criar Tarefa
Você cria uma tarefa chamada Handle_Product_Return_Task para orientar o fluxo: solicite o motivo (não mais necessário, chegou tarde demais, caixa quebrada ou com defeito). Continue com um fluxo de retorno com defeito.
Criar Equipe
Você cria uma equipe de agente chamada Return_Agency_Team com Customer_Return_Agent como agente e a define como uma equipe ativa.
Executar a Equipe do Agente
Agora você executa a equipe do agente usando select ai agent como prefixo para seus prompts.
O exemplo completo é o seguinte:
--Grants EXECUTE privilege to ADB_USER
--
GRANT EXECUTE on DBMS_CLOUD_AI_AGENT to ADB_USER;
GRANT EXECUTE on DBMS_CLOUD_AI to ADB_USER;
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_AGENT(
agent_name => 'Customer_Return_Agent',
attributes => '{"profile_name": "OCI_GENAI_GROK",
"role": "You are an experienced customer return agent who deals with customers return requests."}');
END;
/
PL/SQL procedure successfully completed.
--Sample customer data
CREATE TABLE CUSTOMERS (
customer_id NUMBER(10) PRIMARY KEY,
name VARCHAR2(100),
email VARCHAR2(100),
phone VARCHAR2(20),
state VARCHAR2(2),
zip VARCHAR2(10)
);
INSERT INTO CUSTOMERS (customer_id, name, email, phone, state, zip) VALUES
(1, 'Alice Thompson', 'alice.thompson@example.com', '555-1234', 'NY', '10001'),
(2, 'Bob Martinez', 'bob.martinez@example.com', '555-2345', 'CA', '94105'),
(3, 'Carol Chen', 'carol.chen@example.com', '555-3456', 'TX', '73301'),
(4, 'David Johnson', 'david.johnson@example.com', '555-4567', 'IL', '60601'),
(5, 'Eva Green', 'eva.green@example.com', '555-5678', 'FL', '33101');
--create customer order status
CREATE TABLE CUSTOMER_ORDER_STATUS (
customer_id NUMBER(10),
order_number VARCHAR2(20),
status VARCHAR2(30),
product_name VARCHAR2(100)
);
INSERT INTO CUSTOMER_ORDER_STATUS (customer_id, order_number, status, product_name) VALUES
(2, '7734', 'delivered', 'smartphone charging cord'),
(1, '4381', 'pending_delivery', 'smartphone protective case'),
(2, '7820', 'delivered', 'smartphone charging cord'),
(3, '1293', 'pending_return', 'smartphone stand (metal)'),
(4, '9842', 'returned', 'smartphone backup storage'),
(5, '5019', 'delivered', 'smartphone protective case'),
(2, '6674', 'pending_delivery', 'smartphone charging cord'),
(1, '3087', 'returned', 'smartphone stand (metal)'),
(3, '7635', 'pending_return', 'smartphone backup storage'),
(4, '3928', 'delivered', 'smartphone protective case'),
(5, '8421', 'pending_delivery', 'smartphone charging cord'),
(1, '2204', 'returned', 'smartphone stand (metal)'),
(2, '7031', 'pending_delivery', 'smartphone backup storage'),
(3, '1649', 'delivered', 'smartphone protective case'),
(4, '9732', 'pending_return', 'smartphone charging cord'),
(5, '4550', 'delivered', 'smartphone stand (metal)'),
(1, '6468', 'pending_delivery', 'smartphone backup storage'),
(2, '3910', 'returned', 'smartphone protective case'),
(3, '2187', 'delivered', 'smartphone charging cord'),
(4, '8023', 'pending_return', 'smartphone stand (metal)'),
(5, '5176', 'delivered', 'smartphone backup storage');
--Create a update customer order status function
CREATE OR REPLACE FUNCTION UPDATE_CUSTOMER_ORDER_STATUS (
p_customer_name IN VARCHAR2,
p_order_number IN VARCHAR2,
p_status IN VARCHAR2
) RETURN CLOB IS
v_customer_id customers.customer_id%TYPE;
v_row_count NUMBER;
BEGIN
-- Find customer_id from customer_name
SELECT customer_id
INTO v_customer_id
FROM customers
WHERE name = p_customer_name;
UPDATE customer_order_status
SET status = p_status
WHERE customer_id = v_customer_id
AND order_number = p_order_number;
v_row_count := SQL%ROWCOUNT;
IF v_row_count = 0 THEN
RETURN 'No matching record found to update.';
ELSE
RETURN 'Update successful.';
END IF;
EXCEPTION
WHEN OTHERS THEN
RETURN 'Error: ' || SQLERRM;
END;
--Create Tool
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
tool_name => 'Update_Order_Status_Tool',
attributes => '{"instruction": "This tool updates the database to reflect return status change. Always confirm user name and order number with user before update status",
"function" : "update_customer_order_status"}',
description => 'Tool for updating customer order status in database table.'
);
END;
/
--Create Task
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TASK(
task_name => 'Handle_Product_Return_Task',
attributes => '{"instruction": "Process a product return request from a customer:{query}' ||
'1. Ask customer the order reason for return (no longer needed, arrived too late, box broken, or defective)' ||
'2. If no longer needed:' ||
' a. Inform customer to ship the product at their expense back to us.' ||
' b. Update the order status to return_shipment_pending using Update_Order_Status_Tool.' ||
'3. If it arrived too late:' ||
' a. Ask customer if they want a refund.' ||
' b. If the customer wants a refund, then confirm refund processed and update the order status to refund_completed' ||
'4. If the product was defective or the box broken:' ||
' a. Ask customer if they want a replacement or a refund' ||
' b. If a replacement, inform customer replacement is on its way and they will receive a return shipping label for the defective product, then update the order status to replaced' ||
' c. If a refund, inform customer to print out the return shipping label for the defective product, return the product, and update the order status to refund' ||
'5. After the completion of a return or refund, ask if you can help with anything else.' ||
' End the task if user does not need help on anything else",
"tools": ["Update_Order_Status_Tool"]}'
);
END;
/
SQL> BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TEAM(
team_name => 'Return_Agency_Team',
attributes => '{"agents": [{"name":"Customer_Return_Agent","task" : "Handle_Product_Return_Task"}],
"process": "sequential"}');
END;
/
PL/SQL procedure successfully completed.
SQL> EXEC DBMS_CLOUD_AI_AGENT.SET_TEAM('Return_Agency_Team');
PL/SQL procedure successfully completed.
--Validate that the agent team is set in the current session with get_team
SQL> SELECT DBMS_CLOUD_AI_AGENT.GET_TEAM from DUAL;
--Interact with the agent
SQL> select ai agent I want to return a smartphone case;
RESPONSE
Could you please tell me the reason for returning the smartphone case? Is it no longer needed, arrived too late, box broken, or defective?
SQL> select ai agent the item is defective
RESPONSE
I'm sorry to hear that the smartphone case is defective. Would you like a replacement or a refund?
SQL> select ai agent I will need a replacement
RESPONSE
Can you please confirm your name and order number so I can update the status and process the replacement?
SQL> select ai agent I''m Bob Martinez and my order number is 7820
RESPONSE
Is there anything else I can help you with?
SQL> select ai agent No, I''m all set. Thanks
RESPONSE
Thank you for reaching out, Bob. I'm glad I could assist with the return of your smartphone case and stand. If you have any further questions or need assistance in the future, feel free to contact us. Have a great day!Exemplo: Usar a Estrutura Select AI Agent com o Database Actions e o APEX
Se você estiver usando clientes do Web SQL, como Database Actions, execute a equipe do agente usando a função DBMS_CLOUD_AI_AGENT.RUN_TEAM e forneça seu prompt dentro da função.
Observação
Observação: Não use DBMS_CLOUD_AI_AGENT.SET_TEAM no Database Actions ou no APEX Service. Em vez disso, especifique a equipe do agente usando o argumento team_name do DBMS_CLOUD_AI_AGENT.RUN_TEAM.
O exemplo a seguir cria um ID de conversa para rastrear o histórico de conversas do cliente e, em seguida, usa a função DBMS_CLOUD_AI_AGENT.RUN_TEAM para interagir com o agente de retorno do produto.
Consulte Função RUN_TEAM para obter mais informações.
CREATE OR REPLACE PACKAGE my_globals IS
l_team_cov_id varchar2(4000);
END my_globals;
/
-- Create conversation
DECLARE
l_team_cov_id varchar2(4000);
BEGIN
l_team_cov_id := DBMS_CLOUD_AI.create_conversation();
my_globals.l_team_cov_id := l_team_cov_id;
DBMS_OUTPUT.PUT_LINE('Created conversation with ID: ' || my_globals.l_team_cov_id);
END;
--Interact with the agent
DECLARE
v_response VARCHAR2(4000);
BEGIN
v_response := DBMS_CLOUD_AI_AGENT.RUN_TEAM(
team_name => 'Return_Agency_Team',
user_prompt => 'I want to return a smartphone case',
params => '{"conversation_id": "' \|\| my_globals.l_team_cov_id \|\| '"}'
);
DBMS_OUTPUT.PUT_LINE(v_response);
END;Exemplo: Extrair e Analisar Relatórios de Log
Este exemplo mostra como você pode criar uma equipe de agentes usando dois pares agentes-tarefa para recuperar logs e analisá-los.
Antes de Começar
Revisar:
-
Executar Pré-requisitos para o Select AI
-
Crie um perfil de IA com o Google como o provedor. Consulte Exemplo: Selecionar IA com o Google.
-
Crie um perfil de IA com OpenAI como o provedor. Consulte Exemplo: Selecionar AI com OpenAI.
-
Este exemplo cria:
-
um workflows de dois agentes para solução de problemas: Data_Engineer e Ops_Manager
-
uma ferramenta:
log-fetchere, em seguida, define tarefas e equipe para extrair logs e analisá-los.
Observação
Observação: Somente um DBA pode executar privilégios EXECUTE e procedimento ACL de rede.
Neste exemplo, depois que o DBA concede privilégios EXECUTE para: o pacote DBMS_CLOUD_AI_AGENT, o pacote DBMS_CLOUD_AI e o acesso ACL para seus provedores de IA, você começa criando os agentes Data_Engineer e Ops_Manager.
Criar um Agente
Você cria o agente chamado Data_Engineer com um perfil (GOOGLE) que usa o Google como provedor de IA e função para recuperar e processar dados complexos.
Crie o agente chamado Ops_Manager com um perfil (OPENAI) que use OpenAI como provedor e atribuição de IA para analisar os dados.
Criar Ferramenta
Em seguida, você cria uma ferramenta de agente:log_fetcher: retorna entradas de log após uma determinada data. Isso usa um procedimento personalizado fetch_logs.
Criar Tarefas
Você define duas tarefas fetch_logs_task e analyze_log_task para orientar o fluxo. O fetch_logs_task chama o log_fetcher para recuperar logs com base na solicitação. O analyze_log_task analisa os logs extraídos.
Criar Equipe
Você cria a equipe Ops_Issues_Solution_Team com Data_Engineer e Ops_Manager para executar sequencialmente.
Executar o Agente
Agora você define a equipe ativa e executa a equipe do agente com select ai agent como um prefixo para seus prompts.
O exemplo completo é o seguinte:
--Grants EXECUTE privilege to ADB_USER
--
GRANT EXECUTE on DBMS_CLOUD_AI_AGENT to ADB_USER;
GRANT EXECUTE on DBMS_CLOUD_AI to ADB_USER;
-- Grant Network ACL for OpenAI endpoint
BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => 'api.openai.com',
ace => xs$ace_type(privilege_list => xs$name_list('http'),
principal_name => 'ADB_USER',
principal_type => xs_acl.ptype_db)
);
END;
/
--Grant Network ACL for Google endpoint
BEGIN
DBMS_NETWORK_ACL_ADB_USER.APPEND_HOST_ACE(
host => 'generativelanguage.googleapis.com',
ace => xs$ace_type(privilege_list => xs$name_list('http'),
principal_name => 'ADB_USER',
principal_type => xs_acl.ptype_db)
);
END;
/
PL/SQL procedure successfully completed.
--Create a table with Database logs and insert sample data
SQL> CREATE TABLE app_logs (
log_id NUMBER GENERATED BY DEFAULT AS IDENTITY,
log_timestamp DATE,
log_message VARCHAR2(4000)
);
Table created.
SQL> INSERT INTO app_logs (log_timestamp, log_message) VALUES (
TO_DATE('2025-03-22 03:15:45', 'YYYY-MM-DD HH24:MI:SS'),
'INFO: Database Cluster: Failover completed successfully. Standby promoted to primary. Downtime duration: 33 seconds. Correlation ID: dbfailover102.'
);
1 row created.
SQL> INSERT INTO app_logs (log_timestamp, log_message) VALUES (
TO_DATE('2025-03-23 08:44:10', 'YYYY-MM-DD HH24:MI:SS'),
'INFO: Switchover Process: Synchronization restored. Performing scheduled switchover. Correlation ID: dbswitchover215.'
);
1 row created.
SQL> INSERT INTO app_logs (log_timestamp, log_message) VALUES (
TO_DATE('2025-03-24 03:15:12', 'YYYY-MM-DD HH24:MI:SS'),
'ERROR: Database Cluster: Primary database unreachable, initiating failover to standby. Correlation ID: dbfailover102.'
);
1 row created.
SQL> COMMIT;
Commit complete.
-- create data engineer agent
SQL> BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_AGENT(
agent_name => 'Data_Engineer',
attributes => '{"profile_name": "GOOGLE",
"role": "You are a specialized data ingestion engineer with expertise in ' \|\|
'retrieving and processing data from complex database systems."
}'
);
END;
/
PL/SQL procedure successfully completed.
-- create ops manager agent
SQL> BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_AGENT(
agent_name => 'Ops_Manager',
attributes => '{"profile_name": "OPENAI",
"role": "You are an experienced Ops manager who excels at analyzing ' \|\|
'complex log data, diagnosing the issues."
}'
);
END;
/
PL/SQL procedure successfully completed.
-- create log_fetcher tool
-- fetch_logs is a customized procedure.
-- Please make sure you have created your own procedure before use it in the tool
--Create a customized fetch_logs procedure
SQL> CREATE OR REPLACE FUNCTION fetch_logs(since_date IN DATE) RETURN CLOB IS
l_logs CLOB;
BEGIN
SELECT JSON_ARRAYAGG(log_message RETURNING CLOB)
INTO l_logs
FROM app_logs
WHERE log_timestamp >= since_date
ORDER BY log_timestamp;
RETURN l_logs;
EXCEPTION
WHEN OTHERS THEN
RETURN 'Error fetching logs: ' || SQLERRM;
END fetch_logs;
/
Function created.
SQL> BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
tool_name => 'log_fetcher',
attributes => '{"instruction": "retrieves and returns all log messages with a LOG_TIMESTAMP greater than or equal to the input date.",
"function": "fetch_logs"}'
);
END;
/
PL/SQL procedure successfully completed.
-- create task with log fetcher tool
SQL> BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TASK(
task_name => 'fetch_logs_task',
attributes => '{"instruction": "Fetch the log entries from the database based on user request: {query}}.",
"tools": ["log_fetcher"]}'
);
END;
/
PL/SQL procedure successfully completed.
-- create task with predefined rag and slack tool
SQL> BEGIN
DBMS_CLOUD_AI_AGENT.create_task(
task_name => 'analyze_log_task',
attributes => '{"instruction": "Analyze the fetched log entries retrieved based on user request: {query} ' ||
'Generate a detailed report include issue analysis and possible solution.",
"input" : "fetch_logs_task"
}'
);
END;
/
PL/SQL procedure successfully completed.
-- create team and set agent team
SQL> BEGIN
DBMS_CLOUD_AI_AGENT.create_team(
team_name => 'Ops_Issues_Solution_Team',
attributes => '{"agents": [{"name":"Data_Engineer","task" : "fetch_logs_task"},
{"name":"Ops_Manager","task" : "analyze_log_task"}],
"process": "sequential"
}');
END;
/
PL/SQL procedure successfully completed.
SQL> EXEC DBMS_CLOUD_AI_AGENT.SET_TEAM('Ops_Issues_Solution_Team');
PL/SQL procedure successfully completed.
SQL> select ai agent fetch and analyze the logs after 03/15 2025;
RESPONSE
-----------------------------------------------------------------------------------------------------------------------------------------------
1. Issue: High volume of 500 Internal Server Errors between 03/22 and 03/24.
Solution: Review server application logs to identify failing components; add better exception handling and fallback mechanisms to prevent service crashes.
2. Issue: Increased response time on /api/v1/user and /checkout, peaking on 03/25.
Solution: Profile back-end queries and services, apply caching where applicable, and offload static content to a CDN.
3. Issue: Detected brute-force login attack with over 500 failed POST attempts from a single IP.
Solution: Add rate-limiting, temporary IP bans, and CAPTCHA on the /login endpoint to prevent credential stuffing.
4. Issue: Suspicious User-Agent headers such as curl/7.58.0 or empty headers mimicking mobile devices.
Solution: Block malformed or uncommon User-Agent strings and log them for threat intelligence analysis.
5. Issue: DDoS-like traffic spike from distributed IPs observed on 03/20.
Solution: Enable DDoS protection at the CDN or cloud provider level, and configure autoscaling to absorb burst traffic.Exemplo: Criar uma Ferramenta HTTP Personalizada
Este exemplo define uma função PL/SQL que envia uma solicitação HTTP GET e retorna o texto de resposta. Em seguida, a função é adicionada na ferramenta Selecionar Estrutura do Agente AI.
Antes de Começar
Revisar:
Você pode criar uma ferramenta personalizada que envie uma solicitação REST usando o procedimento DBMS_CLOUD.SEND_REQUEST e retorne a resposta como texto. Este exemplo mostra como gravar a função PL/SQL e adicioná-la como uma ferramenta para uso em tarefas de agente.
A função get_url_content envia uma solicitação GET para o URL de destino e retorna a resposta como CLOB. O DBMS_CLOUD_AI_AGENT.CREATE_TOOL usa a função get_url_content e cria uma ferramenta chamada HTTP_TOOL que o agente pode chamar quando uma tarefa requer a extração de conteúdo de um URL.
CREATE OR REPLACE FUNCTION get_url_content (
url IN CLOB
) RETURN CLOB
AS
l_resp DBMS_CLOUD_TYPES.RESP;
l_result CLOB;
BEGIN
l_resp := DBMS_CLOUD.SEND_REQUEST(
credential_name => NULL,
method => 'GET',
uri => url
);
l_result := DBMS_VECTOR_CHAIN.UTL_TO_TEXT(DBMS_CLOUD.GET_RESPONSE_RAW(l_resp);
RETURN l_result;
END get_url_content;
/
BEGIN
DBMS_CLOUD_AI_AGENT.create_tool(
tool_name => 'HTTP_TOOL',
attributes => '{
"instruction": "This tool fetches and returns the plain text content from the specified URL. ",
"function": "get_url_content"
}'
);
END;
/Exemplo: Exibir Prompts e Respostas do Agente da Última Execução da Equipe
Este exemplo ajuda a depurar a atividade recente do agente exibindo prompts, respostas e pensamentos do agente da execução mais recente da equipe do agente usando visualizações históricas e dados da conversa.
Antes de Começar
Revisar:
Este exemplo recupera e exibe logs detalhados da execução mais recente da equipe do agente. O exemplo usa as exibições USER_AI_AGENT_TEAM_HISTORY, USER_AI_AGENT_TASK_HISTORY e USER_CLOUD_AI_CONVERSATION_PROMPTS para mostrar o nome da equipe, a tarefa, os prompts associados e as respostas de cada agente. Use esta consulta para solucionar problemas revisando o prompt de entrada e as respostas geradas da última execução da equipe.
WITH latest_team AS (
SELECT team_exec_id, team_name, start_date
FROM user_ai_agent_team_history
ORDER BY start_date DESC
FETCH FIRST 1 ROW ONLY
),
latest_task AS (
SELECT team_exec_id, task_name, agent_name, conversation_params, start_date,
ROW_NUMBER() OVER (PARTITION BY team_exec_id, task_name, agent_name
ORDER BY start_date DESC) as rn
FROM user_ai_agent_task_history
)
SELECT
team.team_name,
task.task_name,
task.agent_name,
p.prompt,
p.prompt_response
FROM latest_team team
JOIN latest_task task
ON team.team_exec_id = task.team_exec_id
AND task.rn = 1
LEFT JOIN user_cloud_ai_conversation_prompts p
ON p.conversation_id = JSON_VALUE(task.conversation_params, '$.conversation_id')
ORDER BY task.start_date DESC NULLS LAST,
p.created DESC NULLS LAST;Este exemplo recupera logs detalhados das visualizações de histórico de ferramentas, tarefas e equipes. Use as consultas a seguir para auditar o uso de ferramentas, tarefas e equipes e solucionar problemas e análise de log. As consultas usam as views USER_AI_AGENT_TOOL_HISTORY, USER_AI_AGENT_TASK_HISTORY e USER_AI_AGENT_TASK_HISTORY.
--View the tool history
select * from USER_AI_AGENT_TOOL_HISTORY
order by START_DATE desc
--View the task history
select * from USER_AI_AGENT_TASK_HISTORY
order by START_DATE desc
--View the team history
select * from USER_AI_AGENT_TEAM_HISTORY
order by START_DATE descExemplo: Retomar uma Execução da Equipe do Agente do Estado WAITING_FOR_HUMAN
Este exemplo mostra como retomar a execução de uma equipe de agente quando o status do histórico de tarefas é WAITING_FOR_HUMAN. Quando uma equipe de agente entra no estado WAITING_FOR_HUMAN, ela pausa até que um usuário forneça a próxima entrada ou confirmação. Você pode retomar a execução dependendo de como você usa a equipe do agente: na linha de comando SQL ou por meio de DBMS_CLOUD_AI_AGENT.RUN_TEAM.
Antes de Começar
Revisar:
Exemplo: Retomar uma Execução da Equipe do Agente Usando a Linha de Comando SQL
Se você estiver usando SELECT AI AGENT <prompt> na linha de comando SQL, o agente retomará automaticamente a execução da equipe pausada. O contexto da conversa, incluindo prompts e argumentos anteriores, é mantido sem a necessidade de parâmetros adicionais.
Exemplo: Retomar uma Execução da Equipe do Agente Usando DBMS_CLOUD_AI_AGENT.RUN_TEAM
Se você estiver usando o procedimento DBMS_CLOUD_AI_AGENT.RUN_TEAM, poderá retomar uma equipe de agentes pausada, informando o mesmo conversation_id que foi usado na execução inicial. O estado de execução da equipe do agente, incluindo ações pendentes e contexto, é preservado e a equipe do agente continua exatamente de onde parou.
Consulte Exemplo: Criar um Agente de Devolução de Produto para obter um exemplo usando a função DBMS_CLOUD_AI_AGENT.RUN_TEAM.
--Interact with the agent
DECLARE
v_response VARCHAR2(4000);
BEGIN
v_response := DBMS_CLOUD_AI_AGENT.RUN_TEAM(
team_name => '<same initial team name>',
user_prompt => 'response to request',
params => '{"conversation_id": "<same initial conversation_id>"}'
);
DBMS_OUTPUT.PUT_LINE(v_response);
END;Exemplo: Criar e Executar uma Equipe de Supervisor de Suporte ao Cliente
Este exemplo completo é baseado no cenário de suporte ao cliente de várias voltas. Ele cria dados de conta e pagamento de amostra, define funções PL/SQL, mapeia essas funções para ferramentas, cria agentes e tarefas do colaborador, cria o agente e a equipe do supervisor e executa uma conversa Select AI Agent Framework de várias voltas.
Antes de Começar
Revisar:
- Executar Pré-requisitos para o Select AI
- Pré-requisitos para Usar o Select AI Agent Framework
- Procedimento CREATE_TEAM
- Procedimento CREATE_AGENT
O colaborador da conta pode pesquisar ou atualizar os detalhes da conta do cliente. O colaborador de pagamento pode recuperar transações de pagamento e usar uma ferramenta de notificação por e-mail quando o usuário confirmar que um demonstrativo deve ser enviado. O supervisor recebe a solicitação do usuário, delega à conta ou ao colaborador de pagamento e retorna a resposta final.
A imagem a seguir mostra o fluxo da orquestração de atendimento ao cliente com um agente supervisor:

Descrição da ilustração select-ai-agent-customer-service-supervisor.png
O exemplo a seguir mostra como um agente supervisor coordena agentes do colaborador para concluir uma solicitação do cliente.
Um cliente pergunta:
"Por favor, verifique meus pagamentos em 11 de janeiro de 2026 e me envie uma declaração."
O supervisor analisa a solicitação e seleciona apenas os agentes do colaborador necessários.
| Etapa | Decisão do supervisor | Agentes | Resultado Final |
|---|---|---|---|
| 1 | Identifique a solicitação como uma consulta de pagamento que também pode exigir a entrega do demonstrativo | PAYMENT_AGENT/PAYMENT_MANAGEMENT_TASK | O trabalhador de pagamento recupera as transações para 11 de janeiro de 2026 e retorna os detalhes do pagamento ao supervisor. |
| 2 | Determine se o usuário também solicitou uma declaração, que requer confirmação antes do envio. | Agente supervisor | O supervisor solicita ao usuário que confirme se a instrução deverá ser enviada. |
| 3 | Após receber a confirmação, delegue a entrega do demonstrativo ao colaborador de notificação. | NOTIFICATION_AGENT / SEND_STATEMENT_TASK | O colaborador de notificação envia ou prepara o demonstrativo e retorna o status de entrega. |
| 4 | Combine os detalhes do pagamento e o status de entrega do demonstrativo. | Agente supervisor | O supervisor retorna uma única resposta que inclui o resumo do pagamento e a confirmação da entrega do demonstrativo. |
-- Payment System Demo
-- ============================================================================
-- STEP 1: Create user_accounts Sample Table
-- ============================================================================
-- Optional cleanup for a repeatable demo
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE user_accounts';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
RAISE;
END IF;
END;
/
-- Create user_accounts table
CREATE TABLE user_accounts (
user_id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
user_name VARCHAR2(100) NOT NULL UNIQUE,
email VARCHAR2(100),
billing_address VARCHAR2(200),
phone VARCHAR2(20),
account_status VARCHAR2(20),
created_date DATE DEFAULT SYSDATE,
updated_date DATE DEFAULT SYSDATE
);
-- Insert three example rows
INSERT INTO user_accounts (user_name, email, billing_address, phone, account_status)
VALUES ('john_smith', '<USER1_EMAIL>', '123 Main St, San Francisco, CA 94102', '415-555-0100', 'ACTIVE');
INSERT INTO user_accounts (user_name, email, billing_address, phone, account_status)
VALUES ('mary_jones', '<USER2_EMAIL>', '456 Oak Ave, Austin, TX 78701', '512-555-0200', 'ACTIVE');
INSERT INTO user_accounts (user_name, email, billing_address, phone, account_status)
VALUES ('david_wilson', '<USER3_EMAIL>', '789 Pine Rd, Seattle, WA 98101', '206-555-0300', 'ACTIVE');
COMMIT;
-- ============================================================================
-- STEP 2: Create PL/SQL Functions
-- ============================================================================
-- Function 1: check_account - retrieves user account information
CREATE OR REPLACE FUNCTION check_account(
user_name IN VARCHAR2
) RETURN VARCHAR2
IS
l_account_info VARCHAR2(4000);
l_user_name VARCHAR2(100) := user_name;
l_email VARCHAR2(100);
l_billing_address VARCHAR2(200);
l_phone VARCHAR2(20);
l_account_status VARCHAR2(20);
BEGIN
-- Query user account
SELECT
user_name,
email,
billing_address,
phone,
account_status
INTO
l_user_name,
l_email,
l_billing_address,
l_phone,
l_account_status
FROM user_accounts
WHERE UPPER(user_name) = UPPER(l_user_name);
--Format account information as readable text
l_account_info := 'Account Information for ' || l_user_name || CHR(10) ||
'--------------------------------' || CHR(10) ||
'Email: ' || NVL(l_email, 'Not set') || CHR(10) ||
'Billing Address: ' || NVL(l_billing_address, 'Not set') || CHR(10) ||
'Phone: ' || NVL(l_phone, 'Not set') || CHR(10) ||
'Account Status: ' || NVL(l_account_status, 'Unknown');
RETURN l_account_info;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN 'Error: User "' || user_name || '" not found in the system.';
WHEN OTHERS THEN
RETURN 'Error retrieving account: ' || SQLERRM;
END check_account;
/
-- Function 2: update_account - updates user account information
CREATE OR REPLACE FUNCTION update_account(
user_name IN VARCHAR2,
column_name IN VARCHAR2,
new_value IN VARCHAR2
) RETURN VARCHAR2
IS
-- Uses an autonomous transaction so the tool can commit the account update
-- independently of the surrounding Agent call.
PRAGMA AUTONOMOUS_TRANSACTION;
l_sql VARCHAR2(500);
l_rows_updated NUMBER;
l_result VARCHAR2(500);
l_valid_column BOOLEAN := FALSE;
BEGIN
-- Validate column name (security: only allow specific columns)
IF UPPER(column_name) IN ('EMAIL', 'BILLING_ADDRESS', 'PHONE', 'ACCOUNT_STATUS') THEN
l_valid_column := TRUE;
ELSE
RETURN 'Error: Column "' || column_name || '" is not allowed to be updated. ' ||
'Valid columns are: email, billing_address, phone, account_status';
END IF;
-- Build dynamic SQL for update
l_sql := 'UPDATE user_accounts SET ' ||
DBMS_ASSERT.SIMPLE_SQL_NAME(column_name) || ' = :new_value, ' ||
'updated_date = SYSDATE ' ||
'WHERE user_name = :user_name';
-- Execute update
EXECUTE IMMEDIATE l_sql
USING new_value, user_name;
l_rows_updated := SQL%ROWCOUNT;
COMMIT;
-- Return result message
IF l_rows_updated > 0 THEN
l_result := 'Successfully updated ' || column_name || ' to "' || new_value ||
'" for user "' || user_name || '".';
ELSE
l_result := 'Error: User "' || user_name || '" not found. No updates made.';
END IF;
RETURN l_result;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
RETURN 'Error updating account: ' || SQLERRM;
END update_account;
/
-- ============================================================================
-- STEP 3: Create Tools Based on PL/SQL Functions
-- ============================================================================
-- Tool 1: check_account_tool
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
tool_name => 'CHECK_ACCOUNT_TOOL',
attributes => '{
"instruction": "This tool retrieves user account information including email, billing address, phone, and account status. Provide the user_name to get the account details.",
"function": "check_account"
}'
);
END;
/
-- Tool 2: update_account_tool
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
tool_name => 'UPDATE_ACCOUNT_TOOL',
attributes => '{
"instruction": "This tool updates user account information. Provide user_name, column_name (email, billing_address, phone, or account_status), and new_value to update the account.",
"function": "update_account"
}'
);
END;
/
-- ============================================================================
-- STEP 4: Create Account Management Agent
-- ============================================================================
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_AGENT(
agent_name => 'ACCOUNT_AGENT',
description => 'Manages user account information including billing addresses and contact details',
attributes => '{
"profile_name": "<AI_PROFILE_NAME>",
"role": "You are a Account Management Specialist. Your role is to help users view and update their account information."
}'
);
END;
/
-- ============================================================================
-- STEP 5: Create Task for Account Management Agent
-- ============================================================================
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TASK(
task_name => 'ACCOUNT_MANAGEMENT_TASK',
attributes => '{
"instruction": "Handle user account management requests. For account queries, use the check_account_tool with the user_name. For account updates, use the update_account_tool with user_name, the column to update (email, billing_address, phone, or account_status), and the new value. Always provide clear confirmation of any changes made.",
"tools": ["CHECK_ACCOUNT_TOOL", "UPDATE_ACCOUNT_TOOL"]
}'
);
END;
/
-- ============================================================================
-- STEP 6: Create Payment Transactions Sample Table
-- ============================================================================
-- Optional cleanup for a repeatable demo
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE payment_transactions';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
RAISE;
END IF;
END;
/
-- Create payment_transactions table
CREATE TABLE payment_transactions (
transaction_id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
user_name VARCHAR2(100) NOT NULL,
transaction_date DATE NOT NULL,
amount NUMBER(10,2) NOT NULL,
payment_method VARCHAR2(50),
status VARCHAR2(20),
description VARCHAR2(200),
created_date DATE DEFAULT SYSDATE
);
-- Create index for better query performance
CREATE INDEX idx_transactions_user_date ON payment_transactions(user_name, transaction_date);
-- Insert sample transaction data
-- Transactions for john_smith
INSERT INTO payment_transactions (user_name, transaction_date, amount, payment_method, status, description)
VALUES ('john_smith', TO_DATE('2026-01-11', 'YYYY-MM-DD'), 150.00, 'Credit Card', 'COMPLETED', 'Monthly subscription');
INSERT INTO payment_transactions (user_name, transaction_date, amount, payment_method, status, description)
VALUES ('john_smith', TO_DATE('2026-01-11', 'YYYY-MM-DD'), 75.50, 'PayPal', 'COMPLETED', 'Add-on service');
INSERT INTO payment_transactions (user_name, transaction_date, amount, payment_method, status, description)
VALUES ('john_smith', TO_DATE('2026-01-15', 'YYYY-MM-DD'), 200.00, 'Credit Card', 'COMPLETED', 'Annual renewal');
INSERT INTO payment_transactions (user_name, transaction_date, amount, payment_method, status, description)
VALUES ('john_smith', TO_DATE('2024-12-01', 'YYYY-MM-DD'), 150.00, 'Credit Card', 'COMPLETED', 'Monthly subscription');
-- Transactions for mary_jones
INSERT INTO payment_transactions (user_name, transaction_date, amount, payment_method, status, description)
VALUES ('mary_jones', TO_DATE('2024-11-11', 'YYYY-MM-DD'), 99.99, 'Debit Card', 'COMPLETED', 'Premium upgrade');
INSERT INTO payment_transactions (user_name, transaction_date, amount, payment_method, status, description)
VALUES ('mary_jones', TO_DATE('2024-11-20', 'YYYY-MM-DD'), 49.99, 'Credit Card', 'COMPLETED', 'Monthly subscription');
-- Transactions for david_wilson
INSERT INTO payment_transactions (user_name, transaction_date, amount, payment_method, status, description)
VALUES ('david_wilson', TO_DATE('2024-11-11', 'YYYY-MM-DD'), 299.00, 'Wire Transfer', 'COMPLETED', 'Annual plan');
INSERT INTO payment_transactions (user_name, transaction_date, amount, payment_method, status, description)
VALUES ('david_wilson', TO_DATE('2024-11-25', 'YYYY-MM-DD'), 25.00, 'PayPal', 'PENDING', 'Additional storage');
COMMIT;
-- ============================================================================
-- STEP 7: Create PL/SQL Function for get_payment
-- ============================================================================
CREATE OR REPLACE FUNCTION get_payment(
user_name IN VARCHAR2,
transaction_date IN VARCHAR2 -- Expected format: 'YYYY-MM-DD' or 'Nov 11' or 'November 11'
) RETURN VARCHAR2
IS
l_payment_info CLOB;
l_transaction_date DATE;
l_total_amount NUMBER := 0;
l_transaction_count NUMBER := 0;
l_date_parsed DATE;
l_user_name VARCHAR2(100) := user_name;
-- Cursor to fetch transactions
CURSOR c_transactions IS
SELECT
transaction_id,
TO_CHAR(transaction_date, 'YYYY-MM-DD HH24:MI:SS') AS txn_datetime,
amount,
payment_method,
status,
description
FROM payment_transactions
WHERE user_name = l_user_name
AND TRUNC(transaction_date) = TRUNC(l_date_parsed)
ORDER BY transaction_date;
BEGIN
-- Parse the date input (handle different formats)
BEGIN
-- Try standard format first: YYYY-MM-DD
l_date_parsed := TO_DATE(transaction_date, 'YYYY-MM-DD');
EXCEPTION
WHEN OTHERS THEN
BEGIN
-- Try format: Mon DD (e.g., 'Nov 11')
l_date_parsed := TO_DATE(transaction_date || ' ' || TO_CHAR(SYSDATE, 'YYYY'), 'Mon DD YYYY');
EXCEPTION
WHEN OTHERS THEN
BEGIN
-- Try format: Month DD (e.g., 'November 11')
l_date_parsed := TO_DATE(transaction_date || ' ' || TO_CHAR(SYSDATE, 'YYYY'), 'Month DD YYYY');
EXCEPTION
WHEN OTHERS THEN
RETURN 'Error: Unable to parse date "' || transaction_date || '". Please use format YYYY-MM-DD (e.g., 2024-11-11) or Mon DD (e.g., Nov 11).';
END;
END;
END;
-- Build header
l_payment_info := 'Payment Transactions for ' || l_user_name || ' on ' ||
TO_CHAR(l_date_parsed, 'YYYY-MM-DD') || CHR(10) ||
'================================================================' || CHR(10);
-- Fetch and format transactions
FOR rec IN c_transactions LOOP
l_transaction_count := l_transaction_count + 1;
l_total_amount := l_total_amount + rec.amount;
l_payment_info := l_payment_info || CHR(10) ||
'Transaction #' || l_transaction_count || ':' || CHR(10) ||
' Transaction ID: ' || rec.transaction_id || CHR(10) ||
' Date/Time: ' || rec.txn_datetime || CHR(10) ||
' Amount: $' || TO_CHAR(rec.amount, 'FM999,999,990.00') || CHR(10) ||
' Payment Method: ' || NVL(rec.payment_method, 'N/A') || CHR(10) ||
' Status: ' || NVL(rec.status, 'N/A') || CHR(10) ||
' Description: ' || NVL(rec.description, 'N/A') || CHR(10);
END LOOP;
-- Add summary
IF l_transaction_count = 0 THEN
l_payment_info := l_payment_info || CHR(10) ||
'No transactions found for this date.' || CHR(10);
ELSE
l_payment_info := l_payment_info || CHR(10) ||
'================================================================' || CHR(10) ||
'Summary:' || CHR(10) ||
' Total Transactions: ' || l_transaction_count || CHR(10) ||
' Total Amount: $' || TO_CHAR(l_total_amount, 'FM999,999,990.00') || CHR(10);
END IF;
RETURN l_payment_info;
EXCEPTION
WHEN OTHERS THEN
RETURN 'Error retrieving payment information: ' || SQLERRM;
END get_payment;
/
-- ============================================================================
-- STEP 8: Create Tool for get_payment
-- ============================================================================
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
tool_name => 'GET_PAYMENT_TOOL',
attributes => '{
"instruction": "This tool retrieves payment transaction information for a specific user on a specific date. Provide the user_name and date (format: YYYY-MM-DD). It returns all transactions for that user on that date including transaction IDs, amounts, payment methods, status, and descriptions.",
"function": "get_payment"
}'
);
END;
/
BEGIN
DBMS_CLOUD.DROP_CREDENTIAL(
credential_name => 'EMAIL_CRED' );
END;
/
BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'EMAIL_CRED',
username => '<OCI_SMTP_USERNAME>',
password => '<SMTP_PASSWORD>');
END;
/
BEGIN
-- Allow SMTP access for user ADMIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => 'smtp.email.us-ashburn-1.oci.oraclecloud.com',
lower_port => 587,
upper_port => 587,
ace => xs$ace_type(privilege_list => xs$name_list('SMTP'),
principal_name => '<DATABASE_USERNAME>',
principal_type => xs_acl.ptype_db));
END;
/
-- ============================================================================
-- STEP 9: Configure Email Notification Tool
-- ============================================================================
EXEC DBMS_CLOUD_AI_AGENT.drop_tool('Email');
BEGIN
-- This EMAIL tool sends statements to the fixed recipient configured in the recipient parameter.
-- To send to a customer's stored email address, replace this fixed-recipient configuration
-- with logic that looks up and passes the customer's email address.
DBMS_CLOUD_AI_AGENT.create_tool(
tool_name => 'EMAIL',
attributes => q'[{"tool_type": "Notification",
"tool_params": {"notification_type" : "EMAIL",
"credential_name": "EMAIL_CRED",
"recipient": "<RECIPIENT_EMAIL>",
"subject": "Payment statement",
"smtp_host": "smtp.email.us-ashburn-1.oci.oraclecloud.com",
"sender": "<SENDER_EMAIL>"}}]'
);
END;
/
-- ============================================================================
-- STEP 10: Create Payment Management Agent
-- ============================================================================
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_AGENT(
agent_name => 'PAYMENT_AGENT',
description => 'Manages payment transactions, generates statements, and handles payment-related queries',
attributes => '{
"profile_name": "<AI_PROFILE_NAME>",
"role": "You are a Payment Management Specialist. "
}'
);
END;
/
-- ============================================================================
-- STEP 11: Create Task for Payment Management Agent
-- ============================================================================
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TASK(
task_name => 'PAYMENT_MANAGEMENT_TASK',
attributes => '{
"instruction": "Handle payment-related requests. For payment queries, use GET_PAYMENT_TOOL with the user_name and date. Show the payment details, then ask the user whether they want to receive the statement by email. If they do, send it using EMAIL.",
"tools": ["GET_PAYMENT_TOOL", "EMAIL"]
}'
);
END;
/
-- STEP 12: Create the Supervisor Agent and Team
exec DBMS_CLOUD_AI_AGENT.clear_team;
exec DBMS_CLOUD_AI_AGENT.drop_team('CUSTOMER_SUPPORT');
EXEC DBMS_CLOUD_AI_AGENT.drop_agent('ORCHESTRATOR_AGENT');
BEGIN
DBMS_CLOUD_AI_AGENT.create_agent(
'ORCHESTRATOR_AGENT',
'{
"profile_name": "<AI_PROFILE_NAME>",
"supervisor" : true
}'
);
END;
/
BEGIN
DBMS_CLOUD_AI_AGENT.create_team(
team_name => 'CUSTOMER_SUPPORT',
attributes => '{
"process": "sequential",
"supervisor_agent": "ORCHESTRATOR_AGENT",
"agents": [
{"name":"ACCOUNT_AGENT","task" : "ACCOUNT_MANAGEMENT_TASK"},
{"name":"PAYMENT_AGENT","task" : "PAYMENT_MANAGEMENT_TASK"}
]
}',
description => 'A supervised team with orchestrator delegating to specialists'
);
END;
/
-- STEP 13: Run the Conversation
exec DBMS_CLOUD_AI_AGENT.set_team('CUSTOMER_SUPPORT');
SQL> select ai agent my user name is john_smith, I want to update my billing address to 11th Ave, Austin, TX 78701;
RESPONSE
--------------------------------------------------------------------------------
The billing address for user 'john_smith' has been successfully updated to '11th Ave, Austin, TX 78701'.
SQL> select ai agent please check my payments on Jan 11 2026;
RESPONSE
--------------------------------------------------------------------------------
Here are your payment details for January 11, 2026, john_smith:
================================================================
Payment Transactions for john_smith on 2026-01-11
Transaction #1:
Transaction ID: 1
Date/Time: 2026-01-11 00:00:00
Amount: $150.00
Payment Method: Credit Card
Status: COMPLETED
RESPONSE
--------------------------------------------------------------------------------
Description: Monthly subscription
Transaction #2:
Transaction ID: 2
Date/Time: 2026-01-11 00:00:00
Amount: $75.50
Payment Method: PayPal
Status: COMPLETED
Description: Add-on service
================================================================
RESPONSE
--------------------------------------------------------------------------------
Summary:
Total Transactions: 2
Total Amount: $225.50
Would you like to receive a statement of these transactions via email? Please confirm.
SQL> select ai agent yes send the email;
RESPONSE
--------------------------------------------------------------------------------
The payment statement for January 11, 2026, has been successfully sent to the configured recipient. If you have any further questions or need assistance, feel free to ask.Exemplo: Importar e Exportar Equipes do Agente
Importe e exporte as equipes Select AI Agent Framework em bancos de dados, esquemas e serviços de agente compatíveis e entre ambientes Autonomous AI Database.
Antes de Começar
Revisar:
Este exemplo mostra como você pode exportar uma definição de equipe de agente e importá-la para outro ambiente. Você pode exportar uma equipe como uma string ou salvá-la no Object Storage e, em seguida, importar essa definição de equipe de uma string, do Object Storage ou de um arquivo local. As definições de equipe Selecionar Estrutura do Agente de IA incluem agentes, tarefas e definições de ferramenta. EXPORT_TEAM retorna uma CLOB ou grava a definição da equipe exportada no Object Storage e IMPORT_TEAM importa uma definição de equipe para o banco de dados de uma CLOB ou do Object Storage.
Observação
Observação: A exportação e a importação incluem definições de equipe e metadados associados, como agentes, tarefas e definições de ferramenta. A exportação e a importação não incluem recursos de suporte fora da definição da equipe, como credenciais, funções PL/SQL criadas pelo usuário, serviços REST externos, OCI Functions, funções do AWS Lambda, perfis, índices ou outros recursos dependentes. Crie esses recursos novamente no ambiente de destino antes de usar a equipe importada ou exportada.
Exemplos de Exportação de uma Equipe do Agente
Os exemplos a seguir mostram a exportação de uma equipe.
Exemplo: Exportar uma Equipe para o Serviço Object Storage
Este exemplo exporta a equipe ReturnAgency e grava a definição da equipe exportada em um local do serviço Object Storage. Use este método quando quiser processar a definição de equipe exportada no PL/SQL e salvar a definição de equipe fora do banco de dados para migração ou reutilização.
DECLARE
output clob;
params_clob clob;
BEGIN
BEGIN
DBMS_CLOUD_AI_AGENT.EXPORT_TEAM(
team_name => 'ReturnAgency',
object_storage_credential_name => 'cred1',
location => 'https://swiftobjectstorage.us-ashburn-
1.oraclecloud.com/v1/my_namespace/my_bucket/my_data_folder'
);
END;
/Exportar para o Armazenamento de Objetos com o parâmetro 'overwrite' definido como TRUE
Exporte uma definição de equipe do agente para um arquivo JSON no Object Storage. O argumento params define "overwrite": true, permitindo que a operação substitua um arquivo existente com o mesmo nome no local especificado.
DECLARE
output clob;
params_clob clob;
BEGIN
DBMS_CLOUD_AI_AGENT.export_team(
team_name => ‘ReturnAgency’,
object_storage_credential_name => ‘OBJ_STORAGE_CRED’,
location => ‘https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/my_namespace/my_bucket/my_data_folder/return_agency.json’,
params => ‘{“overwrite”: true}’
);
END;
/Exemplo: Exportar uma Equipe para um Arquivo Local
Este exemplo exporta a equipe Return Agency para um CLOB e grava a saída em um arquivo usando UTL_FILE. Use este método quando quiser manter a definição de equipe exportada em um objeto de diretório de banco de dados.
Observação
Observação: Se a definição da equipe exportada for grande, grave a saída CLOB em um arquivo em chunks, em vez de em uma única chamada UTL_FILE.PUT_LINE.
DECLARE
output clob;
params_clob clob;
file_handler UTL_FILE.FILE_TYPE;
BEGIN
output := DBMS_CLOUD_AI_AGENT.export_team(
team_name => 'Return Agency'
);
file_handler := UTL_FILE.FOPEN(
location => 'MY_DIR',
filename => 'return_agency.json',
open_mode => 'W',
max_linesize => 32767
);
UTL_FILE.PUT_LINE(file_handler, output);
UTL_FILE.FCLOSE(file_handler);
END;
/Exemplo: Exportar uma Equipe para uma String
Exporte uma definição de equipe de agente como um CLOB. A função retorna a especificação da equipe, que você pode armazenar em uma variável, inspecionar, modificar ou usar no processamento subsequente antes de salvá-la ou importá-la em outro lugar.
DECLARE
output clob;
params_clob clob;
file_handler UTL_FILE.FILE_TYPE;
BEGIN
output := DBMS_CLOUD_AI_AGENT.export_team(
team_name => ‘Return Agency’
);
END;
/Exemplos de Importação de uma Equipe do Agente
Os exemplos a seguir mostram a importação de uma equipe.
Exemplo: Importar uma Equipe do Serviço Object Storage
Este exemplo importa uma definição de equipe de um arquivo JSON armazenado no Object Storage. Use este método quando a definição de equipe exportada já existir em um local de armazenamento remoto.
BEGIN
DBMS_CLOUD_AI_AGENT.import_team(
profile_name => 'PROFILE_NAME',
team_name => 'ReturnAgency',
object_storage_credential_name => 'cred1',
object_uri => 'https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/my_namespace/my_bucket/my_data_folder/import_agent.json'
);
END;
/Exemplo: Importar uma Equipe de uma Especificação Aprovada
Este exemplo cria primeiro as funções necessárias criadas pelo usuário e depois importa a definição da equipe de uma especificação JSON armazenada em um CLOB. Use esse método ao gerar ou modificar a especificação no PL/SQL antes da importação.
CREATE OR REPLACE
FUNCTION run_sql(nl_query IN CLOB)
RETURN CLOB
IS
v_query CLOB;
BEGIN
v_query := '(Name,Description,Category,Date Created,Price,Discounted Price,Offer Expiration Date)
("AquaPure Water Pitcher", "2-liter BPA-free water pitcher with filter", "Kitchen", "2024-04-12", 34.95, 27.95, "2024-07-01")
("CozyLuxe Throw Blanket", "Ultra-soft microfiber throw blanket (50"x60")", "Living Room", "2024-03-22", 19.99, None, None)
("SafeStep Bath Mat", "Non-slip bath mat, mildew resistant, gray", "Bathroom", "2024-05-05", 12.50, 9.99, "2024-06-15")
("PowerPlug Extension", "6-outlet surge protector power strip", "Electrical", "2024-01-10", 21.75, None, None)
("FreshGuard Storage Bags", "Set of 20 reusable silicone food storage bags", "Kitchen", "2024-03-17", 15.60, 12.48, "2024-06-10") ';
RETURN v_query;
END run_sql;
/
CREATE OR REPLACE
FUNCTION email(contents IN CLOB)
RETURN CLOB
IS
BEGIN
dbms_output.put_line('>>>>>>>> Agent generated:\n' ||
contents || '\n<<<<<<<<<');
RETURN 'Email sent successfully';
END email;
/
-- import with specification
DECLARE
l_input_json CLOB;
BEGIN
l_input_json :=
q'[
{
"agents": [],
"component_type": "Agent",
"description": "You are an marketing agent who helps plan campaigns.",
"flows": [],
"id": "1d02daf2-57...",
"inputs": [],
"llm_config": {
"component_type": "OCI_CONFIG",
"default_generation_parameters": {
"max_tokens": null,
"temperature": null,
"top_p": null
},
"description": null,
"id": "9e2a18a2...ae",
"metadata": {},
"model_id": "openai.gpt-oss-120b",
"name": "openai/gpt-oss-120b"
},
"metadata": {},
"name": "Marketing assistant",
"outputs": [],
"system_prompt": "Help the user with their tasks around marketing products for their business.",
"tools": [
{
"component_type": "ServerTool",
"description": "Send an email to the current user.",
"id": "9fcc6...",
"inputs": [
{
"title": "content",
"type": "string"
}
],
"metadata": {},
"name": "Email",
"outputs": [
{
"type": "string"
}
]
},
{
"component_type": "ServerTool",
"description": "Generates a SQL query for the given NL Question, runs it, and returns the results.",
"id": "ae1e6c17...",
"inputs": [
{
"title": "nl_query",
"type": "string"
}
],
"metadata": {},
"name": "run_sql",
"outputs": [
{
"type": "string"
}
]
}
]
}
]';
DBMS_CLOUD_AI_AGENT.import_team(
profile_name => 'PROFILE_NAME',
team_name => 'MARKETING',
specification => l_input_json
);
END;
/Exemplo: Importar uma Equipe de um Arquivo de Diretório
Importe uma definição de equipe de agente de um arquivo JSON armazenado em um objeto de diretório. O parâmetro location especifica o objeto de diretório e o nome do arquivo.
DECLARE
file_handle UTL_FILE.FILE_TYPE;
line_buffer VARCHAR2(32767);
file_content CLOB;
temp_line VARCHAR2(32767);
BEGIN
DBMS_LOB.CREATETEMPORARY(file_content, TRUE);
file_handle := UTL_FILE.FOPEN('MY_DIRECTORY', 'marketing_team.txt', 'r');
LOOP
BEGIN
UTL_FILE.GET_LINE(file_handle, line_buffer);
temp_line := line_buffer || CHR(10);
DBMS_LOB.WRITEAPPEND(file_content, LENGTH(temp_line), temp_line);
EXCEPTION
WHEN NO_DATA_FOUND THEN
EXIT;
END;
END LOOP;
UTL_FILE.FCLOSE(file_handle);
DBMS_CLOUD_AI_AGENT.import_team(
profile_name => 'PROFILE_NAME',
team_name => 'MARKETING',
specification => file_content
);
EXCEPTION
WHEN OTHERS THEN
IF UTL_FILE.IS_OPEN(file_handle) THEN
UTL_FILE.FCLOSE(file_handle);
END IF;
RAISE;
END;Exemplo de Exportação e Importação
O exemplo a seguir mostra um fluxo de exportação e importação para uma equipe do agente.
—————————————————————–
– Export a Team
—————————————————————–
– Create an Agent, Task, and Team
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
tool_name => ‘GET_PAYMENT_TOOL’,
attributes => ‘{
“instruction”: “This tool retrieves payment transaction information for a specific user on a specific date. Provide the user_name and date (format: YYYY-MM-DD). It returns all transactions for that user on that date including transaction IDs, amounts, payment methods, status, and descriptions.”,
“function”: “get_payment”
}’
);
END;
/
– Websearch tool is accessing OPENAI endpoint, so we need allow ACL access
BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => ‘api.openai.com’,
ace => xs$ace_type(privilege_list => xs$name_list(‘http’),
principal_name => ‘ADB_USER’,
principal_type => xs_acl.ptype_db)
);
END;
/
BEGIN
DBMS_CLOUD_AI_AGENT.create_tool(
tool_name => ‘Websearch’,
attributes => q’[{“instruction”: “This tool can be used for searching the price given a specific link. The input of the tool should be a query like what is the price of the product on this website”,
“tool_type”: “WEBSEARCH”,
“tool_params”: {“credential_name”: “GENAI_CRED”}}]’
);
END;
/
BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => ‘EMAIL_CRED’,
username => '',
password => '');
END;
/
-- To allow Email tool in ADBS, we need to allow SMTP access
BEGIN
-- Allow SMTP access for user ADMIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => 'smtp.email.us-ashburn-1.oci.oraclecloud.com',
lower_port => 587,
upper_port => 587,
ace => xs$ace_type(privilege_list => xs$name_list('SMTP'),
principal_name => 'ADB_USER',
principal_type => xs_acl.ptype_db));
END;
/
BEGIN
-- This EMAIL tool sends statements to the fixed recipient configured in the recipient parameter.
-- To send to a customer's stored email address, replace this fixed-recipient configuration
-- with logic that looks up and passes the customer's email address.
DBMS_CLOUD_AI_AGENT.create_tool(
tool_name => 'EMAIL',
attributes => q'[{"tool_type": "Notification",
"tool_params": {"notification_type" : "EMAIL",
"credential_name": "EMAIL_CRED",
"recipient": "",
"subject": "Payment statement",
"smtp_host": "smtp.email.us-ashburn-1.oci.oraclecloud.com",
"sender": ""}}]'
);
END;
/
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_AGENT(
agent_name => 'PAYMENT_AGENT',
description => 'Manages payment transactions, generates statements, and handles payment-related queries',
attributes => '{
"profile_name": "",
"role": "You are a Payment Management Specialist. "
}'
);
END;
/
BEGIN
DBMS_CLOUD_AI_AGENT.create_team(
team_name => 'ReturnAgency',
attributes => '{"agents": [{"name":"CustomerAgent","task" : "Return_And_Price_Match"}],
"process": "sequential"}');
END;
/
-- Export Team Option 1: Export to Object Store
DECLARE
output clob;
params_clob clob;
BEGIN
DBMS_CLOUD_AI_AGENT.export_team(
team_name => 'ReturnAgency',
object_storage_credential_name => 'cred1',
location => 'https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/my_namespace/my_bucket/my_data_folder/'
);
END;
/
– Export Team Option 2: Export to a File
DECLARE
output clob;
params_clob clob;
l_attr_obj JSON_OBJECT_T := new JSON_OBJECT_T;
file_handler UTL_FILE.FILE_TYPE;
BEGIN
output := DBMS_CLOUD_AI_AGENT.export_team(
team_name => ‘Return Agency’
);
file_handler := UTL_FILE.FOPEN(
location => ‘MY_DIR’,
filename => ‘return_agency.json’,
open_mode => ‘W’,
max_linesize => 32767
);
UTL_FILE.PUT_LINE(file_handler, output);
UTL_FILE.FCLOSE(file_handler);
END;
/
—————————————————————–
– Import a Team
—————————————————————–
– Import Team Option 1: Import from a file in Object Store
BEGIN
DBMS_CLOUD_AI_AGENT.import_team(
profile_name => ‘PROFILE_NAME’,
team_name => ‘TEAM_NAME’,
object_storage_credential_name => ‘cred1’,
object_uri => ‘https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/my_namespace/my_bucket/my_data_folder/import_agent.json’
);
END;
/
– Import Team Option 2: Import from a passed specification
– Create any relevant functions first
CREATE OR REPLACE
FUNCTION run_sql(nl_query IN CLOB)
RETURN CLOB
IS
v_query CLOB;
BEGIN
v_query := ‘(Name,Description,Category,Date Created,Price,Discounted Price,Offer Expiration Date)
(“AquaPure Water Pitcher”, “2-liter BPA-free water pitcher with filter”, “Kitchen”, “2024-04-12”, 34.95, 27.95, “2024-07-01”)
(“CozyLuxe Throw Blanket”, “Ultra-soft microfiber throw blanket (50”x60”)”, “Living Room”, “2024-03-22”, 19.99, None, None)
(“SafeStep Bath Mat”, “Non-slip bath mat, mildew resistant, gray”, “Bathroom”, “2024-05-05”, 12.50, 9.99, “2024-06-15”)
(“PowerPlug Extension”, “6-outlet surge protector power strip”, “Electrical”, “2024-01-10”, 21.75, None, None)
(“FreshGuard Storage Bags”, “Set of 20 reusable silicone food storage bags”, “Kitchen”, “2024-03-17”, 15.60, 12.48, “2024-06-10”) ‘;
RETURN v_query;
END run_sql;
/
CREATE OR REPLACE
FUNCTION email(contents IN CLOB)
RETURN CLOB
IS
BEGIN
dbms_output.put_line(‘»»»» Agent generated:\n’ ||
contents || ‘\n««««<’);
RETURN ‘Email sent successfully’;
END email;
/
– import with specification
DECLARE
l_input_json CLOB;
BEGIN
l_input_json :=
q’[
{
“agents”: [],
“component_type”: “Agent”,
“description”: “You are an marketing agent who helps plan campaigns.”,
“flows”: [],
“id”: “1d02da…”,
“inputs”: [],
“llm_config”: {
“component_type”: “OCI_CONFIG”,
“default_generation_parameters”: {
“max_tokens”: null,
“temperature”: null,
“top_p”: null
},
“description”: null,
“id”: “9e2a1…”,
“metadata”: {},
“model_id”: “openai.gpt-oss-120b”,
“name”: “openai/gpt-oss-120b”
},
“metadata”: {},
“name”: “Marketing assistant”,
“outputs”: [],
“system_prompt”: “Help the user with their tasks around marketing products for their business.”,
“tools”: [
{
“component_type”: “ServerTool”,
“description”: “Send an email to the current user.”,
“id”: “9fcc66…”,
“inputs”: [
{
“title”: “content”,
“type”: “string”
}
],
“metadata”: {},
“name”: “Email”,
“outputs”: [
{
“type”: “string”
}
]
},
{
“component_type”: “ServerTool”,
“description”: “Generates a SQL query for the given NL Question, runs it, and returns the results.”,
“id”: “ae1e…”,
“inputs”: [
{
“title”: “nl_query”,
“type”: “string”
}
],
“metadata”: {},
“name”: “run_sql”,
“outputs”: [
{
“type”: “string”
}
]
}
]
}
]’;
DBMS_CLOUD_AI_AGENT.import_team(
profile_name => ‘PROFILE_NAME’,
team_name => ‘TEAM_NAME’,
specification => l_input_json
);
end;
/
– Import Team Option 3: Import from a passed specification
DECLARE
file_handle UTL_FILE.FILE_TYPE;
line_buffer VARCHAR2(32767);
file_content CLOB;
temp_line VARCHAR2(32767);
BEGIN
DBMS_LOB.CREATETEMPORARY(file_content, TRUE);
file_handle := UTL_FILE.FOPEN('MY_DIRECTORY', 'marketing_team.txt', 'r');
LOOP
BEGIN
UTL_FILE.GET_LINE(file_handle, line_buffer);
temp_line := line_buffer || CHR(10);
DBMS_LOB.WRITEAPPEND(file_content, LENGTH(temp_line), temp_line);
EXCEPTION
WHEN NO_DATA_FOUND THEN
EXIT;
END;
END LOOP;
UTL_FILE.FCLOSE(file_handle);
DBMS_CLOUD_AI_AGENT.import_team(
profile_name => 'PROFILE_NAME',
team_name => 'TEAM_NAME',
specification => file_content
);
EXCEPTION
WHEN OTHERS THEN
IF UTL_FILE.IS_OPEN(file_handle) THEN
UTL_FILE.FCLOSE(file_handle);
END IF;
RAISE;
END;
/
– STEP 13: Run the Conversation
exec DBMS_CLOUD_AI_AGENT.set_team(‘CUSTOMER_SUPPORT’);
SQL> select ai agent my user name is john_smith, I want to update my billing address to 11th Ave, Austin, TX 78701;
RESPONSE
The billing address for user ‘john_smith’ has been successfully updated to ‘11th Ave, Austin, TX 78701’.
SQL> select ai agent please check my payments on Jan 11 2026;
RESPONSE
Here are your payment details for January 11, 2026, john_smith:
================================================================
Payment Transactions for john_smith on 2026-01-11
Transaction #1:
Transaction ID: 1
Date/Time: 2026-01-11 00:00:00
Amount: $150.00
Payment Method: Credit Card
Status: COMPLETED
RESPONSE
Description: Monthly subscription
Transaction #2:
Transaction ID: 2
Date/Time: 2026-01-11 00:00:00
Amount: $75.50
Payment Method: PayPal
Status: COMPLETED
Description: Add-on service
================================================================
RESPONSE
Summary:
Total Transactions: 2
Total Amount: $225.50
Would you like to receive a statement of these transactions via email? Please confirm.
SQL> select ai agent yes send the email;
RESPONSE
The payment statement for January 11, 2026, has been successfully sent to the configured recipient. If you have any further questions or need assistance, feel free to ask.Exemplo: Obter a Definição de um Objeto do Agente AI
Este exemplo cria uma ferramenta, um agente, uma tarefa e uma equipe e usa DBMS_CLOUD_AI_AGENT.GET_DEFINITION para retornar a definição da equipe. Ela mostra a diferença entre retornar somente a equipe solicitada e retornar a equipe com seus objetos dependentes.
Antes de Começar
Revisar:
- Executar Pré-requisitos para o Select AI
- Pré-requisitos para Usar o Select AI Agent Framework
- Crie um perfil do AI e substitua
AI_PROFILE_NAMEpelo nome do perfil em seu ambiente. - Função GET_DEFINITION
- Use nomes de objeto disponíveis para o usuário do banco de dados atual.
Criar os Objetos do Agente
Crie uma ferramenta, um agente, uma tarefa e uma equipe simples. A ferramenta retorna uma resposta estática para que o exemplo não exija dados do cliente ou um serviço externo.
CREATE OR REPLACE FUNCTION GETDEF_TOOL_FUNCTION(query IN CLOB, offset IN NUMBER, limit IN NUMBER) RETURN CLOB AS
BEGIN
RETURN '{"status":"success","message":"Example response"}';
END;
/
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TOOL(tool_name => 'GETDEF_TOOL', attributes => '{"instruction":"Return a static response for the example.","function":"GETDEF_TOOL_FUNCTION"}');
DBMS_CLOUD_AI_AGENT.CREATE_AGENT(agent_name => 'GETDEF_AGENT', attributes => '{"profile_name":"AI_PROFILE_NAME","role":"Return the response from GETDEF_TOOL.","tools":["GETDEF_TOOL"],"enable_human_tool":false}');
DBMS_CLOUD_AI_AGENT.CREATE_TASK(task_name => 'GETDEF_TASK', attributes => '{"instruction":"Use GETDEF_TOOL for the request.","tools":["GETDEF_TOOL"]}');
DBMS_CLOUD_AI_AGENT.CREATE_TEAM(team_name => 'GETDEF_TEAM', attributes => '{"agents":[{"name":"GETDEF_AGENT","task":"GETDEF_TASK"}],"process":"sequential"}');
END;
/Obter a Definição de um Agente
Use object_type definido como AGENT para retornar o bloco canônico DBMS_CLOUD_AI_AGENT.CREATE_AGENT para um agente existente.
SELECT DBMS_CLOUD_AI_AGENT.GET_DEFINITION(object_type => 'AGENT', object_name => 'GETDEF_AGENT') AS definition FROM dual;Obtenha a definição de uma ferramenta
Use object_type definido como TOOL para retornar o bloco canônico DBMS_CLOUD_AI_AGENT.CREATE_TOOL de uma ferramenta existente.
SELECT DBMS_CLOUD_AI_AGENT.GET_DEFINITION(object_type => 'TOOL', object_name => 'GETDEF_TOOL') AS definition FROM dual;Obter a Definição de uma Tarefa
Use object_type definido como TASK para retornar o bloco canônico DBMS_CLOUD_AI_AGENT.CREATE_TASK para uma tarefa existente.
SELECT DBMS_CLOUD_AI_AGENT.GET_DEFINITION(object_type => 'TASK', object_name => 'GETDEF_TASK') AS definition FROM dual;Cada chamada retorna apenas a definição de objeto solicitada. Use a chamada TEAM com dependent_objects quando precisar das definições relacionadas de agente, tarefa e ferramenta na mesma saída.
Obter a Definição da Equipe com Objetos Dependentes
Defina dependent_objects como true para incluir as definições de agente, tarefa e ferramenta dependentes na saída retornada.
SELECT DBMS_CLOUD_AI_AGENT.GET_DEFINITION(object_type => 'TEAM', object_name => 'GETDEF_TEAM', params => '{"dependent_objects": true}') AS definition FROM dual;O resultado contém o bloco canônico CREATE_TEAM e os blocos dependentes CREATE_TOOL, CREATE_AGENT e CREATE_TASK. Revise os nomes de objetos e os valores específicos do ambiente antes de recriar os objetos em outro banco de dados.
Obter a Definição da Equipe sem Objetos Dependentes
Chame GET_DEFINITION sem params para retornar somente a definição de equipe solicitada.
SELECT DBMS_CLOUD_AI_AGENT.GET_DEFINITION(object_type => 'TEAM', object_name => 'GETDEF_TEAM') AS definition FROM dual;O resultado contém um bloco canônico DBMS_CLOUD_AI_AGENT.CREATE_TEAM e faz referência a objetos dependentes por seus nomes públicos sem incluir seus blocos de criação.
Exemplo: Conceder e Revogar Acesso a uma Equipe de Agente Compartilhada
Este exemplo mostra como um proprietário da equipe do agente pode compartilhar uma equipe do agente com outro usuário do banco de dados e controlar o acesso à equipe. O exemplo cria uma equipe do agente de gerenciamento de perfis que recupera informações de perfil do usuário de uma tabela no esquema do consumidor.
Antes de Começar
Revise e certifique-se de concluir os pré-requisitos:
- Pré-requisitos para Compartilhar as Equipes Selecionar Estrutura do Agente AI
- Procedimento CREATE_AGENT
- Procedimento CREATE_TASK
- Procedimento CREATE_TOOL
- Procedimento CREATE_TEAM
- Procedimento GRANT_TEAM_ACCESS
- Função RUN_TEAM
O proprietário da equipe cria o agente, a tarefa e a ferramenta personalizada e, em seguida, cria a equipe do agente. O agente usa um perfil do AI especificado pelo placeholder da variável de runtime {llm_profile}. Isso permite que um consumidor com acesso à equipe compartilhada forneça um perfil de IA apropriado para sua sessão.
O exemplo concede à equipe acesso a ADB_USER2, que se conecta ao banco de dados usando seu próprio esquema e cria um perfil de IA chamado GROK_ADB_USER2. Em seguida, o consumidor chama a equipe usando o nome da equipe qualificada, como ADB_USER.Shared_ACCOUNT_TEAM, e fornece o perfil de IA por meio de attribute_variables no argumento params.
O CHECK_PROFILE_TOOL personalizado também resolve a tabela USER_PROFILES no esquema do consumidor autenticado. Como resultado, a equipe compartilhada pode usar a mesma definição de ferramenta ao recuperar dados do esquema do usuário que chama a equipe.
O exemplo então revoga o acesso do consumidor e mostra que o usuário não pode mais usar a equipe compartilhada.
Observação
Observação: O exemplo usa valores de espaço reservado para o cenário mostrado. Substitua esses valores pelos valores apropriados para seu próprio aplicativo e caso de uso.
Criar Funções de Ferramenta
Você cria funções de ferramenta no esquema proprietário. A ferramenta Selecionar Estrutura do Agente do AI faz referência à função correspondente e a usa quando a ferramenta é selecionada durante uma execução de equipe. A primeira ferramenta pesquisa informações do produto para a solicitação. A segunda ferramenta formata as informações do produto como uma resposta de suporte.
Criar Ferramentas
Você especifica as funções da ferramenta owner-schema como ferramentas do agente. Essas ferramentas continuam sendo parte da equipe gerenciada pelo proprietário.
Criar Tarefas
Você cria LOOKUP_PRODUCT_TASK para ser executado primeiro e WRITE_SUPPORT_RESPONSE_TASK para ser executado após os detalhes do produto estarem disponíveis.
Criar Agentes
Você cria PRODUCT_LOOKUP_AGENT para localizar informações do produto e SUPPORT_RESPONSE_AGENT para gravar a resposta final.
Criar Equipe
Você cria SHARED_SUPPORT_TEAM com um processo sequencial para que a tarefa de pesquisa seja concluída antes do início da tarefa de resposta.
Conceder acesso à equipe
Antes de conceder acesso à equipe, revise Pré-requisitos para Compartilhar as Equipes Selecionar Estrutura do Agente AI. Conceda a outro usuário do banco de dados ou permissão de função para executar a equipe compartilhada. GRANT_TEAM_ACCESS concede acesso para executar a equipe como uma unidade. A concessão da equipe não concede acesso independente para editar a definição da equipe.
Executar a Equipe Compartilhada
O consumidor executa a equipe compartilhada usando o nome da equipe qualificada pelo proprietário. Os parâmetros de tempo de execução podem especificar um ID de conversa e valores de variáveis com namespace sem alterar a definição da equipe armazenada.
O ADB_USER2 executa a equipe compartilhada usando o nome da equipe qualificada pelo proprietário, ADB_USER.Shared_ACCOUNT_TEAM. O consumidor fornece GROK_ADB_USER2 para o placeholder {llm_profile} por meio de attribute_variables no argumento params. O consumidor também fornece um ID de conversa para manter o contexto da conversa.
Criar Recursos do Consumidor
Conecte-se como ADB_USER2. Crie o perfil do AI GROK_ADB_USER2 e a tabela USER_PROFILES no esquema do consumidor. O exemplo preenche USER_PROFILES com informações de perfil de amostra que o CHECK_PROFILE_TOOL da equipe compartilhada recupera.
Por exemplo, quando ADB_USER2 solicita o endereço de faturamento de john_smith, CHECK_PROFILE_TOOL usa a função CHECK_PROFILE para recuperar as informações correspondentes da tabela USER_PROFILES no esquema ADB_USER2.
Revogar acesso da equipe
O proprietário da equipe usa REVOKE_TEAM_ACCESS para remover o acesso de ADB_USER2 ao Shared_ACCOUNT_TEAM. Depois que o acesso é revogado, o ADB_USER2 não pode mais executar o ADB_USER.Shared_ACCOUNT_TEAM qualificado pelo proprietário.
Revogar o acesso da equipe não modifica ou remove as definições de equipe, agente, tarefa ou ferramenta armazenadas. Ele remove a permissão do consumidor para executar a equipe compartilhada.
O exemplo completo é o seguinte:
-- create an agent team with admin owner
conn ADB_USER/<password>@<connection_name>
DROP TABLE user_profiles;
CREATE OR REPLACE FUNCTION check_profile(
user_name IN VARCHAR2
) RETURN VARCHAR2
AUTHID CURRENT_USER
IS
l_profile_info VARCHAR2(4000);
l_user_name VARCHAR2(100) := user_name;
l_email VARCHAR2(100);
l_billing_address VARCHAR2(200);
l_phone VARCHAR2(20);
l_account_status VARCHAR2(20);
l_schema_name VARCHAR2(128);
BEGIN
-- Resolve the table in the authenticated
-- consumer's schema.
l_schema_name := SYS_CONTEXT('USERENV',
'CURRENT_USER');
EXECUTE IMMEDIATE '
SELECT user_name, email, billing_address, phone,
account_status
FROM ' || DBMS_ASSERT.enquote_name(l_schema_name,
FALSE) ||
'.user_profiles
WHERE UPPER(user_name) = UPPER(:1)'
INTO
l_user_name,
l_email,
l_billing_address,
l_phone,
l_account_status
USING l_user_name;
l_profile_info := 'Profile Information for ' ||
l_user_name || CHR(10) ||
'--------------------------------' || CHR(10) ||
'Email: ' || NVL(l_email, 'Not set') || CHR(10) ||
'Billing Address: ' ||
NVL(l_billing_address, 'Not set') || CHR(10) ||
'Phone: ' || NVL(l_phone, 'Not set') || CHR(10) ||
'Account Status: ' ||
NVL(l_account_status, 'Unknown');
RETURN l_profile_info;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN 'Error: User "' || user_name ||
'" not found in the system.';
WHEN OTHERS THEN
RETURN 'Error retrieving profile.';
END check_profile;
/
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
tool_name => 'CHECK_PROFILE_TOOL',
attributes => '{
"instruction": "This tool retrieves user profile information including email, billing address, phone, and account status. Provide the user_name to get the profile details.",
"function": "check_profile"
}'
);
END;
/
exec DBMS_CLOUD_AI_AGENT.DROP_AGENT('ACCOUNT_AGENT');
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_AGENT(
agent_name => 'ACCOUNT_AGENT',
description => 'Manages user profile and account information including billing addresses and contact details',
attributes => '{
"profile_name": "{llm_profile}",
"role": "You are a Profile Management Specialist. Your role is to help users view and update their account information."
}'
);
END;
/
exec DBMS_CLOUD_AI_AGENT.DROP_TASK('ACCOUNT_MANAGEMENT_TASK');
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TASK(
task_name => 'ACCOUNT_MANAGEMENT_TASK',
attributes => '{
"instruction": "Handle user profile management requests. For profile queries, use the check_profile_tool with the user_name. ",
"tools": ["CHECK_PROFILE_TOOL"]
}'
);
END;
/
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TEAM(
team_name => 'Shared_ACCOUNT_TEAM',
attributes => '{
"agents": [
{
"name": "ACCOUNT_AGENT",
"task": "ACCOUNT_MANAGEMENT_TASK"
}
],
"process": "sequential"
}'
);
END;
/
-- grant tool function to ADB_USER2
GRANT EXECUTE ON check_profile TO ADB_USER2;
-- grant_team_access to ADB_USER2
exec DBMS_CLOUD_AI_AGENT.GRANT_TEAM_ACCESS(
'Shared_ACCOUNT_TEAM',
'ADB_USER2'
);
conn ADB_USER2/<password>@<connection_name>;
BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
'GROK_ADB_USER2',
'{
"provider": "oci",
"credential_name": "<GENAI_CRED>",
"oci_compartment_id": "<ocid1.compartment.oc1..placeholder>",
"model": "xai.grok-3",
"conversation": "TRUE"
}'
);
END;
/
-- Create user_profiles table
CREATE TABLE user_profiles (
user_id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
user_name VARCHAR2(100) NOT NULL UNIQUE,
email VARCHAR2(100),
billing_address VARCHAR2(200),
phone VARCHAR2(20),
account_status VARCHAR2(20),
created_date DATE DEFAULT SYSDATE,
updated_date DATE DEFAULT SYSDATE
);
-- Insert three example rows
INSERT INTO user_profiles (
user_name,
email,
billing_address,
phone,
account_status
)
VALUES (
'john_smith',
'john.smith@example.com',
'123 Main St, San Francisco, CA 94102',
'415-555-0100',
'ACTIVE'
);
INSERT INTO user_profiles (
user_name,
email,
billing_address,
phone,
account_status
)
VALUES (
'mary_jones',
'mary.jones@example.com',
'456 Oak Ave, Austin, TX 78701',
'512-555-0200',
'ACTIVE'
);
INSERT INTO user_profiles (
user_name,
email,
billing_address,
phone,
account_status
)
VALUES (
'david_wilson',
'david.wilson@example.com',
'789 Pine Rd, Seattle, WA 98101',
'206-555-0300',
'ACTIVE'
);
COMMIT;
SQL> DECLARE
2 l_final_answer CLOB;
3 l_conversation_id VARCHAR2(36);
4 BEGIN
5 l_conversation_id := DBMS_CLOUD_AI.CREATE_CONVERSATION();
6
7 l_final_answer := DBMS_CLOUD_AI_AGENT.RUN_TEAM(
8 team_name => 'ADB_USER.Shared_ACCOUNT_TEAM',
9 user_prompt => 'What is the billing address for john_smith',
10 params => '{"attribute_variables":{"llm_profile":"GROK_ADB_USER2"},"conversation_id":"'
11 || l_conversation_id || '"}'
12 );
13
14 DBMS_OUTPUT.PUT_LINE(l_final_answer);
15 END;
16 /
The billing address for john_smith is 123 Main St, San Francisco, CA 94102.
conn ADB_USER/<password>@<connection_name>
exec DBMS_CLOUD_AI_AGENT.REVOKE_TEAM_ACCESS(
'Shared_ACCOUNT_TEAM',
'ADB_USER2'
);
conn ADB_USER2/<password>@<connection_name>;
DECLARE
l_final_answer CLOB;
l_conversation_id VARCHAR2(36);
BEGIN
l_conversation_id := DBMS_CLOUD_AI.CREATE_CONVERSATION();
l_final_answer := DBMS_CLOUD_AI_AGENT.RUN_TEAM(
team_name => 'ADB_USER.Shared_ACCOUNT_TEAM',
user_prompt => 'What is the billing address for john_smith',
params => '{"attribute_variables":{"llm_profile":"GROK_ADB_USER2"},"conversation_id":"'
|| l_conversation_id || '"}'
);
DBMS_OUTPUT.PUT_LINE(l_final_answer);
END;
/Exemplo: Passar Variáveis de Tempo de Execução para uma Ferramenta Personalizada
Este exemplo mostra como uma ferramenta personalizada lê um perfil de IA fornecido pelo consumidor em state_variables usando GET_VARIABLE e o transmite para DBMS_CLOUD_AI.GENERATE. O agente também usa o placeholder da variável de runtime {llm_profile}, que é resolvido em attribute_variables quando a equipe compartilhada é executada.
O proprietário da equipe, ADB_USER, cria a função WEB_SEARCH, WebSearchTool, WebSearchAgent e WebSearchTeam, e concede acesso ADB_USER2 à equipe. O ADB_USER2 fornece seu próprio perfil de IA ao executar a equipe compartilhada.
O exemplo também mostra que o SET_TEAM pode definir variáveis de equipe.
Observação
Observação: O exemplo usa valores de espaço reservado para o cenário mostrado. Substitua esses valores pelos valores apropriados para seu próprio aplicativo e caso de uso.
Antes de Começar
Revisar:
- Pré-requisitos para Compartilhar as Equipes Selecionar Estrutura do Agente AI
- Procedimento SET_VARIABLE
- Função GET_VARIABLE
- Função RUN_TEAM
Dica: Use uma variável de estado quando uma ferramenta precisar passar um valor para uma ferramenta posterior na mesma execução da equipe. O valor permanece disponível durante toda a execução sem modificar a definição de equipe compartilhada.
O exemplo completo é o seguinte:
conn ADB_USER/<password>@<connection_name>
exec DBMS_CLOUD_AI_AGENT.drop_team('WebSearchTeam', TRUE);
exec DBMS_CLOUD_AI_AGENT.drop_agent('WebSearchAgent', TRUE);
exec DBMS_CLOUD_AI_AGENT.drop_tool('WebSearchTool', TRUE);
CREATE OR REPLACE FUNCTION websearch(
user_prompt IN CLOB
) RETURN CLOB AUTHID CURRENT_USER IS
l_result CLOB;
l_profile_name VARCHAR2(128);
BEGIN
l_profile_name := dbms_cloud_ai_agent.get_variable(
namespace => 'state_variables',
name => 'llm_profile'
);
l_result := DBMS_CLOUD_AI.generate(
prompt => user_prompt,
profile_name => l_profile_name,
action => 'chat'
);
RETURN l_result;
EXCEPTION
WHEN OTHERS THEN
RETURN 'TOOL_ERROR: ' ||
REPLACE(REPLACE(SQLERRM, CHR(10), ''), '''', '''''');
END websearch;
/
BEGIN
DBMS_CLOUD_AI_AGENT.create_tool(
tool_name => 'WebSearchTool',
attributes => '{
"instruction": "Use this tool to answer every user request. Always call the tool before responding.",
"function": "ADB_USER.WEBSEARCH",
"tool_inputs": [
{
"name": "user_prompt",
"description": "User question to send to DBMS_CLOUD_AI.generate",
"mandatory": "true"
}
]
}'
);
END;
/
BEGIN
DBMS_CLOUD_AI_AGENT.create_agent(
agent_name => 'WebSearchAgent',
attributes => '{
"profile_name": "{llm_profile}",
"role": "You are a web search assistant. You must call ADB_USER.WebSearchTool for every prompt and return the tool output.",
"enable_human_tool": "false",
"tools": ["WebSearchTool"]
}'
);
END;
/
BEGIN
DBMS_CLOUD_AI_AGENT.create_team(
team_name => 'WebSearchTeam',
attributes => '{
"agents": [{"name":"WebSearchAgent"}],
"process": "sequential"
}'
);
END;
/
grant execute on websearch to ADB_USER2;
exec DBMS_CLOUD_AI_AGENT.grant_team_access('WebSearchTeam', 'ADB_USER2');
conn ADB_USER2/<password>@<connection_name>;
set serveroutput on;
DECLARE
l_final_answer CLOB;
l_conversation_id VARCHAR2(128);
BEGIN
l_conversation_id := DBMS_CLOUD_AI.create_conversation();
l_final_answer := DBMS_CLOUD_AI_AGENT.run_team(
team_name => 'ADB_USER.WebSearchTeam',
user_prompt => 'What is Oracle Database in one sentence?',
params => '{"state_variables": {"llm_profile":"GROK_ADB_USER2"}, "attribute_variables": {"llm_profile":"GROK_ADB_USER2"}, "conversation_id":"' || l_conversation_id || '"}'
);
dbms_output.put_line(l_final_answer);
END;
/
Oracle Database is a multi-model database management system produced and marketed by Oracle Corporation, primarily designed for enterprise grid computing and data warehousing.
PL/SQL procedure successfully completed.
-- SET_TEAM can also set the variables
exec dbms_cloud_ai_agent.set_team(team_name => 'ADB_USER.WebSearchTeam', params=> '{"state_variables": {"llm_profile":"INVALID_PROFILE_FOR_STATE_TEST"}, "attribute_variables": {"llm_profile":"GROK_ADB_USER2"}}')
PL/SQL procedure successfully completed.
select ai agent What is Oracle Database in one sentence?;
RESPONSE
--------------------------------------------------------------------------------
Oracle Database is a multi-model database management system produced and markete
d by Oracle Corporation, designed to handle a wide range of data management task
s.Se a variável de estado não existir, GET_VARIABLE retornará NULL.
Exemplo: Informar Valores entre Ferramentas Usando SET_VARIABLE e GET_VARIABLE
Este exemplo mostra como uma ferramenta pode armazenar um valor em state_variables usando SET_VARIABLE e uma ferramenta subsequente pode recuperar esse valor usando GET_VARIABLE.
O proprietário da equipe, ADB_USER, cria as funções VERIFY_ACCOUNT_NAME e SUMMARIZE_VERIFIED_ACCOUNT e as ferramentas, os agentes e as tarefas correspondentes. AccountVariableHandoffTeam executa a tarefa de verificação primeiro. A ferramenta de verificação armazena o ID da conta verificada em state_variables, e a ferramenta de resumo recupera o ID salvo para obter e retornar os detalhes da conta.
O ADB_USER2 recebe acesso à equipe compartilhada e a executa usando o nome da equipe qualificada pelo proprietário. Os dados da conta são armazenados na tabela ACCOUNT_HANDOFF_ACCOUNTS do ADB_USER2.
Antes de Começar
Revisar:
- Pré-requisitos para Compartilhar as Equipes Selecionar Estrutura do Agente AI
- Função SET_TEAM
- Função RUN_TEAM
Dica: use SET_TEAM quando a mesma sessão executar uma equipe compartilhada repetidamente com a mesma configuração de runtime. Use RUN_TEAM quando precisar substituir um valor para uma execução específica.
O exemplo completo é o seguinte:
conn ADB_USER/<password>@<connection_name>
CREATE OR REPLACE FUNCTION verify_account_name(
account_name IN CLOB
) RETURN CLOB AUTHID CURRENT_USER IS
l_account_name VARCHAR2(100);
l_account_id VARCHAR2(30);
l_schema_name VARCHAR2(128);
BEGIN
l_account_name := TRIM(DBMS_LOB.SUBSTR(account_name, 100, 1));
l_schema_name := SYS_CONTEXT('USERENV', 'CURRENT_USER');
EXECUTE IMMEDIATE '
SELECT account_id
FROM ' || l_schema_name || '.account_handoff_accounts
WHERE UPPER(account_name) = UPPER(:1)'
INTO l_account_id
USING l_account_name;
DBMS_CLOUD_AI_AGENT.set_variable(
namespace => 'state_variables',
name => 'verified_account_id',
value => l_account_id
);
RETURN 'ACCOUNT_VERIFIED=' || l_account_name ||
';DETAIL_LOOKUP_READY=TRUE';
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_CLOUD_AI_AGENT.set_variable(
namespace => 'state_variables',
name => 'verified_account_id',
value => NULL
);
RETURN 'ACCOUNT_NOT_FOUND=' || NVL(l_account_name, 'NULL');
WHEN OTHERS THEN
RETURN 'TOOL_ERROR: ' ||
REPLACE(REPLACE(SQLERRM, CHR(10), ''), '''', '''''');
END verify_account_name;
/
CREATE OR REPLACE FUNCTION summarize_verified_account(
request_context IN CLOB
) RETURN CLOB AUTHID CURRENT_USER IS
l_account_id_clob CLOB;
l_account_id_text VARCHAR2(4000);
l_user_name VARCHAR2(100);
l_email VARCHAR2(100);
l_billing_address VARCHAR2(200);
l_phone VARCHAR2(20);
l_account_status VARCHAR2(20);
l_schema_name VARCHAR2(128);
BEGIN
l_account_id_clob := DBMS_CLOUD_AI_AGENT.get_variable(
namespace => 'state_variables',
name => 'verified_account_id'
);
l_account_id_text := DBMS_LOB.SUBSTR(l_account_id_clob, 4000, 1);
IF l_account_id_text IS NULL THEN
RETURN 'ACCOUNT_SUMMARY_ERROR=NO_VERIFIED_ACCOUNT_ID';
END IF;
l_schema_name := SYS_CONTEXT('USERENV', 'CURRENT_USER');
EXECUTE IMMEDIATE '
SELECT account_name, email, billing_address, phone, account_status
FROM ' || l_schema_name || '.account_handoff_accounts
WHERE account_id = :1'
INTO l_user_name, l_email, l_billing_address, l_phone, l_account_status
USING l_account_id_text;
RETURN 'ACCOUNT_SUMMARY_NAME=' || l_user_name ||
';EMAIL=' || NVL(l_email, 'Not set') ||
';BILLING_ADDRESS=' || NVL(l_billing_address, 'Not set') ||
';PHONE=' || NVL(l_phone, 'Not set') ||
';ACCOUNT_STATUS=' || NVL(l_account_status, 'Unknown');
EXCEPTION
WHEN OTHERS THEN
RETURN 'TOOL_ERROR: ' ||
REPLACE(REPLACE(SQLERRM, CHR(10), ''), '''', '''''');
END summarize_verified_account;
/
grant execute on verify_account_name to ADB_USER2;
grant execute on summarize_verified_account to ADB_USER2;
BEGIN
DBMS_CLOUD_AI_AGENT.create_tool(
tool_name => 'AccountVerificationTool',
attributes => '{
"instruction": "Verify that the account name exists.",
"function": "ADB_USER.VERIFY_ACCOUNT_NAME",
"tool_inputs": [
{
"name": "account_name",
"description": "Account user name to verify",
"mandatory": "true"
}
]
}'
);
END;
/
BEGIN
DBMS_CLOUD_AI_AGENT.create_tool(
tool_name => 'AccountSummaryTool',
attributes => '{
"instruction": "Summarize the matching account details.",
"function": "ADB_USER.SUMMARIZE_VERIFIED_ACCOUNT",
"tool_inputs": [
{
"name": "request_context",
"description": "User request context",
"mandatory": "true"
}
]
}'
);
END;
/
BEGIN
DBMS_CLOUD_AI_AGENT.create_agent(
agent_name => 'AccountVerificationAgent',
attributes => '{
"profile_name": "{llm_profile}",
"role": "You verify account names. Always call AccountVerificationTool first and return its exact output.",
"enable_human_tool": "false"
}'
);
END;
/
BEGIN
DBMS_CLOUD_AI_AGENT.create_agent(
agent_name => 'AccountSummaryAgent',
attributes => '{
"profile_name": "{llm_profile}",
"role": "You summarize the verified account. Always call AccountSummaryTool and return its exact output.",
"enable_human_tool": "false"
}'
);
END;
/
BEGIN
DBMS_CLOUD_AI_AGENT.create_task(
task_name => 'AccountVerificationTask',
attributes => '{
"instruction": "Call AccountVerificationTool with the exact account name from the user request. The tool saves the account id in state_variables, but the response must not include the id.",
"tools": ["AccountVerificationTool"]
}'
);
END;
/
BEGIN
DBMS_CLOUD_AI_AGENT.create_task(
task_name => 'AccountSummaryTask',
attributes => '{
"instruction": "Call AccountSummaryTool to read the saved account id and summarize the account details. Return the exact tool output.",
"tools": ["AccountSummaryTool"]
}'
);
END;
/
BEGIN
DBMS_CLOUD_AI_AGENT.create_team(
team_name => 'AccountVariableHandoffTeam',
attributes => '{
"agents": [
{"name":"AccountVerificationAgent","task":"AccountVerificationTask"},
{"name":"AccountSummaryAgent","task":"AccountSummaryTask"}
],
"process": "sequential"
}'
);
END;
/
exec DBMS_CLOUD_AI_AGENT.grant_team_access('AccountVariableHandoffTeam', 'ADB_USER2');
conn ADB_USER2/<password>@<connection_name>;
set serveroutput on;
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE account_handoff_accounts PURGE';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
RAISE;
END IF;
END;
/
CREATE TABLE account_handoff_accounts (
account_id VARCHAR2(30) PRIMARY KEY,
account_name VARCHAR2(100) NOT NULL UNIQUE,
email VARCHAR2(100),
billing_address VARCHAR2(200),
phone VARCHAR2(20),
account_status VARCHAR2(20)
);
INSERT INTO account_handoff_accounts (
account_id, account_name, email, billing_address, phone, account_status)
VALUES (
'ACCT_MARY_0002',
'mary_jones',
'mary.jones@example.com',
'456 Oak Ave, Austin, TX 78701',
'512-555-0200',
'ACTIVE');
COMMIT;
DECLARE
l_final_answer CLOB;
l_conversation_id VARCHAR2(128);
BEGIN
l_conversation_id := DBMS_CLOUD_AI.create_conversation();
l_final_answer := DBMS_CLOUD_AI_AGENT.run_team(
team_name => 'ADB_USER.AccountVariableHandoffTeam',
user_prompt => 'Verify account mary_jones. Then summarize the verified account details using the saved account id.',
params => '{"attribute_variables": {"llm_profile":"GROK_ADB_USER2"},"conversation_id":"' || l_conversation_id || '"}'
);
dbms_output.put_line(l_final_answer);
END;
/Se um valor for fornecido nos parâmetros SET_TEAM e RUN_TEAM, o valor informado para RUN_TEAM terá precedência para essa execução.
Exemplo: Revogar Acesso a uma Equipe Compartilhada
Revogue o acesso quando um usuário ou atribuição do banco de dados não deve mais executar uma equipe compartilhada. O esquema do proprietário possui e gerencia a definição da equipe que permanece pertencente e gerenciada pelo esquema do proprietário.
Antes de Começar
Revisar:
- Pré-requisitos para Compartilhar as Equipes Selecionar Estrutura do Agente AI
- Procedimento REVOKE_TEAM_ACCESS
O exemplo completo é o seguinte:
BEGIN
DBMS_CLOUD_AI_AGENT.REVOKE_TEAM_ACCESS(
team_name => 'SHARED_ACCOUNT_TEAM',
user_or_role_name => 'ADB_USER2');
END;
/