1️ Conceito Aplicado
O objetivo do agente e:
Armazene informações relevantes dos e-mails (memória persistente)
Busque contexto anterior antes de responder
Construa prompt dinâmico com histórico + regras
Responda de forma contextualizada e coerente
Isso transforma o agente de reativo em contextual e acumulativo.
2️ Arquitetura do Fluxo
Novo e-mail recebido
Search Memory Tool (busca contexto relevante)
Prompt Dinâmico (histórico + regras + perfil)
LLM decide ação
Managed Memory Tool (salva nova informação relevante)
Resposta
3️ Setup Básico
pip install langgraph langchain langchain-google-genai langmem python-dotenv
import os
from dotenv import load_dotenv
from typing import TypedDict
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain.agents import tool
from langgraph.graph import StateGraph, END
from langmem import MemoryManager
load_dotenv()
llm = ChatGoogleGenerativeAI(
model="gemini-1.5-flash",
temperature=0
)
4️ Estado do Grafo
class EmailState(TypedDict):
email: str
memory_context: str
response: str
5️ Configuração da Memória
memory = MemoryManager()
6️ Managed Memory Tool (Salvar Memória)
Responsável por armazenar informações importantes.
@tool
def ManagedMemoryTool(content: str):
"""Armazena informações relevantes na memória."""
memory.add(content)
return "Memória atualizada com sucesso."
7️ Search Memory Tool (Buscar Memória)
Busca informações anteriores relacionadas ao e-mail atual.
@tool
def SearchMemoryTool(query: str):
"""Busca informações relevantes na memória."""
results = memory.search(query)
return "\n".join(results) if results else "Nenhum contexto relevante encontrado."
8️ Construção Dinâmica do Prompt
Aqui combinamos:
Perfil do usuário
Regras
Histórico relevante
Novo e-mail
user_profile = {
"name": "Moacir",
"role": "Advogado",
}
triage_rules = """
Responda formalmente.
Priorize clientes.
Considere compromissos anteriores.
"""
def build_dynamic_prompt(email, memory_context):
return f"""
Você é assistente de {user_profile['name']}, {user_profile['role']}.
Regras:
{triage_rules}
Contexto relevante anterior:
{memory_context}
Novo e-mail:
{email}
Responda considerando o histórico.
"""
9️ Nó de Busca de Memória
def search_memory_node(state: EmailState):
context = SearchMemoryTool.invoke(state["email"])
return {"memory_context": context}
10 Nó do Agente com Prompt Dinâmico
def agent_node(state: EmailState):
prompt = build_dynamic_prompt(
state["email"],
state["memory_context"]
)
response = llm.invoke(prompt)
# Salva informações importantes automaticamente
ManagedMemoryTool.invoke(
f"E-mail processado: {state['email']}"
)
return {"response": response.content}
1️1️ Construção do Grafo
builder = StateGraph(EmailState)
builder.add_node("search_memory", search_memory_node)
builder.add_node("agent", agent_node)
builder.set_entry_point("search_memory")
builder.add_edge("search_memory", "agent")
builder.add_edge("agent", END)
graph = builder.compile()
1️2️ Execução
initial_state = {
"email": """
Assunto: Audiência semana que vem
Dr., confirmando disponibilidade para audiência já mencionada anteriormente.
"""
}
result = graph.invoke(initial_state)
print(result["response"])
Evolução Conceitual
Sem memória → agente responde isoladamente
Com memória → agente constrói continuidade narrativa