Upload files to "/"
This commit is contained in:
56
fnc_26ai_rag_vllm.sql
Normal file
56
fnc_26ai_rag_vllm.sql
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
create or replace FUNCTION "FNC_26AI_RAG_VLLM" (p_ai_prompt IN clob)
|
||||||
|
RETURN CLOB AS
|
||||||
|
v_gen_ai_model varchar2(500) :='openai/gpt-oss-120b';
|
||||||
|
resp dbms_cloud_types.RESP;
|
||||||
|
BEGIN
|
||||||
|
/*
|
||||||
|
|
||||||
|
Criado por: fernando.leal@oracle.com
|
||||||
|
Data: Mar/2026
|
||||||
|
Objetivo: RAG via PL/SQL usando um vLLM em arquitetura LOCAL
|
||||||
|
|
||||||
|
v1 - funcao de RAG usando openai/gpt-oss-120b - fleal
|
||||||
|
|
||||||
|
Set host to local to disable credential
|
||||||
|
The provider value must specify openai
|
||||||
|
https://docs.oracle.com/en/database/oracle/oracle-database/26/vecse/utl_to_embedding-and-utl_to_embeddings-dbms_vector_chain.html
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
resp := dbms_cloud.send_request(
|
||||||
|
credential_name => NULL,
|
||||||
|
uri => 'https://hub-gpus.DOMINIO.com.br/gpt120/v1/chat/completions',
|
||||||
|
method => DBMS_CLOUD.METHOD_POST,
|
||||||
|
headers => JSON_OBJECT('Content-Type' VALUE 'application/json'),
|
||||||
|
body => UTL_RAW.CAST_TO_RAW('{"model": "' || v_gen_ai_model || '",
|
||||||
|
"messages": [{"role": "user",
|
||||||
|
"content": "' || p_ai_prompt || '"
|
||||||
|
}]}')
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
--RETURN json_value( dbms_cloud.get_response_text(resp) , '$.chatResponse.choices[0].message.content[0].text') ;
|
||||||
|
--
|
||||||
|
RETURN DBMS_CLOUD.GET_RESPONSE_TEXT(resp) ;
|
||||||
|
|
||||||
|
/* opcao 2:
|
||||||
|
declare
|
||||||
|
params clob;
|
||||||
|
input clob;
|
||||||
|
response clob;
|
||||||
|
begin
|
||||||
|
input := '[{"role": "user","content": "Fale sobre a Oracle"}]';
|
||||||
|
params := '{
|
||||||
|
"provider": "openai",
|
||||||
|
"url": "https://hub-gpus.DOMINIO.com.br/gpt120/v1/chat/completions",
|
||||||
|
"host": "local",
|
||||||
|
"model": "openai/gpt-oss-120b"}';
|
||||||
|
response := dbms_vector_chain.utl_to_generate_text( input , json(params)) ;
|
||||||
|
DBMS_OUTPUT.PUT_LINE(response);
|
||||||
|
end; */
|
||||||
|
|
||||||
|
EXCEPTION
|
||||||
|
WHEN OTHERS THEN
|
||||||
|
RETURN sqlerrm;
|
||||||
|
END;
|
||||||
|
/
|
||||||
138
fnc_26ai_siderurgia.sql
Normal file
138
fnc_26ai_siderurgia.sql
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
create or replace function fnc_26ai_siderurgia( p_image_id in number,
|
||||||
|
p_comp_id in varchar2,
|
||||||
|
p_credential in varchar2 default 'OCI_CRED')
|
||||||
|
return clob
|
||||||
|
as
|
||||||
|
/*
|
||||||
|
|
||||||
|
Criado por: fernando.leal@oracle.com
|
||||||
|
Data: Mar/2026
|
||||||
|
Objetivo: demonstrar casos de uso do Oracle AI Database 26ai
|
||||||
|
|
||||||
|
v1 - PDFs e vetorizacao para casos de Siderurgia
|
||||||
|
|
||||||
|
*/
|
||||||
|
messages CLOB;
|
||||||
|
v_vector clob;
|
||||||
|
p_prompt clob;
|
||||||
|
p_prompt2 clob;
|
||||||
|
reranked_output json;
|
||||||
|
params_genai CLOB;
|
||||||
|
output CLOB;
|
||||||
|
begin
|
||||||
|
|
||||||
|
SELECT json_value( fnc_26ai_embed_image_cohere(file_name, file_blob, p_credential, p_comp_id) , '$.embeddings[*].vector()')
|
||||||
|
INTO v_vector
|
||||||
|
from TB_26AI_SIDERURGIA
|
||||||
|
where id = p_image_id;
|
||||||
|
|
||||||
|
for message_cursor in (
|
||||||
|
|
||||||
|
SELECT embed_data, doc_origem
|
||||||
|
FROM TB_26AI_SIDERURGIA_VECTOR
|
||||||
|
ORDER BY VECTOR_DISTANCE(EMBED_VECTOR, v_vector , COSINE )
|
||||||
|
FETCH EXACT FIRST 40 ROWS ONLY
|
||||||
|
|
||||||
|
) loop
|
||||||
|
|
||||||
|
messages := messages || '"' || replace(replace(replace(replace(message_cursor.embed_data || '- Fonte:' || message_cursor.doc_origem ,chr(10),null),chr(13),null),'"',''),'''','') || '",' ;
|
||||||
|
|
||||||
|
END LOOP;
|
||||||
|
|
||||||
|
p_prompt := 'Você é um engenheiro especialista em siderurgia e metalurgia com vasta experiência em controle de qualidade de produtos siderúrgicos.
|
||||||
|
Sua tarefa é analisar imagens de produtos e processos de uma indústria siderúrgica e gerar um relatório técnico estruturado.
|
||||||
|
## CONTEXTO
|
||||||
|
As imagens podem conter: bobinas de aço, chapas, tiras, canos, tubos, perfis estruturais, tarugos, placas, fio-máquina, galvanizados, revestidos ou qualquer
|
||||||
|
outro produto ou etapa do processo siderúrgico.
|
||||||
|
|
||||||
|
## Suas tarefas de análise
|
||||||
|
### 1. Identificação do Produto
|
||||||
|
Identifique o tipo de produto siderúrgico visível na imagem:
|
||||||
|
- Tipo: bobina / chapa / tubo / cano / perfil / tarugo / placa / fio / outro
|
||||||
|
- Forma de apresentação: laminado a quente / laminado a frio / galvanizado / revestido / trefilado / extrudado
|
||||||
|
- Estimativa de dimensões visíveis (largura, espessura, diâmetro — se possível)
|
||||||
|
- Possível liga ou tipo de aço: carbono / inoxidável / ligado / alta resistência / outro
|
||||||
|
|
||||||
|
### 2. Características Superficias
|
||||||
|
Descreva as condições da superfície observadas:
|
||||||
|
- Acabamento superficial: brilhante / fosco / oxidado / pintado / revestido
|
||||||
|
- Presença de óxido, carepa ou incrustações
|
||||||
|
- Uniformidade do revestimento (se galvanizado ou pintado)
|
||||||
|
- Coloração e sua possível causa metalúrgica (ex: azulamento por temperatura)
|
||||||
|
|
||||||
|
### 3. Detecção de defeitos e anomalias
|
||||||
|
Identifique e classifique possíveis defeitos visíveis:
|
||||||
|
|
||||||
|
| Defeito | Localização | Severidade | Possível Causa |
|
||||||
|
|---|---|---|---|
|
||||||
|
| Trinca / rachadura | [região] | Alta / Média / Baixa | [causa] |
|
||||||
|
| Amassado / deformação | [região] | Alta / Média / Baixa | [causa] |
|
||||||
|
| Mancha / contaminação | [região] | Alta / Média / Baixa | [causa] |
|
||||||
|
| Ondulação / empeno | [região] | Alta / Média / Baixa | [causa] |
|
||||||
|
| Variação de espessura | [região] | Alta / Média / Baixa | [causa] |
|
||||||
|
| Corrosão / ferrugem | [região] | Alta / Média / Baixa | [causa] |
|
||||||
|
| Porosidade / bolha | [região] | Alta / Média / Baixa | [causa] |
|
||||||
|
| Risco / arranhado | [região] | Alta / Média / Baixa | [causa] |
|
||||||
|
| Dobramento indevido | [região] | Alta / Média / Baixa | [causa] |
|
||||||
|
| Separação de camadas | [região] | Alta / Média / Baixa | [causa] |
|
||||||
|
|
||||||
|
Informe "Nenhum defeito visível identificado" se a superfície estiver íntegra.
|
||||||
|
|
||||||
|
### 4. Avaliação de Qualidade
|
||||||
|
Com base na inspeção visual, classifique o produto:
|
||||||
|
|
||||||
|
- **Grau A — Premium**: Sem defeitos visíveis, superfície uniforme, apto para aplicações nobres
|
||||||
|
- **Grau B — Padrão**: Defeitos menores que não comprometem a aplicação geral
|
||||||
|
- **Grau C — Restrito**: Defeitos moderados, uso restrito a aplicações não críticas
|
||||||
|
- **Grau D — Refugo**: Defeitos severos, produto inapto para uso, indicado para sucata ou reprocessamento
|
||||||
|
|
||||||
|
Justifique a classificação em 2 a 3 frases.
|
||||||
|
|
||||||
|
### 5. Recomendações técnicas
|
||||||
|
Com base nos achados, indique:
|
||||||
|
- Ação imediata recomendada (liberar / inspecionar fisicamente / segregar / refugar)
|
||||||
|
- Necessidade de ensaios complementares (dimensional, dureza, ultrassom, líquido penetrante, etc.)
|
||||||
|
- Possíveis ajustes de processo que possam ter gerado o defeito detectado
|
||||||
|
- Cuidados para próximos lotes ou etapas de produção
|
||||||
|
|
||||||
|
### 6. Parecer Final
|
||||||
|
Declare claramente:
|
||||||
|
- ✅ PRODUTO APROVADO — apto para expedição ou próxima etapa
|
||||||
|
- ⚠️ APROVADO COM RESTRIÇÃO — requer inspeção adicional antes de prosseguir
|
||||||
|
- 🔁 REPROCESSAR — retornar à linha para correção
|
||||||
|
- ❌ REFUGO — produto inapto, encaminhar para sucata
|
||||||
|
|
||||||
|
## REGRAS DE RESPOSTA
|
||||||
|
- Responda SEMPRE em Português do Brasil
|
||||||
|
- Use linguagem técnica compatível com o ambiente siderúrgico
|
||||||
|
- Seja objetivo e preciso — o relatório será usado por inspetores de qualidade e engenheiros de processo
|
||||||
|
- Se a qualidade da imagem impedir a análise de algum item, informe explicitamente: "Não foi possível avaliar devido à qualidade da imagem"
|
||||||
|
- Nunca invente defeitos que não sejam visíveis na imagem
|
||||||
|
- Se a imagem não contiver produto siderúrgico, informe: "Imagem fora do escopo siderúrgico"
|
||||||
|
|
||||||
|
## FORMATO DE SAÍDA
|
||||||
|
Utilize os títulos de seção acima.';
|
||||||
|
|
||||||
|
-- cuidado com temperatura usando "." ou ","
|
||||||
|
execute immediate('alter session set nls_numeric_characters=''.,'' ');
|
||||||
|
|
||||||
|
--
|
||||||
|
-- ReRank (https://docs.oracle.com/en/database/oracle/oracle-database/23/vecse/use-reranking-better-rag-results.html)
|
||||||
|
--
|
||||||
|
params_genai := '{"provider": "cohere",
|
||||||
|
"credential_name": "COHERE_CRED",
|
||||||
|
"url": "https://api.cohere.com/v1/rerank",
|
||||||
|
"model": "rerank-v3.5",
|
||||||
|
"return_documents": true,
|
||||||
|
"top_n": 10 }';
|
||||||
|
|
||||||
|
reranked_output := dbms_vector_chain.rerank( p_prompt , json('{ "documents": [ ' || messages || '] }'), json(params_genai));
|
||||||
|
p_prompt2 := p_prompt || '. Informações obtidas para a imagem : ' || JSON_VALUE( JSON_SERIALIZE(reranked_output), '$[0].content' ) || '. Cite o documento de origem dos dados em destaque.' ;
|
||||||
|
|
||||||
|
-- sem re-rank (opcao de uso para refinar resultado)
|
||||||
|
--p_prompt2 := p_prompt || '. Dados obtidos: ' || messages || '. Cite o documento de origem dos dados em destaque.';
|
||||||
|
|
||||||
|
return fnc_26ai_rag_siderurgia(p_prompt2 , p_credential , p_image_id, p_comp_id );
|
||||||
|
|
||||||
|
end;
|
||||||
|
/
|
||||||
124
fnc_26ai_tech_rag.sql
Normal file
124
fnc_26ai_tech_rag.sql
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
create or replace FUNCTION fnc_26ai_tech_rag(p_query VARCHAR2,
|
||||||
|
p_top_k IN NUMBER ,
|
||||||
|
p_credential in varchar2 default 'OCI_CRED',
|
||||||
|
p_app_user in varchar2 default V('APP_USER') )
|
||||||
|
RETURN CLOB IS
|
||||||
|
/*
|
||||||
|
|
||||||
|
Criado por: fernando.leal@oracle.com
|
||||||
|
Data: Mar/2026
|
||||||
|
Objetivo: demonstrar casos de uso do Oracle AI Database 26ai
|
||||||
|
|
||||||
|
v1 - funcao de RAG para estudo explorar "fale com seus dados" TECH - leal
|
||||||
|
|
||||||
|
*/
|
||||||
|
v_context CLOB;
|
||||||
|
v_pre_prompt clob;
|
||||||
|
v_prompt clob;
|
||||||
|
v_pre_prompt2 clob;
|
||||||
|
params_genai CLOB;
|
||||||
|
output CLOB;
|
||||||
|
query_vec VECTOR;
|
||||||
|
-- https://docs.oracle.com/en/database/oracle/oracle-database/23/arpls/dbms_vector_chain1.html#GUID-017C9002-194C-48E5-B59B-EF5C60BC8405
|
||||||
|
v_llm varchar2(20) := 'LLAMA4'; -- [ LLAMA4 | OPENAI ]
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
-- embedding do prompt para dedicated
|
||||||
|
query_vec := to_vector( fnc_26ai_embed ( p_string => p_query, p_emb_type => 'COHERE' ) ) ;
|
||||||
|
|
||||||
|
for message_cursor in (
|
||||||
|
select lv.ID as DOCID,
|
||||||
|
lv.EMBED_DATA as BODY,
|
||||||
|
vector_distance( lv.EMBED_VECTOR, query_vec, cosine ) AS SCORE
|
||||||
|
from TB_26AI_TECH_VECTOR lv
|
||||||
|
order by SCORE
|
||||||
|
FETCH EXACT FIRST p_top_k ROWS ONLY
|
||||||
|
) loop
|
||||||
|
|
||||||
|
v_context := v_context || '"' || replace(replace(replace(replace(message_cursor.BODY,chr(10),null),chr(13),null),'"',''),'''','') || '",' ;
|
||||||
|
|
||||||
|
end loop;
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- pre requisito sao as credenciais definidas com nome OCI_CRED criadas a partir de dbms_vector.create_credential
|
||||||
|
--
|
||||||
|
-- para montar request body abaixo: https://docs.oracle.com/en-us/iaas/api/#/en/generative-ai-inference/20231130/datatypes/GenerateTextDetails
|
||||||
|
--
|
||||||
|
if v_llm = 'LLAMA4' then
|
||||||
|
|
||||||
|
params_genai := '{
|
||||||
|
"provider" : "ocigenai",
|
||||||
|
"credential_name" : "' || p_credential || '",
|
||||||
|
"url" : "https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/chat",
|
||||||
|
"model": "meta.llama-4-maverick-17b-128e-instruct-fp8"}';
|
||||||
|
|
||||||
|
elsif v_llm = 'OPENAI' then
|
||||||
|
|
||||||
|
params_genai := '{
|
||||||
|
"provider" : "openai",
|
||||||
|
"credential_name" : "CRED_OPENAI",
|
||||||
|
"url" : "https://api.openai.com/v1/chat/completions",
|
||||||
|
"model" : "gpt-4.1-mini",
|
||||||
|
"temperature": 0.4
|
||||||
|
}';
|
||||||
|
|
||||||
|
end if;
|
||||||
|
|
||||||
|
-- augmented prompt atraves do vetor criado no banco
|
||||||
|
v_pre_prompt := 'Você é um Analista Sênior de Inteligência Operacional especializado em analisar relatórios técnicos e executivos previamente gerados.
|
||||||
|
|
||||||
|
Contexto de trabalho:
|
||||||
|
- Você receberá:
|
||||||
|
1) A pergunta do usuário
|
||||||
|
2) Um conjunto de trechos recuperados da base vetorizada de relatórios (com metadados como report_id, data, área, severidade, prioridade, fonte).
|
||||||
|
- Sua tarefa é encontrar evidências relevantes nesses relatórios e responder com precisão, sem inventar informações.
|
||||||
|
|
||||||
|
Regras obrigatórias:
|
||||||
|
- Use SOMENTE informações presentes nos trechos recuperados.
|
||||||
|
- Se faltar dado para responder algo, escreva explicitamente: “Informação não fornecida”.
|
||||||
|
- Sempre cite as evidências no formato: [report_id | seção/campo | data].
|
||||||
|
- Quando houver conflito entre relatórios, sinalize divergência e indique qual evidência é mais confiável (recência, completude, consistência).
|
||||||
|
- Priorize risco de negócio, severidade e urgência.
|
||||||
|
- Não repita conteúdo desnecessário; seja objetivo e acionável.
|
||||||
|
|
||||||
|
Método de resposta:
|
||||||
|
1) Entenda a intenção da pergunta (comparar, diagnosticar, priorizar, tendência, causa, ação).
|
||||||
|
2) Selecione os trechos mais relevantes por aderência semântica à pergunta.
|
||||||
|
3) Consolide achados em linguagem executiva + técnica.
|
||||||
|
4) Gere recomendações práticas com prioridade e esforço.
|
||||||
|
5) Indique lacunas de dados que limitam a conclusão.
|
||||||
|
|
||||||
|
Formato obrigatório de saída:
|
||||||
|
## Resposta objetiva
|
||||||
|
- Responda em formato markdown, e nunca use fontes de tamanho diferentes.
|
||||||
|
- Resposta direta à pergunta em 3 a 6 linhas.
|
||||||
|
|
||||||
|
## Evidências encontradas
|
||||||
|
- Evidência 1: <achado> [report_id | seção/campo | data]
|
||||||
|
- Evidência 2: <achado> [report_id | seção/campo | data]
|
||||||
|
- Evidência 3: <achado> [report_id | seção/campo | data]
|
||||||
|
|
||||||
|
## Diagnóstico consolidado
|
||||||
|
- Causa/hipótese principal (Alta/Média/Baixa)
|
||||||
|
- Risco de curto prazo
|
||||||
|
- Risco de médio prazo
|
||||||
|
|
||||||
|
## Recomendações priorizadas
|
||||||
|
- P1: <ação> | Impacto: <...> | Esforço: <Baixo/Médio/Alto>
|
||||||
|
- P2: <ação> | Impacto: <...> | Esforço: <Baixo/Médio/Alto>
|
||||||
|
- P3: <ação> | Impacto: <...> | Esforço: <Baixo/Médio/Alto>
|
||||||
|
|
||||||
|
## Lacunas e próximos dados necessários
|
||||||
|
- Informação não fornecida: <campo/contexto ausente>
|
||||||
|
- Dado adicional recomendado para aumentar confiança da resposta: <...>';
|
||||||
|
|
||||||
|
v_pre_prompt2 := '{ "role": "user","content": "Contexto:"' || v_context || ' "Pergunta": ' || p_query || '"}' ;
|
||||||
|
|
||||||
|
output := dbms_vector_chain.utl_to_generate_text( replace(replace(replace(replace(v_pre_prompt || v_pre_prompt2,chr(10),null),chr(13),null),'"',''),'''','') , json(params_genai));
|
||||||
|
|
||||||
|
RETURN output;
|
||||||
|
|
||||||
|
END;
|
||||||
|
/
|
||||||
89
fnc_26ai_traffic_rag.sql
Normal file
89
fnc_26ai_traffic_rag.sql
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
create or replace function fnc_26ai_traffic_rag (p_base64_image IN clob,
|
||||||
|
p_oci_cred IN VARCHAR2,
|
||||||
|
p_comp_id in varchar2)
|
||||||
|
return clob
|
||||||
|
as
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
Criado por: fernando.leal@oracle.com
|
||||||
|
Data: Oct/2025
|
||||||
|
Objetivo: demonstrar casos de uso do Oracle AI Database 26ai
|
||||||
|
|
||||||
|
v1 - funcao de RAG para PS - Tarffic Control - leal
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
-- modelos: https://docs.oracle.com/en-us/iaas/Content/generative-ai/pretrained-models.htm
|
||||||
|
-- cuidado com pre requisito (1)
|
||||||
|
gen_ai_endpoint varchar2(500) := 'https://inference.generativeai.us-chicago-1.oci.oraclecloud.com';
|
||||||
|
gen_ai_model varchar2(500) := 'meta.llama-4-maverick-17b-128e-instruct-fp8';
|
||||||
|
|
||||||
|
chat_resp dbms_cloud_types.RESP;
|
||||||
|
|
||||||
|
request_json_part1 CLOB;
|
||||||
|
request_json_part2 CLOB;
|
||||||
|
request_body BLOB;
|
||||||
|
BEGIN
|
||||||
|
-- create temp blobs
|
||||||
|
dbms_lob.createtemporary(request_body, FALSE);
|
||||||
|
|
||||||
|
request_json_part1 := to_clob(
|
||||||
|
'{
|
||||||
|
"compartmentId": "' || p_comp_id || '",
|
||||||
|
"servingMode":
|
||||||
|
{
|
||||||
|
"modelId": "' || gen_ai_model || '",
|
||||||
|
"servingType": "ON_DEMAND"
|
||||||
|
}
|
||||||
|
,
|
||||||
|
"chatRequest": {
|
||||||
|
"apiFormat": "GENERIC",
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"role": "USER",
|
||||||
|
"content": [
|
||||||
|
{
|
||||||
|
"type": "TEXT",
|
||||||
|
"text": "' || 'Gere um JSON com a placa do veiculo, modelo do veiculo e se motorista estiver visivel com uso celular na direção, aponte a infração. Exemplo de saida: {placa:XXXX,modelo:XXXXXXXXXXXXXXXXX,infracao:XXXXXXXXXXXXXX}. Retorne apenas o JSON, sem nenhuma mensagem de introducao nem de explicacao.' || '"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "IMAGE",
|
||||||
|
"imageUrl": {
|
||||||
|
"url": "data:image/' || 'png' || ';base64,');
|
||||||
|
|
||||||
|
request_json_part2 := to_clob('"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"temperature": 0.4,
|
||||||
|
"numGenerations": 5,
|
||||||
|
"topK": 1
|
||||||
|
}
|
||||||
|
}');
|
||||||
|
|
||||||
|
-- append part1 json to request blob
|
||||||
|
dbms_lob.append(request_body, apex_util.clob_to_blob(p_clob => request_json_part1,p_charset => 'AL32UTF8'));
|
||||||
|
|
||||||
|
-- append base64 image to request blob
|
||||||
|
dbms_lob.append(request_body, apex_util.clob_to_blob(p_clob => p_base64_image,p_charset => 'AL32UTF8'));
|
||||||
|
|
||||||
|
-- append part2 json to request blob
|
||||||
|
dbms_lob.append(request_body, apex_util.clob_to_blob(p_clob => request_json_part2,p_charset => 'AL32UTF8'));
|
||||||
|
|
||||||
|
-- call Gen AI Chat
|
||||||
|
chat_resp := dbms_cloud.send_request(
|
||||||
|
credential_name => p_oci_cred,
|
||||||
|
uri => gen_ai_endpoint || '/20231130/actions/chat',
|
||||||
|
method => dbms_cloud.METHOD_POST,
|
||||||
|
body => request_body
|
||||||
|
);
|
||||||
|
|
||||||
|
-- clear temp blobs
|
||||||
|
dbms_lob.freetemporary(request_body);
|
||||||
|
|
||||||
|
RETURN json_value( dbms_cloud.get_response_text(chat_resp),'$.chatResponse.choices[0].message.content[0].text') ;
|
||||||
|
END;
|
||||||
|
/
|
||||||
53
fnc_26ai_traffic_vision.sql
Normal file
53
fnc_26ai_traffic_vision.sql
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
create or replace function fnc_26ai_traffic_vision( p_base64_image in clob, p_feature_type in varchar2 , p_comp_id in varchar2)
|
||||||
|
return clob
|
||||||
|
--
|
||||||
|
-- Visio: https://docs.oracle.com/pt-br/solutions/ai-vision-extract-data/index.html#GUID-A4FD65D0-BF62-472B-B4C7-0ADF5425A566
|
||||||
|
--
|
||||||
|
as
|
||||||
|
/*
|
||||||
|
p_feature_type: https://docs.oracle.com/en-us/iaas/api/#/en/vision/20220125/datatypes/ImageFeature
|
||||||
|
|
||||||
|
IMAGE_CLASSIFICATION: Label the image.
|
||||||
|
OBJECT_DETECTION: Identify objects in the image with bounding boxes.
|
||||||
|
TEXT_DETECTION: Recognize text at the word and line level.
|
||||||
|
FACE_DETECTION: Identify faces in the image with bounding boxes and face landmarks.
|
||||||
|
|
||||||
|
*/
|
||||||
|
v_endpoint varchar2(500) := 'https://vision.aiservice.us-chicago-1.oci.oraclecloud.com/20220125/actions/analyzeImage';
|
||||||
|
request_json CLOB;
|
||||||
|
l_response_body clob;
|
||||||
|
|
||||||
|
begin
|
||||||
|
|
||||||
|
request_json := to_clob('{
|
||||||
|
"compartmentId": "' || p_comp_id || '",
|
||||||
|
"image": {
|
||||||
|
"source":"INLINE",
|
||||||
|
"data":"' || p_base64_image || '"
|
||||||
|
},
|
||||||
|
"features":[
|
||||||
|
{
|
||||||
|
"featureType":"' || p_feature_type || '",
|
||||||
|
"maxResults": 5
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}' );
|
||||||
|
|
||||||
|
-- Definir os cabeçalhos da requisição
|
||||||
|
APEX_WEB_SERVICE.G_REQUEST_HEADERS(1).NAME := 'Content-Type';
|
||||||
|
APEX_WEB_SERVICE.G_REQUEST_HEADERS(1).VALUE := 'application/json';
|
||||||
|
APEX_WEB_SERVICE.G_REQUEST_HEADERS(2).NAME := 'Accept';
|
||||||
|
APEX_WEB_SERVICE.G_REQUEST_HEADERS(2).VALUE := 'application/json';
|
||||||
|
|
||||||
|
-- Faça a chamada POST usando APEX_WEB_SERVICE e a credencial OCI
|
||||||
|
l_response_body := APEX_WEB_SERVICE.make_rest_request(
|
||||||
|
p_url => v_endpoint,
|
||||||
|
p_http_method => 'POST',
|
||||||
|
p_body => request_json,
|
||||||
|
p_credential_static_id => 'apex_cred'
|
||||||
|
);
|
||||||
|
|
||||||
|
return l_response_body;
|
||||||
|
|
||||||
|
end;
|
||||||
|
/
|
||||||
Reference in New Issue
Block a user