File size: 11,753 Bytes
b374298
a263183
85ee925
 
 
eebeb78
2ce5e93
85ee925
 
a263183
85ee925
a263183
eebeb78
85ee925
12d3e1a
 
 
 
 
 
 
 
12b0dd7
756fca0
 
1286e81
2ce5e93
ab34606
1286e81
7eb86f7
 
a263183
1286e81
095b5f1
eebeb78
1286e81
 
7eb86f7
cb23311
095b5f1
82e7990
1286e81
 
7eb86f7
1286e81
baeaaa5
82e7990
12b0dd7
85ee925
 
 
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
967a079
 
 
7eb86f7
ab34606
7eb86f7
b374298
756fca0
095b5f1
7eb86f7
451f8a3
 
 
7eb86f7
451f8a3
 
7eb86f7
 
451f8a3
ab34606
 
7eb86f7
a263183
 
 
 
b909baa
a263183
 
 
 
 
b909baa
a263183
b909baa
 
 
 
a263183
85ee925
a263183
 
 
 
85ee925
 
 
a263183
85ee925
a263183
85ee925
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a263183
 
85ee925
 
 
 
4b3b841
 
85ee925
 
 
 
 
 
 
 
 
 
 
 
 
 
a263183
85ee925
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a263183
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b909baa
a263183
 
 
 
 
b909baa
a263183
b909baa
 
 
a263183
 
 
b909baa
a263183
b909baa
85ee925
 
 
 
a263183
b909baa
 
 
 
a263183
82e7990
a263183
 
b909baa
a263183
85ee925
a263183
 
 
b909baa
 
 
a263183
85ee925
 
 
 
4b3b841
 
85ee925
 
 
 
 
 
 
 
 
 
a263183
85ee925
a263183
85ee925
 
 
a263183
 
b909baa
 
 
85ee925
 
 
 
 
 
 
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
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
from typing import Any, Dict, cast
from langchain.prompts import PromptTemplate
from _utils.bubble_integrations.enviar_resposta_final import enviar_resposta_final
from _utils.custom_exception_handler import custom_exception_handler_wihout_api_handler
from _utils.gerar_documento_utils.GerarDocumento import GerarDocumento
from _utils.langchain_utils.LLM_class import LLM
from _utils.gerar_documento_utils.utils import (
    generate_document_title,
    gerar_resposta_compilada,
    get_full_text_and_all_PDFs_chunks,
    split_text_by_tokens,
)
from _utils.langchain_utils.Prompt_class import Prompt
from _utils.utils import convert_markdown_to_HTML, 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_documento_utils.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(
            f"COMEÇOU NOVA REQUISIÇÃO - 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(
            f"COMEÇOU NOVA REQUISIÇÃO - 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 = {}
    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(
            f"COMEÇOU NOVA REQUISIÇÃO - 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():
                try:
                    data = cast(Dict[str, Any], serializer.validated_data)
                    self.serializer = data

                    gerar_documento_instance = GerarDocumento(obj, self.axiom_instance)

                    listaPDFs = [l["link_arquivo"] for l in data["files"]]

                    self.axiom_instance.send_axiom(f"listaPDFs: {listaPDFs}")

                    all_PDFs_chunks, full_text_as_array = (
                        await get_full_text_and_all_PDFs_chunks(
                            listaPDFs,
                            Splitter(obj.chunk_size, obj.chunk_overlap),
                            False,
                            True,
                        )
                    )
                    full_text = "".join(full_text_as_array)
                    self.axiom_instance.send_axiom(
                        f"full_text[0:100] gerado do PDF: {full_text[0:100]}"
                    )

                    texto_completo = ""
                    text_splitted_by_tokens = split_text_by_tokens(full_text)
                    for text in text_splitted_by_tokens:
                        prompt_template = PromptTemplate(
                            input_variables=["context"],
                            template=obj.prompt_gerar_documento,
                        )
                        texto_da_parte = await gerar_documento_instance.checar_se_resposta_vazia_do_documento_final(
                            obj.llm_ultimas_requests,
                            prompt_template.format(context=text),
                        )

                        texto_completo += texto_da_parte

                    texto_completo_como_html = convert_markdown_to_HTML(
                        texto_completo
                    ).replace("resposta_segunda_etapa:", "<br><br>")
                    self.axiom_instance.send_axiom(
                        f"resposta_llm: {texto_completo_como_html}"
                    )

                    titulo_do_documento = await generate_document_title(
                        cast(str, texto_completo_como_html)
                    )

                    self.axiom_instance.send_axiom(
                        "PRÓXIMA LINHA ENVIA A RESPOSTA A QUEM FEZ A REQUISIÇÃO"
                    )

                    self.axiom_instance.send_axiom(
                        "COMEÇANDO A REQUISIÇÃO FINAL PARA O BUBBLE"
                    )
                    enviar_resposta_final(
                        obj.doc_id,  # type: ignore
                        obj.form_response_id,  # type: ignore
                        obj.version,  # type: ignore
                        texto_completo_como_html,
                        False,
                        cast(str, titulo_do_documento),
                    )
                    self.axiom_instance.send_axiom(
                        "TERMINOU A REQUISIÇÃO FINAL PARA O BUBBLE"
                    )
                except Exception as e:
                    print(f"ERRO GERAR EMENTA: {e}")
                    custom_exception_handler_wihout_api_handler(
                        e, serializer, self.axiom_instance
                    )
                    raise

            # 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 = {}
    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(
            f"COMEÇOU NOVA REQUISIÇÃO - request.data: {request.data}"
        )
        serializer = GerarDocumentoComPDFProprioSerializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
            data = cast(Dict[str, Any], serializer.validated_data)
            self.axiom_instance.send_axiom(f"data: {data}")
            self.serializer = data
            serializer_obj = serializer.get_obj()

            gerar_documento_instance = GerarDocumento(
                serializer_obj, self.axiom_instance
            )

            listaPDFs = handle_pdf_files_from_serializer(
                data["files"], self.axiom_instance
            )
            self.axiom_instance.send_axiom(f"listaPDFs: {listaPDFs}")

            all_PDFs_chunks, full_text_as_array = (
                await get_full_text_and_all_PDFs_chunks(
                    listaPDFs,
                    Splitter(serializer_obj.chunk_size, serializer_obj.chunk_overlap),
                    False,
                    False,
                )
            )
            full_text = "".join(full_text_as_array)
            self.axiom_instance.send_axiom(
                f"full_text[0:100] gerado do PDF: {full_text[0:100]}"
            )

            texto_completo = ""
            text_splitted_by_tokens = split_text_by_tokens(full_text)
            for text in text_splitted_by_tokens:
                prompt_template = PromptTemplate(
                    input_variables=["context"],
                    template=serializer_obj.prompt_gerar_documento,
                )
                texto_da_parte = await gerar_documento_instance.checar_se_resposta_vazia_do_documento_final(
                    serializer_obj.llm_ultimas_requests,
                    prompt_template.format(context=text),
                )

                texto_completo += texto_da_parte

            texto_completo_como_html = convert_markdown_to_HTML(texto_completo).replace(
                "resposta_segunda_etapa:", "<br><br>"
            )
            self.axiom_instance.send_axiom(f"resposta_llm: {texto_completo_como_html}")

            titulo_do_documento = await generate_document_title(
                cast(str, texto_completo_como_html)
            )

            remove_pdf_temp_files(listaPDFs)
            self.axiom_instance.send_axiom(
                "PRÓXIMA LINHA ENVIA A RESPOSTA A QUEM FEZ A REQUISIÇÃO"
            )

            return Response(
                {
                    "texto_completo": texto_completo_como_html,
                    "titulo_do_documento": titulo_do_documento,
                }
            )