AI Appointment Scheduler
Un système de réservation full-stack propulsé par l'IA pour un salon de coiffure : le client réserve via une interface de chat en langage naturel, plutôt qu'un formulaire classique.
Ce que fait l'application
Le client décrit son besoin en langage naturel (« j'aimerais des mèches samedi prochain à 14 h ») et un agent IA conversationnel gère tout le flux de réservation — vérification des disponibilités, confirmation des détails et, le cas échéant, encaissement du paiement — dans un seul fil de discussion.
Points techniques clés
Agent ReAct LangGraph
Boucle de tool-calling (vérifier les disponibilités → réserver → demander le paiement), compilée une seule fois au démarrage et partagée entre toutes les sessions concurrentes via un état de conversation indexé par checkpoint.
Double chemin de requête
L'agent gère les interactions client tandis que les lectures admin contournent entièrement le LLM, pour un accès direct au service à faible latence.
Déclencheur de paiement structuré
L'agent émet une sentinelle structurée via une réponse d'outil ; le backend l'extrait et le frontend affiche une fenêtre de paiement intégrée — sans aucun parsing de prompt côté client.
Frontière de service nette
Toute la logique de persistance vit dans une seule classe de service, ce qui rend la couche de stockage interchangeable sans toucher à l'agent ni à l'API.
Dates en langage naturel
Grâce à python-dateparser, l'agent transmet la formulation de l'utilisateur telle quelle aux outils, sans lui imposer le format ISO.
Architecture
┌──────────────────────────────────────────────────────────────┐
│ BROWSER │
│ ┌────────────────────────┐ ┌────────────────────────┐ │
│ │ client-app :4200 │ │ admin-app :4201 │ │
│ │ SchedulingPrompt │ │ AppointmentList │ │
│ │ • chat UI │ │ • live table │ │
│ │ • threadId (UUID) │ │ • loading / error │ │
│ │ • payment modal │ │ │ │
│ └───────────┬────────────┘ └───────────┬────────────┘ │
└───────────────│────────────────────────────│────────────────┘
POST /chat GET /appointments
POST /appointments/{id}/pay POST /appointments/{id}/pay
│ │
┌───────────────▼────────────────────────────▼────────────────┐
│ FastAPI :8000 │
│ ┌────────────────────────┐ ┌────────────────────────┐ │
│ │ chat.py │ │ appointments.py │ │
│ │ rate limiter │ │ GET /appointments │ │
│ │ (20 req/60s/thread) │ │ GET /…/{id} │ │
│ │ │ │ │ POST /appointments │ │
│ │ ▼ │ │ POST /…/{id}/pay │ │
│ │ graph.ainvoke() │ └───────────┬────────────┘ │
│ │ scan ToolMessages │ │ │
│ │ → extract │ │ │
│ │ payment_request │ │ │
│ └───────────┬────────────┘ │ │
└───────────────│────────────────────────────│────────────────┘
▼ │
┌───────────────────────────────┐ │
│ LangGraph StateGraph │ │
│ (compiled once at startup) │ │
│ ┌─────────┐ tool_calls? │ │
│ │ agent │───────────────►│ │
│ │ node │◄───────────────│ │
│ └────┬────┘ ┌─────────┐ │ │
│ │ │ tools │ │ │
│ ▼ │ node │ │ │
│ END └────┬────┘ │ │
│ MemorySaver │ │ │
│ (thread_id key) │ │ │
└───────────────────────│───────┘ │
▼ ▼
┌──────────────────────────────────────────────────────────────┐
│ AppointmentService │
│ (single owner of all storage) │
│ check_availability │ book_appointment │ cancel │ mark_paid │
│ _store: dict[id → Appointment] │
│ (in-memory, PoC) │
└───────────────────────────────┬──────────────────────────────┘
│ (DATABASE_URL wired, not yet used)
▼
┌──────────────────┐
│ PostgreSQL │
│ port 5433 │
│ (Docker) │
└──────────────────┘L'idée architecturale clé est le déclencheur de paiement : l'agent émet une sentinelle payment_request via une réponse d'outil, extraite côté backend — le frontend affiche une fenêtre de paiement sans jamais interpréter le texte du LLM.
Stack technique
IA / Agent
- LangGraph (ReAct)
- LangChain
- Claude — Anthropic
- Custom agent tools
Backend
- Python
- FastAPI
- Pydantic Settings
- python-dateparser
Frontend
- Angular 21
- TypeScript
- Signals reactivity
- ngx-markdown
Infrastructure
- Docker
- PostgreSQL
Un agent IA pour votre métier ?
Discutons de la façon dont je peux concevoir des agents IA conversationnels qui automatisent vos parcours clients.