File size: 7,633 Bytes
b374298
a263183
eebeb78
a263183
 
 
eebeb78
ab34606
12d3e1a
 
 
 
 
 
 
 
12b0dd7
756fca0
 
1286e81
cb23311
ab34606
1286e81
7eb86f7
 
a263183
1286e81
095b5f1
eebeb78
1286e81
 
7eb86f7
cb23311
095b5f1
82e7990
1286e81
 
7eb86f7
1286e81
baeaaa5
82e7990
12b0dd7
82e7990
 
7eb86f7
1286e81
756fca0
8f3dc39
b374298
a263183
095b5f1
 
 
 
12b0dd7
095b5f1
cb23311
82e7990
1286e81
ab34606
82e7990
ab34606
82e7990
baeaaa5
095b5f1
1286e81
095b5f1
 
a263183
 
 
 
 
 
 
7eb86f7
 
 
 
095b5f1
451f8a3
7eb86f7
 
 
 
 
82e7990
7eb86f7
451f8a3
 
7eb86f7
ab34606
7eb86f7
b374298
756fca0
095b5f1
7eb86f7
451f8a3
 
 
7eb86f7
451f8a3
 
7eb86f7
 
451f8a3
ab34606
 
7eb86f7
a263183
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82e7990
a263183
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82e7990
a263183
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
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})