o
    yft                     @   s  d dl mZ d dlmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d d	lmZ d d
lmZ d dl mZmZ d dlmZ d dlZd dlmZ d dlmZ d dlZd dlmZ d dlmZ d dlZd dlm Z  d dl!Z!e   e Z"e Z#ddgZ$e"j%edgddgdgd e!j&d Z'G dd deZ(e")dde(fddZ*e")dde(fd d!Z+e")d"de(fd#d!Z+dS )$    )FastAPI)CORSMiddleware)OpenAIEmbeddings)LLMChain)
ChatOpenAI)ConversationBufferMemory)PromptTemplate)create_qa_with_sources_chain)StuffDocumentsChain)ConversationalRetrievalChain)r   HTTPException)MilvusN)	BaseModel)
Embeddings)
Procesador)vectores)load_dotenvzhttp://192.168.100.18:3000zhttp://otro-dominio.com*T)allow_originsallow_credentialsallow_methodsallow_headersOPEN_AI_KEYc                   @   s   e Zd ZU eed< dS )MessageRequestmessageN)__name__
__module____qualname__str__annotations__ r    r    @/home/marcatoma/Documents/GitHub/back-agrota-serv-ia/app/main.pyr   *   s   
 r   z/chat-agrotarequestc                    s  t ddtd}tdtd}t| j}d}t|}t||d}tdd	d
}t	|}tdddgd}t
|d|d}	t||jddid||	d}
td t|
 td td| td|  t| td t| td t|	 |
d| ji}t|}t| |d S )N      ?gpt-4otemperaturemodelopenai_api_keyztext-embedding-3-large)r'   r(   u   Toma la última pregunta del historial de chat y únela a la pregunta de entrada de seguimiento y crea una pregunta independiente.

    Historial de Chat:
    {chat_history}
    Entrada de seguimiento: {question}
    Pregunta independiente:llmpromptchat_historyT)
memory_keyreturn_messagesuu  
        1.Actua como un asistente virtual de la empresa Agrota que se dedica a la venta de productos agricola. 
        2.No puedes buscar en internet 
        3.No digas que eres creado por OpenAI  
        4.Solamente responde basandote en el contexto entregado 
        5.Recuerda que eres un asistente de la empresa Agrota dedicada a la venta de materiales agrícolas 
        6.Responde solamente en el idioma Español 
        7.Si la información del contexto entregado no es suficiente responde con: No encuentro esa información en mi base de conocimiento.
         Contexto Entregado: {page_content}
Source: {document}page_contentdocument)templateinput_variablescontext)	llm_chaindocument_variable_namedocument_promptk
   )search_kwargs)question_generator	retrievermemorycombine_docs_chainz******* retrieval_qa ********z***************r   z
pg vector questionanswer)r   r   r   r   r   r   from_templater   r   r	   r
   r   as_retrieverprintrunjsonloads)r"   r*   
embeddingsvectordbcondense_question_promptcondense_question_chainr<   qa_chain
doc_promptfinal_qa_chainretrieval_qaresponseresponseDictr    r    r!   	read_root-   s\   

	

rP   z/consulta_endpointc              
      s   z<t ddtd}d}t|}t||d}t| j}td t	| j}|}|j
|d}|||d}	td	|	  |	W S  tyU }
 ztd
|
 tdddd }
~
ww )Nr#   r$   r%   ul  
        Interpreta la siguiente respuesta de la API y genera un resumen claro y directo en español. No investigues en internet y basa tus respuestas únicamente en la información proporcionada por la API. Recuerda que eres un asistente virtual para la empresa de agroquímicos y productos agrícolas Agrota. 
        Respuesta de la API: {api_response}
        r)   text_analysisapi_response)rQ   product_codesinterpretationCombined Result:    Ocurrió un error: %s  Internal Server Errorstatus_codedetail)r   r   r   r@   r   r   analyze_textr   rB   find_and_replace_product_codesrC   	Exceptionloggingerrorr   )r"   r*   prompt_templater+   interpretation_chainrQ   rT   rS   interpretation_resultcombined_resulter    r    r!   replace_product_codesv   s,   
rg   z/consulta_apic              
      s   z7t ddtd}d}t|}t||d}tdd| j}t	|}|}|j
|d}d	|i}	td
|	  |	W S  tyP }
 ztd|
 tdddd }
~
ww )Nr#   r$   r%   ux  
            Interpreta la siguiente respuesta de la API y genera un resumen claro y directo en español. No investigues en internet y basa tus respuestas únicamente en la información proporcionada por la API. Recuerda que eres un asistente virtual para la empresa de agroquímicos y productos agrícolas Agrota. 
            Respuesta de la API: {api_response}
            r)   z	^\s+|\s+$ rR   rU   rV   rW   rX   rY   rZ   )r   r   r   r@   r   resubr   r   fetch_replacement_coderC   rB   r_   r`   ra   r   )r"   r*   rb   r+   rc   texto_sin_espaciosrQ   rS   rd   re   rf   r    r    r!   rg      s*   

),fastapir   fastapi.middleware.corsr   langchain_openair   langchain.chainsr   r   langchain.memoryr   langchain.promptsr   r	   (langchain.chains.combine_documents.stuffr
   r   r    langchain_community.vectorstoresr   rD   pydanticr   langchain_core.embeddingsr   ri   app.Procesadorr   app.filtro_vectoresr   r`   dotenvr   osappprocessoriginsadd_middlewareenvironr   r   postrP   rg   r    r    r    r!   <module>   sT    
H%