@danhachuel/pandanews 0.4.5 → 0.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -14,6 +14,11 @@ Todas as versões publicadas são registradas aqui antes do publish (regra em AG
14
14
  - **Guard verificado por mutação**: com a flag removida do `pip`, com um `subprocess.run` direto no backend e com `--reload` no uvicorn, o teste falha em todos os casos (exit 1) — não é carimbo de borracha
15
15
  - Nota de transparência: a colisão de versão com o 0.4.03 já publicado no registry foi resolvida por renumeração, conforme a regra de sessões simultâneas do AGENTS.md
16
16
 
17
+ ## 0.4.06 (2026-11-08)
18
+
19
+ - Rótulos de exibição do LLM alinhados ao critério de aceitação: o provedor do Google passa a ser gravado/exposto como **`gemini`** em `noticias.llm_provider` (antes o id interno `google`), e os warning de fallback usam os nomines "NVIDIA NIM" e "Gemini" — `Modelo NVIDIA NIM indisponível (Status 404). Acionando fallback para Gemini.`
20
+ - Nenhuma mudança funcional de roteamento — apenas nomenclatura consistente entre banco, log e UI
21
+
17
22
  ## 0.4.05 (2026-11-08)
18
23
 
19
24
  - **HOTFIX — fallback à prova de falhas no LLM Router** (crítico): roteamento reescrito em `backend/core/llm_router.py`, agora explícito provedor por provedor na ordem configurada. Qualquer erro HTTP (4xx/5xx, incluindo **404/410** da NVIDIA) é interceptado, registrado (`Modelo nvidia indisponível (Status {status}). Acionando fallback para {próximo}.`) e o próximo provedor é acionado imediatamente — a geração não trava mais. A função devolve qual provedor respondeu (`noticias.llm_provider`) e o incidente fica em `backend.log`
@@ -31,7 +31,7 @@ async def lifespan(_: FastAPI):
31
31
  scheduler.parar()
32
32
 
33
33
 
34
- app = FastAPI(title="PandaNews API", version="0.4.5", lifespan=lifespan)
34
+ app = FastAPI(title="PandaNews API", version="0.4.6", lifespan=lifespan)
35
35
 
36
36
  app.add_middleware(
37
37
  CORSMiddleware,
@@ -18,6 +18,9 @@ from backend.core.config import DEFAULT_LLM_BASE_URLS, DEFAULT_LLM_MODELS
18
18
 
19
19
  PROVEDORES = ("nvidia", "google")
20
20
 
21
+ # Rótulos de exibição (banco, logs e UI usam "Gemini", não o id interno "google").
22
+ NOME_EXIBICAO = {"nvidia": "NVIDIA NIM", "google": "Gemini"}
23
+
21
24
  # Logger filho do uvicorn.error: mensagens vão para o backend.log (e stderr),
22
25
  # com a disciplina de logs do servidor.
23
26
  logger = logging.getLogger("uvicorn.error.pandanews")
@@ -68,8 +71,9 @@ def gerar_texto(db, prompt: str, max_tokens: int = 1024) -> tuple[str, str]:
68
71
  proximo = disponiveis[indice + 1] if indice + 1 < len(disponiveis) else None
69
72
  try:
70
73
  texto, modelo = _chamar_provedor(db, provider, prompt, max_tokens)
71
- logger.info("LLM: %s respondeu (modelo %s)", provider, modelo)
72
- return texto, provider
74
+ logger.info("LLM: %s respondeu (modelo %s)", NOME_EXIBICAO.get(provider, provider), modelo)
75
+ # Banco/UI rotulam o provedor do Gemini como "gemini" (não o id interno "google")
76
+ return texto, "gemini" if provider == "google" else provider
73
77
  except APIStatusError as exc:
74
78
  status = exc.status_code
75
79
  ultimo_erro = exc
@@ -78,9 +82,9 @@ def gerar_texto(db, prompt: str, max_tokens: int = 1024) -> tuple[str, str]:
78
82
  destino = proximo or "nenhum"
79
83
  logger.warning(
80
84
  "Modelo %s indisponível (Status %s). Acionando fallback para %s.",
81
- provider,
85
+ NOME_EXIBICAO.get(provider, provider),
82
86
  status,
83
- destino,
87
+ NOME_EXIBICAO.get(destino, destino),
84
88
  )
85
89
  except Exception as exc: # noqa: BLE001 — timeouts, rede, auth: tenta o próximo
86
90
  ultimo_erro = exc
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@danhachuel/pandanews",
3
- "version": "0.4.5",
3
+ "version": "0.4.6",
4
4
  "description": "SaaS local de criação e automação de múltiplos blogs de notícias com IA (FastAPI + React + Tailwind).",
5
5
  "license": "MIT",
6
6
  "type": "module",