Spaces:
Running
Running
Update routers/inference.py
Browse files- 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 #
|
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(
|
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 |
|