habulaj commited on
Commit
e6ffd02
·
verified ·
1 Parent(s): f58baf7

Update routers/inference.py

Browse files
Files changed (1) hide show
  1. routers/inference.py +65 -22
routers/inference.py CHANGED
@@ -2,6 +2,7 @@ import os
2
  import logging
3
  import json
4
  import requests
 
5
  from fastapi import APIRouter, HTTPException
6
  from pydantic import BaseModel
7
  from google import genai
@@ -19,7 +20,7 @@ router = APIRouter()
19
 
20
  class NewsRequest(BaseModel):
21
  content: str
22
- file_id: str # ID do arquivo temporário ao invés da URL
23
 
24
  class NewsResponse(BaseModel):
25
  title: str
@@ -108,6 +109,58 @@ def get_brazilian_date_string():
108
  date_string = now.strftime("%d de %B de %Y")
109
  return date_string
110
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111
  def load_sources_file(file_id: str) -> str:
112
  """
113
  Carrega o arquivo de fontes pelo ID do arquivo temporário.
@@ -267,6 +320,7 @@ def extract_sources_from_response(response):
267
  async def rewrite_news(news: NewsRequest):
268
  """
269
  Endpoint para reescrever notícias usando o modelo Gemini com arquivo de fontes.
 
270
  """
271
  try:
272
  # Verificar API key
@@ -274,8 +328,17 @@ async def rewrite_news(news: NewsRequest):
274
  if not api_key:
275
  raise HTTPException(status_code=500, detail="API key não configurada")
276
 
 
 
 
 
 
 
 
 
 
277
  # Carregar arquivo de fontes pelo ID
278
- sources_content = load_sources_file(news.file_id)
279
 
280
  client = genai.Client(api_key=api_key)
281
  model = "gemini-2.5-pro"
@@ -286,39 +349,29 @@ async def rewrite_news(news: NewsRequest):
286
  # Instruções do sistema
287
  SYSTEM_INSTRUCTIONS = f"""
288
  Você é um jornalista brasileiro, escrevendo para portais digitais. Sua missão é transformar notícias internacionais em matérias originais, detalhadas e atualizadas para o público brasileiro. Sempre use a notícia-base como ponto de partida, mas consulte o arquivo fontes.txt para extrair todas as informações relevantes, complementando fatos, contexto, dados e antecedentes. Não invente informações; na dúvida, não insira.
289
-
290
  Seu estilo de escrita deve ser direto, claro e conversacional, sem jargões ou floreios desnecessários. Frases curtas e bem estruturadas, parágrafos segmentados para leitura digital e SEO. Evite repetições, clichês e generalizações.
291
-
292
  Evite frases redundantes ou genéricas como:
293
  - "Destacando como a experiência pode ser um divisor de águas profissional"
294
  - "Reafirma a força criativa do país no cenário global"
295
  - "A revelação contextualizou não apenas sua performance na dança, mas também"
296
-
297
  O conteúdo deve priorizar clareza, contexto e completude:
298
-
299
  - Comece com a informação mais relevante e específica.
300
  - Contextualize causas, consequências e conexões com outros acontecimentos.
301
  - Inclua dados, datas, lançamentos e fontes confiáveis.
302
  - Use citações, títulos de obras e nomes próprios quando pertinentes.
303
  - Finalize sempre com fatos concretos, nunca com opinião genérica.
304
-
305
  Formato da matéria:
306
-
307
  <headline>título aqui</headline>
308
  <subhead>subtítulo aqui</subhead>
309
  <body>conteúdo aqui</body>
310
  <instagram_title>título curto e chamativo para Instagram</instagram_title>
311
  <instagram_description>resumo atrativo com as principais informações, terminando com chamada para ler mais na bio</instagram_description>
312
-
313
  INSTRUÇÕES PARA CONTEÚDO INSTAGRAM:
314
  - Instagram Title: Direto, chamativo e informativo. Deve funcionar bem como texto sobreposto na imagem do post.
315
  - Instagram Description: Resumo de 2-3 parágrafos com os principais pontos da notícia, mas sem revelar tudo. Termine SEMPRE com uma chamada como "Leia mais sobre [tema] no link da nossa bio" ou variação similar. Adicione no máximo 5 hashtags no final.
316
-
317
  Use <strong> para destaques e <em> para títulos de obras, etc.
318
  Padrão de títulos: apenas a primeira palavra em maiúscula (exceto nomes próprios ou títulos de obras).
319
-
320
  O resultado deve soar como uma reportagem profissional, completa, confiável e envolvente, no estilo da Fox News: informativa, detalhada, mantendo linguagem humana e acessível. Sempre busque complementar a notícia com informações adicionais e contextos do arquivo fontes.txt, evitando opiniões pessoais. Mantenha tom informativo e predominantemente conservador (o jornal tem um público maior da ala da Direita/Republicana, sem juízos de valor ou opiniões pessoais. Não use linguagem woke, de vitimização ou que force interpretações ideológicas.
321
-
322
  A data de hoje é {date_string}.
323
  """
324
 
@@ -341,19 +394,12 @@ Observação: O Jornal mantém um público majoritário de maioria Republicana a
341
 
342
  EXAMPLE_INPUT_2 = """
343
  Observação: O Jornal mantém um público majoritário de maioria Republicana americana/Direita brasileira, então é um jornal parcialmente conservador. Escreva a notícia ciente disso. News base: The Office spinoff series 'The Paper' has set a September premiere date at Peacock.
344
-
345
  The new mockumentary series from Greg Daniels and Michael Koman will debut Sept. 4 on Peacock, the streamer announced Thursday. The first four episodes of 'The Paper' will premiere on Sept. 4, with two new episodes dropping every Thursday through Sept. 25.
346
-
347
  'The Paper' follows the documentary crew that immortalized Dunder Mifflin's Scranton branch in 'The Office' as they find a new subject when they discover a historic Midwestern newspaper and the publisher trying to revive it, according to the official logline.
348
-
349
  'The Office' fan-favorite Oscar Nuñez returns to the franchise in 'The Paper,' joining series regulars Domhnall Gleeson, Sabrina Impacciatore, Chelsea Frei, Melvin Gregg, Gbemisola Ikumelo, Alex Edelman, Ramona Young and Tim Key.
350
-
351
  Guest stars for the show include Eric Rahill, Tracy Letts, Molly Ephraim, Mo Welch, Allan Havey, Duane Shepard Sr., Nate Jackson and Nancy Lenehan.
352
-
353
  'The Paper' was created by Daniels, who created 'The Office,' under his banner Deedle-Dee Productions, and Koman, who has written on 'Nathan for You' and 'SNL.' Produced by Universal Television, a division of Universal Studio Group, 'The Paper' is executive produced by Ricky Gervais, Stephen Merchant, Howard Klein, Ben Silverman and Banijay Americas (formerly Reveille).
354
-
355
  Daniels serves as a director on the show alongside Ken Kwapis, Yana Gorskaya, Paul Lieberstein, Tazbah Chavez, Jason Woliner, Jennifer Celotta, Matt Sohn, Dave Rogers and Jeff Blitz.
356
-
357
  'The Office' launched in 2005 on NBC and ran for nine seasons leading up to the series finale in 2013. The cast of the beloved sitcom included Steve Carell, Rainn Wilson, John Krasinski, Jenna Fischer, Mindy Kaling and B.J. Novak, among others. The article is out of date, more information is needed.
358
  """
359
 
@@ -393,11 +439,8 @@ Observação: O Jornal mantém um público majoritário de maioria Republicana a
393
 
394
  EXAMPLE_INPUT_4 = """
395
  Observação: O Jornal mantém um público majoritário de maioria Republicana americana/Direita brasileira, então é um jornal parcialmente conservador. Escreva a notícia ciente disso. News base: Sylvester Stallone, Gloria Gaynor, Kiss Set for Kennedy Center Honors Amid Trump Overhaul
396
-
397
  The first honorees for the revamped Kennedy Center Honors have been unveiled by U.S. President Donald Trump, who is also the new chairman of the John F. Kennedy Center for the Performing Arts.
398
-
399
  This year’s honorees include Rocky star and filmmaker Sylvester Stallone; disco-era singer Gloria Gaynor; the rock band Kiss; Michael Crawford, the British star of Phantom of the Opera; and country crooner and songwriter George Strait.
400
-
401
  The 48th annual Kennedy Center Honors, set to air on the CBS network and stream on Paramount+, will be hosted by the U.S. President. Stallone was earlier named by Trump as one of his ambassadors to Hollywood. “He’s a very special guy. A real talent, never been given credit for the talent,” Trump added about the Hollywood actor during an hourlong press conference Wednesday
402
  """
403
 
 
2
  import logging
3
  import json
4
  import requests
5
+ import httpx
6
  from fastapi import APIRouter, HTTPException
7
  from pydantic import BaseModel
8
  from google import genai
 
20
 
21
  class NewsRequest(BaseModel):
22
  content: str
23
+ file_id: str = None # Agora é opcional
24
 
25
  class NewsResponse(BaseModel):
26
  title: str
 
109
  date_string = now.strftime("%d de %B de %Y")
110
  return date_string
111
 
112
+ async def generate_sources_from_content(content: str) -> str:
113
+ """
114
+ Chama o endpoint de busca de termos para gerar fontes baseadas no conteúdo.
115
+ Retorna o file_id do arquivo gerado.
116
+ """
117
+ try:
118
+ # Configurar a URL base - ajuste conforme sua configuração
119
+ base_url = os.getenv("BASE_URL", "http://localhost:8000")
120
+ search_url = f"{base_url}/search-terms"
121
+
122
+ # Fazer chamada HTTP para o endpoint de busca
123
+ payload = {"context": content}
124
+
125
+ async with httpx.AsyncClient(timeout=120.0) as client:
126
+ response = await client.post(search_url, json=payload)
127
+
128
+ if response.status_code != 200:
129
+ logger.error(f"Erro na busca de termos: {response.status_code} - {response.text}")
130
+ raise HTTPException(
131
+ status_code=500,
132
+ detail=f"Erro ao gerar fontes: {response.status_code}"
133
+ )
134
+
135
+ result = response.json()
136
+ file_info = result.get("file_info", {})
137
+ file_id = file_info.get("file_id")
138
+
139
+ if not file_id:
140
+ logger.error("File ID não encontrado na resposta da busca")
141
+ raise HTTPException(
142
+ status_code=500,
143
+ detail="Erro ao obter ID do arquivo de fontes"
144
+ )
145
+
146
+ logger.info(f"Fontes geradas com sucesso. File ID: {file_id}")
147
+ logger.info(f"Total de resultados encontrados: {result.get('total_results', 0)}")
148
+
149
+ return file_id
150
+
151
+ except httpx.RequestError as e:
152
+ logger.error(f"Erro de conexão ao gerar fontes: {str(e)}")
153
+ raise HTTPException(
154
+ status_code=503,
155
+ detail="Serviço de busca indisponível"
156
+ )
157
+ except Exception as e:
158
+ logger.error(f"Erro inesperado ao gerar fontes: {str(e)}")
159
+ raise HTTPException(
160
+ status_code=500,
161
+ detail=f"Erro interno ao gerar fontes: {str(e)}"
162
+ )
163
+
164
  def load_sources_file(file_id: str) -> str:
165
  """
166
  Carrega o arquivo de fontes pelo ID do arquivo temporário.
 
320
  async def rewrite_news(news: NewsRequest):
321
  """
322
  Endpoint para reescrever notícias usando o modelo Gemini com arquivo de fontes.
323
+ Se file_id não for fornecido, gera automaticamente as fontes baseadas no conteúdo.
324
  """
325
  try:
326
  # Verificar API key
 
328
  if not api_key:
329
  raise HTTPException(status_code=500, detail="API key não configurada")
330
 
331
+ # Se file_id não foi fornecido, gera as fontes automaticamente
332
+ if not news.file_id:
333
+ logger.info("File ID não fornecido. Gerando fontes automaticamente...")
334
+ file_id = await generate_sources_from_content(news.content)
335
+ logger.info(f"Fontes geradas automaticamente. File ID: {file_id}")
336
+ else:
337
+ file_id = news.file_id
338
+ logger.info(f"Usando file_id fornecido: {file_id}")
339
+
340
  # Carregar arquivo de fontes pelo ID
341
+ sources_content = load_sources_file(file_id)
342
 
343
  client = genai.Client(api_key=api_key)
344
  model = "gemini-2.5-pro"
 
349
  # Instruções do sistema
350
  SYSTEM_INSTRUCTIONS = f"""
351
  Você é um jornalista brasileiro, escrevendo para portais digitais. Sua missão é transformar notícias internacionais em matérias originais, detalhadas e atualizadas para o público brasileiro. Sempre use a notícia-base como ponto de partida, mas consulte o arquivo fontes.txt para extrair todas as informações relevantes, complementando fatos, contexto, dados e antecedentes. Não invente informações; na dúvida, não insira.
 
352
  Seu estilo de escrita deve ser direto, claro e conversacional, sem jargões ou floreios desnecessários. Frases curtas e bem estruturadas, parágrafos segmentados para leitura digital e SEO. Evite repetições, clichês e generalizações.
 
353
  Evite frases redundantes ou genéricas como:
354
  - "Destacando como a experiência pode ser um divisor de águas profissional"
355
  - "Reafirma a força criativa do país no cenário global"
356
  - "A revelação contextualizou não apenas sua performance na dança, mas também"
 
357
  O conteúdo deve priorizar clareza, contexto e completude:
 
358
  - Comece com a informação mais relevante e específica.
359
  - Contextualize causas, consequências e conexões com outros acontecimentos.
360
  - Inclua dados, datas, lançamentos e fontes confiáveis.
361
  - Use citações, títulos de obras e nomes próprios quando pertinentes.
362
  - Finalize sempre com fatos concretos, nunca com opinião genérica.
 
363
  Formato da matéria:
 
364
  <headline>título aqui</headline>
365
  <subhead>subtítulo aqui</subhead>
366
  <body>conteúdo aqui</body>
367
  <instagram_title>título curto e chamativo para Instagram</instagram_title>
368
  <instagram_description>resumo atrativo com as principais informações, terminando com chamada para ler mais na bio</instagram_description>
 
369
  INSTRUÇÕES PARA CONTEÚDO INSTAGRAM:
370
  - Instagram Title: Direto, chamativo e informativo. Deve funcionar bem como texto sobreposto na imagem do post.
371
  - Instagram Description: Resumo de 2-3 parágrafos com os principais pontos da notícia, mas sem revelar tudo. Termine SEMPRE com uma chamada como "Leia mais sobre [tema] no link da nossa bio" ou variação similar. Adicione no máximo 5 hashtags no final.
 
372
  Use <strong> para destaques e <em> para títulos de obras, etc.
373
  Padrão de títulos: apenas a primeira palavra em maiúscula (exceto nomes próprios ou títulos de obras).
 
374
  O resultado deve soar como uma reportagem profissional, completa, confiável e envolvente, no estilo da Fox News: informativa, detalhada, mantendo linguagem humana e acessível. Sempre busque complementar a notícia com informações adicionais e contextos do arquivo fontes.txt, evitando opiniões pessoais. Mantenha tom informativo e predominantemente conservador (o jornal tem um público maior da ala da Direita/Republicana, sem juízos de valor ou opiniões pessoais. Não use linguagem woke, de vitimização ou que force interpretações ideológicas.
 
375
  A data de hoje é {date_string}.
376
  """
377
 
 
394
 
395
  EXAMPLE_INPUT_2 = """
396
  Observação: O Jornal mantém um público majoritário de maioria Republicana americana/Direita brasileira, então é um jornal parcialmente conservador. Escreva a notícia ciente disso. News base: The Office spinoff series 'The Paper' has set a September premiere date at Peacock.
 
397
  The new mockumentary series from Greg Daniels and Michael Koman will debut Sept. 4 on Peacock, the streamer announced Thursday. The first four episodes of 'The Paper' will premiere on Sept. 4, with two new episodes dropping every Thursday through Sept. 25.
 
398
  'The Paper' follows the documentary crew that immortalized Dunder Mifflin's Scranton branch in 'The Office' as they find a new subject when they discover a historic Midwestern newspaper and the publisher trying to revive it, according to the official logline.
 
399
  'The Office' fan-favorite Oscar Nuñez returns to the franchise in 'The Paper,' joining series regulars Domhnall Gleeson, Sabrina Impacciatore, Chelsea Frei, Melvin Gregg, Gbemisola Ikumelo, Alex Edelman, Ramona Young and Tim Key.
 
400
  Guest stars for the show include Eric Rahill, Tracy Letts, Molly Ephraim, Mo Welch, Allan Havey, Duane Shepard Sr., Nate Jackson and Nancy Lenehan.
 
401
  'The Paper' was created by Daniels, who created 'The Office,' under his banner Deedle-Dee Productions, and Koman, who has written on 'Nathan for You' and 'SNL.' Produced by Universal Television, a division of Universal Studio Group, 'The Paper' is executive produced by Ricky Gervais, Stephen Merchant, Howard Klein, Ben Silverman and Banijay Americas (formerly Reveille).
 
402
  Daniels serves as a director on the show alongside Ken Kwapis, Yana Gorskaya, Paul Lieberstein, Tazbah Chavez, Jason Woliner, Jennifer Celotta, Matt Sohn, Dave Rogers and Jeff Blitz.
 
403
  'The Office' launched in 2005 on NBC and ran for nine seasons leading up to the series finale in 2013. The cast of the beloved sitcom included Steve Carell, Rainn Wilson, John Krasinski, Jenna Fischer, Mindy Kaling and B.J. Novak, among others. The article is out of date, more information is needed.
404
  """
405
 
 
439
 
440
  EXAMPLE_INPUT_4 = """
441
  Observação: O Jornal mantém um público majoritário de maioria Republicana americana/Direita brasileira, então é um jornal parcialmente conservador. Escreva a notícia ciente disso. News base: Sylvester Stallone, Gloria Gaynor, Kiss Set for Kennedy Center Honors Amid Trump Overhaul
 
442
  The first honorees for the revamped Kennedy Center Honors have been unveiled by U.S. President Donald Trump, who is also the new chairman of the John F. Kennedy Center for the Performing Arts.
 
443
  This year’s honorees include Rocky star and filmmaker Sylvester Stallone; disco-era singer Gloria Gaynor; the rock band Kiss; Michael Crawford, the British star of Phantom of the Opera; and country crooner and songwriter George Strait.
 
444
  The 48th annual Kennedy Center Honors, set to air on the CBS network and stream on Paramount+, will be hosted by the U.S. President. Stallone was earlier named by Trump as one of his ambassadors to Hollywood. “He’s a very special guy. A real talent, never been given credit for the talent,” Trump added about the Hollywood actor during an hourlong press conference Wednesday
445
  """
446