Torna a regiao do Generative AI configuravel (GENAI_REGION)

Region estava fixa em us-chicago-1 em varios pontos (ACL, testes 5.1/5.2/5.3,
FNC_26ai_rag, fnc_26ai_tech_rag, fnc_26ai_embed, PRC_26AI_TECH). Tenancies com
escopo regional restrito (ex. America Latina) podem nao alcancar essa regiao,
mesmo com credencial/ACL/compartimento corretos - o sintoma e ORA-20404
"Object not found" com uma URL bem formada.

Novo parametro GENAI_REGION em TB_26AI_TECH_PARAMS (default us-chicago-1,
editavel) substitui o valor fixo em todos os pontos de chamada. Seção 1.6
(ACL) continua com host fixo por rodar antes da tabela de config existir,
mas o comentario agora aponta para o parametro. docs/09 ganhou uma entrada
de checklist nova: ORA-20404 com URL correta pode ser modelo aposentado
para uso on-demand na regiao (verificavel via
`oci generative-ai model-collection list-models`), nao so credencial/ACL.

Seções 6 e 7 de docs/04-passo-a-passo-banco.html tambem foram
resincronizadas com o sql/01_ampminsights_db_setup.sql atual (estavam
desatualizadas desde a adição do TB_26AI_TECH_LOG).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-24 15:20:32 -03:00
parent 56c11d0715
commit 1e9af90582
4 changed files with 272 additions and 56 deletions

View File

@@ -112,9 +112,15 @@ GRANT CREATE CREDENTIAL TO AMPMINSIGHTS;
GRANT CREATE JOB TO AMPMINSIGHTS;
-- 1.6) Regras de rede (ACL) para o schema poder chamar o endpoint do OCI
-- Generative AI usado neste script (regiao us-chicago-1). Se voce for
-- usar outra regiao de Generative AI, ajuste o host abaixo (e repita
-- este bloco para cada host adicional que for necessario).
-- Generative AI usado neste script (regiao us-chicago-1 por padrao - o
-- mesmo valor que vai para o parametro GENAI_REGION da SECAO 2, que
-- ainda nao existe neste ponto do script, por isso o host aqui e
-- digitado direto). Nem toda tenancy alcanca us-chicago-1 (ex.: algumas
-- tenancies com escopo regional restrito, como America Latina, podem
-- so alcancar sa-saopaulo-1) - se for o seu caso, troque o host abaixo
-- pela regiao que a sua tenancy alcanca, E use o mesmo valor no
-- parametro GENAI_REGION da SECAO 2 (repita este bloco para cada host
-- adicional que for necessario).
BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host =&gt; &#x27;inference.generativeai.us-chicago-1.oci.oraclecloud.com&#x27;,
@@ -217,6 +223,14 @@ INSERT INTO TB_26AI_TECH_PARAMS (PARAM_NAME, PARAM_VALUE, DESCRIPTION) VALUES
(&#x27;OS_BUCKET&#x27;, &#x27;&lt;SUBSTITUA_PELO_NOME_DO_BUCKET_QUE_VOCE_VAI_CRIAR&gt;&#x27;,
&#x27;Nome do bucket de Object Storage onde o modelo ONNX sera armazenado (ver SECAO 4).&#x27;);
INSERT INTO TB_26AI_TECH_PARAMS (PARAM_NAME, PARAM_VALUE, DESCRIPTION) VALUES
(&#x27;AI_LOG_RETENTION_DAYS&#x27;, &#x27;90&#x27;,
&#x27;Dias de retencao do log de chamadas de IA/embeddings (TB_26AI_TECH_LOG) - ver docs/09-operacao-observabilidade.html para a query de purga.&#x27;);
INSERT INTO TB_26AI_TECH_PARAMS (PARAM_NAME, PARAM_VALUE, DESCRIPTION) VALUES
(&#x27;GENAI_REGION&#x27;, &#x27;us-chicago-1&#x27;,
&#x27;Regiao do OCI Generative AI usada pelo RAG/insights/embeddings (SECAO 5+). Pode ser diferente da OCI_REGION (que e a regiao &quot;de casa&quot; do seu tenancy/bucket) - o Generative AI so roda em regioes especificas. Se a sua tenancy nao alcancar us-chicago-1 (comum em tenancies com escopo regional restrito, ex. America Latina), troque para uma regiao que a sua tenancy alcance (ex. sa-saopaulo-1) E repita a ACL da SECAO 1.6 para o novo host - confirme antes com &quot;oci generative-ai model-collection list-models&quot; ou o Console OCI que o modelo usado (meta.llama-4-maverick-17b-128e-instruct-fp8) ainda esta ativo para uso on-demand na regiao escolhida, ja que a disponibilidade de modelos varia por regiao e muda com o tempo.&#x27;);
COMMIT;
-- Confira: nenhuma linha abaixo deve ainda mostrar um valor &quot;&lt;SUBSTITUA...&gt;&quot;
@@ -532,14 +546,15 @@ criação de um profile de SELECT AI (que já lê região e compartimento da tab
<pre><code class="lang-sql">-- Rode os 3 blocos abaixo para confirmar que a credencial e a rede estao OK
-- antes de seguir para as tabelas e o PL/SQL da aplicacao.
-- 5.1) Teste de embedding (Cohere, via OCI Generative AI)
-- 5.1) Teste de embedding (Cohere, via OCI Generative AI). A URL usa a
-- regiao configurada em GENAI_REGION (SECAO 2), nao um valor fixo.
SELECT VECTOR_SERIALIZE(
DBMS_VECTOR_CHAIN.UTL_TO_EMBEDDING(
TO_CLOB(&#x27;Teste simples para gerar um embedding.&#x27;),
JSON(&#x27;{
&quot;provider&quot;: &quot;ocigenai&quot;,
&quot;credential_name&quot;: &quot;OCI_CRED&quot;,
&quot;url&quot;: &quot;https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/embedText&quot;,
&quot;url&quot;: &quot;https://inference.generativeai.&#x27; || (SELECT param_value FROM TB_26AI_TECH_PARAMS WHERE param_name = &#x27;GENAI_REGION&#x27;) || &#x27;.oci.oraclecloud.com/20231130/actions/embedText&quot;,
&quot;model&quot;: &quot;cohere.embed-v4.0&quot;
}&#x27;)
)
@@ -547,13 +562,14 @@ SELECT VECTOR_SERIALIZE(
) AS embedding
FROM dual;
-- 5.2) Teste de geracao de texto (Llama 4, via OCI Generative AI)
-- 5.2) Teste de geracao de texto (Llama 4, via OCI Generative AI). Mesma
-- logica: a URL usa a regiao configurada em GENAI_REGION (SECAO 2).
SELECT DBMS_VECTOR_CHAIN.UTL_TO_GENERATE_TEXT(
TO_CLOB(&#x27;Responda somente com a palavra: sucesso&#x27;),
JSON(&#x27;{
&quot;provider&quot;: &quot;ocigenai&quot;,
&quot;credential_name&quot;: &quot;OCI_CRED&quot;,
&quot;url&quot;: &quot;https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/chat&quot;,
&quot;url&quot;: &quot;https://inference.generativeai.&#x27; || (SELECT param_value FROM TB_26AI_TECH_PARAMS WHERE param_name = &#x27;GENAI_REGION&#x27;) || &#x27;.oci.oraclecloud.com/20231130/actions/chat&quot;,
&quot;model&quot;: &quot;meta.llama-4-maverick-17b-128e-instruct-fp8&quot;,
&quot;chatRequest&quot;: {
&quot;temperature&quot;: 0.1,
@@ -565,27 +581,28 @@ SELECT DBMS_VECTOR_CHAIN.UTL_TO_GENERATE_TEXT(
FROM dual;
-- 5.3) Teste de SELECT AI (perguntas em linguagem natural sobre as views/
-- tabelas do schema). O bloco abaixo le EMBEDDING_COMPARTMENT da tabela
-- de configuracao (SECAO 2). As tabelas/view referenciadas abaixo sao
-- criadas na SECAO 6 - rode este bloco depois de criar V_26AI_TECH e
-- TB_26AI_TECH_CMDB.
-- tabelas do schema). O bloco abaixo le EMBEDDING_COMPARTMENT e
-- GENAI_REGION da tabela de configuracao (SECAO 2). As tabelas/view
-- referenciadas abaixo sao criadas na SECAO 6 - rode este bloco depois
-- de criar V_26AI_TECH e TB_26AI_TECH_CMDB.
--
-- A regiao do OCI Generative AI abaixo (us-chicago-1) e fixa de
-- proposito, igual nos testes 5.1/5.2 e na ACL da SECAO 1.6 - nao
-- precisa (nem deve) ser trocada pelo valor de OCI_REGION da tabela de
-- configuracao, ja que o servico so esta disponivel em algumas regioes
-- especificas da OCI.
-- A regiao do OCI Generative AI abaixo vem do parametro GENAI_REGION -
-- nao precisa (nem deve) ser trocada pelo valor de OCI_REGION da tabela
-- de configuracao (sao coisas diferentes de proposito), ja que o
-- servico so esta disponivel em algumas regioes especificas da OCI.
DECLARE
v_compartment TB_26AI_TECH_PARAMS.PARAM_VALUE%TYPE;
v_compartment TB_26AI_TECH_PARAMS.PARAM_VALUE%TYPE;
v_genai_region TB_26AI_TECH_PARAMS.PARAM_VALUE%TYPE;
BEGIN
SELECT param_value INTO v_compartment FROM TB_26AI_TECH_PARAMS WHERE param_name = &#x27;EMBEDDING_COMPARTMENT&#x27;;
SELECT param_value INTO v_compartment FROM TB_26AI_TECH_PARAMS WHERE param_name = &#x27;EMBEDDING_COMPARTMENT&#x27;;
SELECT param_value INTO v_genai_region FROM TB_26AI_TECH_PARAMS WHERE param_name = &#x27;GENAI_REGION&#x27;;
DBMS_CLOUD_AI.CREATE_PROFILE(
profile_name =&gt; &#x27;OCI_CRED2&#x27;,
attributes =&gt; &#x27;{
&quot;provider&quot;: &quot;oci&quot;,
&quot;credential_name&quot;: &quot;OCI_CRED&quot;,
&quot;region&quot;: &quot;us-chicago-1&quot;,
&quot;region&quot;: &quot;&#x27; || v_genai_region || &#x27;&quot;,
&quot;model&quot;: &quot;meta.llama-4-maverick-17b-128e-instruct-fp8&quot;,
&quot;temperature&quot;: 0,
&quot;comments&quot;: true,
@@ -835,19 +852,89 @@ LEFT OUTER JOIN
GROUP BY nome
HAVING count(1) = 1 )
) c
ON ( upper(v.ASSET_NAME) = upper(c.nome) AND c.AMBIENTE IS NOT NULL );</code></pre>
ON ( upper(v.ASSET_NAME) = upper(c.nome) AND c.AMBIENTE IS NOT NULL );
-- Log de chamadas de IA/embeddings (sucesso e erro) - nao guarda prompt/
-- resposta completos, so metadados de uso. Ver docs/09-operacao-observabilidade.html.
CREATE TABLE &quot;TB_26AI_TECH_LOG&quot;
( &quot;LOG_ID&quot; NUMBER GENERATED ALWAYS AS IDENTITY MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE NOKEEP NOSCALE NOT NULL ENABLE,
&quot;LOG_TS&quot; TIMESTAMP(6) WITH TIME ZONE DEFAULT SYSTIMESTAMP NOT NULL ENABLE,
&quot;CALLING_OBJECT&quot; VARCHAR2(128),
&quot;OPERATION&quot; VARCHAR2(30),
&quot;SOURCE_TYPE&quot; VARCHAR2(10),
&quot;SOURCE_ID&quot; VARCHAR2(200),
&quot;PROVIDER&quot; VARCHAR2(30),
&quot;MODEL_NAME&quot; VARCHAR2(100),
&quot;APP_USER&quot; VARCHAR2(100),
&quot;STATUS&quot; VARCHAR2(10),
&quot;ERROR_CODE&quot; NUMBER,
&quot;ERROR_MESSAGE&quot; VARCHAR2(4000),
&quot;DURATION_MS&quot; NUMBER,
&quot;PROMPT_CHARS&quot; NUMBER,
&quot;RESPONSE_CHARS&quot; NUMBER,
CONSTRAINT &quot;TB_26AI_TECH_LOG_PK&quot; PRIMARY KEY (&quot;LOG_ID&quot;) USING INDEX ENABLE
);
CREATE INDEX &quot;TB_26AI_TECH_LOG_TS_IX&quot; ON &quot;TB_26AI_TECH_LOG&quot; (&quot;LOG_TS&quot;);
CREATE INDEX &quot;TB_26AI_TECH_LOG_ST_IX&quot; ON &quot;TB_26AI_TECH_LOG&quot; (&quot;STATUS&quot;,&quot;LOG_TS&quot;);
COMMENT ON TABLE &quot;TB_26AI_TECH_LOG&quot; IS &#x27;Log de cada chamada a Generative AI/embeddings feita pelo ampmInsights (sucesso ou erro) - nao guarda prompt/resposta completos, so metadados de uso (modelo, duracao, tamanho, status, erro). Usada para troubleshooting e monitoramento de consumo - ver docs/09-operacao-observabilidade.html.&#x27;;</code></pre>
</div>
<h2>Seção 7 &middot; PL/SQL de geracao de embeddings, RAG e insights (ampmInsights)</h2>
<p>Cria as funções e a procedure descritas em <a href="02-arquitetura.html">Arquitetura</a>:
<code>fnc_26ai_embed</code>, <code>fnc_26ai_tech_rag</code>, <code>FNC_26AI_TECH_MCP_V1</code>,
<code>FNC_26ai_rag</code> e <code>prc_26ai_tech</code>. É um bloco longo (a maior parte é o texto dos
prompts de IA) — copie e cole inteiro de uma vez.</p>
<p>Cria <code>PRC_26AI_TECH_LOG</code> (log de cada chamada de IA/embedding — ver
<a href="09-operacao-observabilidade.html">Operação &amp; observabilidade</a>) e as funções e a
procedure descritas em <a href="02-arquitetura.html">Arquitetura</a>: <code>fnc_26ai_embed</code>,
<code>fnc_26ai_tech_rag</code>, <code>FNC_26AI_TECH_MCP_V1</code>, <code>FNC_26ai_rag</code> e
<code>prc_26ai_tech</code>. É um bloco longo (a maior parte é o texto dos prompts de IA) — copie e
cole inteiro de uma vez.</p>
<div class="code-block">
<div class="code-bar">
<span class="code-label">Seção 7 — copiar e colar</span>
<button class="copy-btn" type="button">Copiar</button>
</div>
<pre><code class="lang-sql">CREATE OR REPLACE FUNCTION fnc_26ai_embed( p_string IN VARCHAR2,
<pre><code class="lang-sql">CREATE OR REPLACE PROCEDURE PRC_26AI_TECH_LOG (
p_calling_object IN VARCHAR2,
p_operation IN VARCHAR2,
p_status IN VARCHAR2,
p_source_type IN VARCHAR2 DEFAULT NULL,
p_source_id IN VARCHAR2 DEFAULT NULL,
p_provider IN VARCHAR2 DEFAULT NULL,
p_model_name IN VARCHAR2 DEFAULT NULL,
p_error_code IN NUMBER DEFAULT NULL,
p_error_message IN VARCHAR2 DEFAULT NULL,
p_duration_ms IN NUMBER DEFAULT NULL,
p_prompt_chars IN NUMBER DEFAULT NULL,
p_response_chars IN NUMBER DEFAULT NULL
) AS
PRAGMA AUTONOMOUS_TRANSACTION;
/*
Projeto: ampmInsights
Objetivo: registrar em TB_26AI_TECH_LOG cada chamada a Generative AI/
embeddings (sucesso ou erro), para troubleshooting e
monitoramento de consumo (ver docs/09-operacao-observabilidade.html).
Autonomous transaction: pode ser chamada de dentro de functions invocadas
em contexto SQL sem interferir na transacao do chamador; nunca propaga erro
(uma falha ao logar nao pode derrubar a chamada real de IA).
*/
BEGIN
INSERT INTO TB_26AI_TECH_LOG (
calling_object, operation, source_type, source_id, provider, model_name,
app_user, status, error_code, error_message, duration_ms, prompt_chars,
response_chars
) VALUES (
p_calling_object, p_operation, p_source_type, p_source_id, p_provider,
p_model_name, NVL(V(&#x27;APP_USER&#x27;), SYS_CONTEXT(&#x27;USERENV&#x27;,&#x27;SESSION_USER&#x27;)),
p_status, p_error_code, SUBSTR(p_error_message, 1, 4000), p_duration_ms,
p_prompt_chars, p_response_chars
);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
NULL; -- logging nunca pode quebrar a chamada real
END;
/
CREATE OR REPLACE FUNCTION fnc_26ai_embed( p_string IN VARCHAR2,
p_emb_type IN VARCHAR2 DEFAULT &#x27;COHERE&#x27;,
p_credential IN VARCHAR2 DEFAULT &#x27;OCI_CRED&#x27;)
RETURN CLOB
@@ -891,7 +978,7 @@ BEGIN
dbms_vector_chain.utl_to_text( v_string ),
json(&#x27;{ &quot;provider&quot;: &quot;ocigenai&quot;,
&quot;credential_name&quot;: &quot;&#x27; || p_credential || &#x27;&quot;,
&quot;url&quot;: &quot;https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/embedText&quot;,
&quot;url&quot;: &quot;https://inference.generativeai.&#x27; || (SELECT param_value FROM TB_26AI_TECH_PARAMS WHERE param_name = &#x27;GENAI_REGION&#x27;) || &#x27;.oci.oraclecloud.com/20231130/actions/embedText&quot;,
&quot;model&quot;: &quot;cohere.embed-v4.0&quot;
}&#x27;)
)
@@ -929,12 +1016,34 @@ BEGIN
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(&#x27;Erro: &#x27; || SQLCODE || &#x27; - &#x27; || SQLERRM);
PRC_26AI_TECH_LOG(
p_calling_object =&gt; &#x27;FNC_26AI_EMBED&#x27;,
p_operation =&gt; &#x27;EMBEDDING&#x27;,
p_status =&gt; &#x27;ERROR&#x27;,
p_provider =&gt; &#x27;vLLM&#x27;,
p_error_code =&gt; SQLCODE,
p_error_message =&gt; SQLERRM
);
END;
END IF;
RETURN v_embedding;
EXCEPTION
WHEN OTHERS THEN
-- Cobre os ramos ONNX/COHERE (o vLLM ja trata e loga o proprio erro
-- acima e nao propaga). Loga e repropaga sem mudar o comportamento
-- existente.
PRC_26AI_TECH_LOG(
p_calling_object =&gt; &#x27;FNC_26AI_EMBED&#x27;,
p_operation =&gt; &#x27;EMBEDDING&#x27;,
p_status =&gt; &#x27;ERROR&#x27;,
p_provider =&gt; p_emb_type,
p_error_code =&gt; SQLCODE,
p_error_message =&gt; SQLERRM
);
RAISE;
END;
/
@@ -959,9 +1068,12 @@ RETURN CLOB IS
output CLOB;
query_vec VECTOR;
v_llm VARCHAR2(20) := &#x27;LLAMA4&#x27;; -- [ LLAMA4 | OPENAI ]
v_genai_region TB_26AI_TECH_PARAMS.PARAM_VALUE%TYPE;
BEGIN
SELECT param_value INTO v_genai_region FROM TB_26AI_TECH_PARAMS WHERE param_name = &#x27;GENAI_REGION&#x27;;
-- embedding da pergunta do usuario
query_vec := to_vector( fnc_26ai_embed ( p_string =&gt; p_query, p_emb_type =&gt; &#x27;COHERE&#x27; ) ) ;
@@ -987,7 +1099,7 @@ BEGIN
params_genai := &#x27;{
&quot;provider&quot; : &quot;ocigenai&quot;,
&quot;credential_name&quot; : &quot;&#x27; || p_credential || &#x27;&quot;,
&quot;url&quot; : &quot;https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/chat&quot;,
&quot;url&quot; : &quot;https://inference.generativeai.&#x27; || v_genai_region || &#x27;.oci.oraclecloud.com/20231130/actions/chat&quot;,
&quot;model&quot;: &quot;meta.llama-4-maverick-17b-128e-instruct-fp8&quot;}&#x27;;
ELSIF v_llm = &#x27;OPENAI&#x27; THEN
@@ -1055,6 +1167,20 @@ Formato obrigatorio de saida:
RETURN output;
EXCEPTION
WHEN OTHERS THEN
-- Nao havia handler antes; loga e repropaga (comportamento de
-- propagar o erro ao chamador continua o mesmo).
PRC_26AI_TECH_LOG(
p_calling_object =&gt; &#x27;FNC_26AI_TECH_RAG&#x27;,
p_operation =&gt; &#x27;RAG&#x27;,
p_status =&gt; &#x27;ERROR&#x27;,
p_source_type =&gt; p_source_type,
p_provider =&gt; &#x27;ocigenai&#x27;,
p_error_code =&gt; SQLCODE,
p_error_message =&gt; SQLERRM
);
RAISE;
END;
/
@@ -1087,10 +1213,16 @@ RETURN CLOB AS
Objetivo: funcao global de chamada ao LLM (Llama 4, via OCI Generative AI)
usada pelo RAG e pela geracao de insights.
*/
v_gen_ai_endpoint VARCHAR2(500) := &#x27;https://inference.generativeai.us-chicago-1.oci.oraclecloud.com&#x27;;
v_gen_ai_endpoint VARCHAR2(500);
v_gen_ai_model VARCHAR2(500) := &#x27;meta.llama-4-maverick-17b-128e-instruct-fp8&#x27;;
resp DBMS_CLOUD_TYPES.RESP;
v_t0 PLS_INTEGER := DBMS_UTILITY.GET_TIME;
v_result CLOB;
BEGIN
SELECT &#x27;https://inference.generativeai.&#x27; || param_value || &#x27;.oci.oraclecloud.com&#x27;
INTO v_gen_ai_endpoint
FROM TB_26AI_TECH_PARAMS WHERE param_name = &#x27;GENAI_REGION&#x27;;
resp := dbms_cloud.send_request(
credential_name =&gt; p_oci_cred,
uri =&gt; v_gen_ai_endpoint || &#x27;/20231130/actions/chat&#x27;,
@@ -1119,10 +1251,34 @@ BEGIN
))
))
);
RETURN json_value( dbms_cloud.get_response_text(resp) , &#x27;$.chatResponse.choices[0].message.content[0].text&#x27;) ;
v_result := json_value( dbms_cloud.get_response_text(resp) , &#x27;$.chatResponse.choices[0].message.content[0].text&#x27;) ;
PRC_26AI_TECH_LOG(
p_calling_object =&gt; &#x27;FNC_26AI_RAG&#x27;,
p_operation =&gt; &#x27;CHAT&#x27;,
p_status =&gt; &#x27;OK&#x27;,
p_provider =&gt; &#x27;ocigenai&#x27;,
p_model_name =&gt; v_gen_ai_model,
p_duration_ms =&gt; (DBMS_UTILITY.GET_TIME - v_t0) * 10,
p_prompt_chars =&gt; LENGTH(p_ai_prompt),
p_response_chars =&gt; LENGTH(v_result)
);
RETURN v_result;
EXCEPTION
WHEN OTHERS THEN
PRC_26AI_TECH_LOG(
p_calling_object =&gt; &#x27;FNC_26AI_RAG&#x27;,
p_operation =&gt; &#x27;CHAT&#x27;,
p_status =&gt; &#x27;ERROR&#x27;,
p_provider =&gt; &#x27;ocigenai&#x27;,
p_model_name =&gt; v_gen_ai_model,
p_error_code =&gt; SQLCODE,
p_error_message =&gt; SQLERRM,
p_duration_ms =&gt; (DBMS_UTILITY.GET_TIME - v_t0) * 10,
p_prompt_chars =&gt; LENGTH(p_ai_prompt)
);
RETURN &#x27;Nao foi possivel gerar um texto com base nas informacoes.&#x27;;
END;
/
@@ -1167,8 +1323,11 @@ AS
v_response CLOB;
v_json CLOB;
v_error CLOB;
v_genai_region TB_26AI_TECH_PARAMS.PARAM_VALUE%TYPE;
BEGIN
SELECT param_value INTO v_genai_region FROM TB_26AI_TECH_PARAMS WHERE param_name = &#x27;GENAI_REGION&#x27;;
IF p_source_type = &#x27;VUL&#x27; THEN -- vulnerabilidades
v_pre_prompt :=&#x27;Voce e um analista senior de dados e operacoes.
@@ -1565,7 +1724,7 @@ Retorne um JSON valido (sem comentarios), espelhando o relatorio:
( v_response ) ,
json(&#x27;{ &quot;provider&quot;: &quot;ocigenai&quot;,
&quot;credential_name&quot;: &quot;&#x27; || p_oci_cred || &#x27;&quot;,
&quot;url&quot;: &quot;https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/embedText&quot;,
&quot;url&quot;: &quot;https://inference.generativeai.&#x27; || v_genai_region || &#x27;.oci.oraclecloud.com/20231130/actions/embedText&quot;,
&quot;model&quot;: &quot;cohere.embed-v4.0&quot;
}&#x27;)
)
@@ -1579,21 +1738,52 @@ Retorne um JSON valido (sem comentarios), espelhando o relatorio:
)
) AS et;
PRC_26AI_TECH_LOG(
p_calling_object =&gt; &#x27;PRC_26AI_TECH&#x27;,
p_operation =&gt; &#x27;EMBEDDING&#x27;,
p_status =&gt; &#x27;OK&#x27;,
p_source_type =&gt; p_source_type,
p_source_id =&gt; p_rowid,
p_provider =&gt; &#x27;ocigenai&#x27;,
p_model_name =&gt; &#x27;cohere.embed-v4.0&#x27;,
p_prompt_chars =&gt; LENGTH(v_response)
);
END IF;
PRC_26AI_TECH_LOG(
p_calling_object =&gt; &#x27;PRC_26AI_TECH&#x27;,
p_operation =&gt; &#x27;INSIGHT_PIPELINE&#x27;,
p_status =&gt; &#x27;OK&#x27;,
p_source_type =&gt; p_source_type,
p_source_id =&gt; p_rowid
);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
v_error := sqlerrm;
PRC_26AI_TECH_LOG(
p_calling_object =&gt; &#x27;PRC_26AI_TECH&#x27;,
p_operation =&gt; &#x27;INSIGHT_PIPELINE&#x27;,
p_status =&gt; &#x27;ERROR&#x27;,
p_source_type =&gt; p_source_type,
p_source_id =&gt; p_rowid,
p_error_code =&gt; SQLCODE,
p_error_message =&gt; v_error
);
-- Antes, o erro tecnico (sqlerrm) era gravado direto em insight_report e
-- ficava visivel pro usuario de negocio no modal. Agora o erro completo
-- vai so pro log (TB_26AI_TECH_LOG); o usuario ve uma mensagem amigavel.
IF p_source_type = &#x27;VUL&#x27; THEN
UPDATE TB_26AI_TECH_v2
SET insight_report = v_error,
SET insight_report = &#x27;Nao foi possivel gerar o insight para este registro no momento.&#x27;,
insight_json = null
WHERE rowid = p_rowid;
ELSIF p_source_type = &#x27;SYS&#x27; THEN
UPDATE TB_26AI_TECH_SYS
SET insight_report = v_error,
SET insight_report = &#x27;Nao foi possivel gerar o insight para este registro no momento.&#x27;,
insight_json = null
WHERE rowid = p_rowid;
END IF;