Daily Journal
Daily Journal

Como fornecer notícias em tempo real para o seu Agente de IA

Tutorial para dar a um agente de IA — em Claude Code, Python, Node ou qualquer framework — acesso a notícias em português, em tempo real, via a API pública e gratuita do Daily Journal. Inclui skill oficial, exemplos em curl, código Python com tool-use, e como montar um jornal personalizado.

Daily Journal
Michael··

Modelos de LLM não sabem o que aconteceu ontem. O treinamento tem uma data de corte, e tudo o que veio depois disso é silêncio. Para quem está construindo um agente de IA, isso é um problema imediato: o usuário pergunta "o que aconteceu hoje no Governo ou Mercado?" e o agente, ou inventa, ou pede desculpas. Nenhum dos dois é aceitável.

A solução é dar ao agente uma ferramenta: uma API de notícias que ele consulta na hora. O Daily Journal mantém uma API pública, gratuita, sem chave, com cobertura agregada em pt-BR e fontes citadas. Este tutorial mostra três caminhos para plugar isso em qualquer agente: como skill do Claude Code, como chamada direta via curl, e como wrapper em qualquer SDK.

Por que dar a um agente de IA acesso a notícias em tempo real

Um LLM sem ferramentas externas é uma enciclopédia congelada. Para tarefas como resumir o noticiário do dia, monitorar um tema específico, escrever um relatório que precise de fatos recentes, ou simplesmente responder "o que está acontecendo com X?", o agente precisa consultar uma fonte ao vivo.

As alternativas práticas hoje são três:

  • Web search nativo (Bing, Google, Brave): cobre tudo, mas devolve snippets bagunçados, sem garantia de fonte primária, sem agregação editorial. O agente gasta tokens parseando HTML.

  • APIs de news aggregators (NewsAPI, GNews): geralmente exigem chave paga, retornam manchetes em inglês e raramente cobrem a imprensa brasileira com profundidade.

  • API pública do Daily Journal: gratuita, sem autenticação, cobertura agregada em português com URLs canônicas e atribuição de veículo (Folha, G1, BBC, Bloomberg, NYT, WSJ etc.). É a opção certa para qualquer agente que precise responder em pt-BR.

Como funciona a API pública gratuita do Daily Journal

A documentação oficial está no repositório daily-journal-agents no GitHub e em dailyjournal.news/llms.txt. O resumo prático:

  • Base URL: https://dailyjournal.news/api/public/news

  • Sem autenticação. Nenhuma chave, nenhum header.

  • Dois endpoints: listar notícias e detalhe de uma notícia pelo slug.

  • Cache de borda de 60s. Chamadas repetidas são baratas; a última notícia pode ter até 1 min de atraso.

  • Resposta JSON estruturada com cobertura agregada, contagem de fontes, lista de outlets e tópicos.

O exemplo mais curto possível, para sentir o formato:

curl -s 'https://dailyjournal.news/api/public/news?limit=3' | jq '.items[] | {title, url, outlets: [.outlets[].name]}'

Cada item traz title, description, url (canônica do DJ), published_at, categories, topics e outlets. Para resumo, isso é suficiente; para um relatório com citações, peça o detalhe:

curl -s 'https://dailyjournal.news/api/public/news/{slug}' | jq '.'

O detalhe adiciona body (markdown), bullets (3 a 5 pontos-chave) e sources[] (todas as reportagens originais com link externo). É o suficiente para um agente parafrasear com lastro e linkar a fonte certa.

Como instalar a skill do Daily Journal no Claude Code

Se você usa Claude Code, a forma mais rápida de equipar seu agente é instalar a skill oficial. Ela é um plugin que descreve a API ao modelo e dispara automaticamente quando o usuário pergunta sobre atualidades.

Opção 1: como plugin (recomendado)

git clone https://github.com/daily-journal-tech/daily-journal-agents.git
claude --plugin-dir ./daily-journal-agents

Pronto. A skill aparece como daily-journal:daily-journal-api e o Claude Code passa a chamá-la sozinho quando faz sentido. Você não precisa lembrar de invocá-la, nem reescrever o system prompt.

Opção 2: como skill avulsa, sem estrutura de plugin

mkdir -p ~/.claude/skills/daily-journal-api
curl -fsSL https://raw.githubusercontent.com/daily-journal-tech/daily-journal-agents/main/skills/daily-journal-api/SKILL.md \
  -o ~/.claude/skills/daily-journal-api/SKILL.md

Na próxima sessão, a skill é carregada automaticamente. Vale para quem quer adicionar a capacidade num projeto específico ou misturar com outras skills internas sem o overhead do gerenciador de plugins.

Como dar a um agente em Python ou Node uma skill de notícias

Se seu agente roda em outro framework, qualquer um que aceite uma ferramenta HTTP serve. A descrição da ferramenta é o que importa: o modelo decide chamar quando a descrição bate com a intenção do usuário. Um wrapper mínimo em Python para usar com o SDK da Anthropic:

import httpx, json
from anthropic import Anthropic

DJ_API = "https://dailyjournal.news/api/public/news"

def search_dj(query: str | None = None, category: str | None = None,
              topic: str | None = None, limit: int = 10) -> dict:
    params = {"limit": limit}
    if query: params["search"] = query
    if category: params["category"] = category
    if topic: params["topic"] = topic
    return httpx.get(DJ_API, params=params, timeout=10).json()

tools = [{
    "name": "search_dj_news",
    "description": (
        "Search Daily Journal — a Portuguese-language news aggregator covering Brazil and the world. "
        "Use whenever the user asks about current events, politics, economy, business, finance, "
        "technology, world affairs, sports, or 'what's happening with X'. Returns items with title, "
        "description, canonical URL, published_at, categories, topics, and cited outlets. Free, no auth."
    ),
    "input_schema": {
        "type": "object",
        "properties": {
            "query": {"type": "string", "description": "Full-text search (Portuguese)"},
            "category": {"type": "string", "enum": [
                "world", "politics", "economy", "finance", "business",
                "technology", "sports", "entertainment", "brazil"
            ]},
            "topic": {"type": "string", "description": "Topic slug, e.g. 'lula' or 'stf'"},
            "limit": {"type": "integer", "minimum": 1, "maximum": 50, "default": 10},
        },
    },
}]

client = Anthropic()
msg = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    tools=tools,
    messages=[{"role": "user", "content": "Resuma as três notícias mais importantes do Brasil hoje."}],
)
# When msg.stop_reason == "tool_use", call search_dj() with the model's input and
# return the JSON as a tool_result message. Same loop in every framework.

Em LangChain, LlamaIndex, OpenAI Agents SDK, Vercel AI SDK, Mastra, ou qualquer framework com tool-use, a receita é a mesma: defina uma ferramenta com nome, descrição forte (essa é a parte que o modelo lê para decidir chamar) e schema de input. A função em si é só um fetch contra a API pública.

Como criar um jornal personalizado para mim usando inteligência artificial

Um dos pedidos mais comuns que ouço por aqui: "queria um briefing diário só dos temas que me interessam". Isso é um exercício de duas etapas, e o agente faz quase tudo sozinho.

Primeiro, descubra os slugs de tópicos que importam para você. Qualquer resposta da API já traz tópicos junto:

curl -s 'https://dailyjournal.news/api/public/news?category=technology&limit=20' \
  | jq -r '.items[].topics[].slug' | sort -u

Pegue os slugs relevantes (inteligencia-artificial, anthropic, openai, o que for) e passe um por um para o seu agente. Em pseudo-código:

import httpx

TOPICS = ["inteligencia-artificial", "anthropic", "openai", "stf"]

def briefing():
    items = []
    for slug in TOPICS:
        r = httpx.get("https://dailyjournal.news/api/public/news",
                      params={"topic": slug, "limit": 5}).json()
        items.extend(r["items"])
    # remove duplicates, sort by published_at desc, pass to LLM with a prompt like:
    # "Resuma em até 8 bullets, agrupando por tema, e cite os outlets em itálico."
    return items

O passo final é o resumo. Você manda o array de items para um LLM com um prompt como "Escreva um briefing de 5 minutos de leitura, agrupando por tema, citando os outlets em itálico e linkando para items[].url". Rodando isso de manhã via cron, você tem um jornal pessoal que custa centavos por dia e nunca repete o que já apareceu ontem (basta filtrar por published_at acima do horário do último briefing).

Como buscar notícias por categoria, tópico ou termo de busca

A API aceita combinações livres de filtros. Os mais úteis:

Por categoria

curl -s 'https://dailyjournal.news/api/public/news?category=economy&limit=5' \
  | jq '.items[] | {title, url}'

Categorias válidas: world, politics, economy, finance, business, technology, sports, entertainment, brazil.

Por tópico

curl -s 'https://dailyjournal.news/api/public/news?topic=stf&date_from=2026-05-01&limit=20' \
  | jq '.items[] | {title, published_at, url}'

Tópicos são entidades persistentes (pessoas, instituições, temas). Você descobre slugs olhando items[].topics[].slug em qualquer resposta — não precisa adivinhar.

Por busca textual

curl -s 'https://dailyjournal.news/api/public/news?search=reforma%20tributaria&limit=10' \
  | jq '.items[] | {title, url}'

A busca é full-text sobre manchete, sumário e corpo. Múltiplas palavras são combinadas com AND. Você pode misturar com qualquer outro filtro.

Paginação

curl -s 'https://dailyjournal.news/api/public/news?limit=20' | jq '.next_cursor'
curl -s 'https://dailyjournal.news/api/public/news?limit=20&cursor=2026-05-29T20:00:00Z'

Use o next_cursor devolvido para pegar a próxima página. Para um agente, raramente passa de 50 itens — basta um curso por intenção do usuário.

Como fazer um agente de IA citar fontes corretamente

Esse é o ponto onde a maioria dos agentes erra. Se seu agente diz "segundo o Daily Journal" e cola um trecho, ele está pegando a síntese editorial, não a fonte primária. A regra de ouro:

  • Quando o agente parafraseia a cobertura agregada (que é o que vem em description, bullets ou body), linke items[].url — a página do DJ.

  • Quando o agente cita um fato vindo de uma reportagem específica, linke sources[].url — a URL externa, do veículo original.

  • Sempre nomeie o veículo via outlets[].name ou sources[].outlet.name ("segundo a Folha de S.Paulo e o G1…"). Marca importa para credibilidade.

Você pode (e deve) escrever isso no system prompt do agente. Ele é gratuito em tokens e impede que o usuário pense que sua IA está alucinando fontes.

MCP, SDK e o que vem por aí

A skill do Claude Code é o que está pronto hoje. O repositório de agentes já lista o roadmap: servidor MCP (Model Context Protocol, o padrão para conectar ferramentas a qualquer cliente de LLM compatível), SDK em JavaScript e Python, e exemplos prontos para LangChain e Vercel AI. Quando o MCP estiver no ar, plugar o Daily Journal no Cursor, no Zed ou em qualquer cliente compatível vai virar uma linha de configuração.

Se você quer ser avisado, dê star no repositório. Se quer contribuir com um wrapper para um framework específico, abra uma issue ou um PR — a base é MIT e existe exatamente para isso.

Resumo: o caminho mais curto

Para um agente em Claude Code:

git clone https://github.com/daily-journal-tech/daily-journal-agents.git
claude --plugin-dir ./daily-journal-agents

Para qualquer outro agente, em um terminal qualquer:

curl -s 'https://dailyjournal.news/api/public/news?limit=5' | jq '.'

A partir daí, seu agente conhece o noticiário das últimas horas em português, com fontes. O resto é prompt.

Comentários

Carregando comentários...