mirror of
				https://github.com/Mabbs/mabbs.github.io
				synced 2025-11-01 00:12:01 +08:00 
			
		
		
		
	
		
			
	
	
		
			385 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
		
		
			
		
	
	
			385 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
|   | <!DOCTYPE html> | |||
|  | <html> | |||
|  | 
 | |||
|  | <head> | |||
|  |   <title>Cloudflare AI</title> | |||
|  |   <meta charset="utf-8"> | |||
|  |   <meta name="viewport" content="width=device-width, initial-scale=1"> | |||
|  |   <link rel="icon" | |||
|  |     href="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2016%2016'%3E%3Ctext%20x='0'%20y='14'%20style='filter:%20invert(100%);'%3E☁️%3C/text%3E%3C/svg%3E" | |||
|  |     type="image/svg+xml" /> | |||
|  |   <style> | |||
|  |     body { | |||
|  |       font-family: 'Raleway', sans-serif; | |||
|  |       margin: 0; | |||
|  |       padding: 20px; | |||
|  |       background-color: #222; | |||
|  |       color: #fff; | |||
|  |       backdrop-filter: blur(10px); | |||
|  |       overflow: hidden; | |||
|  |       height: 100vh; | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     h1 { | |||
|  |       text-align: center; | |||
|  |       font-weight: 900; | |||
|  |       text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5); | |||
|  |       font-size: 64px; | |||
|  |     } | |||
|  | 
 | |||
|  |     h2 { | |||
|  |       text-align: center; | |||
|  |       font-weight: bold; | |||
|  |       text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5); | |||
|  |       font-size: 20px; | |||
|  |     } | |||
|  | 
 | |||
|  |     form { | |||
|  |       margin-bottom: 20px; | |||
|  |       display: flex; | |||
|  |       justify-content: center; | |||
|  |       /* Center items horizontally */ | |||
|  |       align-items: center; | |||
|  |       /* Center items vertically */ | |||
|  |       position: fixed; | |||
|  |       bottom: 12px; | |||
|  |       width: 100vw; | |||
|  |       border-radius: 10px; | |||
|  |       padding: 10px; | |||
|  |       /* Add some padding to give space around the items */ | |||
|  |     } | |||
|  | 
 | |||
|  |     label { | |||
|  |       font-weight: bold; | |||
|  |       color: #ccc; | |||
|  |     } | |||
|  | 
 | |||
|  |     input[type="text"] { | |||
|  |       width: 50%; | |||
|  |       padding: 10px; | |||
|  |       background-color: rgba(0, 0, 0, 0.3); | |||
|  |       color: #fff; | |||
|  |       border: none; | |||
|  |       border-radius: 5px; | |||
|  |     } | |||
|  | 
 | |||
|  |     textarea { | |||
|  |       width: 50%; | |||
|  |       padding: 9px; | |||
|  |       color: whitesmoke; | |||
|  | 
 | |||
|  |       border: none; | |||
|  |       border-radius: 5px; | |||
|  |       font-size: 18px; | |||
|  |       background-color: #222222; | |||
|  | 
 | |||
|  |     } | |||
|  | 
 | |||
|  |     textarea::-webkit-scrollbar { | |||
|  |       display: none; | |||
|  |     } | |||
|  | 
 | |||
|  |     textarea:focus { | |||
|  |       outline: none; | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     #response { | |||
|  |       max-width: 80%; | |||
|  |       height: calc(100% - 250px); | |||
|  |       margin-left: 10%; | |||
|  |       overflow-y: scroll; | |||
|  |     } | |||
|  | 
 | |||
|  |     #response::-webkit-scrollbar { | |||
|  |       width: 10px; | |||
|  |       border-radius: 50%; | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     .user-message { | |||
|  |       background-color: rgba(71, 71, 71, 0.3); | |||
|  |       padding: 10px; | |||
|  |       margin-bottom: 10px; | |||
|  |       margin-left: 40%; | |||
|  |       max-width: 60%; | |||
|  |       border-radius: 10px; | |||
|  |       box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37); | |||
|  |       backdrop-filter: blur(4px); | |||
|  |       -webkit-backdrop-filter: blur(4px); | |||
|  |       border-radius: 10px; | |||
|  |       border: 1px solid rgba(255, 255, 255, 0.18); | |||
|  |       color: whitesmoke; | |||
|  |     } | |||
|  | 
 | |||
|  |     .ai-message { | |||
|  |       background-color: rgba(71, 71, 71, 0.3); | |||
|  |       padding: 10px; | |||
|  |       margin-bottom: 10px; | |||
|  |       margin-right: 40%; | |||
|  |       max-width: 60%; | |||
|  |       border-radius: 10px; | |||
|  |       box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); | |||
|  |       color: whitesmoke; | |||
|  |     } | |||
|  | 
 | |||
|  |     p { | |||
|  |       margin: 0; | |||
|  |       padding: 0; | |||
|  |     } | |||
|  | 
 | |||
|  |     .smaller { | |||
|  |       font-size: 15; | |||
|  |     } | |||
|  | 
 | |||
|  |     .fa-github { | |||
|  |       text-decoration: none; | |||
|  |       color: inherit; | |||
|  |       position: fixed; | |||
|  |       bottom: 0; | |||
|  |       right: 0; | |||
|  |       padding: 15px; | |||
|  |     } | |||
|  | 
 | |||
|  |     .dropbtn { | |||
|  |       background-color: #191b1c; | |||
|  |       color: white; | |||
|  |       padding: 16px; | |||
|  |       font-size: 16px; | |||
|  |       border: none; | |||
|  |       cursor: pointer; | |||
|  |     } | |||
|  | 
 | |||
|  |     .dropdown { | |||
|  |       position: relative; | |||
|  |       display: inline-block; | |||
|  |       position: absolute; | |||
|  |       top: 5px; | |||
|  |       left: 5px; | |||
|  |       padding: 10px; | |||
|  |       color: #fff; | |||
|  |       border: none; | |||
|  |       border-radius: 5px; | |||
|  |       cursor: pointer; | |||
|  |     } | |||
|  | 
 | |||
|  |     .dropdown-content { | |||
|  |       display: none; | |||
|  |       position: absolute; | |||
|  |       background-color: #191b1c; | |||
|  |       min-width: 160px; | |||
|  |       box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2); | |||
|  |       z-index: 1; | |||
|  |     } | |||
|  | 
 | |||
|  |     .dropdown-content a { | |||
|  |       color: #fff; | |||
|  |       padding: 12px 16px; | |||
|  |       text-decoration: none; | |||
|  |       display: block; | |||
|  |     } | |||
|  | 
 | |||
|  |     .dropdown-content a:hover { | |||
|  |       background-color: black | |||
|  |     } | |||
|  | 
 | |||
|  |     .dropdown:hover .dropdown-content { | |||
|  |       display: block; | |||
|  |     } | |||
|  | 
 | |||
|  |     .dropdown:hover .dropbtn { | |||
|  |       background-color: #444; | |||
|  |     } | |||
|  | 
 | |||
|  |     button { | |||
|  |       font-size: 18px; | |||
|  |       color: #e1e1e1; | |||
|  |       font-family: inherit; | |||
|  |       font-weight: 800; | |||
|  |       cursor: pointer; | |||
|  |       position: relative; | |||
|  |       border: none; | |||
|  |       background: none; | |||
|  |       text-transform: uppercase; | |||
|  |       transition-timing-function: cubic-bezier(0.25, 0.8, 0.25, 1); | |||
|  |       transition-duration: 400ms; | |||
|  |       transition-property: color; | |||
|  |     } | |||
|  | 
 | |||
|  |     button:focus, | |||
|  |     button:hover { | |||
|  |       color: #fff; | |||
|  |     } | |||
|  | 
 | |||
|  |     button:focus:after, | |||
|  |     button:hover:after { | |||
|  |       width: 100%; | |||
|  |       left: 0%; | |||
|  |     } | |||
|  | 
 | |||
|  |     button:after { | |||
|  |       content: ""; | |||
|  |       pointer-events: none; | |||
|  |       bottom: -2px; | |||
|  |       left: 50%; | |||
|  |       position: absolute; | |||
|  |       width: 0%; | |||
|  |       height: 2px; | |||
|  |       background-color: #fff; | |||
|  |       transition-timing-function: cubic-bezier(0.25, 0.8, 0.25, 1); | |||
|  |       transition-duration: 400ms; | |||
|  |       transition-property: width, left; | |||
|  |     } | |||
|  | 
 | |||
|  |     .github-icon { | |||
|  |       position: fixed; | |||
|  |       right: 50px; | |||
|  |       bottom: 50px; | |||
|  |     } | |||
|  | 
 | |||
|  |     /* if screen width<1000 then max -width=100% */ | |||
|  |     @media screen and (max-width: 1000px) { | |||
|  |       #response { | |||
|  |         max-width: 100%; | |||
|  |         margin-left: 0; | |||
|  |         height: calc(100% - 280px); | |||
|  |       } | |||
|  | 
 | |||
|  |       textarea { | |||
|  |         width: 80%; | |||
|  |       } | |||
|  | 
 | |||
|  |       .github-icon { | |||
|  |         visibility: hidden; | |||
|  |       } | |||
|  | 
 | |||
|  |       form { | |||
|  |         bottom: 0; | |||
|  |       } | |||
|  | 
 | |||
|  |       .ai-message { | |||
|  |         max-width: 80%; | |||
|  |         min-width: 80%; | |||
|  |       } | |||
|  |     } | |||
|  |   </style> | |||
|  |   <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> | |||
|  |   <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script> | |||
|  |   <link rel="preconnect" href="https://fonts.googleapis.com"> | |||
|  |   <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> | |||
|  |   <link href="https://fonts.googleapis.com/css2?family=Raleway:wght@700&display=swap" rel="stylesheet"> | |||
|  |   <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"> | |||
|  | </head> | |||
|  | 
 | |||
|  | <body> | |||
|  |   <h1>Cloudflare AI</h1> | |||
|  |   <div class="dropdown"> | |||
|  |     <button class="dropbtn">Settings</button> | |||
|  |     <div class="dropdown-content"> | |||
|  |       <a href="#" onclick='setApiUrl()'>Custom API URL</a> | |||
|  |       <a href="#" onclick='setIDsession()'>Custom ID Session</a> | |||
|  |     </div> | |||
|  |   </div> | |||
|  |   <div id="response"> | |||
|  |     <div class="ai-message">Hey there, how can i assist you?</div> | |||
|  |   </div> | |||
|  |   <form id="chatForm"> | |||
|  |     <textarea id="input" type="text" placeholder="Send a message"></textarea> | |||
|  |     <button type="submit">➤</button> | |||
|  |   </form> | |||
|  |   <a class="fa fa-github github-icon" href="https://github.com/localuser-isback/Cloudflare-AI" style="font-size:36px"> | |||
|  |     <script> | |||
|  | 
 | |||
|  |       // --------------- CONFIG --------------- // | |||
|  |       // modify URL to your API | |||
|  |       let apiUrl = "https://llama.mayx.eu.org" | |||
|  | 
 | |||
|  |       // ----------- END OF CONFIG ------------ // | |||
|  |       let uuid = ''; | |||
|  | 
 | |||
|  |       function setApiUrl() { | |||
|  |         const customUrl = prompt("Enter custom API URL: "); | |||
|  |         if (customUrl) { | |||
|  |           apiUrl = customUrl; | |||
|  |         } | |||
|  |       } | |||
|  | 
 | |||
|  |       function setIDsession() { | |||
|  |         const customUUID = prompt("Enter custom session ID: "); | |||
|  |         if (customUUID) { | |||
|  |           uuid = customUUID; | |||
|  |         } | |||
|  |       } | |||
|  | 
 | |||
|  |       function generateUUID() { | |||
|  |         let newUUID = ''; | |||
|  |         const chars = 'abcdef0123456789'; | |||
|  |         for (let i = 0; i < 32; i++) { | |||
|  |           const charIndex = Math.floor(Math.random() * chars.length); | |||
|  |           newUUID += chars[charIndex]; | |||
|  |           if (i === 7 || i === 11 || i === 15 || i === 19) { | |||
|  |             newUUID += '-'; | |||
|  |           } | |||
|  |         } | |||
|  |         return newUUID; | |||
|  |       } | |||
|  |       const chatForm = document.getElementById('chatForm'); | |||
|  |       const inputField = document.getElementById('input'); | |||
|  |       const responseDiv = document.getElementById('response'); | |||
|  | 
 | |||
|  |       function chat() { | |||
|  |         var input = inputField.value; | |||
|  |         input = encodeURIComponent(input) | |||
|  | 
 | |||
|  |         const userMessageDiv = document.createElement('div'); | |||
|  |         userMessageDiv.className = 'user-message'; | |||
|  |         userMessageDiv.innerText = decodeURIComponent(input); | |||
|  |         responseDiv.appendChild(userMessageDiv); | |||
|  | 
 | |||
|  |         const loadingDiv = document.createElement('div'); | |||
|  |         loadingDiv.className = 'loading'; | |||
|  |         loadingDiv.innerHTML = `<svg width="30" height="30" viewBox="0 0 50 50"><circle cx="25" cy="25" r="20" stroke="black" stroke-width="4" fill="none" /><circle cx="25" cy="25" r="20" stroke="#3498db" stroke-width="4" fill="none" stroke-dasharray="90" stroke-dashoffset="0"><animateTransform attributeName="transform" type="rotate" from="0 25 25" to="360 25 25" dur="1s" repeatCount="indefinite"/></circle></svg><center class="smaller">If you recive an error than wait 1-2 minutes refresh and try again.</center>`; | |||
|  |         responseDiv.appendChild(loadingDiv); | |||
|  | 
 | |||
|  |         axios.get(`${apiUrl}/${uuid}?q=${encodeURIComponent(input)}`) | |||
|  |           .then((response) => { | |||
|  |             responseDiv.removeChild(loadingDiv); | |||
|  | 
 | |||
|  |             const aiMessages = response.data[0].response.filter(message => message.role === 'system' && message.content.response); | |||
|  |             if (aiMessages.length > 0) { | |||
|  |               const lastAiMessage = aiMessages[aiMessages.length - 1]; | |||
|  |               const aiMessageDiv = document.createElement('div'); | |||
|  |               aiMessageDiv.className = 'ai-message'; | |||
|  |               aiMessageDiv.innerHTML = marked.parse(lastAiMessage.content.response); | |||
|  |               responseDiv.appendChild(aiMessageDiv); | |||
|  |             } | |||
|  | 
 | |||
|  |             inputField.value = ''; | |||
|  |           }) | |||
|  |           .catch((error) => { | |||
|  |             console.log("Error receiving response:", error); | |||
|  |           }); | |||
|  |       } | |||
|  | 
 | |||
|  |       chatForm.addEventListener('submit', (event) => { | |||
|  |         event.preventDefault(); | |||
|  |         chat() | |||
|  |       }); | |||
|  | 
 | |||
|  |       inputField.addEventListener('keydown', (event) => { | |||
|  |         if (event.key === 'Enter') { | |||
|  |           if (!event.shiftKey) { | |||
|  |             event.preventDefault(); | |||
|  |             chat() | |||
|  |           } | |||
|  |         } | |||
|  |       }); | |||
|  | 
 | |||
|  |       if (!uuid) { | |||
|  |         uuid = generateUUID(); | |||
|  |       } | |||
|  |     </script> | |||
|  | </body> | |||
|  | 
 | |||
|  | </html> |