Une solution Docker complète pour développer, tester et déployer des agents LangGraph sans aucune installation locale (sauf Docker).
- Zero installation : Juste
docker-compose upet c'est parti! - Interface web locale : Créez et éditez vos agents directement dans le navigateur
- Stack complète : PostgreSQL, Redis, API LangGraph, Interface web
- Compatible Studio : Fonctionne avec LangGraph Studio officiel
- Mode développeur : Pas besoin de licence pour tester
- LangGraph API Server : Le serveur principal qui exécute vos agents
- PostgreSQL : Base de données pour la persistence
- Redis : Gestion des tâches et streaming
- Interface Web : Éditeur d'agents avec Monaco Editor
- Nginx Proxy : Routing propre entre les services
Créez un fichier .env avec votre clé API:
OPENAI_API_KEY=sk-...
# ou
ANTHROPIC_API_KEY=sk-ant-...# Méthode 1: Avec le script
chmod +x start.sh
./start.sh
# Méthode 2: Directement avec docker-compose
docker-compose up -d- Interface Studio Local: http://localhost
- API LangGraph: http://localhost:8123
- Documentation API: http://localhost:8123/docs
L'interface web locale permet de:
- Cliquez sur "+ Nouvel Agent"
- Donnez un nom à votre agent
- L'éditeur s'ouvre avec un template de base
- Éditeur Monaco (même que VS Code)
- Coloration syntaxique Python
- Auto-complétion de base
- Sélectionnez l'onglet "Test"
- Entrez un JSON d'entrée
- Cliquez sur "Exécuter Test"
- Voyez le résultat en temps réel
Utilisez la syntaxe suivante pour que Studio détecte le mode Chat:
- messages dans l'état:
messages: Annotated[List[BaseMessage], add_messages] - retourner des messages
AIMessage/HumanMessagedepuis le nœud - compiler le graphe et exposer
app
agent.py:
# agent.py
from typing import TypedDict, Annotated, List
from langgraph.graph import StateGraph, END
from langgraph.graph.message import add_messages
from langchain_core.messages import AIMessage, HumanMessage, BaseMessage
class State(TypedDict):
# Strongly typed messages so schema includes LC message structure
messages: Annotated[List[BaseMessage], add_messages]
def agent_node(state: State):
last_user = None
# Handle both LC messages and dicts defensively
for m in reversed(state["messages"]):
if isinstance(m, HumanMessage):
last_user = m.content
break
if isinstance(m, dict) and m.get("role") == "user":
last_user = m.get("content", "")
break
reply = f"Echo: {last_user}" if last_user else "Hello from echo agent"
return {"messages": [AIMessage(content=reply)]}
graph = StateGraph(State)
graph.add_node("agent", agent_node)
graph.set_entry_point("agent")
graph.add_edge("agent", END)
app = graph.compile()Si vous préférez utiliser LangGraph Studio officiel:
- Assurez-vous que l'API est lancée (port 8123)
- Si le Chat ne fonctionne pas avec le port 8123, utilisez le proxy Nginx (qui ajoute les en-têtes CORS): https://smith.langchain.com/studio/?baseUrl=http://localhost:8123
On peut aussi utiliser (chemin par NGINX) https://smith.langchain.com/studio/?baseUrl=http://localhost:8080 ou https://smith.langchain.com/studio/?baseUrl=http://localhost/api
- Ajoutez votre clé LangSmith côté API: export LANGSMITH_API_KEY=... (ou dans
.env) afin d'activer l'affichage des runs - Studio se connectera à votre serveur local
-
UI locale (éditeur d’agents) — http://localhost
- Créer/éditer les agents dans
agents/ - Tester via l’onglet "Test" (appelle l’API en local)
- Créer/éditer les agents dans
-
API LangGraph — http://localhost:8123
- C’est une API, pas un site. La racine
/renvoie "Not Found" (normal) - Documentation interactive: http://localhost:8123/docs
- Utilisée par l’UI locale et par LangGraph Studio
- C’est une API, pas un site. La racine
-
LangGraph Studio (cloud) — https://smith.langchain.com/studio/?baseUrl=http://localhost:8123
- Outil officiel pour visualiser et chatter avec vos graphs
- Affiche les runs si
LANGSMITH_API_KEYest défini côté API
Notes:
- Après ajout d’un nouvel agent, enregistrez-le dans
langgraph.jsonà la racine puis redémarrez le servicelanggraph-api. - Le fichier
langgraph.jsonde l’hôte est monté dans le conteneur à/app/langgraph.json.
L'API LangGraph expose plusieurs endpoints:
POST /runs/stream- Exécuter un agent en streamingGET /assistants- Lister les agents disponiblesPOST /threads- Créer une nouvelle conversationGET /threads/{thread_id}/state- Obtenir l'état d'une conversation
curl -X POST http://localhost:8123/runs/stream \
-H "Content-Type: application/json" \
-d '{
"assistant_id": "chatbot",
"input": {
"messages": [
{"role": "human", "content": "Bonjour!"}
]
}
}'# Voir les logs de tous les services
docker-compose logs -f
# Logs d'un service spécifique
docker-compose logs -f langgraph-api
# Redémarrer un service
docker-compose restart langgraph-api
# Arrêter tout
docker-compose down
# Arrêter et supprimer les données
docker-compose down -v
# Reconstruire les images
docker-compose build --no-cache
# Voir l'état des services
docker-compose ps- Vérifiez les logs:
docker-compose logs langgraph-api - Assurez-vous que PostgreSQL et Redis sont healthy
- Vérifiez que les clés API sont configurées
- Changez les ports dans docker-compose.yml
- Ou arrêtez le service qui utilise le port
- Assurez-vous que Docker Desktop est lancé
- Sur Linux:
sudo systemctl start docker
Pour la production:
- Activez l'authentification (
LANGGRAPH_AUTH_TYPE=bearer) - Utilisez HTTPS avec des certificats valides
- Configurez des mots de passe forts pour PostgreSQL
- Limitez l'accès réseau aux services
Cette stack se compose de 5 services principaux, reliés par le réseau langgraph-network:
- API LangGraph (
langgraph-api): chargelanggraph.json, expose/runs/stream,/threads, etc. - Redis (
langgraph-redis): file d'attente interne, streaming et orchestration in-memory. - PostgreSQL (
langgraph-postgres): persistence des runs/threads quand activée. - UI locale (
langgraph-ui): éditeur d'agents (Monaco), tests via/runs/stream. - Nginx (
langgraph-proxy): proxy optionnel (CORS, routage propre).
graph TD
Browser[🧑💻 Browser] -->|UI HTTP| Nginx[(Nginx Proxy)]
Nginx -->|/api -> 8123| API[LangGraph API]
Browser -->|Direct dev| API
API --> Redis[(Redis)]
API --> PG[(PostgreSQL)]
API -->|Telemetry opt| LangSmith[(LangSmith Cloud)]
- Au démarrage, l'API lit
langgraph.json(dans le conteneur:/app/langgraph.json). - Dans ce repo, le fichier hôte est monté dans le conteneur via
docker-compose.yml:- ./langgraph.json:/app/langgraph.json:ro
- Lorsqu’on ajoute un nouvel agent, on l’enregistre dans
langgraph.jsonet on redémarre le service API pour relire la config. - Vérification rapide dans le conteneur:
docker-compose exec langgraph-api cat /app/langgraph.json
sequenceDiagram
participant B as Browser (UI/Studio)
participant N as Nginx
participant A as LangGraph API
participant R as Redis
participant D as Postgres
participant LS as LangSmith (opt)
B->>N: POST /runs/stream { assistant_id, input }
N->>A: Proxy request
A->>R: Enqueue + stream events
A->>D: Persist thread/state (si activé)
A-->>B: SSE tokens / checkpoints
A-->>LS: Metadata/telemetry (si clé configurée)
- Chaque agent expose
appet unStateavecmessages: Annotated[Sequence[AnyMessage], add_messages]. - Les autres champs d’état sont optionnels pour accepter
{ "messages": [...] }. - Le dernier nœud ajoute un
AIMessagedansmessagespour la compatibilité Chat.
- Hot Reload: Les modifications dans l'interface web sont automatiquement rechargées
- Multiple Agents: Créez autant d'agents que nécessaire dans le dossier
agents/ - Partage: Les agents peuvent être exportés et partagés comme dossiers