Retour aux projets Projet · Agent IA

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.

Agentic AI LangGraph ReAct Chat booking

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

1

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.

2

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.

3

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.

4

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.

5

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.