Skip to content

Node + LangGraph.js (chat com streaming)

Chat com tokens fluindo em tempo real para uma UI HTML mínima. Construído com LangGraph.js + LangChain.js, servido por Express via Server-Sent Events.

Tools

ToolDescrição
calculatorAvalia expressões aritméticas via mathjs.
tavily_searchBusca na web pelo Tavily. Desligada se TAVILY_API_KEY não estiver setado.

Deploy

tsuru app create chatbot nodejs -o shared-free
tsuru env-set -a chatbot \
  ANTHROPIC_API_KEY=SUA_CHAVE \
  TAVILY_API_KEY=SUA_CHAVE_TAVILY \
  --private
cd js-langgraph-streaming
tsuru app deploy -a chatbot .

Depois é só abrir https://chatbot.coffeece.com — os tokens devem aparecer conforme são gerados pela LLM, não tudo de uma vez no final.

API

POST /chat

{ "messages": [{ "role": "user", "content": "quanto é 17*19?" }] }

Resposta em text/event-stream:

data: {"type":"tool_call","name":"calculator","args":"{\"expression\":\"17*19\"}"}

data: {"type":"token","value":"O resultado "}

data: {"type":"token","value":"é 323."}

data: {"type":"done"}

Testar via curl (sem browser)

curl -N não bufferiza — você verá os frames chegando aos poucos:

APP=https://chatbot.coffeece.com

curl -N -X POST $APP/chat \
  -H 'Content-Type: application/json' \
  -d '{"messages":[{"role":"user","content":"quanto é 17*19? explique brevemente"}]}'
Se a resposta inteira chegar de uma vez (em vez de aos poucos), algum proxy está bufferizando. O server.js já manda X-Accel-Buffering: no e Cache-Control: no-cache, no-transform para o ingress-nginx do Coffeece — não deveria acontecer aqui, mas é bom saber se você for portar para outro ambiente.

Variáveis

VariávelPadrãoDescrição
ANTHROPIC_API_KEYObrigatória.
TAVILY_API_KEYOpcional. Sem ela, busca na web fica desligada mas a calculadora segue funcionando.
ANTHROPIC_MODELclaude-haiku-4-5Override do modelo.

Onde está o código

coffeece/examples/js-langgraph-streaming no GitHub.