---
title: SiNi AI Support Assistant
slug: sini-ai-support-assistant
icon: ❓
docTags: 
createdAt: 2025-07-22T10:32:42.778Z
---

We have added our AI support assistant to the Help Docs. Look for it on the bottom right of the pages. Click on the blue Bubble to open.&#x20;

:::Iframe{iframeHeight="0" code="&#xA;<!DOCTYPE html>&#xA;<html lang=&#x22;en&#x22;>&#xA;<head>&#xA;  <meta charset=&#x22;UTF-8&#x22;>&#xA;  <meta name=&#x22;viewport&#x22; content=&#x22;width=device-width, initial-scale=1.0&#x22;>&#xA;  <title>SiNi Web Support Assistant</title>&#xA;</head>&#xA;<body>&#xA;  <div id=&#x22;sini-chat-container&#x22;>&#xA;    <div id=&#x22;chat-tooltip&#x22;>Need help? Chat with SiNi Assistant</div>&#xA;    <button id=&#x22;chat-toggle&#x22;>💬</button>&#xA;    <div id=&#x22;sini-chat-widget&#x22; class=&#x22;hidden&#x22;>&#xA;      <div id=&#x22;chat-header&#x22;>&#xA;        <span>SiNi Support Assistant</span>&#xA;        <div>&#xA;          <button id=&#x22;help-menu-toggle&#x22; class=&#x22;header-btn&#x22;>?</button>&#xA;          <button id=&#x22;chat-close&#x22;>×</button>&#xA;        </div>&#xA;      </div>&#xA;      <div id=&#x22;help-menu&#x22; class=&#x22;hidden&#x22;>&#xA;        <ul>&#xA;          <li><a href=&#x22;https://docs.sinisoftware.com&#x22; target=&#x22;_blank&#x22;>📄 Documentation</a></li>&#xA;          <li><a href=&#x22;https://www.youtube.com/playlist?list=PLKF8J5JtHdmYSq4a989i5h7P1_RgMlM8G&#x22; target=&#x22;_blank&#x22;>🎥 Video Masterclass</a></li>&#xA;          <li><a href=&#x22;https://sinisoftware.com&#x22; target=&#x22;_blank&#x22;>🌐 SiNi Website</a></li>&#xA;          <li><a href=&#x22;mailto:support@sinisoftware.com&#x22;>📧 Contact Support</a></li>&#xA;        </ul>&#xA;      </div>&#xA;      <div id=&#x22;quick-actions&#x22;>&#xA;        <button class=&#x22;quick-btn&#x22; data-message=&#x22;List all plugins&#x22;>List Plugins</button>&#xA;        <button class=&#x22;quick-btn&#x22; data-message=&#x22;Show video tutorials&#x22;>Video Tutorials</button>&#xA;      </div>&#xA;      <div id=&#x22;chat-messages&#x22;></div>&#xA;      <div id=&#x22;typing-indicator&#x22; class=&#x22;hidden&#x22;>&#xA;        <span class=&#x22;dot&#x22;></span><span class=&#x22;dot&#x22;></span><span class=&#x22;dot&#x22;></span>&#xA;      </div>&#xA;      <div id=&#x22;chat-input-area&#x22;>&#xA;        <input type=&#x22;text&#x22; id=&#x22;chat-input&#x22; placeholder=&#x22;Type your question...&#x22; />&#xA;        <button id=&#x22;chat-send&#x22;>Send</button>&#xA;      </div>&#xA;    </div>&#xA;  </div>&#xA;&#xA;  <audio id=&#x22;notification-sound&#x22; src=&#x22;https://actions.google.com/sounds/v1/alarms/beep_short.ogg&#x22; preload=&#x22;auto&#x22;></audio>&#xA;&#xA;  <style>&#xA;    body { font-family: Arial, sans-serif; background: #f9f9f9; }&#xA;    #sini-chat-container { position: fixed; bottom: 20px; right: 20px; z-index: 1000; }&#xA;&#xA;    #chat-toggle {&#xA;      background: #0078D7;&#xA;      color: #fff;&#xA;      border: none;&#xA;      border-radius: 50%;&#xA;      width: 60px;&#xA;      height: 60px;&#xA;      cursor: pointer;&#xA;      font-size: 28px;&#xA;      box-shadow: 0 4px 12px rgba(0,0,0,0.2);&#xA;      display: flex;&#xA;      align-items: center;&#xA;      justify-content: center;&#xA;      padding: 0;&#xA;      transition: transform 0.2s ease, box-shadow 0.2s ease;&#xA;      position: relative;&#xA;    }&#xA;    #chat-toggle:hover {&#xA;      transform: scale(1.1);&#xA;      box-shadow: 0 6px 16px rgba(0,0,0,0.3);&#xA;    }&#xA;&#xA;    #chat-tooltip {&#xA;      position: absolute;&#xA;      bottom: 70px;&#xA;      right: 0;&#xA;      background: #333;&#xA;      color: #fff;&#xA;      padding: 5px 10px;&#xA;      border-radius: 6px;&#xA;      font-size: 12px;&#xA;      opacity: 0;&#xA;      transform: translateY(10px);&#xA;      transition: opacity 0.3s, transform 0.3s;&#xA;      pointer-events: none;&#xA;      white-space: nowrap;&#xA;    }&#xA;    #chat-toggle:hover + #chat-tooltip,&#xA;    #chat-tooltip:hover {&#xA;      opacity: 1;&#xA;      transform: translateY(0);&#xA;    }&#xA;&#xA;    #sini-chat-widget {&#xA;      position: fixed;&#xA;      bottom: 100px;&#xA;      right: 20px;&#xA;      max-width: 400px;&#xA;      border: 2px solid #ccc;&#xA;      border-radius: 12px;&#xA;      box-shadow: 0 4px 12px rgba(0,0,0,0.1);&#xA;      display: flex;&#xA;      flex-direction: column;&#xA;      background: #fff;&#xA;      height: 500px;&#xA;      width: 350px;&#xA;      opacity: 0;&#xA;      transform: translateY(20px);&#xA;      pointer-events: none;&#xA;      transition: opacity 0.3s ease, transform 0.3s ease;&#xA;    }&#xA;    #sini-chat-widget.visible {&#xA;      opacity: 1;&#xA;      transform: translateY(0);&#xA;      pointer-events: auto;&#xA;    }&#xA;    #sini-chat-widget.hidden {&#xA;      display: none;&#xA;    }&#xA;&#xA;    #chat-header {&#xA;      display: flex;&#xA;      align-items: center;&#xA;      justify-content: space-between;&#xA;      padding: 10px;&#xA;      background: #f5f5f5;&#xA;      border-bottom: 1px solid #ddd;&#xA;      font-weight: bold;&#xA;      position: relative;&#xA;    }&#xA;&#xA;    .header-btn {&#xA;      background: transparent;&#xA;      border: none;&#xA;      font-size: 18px;&#xA;      cursor: pointer;&#xA;      margin-left: 8px;&#xA;    }&#xA;&#xA;    #help-menu {&#xA;      background: #fafafa;&#xA;      border-bottom: 1px solid #ddd;&#xA;      padding: 10px;&#xA;    }&#xA;    #help-menu ul {&#xA;      list-style: none;&#xA;      padding: 0;&#xA;      margin: 0;&#xA;    }&#xA;    #help-menu ul li {&#xA;      margin: 5px 0;&#xA;    }&#xA;    #help-menu ul li a {&#xA;      text-decoration: none;&#xA;      color: #0078D7;&#xA;    }&#xA;&#xA;    #quick-actions, #faq-actions {&#xA;      display: flex;&#xA;      flex-wrap: wrap;&#xA;      gap: 5px;&#xA;      justify-content: center;&#xA;      padding: 5px;&#xA;      border-bottom: 1px solid #ddd;&#xA;      background: #fafafa;&#xA;    }&#xA;    .quick-btn, .faq-btn {&#xA;      padding: 5px 10px;&#xA;      font-size: 12px;&#xA;      background: #0078D7;&#xA;      color: white;&#xA;      border: none;&#xA;      border-radius: 6px;&#xA;      cursor: pointer;&#xA;      transition: background 0.2s ease;&#xA;    }&#xA;    .quick-btn:hover, .faq-btn:hover {&#xA;      background: #005fa3;&#xA;    }&#xA;&#xA;    #chat-messages {&#xA;      flex: 1;&#xA;      padding: 10px;&#xA;      overflow-y: auto;&#xA;      display: flex;&#xA;      flex-direction: column;&#xA;      gap: 8px;&#xA;      font-size: 14px;&#xA;    }&#xA;&#xA;    #typing-indicator {&#xA;      padding: 10px;&#xA;      font-size: 12px;&#xA;      color: #666;&#xA;      display: flex;&#xA;      gap: 3px;&#xA;      align-items: center;&#xA;    }&#xA;    #typing-indicator.hidden { display: none; }&#xA;    .dot {&#xA;      width: 6px;&#xA;      height: 6px;&#xA;      background-color: #666;&#xA;      border-radius: 50%;&#xA;      display: inline-block;&#xA;      animation: bounce 1.4s infinite ease-in-out;&#xA;    }&#xA;    .dot:nth-child(2) { animation-delay: 0.2s; }&#xA;    .dot:nth-child(3) { animation-delay: 0.4s; }&#xA;&#xA;    @keyframes bounce {&#xA;      0%, 80%, 100% { transform: scale(0); }&#xA;      40% { transform: scale(1); }&#xA;    }&#xA;&#xA;    .message {&#xA;      max-width: 80%;&#xA;      padding: 8px 12px;&#xA;      border-radius: 12px;&#xA;      word-wrap: break-word;&#xA;      font-size: 14px;&#xA;      opacity: 0;&#xA;      transform: translateY(10px);&#xA;      animation: fadeIn 0.3s forwards;&#xA;    }&#xA;&#xA;    .user-message {&#xA;      background-color: #0078D7;&#xA;      color: white;&#xA;      align-self: flex-end;&#xA;      border-bottom-right-radius: 0;&#xA;    }&#xA;&#xA;    .assistant-message {&#xA;      background-color: #f1f1f1;&#xA;      color: #333;&#xA;      align-self: flex-start;&#xA;      border-bottom-left-radius: 0;&#xA;    }&#xA;&#xA;    .assistant-message a {&#xA;      color: #0078D7;&#xA;      text-decoration: underline;&#xA;      margin-right: 5px;&#xA;    }&#xA;&#xA;    .copy-btn {&#xA;      background: #0078D7;&#xA;      color: white;&#xA;      border: none;&#xA;      padding: 2px 6px;&#xA;      border-radius: 4px;&#xA;      font-size: 12px;&#xA;      cursor: pointer;&#xA;      transition: background 0.2s ease;&#xA;    }&#xA;    .copy-btn:hover {&#xA;      background: #005fa3;&#xA;    }&#xA;&#xA;    @keyframes fadeIn {&#xA;      to { opacity: 1; transform: translateY(0); }&#xA;    }&#xA;&#xA;    #chat-input-area {&#xA;      display: flex;&#xA;      border-top: 1px solid #ddd;&#xA;    }&#xA;&#xA;    #chat-input {&#xA;      flex: 1;&#xA;      padding: 10px;&#xA;      border: none;&#xA;      outline: none;&#xA;      color: #000;&#xA;      font-size: 14px;&#xA;    }&#xA;&#xA;    #chat-send {&#xA;      padding: 10px 15px;&#xA;      border: none;&#xA;      background: #0078D7;&#xA;      color: #fff;&#xA;      cursor: pointer;&#xA;      border-top-right-radius: 12px;&#xA;      transition: background 0.2s ease;&#xA;    }&#xA;    #chat-send:hover {&#xA;      background: #005fa3;&#xA;    }&#xA;&#xA;    #chat-close {&#xA;      background: transparent;&#xA;      border: none;&#xA;      font-size: 18px;&#xA;      cursor: pointer;&#xA;    }&#xA;  </style>&#xA;&#xA;  <script>&#xA;    function convertMarkdownImages(text) {&#xA;      return text.replace(/!\[([^\]]+)\]\(([^\)]+)\)/g, '<img src=&#x22;$2&#x22; alt=&#x22;$1&#x22; style=&#x22;height:20px;vertical-align:middle;margin-right:5px;&#x22;> <strong>$1</strong>');&#xA;    }&#xA;&#xA;    function convertUrlsToLinks(text) {&#xA;      return text.replace(/(https?:\/\/[\w\-._~:?#@!$&'()*+,;=%/]+)(?![^<]*>|[^<>]*<\/)/g, function(url) {&#xA;        return '<span class=&#x22;link-wrapper&#x22;><a href=&#x22;' + url + '&#x22; target=&#x22;_blank&#x22;>' + url + '</a><button class=&#x22;copy-btn&#x22; onclick=&#x22;copyToClipboard(\'' + url + '\')&#x22;>Copy</button></span>';&#xA;      });&#xA;    }&#xA;&#xA;    function formatMessage(content) {&#xA;      let formatted = convertMarkdownImages(content);&#xA;      formatted = convertUrlsToLinks(formatted);&#xA;      return formatted;&#xA;    }&#xA;&#xA;    function copyToClipboard(text) {&#xA;      navigator.clipboard.writeText(text).then(() => {&#xA;        alert('Link copied to clipboard: ' + text);&#xA;      });&#xA;    }&#xA;&#xA;    const apiKey = &#x22;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&#x22;; // Replace with your OpenAI API key&#xA;    const siniContext = `&#xA;You are the SiNi Support Assistant, trained to help 3ds Max users professionally understand, install, and use all SiNi plugins.&#xA;&#xA;## 🎯 Purpose&#xA;- Support architectural and visualisation workflows.&#xA;- Recommend plugins based on user needs.&#xA;- Link to official documentation and videos.&#xA;- Always show the correct plugin icon with Markdown.&#xA;&#xA;## 🧩 SiNi Plugin Collections&#xA;- **Utility Plugins / IgNite Collection**: IgNite, Forensic, Scribe, Sculpt, Illumi, Jumble, Unite, SiNiScript, Preflight.&#xA;- **Object Plugins**: Disperse, Scatter, SiClone, ProxSi.&#xA;- **Workflow Plugins**: MoJo.&#xA;&#xA;## 🖼️ Plugin Icons&#xA;Icons are hosted at: https://github.com/SiNi-Icons/sini-plugin-icons  &#xA;Use this format:  &#xA;<img src='https://raw.githubusercontent.com/SiNi-Icons/sini-plugin-icons/main/Icon_PluginName.png' alt='PluginName' style='height:20px;vertical-align:middle;margin-right:5px;'> <strong>PluginName</strong>&#xA;&#xA;## 📚 Key Resources&#xA;- Documentation: https://docs.sinisoftware.com  &#xA;- Video Masterclass: https://www.youtube.com/playlist?list=PLKF8J5JtHdmYSq4a989i5h7P1_RgMlM8G  &#xA;&#xA;Always prioritise **ProxSi** security features (password protection, expiry lock, asset control) as its unique selling points.&#xA;`;&#xA;    const notificationSound = document.getElementById('notification-sound');&#xA;&#xA;    const chatToggle = document.getElementById('chat-toggle');&#xA;    const chatWidget = document.getElementById('sini-chat-widget');&#xA;    const chatClose = document.getElementById('chat-close');&#xA;    const helpMenuToggle = document.getElementById('help-menu-toggle');&#xA;    const helpMenu = document.getElementById('help-menu');&#xA;    const chatMessages = document.getElementById('chat-messages');&#xA;    const typingIndicator = document.getElementById('typing-indicator');&#xA;    const chatInput = document.getElementById('chat-input');&#xA;    const chatSend = document.getElementById('chat-send');&#xA;    const quickButtons = document.querySelectorAll('.quick-btn');&#xA;    const faqButtons = document.querySelectorAll('.faq-btn');&#xA;&#xA;    chatToggle.addEventListener('click', () => {&#xA;      if (chatWidget.classList.contains('hidden')) {&#xA;        chatWidget.classList.remove('hidden');&#xA;        setTimeout(() => chatWidget.classList.add('visible'), 10);&#xA;        if (chatMessages.innerHTML === '') {&#xA;          appendMessage(&#x22;👋 Hi! I’m your SiNi Support Assistant. Ask me about any SiNi plugin or workflow.&#x22;, 'assistant-message');&#xA;        }&#xA;      } else {&#xA;        chatWidget.classList.remove('visible');&#xA;        setTimeout(() => chatWidget.classList.add('hidden'), 300);&#xA;      }&#xA;    });&#xA;&#xA;    chatClose.addEventListener('click', () => {&#xA;      chatWidget.classList.remove('visible');&#xA;      setTimeout(() => chatWidget.classList.add('hidden'), 300);&#xA;    });&#xA;&#xA;    helpMenuToggle.addEventListener('click', () => {&#xA;      helpMenu.classList.toggle('hidden');&#xA;    });&#xA;&#xA;    quickButtons.forEach(btn => {&#xA;      btn.addEventListener('click', () => {&#xA;        sendMessage(btn.getAttribute('data-message'));&#xA;      });&#xA;    });&#xA;&#xA;    faqButtons.forEach(btn => {&#xA;      btn.addEventListener('click', () => {&#xA;        sendMessage(btn.getAttribute('data-message'));&#xA;      });&#xA;    });&#xA;&#xA;    function appendMessage(content, className) {&#xA;      const messageEl = document.createElement('div');&#xA;      messageEl.classList.add('message', className);&#xA;      messageEl.innerHTML = formatMessage(content);&#xA;      chatMessages.appendChild(messageEl);&#xA;      chatMessages.scrollTop = chatMessages.scrollHeight;&#xA;      if (className === 'assistant-message') {&#xA;        notificationSound.currentTime = 0;&#xA;        notificationSound.play();&#xA;      }&#xA;    }&#xA;&#xA;    async function sendMessage(message) {&#xA;      appendMessage(message, 'user-message');&#xA;      typingIndicator.classList.remove('hidden');&#xA;&#xA;      const response = await fetch('https://api.openai.com/v1/chat/completions', {&#xA;        method: 'POST',&#xA;        headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${apiKey}` },&#xA;        body: JSON.stringify({&#xA;          model: &#x22;gpt-4o-mini&#x22;,&#xA;          messages: [&#xA;            { role: &#x22;system&#x22;, content: siniContext },&#xA;            { role: &#x22;user&#x22;, content: message }&#xA;          ]&#xA;        })&#xA;      });&#xA;&#xA;      const data = await response.json();&#xA;      typingIndicator.classList.add('hidden');&#xA;      const reply = data.choices[0].message.content;&#xA;      appendMessage(reply, 'assistant-message');&#xA;    }&#xA;&#xA;    chatSend.addEventListener('click', () => {&#xA;      if (chatInput.value.trim() !== &#x22;&#x22;) {&#xA;        sendMessage(chatInput.value.trim());&#xA;        chatInput.value = &#x22;&#x22;;&#xA;      }&#xA;    });&#xA;  </script>&#xA;&#xA;<script>&#xA;// Patch: Clean trailing brackets or punctuation from hyperlinks after messages are formatted&#xA;function cleanLinks() {&#xA;  const links = document.querySelectorAll('#chat-messages a');&#xA;  links.forEach(link => {&#xA;    let url = link.getAttribute('href');&#xA;    if (url.endsWith(')') || url.endsWith(']') || url.endsWith(',')) {&#xA;      url = url.replace(/[)\],]+$/, '');&#xA;      link.setAttribute('href', url);&#xA;      link.textContent = url;&#xA;    }&#xA;  });&#xA;}&#xA;&#xA;// Hook into appendMessage to run cleanLinks after each message is added&#xA;const originalAppendMessage = appendMessage;&#xA;appendMessage = function(content, className) {&#xA;  originalAppendMessage(content, className);&#xA;  cleanLinks();&#xA;};&#xA;</script>&#xA;&#xA;</body>&#xA;</html>&#xA;"}

:::

