create or replace function fnc_26ai_manufatura( 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: Nov/2025
  Objetivo: demonstrar casos de uso do Oracle AI Database 26ai

  v1 - similaridade e rag para Manufatura - leal

 SelectAI para pesquisas por texto: 
 
    begin
		dbms_cloud_ai.create_profile(
			profile_name => 'PROF_26AI_MANUF_V1',
			attributes =>
				'{"provider": "oci",
				"credential_name": "OCI_CRED",
				"oci_compartment_id":  "ocid1.compartment.oc1..aaaaaaaaev2ipyek53f7sck5ibvtnqrp5w2k54qiuk2cikbfati5bk54yhka",
				"region": "us-chicago-1",
				"model": "meta.llama-4-maverick-17b-128e-instruct-fp8", 
				"oci_apiformat": "GENERIC",  
				"object_list": [
					 {"owner": "AICHAT1", "name":"TB_26AI_MANUFATURA_CATALOGO_TEXTO"}
				 ],
				"comments": true,
				"annotations": true, 
				"temperature": 0.1	
				}'
			);
	end;

*/
   messages CLOB;
   v_vector clob; 
   p_prompt 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_MANUFATURA
    where id = p_image_id;   

  for message_cursor in (

         SELECT embed_data
         FROM (  
           SELECT  'Part Number: ' || PART_NUMBER || ' Descrição: ' || DESCRIPTION || ' Categoria: ' || CATEGORY ||  ' SKU: ' || SKU embed_data
			FROM TB_26AI_MANUFATURA_CATALOGO_TEXTO
         )
		 ORDER BY VECTOR_DISTANCE(  FNC_26AI_EMBED(embed_data,'COHERE') , v_vector , COSINE    )
		 FETCH EXACT FIRST 5 ROWS ONLY   

      ) loop

      messages := messages || '"' || replace(replace(replace(replace(message_cursor.embed_data,chr(10),null),chr(13),null),'"',''),'''','') || '",' ;

  END LOOP;

    -- cuidado com temperatura usando "." ou ","
   --execute immediate('alter session set nls_numeric_characters=''.,'' '); 

    -- sem re-rank (opcao de uso para refinar resultado)
    p_prompt := ' A imagem fornecida tem associacao com descricoes, ou nomes do catalogo vetorizado. Identifique a maior semelhança.' ||
    ' A resposta deve ser objetiva, descervendo SKU, Part Number, Categoria e Descricao. Dados do catalogo de produtos: ' || messages;   

    return fnc_26ai_rag_manufatura(p_prompt ,p_credential, p_image_id, p_comp_id);

end;
/