from typing import Any, Dict, cast from langchain.prompts import PromptTemplate from _utils.langchain_utils.LLM_class import LLM from _utils.gerar_relatorio_modelo_usuario.utils import ( get_full_text_and_all_PDFs_chunks, ) from _utils.langchain_utils.Prompt_class import Prompt from _utils.utils import print_sentry, sentry_add_breadcrumb from setup.easy_imports import ( Response, AsyncAPIView, APIView, MultiPartParser, extend_schema, ) from datetime import datetime from _utils.handle_files import handle_pdf_files_from_serializer, remove_pdf_temp_files from _utils.gerar_documento import ( gerar_documento, ) from _utils.gerar_relatorio_modelo_usuario.prompts import prompt_auxiliar_inicio from setup.logging import Axiom, send_axiom from .serializer import ( GerarDocumentoComPDFProprioSerializer, GerarDocumentoSerializer, GerarEmentaSerializer, ) import asyncio from _utils.langchain_utils.Splitter_class import Splitter class GerarDocumentoView(AsyncAPIView): # parser_classes = [MultiPartParser] serializer = {} axiom_instance = Axiom() @extend_schema( request=GerarDocumentoSerializer, ) async def post(self, request): self.axiom_instance.generate_new_uuid() print(f"\n\nDATA E HORA DA REQUISIÇÃO: {datetime.now()}") self.axiom_instance.send_axiom("COMEÇOU NOVA REQUISIÇÃO") self.axiom_instance.send_axiom(f"request.data: {request.data}") serializer = GerarDocumentoSerializer(data=request.data) if serializer.is_valid(raise_exception=True): obj = serializer.get_obj() # type: ignore if not serializer.validated_data: raise ValueError("Erro no validated_data") async def proccess_data_after_response(): # await asyncio.sleep(0) data = cast(Dict[str, Any], serializer.validated_data) self.serializer = data listaPDFs = [l["link_arquivo"] for l in data["files"]] self.axiom_instance.send_axiom(f"listaPDFs: {listaPDFs}") resposta_llm = await gerar_documento( obj, listaPDFs, self.axiom_instance, isBubble=True ) self.axiom_instance.send_axiom(f"resposta_llm: {resposta_llm}") # remove_pdf_temp_files(listaPDFs) # asyncio.create_task(proccess_data_after_response()) loop = asyncio.get_running_loop() loop.run_in_executor( None, lambda: asyncio.run(proccess_data_after_response()) ) return Response( {"resposta": "Requisição está sendo processada em segundo plano"} ) class GerarDocumentoComPDFProprioView(AsyncAPIView): parser_classes = [MultiPartParser] serializer = {} axiom_instance = Axiom() @extend_schema( request=GerarDocumentoComPDFProprioSerializer, ) async def post(self, request): self.axiom_instance.generate_new_uuid() print(f"\n\nDATA E HORA DA REQUISIÇÃO: {datetime.now()}") self.axiom_instance.send_axiom("COMEÇOU NOVA REQUISIÇÃO") self.axiom_instance.send_axiom(f"request.data: {request.data}") serializer = GerarDocumentoComPDFProprioSerializer(data=request.data) if serializer.is_valid(raise_exception=True): data = cast(Dict[str, Any], serializer.validated_data) obj = serializer.get_obj() # type: ignore self.serializer = data listaPDFs = handle_pdf_files_from_serializer( data["files"], self.axiom_instance ) resposta_llm = await gerar_documento(obj, listaPDFs, self.axiom_instance) self.axiom_instance.send_axiom(f"resposta_llm: {resposta_llm}") remove_pdf_temp_files(listaPDFs) self.axiom_instance.send_axiom( "PRÓXIMA LINHA ENVIA A RESPOSTA A QUEM FEZ A REQUISIÇÃO" ) return Response({"resposta": resposta_llm}) class GerarEmentaView(AsyncAPIView): serializer = {} @extend_schema( request=GerarDocumentoSerializer, ) async def post(self, request): print(f"\n\nDATA E HORA DA REQUISIÇÃO: {datetime.now()}") print("request.data: ", request.data) serializer = GerarEmentaSerializer(data=request.data) if serializer.is_valid(raise_exception=True): if not serializer.validated_data: raise ValueError("Erro no validated_data") async def proccess_data_after_response(): data = cast(Dict[str, Any], serializer.validated_data) self.serializer = data listaPDFs = [l["link_arquivo"] for l in data["files"]] print("\n\nlistaPDFs: ", listaPDFs) all_PDFs_chunks, full_text_as_array = ( await get_full_text_and_all_PDFs_chunks( listaPDFs, Splitter(data["chunk_size"], data["chunk_overlap"]), False, True, ) ) full_text = "".join(full_text_as_array) llm = LLM() prompt_template = PromptTemplate( input_variables=["context"], template=full_text ) response = await llm.google_gemini().ainvoke( prompt_template.format(context=full_text) ) print("\n\nresposta_llm: ", response.content) # asyncio.create_task(proccess_data_after_response()) loop = asyncio.get_running_loop() loop.run_in_executor( None, lambda: asyncio.run(proccess_data_after_response()) ) return Response( {"resposta": "Requisição está sendo processada em segundo plano"} ) class GerarEmentaComPDFProprioView(AsyncAPIView): parser_classes = [MultiPartParser] serializer = {} @extend_schema( request=GerarDocumentoComPDFProprioSerializer, ) async def post(self, request): print(f"\n\nDATA E HORA DA REQUISIÇÃO: {datetime.now()}") serializer = GerarDocumentoComPDFProprioSerializer(data=request.data) if serializer.is_valid(raise_exception=True): data = cast(Dict[str, Any], serializer.validated_data) print("\n\ndata: ", data) self.serializer = data data = cast(Dict[str, Any], serializer.validated_data) self.serializer = data listaPDFs = [l["link_arquivo"] for l in data["files"]] print("\n\nlistaPDFs: ", listaPDFs) all_PDFs_chunks, full_text_as_array = ( await get_full_text_and_all_PDFs_chunks( listaPDFs, Splitter(data["chunk_size"], data["chunk_overlap"]), False, True, ) ) full_text = "".join(full_text_as_array) llm = LLM() prompt_template = PromptTemplate( input_variables=["context"], template=full_text ) response = await llm.google_gemini().ainvoke( prompt_template.format(context=full_text) ) print("\n\nresposta_llm: ", response.content) remove_pdf_temp_files(listaPDFs) print("PRÓXIMA LINHA ENVIA A RESPOSTA A QUEM FEZ A REQUISIÇÃO") return Response({"resposta": response.content})