# Memória para agentes LangGraph: middleware do create_agent, sem nada no estado do grafo | Niadra

> Como dar memória de cliente a um agente LangGraph: NiadraMiddleware embrulha cada chamada ao modelo do create_agent, põe o contexto na mensagem de sistema, registra os turnos e traz as ferramentas do histórico, sem escrever nada no estado que o checkpointer guarda. Código do SDK e limites.

URL: https://niadra.com/integracoes/langgraph

Integração · LangGraph

# 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.

[Pedir acesso antecipado](/enterprise)[Documentação do adaptador(abre docs.niadra.com)](https://docs.niadra.com/integrations/langgraph)

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.

O exemplo mínimo, como está na documentação

```
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

[Ver o contexto por dentro](/produtos/contexto)

## 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.

## Outras integrações

-   [LiveKit Agents](/integracoes/livekit)
-   [Pipecat](/integracoes/pipecat)
-   [Vapi](/integracoes/vapi)
-   [Retell AI](/integracoes/retell)
-   [ElevenLabs Agents Platform](/integracoes/elevenlabs)
-   [Twilio](/integracoes/twilio)
-   [WhatsApp Cloud API](/integracoes/whatsapp)
-   [OpenAI Agents SDK](/integracoes/openai-agents)
-   [LangChain](/integracoes/langchain)
-   [CrewAI](/integracoes/crewai)
-   [Vercel AI SDK](/integracoes/ai-sdk)
-   [n8n](/integracoes/n8n)
-   [As 36 integrações, na documentação(abre docs.niadra.com)](https://docs.niadra.com/integrations/overview)

## 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](/enterprise)
