Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

0
respostas

[Projeto] [Projeto] Faça como eu fiz: persistência e streaming

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}")