luanpoppe commited on
Commit
d8410b4
·
1 Parent(s): 2776b52

feat: adicionando a geração do título do documento

Browse files
_utils/bubble_integrations/enviar_resposta_final.py CHANGED
@@ -1,7 +1,15 @@
1
  import requests
2
  import os
3
 
4
- def enviar_resposta_final(doc_id: str, form_response_id: str, version: str, texto_completo: str, error: bool = False):
 
 
 
 
 
 
 
 
5
  url = f"https://vella.app.br/version-{version}/api/1.1/wf/texto_completo"
6
  headers = {"Authorization": f"Bearer {os.environ.get("BUBBLE_TOKEN")}"}
7
 
@@ -10,5 +18,6 @@ def enviar_resposta_final(doc_id: str, form_response_id: str, version: str, text
10
  "form_response_id": form_response_id,
11
  "texto_completo": texto_completo,
12
  "erro": error,
 
13
  }
14
  return requests.post(url, body, headers=headers)
 
1
  import requests
2
  import os
3
 
4
+
5
+ def enviar_resposta_final(
6
+ doc_id: str,
7
+ form_response_id: str,
8
+ version: str,
9
+ texto_completo: str,
10
+ error: bool = False,
11
+ titulo_do_documento: str = "Erro ao gerar documento",
12
+ ):
13
  url = f"https://vella.app.br/version-{version}/api/1.1/wf/texto_completo"
14
  headers = {"Authorization": f"Bearer {os.environ.get("BUBBLE_TOKEN")}"}
15
 
 
18
  "form_response_id": form_response_id,
19
  "texto_completo": texto_completo,
20
  "erro": error,
21
+ "titulo_do_documento": titulo_do_documento,
22
  }
23
  return requests.post(url, body, headers=headers)
_utils/gerar_relatorio_modelo_usuario/llm_calls.py CHANGED
@@ -1,4 +1,5 @@
1
  import os
 
2
 
3
  from pydantic import SecretStr
4
  from _utils.LLMs.LLM_class import LLM
@@ -54,7 +55,7 @@ def gpt_answer(
54
  else:
55
  return response.content
56
 
57
- async def agemini_answer(prompt, model="gemini-2.0-flash"):
58
  gemini = llm.google_gemini(model)
59
  resposta = await gemini.ainvoke([HumanMessage(content=prompt)])
60
  return resposta.content
 
1
  import os
2
+ from typing import Literal
3
 
4
  from pydantic import SecretStr
5
  from _utils.LLMs.LLM_class import LLM
 
55
  else:
56
  return response.content
57
 
58
+ async def agemini_answer(prompt, model: Literal["gemini-2.0-flash", "gemini-2.0-flash-lite"]="gemini-2.0-flash"):
59
  gemini = llm.google_gemini(model)
60
  resposta = await gemini.ainvoke([HumanMessage(content=prompt)])
61
  return resposta.content
_utils/gerar_relatorio_modelo_usuario/utils.py CHANGED
@@ -2,6 +2,7 @@ from typing import List, Tuple
2
  from langchain_core.documents import Document
3
  from langchain_core.messages import HumanMessage
4
 
 
5
  from _utils.splitters.Splitter_class import Splitter
6
  from _utils.LLMs.LLM_class import LLM
7
  from _utils.gerar_relatorio_modelo_usuario.prompts import (
@@ -33,26 +34,28 @@ def gerar_resposta_compilada(serializer):
33
  "prompt_gerar_documento": serializer["prompt_gerar_documento"][0:200],
34
  }
35
 
 
36
  def check_regex_patterns(context: str, lista_de_document_ids: List[int]):
37
  patterns = [
38
  # r"\[*([\d.\-]+)\]*\s*---\s*\[*([^]]+)\]*\s*---\s*\[*([^]]+)\]*\s*</chunk_context>", # PRIMEIRO DE TODOS
39
  # r"<chunk_context>\s*([\d.\-]+)\s*---\s*([^<]+)\s*---\s*([^<]+)\s*</chunk_context>",
40
  r"<chunk_context>\s*(\d+)(?:\s*-\s*Pág\.\s*\d+)?\s*---\s*([^-\n]+)\s*---\s*([^<]+)</chunk_context>",
41
- r"<chunk_context>\s*(?:\[*([\d]+)\]*\s*[-–]*\s*(?:Pág\.\s*\d+\s*[-–]*)?)?\s*\[*([^\]]+)\]*\s*[-–]*\s*\[*([^\]]+)\]*\s*[-–]*\s*\[*([^\]]+)\]*\s*</chunk_context>"
42
  # r"\[([\d.\-]+)\]\s*---\s*\[([^]]+)\]\s*---\s*\[([^]]+)\]\s*</chunk_context>",
43
  # r"<chunk_context>\s*\[?([\d.\-]+)\]?\s*---\s*\[?([^\]\[]+?)\]?\s*---\s*\[?([^<]+?)\]?\s*</chunk_context>",
44
  # r"<chunk_context>\s*\[([\d.\-]+)\]\s*---\s*\[([^\]]+)\]\s*---\s*\[([^\]]+)\]\s*</chunk_context>"
45
  # r"<chunk_context>\s*\[?([\d.\-\s]+)\]?\s*---\s*\[?([^\]\[]+?)\]?\s*---\s*\[?([\s\S]+?)\]?\s*</chunk_context>",
46
  ]
47
-
48
  for pattern in patterns:
49
  matches = re.findall(pattern, context, re.DOTALL)
50
  if len(matches) == len(lista_de_document_ids):
51
  print("\n--------------- REGEX DO CONTEXTUAL FUNCIONOU")
52
  break
53
-
54
  return matches
55
 
 
56
  def validate_many_chunks_in_one_request(
57
  response: str, lista_de_document_ids: List[int]
58
  ):
@@ -134,3 +137,9 @@ async def get_full_text_and_all_PDFs_chunks(
134
  all_PDFs_chunks = all_PDFs_chunks + chunks
135
 
136
  return all_PDFs_chunks, pages
 
 
 
 
 
 
 
2
  from langchain_core.documents import Document
3
  from langchain_core.messages import HumanMessage
4
 
5
+ from _utils.gerar_relatorio_modelo_usuario.llm_calls import agemini_answer
6
  from _utils.splitters.Splitter_class import Splitter
7
  from _utils.LLMs.LLM_class import LLM
8
  from _utils.gerar_relatorio_modelo_usuario.prompts import (
 
34
  "prompt_gerar_documento": serializer["prompt_gerar_documento"][0:200],
35
  }
36
 
37
+
38
  def check_regex_patterns(context: str, lista_de_document_ids: List[int]):
39
  patterns = [
40
  # r"\[*([\d.\-]+)\]*\s*---\s*\[*([^]]+)\]*\s*---\s*\[*([^]]+)\]*\s*</chunk_context>", # PRIMEIRO DE TODOS
41
  # r"<chunk_context>\s*([\d.\-]+)\s*---\s*([^<]+)\s*---\s*([^<]+)\s*</chunk_context>",
42
  r"<chunk_context>\s*(\d+)(?:\s*-\s*Pág\.\s*\d+)?\s*---\s*([^-\n]+)\s*---\s*([^<]+)</chunk_context>",
43
+ r"<chunk_context>\s*(?:\[*([\d]+)\]*\s*[-–]*\s*(?:Pág\.\s*\d+\s*[-–]*)?)?\s*\[*([^\]]+)\]*\s*[-–]*\s*\[*([^\]]+)\]*\s*[-–]*\s*\[*([^\]]+)\]*\s*</chunk_context>",
44
  # r"\[([\d.\-]+)\]\s*---\s*\[([^]]+)\]\s*---\s*\[([^]]+)\]\s*</chunk_context>",
45
  # r"<chunk_context>\s*\[?([\d.\-]+)\]?\s*---\s*\[?([^\]\[]+?)\]?\s*---\s*\[?([^<]+?)\]?\s*</chunk_context>",
46
  # r"<chunk_context>\s*\[([\d.\-]+)\]\s*---\s*\[([^\]]+)\]\s*---\s*\[([^\]]+)\]\s*</chunk_context>"
47
  # r"<chunk_context>\s*\[?([\d.\-\s]+)\]?\s*---\s*\[?([^\]\[]+?)\]?\s*---\s*\[?([\s\S]+?)\]?\s*</chunk_context>",
48
  ]
49
+
50
  for pattern in patterns:
51
  matches = re.findall(pattern, context, re.DOTALL)
52
  if len(matches) == len(lista_de_document_ids):
53
  print("\n--------------- REGEX DO CONTEXTUAL FUNCIONOU")
54
  break
55
+
56
  return matches
57
 
58
+
59
  def validate_many_chunks_in_one_request(
60
  response: str, lista_de_document_ids: List[int]
61
  ):
 
137
  all_PDFs_chunks = all_PDFs_chunks + chunks
138
 
139
  return all_PDFs_chunks, pages
140
+
141
+
142
+ async def generate_document_title(resumo_para_gerar_titulo: str):
143
+ prompt = f"Você é um assistente jurídico e irá receber abaixo o resumo de um documento jurídico. Quero que você gere um título para este documento. Mande como resposta apenas o título gerado, nada mais. Aqui está um título de exemplo pra você se basear ao criar um novo: <titulo_de_exemplo>Ação Penal por Furto Qualificado nº 0002269-86.2009.805.0032<titulo_de_exemplo>\n\nSegue abaixo o resumo do documento jurídico:\n{resumo_para_gerar_titulo}"
144
+ response = await agemini_answer(prompt, "gemini-2.0-flash-lite")
145
+ return response
_utils/resumo_completo_cursor.py CHANGED
@@ -1,4 +1,5 @@
1
  import os
 
2
  from _utils.bubble_integrations.enviar_resposta_final import enviar_resposta_final
3
  from _utils.custom_exception_handler import custom_exception_handler_wihout_api_handler
4
  from _utils.gerar_relatorio_modelo_usuario.prompts import prompt_auxiliar_SEM_CONTEXT
@@ -9,6 +10,7 @@ from _utils.gerar_relatorio_modelo_usuario.contextual_retriever import (
9
  ContextualRetriever,
10
  )
11
  from _utils.gerar_relatorio_modelo_usuario.utils import (
 
12
  gerar_resposta_compilada,
13
  get_full_text_and_all_PDFs_chunks,
14
  get_response_from_auxiliar_contextual_prompt,
@@ -20,6 +22,7 @@ import markdown
20
 
21
  from _utils.utils import convert_markdown_to_HTML
22
 
 
23
  def reciprocal_rank_fusion(result_lists, weights=None):
24
  """Combine multiple ranked lists using reciprocal rank fusion"""
25
  fused_scores = {}
@@ -79,14 +82,17 @@ async def get_llm_summary_answer_by_cursor_complete(
79
  )
80
 
81
  all_PDFs_chunks, full_text_as_array = await get_full_text_and_all_PDFs_chunks(
82
- listaPDFs, summarizer.splitter, serializer["should_use_llama_parse"], isBubble
 
 
 
83
  )
84
 
85
  is_contextualized_chunk = serializer["should_have_contextual_chunks"]
86
 
87
  if is_contextualized_chunk:
88
- response_auxiliar_summary = await get_response_from_auxiliar_contextual_prompt(
89
- full_text_as_array
90
  )
91
 
92
  print("\nCOMEÇANDO A FAZER AS REQUISIÇÕES DO CONTEXTUAL")
@@ -108,7 +114,11 @@ async def get_llm_summary_answer_by_cursor_complete(
108
  llm_ultimas_requests = serializer["llm_ultimas_requests"]
109
  print("\nCOMEÇANDO A FAZER ÚLTIMA REQUISIÇÃO")
110
  structured_summaries = await summarizer.gerar_documento_final(
111
- vector_store, bm25, chunk_ids, llm_ultimas_requests, prompt_auxiliar_SEM_CONTEXT
 
 
 
 
112
  )
113
  print("\nTERMINOU DE FAZER A ÚLTIMA REQUISIÇÃO")
114
 
@@ -127,6 +137,14 @@ async def get_llm_summary_answer_by_cursor_complete(
127
  texto_completo_como_html = convert_markdown_to_HTML(texto_completo)
128
  print("\ntexto_completo_como_html", texto_completo_como_html)
129
 
 
 
 
 
 
 
 
 
130
  if isBubble:
131
  print("COMEÇANDO A REQUISIÇÃO FINAL PARA O BUBBLE")
132
  enviar_resposta_final(
@@ -135,11 +153,13 @@ async def get_llm_summary_answer_by_cursor_complete(
135
  serializer["version"],
136
  texto_completo_como_html,
137
  False,
 
138
  )
139
  print("TERMINOU A REQUISIÇÃO FINAL PARA O BUBBLE")
140
 
141
  return {
142
  "texto_completo": texto_completo_como_html,
 
143
  "resultado": structured_summaries,
144
  "parametros-utilizados": gerar_resposta_compilada(serializer),
145
  }
 
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
 
10
  ContextualRetriever,
11
  )
12
  from _utils.gerar_relatorio_modelo_usuario.utils import (
13
+ generate_document_title,
14
  gerar_resposta_compilada,
15
  get_full_text_and_all_PDFs_chunks,
16
  get_response_from_auxiliar_contextual_prompt,
 
22
 
23
  from _utils.utils import convert_markdown_to_HTML
24
 
25
+
26
  def reciprocal_rank_fusion(result_lists, weights=None):
27
  """Combine multiple ranked lists using reciprocal rank fusion"""
28
  fused_scores = {}
 
82
  )
83
 
84
  all_PDFs_chunks, full_text_as_array = await get_full_text_and_all_PDFs_chunks(
85
+ listaPDFs,
86
+ summarizer.splitter,
87
+ serializer["should_use_llama_parse"],
88
+ isBubble,
89
  )
90
 
91
  is_contextualized_chunk = serializer["should_have_contextual_chunks"]
92
 
93
  if is_contextualized_chunk:
94
+ response_auxiliar_summary = (
95
+ await get_response_from_auxiliar_contextual_prompt(full_text_as_array)
96
  )
97
 
98
  print("\nCOMEÇANDO A FAZER AS REQUISIÇÕES DO CONTEXTUAL")
 
114
  llm_ultimas_requests = serializer["llm_ultimas_requests"]
115
  print("\nCOMEÇANDO A FAZER ÚLTIMA REQUISIÇÃO")
116
  structured_summaries = await summarizer.gerar_documento_final(
117
+ vector_store,
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
 
 
137
  texto_completo_como_html = convert_markdown_to_HTML(texto_completo)
138
  print("\ntexto_completo_como_html", texto_completo_como_html)
139
 
140
+ if is_contextualized_chunk:
141
+ prompt_titulo_do_documento = response_auxiliar_summary
142
+ else:
143
+ prompt_titulo_do_documento = texto_completo_como_html
144
+ titulo_do_documento = await generate_document_title(
145
+ cast(str, prompt_titulo_do_documento)
146
+ )
147
+
148
  if isBubble:
149
  print("COMEÇANDO A REQUISIÇÃO FINAL PARA O BUBBLE")
150
  enviar_resposta_final(
 
153
  serializer["version"],
154
  texto_completo_como_html,
155
  False,
156
+ cast(str, titulo_do_documento),
157
  )
158
  print("TERMINOU A REQUISIÇÃO FINAL PARA O BUBBLE")
159
 
160
  return {
161
  "texto_completo": texto_completo_como_html,
162
+ "titulo_do_documento": titulo_do_documento,
163
  "resultado": structured_summaries,
164
  "parametros-utilizados": gerar_resposta_compilada(serializer),
165
  }