{"id":1532,"date":"2026-03-23T17:56:14","date_gmt":"2026-03-23T16:56:14","guid":{"rendered":"https:\/\/alu.fr\/?page_id=1532"},"modified":"2026-03-23T17:59:00","modified_gmt":"2026-03-23T16:59:00","slug":"ia-pour-la-fonderie-aluminium","status":"publish","type":"page","link":"https:\/\/alu.fr\/index.php\/ia-pour-la-fonderie-aluminium\/","title":{"rendered":"IA d\u00e9di\u00e9e la fonderie"},"content":{"rendered":"\n<div id=\"alubot-wp-root\"><\/div>\n\n<style>\n  #alubot-wp-root * { margin: 0; padding: 0; box-sizing: border-box; }\n  #alubot-wp-root {\n    font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, sans-serif;\n    font-size: 16px;\n    line-height: 1.5;\n    color: #1e293b;\n    background: #f5f7fa;\n  }\n  #alubot-wp-root .ab-fullpage {\n    display: flex;\n    flex-direction: column;\n    min-height: 760px;\n    width: 100%;\n    max-width: 900px;\n    margin: 0 auto;\n    background: #fff;\n    box-shadow: 0 0 40px rgba(0, 0, 0, 0.08);\n  }\n  #alubot-wp-root .ab-header {\n    padding: 16px 24px;\n    background: linear-gradient(135deg, #111111 0%, #f97316 100%);\n    color: #fff;\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    flex-shrink: 0;\n  }\n  #alubot-wp-root .ab-header h1 { font-size: 1.25rem; font-weight: 600; }\n  #alubot-wp-root .ab-header-actions { display: flex; align-items: center; gap: 12px; }\n  #alubot-wp-root .ab-lang button,\n  #alubot-wp-root .ab-new-chat {\n    padding: 6px 12px;\n    border: 1px solid rgba(255, 255, 255, 0.5);\n    background: transparent;\n    color: #fff;\n    border-radius: 8px;\n    cursor: pointer;\n    font-size: 0.875rem;\n  }\n  #alubot-wp-root .ab-lang button.ab-active,\n  #alubot-wp-root .ab-new-chat:hover { background: rgba(255, 255, 255, 0.22); }\n  #alubot-wp-root .ab-messages {\n    flex: 1;\n    overflow-y: auto;\n    padding: 24px;\n    display: flex;\n    flex-direction: column;\n    gap: 16px;\n    min-height: 420px;\n  }\n  #alubot-wp-root .ab-msg {\n    padding: 14px 18px;\n    border-radius: 12px;\n    max-width: 85%;\n  }\n  #alubot-wp-root .ab-msg > .ab-body {\n    white-space: pre-wrap;\n    word-wrap: break-word;\n  }\n  #alubot-wp-root .ab-msg-user {\n    align-self: flex-end;\n    background: #f97316;\n    color: #fff;\n  }\n  #alubot-wp-root .ab-msg-assistant {\n    align-self: flex-start;\n    background: #f1f5f9;\n    color: #1e293b;\n  }\n  #alubot-wp-root .ab-msg-assistant .ab-images {\n    margin-top: 10px;\n    display: flex;\n    flex-wrap: wrap;\n    gap: 12px;\n  }\n  #alubot-wp-root .ab-msg-assistant .ab-image {\n    border-radius: 8px;\n    overflow: hidden;\n    flex: 1 1 200px;\n    min-width: 0;\n  }\n  #alubot-wp-root .ab-msg-assistant .ab-image img {\n    max-width: 100%;\n    height: auto;\n    display: block;\n  }\n  #alubot-wp-root .ab-msg-loading {\n    align-self: flex-start;\n    background: #f1f5f9;\n    color: #64748b;\n    display: flex;\n    align-items: center;\n    gap: 6px;\n    animation: ab-loading-pulse 1.5s ease-in-out infinite;\n  }\n  #alubot-wp-root .ab-loading-dots {\n    display: inline-flex;\n    align-items: center;\n    gap: 4px;\n  }\n  #alubot-wp-root .ab-loading-dots i {\n    display: inline-block;\n    width: 5px;\n    height: 5px;\n    border-radius: 50%;\n    background: currentColor;\n    animation: ab-bounce-dot 1.4s ease-in-out infinite both;\n  }\n  #alubot-wp-root .ab-loading-dots i:nth-child(1) { animation-delay: 0s; }\n  #alubot-wp-root .ab-loading-dots i:nth-child(2) { animation-delay: 0.16s; }\n  #alubot-wp-root .ab-loading-dots i:nth-child(3) { animation-delay: 0.32s; }\n  @keyframes ab-bounce-dot {\n    0%, 80%, 100% { transform: scale(0.6); opacity: 0.5; }\n    40% { transform: scale(1); opacity: 1; }\n  }\n  @keyframes ab-loading-pulse {\n    0%, 100% { opacity: 1; }\n    50% { opacity: 0.85; }\n  }\n  #alubot-wp-root .ab-input-area {\n    padding: 20px 24px;\n    background: #f8fafc;\n    border-top: 1px solid #e2e8f0;\n    flex-shrink: 0;\n  }\n  #alubot-wp-root .ab-input-row { display: flex; gap: 12px; align-items: flex-end; }\n  #alubot-wp-root .ab-input-wrap { flex: 1; position: relative; }\n  #alubot-wp-root .ab-input {\n    width: 100%;\n    padding: 14px 50px 14px 16px;\n    border: 1px solid #e2e8f0;\n    border-radius: 12px;\n    font-size: 16px;\n    font-family: inherit;\n    resize: none;\n    min-height: 52px;\n    max-height: 160px;\n    box-sizing: border-box;\n  }\n  #alubot-wp-root .ab-input:focus { outline: none; border-color: #f97316; }\n  #alubot-wp-root .ab-upload-btn {\n    position: absolute;\n    right: 10px;\n    bottom: 10px;\n    width: 36px;\n    height: 36px;\n    border: none;\n    background: transparent;\n    cursor: pointer;\n    color: #64748b;\n    padding: 0;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    border-radius: 8px;\n  }\n  #alubot-wp-root .ab-upload-btn:hover { background: #e2e8f0; color: #f97316; }\n  #alubot-wp-root .ab-upload-btn input { display: none; }\n  #alubot-wp-root .ab-send {\n    width: 52px;\n    height: 52px;\n    border-radius: 12px;\n    border: none;\n    background: #f97316;\n    color: #fff;\n    cursor: pointer;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    flex-shrink: 0;\n  }\n  #alubot-wp-root .ab-send:hover { background: #ea580c; }\n  #alubot-wp-root .ab-send:disabled { background: #cbd5e1; cursor: not-allowed; }\n  #alubot-wp-root .ab-preview {\n    margin-top: 10px;\n    display: flex;\n    gap: 8px;\n    flex-wrap: wrap;\n  }\n  #alubot-wp-root .ab-preview-item {\n    position: relative;\n    width: 56px;\n    height: 56px;\n    border-radius: 8px;\n    overflow: hidden;\n  }\n  #alubot-wp-root .ab-preview-item img {\n    width: 100%;\n    height: 100%;\n    object-fit: cover;\n  }\n  #alubot-wp-root .ab-preview-remove {\n    position: absolute;\n    top: 2px;\n    right: 2px;\n    width: 20px;\n    height: 20px;\n    border-radius: 50%;\n    background: rgba(0, 0, 0, 0.6);\n    color: #fff;\n    border: none;\n    cursor: pointer;\n    font-size: 14px;\n    line-height: 1;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n  }\n  #alubot-wp-root .ab-msg .ab-body a { color: inherit; text-decoration: underline; }\n  #alubot-wp-root .ab-msg-user .ab-body a { color: rgba(255,255,255,0.95); }\n  #alubot-wp-root .ab-email-gate {\n    margin-top: 12px;\n    padding: 16px;\n    background: #f1f5f9;\n    border-radius: 12px;\n    border: 1px solid #e2e8f0;\n  }\n  #alubot-wp-root .ab-email-prompt {\n    margin: 0 0 10px 0;\n    font-size: 14px;\n    color: #475569;\n    line-height: 1.4;\n  }\n  #alubot-wp-root .ab-email-prompt + .ab-email-prompt { margin-top: 6px; }\n  #alubot-wp-root .ab-email-input {\n    width: 100%;\n    padding: 12px 16px;\n    border: 1px solid #e2e8f0;\n    border-radius: 8px;\n    font-size: 16px;\n    margin-bottom: 10px;\n    box-sizing: border-box;\n  }\n  #alubot-wp-root .ab-email-input:focus { outline: none; border-color: #f97316; }\n  #alubot-wp-root .ab-email-submit {\n    width: 100%;\n    padding: 12px 16px;\n    border: none;\n    border-radius: 8px;\n    background: #f97316;\n    color: #fff;\n    font-size: 16px;\n    font-weight: 500;\n    cursor: pointer;\n  }\n  #alubot-wp-root .ab-email-submit:hover { background: #ea580c; }\n  @media (max-width: 760px) {\n    #alubot-wp-root .ab-header { padding: 12px 14px; }\n    #alubot-wp-root .ab-header h1 { font-size: 1rem; }\n    #alubot-wp-root .ab-messages { padding: 14px; }\n    #alubot-wp-root .ab-msg { max-width: 92%; }\n    #alubot-wp-root .ab-input-area { padding: 14px; }\n  }\n<\/style>\n\n<script>\n\nwindow.AluBotConfig = {\n      token: 'CP7bCRGe57tZlMZpg0TWa4OPg2q71B7N',\n      apiUrl: 'https:\/\/www.alu.fr\/api\/api.php',\n      language: 'fr',\n      cssBase: 'https:\/\/www.alu.fr\/api\/widget\/'\n    };\n\n  (function () {\n    var root = document.getElementById(\"alubot-wp-root\");\n    if (!root) return;\n\n    root.innerHTML = ''\n      + '<div class=\"ab-fullpage\">'\n      + '  <header class=\"ab-header\">'\n      + '    <h1 class=\"ab-page-title\">Expert Fonderie Aluminium<\/h1>'\n      + '    <div class=\"ab-header-actions\">'\n      + '      <div class=\"ab-lang\">'\n      + '        <button type=\"button\" data-lang=\"fr\" class=\"ab-active\">FR<\/button>'\n      + '        <button type=\"button\" data-lang=\"en\">EN<\/button>'\n      + '      <\/div>'\n      + '      <button type=\"button\" class=\"ab-new-chat\">Nouvelle conversation<\/button>'\n      + '    <\/div>'\n      + '  <\/header>'\n      + '  <main class=\"ab-messages\"><\/main>'\n      + '  <div class=\"ab-input-area\">'\n      + '    <div class=\"ab-input-row\">'\n      + '      <div class=\"ab-input-wrap\">'\n      + '        <textarea class=\"ab-input\" rows=\"1\"><\/textarea>'\n      + '        <label class=\"ab-upload-btn\" title=\"Ajouter une image\">'\n      + '          <input type=\"file\" class=\"ab-image-input\" accept=\"image\/jpeg,image\/png,image\/gif,image\/webp,application\/pdf\">'\n      + '          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" width=\"20\" height=\"20\">'\n      + '            <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"><\/rect><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"><\/circle>'\n      + '            <polyline points=\"21 15 16 10 5 21\"><\/polyline>'\n      + '          <\/svg>'\n      + '        <\/label>'\n      + '      <\/div>'\n      + '      <button type=\"button\" class=\"ab-send\" title=\"Envoyer\">'\n      + '        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" width=\"24\" height=\"24\">'\n      + '          <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"><\/line><polygon points=\"22 2 15 22 11 13 2 9 22 2\"><\/polygon>'\n      + '        <\/svg>'\n      + '      <\/button>'\n      + '    <\/div>'\n      + '    <div class=\"ab-email-gate\" style=\"display:none\">'\n      + '      <p class=\"ab-email-prompt ab-email-prompt-en\"><\/p>'\n      + '      <p class=\"ab-email-prompt ab-email-prompt-fr\"><\/p>'\n      + '      <input type=\"email\" class=\"ab-email-input\" placeholder=\"\">'\n      + '      <button type=\"button\" class=\"ab-email-submit\"><\/button>'\n      + '    <\/div>'\n      + '    <div class=\"ab-preview\"><\/div>'\n      + '  <\/div>'\n      + '<\/div>';\n\n    var CONFIG = window.AluBotConfig || {};\n    var API_URL = CONFIG.apiUrl || \"\";\n    var TOKEN = CONFIG.token || \"\";\n    var LANGUAGE = CONFIG.language || \"fr\";\n\n    var i18n = {\n      en: {\n        title: \"\u2728 Your Foundry AI Agent\",\n        placeholder: \"Ask about foundry, alloys, defects...\",\n        send: \"Send\",\n        newChat: \"New conversation\",\n        thinking: \"Thinking\",\n        error: \"Something went wrong. Please try again.\",\n        welcome: \"Hello! I am your aluminium die casting specialist \ud83e\uddbe. Ask me about alloys, casting defects, mould optimisation, or send an image\/3D capture for flaw analysis and recommendations or upload an image\/diagram. I answer in English or French. All questions and uploaded images will be deleted after 1 month\",\n        emailContinue: \"Continue\",\n        emailPlaceholder: \"your@email.com\"\n      },\n      fr: {\n        title: \"\u2728 Vote Agent IA d\u00e9di\u00e9 \u00e0 la fonderie\",\n        placeholder: \"Question sur la fonderie, alliages, d\u00e9fauts...\",\n        send: \"Envoyer\",\n        newChat: \"Nouvelle conversation\",\n        thinking: \"R\u00e9flexion en cours\",\n        error: \"Une erreur est survenue. Veuillez r\u00e9essayer.\",\n        welcome: \"Bonjour ! Je suis votre expert en fonderie d'aluminium coquille et sous pression \ud83e\uddbe. Posez-moi des questions sur les alliages, d\u00e9fauts de coul\u00e9e, optimisation des moules, ou envoyez une image\/capture 3D pour une analyse des d\u00e9fauts et des recommandations. Je r\u00e9ponds en fran\u00e7ais ou en anglais. Toute question ou fichier charg\u00e9 sera supprim\u00e9 apr\u00e8s un mois.\",\n        emailContinue: \"Continuer\",\n        emailPlaceholder: \"votre@email.com\"\n      }\n    };\n\n    function t(key) {\n      return (i18n[LANGUAGE] || i18n.fr)[key] || i18n.fr[key];\n    }\n    function escapeHtml(str) {\n      var div = document.createElement(\"div\");\n      div.textContent = str;\n      return div.innerHTML;\n    }\n    function linkify(str) {\n      var escaped = escapeHtml(str || \"\");\n      var withBreaks = escaped.replace(\/\\r\\n\/g, \"<br>\").replace(\/\\r\/g, \"<br>\").replace(\/\\n\/g, \"<br>\");\n      return withBreaks.replace(\/(https?:\\\/\\\/[^\\s<]+)\/g, '<a href=\"$1\" target=\"_blank\" rel=\"noopener\">$1<\/a>');\n    }\n\n    var fullpageEl = root.querySelector(\".ab-fullpage\");\n    var messagesEl = root.querySelector(\".ab-messages\");\n    var inputEl = root.querySelector(\".ab-input\");\n    var sendBtn = root.querySelector(\".ab-send\");\n    var imageInput = root.querySelector(\".ab-image-input\");\n    var previewEl = root.querySelector(\".ab-preview\");\n    var pageTitle = root.querySelector(\".ab-page-title\");\n    var langWrap = root.querySelector(\".ab-lang\");\n    var newChatBtn = root.querySelector(\".ab-new-chat\");\n    var inputRow = root.querySelector(\".ab-input-row\");\n    var emailGate = root.querySelector(\".ab-email-gate\");\n    var emailPromptEn = root.querySelector(\".ab-email-prompt-en\");\n    var emailPromptFr = root.querySelector(\".ab-email-prompt-fr\");\n    var emailInput = root.querySelector(\".ab-email-input\");\n    var emailSubmitBtn = root.querySelector(\".ab-email-submit\");\n\n    var storageKey = \"alubot_wp_conversation_id\";\n    var emailStorageKey = \"alubot_user_email\";\n    var conversationId = null;\n    var pendingImages = [];\n    var emailGateActive = false;\n    var pendingMessageAfterEmail = null;\n    var pendingImagesAfterEmail = [];\n\n    try { conversationId = sessionStorage.getItem(storageKey); } catch (e) {}\n\n    function getStoredEmail() {\n      try { return localStorage.getItem(emailStorageKey) || null; } catch (e) { return null; }\n    }\n    function setStoredEmail(email) {\n      try {\n        if (email) localStorage.setItem(emailStorageKey, email);\n        else localStorage.removeItem(emailStorageKey);\n      } catch (e) {}\n    }\n\n    function updateUI() {\n      pageTitle.textContent = t(\"title\");\n      inputEl.placeholder = t(\"placeholder\");\n      newChatBtn.textContent = t(\"newChat\");\n      emailInput.placeholder = t(\"emailPlaceholder\");\n      emailSubmitBtn.textContent = t(\"emailContinue\");\n    }\n\n    function appendMessage(role, content, imageUrl, geminiImageUrl) {\n      var msg = document.createElement(\"div\");\n      msg.className = \"ab-msg \" + (role === \"user\" ? \"ab-msg-user\" : \"ab-msg-assistant\");\n      var body = document.createElement(\"div\");\n      body.className = \"ab-body\";\n      body.innerHTML = linkify(content || \"\");\n      msg.appendChild(body);\n\n      if (imageUrl || geminiImageUrl) {\n        var imagesWrap = document.createElement(\"div\");\n        imagesWrap.className = \"ab-images\";\n        if (imageUrl) {\n          var imgWrap1 = document.createElement(\"div\");\n          imgWrap1.className = \"ab-image\";\n          var img1 = document.createElement(\"img\");\n          img1.src = imageUrl;\n          img1.alt = \"\";\n          imgWrap1.appendChild(img1);\n          imagesWrap.appendChild(imgWrap1);\n        }\n        if (geminiImageUrl) {\n          var imgWrap2 = document.createElement(\"div\");\n          imgWrap2.className = \"ab-image\";\n          var img2 = document.createElement(\"img\");\n          img2.src = geminiImageUrl;\n          img2.alt = \"\";\n          imgWrap2.appendChild(img2);\n          imagesWrap.appendChild(imgWrap2);\n        }\n        msg.appendChild(imagesWrap);\n      }\n\n      messagesEl.appendChild(msg);\n      messagesEl.scrollTop = messagesEl.scrollHeight;\n    }\n\n    function addLoading() {\n      removeLoading();\n      var msg = document.createElement(\"div\");\n      msg.className = \"ab-msg ab-msg-loading\";\n      msg.setAttribute(\"data-loading\", \"1\");\n      var text = document.createElement(\"span\");\n      text.textContent = t(\"thinking\");\n      var dots = document.createElement(\"span\");\n      dots.className = \"ab-loading-dots\";\n      for (var i = 0; i < 3; i++) dots.appendChild(document.createElement(\"i\"));\n      msg.appendChild(text);\n      msg.appendChild(dots);\n      messagesEl.appendChild(msg);\n      messagesEl.scrollTop = messagesEl.scrollHeight;\n    }\n    function removeLoading() {\n      var existing = messagesEl.querySelector('[data-loading=\"1\"]');\n      if (existing) existing.remove();\n    }\n    function addWelcome() { appendMessage(\"assistant\", t(\"welcome\")); }\n\n    function renderPreview() {\n      previewEl.innerHTML = \"\";\n      pendingImages.forEach(function (item, i) {\n        var wrap = document.createElement(\"div\");\n        wrap.className = \"ab-preview-item\";\n        if (item.isPdf) {\n          var label = document.createElement(\"span\");\n          label.style.cssText = \"font-size:10px;padding:4px;word-break:break-all;display:block;background:#e2e8f0;color:#475569;width:100%;height:100%;box-sizing:border-box;\";\n          label.textContent = \"PDF: \" + (item.file.name || \"document.pdf\");\n          wrap.appendChild(label);\n        } else {\n          var img = document.createElement(\"img\");\n          img.src = item.dataUrl;\n          wrap.appendChild(img);\n        }\n        var remove = document.createElement(\"button\");\n        remove.type = \"button\";\n        remove.className = \"ab-preview-remove\";\n        remove.textContent = \"\u00d7\";\n        remove.onclick = function () {\n          pendingImages.splice(i, 1);\n          renderPreview();\n        };\n        wrap.appendChild(remove);\n        previewEl.appendChild(wrap);\n      });\n    }\n\n    imageInput.addEventListener(\"change\", function () {\n      var files = Array.from(this.files || []);\n      files.forEach(function (file) {\n        var hasFileName = false;\n        if (typeof file.name === \"string\") {\n          hasFileName = file.name !== \"\";\n        }\n        var isPdfByName = hasFileName ? file.name.toLowerCase().endsWith(\".pdf\") : false;\n        var isPdf = file.type === \"application\/pdf\" || isPdfByName;\n        if (isPdf) {\n          pendingImages.push({ file: file, dataUrl: null, isPdf: true });\n          renderPreview();\n          return;\n        }\n        if (!file.type.startsWith(\"image\/\")) return;\n        var reader = new FileReader();\n        reader.onload = function (e) {\n          pendingImages.push({ file: file, dataUrl: e.target.result, isPdf: false });\n          renderPreview();\n        };\n        reader.readAsDataURL(file);\n      });\n      this.value = \"\";\n    });\n\n    langWrap.querySelectorAll(\"button\").forEach(function (btn) {\n      btn.addEventListener(\"click\", function () {\n        LANGUAGE = this.getAttribute(\"data-lang\") || \"fr\";\n        langWrap.querySelectorAll(\"button\").forEach(function (b) {\n          b.classList.toggle(\"ab-active\", b.getAttribute(\"data-lang\") === LANGUAGE);\n        });\n        updateUI();\n      });\n    });\n\n    newChatBtn.addEventListener(\"click\", function () {\n      conversationId = null;\n      emailGateActive = false;\n      emailGate.style.display = \"none\";\n      inputRow.style.display = \"\";\n      try { sessionStorage.removeItem(storageKey); } catch (e) {}\n      messagesEl.innerHTML = \"\";\n      addWelcome();\n    });\n\n    async function submitEmailWithValue(email) {\n      if (!email || !conversationId) return;\n      var formData = new FormData();\n      formData.append(\"email\", email);\n      formData.append(\"token\", TOKEN);\n      formData.append(\"language\", LANGUAGE);\n      formData.append(\"conversation_id\", conversationId);\n      formData.append(\"message\", \"\");\n      try {\n        var res = await fetch(API_URL, { method: \"POST\", body: formData });\n        var data = await res.json();\n        if (data.status === \"success\") {\n          if (!data.email_accepted) {\n            emailPromptEn.textContent = data.prompt_en || \"\";\n            emailPromptFr.textContent = data.prompt_fr || \"\";\n            return;\n          }\n          setStoredEmail(email);\n          emailGateActive = false;\n          emailGate.style.display = \"none\";\n          inputRow.style.display = \"\";\n          var pendingText = pendingMessageAfterEmail;\n          var pendingImgs = (pendingImagesAfterEmail || []).slice();\n          pendingMessageAfterEmail = null;\n          pendingImagesAfterEmail = [];\n          if (pendingText || (pendingImgs ? pendingImgs.length : 0)) {\n            removeLoading();\n            await doSend(pendingText || \"\", pendingImgs, true);\n          } else if (data.response) {\n            appendMessage(\"assistant\", data.response, data.image_url, data.gemini_image_url);\n          }\n          return;\n        }\n        emailPromptEn.textContent = data.prompt_en || \"\";\n        emailPromptFr.textContent = data.prompt_fr || \"\";\n      } catch (e) {}\n      emailGateActive = true;\n      emailGate.style.display = \"block\";\n      inputRow.style.display = \"none\";\n    }\n\n    async function submitEmail() {\n      var email = (emailInput.value || \"\").trim();\n      if (!email || !conversationId) return;\n      sendBtn.disabled = true;\n      var formData = new FormData();\n      formData.append(\"email\", email);\n      formData.append(\"token\", TOKEN);\n      formData.append(\"language\", LANGUAGE);\n      formData.append(\"conversation_id\", conversationId);\n      formData.append(\"message\", \"\");\n      try {\n        var res = await fetch(API_URL, { method: \"POST\", body: formData });\n        var data = await res.json();\n        if (data.status === \"success\") {\n          if (!data.email_accepted) {\n            emailPromptEn.textContent = data.prompt_en || \"\";\n            emailPromptFr.textContent = data.prompt_fr || \"\";\n            return;\n          }\n          setStoredEmail(email);\n          emailGateActive = false;\n          emailGate.style.display = \"none\";\n          inputRow.style.display = \"\";\n          emailInput.value = \"\";\n          var pendingText = pendingMessageAfterEmail;\n          var pendingImgs = (pendingImagesAfterEmail || []).slice();\n          pendingMessageAfterEmail = null;\n          pendingImagesAfterEmail = [];\n          if (pendingText || (pendingImgs ? pendingImgs.length : 0)) {\n            removeLoading();\n            await doSend(pendingText || \"\", pendingImgs, true);\n          } else if (data.response) {\n            appendMessage(\"assistant\", data.response, data.image_url, data.gemini_image_url);\n          }\n        } else if (data.email_required) {\n          emailPromptEn.textContent = data.prompt_en || \"\";\n          emailPromptFr.textContent = data.prompt_fr || \"\";\n        } else {\n          appendMessage(\"assistant\", data.message || t(\"error\"));\n        }\n      } catch (e) {\n        appendMessage(\"assistant\", t(\"error\"));\n      } finally {\n        sendBtn.disabled = false;\n      }\n    }\n    emailSubmitBtn.addEventListener(\"click\", submitEmail);\n\n    async function doSend(text, images, skipUserAppend) {\n      if (!skipUserAppend) {\n        appendMessage(\"user\", text);\n        if (images.length) {\n          var lastUser = messagesEl.querySelectorAll(\".ab-msg-user\");\n          if (lastUser.length) {\n            var wrap = document.createElement(\"div\");\n            wrap.style.marginTop = \"8px\";\n            images.forEach(function (p) {\n              if (p.isPdf) {\n                var lbl = document.createElement(\"span\");\n                lbl.style.fontSize = \"12px\";\n                lbl.style.opacity = \"0.9\";\n                lbl.textContent = \"\ud83d\udcc4 \" + (p.file.name || \"document.pdf\");\n                wrap.appendChild(lbl);\n              } else if (p.dataUrl) {\n                var img = document.createElement(\"img\");\n                img.src = p.dataUrl;\n                img.style.cssText = \"max-width:100px;max-height:80px;border-radius:8px;margin:2px;\";\n                wrap.appendChild(img);\n              }\n            });\n            lastUser[lastUser.length - 1].appendChild(wrap);\n          }\n        }\n      }\n\n      addLoading();\n      sendBtn.disabled = true;\n      var formData = new FormData();\n      formData.append(\"message\", text || \"\");\n      formData.append(\"token\", TOKEN);\n      formData.append(\"language\", LANGUAGE);\n      if (conversationId) formData.append(\"conversation_id\", conversationId);\n      if (images.length) formData.append(\"image\", images[0].file);\n\n      try {\n        var res = await fetch(API_URL, { method: \"POST\", body: formData });\n        var data = await res.json();\n        removeLoading();\n        if (data.status === \"success\") {\n          if (data.email_required) {\n            pendingMessageAfterEmail = text;\n            pendingImagesAfterEmail = (images ? images.length : 0) ? images.slice() : [];\n            var storedEmail = getStoredEmail();\n            if (storedEmail) {\n              if (!conversationId) {\n                emailGateActive = true;\n                emailPromptEn.textContent = data.prompt_en || \"\";\n                emailPromptFr.textContent = data.prompt_fr || \"\";\n                emailGate.style.display = \"block\";\n                inputRow.style.display = \"none\";\n                return;\n              }\n              await submitEmailWithValue(storedEmail);\n              removeLoading();\n              return;\n            }\n            emailGateActive = true;\n            emailPromptEn.textContent = data.prompt_en || \"\";\n            emailPromptFr.textContent = data.prompt_fr || \"\";\n            emailGate.style.display = \"block\";\n            inputRow.style.display = \"none\";\n            return;\n          }\n          if (data.conversation_id) {\n            conversationId = data.conversation_id;\n            try { sessionStorage.setItem(storageKey, data.conversation_id); } catch (e) {}\n          }\n          appendMessage(\"assistant\", data.response, data.image_url, data.gemini_image_url);\n        } else {\n          appendMessage(\"assistant\", data.message || t(\"error\"));\n        }\n      } catch (e) {\n        removeLoading();\n        appendMessage(\"assistant\", t(\"error\"));\n      } finally {\n        sendBtn.disabled = false;\n      }\n    }\n\n    async function send() {\n      if (emailGateActive) return;\n      var text = (inputEl.value || \"\").trim();\n      var images = pendingImages.slice();\n      if (!text) {\n        if (!images.length) return;\n      }\n      inputEl.value = \"\";\n      pendingImages = [];\n      renderPreview();\n      await doSend(text, images, false);\n    }\n\n    inputEl.addEventListener(\"keydown\", function (e) {\n      if (e.key === \"Enter\") {\n        if (e.shiftKey) return;\n        e.preventDefault();\n        send();\n      }\n    });\n    sendBtn.addEventListener(\"click\", send);\n\n    if (!API_URL || !TOKEN) {\n      fullpageEl.innerHTML = '<div style=\"padding:16px;background:#fef2f2;color:#b91c1c;border:1px solid #fecaca;border-radius:8px;margin:16px;\">Set <code>window.AluBotConfig = { token, apiUrl, language }<\/code> before this snippet.<\/div>';\n      return;\n    }\n\n    updateUI();\n    addWelcome();\n  })();\n<\/script>\n\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<style class=\"next-previous-btns-sibling\">\n  .next-previous-btns-sibling ~ * .wp-block-button__link.wp-element-button {\n    font-size: 1.125em;\n  }\n<\/style>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/alu.fr\/index.php\/tolerances\/\">\u2190 Tol\u00e9rances<\/a><\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-buttons is-content-justification-right is-layout-flex wp-container-core-buttons-is-layout-765c4724 wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/alu.fr\/index.php\/proprietes\/\">Propri\u00e9t\u00e9s \u2192<\/a><\/div>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","footnotes":""},"class_list":["post-1532","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>IA d\u00e9di\u00e9e la fonderie - Alu.fr<\/title>\n<meta name=\"description\" content=\"Intelligence artificielle d\u00e9di\u00e9e \u00e0 la fonderie pour les bureau d&#039;\u00e9tude. Demandez \u00e0 l&#039;IA\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/alu.fr\/index.php\/ia-pour-la-fonderie-aluminium\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"IA d\u00e9di\u00e9e la fonderie - Alu.fr\" \/>\n<meta property=\"og:description\" content=\"Intelligence artificielle d\u00e9di\u00e9e \u00e0 la fonderie pour les bureau d&#039;\u00e9tude. Demandez \u00e0 l&#039;IA\" \/>\n<meta property=\"og:url\" content=\"https:\/\/alu.fr\/index.php\/ia-pour-la-fonderie-aluminium\/\" \/>\n<meta property=\"og:site_name\" content=\"Alu.fr\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-23T16:59:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/alu.fr\/wp-content\/uploads\/2022\/10\/logo-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"135\" \/>\n\t<meta property=\"og:image:height\" content=\"95\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/alu.fr\/index.php\/ia-pour-la-fonderie-aluminium\/\",\"url\":\"https:\/\/alu.fr\/index.php\/ia-pour-la-fonderie-aluminium\/\",\"name\":\"IA d\u00e9di\u00e9e la fonderie - Alu.fr\",\"isPartOf\":{\"@id\":\"https:\/\/alu.fr\/#website\"},\"datePublished\":\"2026-03-23T16:56:14+00:00\",\"dateModified\":\"2026-03-23T16:59:00+00:00\",\"description\":\"Intelligence artificielle d\u00e9di\u00e9e \u00e0 la fonderie pour les bureau d'\u00e9tude. Demandez \u00e0 l'IA\",\"breadcrumb\":{\"@id\":\"https:\/\/alu.fr\/index.php\/ia-pour-la-fonderie-aluminium\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/alu.fr\/index.php\/ia-pour-la-fonderie-aluminium\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/alu.fr\/index.php\/ia-pour-la-fonderie-aluminium\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/alu.fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"IA d\u00e9di\u00e9e la fonderie\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/alu.fr\/#website\",\"url\":\"https:\/\/alu.fr\/\",\"name\":\"Alu Livry\",\"description\":\"Conception de fonderie d&#039;alliage d&#039;aluminium, recommandation et optimisation\",\"publisher\":{\"@id\":\"https:\/\/alu.fr\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/alu.fr\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/alu.fr\/#organization\",\"name\":\"Alu Livry\",\"url\":\"https:\/\/alu.fr\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/alu.fr\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/alu.fr\/wp-content\/uploads\/2022\/10\/logo-1.png\",\"contentUrl\":\"https:\/\/alu.fr\/wp-content\/uploads\/2022\/10\/logo-1.png\",\"width\":135,\"height\":95,\"caption\":\"Alu Livry\"},\"image\":{\"@id\":\"https:\/\/alu.fr\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.linkedin.com\/company\/alu-livry\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"IA d\u00e9di\u00e9e la fonderie - Alu.fr","description":"Intelligence artificielle d\u00e9di\u00e9e \u00e0 la fonderie pour les bureau d'\u00e9tude. Demandez \u00e0 l'IA","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/alu.fr\/index.php\/ia-pour-la-fonderie-aluminium\/","og_locale":"fr_FR","og_type":"article","og_title":"IA d\u00e9di\u00e9e la fonderie - Alu.fr","og_description":"Intelligence artificielle d\u00e9di\u00e9e \u00e0 la fonderie pour les bureau d'\u00e9tude. Demandez \u00e0 l'IA","og_url":"https:\/\/alu.fr\/index.php\/ia-pour-la-fonderie-aluminium\/","og_site_name":"Alu.fr","article_modified_time":"2026-03-23T16:59:00+00:00","og_image":[{"width":135,"height":95,"url":"https:\/\/alu.fr\/wp-content\/uploads\/2022\/10\/logo-1.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Dur\u00e9e de lecture estim\u00e9e":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/alu.fr\/index.php\/ia-pour-la-fonderie-aluminium\/","url":"https:\/\/alu.fr\/index.php\/ia-pour-la-fonderie-aluminium\/","name":"IA d\u00e9di\u00e9e la fonderie - Alu.fr","isPartOf":{"@id":"https:\/\/alu.fr\/#website"},"datePublished":"2026-03-23T16:56:14+00:00","dateModified":"2026-03-23T16:59:00+00:00","description":"Intelligence artificielle d\u00e9di\u00e9e \u00e0 la fonderie pour les bureau d'\u00e9tude. Demandez \u00e0 l'IA","breadcrumb":{"@id":"https:\/\/alu.fr\/index.php\/ia-pour-la-fonderie-aluminium\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/alu.fr\/index.php\/ia-pour-la-fonderie-aluminium\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/alu.fr\/index.php\/ia-pour-la-fonderie-aluminium\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/alu.fr\/"},{"@type":"ListItem","position":2,"name":"IA d\u00e9di\u00e9e la fonderie"}]},{"@type":"WebSite","@id":"https:\/\/alu.fr\/#website","url":"https:\/\/alu.fr\/","name":"Alu Livry","description":"Conception de fonderie d&#039;alliage d&#039;aluminium, recommandation et optimisation","publisher":{"@id":"https:\/\/alu.fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/alu.fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/alu.fr\/#organization","name":"Alu Livry","url":"https:\/\/alu.fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/alu.fr\/#\/schema\/logo\/image\/","url":"https:\/\/alu.fr\/wp-content\/uploads\/2022\/10\/logo-1.png","contentUrl":"https:\/\/alu.fr\/wp-content\/uploads\/2022\/10\/logo-1.png","width":135,"height":95,"caption":"Alu Livry"},"image":{"@id":"https:\/\/alu.fr\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.linkedin.com\/company\/alu-livry\/"]}]}},"_links":{"self":[{"href":"https:\/\/alu.fr\/index.php\/wp-json\/wp\/v2\/pages\/1532","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alu.fr\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/alu.fr\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/alu.fr\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/alu.fr\/index.php\/wp-json\/wp\/v2\/comments?post=1532"}],"version-history":[{"count":4,"href":"https:\/\/alu.fr\/index.php\/wp-json\/wp\/v2\/pages\/1532\/revisions"}],"predecessor-version":[{"id":1538,"href":"https:\/\/alu.fr\/index.php\/wp-json\/wp\/v2\/pages\/1532\/revisions\/1538"}],"wp:attachment":[{"href":"https:\/\/alu.fr\/index.php\/wp-json\/wp\/v2\/media?parent=1532"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}