{
  "name": "Qualification des demandes entrantes par IA",
  "nodes": [
    {
      "id": "1bc7dc34-b9e1-4786-9ae3-dce79af91c14",
      "name": "Réception de la demande",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        100,
        300
      ],
      "parameters": {
        "httpMethod": "POST",
        "path": "demande-entrante",
        "responseMode": "responseNode",
        "options": {}
      },
      "webhookId": "ad790be6-7f99-4228-b2bc-9778ec1f25a3"
    },
    {
      "id": "a19dcd85-4bb2-4f46-97a8-af2f68186546",
      "name": "Normaliser la demande",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.5,
      "position": [
        300,
        300
      ],
      "parameters": {
        "mode": "manual",
        "includeOtherFields": false,
        "assignments": {
          "assignments": [
            {
              "id": "nom",
              "name": "nom",
              "value": "={{ ($json.body?.nom ?? $json.nom ?? \"\").trim() }}",
              "type": "string"
            },
            {
              "id": "email",
              "name": "email",
              "value": "={{ ($json.body?.email ?? $json.email ?? \"\").trim().toLowerCase() }}",
              "type": "string"
            },
            {
              "id": "message",
              "name": "message",
              "value": "={{ ($json.body?.message ?? $json.message ?? \"\").trim() }}",
              "type": "string"
            },
            {
              "id": "date",
              "name": "date",
              "value": "={{ $now.toFormat(\"yyyy-MM-dd HH:mm\") }}",
              "type": "string"
            }
          ]
        }
      }
    },
    {
      "id": "55bec267-112f-4463-b7b4-fc14647d8d09",
      "name": "Confirmer la réception",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.5,
      "position": [
        500,
        300
      ],
      "parameters": {
        "respondWith": "json",
        "responseBody": "{ \"statut\": \"reçue\" }",
        "options": {
          "responseCode": 200
        }
      }
    },
    {
      "id": "bd5da78a-d030-43f9-9f0b-30286f1f523d",
      "name": "Analyser la demande",
      "type": "@n8n/n8n-nodes-langchain.informationExtractor",
      "typeVersion": 1.2,
      "position": [
        300,
        450
      ],
      "parameters": {
        "text": "=Nom : {{ $json.nom }}\nE-mail : {{ $json.email }}\nMessage : {{ $json.message }}",
        "schemaType": "fromAttributes",
        "attributes": {
          "attributes": [
            {
              "name": "besoin",
              "type": "string",
              "description": "Le besoin principal du client, en quelques mots (exemple : réparation du site, nouveau devis, question de facturation)",
              "required": true
            },
            {
              "name": "urgence",
              "type": "string",
              "description": "Exactement un de ces mots : haute (blocage, perte d'argent, délai du jour), moyenne (demande à traiter dans la semaine), basse (information, idée, sans délai)",
              "required": true
            },
            {
              "name": "resume",
              "type": "string",
              "description": "Résumé de la demande en une phrase, en français",
              "required": true
            }
          ]
        },
        "options": {
          "systemPromptTemplate": "Tu qualifies les demandes entrantes d'une petite entreprise française. Extrais uniquement les informations demandées, en français. Pour le champ urgence, réponds seulement haute, moyenne ou basse, en minuscules."
        }
      }
    },
    {
      "id": "2e71653d-0355-4370-971f-97294d513b99",
      "name": "Claude",
      "type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
      "typeVersion": 1.5,
      "position": [
        100,
        450
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "claude-sonnet-4-6",
          "cachedResultName": "Claude Sonnet 4.6"
        },
        "options": {
          "temperature": 0.1
        }
      },
      "credentials": {}
    },
    {
      "id": "b6610352-ea9e-46b9-80fc-4e60a5f04a19",
      "name": "Router selon l'urgence",
      "type": "n8n-nodes-base.switch",
      "typeVersion": 3.4,
      "position": [
        500,
        450
      ],
      "parameters": {
        "mode": "rules",
        "rules": {
          "values": [
            {
              "renameOutput": true,
              "outputKey": "haute",
              "conditions": {
                "options": {
                  "caseSensitive": false,
                  "leftValue": "",
                  "typeValidation": "loose"
                },
                "conditions": [
                  {
                    "leftValue": "={{ $json.output.urgence }}",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "rightValue": "haute"
                  }
                ],
                "combinator": "and"
              }
            },
            {
              "renameOutput": true,
              "outputKey": "moyenne / basse",
              "conditions": {
                "options": {
                  "caseSensitive": false,
                  "leftValue": "",
                  "typeValidation": "loose"
                },
                "conditions": [
                  {
                    "leftValue": "={{ $json.output.urgence }}",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "rightValue": "moyenne"
                  },
                  {
                    "leftValue": "={{ $json.output.urgence }}",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "rightValue": "basse"
                  }
                ],
                "combinator": "or"
              }
            }
          ]
        },
        "options": {
          "fallbackOutput": "extra",
          "renameFallbackOutput": "Non classée"
        }
      }
    },
    {
      "id": "590f670c-215a-4b63-b4d8-8444e56c99ba",
      "name": "Alerter l'équipe sur Slack",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.6,
      "position": [
        700,
        450
      ],
      "parameters": {
        "resource": "message",
        "operation": "post",
        "authentication": "accessToken",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "",
          "cachedResultName": "Canal urgences (à choisir)"
        },
        "messageType": "text",
        "text": "=:rotating_light: Demande urgente\n*{{ $(\"Normaliser la demande\").item.json.nom }}* ({{ $(\"Normaliser la demande\").item.json.email }})\nBesoin : {{ $json.output.besoin }}\n> {{ $json.output.resume }}",
        "otherOptions": {
          "includeLinkToWorkflow": false
        }
      },
      "credentials": {},
      "onError": "continueRegularOutput"
    },
    {
      "id": "4703d47c-5b58-44b3-b461-3db3db5103e4",
      "name": "Prévenir l'équipe par e-mail",
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 2.1,
      "position": [
        700,
        600
      ],
      "parameters": {
        "operation": "send",
        "fromEmail": "À REMPLIR : Adresse expéditeur, par exemple alertes@atelier-martin.fr",
        "toEmail": "À REMPLIR : Adresse de l'équipe, par exemple equipe@atelier-martin.fr",
        "subject": "=Demande urgente : {{ $json.output.besoin }}",
        "emailFormat": "text",
        "text": "=Une demande urgente vient d'arriver.\n\nContact : {{ $(\"Normaliser la demande\").item.json.nom }} ({{ $(\"Normaliser la demande\").item.json.email }})\nBesoin : {{ $json.output.besoin }}\nRésumé : {{ $json.output.resume }}\n\nMessage complet :\n{{ $(\"Normaliser la demande\").item.json.message }}",
        "options": {
          "appendAttribution": false,
          "replyTo": "={{ $(\"Normaliser la demande\").item.json.email }}"
        }
      },
      "credentials": {},
      "onError": "continueRegularOutput"
    },
    {
      "id": "fe0a0dde-9d5f-49d2-842a-81a0dc74272f",
      "name": "Ajouter au tableur des demandes",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [
        700,
        750
      ],
      "parameters": {
        "resource": "sheet",
        "operation": "append",
        "authentication": "oAuth2",
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "",
          "cachedResultName": "Demandes entrantes (à choisir)"
        },
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Demandes"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "Date": "={{ $(\"Normaliser la demande\").item.json.date }}",
            "Nom": "={{ $(\"Normaliser la demande\").item.json.nom }}",
            "E-mail": "={{ $(\"Normaliser la demande\").item.json.email }}",
            "Besoin": "={{ $json.output.besoin }}",
            "Urgence": "={{ $json.output.urgence }}",
            "Résumé": "={{ $json.output.resume }}",
            "Message": "={{ $(\"Normaliser la demande\").item.json.message }}"
          },
          "schema": [
            {
              "id": "Date",
              "displayName": "Date",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Nom",
              "displayName": "Nom",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "E-mail",
              "displayName": "E-mail",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Besoin",
              "displayName": "Besoin",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Urgence",
              "displayName": "Urgence",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Résumé",
              "displayName": "Résumé",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Message",
              "displayName": "Message",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            }
          ]
        },
        "options": {}
      },
      "credentials": {}
    },
    {
      "id": "bf5b6cf1-fdc8-483c-8985-5717b3e5a2fb",
      "name": "À configurer",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        64,
        208
      ],
      "parameters": {
        "content": "## À configurer\n- **Anthropic** : ajoutez votre clé API dans le nœud Claude.\n- **Slack** : connectez votre espace puis choisissez le canal des urgences.\n- **SMTP** : renseignez le serveur d'envoi, l'adresse expéditeur et l'adresse de l'équipe.\n- **Google Sheets** : choisissez votre tableur. L'onglet « Demandes » doit contenir les colonnes Date, Nom, E-mail, Besoin, Urgence, Résumé, Message.\n- Envoyez vos demandes en POST sur l'URL de production du webhook avec les champs nom, email et message.",
        "color": 4,
        "width": 560,
        "height": 224
      }
    },
    {
      "id": "32c7c711-26b8-4391-a2b3-0e090c91e701",
      "name": "L'idée",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        272,
        352
      ],
      "parameters": {
        "content": "## L'idée\nClaude lit chaque demande, identifie le besoin et son urgence. Les urgences déclenchent une alerte immédiate sur Slack et par e-mail, les autres demandes sont rangées dans le tableur pour être traitées au calme.",
        "color": 7,
        "width": 368,
        "height": 256
      }
    }
  ],
  "connections": {
    "Réception de la demande": {
      "main": [
        [
          {
            "node": "Normaliser la demande",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Normaliser la demande": {
      "main": [
        [
          {
            "node": "Confirmer la réception",
            "type": "main",
            "index": 0
          },
          {
            "node": "Analyser la demande",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Analyser la demande": {
      "main": [
        [
          {
            "node": "Router selon l'urgence",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Claude": {
      "ai_languageModel": [
        [
          {
            "node": "Analyser la demande",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Router selon l'urgence": {
      "main": [
        [
          {
            "node": "Alerter l'équipe sur Slack",
            "type": "main",
            "index": 0
          },
          {
            "node": "Prévenir l'équipe par e-mail",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Ajouter au tableur des demandes",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Ajouter au tableur des demandes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  }
}