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
| Tool | Descrição |
|---|---|
calculator | Avalia expressões aritméticas via mathjs. |
tavily_search | Busca 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ável | Padrão | Descrição |
|---|---|---|
ANTHROPIC_API_KEY | — | Obrigatória. |
TAVILY_API_KEY | — | Opcional. Sem ela, busca na web fica desligada mas a calculadora segue funcionando. |
ANTHROPIC_MODEL | claude-haiku-4-5 | Override do modelo. |
Onde está o código
coffeece/examples/js-langgraph-streaming
no GitHub.