luanpoppe commited on
Commit
a263183
·
1 Parent(s): 6e09bf4

feat: adicionando query dinamicamente

Browse files
_utils/LLMs/LLM_class.py CHANGED
@@ -1,4 +1,4 @@
1
- from typing import cast
2
  from pydantic import SecretStr
3
  from setup.environment import default_model
4
  from setup.easy_imports import ChatOpenAI, ChatGoogleGenerativeAI
@@ -22,7 +22,12 @@ class LLM:
22
  model=model,
23
  )
24
 
25
- def google_gemini(self, model="gemini-2.0-flash"):
 
 
 
 
 
26
  return ChatGoogleGenerativeAI(
27
  api_key=SecretStr(google_api_key),
28
  model=model,
 
1
+ from typing import Literal, cast
2
  from pydantic import SecretStr
3
  from setup.environment import default_model
4
  from setup.easy_imports import ChatOpenAI, ChatGoogleGenerativeAI
 
22
  model=model,
23
  )
24
 
25
+ def google_gemini(
26
+ self,
27
+ model: Literal[
28
+ "gemini-2.5-pro-exp-03-25", "gemini-2.0-flash"
29
+ ] = "gemini-2.0-flash",
30
+ ):
31
  return ChatGoogleGenerativeAI(
32
  api_key=SecretStr(google_api_key),
33
  model=model,
_utils/gerar_relatorio_modelo_usuario/prompts.py CHANGED
@@ -1,167 +1,98 @@
1
- prompt_auxiliar_do_contextual_prompt = """Você é um assistente jurídico especializado em direito brasileiro. Sua tarefa é criar um resumo conciso e informativo de um processo jurídico, de acordo com as leis do Brasil. O resumo deve focar nos momentos cruciais do processo, na última movimentação processual e nas principais movimentações que ocorreram.
2
-
3
- Aqui estão as 10 principais peças processuais em ordem cronológica do processo civil brasileiro que você deve priorizar em sua análise:
4
- 1. Petição Inicial
5
- 2. Contestação
6
- 3. Réplica
7
- 4. Decisão de Saneamento
8
- 5. Sentença
9
- 6. Recurso de Apelação
10
- 7. Embargos de Declaração
11
- 8. Cumprimento de Sentença
12
- 9. Embargos à Execução
13
- 10. Agravo de Instrumento
14
-
15
- Siga este passo a passo para criar o resumo:
16
-
17
- 1. Leia atentamente todo o processo jurídico fornecido.
18
- <processo_juridico>
19
- {PROCESSO_JURIDICO}
20
- </processo_juridico>
21
-
22
- 2. Identifique e anote as datas e conteúdos relevantes relacionados às 10 peças processuais listadas acima.
23
-
24
- 3. Organize cronologicamente as informações coletadas.
25
-
26
- 4. Destaque a última movimentação processual e seu significado para o andamento do processo.
27
-
28
- 5. Resuma as principais movimentações, focando em seu impacto no processo.
29
-
30
- 6. Elabore um texto coeso que apresente o fluxo do processo, destacando os pontos cruciais e as decisões mais importantes.
31
-
32
- Após criar o resumo inicial, utilize a técnica socrática de reflexão para garantir a precisão e completude do resumo. Faça a si mesmo as seguintes perguntas:
33
-
34
- 1. O resumo abrange todas as 10 peças processuais principais?
35
- 2. A última movimentação processual está claramente identificada e explicada?
36
- 3. O texto apresenta uma visão clara do fluxo do processo?
37
- 4. Todas as informações cruciais para o entendimento do caso estão incluídas?
38
- 5. O resumo está livre de opiniões pessoais e se atém aos fatos do processo?
39
- 6. A linguagem utilizada é clara e acessível, mesmo para quem não é especialista em direito?
40
-
41
- Revise e ajuste o resumo conforme necessário com base nessa reflexão.
42
-
43
- O resumo final deve ter no máximo 2 páginas de extensão (aproximadamente 1000 palavras).
44
-
45
- Formate sua resposta da seguinte maneira:
46
-
47
- <resumo_processo>
48
- [Insira aqui o resumo do processo jurídico]
49
- </resumo_processo>
50
-
51
- <reflexao_socratica>
52
- [Insira aqui suas respostas às perguntas da reflexão socrática]
53
- </reflexao_socratica>
54
-
55
- <resumo_final>
56
- [Insira aqui o resumo final revisado, se houver alterações após a reflexão]
57
- </resumo_final>"""
58
-
59
-
60
  def create_prompt_auxiliar_do_contextual_prompt(PROCESSO_JURIDICO: str):
61
- return f"""Você é um assistente jurídico especializado em direito brasileiro. Sua tarefa é criar um resumo conciso e informativo de um processo jurídico, de acordo com as leis do Brasil. O resumo deve focar nos momentos cruciais do processo, na última movimentação processual e nas principais movimentações que ocorreram.
62
-
63
- Aqui estão as 10 principais peças processuais em ordem cronológica do processo civil brasileiro que você deve priorizar em sua análise:
64
- 1. Petição Inicial
65
- 2. Contestação
66
- 3. Réplica
67
- 4. Decisão de Saneamento
68
- 5. Sentença
69
- 6. Recurso de Apelação
70
- 7. Embargos de Declaração
71
- 8. Cumprimento de Sentença
72
- 9. Embargos à Execução
73
- 10. Agravo de Instrumento
74
-
75
- Siga este passo a passo para criar o resumo:
76
-
77
- 1. Leia atentamente todo o processo jurídico fornecido.
78
- <processo_juridico>
79
- {PROCESSO_JURIDICO}
80
- </processo_juridico>
81
-
82
- 2. Identifique e anote as datas e conteúdos relevantes relacionados às 10 peças processuais listadas acima.
83
-
84
- 3. Organize cronologicamente as informações coletadas.
85
-
86
- 4. Destaque a última movimentação processual e seu significado para o andamento do processo.
87
-
88
- 5. Resuma as principais movimentações, focando em seu impacto no processo.
89
-
90
- 6. Elabore um texto coeso que apresente o fluxo do processo, destacando os pontos cruciais e as decisões mais importantes.
91
-
92
- Após criar o resumo inicial, utilize a técnica socrática de reflexão para garantir a precisão e completude do resumo. Faça a si mesmo as seguintes perguntas:
93
-
94
- 1. O resumo abrange todas as 10 peças processuais principais?
95
- 2. A última movimentação processual está claramente identificada e explicada?
96
- 3. O texto apresenta uma visão clara do fluxo do processo?
97
- 4. Todas as informações cruciais para o entendimento do caso estão incluídas?
98
- 5. O resumo está livre de opiniões pessoais e se atém aos fatos do processo?
99
- 6. A linguagem utilizada é clara e acessível, mesmo para quem não é especialista em direito?
100
-
101
- Revise e ajuste o resumo conforme necessário com base nessa reflexão.
102
-
103
- O resumo final deve ter no máximo 2 páginas de extensão (aproximadamente 1000 palavras).
104
-
105
- Formate sua resposta da seguinte maneira:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
106
 
107
  <resumo_processo>
108
- [Insira aqui o resumo do processo jurídico]
109
  </resumo_processo>
 
 
110
 
111
- <reflexao_socratica>
112
- [Insira aqui suas respostas às perguntas da reflexão socrática]
113
- </reflexao_socratica>
114
-
115
- <resumo_final>
116
- [Insira aqui o resumo final revisado, se houver alterações após a reflexão]
117
- </resumo_final>"""
118
-
119
-
120
- # ORIGINAL
121
- # def contextual_prompt(single_page_text, summary_text, chunk_content):
122
- # return f"""You are an AI assistant specialized in providing context for document retrieval. Your task is to analyze a chunk of text from a larger document and provide a brief context for it.
123
-
124
- # Here's the summary of the full text of the document:
125
- # <summary_text>
126
- # {summary_text}
127
- # </summary_text>
128
-
129
- # Here's the single page where the chunk is situated:
130
-
131
- # <single_page>
132
- # {single_page_text}
133
- # </single_page>
134
-
135
- # And here's the specific chunk to contextualize:
136
- # <chunk>
137
- # {chunk_content}
138
- # </chunk>
139
-
140
- # Follow these steps:
141
- # 1. Identify and quote the document ID (found between "NUM." and "- Pág") and the document name (from the header).
142
- # 2. Summarize the main topics or themes of the single page and where it fit within the summary of the full text.
143
- # 3. Identify where the specific chunk fits within these themes.
144
- # 4. Create a concise context that situates the chunk within the document.
145
-
146
- # With this informations, your response should be a single, concise paragraph that includes:
147
- # - The document ID
148
- # - The document name
149
- # - A brief context for the chunk
150
-
151
- # Example final output structure (do not copy the content, only the format):
152
- # <chunk_context>
153
- # [Single paragraph with document ID, name, and chunk context]
154
- # </chunk_context>"""
155
-
156
-
157
- # Removido do prompt abaixo após mudar para cada chunk ter 5000 caracteres:
158
- # Here are the pages where the chunks are situated:
159
- # <page>
160
- # {all_pages_contents}
161
- # </page>
162
-
163
-
164
- # 1. Identify the document ID (found between "NUM." and "- Pág") and the document name (from the header).
165
 
166
 
167
  def contextual_prompt(
@@ -203,25 +134,6 @@ Please provide context for all {numero_de_chunks} chunks, following this structu
203
  """
204
 
205
 
206
- # return f"""You are a language model tasked with providing context to improve the retrieval of information from a chunk extracted from a document. Follow these steps internally (do not display reasoning or reflection in the final output):
207
- # 1. **Chain of Thought (internal)**:
208
- # - Identify the document ID, which is the value between "NUM." and "- Pág".
209
- # - Identify the document name from the header.
210
- # 2. **Reflection (internal)**:
211
- # - Confirm the document ID and name are correctly identified.
212
- # - Ensure the final context is concise and helpful.
213
- # 3. **Final Response**:
214
- # - Provide a short context situating the *chunk* within the document, including the document ID and document name.
215
- # - Do not include any reasoning or reflection in your response.
216
- # **Example Usage:**
217
- # ```
218
- # <document> {full_text} </document>
219
- # <chunk> {chunk_content} </chunk>
220
- # Please return only the succinct context (without displaying your internal reasoning), including the document ID and the document name.
221
- # ```
222
- # """
223
-
224
-
225
  # Novo nome --> prompt-auxiliar --> Para gerar documentos (é usado como auxiliar no prompt final)
226
  prompt_auxiliar_inicio = """You are a language model specialized in producing concise and well-structured legal case summaries in Portuguese. You will receive a variable `context`, which contains information about a legal case. Your task is to read the `context` carefully and produce a summary report in Portuguese, following the specific format provided below. Do not include any additional comments or reasoning steps in your final answer."""
227
 
@@ -297,63 +209,73 @@ After composing the sentence, but before presenting it as the final answer, refl
297
 
298
 
299
  # VALOR ANTIGO DE PROMPT UTILIZADO NO QUERY DA PESQUISA POR SIMILARIDADE DO VECTOR_SEARCH
300
- # prompt_auxiliar_SEM_CONTEXT = """You are a language model specialized in producing concise and well-structured legal case summaries in Portuguese. You will receive a variable `context`, which contains information about a legal case. Your task is to read the `context` carefully and produce a summary report in Portuguese, following the specific format provided below. Do not include any additional comments or reasoning steps in your final answer.
301
- # **Instructions**:
302
- # 1. **Chain of Thought**: Before producing your final answer, you must think through and plan your summary silently, without showing this reasoning in the final output. The final answer must only contain the required formatted report and nothing else.
303
- # 2. **Reading the Context**: Extract the following information from `context`:
304
- # - The name of the defendant (réu).
305
- # - The crime they have been accused of (nome_do_crime).
306
- # - The applicable article and subsection of the Penal Code (artigo_e_inciso_do_crime).
307
- # - The date the accusation was accepted (data_do_recebimento).
308
- # - The ID of the decision document (id_do_documento).
309
- # 3. **Prescriptive Details**: If no other interruptive or suspensive causes of prescription are mentioned, confirm that there are none.
310
- # 4. **Formatting**: Your final answer must strictly follow the format below, in Portuguese, and replace the placeholders with the appropriate information:
311
- # ```
312
- # <formato>
313
- # Trata-se de Ação Penal em que o Ministério Público denunciou [nome_do_reu], pela prática do [nome_do_crime] [artigo_e_inciso_do_crime], do Código Penal.
314
- # A denúncia foi recebida em [data_do_recebimento], conforme Decisão [id_do_documento].
315
- # Não há outras causas interruptivas ou suspensivas da prescrição.
316
- # </formato>
317
- # ```
318
- # 5. **Completeness**: If any piece of required information is missing in the `context`, note that explicitly in the final answer within the format.
319
- # **Reminder**:
320
- # - Do not include your chain of thought in the final output.
321
- # - Do not add extra information or commentary beyond the specified format.
322
- # - The final answer must be in Portuguese.
323
- # ```
324
- # <formato>
325
- # Trata-se de Ação Penal em que o Ministério Público denunciou João da Silva, pela prática do furto qualificado (art. 155, §4º, inciso II do Código Penal).
326
- # A denúncia foi recebida em 12/03/2021, conforme Decisão 20210312-01.
327
- # Não outras causas interruptivas ou suspensivas da prescrição.
328
- # </formato>
329
- # """
330
-
331
-
332
- prompt_auxiliar_SEM_CONTEXT = """Busque e analise os trechos mais relevantes deste processo legal, priorizando os seguintes elementos:
333
- Identificação do Caso:
334
- Nome das partes envolvidas
335
- Jurisdição e instância processual
336
- Disputa Central:
337
- Qual é a principal controvérsia do caso?
338
- Quais são os argumentos centrais apresentados por cada parte?
339
- Peças Processuais Essenciais:
340
- Petição Inicial: Identifique os pedidos, fundamentos jurídicos e fatos alegados.
341
- Contestação: Extraia os argumentos de defesa e eventuais preliminares processuais.
342
- Réplica (se houver): Destaque contrargumentos apresentados pelo autor.
343
- Pedido e Pedido Contraposto (se aplicável): Identifique os requerimentos de ambas as partes.
344
- Provas Produzidas:
345
- Documentos apresentados pelo autor e sua relevância.
346
- Documentos apresentados pelo réu e sua relevância.
347
- Audiências Realizadas:
348
- Conciliação: Houve acordo ou resistência de alguma parte?
349
- Instrução e Julgamento: Quais testemunhas foram ouvidas? Algum elemento probatório relevante foi destacado pelo juiz?
350
- Trechos Relevantes do Caso:
351
- Extraia e organize os principais excertos do processo que sustentam a decisão.
352
- Identifique precedentes ou fundamentos jurídicos citados.
353
- Caso haja decisão judicial, sintetize o raciocínio adotado pelo magistrado.
354
-
355
- Diretrizes de Análise:
356
- Priorize passagens de maior impacto jurídico, como fundamentos da decisão e discussões centrais do caso.
357
- Evite redundâncias: Se um mesmo argumento aparece repetidamente, sintetize-o.
358
- Mantenha a hierarquia lógica da decisão: Se houver votos divergentes ou decisões parciais, destaque essas diferenças.
359
- Caso haja lacunas na documentação, identifique e sinalize a ausência de informações relevantes."""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  def create_prompt_auxiliar_do_contextual_prompt(PROCESSO_JURIDICO: str):
2
+ return f"""
3
+ <prompt>
4
+ <persona>
5
+ Você é um assistente jurídico especialista em direito processual civil brasileiro. Sua função é analisar o texto de um processo judicial, extrair informações chave e gerar um relatório estruturado.
6
+ </persona>
7
+
8
+ <tarefa>
9
+ Seu objetivo é analisar o processo jurídico fornecido e gerar um relatório conciso contendo:
10
+ 1. Uma lista explícita das peças processuais chave ou fases relevantes identificadas no texto, com base na lista expandida abaixo.
11
+ 2. Uma lista dos artigos de lei específicos mencionados ou discutidos no processo.
12
+ 3. Uma lista das jurisprudências (casos específicos, súmulas) mencionadas, com breve contexto.
13
+ 4. Um resumo detalhado do processo, narrando o fluxo dos eventos, as principais decisões, argumentos, a última movimentação relevante e garantindo um **mínimo de 2000 caracteres**.
14
+
15
+ **Peças/Fases Processuais Chave a Serem Identificadas (Multirrito):**
16
+ 1. Petição Inicial
17
+ 2. Denúncia / Queixa-Crime
18
+ 4. Auto de Prisão em Flagrante / Representação por Prisão Preventiva/Temporária
19
+ 5. Inquérito Policial (Relatório Final)
20
+ 6. Despacho Inicial / Decisão de Recebimento (ou Rejeição) da Inicial/Denúncia
21
+ 8. Audiência de Custódia (Penal)
22
+ 9. Audiência de Conciliação ou Mediação
23
+ 10. Contestação / Defesa Prévia / Resposta à Acusação / Informações da Autoridade Coatora
24
+ 11. Réplica
25
+ 12. Decisão de Saneamento e Organização do Processo
26
+ 13. Decisão de Pronúncia / Impronúncia / Absolvição Sumária (Penal)
27
+ 15. Audiência de Instrução e Julgamento
28
+ 16. Alegações Finais (Orais ou Memoriais)
29
+ 17. Parecer do Ministério Público / Parecer Jurídico
30
+ 18. Sentença / Acórdão
31
+ 19. Embargos de Declaração
32
+ 20. Recurso de Apelação (Cível/Penal) / Recurso Inominado (JEC) / Recurso Ordinário / Recurso Administrativo
33
+ 21. Contrarrazões de Recurso
34
+ 22. Agravo de Instrumento (Cível) / Recurso em Sentido Estrito (RESE - Penal) / Agravo Interno
35
+ 23. Acórdão (TJ, TRF, Turma Recursal, etc.)
36
+ 24. Recurso Especial (para o STJ)
37
+ 25. Recurso Extraordinário (para o STF)
38
+ 26. Habeas Corpus (HC) / Mandado de Segurança (MS)
39
+ 27. Trânsito em Julgado (Certidão)
40
+ 28. Cumprimento de Sentença / Início da Execução / Execução Penal
41
+ 29. Impugnação ao Cumprimento de Sentença / Embargos à Execução
42
+ 30. Incidentes da Execução Penal (Progressão de Regime, Livramento Condicional, etc.)
43
+ </tarefa>
44
+
45
+
46
+ <instrucoes>
47
+ Siga estritamente os passos abaixo:
48
+
49
+ 1. **Análise Completa:** Leia e analise todo o conteúdo do processo fornecido.
50
+ <processo_juridico>
51
+ {PROCESSO_JURIDICO}
52
+ </processo_juridico>
53
+
54
+ 2. **Identificação e Listagem de Peças:** Identifique quais das peças listadas na `<tarefa>` estão presentes no texto. Liste **apenas** as encontradas na tag `<pecas_identificadas>`.
55
+
56
+ 3. **Identificação de Artigos:** Localize e liste todos os artigos de lei (ex: "Art. 319 do CPC", "Art. 186 do Código Civil") que são explicitamente mencionados ou discutidos no processo. Liste-os na tag `<artigos_mencionados>`. Se nenhum for encontrado, indique isso claramente.
57
+
58
+ 4. **Identificação de Jurisprudência:** Localize e liste todas as menções a jurisprudências (Súmulas, Recursos Repetitivos, casos específicos como REsp, AgRg, HC, etc.). Inclua o identificador (se disponível) e um breve contexto de por que foi citada (ex: "Súmula X do STJ - sobre dano moral", "REsp 12345 - citado pela defesa sobre prescrição"). Liste-as na tag `<jurisprudencia_mencionada>`. Se nenhuma for encontrada, indique isso claramente.
59
+
60
+ 5. **Extração e Organização:** Extraia informações cruciais (datas, argumentos, pedidos, decisões) relacionadas às peças identificadas e outros eventos relevantes. Organize cronologicamente.
61
+
62
+ 6. **Destaque da Última Movimentação:** Identifique e descreva a última movimentação processual e seu impacto no estado atual do processo.
63
+
64
+ 7. **Elaboração do Resumo Detalhado:** Redija um resumo narrativo e coeso na tag `<resumo_processo>`. Descreva o fluxo processual, as partes, o pedido inicial, as defesas, as principais decisões, os argumentos chave (fazendo referência às peças, artigos e jurisprudências identificados quando relevante) e a última movimentação. **O texto final nesta tag DEVE ter no mínimo 2000 caracteres.**
65
+
66
+ 8. **Verificação Interna (Não incluir no output):** Antes de gerar a resposta final, realize uma verificação interna para garantir que:
67
+ * A lista de peças (`<pecas_identificadas>`) está correta e em formato de lista.
68
+ * As listas de artigos (`<artigos_mencionados>`) e jurisprudências (`<jurisprudencia_mencionada>`) contêm as informações solicitadas ou indicam claramente a ausência delas.
69
+ * O resumo (`<resumo_processo>`) é detalhado, cobre os pontos essenciais (incluindo última movimentação), tem fluxo lógico e **atinge o mínimo de 2000 caracteres**.
70
+ * O conteúdo é objetivo e baseado estritamente nos fatos do processo fornecido.
71
+
72
+ 9. **Geração do Output Final:** Formate a resposta final **exclusivamente** com as tags definidas em `<formato_output>`, preenchendo-as conforme as instruções acima. Não inclua nenhuma outra informação ou texto fora dessas tags.
73
+
74
+ </instrucoes>
75
+
76
+ <formato_output>
77
+ <pecas_identificadas>
78
+ [Liste aqui, usando marcadores ou numeração, APENAS as peças processuais da lista expandida que foram encontradas no processo.]
79
+ </pecas_identificadas>
80
+
81
+ <artigos_mencionados>
82
+ [Liste aqui os artigos de lei identificados (ex: Art. X da Lei Y). Se nenhum for encontrado, escreva: "Nenhum artigo de lei foi explicitamente mencionado ou discutido de forma relevante no trecho analisado."]
83
+ </artigos_mencionados>
84
+
85
+ <jurisprudencia_mencionada>
86
+ [Liste aqui as jurisprudências identificadas com breve contexto (ex: Súmula Z do Tribunal W - citada sobre tema A; REsp 98765 - mencionado pela parte B sobre questão C). Se nenhuma for encontrada, escreva: "Nenhuma jurisprudência foi explicitamente mencionada ou discutida de forma relevante no trecho analisado."]
87
+ </jurisprudencia_mencionada>
88
 
89
  <resumo_processo>
90
+ [Insira aqui o resumo detalhado e narrativo do processo jurídico, com no mínimo 2000 caracteres, conforme instrução 7.]
91
  </resumo_processo>
92
+ </formato_output>
93
+ </prompt>
94
 
95
+ """
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96
 
97
 
98
  def contextual_prompt(
 
134
  """
135
 
136
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
137
  # Novo nome --> prompt-auxiliar --> Para gerar documentos (é usado como auxiliar no prompt final)
138
  prompt_auxiliar_inicio = """You are a language model specialized in producing concise and well-structured legal case summaries in Portuguese. You will receive a variable `context`, which contains information about a legal case. Your task is to read the `context` carefully and produce a summary report in Portuguese, following the specific format provided below. Do not include any additional comments or reasoning steps in your final answer."""
139
 
 
209
 
210
 
211
  # VALOR ANTIGO DE PROMPT UTILIZADO NO QUERY DA PESQUISA POR SIMILARIDADE DO VECTOR_SEARCH
212
+ # prompt_auxiliar_SEM_CONTEXT = """Busque e analise os trechos mais relevantes deste processo legal, priorizando os seguintes elementos:
213
+ # Identificação do Caso:
214
+ # Nome das partes envolvidas
215
+ # Jurisdição e instância processual
216
+ # Disputa Central:
217
+ # Qual é a principal controvérsia do caso?
218
+ # Quais são os argumentos centrais apresentados por cada parte?
219
+ # Peças Processuais Essenciais:
220
+ # Petição Inicial: Identifique os pedidos, fundamentos jurídicos e fatos alegados.
221
+ # Contestação: Extraia os argumentos de defesa e eventuais preliminares processuais.
222
+ # Réplica (se houver): Destaque contrargumentos apresentados pelo autor.
223
+ # Pedido e Pedido Contraposto (se aplicável): Identifique os requerimentos de ambas as partes.
224
+ # Provas Produzidas:
225
+ # Documentos apresentados pelo autor e sua relevância.
226
+ # Documentos apresentados pelo réu e sua relevância.
227
+ # Audiências Realizadas:
228
+ # Conciliação: Houve acordo ou resistência de alguma parte?
229
+ # Instrução e Julgamento: Quais testemunhas foram ouvidas? Algum elemento probatório relevante foi destacado pelo juiz?
230
+ # Trechos Relevantes do Caso:
231
+ # Extraia e organize os principais excertos do processo que sustentam a decisão.
232
+ # Identifique precedentes ou fundamentos jurídicos citados.
233
+ # Caso haja decisão judicial, sintetize o raciocínio adotado pelo magistrado.
234
+
235
+ # Diretrizes de Análise:
236
+ # Priorize passagens de maior impacto jurídico, como fundamentos da decisão e discussões centrais do caso.
237
+ # Evite redundâncias: Se um mesmo argumento aparece repetidamente, sintetize-o.
238
+ # Mantenha a hierarquia lógica da decisão: Se houver votos divergentes ou decisões parciais, destaque essas diferenças.
239
+ # Caso haja lacunas na documentação, identifique e sinalize a ausência de informações relevantes."""
240
+
241
+
242
+ def prompt_gerar_query_dinamicamente(resumo_do_processo: str):
243
+ return f"""
244
+ - *Seu Papel:** Você é um assistente de IA especializado em análise de processos judiciais brasileiros.
245
+ - *Contexto:** Você receberá informações parciais ou as peças mais recentes de um processo judicial brasileiro dentro de uma variável chamada `context`.
246
+
247
+ {resumo_do_processo}
248
+
249
+ - *Sua Tarefa:**
250
+
251
+ 1.  **Analise internamente (não inclua na saída):** Identifique o tipo de processo (Cível, Criminal, Trabalhista, etc.) e a fase processual atual (Inicial, Instrução, Decisão, Recursal, etc.) com base no `context`. Use essa análise para informar a criação da query.
252
+
253
+ 2.  **Gere uma Query para Vector Store (ChromaDB):** Com base na sua análise do `context`, crie um prompt de consulta (query) em **linguagem natural e em português**. Este prompt será usado para buscar documentos em uma base de dados vetorial (ChromaDB) que contém **todas** as peças do processo referenciado no `context`. O objetivo desta query é recuperar as **principais peças processuais indispensáveis** para que um juiz brasileiro possa analisar e proferir uma decisão de mérito (sentença) ou uma decisão importante equivalente. A query deve ser formulada para buscar semanticamente por documentos como:
254
+
255
+ * Petição Inicial (completa, com causa de pedir e pedidos)
256
+
257
+ * Comprovação da Citação válida
258
+
259
+ * Contestação (completa, com todas as defesas e eventuais reconvenções)
260
+
261
+ * Réplica à contestação (se houver e for relevante)
262
+
263
+ * Decisão de Saneamento e Organização do Processo (se houver)
264
+
265
+ * Provas cruciais produzidas (Ex: laudos periciais integrais, atas de audiência de instrução com depoimentos chave, documentos essenciais juntados pelas partes)
266
+
267
+ * Alegações Finais ou Memoriais das partes
268
+
269
+ * Parecer do Ministério Público (quando obrigatório ou relevante)
270
+
271
+ * Decisões interlocutórias anteriores que definiram pontos importantes.
272
+
273
+ * *A query deve priorizar o conjunto documental essencial para o juiz formar sua convicção para julgamento, excluindo peças de mero expediente ou rotineiras.*
274
+
275
+ - *Formato da Saída:** Apresente **APENAS e EXCLUSIVAMENTE** o texto da query em linguagem natural que você gerou para a busca na vector store (ChromaDB). Não inclua nenhuma outra informação, texto introdutório, cabeçalhos, ou as análises internas de tipo/fase do processo.
276
+ - *Exemplo de Saída Esperada (APENAS o formato, NÃO o conteúdo exato):**
277
+
278
+ `Recuperar peças processuais fundamentais deste caso, incluindo petição inicial, contestação, provas determinantes como laudos e depoimentos, e manifestações finais das partes, necessárias para o julgamento pelo juiz.`
279
+
280
+ - *Importante:** Sua resposta final deve ser *somente* a string da query.
281
+ """
_utils/gerar_relatorio_modelo_usuario/utils.py CHANGED
@@ -95,6 +95,7 @@ async def get_response_from_auxiliar_contextual_prompt(full_text_as_array: List[
95
  full_text += x
96
 
97
  print("\nCRIANDO PROMPT AUXILIAR DO CONTEXTUAL")
 
98
  prompt_auxiliar_summary = create_prompt_auxiliar_do_contextual_prompt(full_text)
99
 
100
  print("\n\nprompt_auxiliar_summary[0:500]: ", prompt_auxiliar_summary[0:500])
 
95
  full_text += x
96
 
97
  print("\nCRIANDO PROMPT AUXILIAR DO CONTEXTUAL")
98
+ # PROMPT PARA GERAR O RESUMO INICIAL DO PROCESSO
99
  prompt_auxiliar_summary = create_prompt_auxiliar_do_contextual_prompt(full_text)
100
 
101
  print("\n\nprompt_auxiliar_summary[0:500]: ", prompt_auxiliar_summary[0:500])
_utils/resumo_completo_cursor.py CHANGED
@@ -1,8 +1,12 @@
1
  import os
 
2
  from typing import cast
 
3
  from _utils.bubble_integrations.enviar_resposta_final import enviar_resposta_final
4
  from _utils.custom_exception_handler import custom_exception_handler_wihout_api_handler
5
- from _utils.gerar_relatorio_modelo_usuario.prompts import prompt_auxiliar_SEM_CONTEXT
 
 
6
  from _utils.gerar_relatorio_modelo_usuario.GerarDocumento import (
7
  GerarDocumento,
8
  )
@@ -20,6 +24,7 @@ from _utils.models.gerar_relatorio import (
20
  )
21
  import markdown
22
 
 
23
  from _utils.utils import convert_markdown_to_HTML
24
 
25
 
@@ -104,6 +109,21 @@ async def get_llm_summary_answer_by_cursor_complete(
104
  else:
105
  chunks_processados = all_PDFs_chunks
106
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
107
  # Create enhanced vector store and BM25 index
108
  vector_store, bm25, chunk_ids = (
109
  summarizer.vector_store.create_enhanced_vector_store(
@@ -118,7 +138,9 @@ async def get_llm_summary_answer_by_cursor_complete(
118
  bm25,
119
  chunk_ids,
120
  llm_ultimas_requests,
121
- prompt_auxiliar_SEM_CONTEXT,
 
 
122
  )
123
  print("\nTERMINOU DE FAZER A ÚLTIMA REQUISIÇÃO")
124
 
 
1
  import os
2
+ from langchain_core.messages import HumanMessage
3
  from typing import cast
4
+ from _utils.LLMs.LLM_class import LLM
5
  from _utils.bubble_integrations.enviar_resposta_final import enviar_resposta_final
6
  from _utils.custom_exception_handler import custom_exception_handler_wihout_api_handler
7
+ from _utils.gerar_relatorio_modelo_usuario.prompts import (
8
+ prompt_gerar_query_dinamicamente,
9
+ )
10
  from _utils.gerar_relatorio_modelo_usuario.GerarDocumento import (
11
  GerarDocumento,
12
  )
 
24
  )
25
  import markdown
26
 
27
+ from _utils.prompts.Prompt_class import Prompt
28
  from _utils.utils import convert_markdown_to_HTML
29
 
30
 
 
109
  else:
110
  chunks_processados = all_PDFs_chunks
111
 
112
+ llm = LLM()
113
+ prompt_para_gerar_query_dinamico = prompt_gerar_query_dinamicamente(
114
+ cast(str, response_auxiliar_summary)
115
+ )
116
+
117
+ print("\nCOMEÇANDO REQUISIÇÃO PARA GERAR O QUERY DINAMICAMENTE DO VECTOR STORE")
118
+ query_gerado_dinamicamente_para_o_vector_store = await llm.google_gemini(
119
+ "gemini-2.5-pro-exp-03-25"
120
+ ).ainvoke([HumanMessage(content=prompt_para_gerar_query_dinamico)])
121
+
122
+ print(
123
+ "\nquery_gerado_dinamicamente_para_o_vector_store: ",
124
+ query_gerado_dinamicamente_para_o_vector_store.content,
125
+ )
126
+
127
  # Create enhanced vector store and BM25 index
128
  vector_store, bm25, chunk_ids = (
129
  summarizer.vector_store.create_enhanced_vector_store(
 
138
  bm25,
139
  chunk_ids,
140
  llm_ultimas_requests,
141
+ cast(
142
+ str, query_gerado_dinamicamente_para_o_vector_store.content
143
+ ), # prompt_auxiliar_SEM_CONTEXT,
144
  )
145
  print("\nTERMINOU DE FAZER A ÚLTIMA REQUISIÇÃO")
146
 
gerar_documento/serializer.py CHANGED
@@ -4,6 +4,7 @@ from _utils.gerar_relatorio_modelo_usuario.prompts import (
4
  prompt_gerar_documento,
5
  prompt_auxiliar_padrao,
6
  )
 
7
 
8
  user_message = "What are the main points of this document?"
9
 
@@ -53,6 +54,7 @@ class GerarDocumentoSerializer(ResumoCursorSerializer):
53
  form_response_id = serializers.CharField(required=True)
54
  version = serializers.CharField(required=True)
55
 
 
56
  class GerarDocumentoComPDFProprioSerializer(ResumoCursorSerializer):
57
  system_prompt = None
58
  # prompt_auxiliar = serializers.CharField(
@@ -80,3 +82,16 @@ class GerarDocumentoComPDFProprioSerializer(ResumoCursorSerializer):
80
  should_have_contextual_chunks = serializers.BooleanField(default=False) # type: ignore
81
  should_use_llama_parse = serializers.BooleanField(required=False, default=False) # type: ignore
82
  llm_ultimas_requests = serializers.CharField(required=False, default="gpt-4o-mini")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  prompt_gerar_documento,
5
  prompt_auxiliar_padrao,
6
  )
7
+ from setup.environment import default_model
8
 
9
  user_message = "What are the main points of this document?"
10
 
 
54
  form_response_id = serializers.CharField(required=True)
55
  version = serializers.CharField(required=True)
56
 
57
+
58
  class GerarDocumentoComPDFProprioSerializer(ResumoCursorSerializer):
59
  system_prompt = None
60
  # prompt_auxiliar = serializers.CharField(
 
82
  should_have_contextual_chunks = serializers.BooleanField(default=False) # type: ignore
83
  should_use_llama_parse = serializers.BooleanField(required=False, default=False) # type: ignore
84
  llm_ultimas_requests = serializers.CharField(required=False, default="gpt-4o-mini")
85
+
86
+
87
+ class GerarEmentaSerializer(serializers.Serializer):
88
+ files = serializers.ListField(child=FileInfoSerializer(), required=True)
89
+ user_message = serializers.CharField(required=False, default="")
90
+ chunk_size = serializers.IntegerField(required=False, default=3500)
91
+ chunk_overlap = serializers.IntegerField(required=False, default=800)
92
+ bubble_editor_version = serializers.CharField(
93
+ required=False, default="version-test"
94
+ ) # Será o valor utilizado dentro da URL da requisição pro Bubble
95
+ doc_id = serializers.CharField(required=True)
96
+ form_response_id = serializers.CharField(required=True)
97
+ version = serializers.CharField(required=True)
gerar_documento/views.py CHANGED
@@ -1,4 +1,10 @@
1
  from typing import Any, Dict, cast
 
 
 
 
 
 
2
  from setup.easy_imports import (
3
  Response,
4
  AsyncAPIView,
@@ -15,8 +21,10 @@ from _utils.gerar_relatorio_modelo_usuario.prompts import prompt_auxiliar_inicio
15
  from .serializer import (
16
  GerarDocumentoComPDFProprioSerializer,
17
  GerarDocumentoSerializer,
 
18
  )
19
  import asyncio
 
20
 
21
 
22
  class GerarDocumentoView(AsyncAPIView):
@@ -28,12 +36,12 @@ class GerarDocumentoView(AsyncAPIView):
28
  )
29
  async def post(self, request):
30
  print(f"\n\nDATA E HORA DA REQUISIÇÃO: {datetime.now()}")
31
- print('request.data: ', request.data)
32
  serializer = GerarDocumentoSerializer(data=request.data)
33
  if serializer.is_valid(raise_exception=True):
34
  if not serializer.validated_data:
35
  raise ValueError("Erro no validated_data")
36
-
37
  async def proccess_data_after_response():
38
  # await asyncio.sleep(0)
39
  data = cast(Dict[str, Any], serializer.validated_data)
@@ -57,12 +65,16 @@ class GerarDocumentoView(AsyncAPIView):
57
  # remove_pdf_temp_files(listaPDFs)
58
 
59
  # print("PRÓXIMA LINHA ENVIA A RESPOSTA A QUEM FEZ A REQUISIÇÃO")
60
-
61
  # asyncio.create_task(proccess_data_after_response())
62
  loop = asyncio.get_running_loop()
63
- loop.run_in_executor(None, lambda: asyncio.run(proccess_data_after_response()))
64
-
65
- return Response({"resposta": "Requisição está sendo processada em segundo plano"})
 
 
 
 
66
 
67
 
68
  class GerarDocumentoComPDFProprioView(AsyncAPIView):
@@ -90,3 +102,101 @@ class GerarDocumentoComPDFProprioView(AsyncAPIView):
90
  remove_pdf_temp_files(listaPDFs)
91
  print("PRÓXIMA LINHA ENVIA A RESPOSTA A QUEM FEZ A REQUISIÇÃO")
92
  return Response({"resposta": resposta_llm})
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  from typing import Any, Dict, cast
2
+ from langchain.prompts import PromptTemplate
3
+ from _utils.LLMs.LLM_class import LLM
4
+ from _utils.gerar_relatorio_modelo_usuario.utils import (
5
+ get_full_text_and_all_PDFs_chunks,
6
+ )
7
+ from _utils.prompts.Prompt_class import Prompt
8
  from setup.easy_imports import (
9
  Response,
10
  AsyncAPIView,
 
21
  from .serializer import (
22
  GerarDocumentoComPDFProprioSerializer,
23
  GerarDocumentoSerializer,
24
+ GerarEmentaSerializer,
25
  )
26
  import asyncio
27
+ from _utils.splitters.Splitter_class import Splitter
28
 
29
 
30
  class GerarDocumentoView(AsyncAPIView):
 
36
  )
37
  async def post(self, request):
38
  print(f"\n\nDATA E HORA DA REQUISIÇÃO: {datetime.now()}")
39
+ print("request.data: ", request.data)
40
  serializer = GerarDocumentoSerializer(data=request.data)
41
  if serializer.is_valid(raise_exception=True):
42
  if not serializer.validated_data:
43
  raise ValueError("Erro no validated_data")
44
+
45
  async def proccess_data_after_response():
46
  # await asyncio.sleep(0)
47
  data = cast(Dict[str, Any], serializer.validated_data)
 
65
  # remove_pdf_temp_files(listaPDFs)
66
 
67
  # print("PRÓXIMA LINHA ENVIA A RESPOSTA A QUEM FEZ A REQUISIÇÃO")
68
+
69
  # asyncio.create_task(proccess_data_after_response())
70
  loop = asyncio.get_running_loop()
71
+ loop.run_in_executor(
72
+ None, lambda: asyncio.run(proccess_data_after_response())
73
+ )
74
+
75
+ return Response(
76
+ {"resposta": "Requisição está sendo processada em segundo plano"}
77
+ )
78
 
79
 
80
  class GerarDocumentoComPDFProprioView(AsyncAPIView):
 
102
  remove_pdf_temp_files(listaPDFs)
103
  print("PRÓXIMA LINHA ENVIA A RESPOSTA A QUEM FEZ A REQUISIÇÃO")
104
  return Response({"resposta": resposta_llm})
105
+
106
+
107
+ class GerarEmentaView(AsyncAPIView):
108
+ serializer = {}
109
+
110
+ @extend_schema(
111
+ request=GerarDocumentoSerializer,
112
+ )
113
+ async def post(self, request):
114
+ print(f"\n\nDATA E HORA DA REQUISIÇÃO: {datetime.now()}")
115
+ print("request.data: ", request.data)
116
+ serializer = GerarEmentaSerializer(data=request.data)
117
+ if serializer.is_valid(raise_exception=True):
118
+ if not serializer.validated_data:
119
+ raise ValueError("Erro no validated_data")
120
+
121
+ async def proccess_data_after_response():
122
+ data = cast(Dict[str, Any], serializer.validated_data)
123
+ self.serializer = data
124
+
125
+ listaPDFs = [l["link_arquivo"] for l in data["files"]]
126
+ print("\n\nlistaPDFs: ", listaPDFs)
127
+
128
+ all_PDFs_chunks, full_text_as_array = (
129
+ await get_full_text_and_all_PDFs_chunks(
130
+ listaPDFs,
131
+ Splitter(data["chunk_size"], data["chunk_overlap"]),
132
+ False,
133
+ True,
134
+ )
135
+ )
136
+ full_text = "".join(full_text_as_array)
137
+
138
+ llm = LLM()
139
+ prompt_template = PromptTemplate(
140
+ input_variables=["context"], template=full_text
141
+ )
142
+ response = await llm.google_gemini().ainvoke(
143
+ prompt_template.format(context=full_text)
144
+ )
145
+
146
+ print("\n\nresposta_llm: ", response.content)
147
+
148
+ # asyncio.create_task(proccess_data_after_response())
149
+ loop = asyncio.get_running_loop()
150
+ loop.run_in_executor(
151
+ None, lambda: asyncio.run(proccess_data_after_response())
152
+ )
153
+
154
+ return Response(
155
+ {"resposta": "Requisição está sendo processada em segundo plano"}
156
+ )
157
+
158
+
159
+ class GerarEmentaComPDFProprioView(AsyncAPIView):
160
+ parser_classes = [MultiPartParser]
161
+ serializer = {}
162
+
163
+ @extend_schema(
164
+ request=GerarDocumentoComPDFProprioSerializer,
165
+ )
166
+ async def post(self, request):
167
+ print(f"\n\nDATA E HORA DA REQUISIÇÃO: {datetime.now()}")
168
+ serializer = GerarDocumentoComPDFProprioSerializer(data=request.data)
169
+ if serializer.is_valid(raise_exception=True):
170
+ data = cast(Dict[str, Any], serializer.validated_data)
171
+ print("\n\ndata: ", data)
172
+ self.serializer = data
173
+
174
+ data = cast(Dict[str, Any], serializer.validated_data)
175
+ self.serializer = data
176
+
177
+ listaPDFs = [l["link_arquivo"] for l in data["files"]]
178
+ print("\n\nlistaPDFs: ", listaPDFs)
179
+
180
+ all_PDFs_chunks, full_text_as_array = (
181
+ await get_full_text_and_all_PDFs_chunks(
182
+ listaPDFs,
183
+ Splitter(data["chunk_size"], data["chunk_overlap"]),
184
+ False,
185
+ True,
186
+ )
187
+ )
188
+ full_text = "".join(full_text_as_array)
189
+
190
+ llm = LLM()
191
+ prompt_template = PromptTemplate(
192
+ input_variables=["context"], template=full_text
193
+ )
194
+ response = await llm.google_gemini().ainvoke(
195
+ prompt_template.format(context=full_text)
196
+ )
197
+
198
+ print("\n\nresposta_llm: ", response.content)
199
+
200
+ remove_pdf_temp_files(listaPDFs)
201
+ print("PRÓXIMA LINHA ENVIA A RESPOSTA A QUEM FEZ A REQUISIÇÃO")
202
+ return Response({"resposta": response.content})