All projects

Ilyas Salas — Automation & AI Specialist · Rabat, GMT+1

Project 02 · Conduite Atlas · AI agent for driving schools

An AI assistant that answers driving-school prospects outside opening hours and books appointments — without ever inventing an answer.

Conduite Atlas: an n8n AI agent built for a fictional French driving school, as a demo of what I deliver to real ones.

The problem

Prospective students compare driving schools when the front desk can't answer.

A driving school's front desk covers its opening hours. But prospective students compare schools in the evening, on Sundays, or when the line is busy. The first school to answer usually gets the student.

  • In the evening
  • On Sundays
  • When the line is busy
What it does

Answer, capture leads, book — without making anything up.

It answers from the school's own information

Through semantic search (RAG), it answers questions on enrolment and required documents, prices and packages, financing (the permis à 1 € par jour, CPF, other aid), the highway code (code de la route), lessons, the exam, supervised driving (conduite accompagnée), the refund and cancellation policy, and opening hours.

It never makes anything up

If something isn't in the school's information, it says so instead of inventing an answer. Example: the motorcycle licence, which the school doesn't offer.

It captures leads

When it can't fully answer, or for a refund, complaint or cancellation, it asks for a first name and contact details, then logs the case for a human to call back. Nothing is logged without contact details.

It books appointments

It checks Google Calendar for free slots, refuses slots already taken, proposes free times within opening hours, asks for explicit confirmation, then creates the event.

It protects personal data

It has no access to individual student files and refuses to reveal personal information.

n8n editor chat: the assistant sums up the appointment on Tuesday 6 October 2026 at 9:30, the visitor writes “Je confirme”, then the assistant confirms the booking. On the right, the logs show the reserver_rdv tool call.
A booking in the n8n editor's chat; on the right, the reserver_rdv tool call.
Google Calendar: the “Rendez-vous inscription” appointment for Ilyas Salas, booked for Tuesday 6 October, 9:30 to 10:00.
The appointment created in Google Calendar.
Live demo

Ask the assistant a question.

It runs live on my own server and answers in French. A fictional driving school: use a made-up name and phone number.

How it works

An n8n agent that chooses between four tools.

The architecture in production.
  • n8n AI Agent with tool-calling, using an OpenAI chat model and conversation memory.
  • Four tools the agent chooses between: knowledge-base retrieval (RAG, OpenAI text-embedding-3-small embeddings), a lead and escalation logger (Google Sheets), an availability check (Google Calendar read) and booking (Google Calendar create).
  • The current date is injected into each message, so the agent resolves relative dates like “mardi prochain” (next Tuesday) correctly.
  • A detailed system prompt, in French, with a closed list of the school's offerings and worked examples.

Stack in production

  • Self-hosted n8n with Docker Compose on a Linux VPS.
  • Caddy reverse proxy with automatic HTTPS — the only service exposed to the internet.
  • PostgreSQL + pgvector for persistent memory and the knowledge base.
  • Secrets kept out of the code; the stack is versioned on GitHub.
Hard problems solved

What got in the way — and what I did about it.

01

Anti-fabrication vs over-refusal

The symptom
The agent first invented services, then started refusing to give information that was real.
The fix
A mandatory knowledge-base lookup, a closed list of the school's offerings, and examples in the prompt.
02

Model choice

The symptom
A smaller model failed at date reasoning and at the order in which to call tools.
The fix
Switching to a larger model fixed it.
03

Time zone

The symptom
Bookings appeared shifted by 2 hours.
The cause
Google Calendar's display time zone — not n8n.
04

Persistence

The symptom
The in-memory vector store reset on every restart.
The fix
A first attempt with Qdrant hit a bug inside the n8n Docker image, so I moved to PostgreSQL + pgvector.

Tested end to end

  • Document questions
  • Financing questions
  • Refusal to invent (motorcycle licence)
  • Lead capture with contact details
  • Booking with an availability check and double-booking refusal
Tech stack

What it's built with.

AI agent

  • n8n
  • AI Agent (tool-calling)
  • OpenAI (chat model)
  • Conversation memory

Knowledge base

  • RAG
  • OpenAI text-embedding-3-small
  • PostgreSQL
  • pgvector

Integrations

  • Google Calendar
  • Google Sheets

Infrastructure · in production

  • Docker Compose
  • Linux VPS
  • Caddy (automatic HTTPS)
  • GitHub
Contact

Running a driving school, or hiring?

For a driving school: the same assistant, built from your own information and your calendar. For an automation or AI role: I'll walk you through the system in detail.