File size: 6,451 Bytes
1fd7b67
a263183
756fca0
eebeb78
095b5f1
f8e2c8b
a263183
 
 
dc376b6
 
1286e81
12d3e1a
d07865c
 
 
d8410b4
d07865c
12d3e1a
d07865c
12d3e1a
1286e81
 
 
5ea29d8
ca8a144
eebeb78
a1c6081
a1f037d
 
 
 
 
ab34606
1fd7b67
c625f4c
 
 
1fd7b67
c625f4c
 
1fd7b67
756fca0
a1f037d
 
 
 
ab34606
a1f037d
55f46c1
c625f4c
f8e2c8b
a1f037d
f8e2c8b
 
a1f037d
f8e2c8b
93c6cb3
 
 
 
 
095b5f1
12d3e1a
756fca0
f8e2c8b
 
d8410b4
7757039
f8e2c8b
ab34606
 
 
f8e2c8b
ab34606
f8e2c8b
 
 
ab34606
 
 
f8e2c8b
ecc78bf
 
 
f8e2c8b
 
 
a263183
 
 
 
 
ab34606
 
 
a263183
 
 
 
ab34606
 
a263183
 
f8e2c8b
 
 
93c6cb3
f8e2c8b
 
 
756fca0
ab34606
f8e2c8b
d8410b4
 
 
 
a263183
 
 
f8e2c8b
ab34606
f8e2c8b
 
 
 
 
 
 
 
 
 
 
 
 
a1c6081
ab34606
 
 
a1c6081
d8410b4
 
 
 
 
 
 
 
f8e2c8b
ab34606
f8e2c8b
a1f037d
 
 
a1c6081
f8e2c8b
d8410b4
f8e2c8b
ab34606
f8e2c8b
 
a1c6081
d8410b4
f8e2c8b
 
 
 
ab34606
a1c6081
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
import os
from langchain_core.messages import HumanMessage
from typing import Any, Union, cast
from _utils.langchain_utils.LLM_class import LLM
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_relatorio_modelo_usuario.prompts import (
    prompt_gerar_query_dinamicamente,
)
from _utils.gerar_relatorio_modelo_usuario.GerarDocumento import (
    GerarDocumento,
)
from _utils.gerar_relatorio_modelo_usuario.contextual_retriever import (
    ContextualRetriever,
)
from _utils.gerar_relatorio_modelo_usuario.utils import (
    generate_document_title,
    gerar_resposta_compilada,
    get_full_text_and_all_PDFs_chunks,
    get_response_from_auxiliar_contextual_prompt,
)
from _utils.models.gerar_relatorio import (
    RetrievalConfig,
)
import markdown

from _utils.langchain_utils.Prompt_class import Prompt
from _utils.utils import convert_markdown_to_HTML
from gerar_documento.serializer import (
    GerarDocumentoComPDFProprioSerializer,
    GerarDocumentoComPDFProprioSerializerData,
    GerarDocumentoSerializerData,
)
from setup.logging import Axiom


os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_ENDPOINT"] = "https://api.smith.langchain.com"
os.environ.get("LANGCHAIN_API_KEY")
os.environ["LANGCHAIN_PROJECT"] = "VELLA"


async def gerar_documento(
    serializer: Union[
        GerarDocumentoSerializerData, GerarDocumentoComPDFProprioSerializerData, Any
    ],
    listaPDFs,
    axiom_instance: Axiom,
    isBubble=False,
):
    """Parâmetro "contexto" só deve ser passado quando quiser utilizar o teste com ragas, e assim, não quiser passar PDFs"""
    try:
        contextual_retriever = ContextualRetriever(serializer)

        # Initialize enhanced summarizer
        summarizer = GerarDocumento(serializer)

        all_PDFs_chunks, full_text_as_array = await get_full_text_and_all_PDFs_chunks(
            listaPDFs,
            summarizer.splitter,
            serializer.should_use_llama_parse,
            isBubble,
        )

        is_contextualized_chunk = serializer.should_have_contextual_chunks

        if is_contextualized_chunk:
            response_auxiliar_summary = (
                await get_response_from_auxiliar_contextual_prompt(full_text_as_array)
            )
            axiom_instance.send_axiom(
                f"RESUMO INICIAL DO PROCESSO: {response_auxiliar_summary}"
            )

            axiom_instance.send_axiom("COMEÇANDO A FAZER AS REQUISIÇÕES DO CONTEXTUAL")
            contextualized_chunks = await contextual_retriever.contextualize_all_chunks(
                all_PDFs_chunks, response_auxiliar_summary
            )
            axiom_instance.send_axiom(
                "TERMINOU DE FAZER TODAS AS REQUISIÇÕES DO CONTEXTUAL"
            )
            chunks_processados = contextualized_chunks
            axiom_instance.send_axiom(
                f"CHUNKS PROCESSADOS INICIALMENTE: {chunks_processados}"
            )
        else:
            chunks_processados = all_PDFs_chunks

        llm = LLM()
        prompt_para_gerar_query_dinamico = prompt_gerar_query_dinamicamente(
            cast(str, response_auxiliar_summary)
        )

        axiom_instance.send_axiom(
            "COMEÇANDO REQUISIÇÃO PARA GERAR O QUERY DINAMICAMENTE DO VECTOR STORE"
        )
        query_gerado_dinamicamente_para_o_vector_store = await llm.google_gemini(
            "gemini-2.5-pro-exp-03-25"
        ).ainvoke([HumanMessage(content=prompt_para_gerar_query_dinamico)])

        axiom_instance.send_axiom(
            f"query_gerado_dinamicamente_para_o_vector_store: {query_gerado_dinamicamente_para_o_vector_store.content}",
        )

        # Create enhanced vector store and BM25 index
        vector_store, bm25, chunk_ids = (
            summarizer.vector_store.create_enhanced_vector_store(
                chunks_processados, is_contextualized_chunk, axiom_instance
            )
        )

        llm_ultimas_requests = serializer.llm_ultimas_requests
        axiom_instance.send_axiom("COMEÇANDO A FAZER ÚLTIMA REQUISIÇÃO")
        structured_summaries = await summarizer.gerar_documento_final(
            vector_store,
            bm25,
            chunk_ids,
            llm_ultimas_requests,
            cast(
                str, query_gerado_dinamicamente_para_o_vector_store.content
            ),  # prompt_auxiliar_SEM_CONTEXT,
        )
        axiom_instance.send_axiom("TERMINOU DE FAZER A ÚLTIMA REQUISIÇÃO")

        if not isinstance(structured_summaries, list):
            from rest_framework.response import Response

            return Response({"erro": structured_summaries})

        texto_completo = summarizer.resumo_gerado + "\n\n"

        for x in structured_summaries:
            texto_completo = texto_completo + x["content"] + "\n"
            x["source"]["text"] = x["source"]["text"][0:200]
            x["source"]["context"] = x["source"]["context"][0:200]

        texto_completo_como_html = convert_markdown_to_HTML(texto_completo)
        axiom_instance.send_axiom(
            f"texto_completo_como_html: {texto_completo_como_html}"
        )

        if is_contextualized_chunk:
            prompt_titulo_do_documento = response_auxiliar_summary
        else:
            prompt_titulo_do_documento = texto_completo_como_html
        titulo_do_documento = await generate_document_title(
            cast(str, prompt_titulo_do_documento)
        )

        if isBubble:
            axiom_instance.send_axiom("COMEÇANDO A REQUISIÇÃO FINAL PARA O BUBBLE")
            enviar_resposta_final(
                serializer.doc_id,  # type: ignore
                serializer.form_response_id,  # type: ignore
                serializer.version,  # type: ignore
                texto_completo_como_html,
                False,
                cast(str, titulo_do_documento),
            )
            axiom_instance.send_axiom("TERMINOU A REQUISIÇÃO FINAL PARA O BUBBLE")

        return {
            "texto_completo": texto_completo_como_html,
            "titulo_do_documento": titulo_do_documento,
            "resultado": structured_summaries,
            "parametros-utilizados": gerar_resposta_compilada(serializer),
        }
    except Exception as e:
        custom_exception_handler_wihout_api_handler(e, serializer, axiom_instance)
        raise