import os
import sqlite3
from datetime import datetime
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_tavily import TavilySearch
from langchain_core.messages import HumanMessage
from langchain.agents import create_agent
from langgraph.checkpoint.sqlite import SqliteSaver
from langchain_core.tools import tool
current_tavily_api_key = os.getenv('TAVILY_API_KEY')
if not current_tavily_api_key:
raise ValueError("TAVILY_API_KEY não encontrada.")
# 2. Criar a ferramenta customizada blindada contra o bug de datas
tavily_client = TavilySearch(max_results=3, tavily_api_key=current_tavily_api_key)
@tool
def pesquisar_na_web(query: str) -> str:
"""Utilize esta ferramenta para buscar informações atualizadas na internet sobre clima, tempo e notícias recentes."""
# Força a execução puramente por texto, impedindo o Gemini de quebrar as datas do endpoint da API
return tavily_client.invoke({"query": query})
# 3. Definição do Prompt (Otimizado para datas informadas pelo usuário)
prompt_system = f"""Você é um assistente de pesquisa inteligente.
Considere como data atual o dia/ano que o usuário informar explicitamente na primeira mensagem da conversa. Mantenha essa mesma referência temporal para as mensagens de acompanhamento seguintes na mesma thread.
Você DEVE obrigatoriamente usar o mecanismo de busca (pesquisar_na_web) para procurar informações meteorológicas e climáticas em tempo real sobre o presente. Não responda da sua memória.
Você tem permissão para fazer múltiplas chamadas à ferramenta (em conjunto ou em sequência).
Quando solicitado a comparar informações (ex: qual é mais quente, maior, etc.), use as informações obtidas das buscas efetuadas.
Quando obtiver as respostas necessárias das ferramentas, elabore a resposta final para o usuário e encerre o fluxo."""
model = ChatGoogleGenerativeAI(
model="gemini-2.5-flash",
max_retries=3
)
with sqlite3.connect("checkpoints.db", check_same_thread=False) as conn:
memory = SqliteSaver(conn)
abot = create_agent(
model=model,
tools=[pesquisar_na_web], # <--- Passando a ferramenta blindada aqui
system_prompt=prompt_system,
checkpointer=memory
)
# SEQUÊNCIA DE TESTES DE MEMÓRIA (LINHA DO TEMPO)
# --- Pergunta 1: Tempo em São Paulo (Thread 1) ---
messages = [HumanMessage(content="Como está o tempo em São Paulo hoje (30/09/2026)?")]
thread1 = {
"configurable": {"thread_id": "1"},
"recursion_limit": 5
}
print("\n--- Pergunta 1: Tempo em São Paulo (Thread 1) ---")
try:
for event in abot.stream({"messages": messages}, thread1):
for k, v in event.items():
if k in ("agent", "tools"):
print(f"Nó [{k.upper()}]: {[msg.content for msg in v.get('messages', []) if msg.content]}")
except Exception as e:
print(f"Erro na Pergunta 1: {e}")
# --- Pergunta 2: Tempo no Rio de Janeiro (Thread 1 - Continuação) ---
messages = [HumanMessage(content="E no Rio de Janeiro?")]
thread2 = {
"configurable": {"thread_id": "1"},
"recursion_limit": 5
}
print("\n--- Pergunta 2: Tempo no Rio de Janeiro (Thread 1) ---")
try:
for event in abot.stream({"messages": messages}, thread2):
for k, v in event.items():
if k in ("agent", "tools"):
print(f"Nó [{k.upper()}]: {[msg.content for msg in v.get('messages', []) if msg.content]}")
except Exception as e:
print(f"Erro na Pergunta 2: {e}")
# --- Pergunta 3: Comparação (Thread 1 - Sabe sobre SP e RJ) ---
messages = [HumanMessage(content="Qual está mais quente?")]
thread3 = {
"configurable": {"thread_id": "1"},
"recursion_limit": 5
}
print("\n--- Pergunta 3: Comparação (Thread 1) ---")
try:
for event in abot.stream({"messages": messages}, thread3):
for k, v in event.items():
if k in ("agent", "tools"):
print(f"Nó [{k.upper()}]: {[msg.content for msg in v.get('messages', []) if msg.content]}")
except Exception as e:
print(f"Erro na Pergunta 3: {e}")
# --- Pergunta 4: Comparação Isolada (Thread 2 - Sem histórico anterior) ---
messages = [HumanMessage(content="Qual está mais quente?")]
thread4 = {
"configurable": {"thread_id": "2"},
"recursion_limit": 5
}
print("\n--- Pergunta 4: Comparação Isolada (Thread 2) ---")
try:
for event in abot.stream({"messages": messages}, thread4):
for k, v in event.items():
if k in ("agent", "tools"):
print(f"Nó [{k.upper()}]: {[msg.content for msg in v.get('messages', []) if msg.content]}")
except Exception as e:
print(f"Erro na Pergunta 4: {e}")