Réservations de voyage conversationnelles : Automatisation des réservations de vols et d'hôtels avec l'IA

Avancé

Ceci est unSupport Chatbot, AI Chatbotworkflow d'automatisation du domainecontenant 21 nœuds.Utilise principalement des nœuds comme Code, OpenAi, Switch, Webhook, EmailSend. Réservation de voyage conversationnelle : Automatisation des réservations de vols et d'hôtels avec GPT-3.5

Prérequis
  • Clé API OpenAI
  • Point de terminaison HTTP Webhook (généré automatiquement par n8n)
  • Peut nécessiter les informations d'identification d'authentification de l'API cible
Aperçu du workflow
Visualisation des connexions entre les nœuds, avec support du zoom et du déplacement
Exporter le workflow
Copiez la configuration JSON suivante dans n8n pour importer et utiliser ce workflow
{
  "id": "zqOUjpxu04PO1idj",
  "meta": {
    "instanceId": "dd69efaf8212c74ad206700d104739d3329588a6f3f8381a46a481f34c9cc281",
    "templateCredsSetupCompleted": true
  },
  "name": "Conversational Travel Booker: Automate Flight & Hotel Reservations with AI",
  "tags": [],
  "nodes": [
    {
      "id": "8b53e7e2-cedb-42a9-8918-3d7e8d0a23d1",
      "name": "Webhook Trigger",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -660,
        -80
      ],
      "webhookId": "booking-webhook",
      "parameters": {
        "path": "booking-request",
        "options": {},
        "httpMethod": "POST",
        "responseMode": "responseNode"
      },
      "typeVersion": 1
    },
    {
      "id": "16a396bd-3200-4be1-80d4-364d8a7a65e6",
      "name": "Analyseur de requête IA",
      "type": "n8n-nodes-base.openAi",
      "position": [
        -440,
        -80
      ],
      "parameters": {
        "model": "=gpt-3.5-turbo",
        "prompt": "Hello",
        "options": {
          "temperature": 0.3
        },
        "requestOptions": {}
      },
      "credentials": {
        "openAiApi": {
          "id": "CDQ16eImh6D4tY15",
          "name": "OpenAi account 2 - test"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "d3d569ce-8e9b-4d88-ba84-e39f5cc41bf9",
      "name": "Routeur de type de réservation",
      "type": "n8n-nodes-base.switch",
      "position": [
        -220,
        -101
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "79041d5f-75e0-43e1-92be-486dcfb30847",
      "name": "Processeur de données de vol",
      "type": "n8n-nodes-base.code",
      "position": [
        0,
        -180
      ],
      "parameters": {
        "jsCode": "// Parse AI response and prepare flight search\nconst aiResponse = $input.first().json.choices[0].message.content;\nlet bookingData;\n\ntry {\n  // Try to parse as JSON first\n  bookingData = JSON.parse(aiResponse);\n} catch {\n  // If not JSON, extract info from text\n  bookingData = {\n    type: 'flight',\n    origin: extractValue(aiResponse, ['from', 'origin', 'departure']),\n    destination: extractValue(aiResponse, ['to', 'destination', 'arrival']),\n    departDate: extractValue(aiResponse, ['depart', 'departure date', 'leaving']),\n    passengers: extractValue(aiResponse, ['passenger', 'traveler', 'people']) || 1\n  };\n}\n\nfunction extractValue(text, keywords) {\n  for (const keyword of keywords) {\n    const regex = new RegExp(`${keyword}[:\\s]+([^\\n,]+)`, 'i');\n    const match = text.match(regex);\n    if (match) return match[1].trim();\n  }\n  return null;\n}\n\n// Prepare flight search parameters\nconst flightSearch = {\n  origin: bookingData.origin || 'NYC',\n  destination: bookingData.destination || 'LAX',\n  departureDate: bookingData.departDate || new Date().toISOString().split('T')[0],\n  passengers: parseInt(bookingData.passengers) || 1,\n  class: bookingData.class || 'economy'\n};\n\nreturn { json: { bookingData, flightSearch, originalRequest: $input.first().json } };"
      },
      "typeVersion": 2
    },
    {
      "id": "ac45ba1d-40a7-4f4e-98f6-ce3a17c94cbe",
      "name": "Processeur de données hôtelières",
      "type": "n8n-nodes-base.code",
      "position": [
        0,
        20
      ],
      "parameters": {
        "jsCode": "// Parse AI response and prepare hotel search\nconst aiResponse = $input.first().json.choices[0].message.content;\nlet bookingData;\n\ntry {\n  bookingData = JSON.parse(aiResponse);\n} catch {\n  bookingData = {\n    type: 'hotel',\n    destination: extractValue(aiResponse, ['destination', 'city', 'location']),\n    checkIn: extractValue(aiResponse, ['check in', 'arrival', 'checkin']),\n    checkOut: extractValue(aiResponse, ['check out', 'departure', 'checkout']),\n    guests: extractValue(aiResponse, ['guest', 'people', 'traveler']) || 2,\n    rooms: extractValue(aiResponse, ['room']) || 1\n  };\n}\n\nfunction extractValue(text, keywords) {\n  for (const keyword of keywords) {\n    const regex = new RegExp(`${keyword}[:\\s]+([^\\n,]+)`, 'i');\n    const match = text.match(regex);\n    if (match) return match[1].trim();\n  }\n  return null;\n}\n\n// Prepare hotel search parameters\nconst hotelSearch = {\n  destination: bookingData.destination || 'New York',\n  checkIn: bookingData.checkIn || new Date().toISOString().split('T')[0],\n  checkOut: bookingData.checkOut || new Date(Date.now() + 86400000).toISOString().split('T')[0],\n  guests: parseInt(bookingData.guests) || 2,\n  rooms: parseInt(bookingData.rooms) || 1\n};\n\nreturn { json: { bookingData, hotelSearch, originalRequest: $input.first().json } };"
      },
      "typeVersion": 2
    },
    {
      "id": "e9c34a77-e19b-4cf6-86ed-736b815c353f",
      "name": "Moteur de recherche de vols API",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        220,
        -180
      ],
      "parameters": {
        "url": "https://api.aviationstack.com/v1/flights",
        "options": {},
        "sendQuery": true,
        "authentication": "predefinedCredentialType",
        "queryParameters": {
          "parameters": [
            {
              "name": "dep_iata",
              "value": "={{ $json.flightSearch.origin }}"
            },
            {
              "name": "arr_iata",
              "value": "={{ $json.flightSearch.destination }}"
            },
            {
              "name": "limit",
              "value": "5"
            }
          ]
        },
        "nodeCredentialType": "aviationStackApi"
      },
      "typeVersion": 4.1
    },
    {
      "id": "d49ce324-9a2b-4bb2-81db-a55f3977aa0d",
      "name": "Moteur de recherche hôtelière API",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        220,
        20
      ],
      "parameters": {
        "url": "https://api.booking.com/v1/hotels/search",
        "options": {},
        "sendQuery": true,
        "authentication": "predefinedCredentialType",
        "queryParameters": {
          "parameters": [
            {
              "name": "dest_id",
              "value": "={{ $json.hotelSearch.destination }}"
            },
            {
              "name": "checkin_date",
              "value": "={{ $json.hotelSearch.checkIn }}"
            },
            {
              "name": "checkout_date",
              "value": "={{ $json.hotelSearch.checkOut }}"
            },
            {
              "name": "adults_number",
              "value": "={{ $json.hotelSearch.guests }}"
            },
            {
              "name": "room_number",
              "value": "={{ $json.hotelSearch.rooms }}"
            }
          ]
        },
        "nodeCredentialType": "bookingComApi"
      },
      "typeVersion": 4.1
    },
    {
      "id": "0840d661-f296-4a66-94cc-4ee03dd30300",
      "name": "Processeur de réservation de vol",
      "type": "n8n-nodes-base.code",
      "position": [
        440,
        -180
      ],
      "parameters": {
        "jsCode": "// Process flight search results and prepare booking\nconst searchResults = $input.first().json;\nconst bookingData = $input.first().json;\n\n// Mock flight results if API fails\nconst flights = searchResults.data || [\n  {\n    flight_number: 'AA123',\n    airline: 'American Airlines',\n    departure: { airport: bookingData.flightSearch?.origin || 'NYC', time: '09:00' },\n    arrival: { airport: bookingData.flightSearch?.destination || 'LAX', time: '12:00' },\n    price: 299,\n    duration: '5h 30m'\n  },\n  {\n    flight_number: 'DL456',\n    airline: 'Delta Airlines', \n    departure: { airport: bookingData.flightSearch?.origin || 'NYC', time: '14:00' },\n    arrival: { airport: bookingData.flightSearch?.destination || 'LAX', time: '17:30' },\n    price: 325,\n    duration: '5h 30m'\n  }\n];\n\n// Select best flight (lowest price)\nconst selectedFlight = flights.sort((a, b) => (a.price || 299) - (b.price || 325))[0];\n\n// Prepare booking confirmation\nconst booking = {\n  type: 'flight',\n  status: 'confirmed',\n  confirmation: `FL${Date.now()}`,\n  details: selectedFlight,\n  passenger: {\n    name: 'John Doe', // In real workflow, get from user data\n    email: 'john@example.com'\n  },\n  total: selectedFlight.price || 299\n};\n\nreturn { json: { booking, searchResults: flights } };"
      },
      "typeVersion": 2
    },
    {
      "id": "eb5d528a-6bd8-4546-8744-9ce2f0416ea4",
      "name": "Processeur de réservation hôtelière",
      "type": "n8n-nodes-base.code",
      "position": [
        440,
        20
      ],
      "parameters": {
        "jsCode": "// Process hotel search results and prepare booking\nconst searchResults = $input.first().json;\nconst bookingData = $input.first().json;\n\n// Mock hotel results if API fails\nconst hotels = searchResults.hotels || [\n  {\n    name: 'Grand Plaza Hotel',\n    location: bookingData.hotelSearch?.destination || 'New York',\n    rating: 4.5,\n    price_per_night: 150,\n    amenities: ['WiFi', 'Pool', 'Gym'],\n    room_type: 'Deluxe Room'\n  },\n  {\n    name: 'City Center Inn',\n    location: bookingData.hotelSearch?.destination || 'New York',\n    rating: 4.0,\n    price_per_night: 120,\n    amenities: ['WiFi', 'Breakfast'],\n    room_type: 'Standard Room'\n  }\n];\n\n// Select best hotel (highest rating)\nconst selectedHotel = hotels.sort((a, b) => (b.rating || 4) - (a.rating || 3.5))[0];\n\n// Calculate total nights\nconst checkIn = new Date(bookingData.hotelSearch?.checkIn || new Date());\nconst checkOut = new Date(bookingData.hotelSearch?.checkOut || new Date(Date.now() + 86400000));\nconst nights = Math.ceil((checkOut - checkIn) / (1000 * 60 * 60 * 24)) || 1;\n\n// Prepare booking confirmation\nconst booking = {\n  type: 'hotel',\n  status: 'confirmed',\n  confirmation: `HT${Date.now()}`,\n  details: selectedHotel,\n  guest: {\n    name: 'John Doe',\n    email: 'john@example.com'\n  },\n  nights: nights,\n  total: (selectedHotel.price_per_night || 120) * nights\n};\n\nreturn { json: { booking, searchResults: hotels } };"
      },
      "typeVersion": 2
    },
    {
      "id": "ee741a63-77c7-4348-b62d-32150bdc4e4b",
      "name": "Générateur de message de confirmation",
      "type": "n8n-nodes-base.openAi",
      "position": [
        660,
        -80
      ],
      "parameters": {
        "model": "=gpt-3.5-turbo",
        "prompt": "{{json.data}}",
        "options": {
          "temperature": 0.7
        },
        "requestOptions": {}
      },
      "credentials": {
        "openAiApi": {
          "id": "CDQ16eImh6D4tY15",
          "name": "OpenAi account 2 - test"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "45c5475b-31d2-4de8-b4b0-19acc57ef344",
      "name": "Envoyer l'email de confirmation",
      "type": "n8n-nodes-base.emailSend",
      "position": [
        880,
        -80
      ],
      "webhookId": "f80f3193-3a16-47c4-b8b3-23ac37cb8dfd",
      "parameters": {
        "text": "{{json.data}}",
        "options": {
          "allowUnauthorizedCerts": true
        },
        "subject": "🎉 Your Travel Booking is Confirmed!",
        "toEmail": "xyz@gmail.com",
        "fromEmail": "abc@gmail.com"
      },
      "credentials": {
        "smtp": {
          "id": "G1kyF8cSWTZ4vouN",
          "name": "SMTP -test"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "1b362532-fb06-497b-9858-609d9ad6fa9b",
      "name": "Envoyer la réponse",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        1100,
        -80
      ],
      "parameters": {
        "options": {},
        "respondWith": "json",
        "responseBody": {
          "status": "success",
          "booking": "{{ $('flight-booking-processor').item.json.booking || $('hotel-booking-processor').item.json.booking }}",
          "message": "{{ $('confirmation-generator').item.json.choices[0].message.content }}",
          "confirmation_code": "{{ $('flight-booking-processor').item.json.booking?.confirmation || $('hotel-booking-processor').item.json.booking?.confirmation }}"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "6b6f2ebf-fda1-4a32-b8a3-5cb9525b4534",
      "name": "Note adhésive",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -685,
        -220
      ],
      "parameters": {
        "color": 5,
        "width": 150,
        "height": 300,
        "content": "Accepts booking requests via HTTP POST"
      },
      "typeVersion": 1
    },
    {
      "id": "3a6ac642-06a1-4c10-93ec-a8ef60ed7f1f",
      "name": "Note adhésive1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        195,
        -320
      ],
      "parameters": {
        "color": 4,
        "width": 150,
        "height": 520,
        "content": " Searches for flights/hotels (with mock fallbacks)"
      },
      "typeVersion": 1
    },
    {
      "id": "4c698f05-39a6-4369-88a4-8e92f43b1b18",
      "name": "Note adhésive2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -25,
        -320
      ],
      "parameters": {
        "color": 6,
        "width": 150,
        "height": 520,
        "content": " Extracts and structures booking parameters"
      },
      "typeVersion": 1
    },
    {
      "id": "8721b991-ce05-4244-84bf-237312498fbc",
      "name": "Note adhésive3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -240,
        -220
      ],
      "parameters": {
        "width": 150,
        "height": 300,
        "content": "Automatically determines if it's a flight or hotel booking"
      },
      "typeVersion": 1
    },
    {
      "id": "b1d232d9-31f0-4f31-9a0b-9ea14ee31ab5",
      "name": "Note adhésive4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -465,
        -220
      ],
      "parameters": {
        "color": 3,
        "width": 150,
        "height": 300,
        "content": " Uses OpenAI to understand natural language booking requests"
      },
      "typeVersion": 1
    },
    {
      "id": "c001363a-c58c-406f-9cef-d7ad668fb071",
      "name": "Note adhésive5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        855,
        -220
      ],
      "parameters": {
        "color": 5,
        "width": 150,
        "height": 300,
        "content": "Sends booking confirmations via email"
      },
      "typeVersion": 1
    },
    {
      "id": "5d23d45e-23ab-45c8-8658-3a93ae8ec0c1",
      "name": "Note adhésive6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        635,
        -220
      ],
      "parameters": {
        "color": 2,
        "width": 150,
        "height": 300,
        "content": "Creates personalized confirmation messages"
      },
      "typeVersion": 1
    },
    {
      "id": "44b36b14-4353-45a1-894a-42596a2641fc",
      "name": "Note adhésive10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        415,
        -320
      ],
      "parameters": {
        "color": 3,
        "width": 150,
        "height": 520,
        "content": "Processes and confirms bookings"
      },
      "typeVersion": 1
    },
    {
      "id": "7588a845-8d92-4e8f-aa07-b454126f61f1",
      "name": "Note adhésive11",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1075,
        -220
      ],
      "parameters": {
        "color": 4,
        "width": 150,
        "height": 300,
        "content": "Returns structured booking data"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "62307eb8-de4c-41a1-aa27-7efc27a9f954",
  "connections": {
    "8b53e7e2-cedb-42a9-8918-3d7e8d0a23d1": {
      "main": [
        [
          {
            "node": "16a396bd-3200-4be1-80d4-364d8a7a65e6",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d49ce324-9a2b-4bb2-81db-a55f3977aa0d": {
      "main": [
        [
          {
            "node": "eb5d528a-6bd8-4546-8744-9ce2f0416ea4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "16a396bd-3200-4be1-80d4-364d8a7a65e6": {
      "main": [
        [
          {
            "node": "d3d569ce-8e9b-4d88-ba84-e39f5cc41bf9",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "e9c34a77-e19b-4cf6-86ed-736b815c353f": {
      "main": [
        [
          {
            "node": "0840d661-f296-4a66-94cc-4ee03dd30300",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d3d569ce-8e9b-4d88-ba84-e39f5cc41bf9": {
      "main": [
        [
          {
            "node": "79041d5f-75e0-43e1-92be-486dcfb30847",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "ac45ba1d-40a7-4f4e-98f6-ce3a17c94cbe",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ac45ba1d-40a7-4f4e-98f6-ce3a17c94cbe": {
      "main": [
        [
          {
            "node": "d49ce324-9a2b-4bb2-81db-a55f3977aa0d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "79041d5f-75e0-43e1-92be-486dcfb30847": {
      "main": [
        [
          {
            "node": "e9c34a77-e19b-4cf6-86ed-736b815c353f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "eb5d528a-6bd8-4546-8744-9ce2f0416ea4": {
      "main": [
        [
          {
            "node": "ee741a63-77c7-4348-b62d-32150bdc4e4b",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "45c5475b-31d2-4de8-b4b0-19acc57ef344": {
      "main": [
        [
          {
            "node": "1b362532-fb06-497b-9858-609d9ad6fa9b",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "0840d661-f296-4a66-94cc-4ee03dd30300": {
      "main": [
        [
          {
            "node": "ee741a63-77c7-4348-b62d-32150bdc4e4b",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ee741a63-77c7-4348-b62d-32150bdc4e4b": {
      "main": [
        [
          {
            "node": "45c5475b-31d2-4de8-b4b0-19acc57ef344",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Foire aux questions

Comment utiliser ce workflow ?

Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.

Dans quelles scénarios ce workflow est-il adapté ?

Avancé - Chatbot de support, Chatbot IA

Est-ce payant ?

Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.

Workflows recommandés

Plugin de réponses automatiques IA pour les médias sociaux (Instagram, Facebook et WhatsApp)
Système de réponse automatique aux messages des médias sociaux par IA basé sur Llama 3.2 (Instagram, Facebook, WhatsApp)
Code
Switch
Webhook
+
Code
Switch
Webhook
12 NœudsOneclick AI Squad
Chatbot de support
Bot de réponses aux questions fréquentes pour les compagnies aériennes
Utiliser GPT-4 et la classification des problèmes pour automatiser le support client des compagnies aériennes
If
Code
Merge
+
If
Code
Merge
27 NœudsOneclick AI Squad
Chatbot de support
Vérificateur de symptômes médicaux avec IA et recommandation de médecin
Analyse des symptômes médicaux et recommandation de médecins avec Ollama AI et WhatsApp
If
Code
Webhook
+
If
Code
Webhook
15 NœudsOneclick AI Squad
Chatbot de support
Automatisation du marketing et des réservations de restaurant avec Excel et l'assistant vocal VAPI
Automatisation du marketing et des réservations pour les restaurants avec Excel, l'assistant vocal VAPI et le calendrier
Set
Code
Webhook
+
Set
Code
Webhook
11 NœudsOneclick AI Squad
Nurturing de leads
Assistant intelligent de suivi d'activités et social
Automatisation du suivi d'événements avec un contact multicanal via GPT-4, LinkedIn et HubSpot
Code
Filter
Hubspot
+
Code
Filter
Hubspot
25 NœudsOneclick AI Squad
Nurturing de leads
Comparaison automatique des prix des hôtels par grattage multiplateforme et rapports par e-mail
Automatiser la comparaison des prix des hôtels avec un web scraping multiplateforme et des rapports par e-mail
If
Set
Code
+
If
Set
Code
19 NœudsOneclick AI Squad
Étude de marché
Informations sur le workflow
Niveau de difficulté
Avancé
Nombre de nœuds21
Catégorie2
Types de nœuds8
Description de la difficulté

Adapté aux utilisateurs avancés, avec des workflows complexes contenant 16+ nœuds

Auteur
Oneclick AI Squad

Oneclick AI Squad

@oneclick-ai

The AI Squad Initiative is a pioneering effort to build, automate and scale AI-powered workflows using n8n.io. Our mission is to help individuals and businesses integrate AI agents seamlessly into their daily operations from automating tasks and enhancing productivity to creating innovative, intelligent solutions. We design modular, reusable AI workflow templates that empower creators, developers and teams to supercharge their automation with minimal effort and maximum impact.

Liens externes
Voir sur n8n.io

Partager ce workflow

Catégories

Catégories: 34