luanpoppe commited on
Commit
cb23311
·
1 Parent(s): 23087eb

feat: ajustando endpoint de /gerar-documento para receber a URL do PDF do bubble pela requisição feita pelo front

Browse files
_utils/bubble_integrations/obter_arquivo.py CHANGED
@@ -1,7 +1,23 @@
 
 
 
 
1
  import requests
2
 
3
- version_url = "version-test"
 
 
 
 
 
 
 
 
4
 
 
 
 
 
 
5
 
6
- def obter_arquivo():
7
- requests.post(f"https://vella.app.br/{version_url}/api/1.1/wf/obter_arquivo")
 
1
+ # from setup.easy_imports import PyPDFLoader
2
+ import os
3
+ from langchain_community.document_loaders import PyPDFLoader
4
+
5
  import requests
6
 
7
+ headers = {"Authorization": f"Bearer {os.environ.get("BUBBLE_TOKEN")}"}
8
+
9
+
10
+ # def obter_arquivo(id_arquivo="1735864318176x375804955201372160"):
11
+ # return requests.get(
12
+ # f"https://vella.app.br/version-test/api/1.1/obj/formresponseanswer/{id_arquivo}",
13
+ # headers=headers,
14
+ # )
15
+
16
 
17
+ def get_pdf_from_bubble(
18
+ file_url=f"https://vella.app.br/version-test/fileupload/f1735864316650x718601440484441900/Boleto_DIGITICS%20Servic%CC%A7os%20de%20Secretariado%20LTDA_30_12_2024_804841714.pdf",
19
+ bubble_editor_version="version-test",
20
+ ):
21
+ result = PyPDFLoader(file_url, headers=headers)
22
 
23
+ return result
 
_utils/gerar_relatorio_modelo_usuario/EnhancedDocumentSummarizer.py CHANGED
@@ -40,7 +40,7 @@ class EnhancedDocumentSummarizer(DocumentSummarizer):
40
  prompt_auxiliar,
41
  gpt_model,
42
  gpt_temperature,
43
- id_modelo_do_usuario,
44
  prompt_gerar_documento,
45
  reciprocal_rank_fusion,
46
  ):
@@ -61,7 +61,7 @@ class EnhancedDocumentSummarizer(DocumentSummarizer):
61
  self.prompt_auxiliar = prompt_auxiliar
62
  self.gpt_model = gpt_model
63
  self.gpt_temperature = gpt_temperature
64
- self.id_modelo_do_usuario = id_modelo_do_usuario
65
  self.prompt_gerar_documento = prompt_gerar_documento
66
  self.reciprocal_rank_fusion = reciprocal_rank_fusion
67
  self.resumo_gerado = ""
@@ -178,33 +178,33 @@ class EnhancedDocumentSummarizer(DocumentSummarizer):
178
  # )
179
 
180
  # modelo_buscado = resposta.json()["modelo"]
181
- from modelos_usuarios.models import ModeloUsuarioModel
182
-
183
- try:
184
- # modelo_buscado = ModeloUsuarioModel.objects.get(
185
- # pk=self.id_modelo_do_usuario
186
- # )
187
- # serializer = ModeloUsuarioSerializer(modelo_buscado)
188
- # print("serializer.data: ", serializer.data)
189
- modelo_buscado = await sync_to_async(ModeloUsuarioModel.objects.get)(
190
- pk=self.id_modelo_do_usuario
191
- )
192
- serializer = await sync_to_async(ModeloUsuarioSerializer)(
193
- modelo_buscado
194
- )
195
- print("serializer.data: ", serializer.data)
196
 
197
- except Exception as e:
198
- print("e: ", e)
199
- return Response(
200
- {
201
- "error": "Ocorreu um problema. Pode ser que o modelo não tenha sido encontrado. Tente novamente e/ou entre em contato com a equipe técnica",
202
- "full_error": e,
203
- },
204
- 400,
205
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
206
 
207
- print("modelo_buscado: ", serializer.data["modelo"])
208
 
209
  llm = ChatOpenAI(
210
  temperature=self.gpt_temperature,
@@ -212,29 +212,30 @@ class EnhancedDocumentSummarizer(DocumentSummarizer):
212
  api_key=self.openai_api_key,
213
  )
214
 
215
- prompt_gerar_relatorio = PromptTemplate(
216
  template=self.prompt_auxiliar, input_variables=["context"]
217
  )
218
 
219
- relatorio_gerado = llm.invoke(
220
- prompt_gerar_relatorio.format(context="\n\n".join(contexts))
221
  )
222
 
223
- self.resumo_gerado = relatorio_gerado.content
224
 
225
- prompt_gerar_modelo = PromptTemplate(
226
  template=self.prompt_gerar_documento,
227
- input_variables=["context", "modelo_usuario"],
228
  )
229
 
230
- modelo_gerado = llm.invoke(
231
- prompt_gerar_modelo.format(
232
- context=relatorio_gerado, modelo_usuario=serializer.data["modelo"]
 
233
  )
234
  ).content
235
 
236
  # Split the response into paragraphs
237
- summaries = [p.strip() for p in modelo_gerado.split("\n\n") if p.strip()]
238
 
239
  # Create structured output
240
  structured_output = []
 
40
  prompt_auxiliar,
41
  gpt_model,
42
  gpt_temperature,
43
+ # id_modelo_do_usuario,
44
  prompt_gerar_documento,
45
  reciprocal_rank_fusion,
46
  ):
 
61
  self.prompt_auxiliar = prompt_auxiliar
62
  self.gpt_model = gpt_model
63
  self.gpt_temperature = gpt_temperature
64
+ # self.id_modelo_do_usuario = id_modelo_do_usuario
65
  self.prompt_gerar_documento = prompt_gerar_documento
66
  self.reciprocal_rank_fusion = reciprocal_rank_fusion
67
  self.resumo_gerado = ""
 
178
  # )
179
 
180
  # modelo_buscado = resposta.json()["modelo"]
181
+ # from modelos_usuarios.models import ModeloUsuarioModel
 
 
 
 
 
 
 
 
 
 
 
 
 
 
182
 
183
+ # try:
184
+ # # modelo_buscado = ModeloUsuarioModel.objects.get(
185
+ # # pk=self.id_modelo_do_usuario
186
+ # # )
187
+ # # serializer = ModeloUsuarioSerializer(modelo_buscado)
188
+ # # print("serializer.data: ", serializer.data)
189
+ # modelo_buscado = await sync_to_async(ModeloUsuarioModel.objects.get)(
190
+ # pk=self.id_modelo_do_usuario
191
+ # )
192
+ # serializer = await sync_to_async(ModeloUsuarioSerializer)(
193
+ # modelo_buscado
194
+ # )
195
+ # print("serializer.data: ", serializer.data)
196
+
197
+ # except Exception as e:
198
+ # print("e: ", e)
199
+ # return Response(
200
+ # {
201
+ # "error": "Ocorreu um problema. Pode ser que o modelo não tenha sido encontrado. Tente novamente e/ou entre em contato com a equipe técnica",
202
+ # "full_error": e,
203
+ # },
204
+ # 400,
205
+ # )
206
 
207
+ # print("modelo_buscado: ", serializer.data["modelo"])
208
 
209
  llm = ChatOpenAI(
210
  temperature=self.gpt_temperature,
 
212
  api_key=self.openai_api_key,
213
  )
214
 
215
+ prompt_auxiliar = PromptTemplate(
216
  template=self.prompt_auxiliar, input_variables=["context"]
217
  )
218
 
219
+ resumo_auxiliar_do_documento = llm.invoke(
220
+ prompt_auxiliar.format(context="\n\n".join(contexts))
221
  )
222
 
223
+ self.resumo_gerado = resumo_auxiliar_do_documento.content
224
 
225
+ prompt_gerar_documento = PromptTemplate(
226
  template=self.prompt_gerar_documento,
227
+ input_variables=["context"],
228
  )
229
 
230
+ documento_gerado = llm.invoke(
231
+ prompt_gerar_documento.format(
232
+ context=resumo_auxiliar_do_documento,
233
+ # modelo_usuario=serializer.data["modelo"],
234
  )
235
  ).content
236
 
237
  # Split the response into paragraphs
238
+ summaries = [p.strip() for p in documento_gerado.split("\n\n") if p.strip()]
239
 
240
  # Create structured output
241
  structured_output = []
_utils/gerar_relatorio_modelo_usuario/contextual_retriever.py CHANGED
@@ -1,7 +1,9 @@
1
  import os
 
2
  # from _utils.gerar_relatorio_modelo_usuario.prompts import (
3
  # prompt_auxiliar_do_contextual_prompt,
4
  # )
 
5
  from _utils.chains.Chain_class import Chain
6
  from _utils.prompts.Prompt_class import Prompt
7
  from _utils.splitters.Splitter_class import Splitter
@@ -120,7 +122,8 @@ def get_full_text_and_all_PDFs_chunks(contexto, listaPDFs, splitterObject: Split
120
  chunks = splitterObject.load_and_split_document(pdf_path)
121
  all_PDFs_chunks = all_PDFs_chunks + chunks
122
  # Get full text for contextualization
123
- loader = PyPDFLoader(pdf_path)
 
124
  pages = loader.load()
125
  full_text = " ".join([page.page_content for page in pages])
126
 
 
1
  import os
2
+
3
  # from _utils.gerar_relatorio_modelo_usuario.prompts import (
4
  # prompt_auxiliar_do_contextual_prompt,
5
  # )
6
+ from _utils.bubble_integrations.obter_arquivo import get_pdf_from_bubble
7
  from _utils.chains.Chain_class import Chain
8
  from _utils.prompts.Prompt_class import Prompt
9
  from _utils.splitters.Splitter_class import Splitter
 
122
  chunks = splitterObject.load_and_split_document(pdf_path)
123
  all_PDFs_chunks = all_PDFs_chunks + chunks
124
  # Get full text for contextualization
125
+ # loader = PyPDFLoader(pdf_path)
126
+ loader = get_pdf_from_bubble(pdf_path)
127
  pages = loader.load()
128
  full_text = " ".join([page.page_content for page in pages])
129
 
_utils/gerar_relatorio_modelo_usuario/prompts.py CHANGED
@@ -1,3 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  def contextual_prompt(full_text, chunk_content):
2
  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):
3
  1. **Chain of Thought (internal)**:
@@ -17,9 +76,11 @@ Please return only the succinct context (without displaying your internal reason
17
  ```
18
  """
19
 
 
20
  # Novo nome --> prompt-auxiliar --> Para gerar documentos (é usado como auxiliar no prompt final)
21
- prompt_auxiliar = """
22
- 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.
 
23
  **Instructions**:
24
  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.
25
  2. **Reading the Context**: Extract the following information from `context`:
@@ -119,61 +180,3 @@ A denúncia foi recebida em 12/03/2021, conforme Decisão 20210312-01.
119
  Não há outras causas interruptivas ou suspensivas da prescrição.
120
  </formato>
121
  """
122
-
123
- 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.
124
-
125
- 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:
126
- 1. Petição Inicial
127
- 2. Contestação
128
- 3. Réplica
129
- 4. Decisão de Saneamento
130
- 5. Sentença
131
- 6. Recurso de Apelação
132
- 7. Embargos de Declaração
133
- 8. Cumprimento de Sentença
134
- 9. Embargos à Execução
135
- 10. Agravo de Instrumento
136
-
137
- Siga este passo a passo para criar o resumo:
138
-
139
- 1. Leia atentamente todo o processo jurídico fornecido.
140
- <processo_juridico>
141
- {{PROCESSO_JURIDICO}}
142
- </processo_juridico>
143
-
144
- 2. Identifique e anote as datas e conteúdos relevantes relacionados às 10 peças processuais listadas acima.
145
-
146
- 3. Organize cronologicamente as informações coletadas.
147
-
148
- 4. Destaque a última movimentação processual e seu significado para o andamento do processo.
149
-
150
- 5. Resuma as principais movimentações, focando em seu impacto no processo.
151
-
152
- 6. Elabore um texto coeso que apresente o fluxo do processo, destacando os pontos cruciais e as decisões mais importantes.
153
-
154
- 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:
155
-
156
- 1. O resumo abrange todas as 10 peças processuais principais?
157
- 2. A última movimentação processual está claramente identificada e explicada?
158
- 3. O texto apresenta uma visão clara do fluxo do processo?
159
- 4. Todas as informações cruciais para o entendimento do caso estão incluídas?
160
- 5. O resumo está livre de opiniões pessoais e se atém aos fatos do processo?
161
- 6. A linguagem utilizada é clara e acessível, mesmo para quem não é especialista em direito?
162
-
163
- Revise e ajuste o resumo conforme necessário com base nessa reflexão.
164
-
165
- O resumo final deve ter no máximo 2 páginas de extensão (aproximadamente 1000 palavras).
166
-
167
- Formate sua resposta da seguinte maneira:
168
-
169
- <resumo_processo>
170
- [Insira aqui o resumo do processo jurídico]
171
- </resumo_processo>
172
-
173
- <reflexao_socratica>
174
- [Insira aqui suas respostas às perguntas da reflexão socrática]
175
- </reflexao_socratica>
176
-
177
- <resumo_final>
178
- [Insira aqui o resumo final revisado, se houver alterações após a reflexão]
179
- </resumo_final>"""
 
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 contextual_prompt(full_text, chunk_content):
61
  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):
62
  1. **Chain of Thought (internal)**:
 
76
  ```
77
  """
78
 
79
+
80
  # Novo nome --> prompt-auxiliar --> Para gerar documentos (é usado como auxiliar no prompt final)
81
+ 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."""
82
+
83
+ prompt_auxiliar_padrao = """
84
  **Instructions**:
85
  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.
86
  2. **Reading the Context**: Extract the following information from `context`:
 
180
  Não há outras causas interruptivas ou suspensivas da prescrição.
181
  </formato>
182
  """
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
_utils/handle_files.py CHANGED
@@ -1,5 +1,7 @@
1
  import tempfile, os
2
 
 
 
3
 
4
  def handle_pdf_files_from_serializer(files):
5
  listaPDFs = []
@@ -17,7 +19,6 @@ def handle_pdf_files_from_serializer(files):
17
  print("listaPDFs: ", listaPDFs)
18
  return listaPDFs
19
 
20
-
21
  def remove_pdf_temp_files(listaPDFs):
22
  for file in listaPDFs:
23
  os.remove(file)
 
1
  import tempfile, os
2
 
3
+ from _utils.bubble_integrations.obter_arquivo import get_pdf_from_bubble
4
+
5
 
6
  def handle_pdf_files_from_serializer(files):
7
  listaPDFs = []
 
19
  print("listaPDFs: ", listaPDFs)
20
  return listaPDFs
21
 
 
22
  def remove_pdf_temp_files(listaPDFs):
23
  for file in listaPDFs:
24
  os.remove(file)
_utils/resumo_completo_cursor.py CHANGED
@@ -65,7 +65,7 @@ async def get_llm_summary_answer_by_cursor_complete(
65
  prompt_auxiliar=serializer["prompt_auxiliar"],
66
  gpt_model=serializer["model"],
67
  gpt_temperature=serializer["gpt_temperature"],
68
- id_modelo_do_usuario=serializer["id_modelo_do_usuario"],
69
  prompt_gerar_documento=serializer["prompt_gerar_documento"],
70
  reciprocal_rank_fusion=reciprocal_rank_fusion,
71
  )
 
65
  prompt_auxiliar=serializer["prompt_auxiliar"],
66
  gpt_model=serializer["model"],
67
  gpt_temperature=serializer["gpt_temperature"],
68
+ # id_modelo_do_usuario=serializer["id_modelo_do_usuario"],
69
  prompt_gerar_documento=serializer["prompt_gerar_documento"],
70
  reciprocal_rank_fusion=reciprocal_rank_fusion,
71
  )
_utils/splitters/Splitter_class.py CHANGED
@@ -1,3 +1,4 @@
 
1
  from setup.easy_imports import PyPDFLoader, RecursiveCharacterTextSplitter, Document
2
  from typing import List, Dict, Tuple, Optional
3
  from _utils.models.gerar_relatorio import (
@@ -19,7 +20,8 @@ class Splitter:
19
 
20
  def load_and_split_document(self, pdf_path: str) -> List[DocumentChunk]:
21
  """Load PDF and split into chunks with metadata"""
22
- loader = PyPDFLoader(pdf_path)
 
23
  pages = (
24
  loader.load()
25
  ) # Gera uma lista de objetos Document, sendo cada item da lista referente a UMA PÁGINA inteira do PDF.
 
1
+ from _utils.bubble_integrations.obter_arquivo import get_pdf_from_bubble
2
  from setup.easy_imports import PyPDFLoader, RecursiveCharacterTextSplitter, Document
3
  from typing import List, Dict, Tuple, Optional
4
  from _utils.models.gerar_relatorio import (
 
20
 
21
  def load_and_split_document(self, pdf_path: str) -> List[DocumentChunk]:
22
  """Load PDF and split into chunks with metadata"""
23
+ # loader = PyPDFLoader(pdf_path)
24
+ loader = get_pdf_from_bubble(pdf_path)
25
  pages = (
26
  loader.load()
27
  ) # Gera uma lista de objetos Document, sendo cada item da lista referente a UMA PÁGINA inteira do PDF.
example.env CHANGED
@@ -1,8 +1,8 @@
 
1
  DATABASE_PASSWORD=""
2
  OPENAI_API_KEY=""
3
- CLAUDE_API_KEY=""
4
- LANGCHAIN_API_KEY=""
5
  HUGGINGFACEHUB_API_TOKEN=""
 
 
6
  COHERE_API_KEY=""
7
- SECRET_KEY=""
8
- DATABASE_PASSWORD=""
 
1
+ SECRET_KEY=""
2
  DATABASE_PASSWORD=""
3
  OPENAI_API_KEY=""
 
 
4
  HUGGINGFACEHUB_API_TOKEN=""
5
+ LANGCHAIN_API_KEY=""
6
+ CLAUDE_API_KEY=""
7
  COHERE_API_KEY=""
8
+ BUBBLE_TOKEN=""
 
gerar_documento/serializer.py CHANGED
@@ -2,17 +2,29 @@ from rest_framework import serializers
2
  from _antigos.resumos.serializer import ResumoCursorSerializer
3
  from _utils.gerar_relatorio_modelo_usuario.prompts import (
4
  prompt_gerar_documento,
5
- prompt_auxiliar,
6
  )
7
 
8
  user_message = "What are the main points of this document?"
9
 
10
 
 
 
 
 
 
 
11
  class ResumoCursorCompeltoSerializer(ResumoCursorSerializer):
12
  system_prompt = None
13
- files = None
14
- file_ids = serializers.CharField(required=False)
15
- prompt_auxiliar = serializers.CharField(required=False, default=prompt_auxiliar)
 
 
 
 
 
 
16
  prompt_gerar_documento = serializers.CharField(
17
  required=False, default=prompt_gerar_documento
18
  )
@@ -31,6 +43,5 @@ class ResumoCursorCompeltoSerializer(ResumoCursorSerializer):
31
  required=False, default="claude-3-haiku-20240307"
32
  )
33
  gpt_temperature = serializers.FloatField(default=0)
34
- # id_modelo_do_usuario = serializers.IntegerField(required=True)
35
  id_modelo_do_usuario = serializers.IntegerField(required=False)
36
  should_have_contextual_chunks = serializers.BooleanField(default=False)
 
2
  from _antigos.resumos.serializer import ResumoCursorSerializer
3
  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
 
10
 
11
+ class FileInfoSerializer(serializers.Serializer):
12
+ unique_id = serializers.CharField(max_length=255)
13
+ tipo_arquivo = serializers.CharField(max_length=255)
14
+ link_arquivo = serializers.URLField()
15
+
16
+
17
  class ResumoCursorCompeltoSerializer(ResumoCursorSerializer):
18
  system_prompt = None
19
+
20
+ files = serializers.ListField(child=FileInfoSerializer(), required=True)
21
+ bubble_editor_version = serializers.CharField(
22
+ required=False, default="version-test"
23
+ ) # Será o valor utilizado dentro da URL da requisição pro Bubble
24
+
25
+ prompt_auxiliar = serializers.CharField(
26
+ required=False, default=prompt_auxiliar_padrao
27
+ )
28
  prompt_gerar_documento = serializers.CharField(
29
  required=False, default=prompt_gerar_documento
30
  )
 
43
  required=False, default="claude-3-haiku-20240307"
44
  )
45
  gpt_temperature = serializers.FloatField(default=0)
 
46
  id_modelo_do_usuario = serializers.IntegerField(required=False)
47
  should_have_contextual_chunks = serializers.BooleanField(default=False)
gerar_documento/views.py CHANGED
@@ -10,13 +10,14 @@ from _utils.handle_files import handle_pdf_files_from_serializer, remove_pdf_tem
10
  from _utils.resumo_completo_cursor import (
11
  get_llm_summary_answer_by_cursor_complete,
12
  )
 
13
  from .serializer import (
14
  ResumoCursorCompeltoSerializer,
15
  )
16
 
17
 
18
  class ResumoSimplesCursorCompletoView(AsyncAPIView):
19
- parser_classes = [MultiPartParser]
20
 
21
  @extend_schema(
22
  request=ResumoCursorCompeltoSerializer,
@@ -28,13 +29,20 @@ class ResumoSimplesCursorCompletoView(AsyncAPIView):
28
  data = serializer.validated_data
29
  print("\n\ndata: ", data)
30
 
31
- listaPDFs = handle_pdf_files_from_serializer(data["files"])
 
 
 
 
 
 
 
32
 
33
  resposta_llm = await get_llm_summary_answer_by_cursor_complete(
34
  data, listaPDFs
35
  )
36
  print("\n\nresposta_llm: ", resposta_llm)
37
 
38
- remove_pdf_temp_files(listaPDFs)
39
 
40
  return Response({"resposta": resposta_llm})
 
10
  from _utils.resumo_completo_cursor import (
11
  get_llm_summary_answer_by_cursor_complete,
12
  )
13
+ from _utils.gerar_relatorio_modelo_usuario.prompts import prompt_auxiliar_inicio
14
  from .serializer import (
15
  ResumoCursorCompeltoSerializer,
16
  )
17
 
18
 
19
  class ResumoSimplesCursorCompletoView(AsyncAPIView):
20
+ # parser_classes = [MultiPartParser]
21
 
22
  @extend_schema(
23
  request=ResumoCursorCompeltoSerializer,
 
29
  data = serializer.validated_data
30
  print("\n\ndata: ", data)
31
 
32
+ data["prompt_auxiliar"] = (
33
+ prompt_auxiliar_inicio + "\n" + data["prompt_auxiliar"]
34
+ )
35
+
36
+ # listaPDFs = handle_pdf_files_from_serializer(data["files"])
37
+ listaPDFs = [l["link_arquivo"] for l in data["files"]]
38
+
39
+ print("\n\nlistaPDFs: ", listaPDFs)
40
 
41
  resposta_llm = await get_llm_summary_answer_by_cursor_complete(
42
  data, listaPDFs
43
  )
44
  print("\n\nresposta_llm: ", resposta_llm)
45
 
46
+ # remove_pdf_temp_files(listaPDFs)
47
 
48
  return Response({"resposta": resposta_llm})
setup/easy_imports.py CHANGED
@@ -7,8 +7,9 @@ from rest_framework.parsers import MultiPartParser
7
 
8
  from langchain.text_splitter import RecursiveCharacterTextSplitter
9
 
10
- # from langchain_huggingface import HuggingFaceEmbeddings
11
- from langchain_community.embeddings import HuggingFaceEmbeddings
 
12
  from langchain.prompts import PromptTemplate
13
  from langchain_core.prompts import ChatPromptTemplate
14
  from langchain_community.document_loaders import PyPDFLoader
 
7
 
8
  from langchain.text_splitter import RecursiveCharacterTextSplitter
9
 
10
+ from langchain_huggingface import HuggingFaceEmbeddings
11
+
12
+ # from langchain_community.embeddings import HuggingFaceEmbeddings
13
  from langchain.prompts import PromptTemplate
14
  from langchain_core.prompts import ChatPromptTemplate
15
  from langchain_community.document_loaders import PyPDFLoader