Memória para agentes LangGraph.
NiadraMiddleware embrulha cada chamada ao modelo do agente criado por langchain.agents.create_agent: o contexto entra na mensagem de sistema, os turnos são registrados e as ferramentas do histórico vêm junto. Nada é escrito no estado do grafo: o checkpointer nunca guarda um contexto.
O checkpointer do LangGraph persiste o estado de um thread: as mensagens deste grafo, para este thread. Uma store de memória de longo prazo guarda o que este agente decidiu lembrar, num namespace da sua aplicação. Nenhum dos dois sabe o que a cliente disse ao agente de voz de outro fornecedor nem o que o agente de cobrança fez no ERP.
A Niadra fica fora do grafo. O middleware acrescenta o contexto da cliente à mensagem de sistema, com as suas instruções primeiro, e o turn_block depois das mensagens, a cada chamada ao modelo. O estado continua só seu, e o checkpointer continua pequeno.
pip install 'niadra[langgraph]' # langgraph 1.2, langchain 1.4 and langchain-core 1.6 or newer, below 2"""A LangGraph agent (langchain.agents.create_agent) with the customer's memory as middleware."""
import asyncio
from langchain.agents import create_agent
from niadra import AsyncNiadra, phone
from niadra.integrations.langgraph import NiadraMiddleware
niadra = AsyncNiadra(channel="chat")
async def main() -> None:
async with niadra.conversation("thread-81", subject=phone("+5511912345678")) as conversation:
agent = create_agent(
"openai:gpt-4.1",
system_prompt="You are Acme's agent.",
middleware=[NiadraMiddleware(conversation)],
)
result = await agent.ainvoke(
{"messages": [{"role": "user", "content": "Where is my replacement lid?"}]}
)
print(result["messages"][-1].content)
await niadra.close()
asyncio.run(main())- Python
O mesmo código está em examples/langgraph_agent.py nos repositórios dos SDKs, onde roda na CI contra os tipos reais do framework e o emulador da Niadra. Para testar sem a nuvem da Niadra, niadra-mock e NIADRA_BASE_URL=http://127.0.0.1:8765.
Como o adaptador se liga
As cinco primitivas de toda integração da Niadra, nos pontos de extensão deste framework.
- Contexto
- O contexto é acrescentado à mensagem de sistema, o que deixa as suas instruções primeiro, e o turn_block vai depois das mensagens. Nada é escrito no estado do grafo. Para o create_react_agent mais antigo, pre_model_hook=pre_model_hook(conversation) entrega ao modelo as mesmas mensagens por llm_input_messages, também sem tocar no estado.
- Turnos
- As mensagens do cliente são registradas antes da chamada, chaveadas pela posição na conversa, então o histórico que o checkpointer repete nunca é registrado duas vezes; a resposta do modelo, com o usage_metadata, depois dela.
- Ferramentas
- O middleware traz as ferramentas do histórico, e as da memória do agente, como tools próprias, então create_agent as oferece sem você listar.
- Verificação
- conversation.verify() antes de invocar o agente.
- Transbordo
- transferred_to_agent() e transferred_to_human() registram a transferência; chame onde o grafo passa a conversa adiante.
O que o agente recebe
O contexto é compilado quando a memória muda e servido pronto, sem modelo de IA na leitura. O que outro canal disse durante a conversa chega como delta, no fim do prompt.
- Quem é o cliente, pelo que a conversa já provou: o nível de verificação decide o que entra
- Fatos, pendências e promessas, com a data e o canal de origem
- O que outros agentes fizeram por dentro, confirmado pelo sistema de registro
- Padrões calculados por regra, com as evidências e o prazo
- As três ferramentas do histórico: buscar, linha do tempo e abrir um item, amarradas ao cliente no seu código
- Comprovante de cada leitura, encadeado por SHA-256
O que o adaptador não faz
- Sem BaseStore próprio: a Niadra não é o armazenamento de estado do grafo.
- Sem nó próprio para o LangGraph.js: withNiadraContext() de @niadra/sdk/langchain já dá ao nó do modelo o contexto sem escrevê-lo no estado que o checkpointer guarda.
- Nada aqui derruba o agente: com a Niadra lenta ou fora, a chamada ao modelo segue sem o contexto.
- Testado contra langgraph 1.2 e langchain 1.4 com um chat model falso e a Niadra no emulador.
Perguntas frequentes
Posso continuar usando o checkpointer e a store que já tenho?
Pode, e deve. O middleware não toca no estado do grafo nem na store: o contexto entra na chamada ao modelo e sai dela. O que a Niadra guarda é a memória da empresa sobre o cliente, derivada dos eventos de todos os canais.
E no LangGraph.js?
withNiadraContext() de @niadra/sdk/langchain dá ao nó do modelo o contexto logo antes da chamada, sem escrever no estado; o NiadraCallbackHandler registra as respostas. O exemplo completo está na página do LangChain.
Cada execução do agente pode virar um registro de turno?
Pode, com a funcionalidade de registros de turno ligada no espaço: before_agent abre o turno, wrap_tool_call grava cada chamada de ferramenta e after_agent o fecha com as chamadas de modelo e os tokens. Num replay no seu CI, as ferramentas do grafo respondem do registro.
Preciso trocar de modelo, de prompt ou de fornecedor?
Não. O adaptador coloca o contexto depois das suas instruções e o delta no fim do prompt, nos pontos de extensão que o framework já tem. O seu modelo, o seu prompt e o seu fornecedor continuam os mesmos, e trocar qualquer um deles depois não apaga a memória.
Onde ficam os dados e quanto custa?
Os dados ficam numa região só, informada no contrato, cifrados com AES-256-GCM e chave exclusiva por empresa, protegida em HSM FIPS 140-3. O preço é por conversa ou tarefa em que um agente leu a memória: de US$ 2 a 3 a cada mil, conforme o volume, com leituras, buscas e eventos de sistema incluídos. A Niadra está abrindo para empresas por pedido, antes do lançamento.
Conte o que você está construindo.
E-mail corporativo e duas linhas sobre os seus agentes bastam. Quem responde é quem escreve o código, com uma proposta de acesso antecipado para o seu caso.
Prefere contar mais sobre a sua empresa? Use o formulário completo