luanpoppe commited on
Commit
6876423
·
1 Parent(s): 0eba73c

feat: adicionando mais testes unitários dos contextuals e pequenas melhorias

Browse files
_utils/gerar_documento_utils/contextual_retriever.py CHANGED
@@ -65,42 +65,38 @@ class ContextualRetriever:
65
  lista_com_20_chunks
66
  )
67
  )
 
 
68
 
69
  try:
70
  print("\n\nCOMEÇOU A REQUISIÇÃO")
71
  prompt = contextual_prompt(
72
  resumo_auxiliar, all_chunks_contents, len(lista_com_20_chunks)
73
  )
 
74
  for attempt in range(4):
75
  if attempt != 0:
76
- axiom_instance.send_axiom(
77
  f"------------- FORMATAÇÃO DO CONTEXTUAL INCORRETA - TENTANDO NOVAMENTE (TENTATIVA: {attempt + 1}) -------------"
78
  )
79
 
80
- print("COMEÇANDO UMA REQUISIÇÃO DO CONTEXTUAL")
 
 
81
  raw_response = await agemini_answer(prompt, "gemini-2.0-flash-lite")
82
  response = cast(str, raw_response)
83
- axiom_instance.send_axiom(
84
- f"RESPOSTA LLM DE UM ITEM DA LISTA DE 20 CHUNKS: {response}"
85
  )
86
- print("TERMINOU UMA REQUISIÇÃO DO CONTEXTUAL")
87
 
88
- matches = (
89
- self.contextual_retriever_utils.validate_many_chunks_in_one_request(
90
- response, all_document_ids
91
- )
92
  )
93
 
94
  if matches:
95
- axiom_instance.send_axiom(
96
- f"CONTEXTUAL FUNCIONOU NA TENTATIVA {attempt + 1}"
97
- )
98
 
99
- result = (
100
- self.contextual_retriever_utils.get_info_from_validated_chunks(
101
- matches
102
- )
103
- )
104
 
105
  break
106
 
@@ -234,7 +230,10 @@ class ContextualRetrieverUtils:
234
 
235
  # pattern = r"\[(\d+|[-.]+)\] --- (.+?) --- (.+?)</chunk_context>" # Funciona para quando a resposta do LLM não vem com "document_id" escrito
236
  matches = self.check_regex_patterns(context, lista_de_document_ids)
237
- if not matches:
 
 
 
238
  return False
239
 
240
  matches_as_list = []
@@ -248,11 +247,6 @@ class ContextualRetrieverUtils:
248
 
249
  matches_as_list.append((resultado, match[1], match[2]))
250
 
251
- if len(matches) == 0:
252
- print(
253
- "----------- ERROU NA TENTATIVA ATUAL DE FORMATAR O CONTEXTUAL -----------"
254
- )
255
- return False
256
  return matches_as_list
257
 
258
  def check_regex_patterns(self, context: str, lista_de_document_ids: List[int]):
@@ -260,6 +254,7 @@ class ContextualRetrieverUtils:
260
  # r"\[*([\d.\-]+)\]*\s*---\s*\[*([^]]+)\]*\s*---\s*\[*([^]]+)\]*\s*</chunk_context>", # PRIMEIRO DE TODOS
261
  # r"<chunk_context>\s*([\d.\-]+)\s*---\s*([^<]+)\s*---\s*([^<]+)\s*</chunk_context>",
262
  r"\[(.*?)\] --- \[(.*?)\] --- \[(.*?)\](?=\n|\s*$)",
 
263
  r"<chunk_context>\s*(\d+)(?:\s*-\s*Pág\.\s*\d+)?\s*---\s*([^-\n]+)\s*---\s*([^<]+)</chunk_context>",
264
  r"<chunk_context>\s*(?:\[*([\d]+)\]*\s*[-–]*\s*(?:Pág\.\s*\d+\s*[-–]*)?)?\s*\[*([^\]]+)\]*\s*[-–]*\s*\[*([^\]]+)\]*\s*[-–]*\s*\[*([^\]]+)\]*\s*</chunk_context>",
265
  # r"\[([\d.\-]+)\]\s*---\s*\[([^]]+)\]\s*---\s*\[([^]]+)\]\s*</chunk_context>",
 
65
  lista_com_20_chunks
66
  )
67
  )
68
+ send_axiom = axiom_instance.send_axiom
69
+ utils = self.contextual_retriever_utils
70
 
71
  try:
72
  print("\n\nCOMEÇOU A REQUISIÇÃO")
73
  prompt = contextual_prompt(
74
  resumo_auxiliar, all_chunks_contents, len(lista_com_20_chunks)
75
  )
76
+ result = None
77
  for attempt in range(4):
78
  if attempt != 0:
79
+ send_axiom(
80
  f"------------- FORMATAÇÃO DO CONTEXTUAL INCORRETA - TENTANDO NOVAMENTE (TENTATIVA: {attempt + 1}) -------------"
81
  )
82
 
83
+ send_axiom(
84
+ f"COMEÇANDO UMA REQUISIÇÃO DO CONTEXTUAL - TENTATIVA {attempt + 1}"
85
+ )
86
  raw_response = await agemini_answer(prompt, "gemini-2.0-flash-lite")
87
  response = cast(str, raw_response)
88
+ send_axiom(
89
+ f"TERMINOU UMA REQUISIÇÃO DO CONTEXTUAL - TENTATIVA {attempt + 1} ------- RESPOSTA LLM DE UM ITEM COM 20 CHUNKS EM TEXTO DA LISTA : {response}"
90
  )
 
91
 
92
+ matches = utils.validate_many_chunks_in_one_request(
93
+ response, all_document_ids
 
 
94
  )
95
 
96
  if matches:
97
+ send_axiom(f"CONTEXTUAL FUNCIONOU NA TENTATIVA {attempt + 1}")
 
 
98
 
99
+ result = utils.get_info_from_validated_chunks(matches)
 
 
 
 
100
 
101
  break
102
 
 
230
 
231
  # pattern = r"\[(\d+|[-.]+)\] --- (.+?) --- (.+?)</chunk_context>" # Funciona para quando a resposta do LLM não vem com "document_id" escrito
232
  matches = self.check_regex_patterns(context, lista_de_document_ids)
233
+ if not matches or len(matches) == 0:
234
+ print(
235
+ "----------- ERROU NA TENTATIVA ATUAL DE FORMATAR O CONTEXTUAL -----------"
236
+ )
237
  return False
238
 
239
  matches_as_list = []
 
247
 
248
  matches_as_list.append((resultado, match[1], match[2]))
249
 
 
 
 
 
 
250
  return matches_as_list
251
 
252
  def check_regex_patterns(self, context: str, lista_de_document_ids: List[int]):
 
254
  # r"\[*([\d.\-]+)\]*\s*---\s*\[*([^]]+)\]*\s*---\s*\[*([^]]+)\]*\s*</chunk_context>", # PRIMEIRO DE TODOS
255
  # r"<chunk_context>\s*([\d.\-]+)\s*---\s*([^<]+)\s*---\s*([^<]+)\s*</chunk_context>",
256
  r"\[(.*?)\] --- \[(.*?)\] --- \[(.*?)\](?=\n|\s*$)",
257
+ r"\[([^\[\]]+?)\]\s*---\s*\[([^\[\]]+?)\]\s*---\s*(.*?)</chunk_context>",
258
  r"<chunk_context>\s*(\d+)(?:\s*-\s*Pág\.\s*\d+)?\s*---\s*([^-\n]+)\s*---\s*([^<]+)</chunk_context>",
259
  r"<chunk_context>\s*(?:\[*([\d]+)\]*\s*[-–]*\s*(?:Pág\.\s*\d+\s*[-–]*)?)?\s*\[*([^\]]+)\]*\s*[-–]*\s*\[*([^\]]+)\]*\s*[-–]*\s*\[*([^\]]+)\]*\s*</chunk_context>",
260
  # r"\[([\d.\-]+)\]\s*---\s*\[([^]]+)\]\s*---\s*\[([^]]+)\]\s*</chunk_context>",
_utils/gerar_documento_utils/llm_calls.py CHANGED
@@ -9,6 +9,7 @@ from langchain_openai import ChatOpenAI
9
 
10
  llm = LLM()
11
 
 
12
  async def aclaude_answer(claude_client, claude_context_model, prompt):
13
  print("\n\nComeçou uma requisição pelo Claude")
14
  response = await claude_client.messages.create(
@@ -55,7 +56,13 @@ def gpt_answer(
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
 
9
 
10
  llm = LLM()
11
 
12
+
13
  async def aclaude_answer(claude_client, claude_context_model, prompt):
14
  print("\n\nComeçou uma requisição pelo Claude")
15
  response = await claude_client.messages.create(
 
56
  else:
57
  return response.content
58
 
59
+
60
+ async def agemini_answer(
61
+ prompt,
62
+ model: Literal[
63
+ "gemini-2.5-pro-exp-03-25", "gemini-2.0-flash", "gemini-2.0-flash-lite"
64
+ ] = "gemini-2.0-flash",
65
+ ):
66
  gemini = llm.google_gemini(model)
67
  resposta = await gemini.ainvoke([HumanMessage(content=prompt)])
68
  return resposta.content
_utils/gerar_documento_utils/tests/fixtures/resposta_llm_com_20_chunks.py CHANGED
@@ -1,5 +1,65 @@
1
  resposta_llm_com_20_chunks_fixture_array = [
2
  """1. <chunk_context>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  [0000687-31.2017.8.05.0142] --- [APELAÇÃO CRIMINAL] --- [This chunk provides the basic identifying information for the case, including the case number, type of action (Apelação Criminal), the court, the parties involved (Estado da Bahia, Defensor Dativo, Adenilton da Conceição Samuel), and the main subjects (Honorários Advocatícios, Crimes de Trânsito). It sets the stage for the document, which is a record of the appeal.]
4
  </chunk_context>
5
  2. <chunk_context>
 
1
  resposta_llm_com_20_chunks_fixture_array = [
2
  """1. <chunk_context>
3
+ [76915] --- [APELAÇÃO CRIMINAL] --- Este chunk apresenta os dados iniciais do processo de Apelação Criminal, incluindo o número, classe, órgão julgador, partes envolvidas (Estado da Bahia, Defensor Dativo, e Adenilton da Conceição Samuel), e os assuntos tratados (Honorários Advocatícios, Crimes de Trânsito). Ele se encaixa na descrição do resumo do processo, que trata da apelação do Estado da Bahia sobre os honorários do defensor dativo em um caso de crimes de trânsito.
4
+ </chunk_context>
5
+ 2. <chunk_context>
6
+ [76646] --- [APELAÇÃO CRIMINAL] --- Este chunk lista uma série de intimações, sentenças, certidões e outros documentos relacionados ao processo, abrangendo um período de tempo considerável. Ele demonstra o andamento processual, desde a intimação da sentença até as alegações finais e a interposição da apelação, conforme descrito no resumo do processo.
7
+ </chunk_context>
8
+ 3. <chunk_context>
9
+ [RELATOR A: DES A. NARTIR DANTAS WEBER] --- [APELAÇÃO CRIMINAL] --- Este chunk apresenta o pronunciamento do Desembargador Relator Nartir Dantas Weber, que trata do recurso de apelação interposto pelo Estado da Bahia. Ele destaca que a controvérsia se refere a honorários advocatícios e que a intervenção do Ministério Público pode não ser necessária, alinhando-se com a questão central do processo: a responsabilidade do Estado pelo pagamento dos honorários.
10
+ </chunk_context>
11
+ 4. <chunk_context>
12
+ [Num. 78015845 - Pág. 1] --- [APELAÇÃO CRIMINAL] --- Este chunk é uma certidão de publicação no Diário de Justiça Eletrônico (DJe) referente ao processo, informando a disponibilização de um acórdão, decisão ou despacho. Ele se relaciona com o resumo do processo, que menciona as movimentações processuais e a publicação de decisões.
13
+ </chunk_context>
14
+ 5. <chunk_context>
15
+ [Num. 76747604 - Pág. 1] --- [APELAÇÃO CRIMINAL] --- Este chunk é uma certidão de publicação no DJe, informando sobre a disponibilização de um despacho. Ele menciona o artigo 224, § 2º, do CPC, que trata da contagem de prazos processuais, e se encaixa na descrição do resumo do processo, que acompanha as movimentações processuais.
16
+ </chunk_context>
17
+ 6. <chunk_context>
18
+ [Num. 76648177 - Pág. 1] --- [APELAÇÃO CRIMINAL] --- Este chunk é uma certidão de triagem inicial realizada pela Diretoria de Distribuição do 2º Grau, que verifica a regularidade dos dados cadastrais do processo. Ele se relaciona com o resumo do processo, que descreve o andamento processual e as etapas de análise dos documentos.
19
+ </chunk_context>
20
+ 7. <chunk_context>
21
+ [Num. 76647593 - Pág. 1] --- [APELAÇÃO CRIMINAL] --- Este chunk é uma certidão de triagem inicial, confirmando a conferência dos dados cadastrais do processo e identificando alterações necessárias. Ele se encaixa na descrição do resumo do processo, que acompanha as movimentações processuais e as etapas de análise dos documentos.
22
+ </chunk_context>
23
+ 8. <chunk_context>
24
+ [Num. 76647590 - Pág. 1] --- [APELAÇÃO CRIMINAL] --- Este chunk é um despacho do Juiz de Direito Leandro Ferreira de Moraes, intimando o advogado Ailton Silva Dantas para apresentar as contrarrazões ao recurso de apelação. Ele se encaixa no resumo do processo, que menciona a intimação do apelado para apresentar contrarrazões.
25
+ </chunk_context>
26
+ 9. <chunk_context>
27
+ [Num. 76647588 - Pág. 1] --- [APELAÇÃO CRIMINAL] --- Este chunk é uma certidão que atesta que o advogado Ailton Silva Dantas, apesar de devidamente intimado, permaneceu inerte, não apresentando as contrarrazões recursais. Ele se relaciona com o resumo do processo, que menciona a inércia do apelado após a intimação.
28
+ </chunk_context>
29
+ 10. <chunk_context>
30
+ [Num. 76647583 - Pág. 1] --- [APELAÇÃO CRIMINAL] --- Este chunk contém um comprovante de comunicação à Justiça Eleitoral sobre a condenação criminal de Adenilton da Conceição Samuel, mencionando os artigos 303 e 306 da Lei 9.503/97. Ele se encaixa no resumo do processo, que descreve os crimes pelos quais o réu foi condenado.
31
+ </chunk_context>
32
+ 11. <chunk_context>
33
+ [Num. 76647583 - Pág. 2] --- [APELAÇÃO CRIMINAL] --- Este chunk é a continuação da certidão, que informa o envio do ofício ao CEDEP (Centro de Documentação e Estatística Policial) sobre a condenação criminal de Adenilton da Conceição Samuel. Ele se relaciona com o resumo do processo, que descreve os crimes pelos quais o réu foi condenado e as comunicações oficiais.
34
+ </chunk_context>
35
+ 12. <chunk_context>
36
+ [Num. 76647582 - Pág. 2] --- [APELAÇÃO CRIMINAL] --- Este chunk é a continuação do ofício de comunicação da condenação criminal de Adenilton da Conceição Samuel ao CEDEP, detalhando a pena imposta. Ele se relaciona com o resumo do processo, que descreve os crimes pelos quais o réu foi condenado e as comunicações oficiais.
37
+ </chunk_context>
38
+ 13. <chunk_context>
39
+ [Num. 76647579 - Pág. 1] --- [APELAÇÃO CRIMINAL] --- Este chunk é uma certidão de trânsito em julgado da sentença condenatória para o Ministério Público em 21/08/2023 e para a defesa em 19/12/2023. Ele se encaixa no resumo do processo, que menciona o trânsito em julgado da sentença.
40
+ </chunk_context>
41
+ 14. <chunk_context>
42
+ [Num. 76647578 - Pág. 1] --- [APELAÇÃO CRIMINAL] --- Este chunk é uma certidão de intimação de Adenilton da Conceição Samuel sobre a sentença proferida. Ele se relaciona com o resumo do processo, que descreve as etapas processuais, incluindo as intimações.
43
+ </chunk_context>
44
+ 15. <chunk_context>
45
+ [Num. 76647575 - Pág. 1] --- [APELAÇÃO CRIMINAL] --- Este chunk é uma intimação judicial para o advogado Ailton Silva Dantas apresentar contrarrazões recursais. Ele se encaixa no resumo do processo, que menciona a intimação do apelado para apresentar contrarrazões.
46
+ </chunk_context>
47
+ 16. <chunk_context>
48
+ [Num. 76647573 - Pág. 1] --- [APELAÇÃO CRIMINAL] --- Este chunk é uma decisão do juiz Leandro Ferreira de Moraes que recebe o recurso de apelação interposto pela Procuradoria Geral do Estado da Bahia, com efeito suspensivo, e determina a intimação do apelado para apresentar contrarrazões. Ele se encaixa no resumo do processo, que descreve as etapas processuais, incluindo a decisão sobre o recurso.
49
+ </chunk_context>
50
+ 17. <chunk_context>
51
+ [Num. 76647572 - Pág. 1] --- [APELAÇÃO CRIMINAL] --- Este chunk é uma certidão que atesta a tempestividade da interposição do recurso de apelação. Ele se relaciona com o resumo do processo, que descreve a interposição do recurso pelo Estado da Bahia.
52
+ </chunk_context>
53
+ 18. <chunk_context>
54
+ [Num. 76647571 - Pág. 2] --- [APELAÇÃO CRIMINAL] --- Este chunk apresenta as razões do recurso de apelação interposto pelo Estado da Bahia, argumentando sobre o cabimento do recurso e a ilegitimidade do Estado para recorrer. Ele se encaixa no resumo do processo, que descreve os argumentos do Estado na apelação.
55
+ </chunk_context>
56
+ 19. <chunk_context>
57
+ [Num. 76647571 - Pág. 3] --- [APELAÇÃO CRIMINAL] --- Este chunk continua as razões do recurso, detalhando a preliminar de inobservância do Tema Repetitivo 984 do STJ, que trata da ausência de obrigatoriedade de observância da tabela da OAB para fixação de honorários de defensor dativo. Ele se relaciona com o resumo do processo, que menciona a alegação do Estado sobre o Tema Repetitivo 984.
58
+ </chunk_context>
59
+ 20. <chunk_context>
60
+ [Num. 76647571 - Pág. 5] --- [APELAÇÃO CRIMINAL] --- Este chunk continua a discussão sobre o Tema Repetitivo 984 do STJ, apresentando a ementa do julgado e os argumentos do Estado sobre a fixação dos honorários de defensor dativo. Ele se relaciona com o resumo do processo, que menciona a alegação do Estado sobre o Tema Repetitivo 984.
61
+ </chunk_context>""",
62
+ """1. <chunk_context>
63
  [0000687-31.2017.8.05.0142] --- [APELAÇÃO CRIMINAL] --- [This chunk provides the basic identifying information for the case, including the case number, type of action (Apelação Criminal), the court, the parties involved (Estado da Bahia, Defensor Dativo, Adenilton da Conceição Samuel), and the main subjects (Honorários Advocatícios, Crimes de Trânsito). It sets the stage for the document, which is a record of the appeal.]
64
  </chunk_context>
65
  2. <chunk_context>
_utils/gerar_documento_utils/tests/fixtures/resumo_auxiliar.py ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ resumo_auxiliar_fixture = """
2
+ ```xml
3
+ <pecas_identificadas>
4
+ 1. Apelação Criminal
5
+ 2. Parecer do Ministério Público
6
+ 3. Despacho
7
+ 4. Certidão de publicação no DJe
8
+ 5. Certidão
9
+ 6. Intimação
10
+ 7. Informação (N° Execução SEEU, Comprovante envio SEEU)
11
+ 8. Outros documentos (Guia de Execução Regime Aberto, Guia de Execução - Adenilton da Conceição, Ofício INFODIP, Ofício)
12
+ 9. Certidão Trânsito em Julgado
13
+ 10. Petição
14
+ 11. Sentença
15
+ 12. Alegações Finais
16
+ 13. Contestação
17
+ 14. Ato Ordinatório
18
+ 15. Petição Inicial
19
+ 16. Termo de Audiência
20
+ 17. Decisão
21
+ 18. Mandado de Intimação de Sentença
22
+ </pecas_identificadas>
23
+
24
+ <artigos_mencionados>
25
+ 1. Art. 127, caput, CF
26
+ 2. Lei nº 11.419
27
+ 3. Decreto Judiciário nº 064 de 10 de março de 2009
28
+ 4. Art. 224, § 2º, do CPC
29
+ 5. Artigos 303 e 306 da Lei 9.503/97
30
+ 6. Art. 13 da Resolução n° 04/2017
31
+ 7. Art. 597 do CPP
32
+ 8. Art. 185, § 2º, I e IV, e § 8º, do CPP
33
+ 9. Artigos 303 e 306, ambos da Lei 9.503/97
34
+ 10. Art. 59 e 68, ambos do Código Penal
35
+ 11. Art. 387, parágrafo único, do Código de Processo Penal
36
+ 12. Art. 44, inciso I, art. 43 do Código Penal
37
+ 13. Art. 367 do CPP
38
+ 14. Art. 396-A, do CPP
39
+ 15. Art. 593 do Código de Processo Penal
40
+ 16. Art. 85 do CPC
41
+ 17. Art. 5º da Constituição Federal, itens LIV e LV
42
+ 18. Art. 22, §§ 1º e 2º da Lei 8.906/1994
43
+ 19. Lei nº 1.060/50, § 1º do seu artigo 5º
44
+ 20. § 2º do artigo 5º da Lei nº 1.060/50
45
+ 21. § 1º do artigo 22 da Lei nº 8.906, de 4.7.1994
46
+ </artigos_mencionados>
47
+
48
+ <jurisprudencia_mencionada>
49
+ 1. Tema Repetitivo 984 do STJ - ausência de vinculação da tabela da OAB para fins de fixação de honorários de defensor dativo.
50
+ 2. Súmula Vinculante n. 47 do STF - natureza alimentar dos honorários advocatícios.
51
+ 3. Ag 3.805-SP-AgRg, rel. Min. Waldemar Zveiter - exigência de valor exato dos honorários ou arbitramento prévio para cobrança via executiva.
52
+ 4. Apelação Crime nº 0000004-84.1991.805.0148-0 do TJBA - competência da justiça cível para fixação de honorários de defensor dativo.
53
+ 5. TJRS-AGR 70001144344 - competência do juízo cível para fixação de honorários de defensor dativo.
54
+ 6. TRF 5ª R.; AC 517334 - fixação equitativa de honorários quando vencida a Fazenda Pública.
55
+ 7. TJMG; APCV 1588447-53.2005.8.13.0105 - fixação equitativa de honorários quando vencida a Fazenda Pública.
56
+ 8. TRF 1ª R.; AC 39581-69.2001.4.01.3800 - fixação equitativa de honorários quando vencida a Fazenda Pública.
57
+ 9. Ap. 42.309, TACrimSP, Rel. GOULART SOBRINHO - probabilidade não é certeza para condenação.
58
+ 10. Ap. 160.097, TACrimSP, Rel. GONÇALVES SOBRINHO - dúvida autoriza absolvição.
59
+ 11. Ap. 162.055. TACrimSP, Rel. GOULART SOBRINHO - certeza total é necessária para condenação.
60
+ 12. JUTACRIM, 72:26, Rel. ÁLVARO CURY - dúvida favorece o réu.
61
+ 13. AgRg no AREsp 1239057/MS - Crimes de embriaguez ao volante e lesão corporal culposa são autônomos.
62
+ 14. MS n. 8011612-51.2018.8.05.0000 - garantia da não realização de escoltas de presos sem as medidas de proteção da polícia penal.
63
+ 15. REsp 1656322/SC, tema 984 - STJ
64
+ </jurisprudencia_mencionada>
65
+
66
+ <resumo_processo>
67
+ O processo em análise, de número 0000687-31.2017.8.05.0142, é uma Apelação Criminal originada na Vara Criminal de Jeremoabo, Bahia, e tramita na Segunda Câmara Criminal 1ª Turma do Tribunal de Justiça do Estado da Bahia. O apelante é o Estado da Bahia, e o apelado é o Defensor Dativo, Ailton Silva Dantas, representando Adenilton da Conceição Samuel. A ação penal de origem apura crimes de trânsito, especificamente os artigos 303 e 306 da Lei 9.503/97.
68
+
69
+ O processo teve início com a denúncia do Ministério Público contra Adenilton da Conceição Samuel, imputando-lhe a prática de lesão corporal culposa na direção de veículo automotor e condução de veículo sob influência de álcool. A denúncia narra que, em 15/05/2017, Adenilton conduzia um Fiat Uno sem habilitação e em estado de embriaguez, colidindo com uma motocicleta e causando lesões na vítima, Erivaldo Teixeira da Silva.
70
+
71
+ Após o recebimento da denúncia, o réu foi citado e, permanecendo inerte, foi nomeado o defensor dativo Ailton Silva Dantas. O defensor apresentou Resposta à Acusação, alegando a inocência do réu e arrolando testemunhas. O Ministério Público se manifestou pelo recebimento da denúncia e prosseguimento do feito.
72
+
73
+ Durante a instrução processual, foi realizada audiência de instrução e julgamento, com a oitiva da testemunha Luiz Gonzaga de Sá Teixeira. O réu não compareceu à audiência, e o juiz dispensou seu interrogatório, nos termos do art. 367 do CPP. Tanto o Ministério Público quanto a defesa requereram prazo para apresentação de alegações finais em forma de memoriais.
74
+
75
+ Em suas alegações finais, o Ministério Público requereu a condenação do réu nos termos da denúncia, pelos crimes de direção de veículo automotor alcoolizado e sem habilitação, em concurso formal. A defesa, por sua vez, pugnou pela absolvição do réu, alegando insuficiência de provas.
76
+
77
+ O juiz da Vara Criminal de Jeremoabo proferiu sentença, julgando procedente a pretensão punitiva estatal e condenando Adenilton da Conceição Samuel pela prática dos crimes tipificados nos artigos 303 e 306 da Lei 9.503/97. A pena imposta foi de 01 (um) ano de detenção e suspensão ou proibição de se obter a permissão ou a habilitação para dirigir veículo automotor, substituída por prestação de serviços à comunidade e prestação pecuniária. O regime inicial foi o aberto. O juiz também condenou o Estado da Bahia ao pagamento de honorários advocatícios ao defensor dativo, no valor de R$ 3.500,00.
78
+
79
+ Inconformado com a sentença, o Estado da Bahia interpôs recurso de apelação, alegando, em síntese: a) preliminar de inobservância do Tema Repetitivo 984 do STJ, que trata da ausência de obrigatoriedade de observância da tabela da OAB para fixação de honorários de defensor dativo; b) preliminar de nulidade por ofensa à ampla defesa e ao devido processo legal, argumentando que o Estado não foi parte na demanda e não pôde exercer plenamente seu direito à defesa; c) impossibilidade de arbitramento de honorários no processo criminal, defendendo que a competência para fixação é da justiça cível; d) excessividade nos valores arbitrados. O Estado requereu a declaração de nulidade da sentença na parte em que o condenou ao pagamento dos honorários, ou, subsidiariamente, a reforma da sentença para extirpar a condenação em honorários, ou, ainda, a redução dos honorários arbitrados.
80
+
81
+ Após a interposição da apelação, o apelado, Adenilton da Conceição Samuel, foi intimado para apresentar contrarrazões ao recurso, mas permaneceu inerte, conforme certidões nos autos.
82
+
83
+ Em 03/02/2025, o Desembargador Relator Nartir Dantas Weber determinou o encaminhamento dos autos à Procuradoria de Justiça para emissão de opinativo. Em 05/02/2025, a Procuradoria de Justiça Criminal manifestou-se no sentido de que sua intervenção no feito se mostra inadequada, por se tratar de discussão sobre direito patrimonial disponível (honorários advocatícios), sem repercussão social apta a atrair a intervenção ministerial, conforme o art. 127, caput, da CF.
84
+
85
+ A **última movimentação** relevante no processo, datada de 04/02/2025, é um despacho do Desembargador Relator Nartir Dantas Weber, determinando o encaminhamento dos autos à Procuradoria de Justiça para emissão de opinativo, o que já foi cumprido. O processo aguarda, portanto, o retorno dos autos ao Relator para prosseguimento do julgamento da apelação. A questão central a ser decidida é a responsabilidade do Estado da Bahia pelo pagamento dos honorários do defensor dativo e, em caso afirmativo, o valor adequado desses honorários, considerando o Tema Repetitivo 984 do STJ e os princípios da razoabilidade e proporcionalidade.
86
+ </resumo_processo>
87
+ ```"""
_utils/gerar_documento_utils/tests/test_contextual_retriever_inside.py CHANGED
@@ -9,10 +9,17 @@ from _utils.models.gerar_documento import (
9
  DocumentChunk,
10
  RetrievalConfig,
11
  )
 
 
 
 
 
12
  from .fixtures.resposta_llm_com_20_chunks import (
13
  resposta_llm_com_20_chunks_fixture_array,
14
  lista_20_ids_fixture,
15
  )
 
 
16
 
17
 
18
  config = RetrievalConfig(
@@ -57,7 +64,6 @@ lista_chunks_errados = [
57
 
58
  class TestContextualRetrieverUtils:
59
  context_retrieval_utils = ContextualRetrieverUtils()
60
- # context_retrieval = ContextualRetriever(config, "claude-3-haiku-20240307")
61
 
62
  # @pytest.mark.asyncio
63
  # async def test_valida_retries_automaticos_do_contextual(self, monkeypatch):
@@ -145,3 +151,70 @@ class TestContextualRetrieverUtils:
145
  assert isinstance(r[2], str)
146
  assert len(r[1]) > 0
147
  assert len(r[2]) > 0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  DocumentChunk,
10
  RetrievalConfig,
11
  )
12
+ from gerar_documento.serializer import (
13
+ GerarDocumentoComPDFProprioSerializer,
14
+ GerarDocumentoComPDFProprioSerializerData,
15
+ )
16
+ from setup.logging import Axiom
17
  from .fixtures.resposta_llm_com_20_chunks import (
18
  resposta_llm_com_20_chunks_fixture_array,
19
  lista_20_ids_fixture,
20
  )
21
+ from .fixtures.lista_com_20_chunks import lista_com_20_chunks_fixture
22
+ from .fixtures.resumo_auxiliar import resumo_auxiliar_fixture
23
 
24
 
25
  config = RetrievalConfig(
 
64
 
65
  class TestContextualRetrieverUtils:
66
  context_retrieval_utils = ContextualRetrieverUtils()
 
67
 
68
  # @pytest.mark.asyncio
69
  # async def test_valida_retries_automaticos_do_contextual(self, monkeypatch):
 
151
  assert isinstance(r[2], str)
152
  assert len(r[1]) > 0
153
  assert len(r[2]) > 0
154
+
155
+ @pytest.mark.asyncio
156
+ def test_validate_many_chunks_in_one_request_falha_01(self, monkeypatch):
157
+ monkeypatch.setattr(
158
+ self.context_retrieval_utils,
159
+ "check_regex_patterns",
160
+ lambda ctx, ids: None,
161
+ )
162
+ for resposta in resposta_llm_com_20_chunks_fixture_array:
163
+ result = self.context_retrieval_utils.validate_many_chunks_in_one_request(
164
+ resposta, lista_20_ids_fixture
165
+ )
166
+ assert result is False
167
+
168
+ @pytest.mark.asyncio
169
+ def test_validate_many_chunks_in_one_request_falha_02_empty_list(self, monkeypatch):
170
+ monkeypatch.setattr(
171
+ self.context_retrieval_utils,
172
+ "check_regex_patterns",
173
+ lambda ctx, ids: [],
174
+ )
175
+ for resposta in resposta_llm_com_20_chunks_fixture_array:
176
+ result = self.context_retrieval_utils.validate_many_chunks_in_one_request(
177
+ resposta, lista_20_ids_fixture
178
+ )
179
+ assert result is False
180
+
181
+
182
+ class TestContextuRetriever:
183
+ serializer = GerarDocumentoComPDFProprioSerializerData([])
184
+ context_retrieval = ContextualRetriever(serializer)
185
+ axiom = Axiom()
186
+ axiom.generate_new_uuid()
187
+
188
+ @pytest.mark.asyncio
189
+ async def test_llm_call_uma_lista_de_chunks_success(
190
+ self,
191
+ ):
192
+ resultado = await self.context_retrieval.llm_call_uma_lista_de_chunks(
193
+ lista_com_20_chunks_fixture, resumo_auxiliar_fixture, self.axiom
194
+ )
195
+
196
+ print("resultado: ", resultado)
197
+ assert resultado
198
+
199
+ @pytest.mark.asyncio
200
+ async def test_llm_call_uma_lista_de_chunks_falha_01(self, monkeypatch):
201
+ monkeypatch.setattr(
202
+ self.context_retrieval.contextual_retriever_utils,
203
+ "get_all_document_ids_and_contents",
204
+ lambda ids: ("", [1, 2, 3, 4]),
205
+ )
206
+
207
+ async def mock_agemini_answer(prompt, modelo):
208
+ return "texto incorreto"
209
+
210
+ monkeypatch.setattr(
211
+ "_utils.gerar_documento_utils.contextual_retriever.agemini_answer",
212
+ mock_agemini_answer,
213
+ )
214
+
215
+ resultado = await self.context_retrieval.llm_call_uma_lista_de_chunks(
216
+ lista_com_20_chunks_fixture, resumo_auxiliar_fixture, self.axiom
217
+ )
218
+
219
+ print("resultado: ", resultado)
220
+ assert resultado == [[""]]
_utils/langchain_utils/LLM_class.py CHANGED
@@ -26,7 +26,7 @@ class LLM:
26
  def google_gemini(
27
  self,
28
  model: Literal[
29
- "gemini-2.5-pro-exp-03-25", "gemini-2.0-flash"
30
  ] = "gemini-2.0-flash",
31
  ):
32
  return ChatGoogleGenerativeAI(
 
26
  def google_gemini(
27
  self,
28
  model: Literal[
29
+ "gemini-2.5-pro-exp-03-25", "gemini-2.0-flash", "gemini-2.0-flash-lite"
30
  ] = "gemini-2.0-flash",
31
  ):
32
  return ChatGoogleGenerativeAI(