Upload files to "/"

This commit is contained in:
2026-05-08 13:15:19 +00:00
parent ebb7c3decf
commit e3d9c06fda
5 changed files with 755 additions and 0 deletions

View File

@@ -0,0 +1,144 @@
create or replace FUNCTION fnc_26ai_embed_image_cohere (image_name in VARCHAR2,
image_blob in BLOB,
oci_cred IN VARCHAR2 default 'OCI_CRED',
p_comp_id in varchar2,
p_code_mode in number default 1 )
return clob
as
/*
Criado por: fernando.leal@oracle.com
Data: Oct/2025
Objetivo: demonstrar casos de uso do Oracle AI Database 26ai
v1 - embedding de imagnes com Cohere On-Demand - 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) := 'cohere.embed-v4.0';
embed_resp dbms_cloud_types.RESP;
file_extension VARCHAR2(5);
base64_image CLOB := NULL;
invalid_image EXCEPTION;
image_too_big EXCEPTION;
request_json_part1 CLOB;
request_json_part2 CLOB;
request_body BLOB;
v_vector vector;
BEGIN
if p_code_mode = 1 then
-- get file extension from file name and validate
file_extension := lower(regexp_replace(image_name, '.*\.([a-zA-Z0-9]+)$', '\1')) ;
-- create temp blob
dbms_lob.createtemporary(request_body, FALSE);
-- base64 encode the image
base64_image := APEX_WEB_SERVICE.BLOB2CLOBBASE64(image_blob,'N','N');
-- validate size of base64 image, must be less than 5 mb
-- if length(base64_image) > 5242880 then
-- raise image_too_big;
-- end if;
-- define beginning of request payload
request_json_part1 := to_clob('{"inputs": ["data:image/' || file_extension || ';base64,');
-- define ending of request payload
request_json_part2 := to_clob('"],
"servingMode": {
"servingType": "ON_DEMAND",
"modelId": "' || gen_ai_model || '"
},
"truncate": "NONE",
"inputType": "IMAGE",
"compartmentId": "' || p_comp_id || '"}');
-- 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 => 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 GenAI Embed Service
embed_resp := dbms_cloud.send_request(
credential_name => oci_cred,
uri => gen_ai_endpoint || '/20231130/actions/embedText',
method => dbms_cloud.METHOD_POST,
body => request_body
);
-- free temp blob
dbms_lob.freetemporary(request_body);
-- return embed reponse
RETURN dbms_cloud.get_response_text(embed_resp);
elsif p_code_mode = 2 then
RETURN to_clob( DBMS_VECTOR.UTL_TO_EMBEDDING(
image_blob,
'image',
JSON('{
"provider": "OCIGenAI",
"credential_name": "' || oci_cred || '",
"url": "https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/embedText",
"model": "' || gen_ai_model || '"
}')
) ) ;
elsif p_code_mode = 3 then
SELECT VECTOR_EMBEDDING( VIT_BASE_PATCH16_224 USING image_blob AS data ) as embedding
into v_vector;
return to_clob( v_vector );
elsif p_code_mode = 4 then
/* https://docs.oracle.com/en/database/oracle/oracle-database/23/vecse/onnx-pipeline-models-multi-modal-embedding.html
begin
DBMS_VECTOR.LOAD_ONNX_MODEL_CLOUD(
model_name => 'CLIP_VIT_LARGE_PATCH14_IMG',
credential => 'OCI_CRED',
uri => 'https://objectstorage.sa-saopaulo-1.oraclecloud.com/p/py9iUuDsr_WFX6L0ziRvgPkYIhTYsdTgq6SF9S1j1pJWkS67jx2lXWqXz4cZkdDP/n/idi1o0a010nx/b/bucket-database-26ai/o/clip-vit-large-patch14_img.onnx',
metadata => JSON('{"function" : "embedding", "embeddingOutput" : "embedding" , "input": {"input": ["DATA"]}}')
);
DBMS_VECTOR.LOAD_ONNX_MODEL_CLOUD(
model_name => 'CLIP_VIT_LARGE_PATCH14_TXT',
credential => 'OCI_CRED',
uri => 'https://objectstorage.sa-saopaulo-1.oraclecloud.com/p/py9iUuDsr_WFX6L0ziRvgPkYIhTYsdTgq6SF9S1j1pJWkS67jx2lXWqXz4cZkdDP/n/idi1o0a010nx/b/bucket-database-26ai/o/clip-vit-large-patch14_txt.onnx',
metadata => JSON('{"function" : "embedding", "embeddingOutput" : "embedding" , "input": {"input": ["DATA"]}}')
);
END;
*/
-- select DBMS_VECTOR.UTL_TO_EMBEDDING(
-- image_blob ,
-- 'image',
-- json('{"provider":"database", "model":"CLIP_VIT_LARGE_PATCH14_IMG"}') )
-- into v_vector;
SELECT VECTOR_EMBEDDING( CLIP_VIT_LARGE_PATCH14_IMG USING image_blob AS data ) as embedding
into v_vector;
return to_clob( v_vector );
end if;
EXCEPTION
WHEN invalid_image THEN
RAISE_APPLICATION_ERROR(-20001,'Invalid Image Extension, must be png,jpg,jpeg: ' || image_name);
WHEN image_too_big THEN
RAISE_APPLICATION_ERROR(-20002,'Base64 Image Over 5 MB: ' || length(base64_image) || ' - ' || image_name);
END;
/