| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Crypton.Agi - Quantum Chatbot Wizardry</title> |
| <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> |
| <style> |
| :root { |
| --primary: #6e48aa; |
| --secondary: #9d50bb; |
| --accent: #4776E6; |
| --dark: #1a1a2e; |
| --light: #f8f9fa; |
| --success: #4BB543; |
| --warning: #FFCC00; |
| --danger: #FF3333; |
| } |
| |
| * { |
| margin: 0; |
| padding: 0; |
| box-sizing: border-box; |
| font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; |
| } |
| |
| body { |
| background: linear-gradient(135deg, var(--dark) 0%, #16213e 100%); |
| color: var(--light); |
| min-height: 100vh; |
| display: flex; |
| flex-direction: column; |
| } |
| |
| .container { |
| max-width: 1200px; |
| margin: 0 auto; |
| padding: 2rem; |
| flex: 1; |
| } |
| |
| header { |
| text-align: center; |
| margin-bottom: 2rem; |
| animation: fadeIn 1s ease-out; |
| } |
| |
| h1 { |
| font-size: 2.5rem; |
| margin-bottom: 0.5rem; |
| background: linear-gradient(to right, var(--primary), var(--secondary)); |
| -webkit-background-clip: text; |
| background-clip: text; |
| color: transparent; |
| } |
| |
| .subtitle { |
| font-size: 1.1rem; |
| opacity: 0.8; |
| } |
| |
| .chat-container { |
| background: rgba(255, 255, 255, 0.05); |
| backdrop-filter: blur(10px); |
| border-radius: 1rem; |
| padding: 1.5rem; |
| box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); |
| height: 60vh; |
| display: flex; |
| flex-direction: column; |
| } |
| |
| .chat-messages { |
| flex: 1; |
| overflow-y: auto; |
| padding: 1rem; |
| margin-bottom: 1rem; |
| display: flex; |
| flex-direction: column; |
| gap: 1rem; |
| } |
| |
| .message { |
| max-width: 80%; |
| padding: 0.8rem 1.2rem; |
| border-radius: 1rem; |
| animation: fadeIn 0.3s ease-out; |
| } |
| |
| .user-message { |
| align-self: flex-end; |
| background: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 100%); |
| color: white; |
| border-bottom-right-radius: 0.2rem; |
| } |
| |
| .bot-message { |
| align-self: flex-start; |
| background: rgba(255, 255, 255, 0.1); |
| border-bottom-left-radius: 0.2rem; |
| } |
| |
| .typing-indicator { |
| display: flex; |
| align-items: center; |
| gap: 0.5rem; |
| padding: 0.8rem 1.2rem; |
| background: rgba(255, 255, 255, 0.1); |
| border-radius: 1rem; |
| width: fit-content; |
| margin-bottom: 1rem; |
| } |
| |
| .typing-dot { |
| width: 8px; |
| height: 8px; |
| background-color: var(--light); |
| border-radius: 50%; |
| opacity: 0.6; |
| animation: typingAnimation 1.4s infinite ease-in-out; |
| } |
| |
| .typing-dot:nth-child(1) { animation-delay: 0s; } |
| .typing-dot:nth-child(2) { animation-delay: 0.2s; } |
| .typing-dot:nth-child(3) { animation-delay: 0.4s; } |
| |
| .chat-input { |
| display: flex; |
| gap: 1rem; |
| } |
| |
| #messageInput { |
| flex: 1; |
| padding: 0.8rem 1.2rem; |
| border: none; |
| border-radius: 2rem; |
| background: rgba(255, 255, 255, 0.1); |
| color: var(--light); |
| font-size: 1rem; |
| outline: none; |
| transition: all 0.3s ease; |
| } |
| |
| #messageInput:focus { |
| background: rgba(255, 255, 255, 0.2); |
| box-shadow: 0 0 0 2px var(--primary); |
| } |
| |
| #sendButton { |
| background: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 100%); |
| color: white; |
| border: none; |
| border-radius: 2rem; |
| padding: 0 1.5rem; |
| cursor: pointer; |
| transition: all 0.3s ease; |
| display: flex; |
| align-items: center; |
| justify-content: center; |
| } |
| |
| #sendButton:hover { |
| transform: translateY(-2px); |
| box-shadow: 0 5px 15px rgba(110, 72, 170, 0.4); |
| } |
| |
| #sendButton:active { |
| transform: translateY(0); |
| } |
| |
| .model-info { |
| margin-top: 1rem; |
| font-size: 0.9rem; |
| opacity: 0.7; |
| text-align: center; |
| } |
| |
| @keyframes fadeIn { |
| from { opacity: 0; transform: translateY(10px); } |
| to { opacity: 1; transform: translateY(0); } |
| } |
| |
| @keyframes typingAnimation { |
| 0%, 60%, 100% { transform: translateY(0); opacity: 0.6; } |
| 30% { transform: translateY(-5px); opacity: 1; } |
| } |
| |
| |
| @media (max-width: 768px) { |
| .container { |
| padding: 1rem; |
| } |
| |
| h1 { |
| font-size: 2rem; |
| } |
| |
| .chat-container { |
| height: 70vh; |
| } |
| |
| .message { |
| max-width: 90%; |
| } |
| } |
| </style> |
| </head> |
| <body> |
| <div class="container"> |
| <header> |
| <h1>Crypton.Agi</h1> |
| <p class="subtitle">Your quantum-powered AI assistant</p> |
| </header> |
| |
| <div class="chat-container"> |
| <div class="chat-messages" id="chatMessages"> |
| <div class="message bot-message"> |
| Hello! I'm Crypton.Agi, your AI assistant. How can I help you today? |
| </div> |
| </div> |
| |
| <div class="chat-input"> |
| <input type="text" id="messageInput" placeholder="Type your message here..." autocomplete="off"> |
| <button id="sendButton"> |
| <i class="fas fa-paper-plane"></i> |
| </button> |
| </div> |
| |
| <p class="model-info">Powered by Hugging Face Transformers</p> |
| </div> |
| </div> |
|
|
| <script> |
| document.addEventListener('DOMContentLoaded', () => { |
| const chatMessages = document.getElementById('chatMessages'); |
| const messageInput = document.getElementById('messageInput'); |
| const sendButton = document.getElementById('sendButton'); |
| |
| |
| const API_URL = 'https://api-inference.huggingface.co/models/'; |
| const MODEL_NAME = 'gpt2'; |
| |
| |
| function addMessage(text, isUser) { |
| const messageDiv = document.createElement('div'); |
| messageDiv.classList.add('message'); |
| messageDiv.classList.add(isUser ? 'user-message' : 'bot-message'); |
| messageDiv.textContent = text; |
| chatMessages.appendChild(messageDiv); |
| chatMessages.scrollTop = chatMessages.scrollHeight; |
| } |
| |
| |
| function showTyping() { |
| const typingDiv = document.createElement('div'); |
| typingDiv.classList.add('typing-indicator'); |
| typingDiv.id = 'typingIndicator'; |
| |
| for (let i = 0; i < 3; i++) { |
| const dot = document.createElement('div'); |
| dot.classList.add('typing-dot'); |
| typingDiv.appendChild(dot); |
| } |
| |
| chatMessages.appendChild(typingDiv); |
| chatMessages.scrollTop = chatMessages.scrollHeight; |
| } |
| |
| |
| function hideTyping() { |
| const typingIndicator = document.getElementById('typingIndicator'); |
| if (typingIndicator) { |
| typingIndicator.remove(); |
| } |
| } |
| |
| |
| async function sendMessage() { |
| const message = messageInput.value.trim(); |
| if (!message) return; |
| |
| |
| addMessage(message, true); |
| messageInput.value = ''; |
| |
| |
| showTyping(); |
| |
| try { |
| |
| |
| const response = await fetch(`${API_URL}${MODEL_NAME}`, { |
| method: 'POST', |
| headers: { |
| 'Content-Type': 'application/json', |
| 'Authorization': 'Bearer YOUR_HUGGING_FACE_TOKEN' |
| }, |
| body: JSON.stringify({ inputs: message }) |
| }); |
| |
| if (!response.ok) { |
| throw new Error(`API request failed with status ${response.status}`); |
| } |
| |
| const data = await response.json(); |
| |
| |
| hideTyping(); |
| |
| |
| if (data && data[0] && data[0].generated_text) { |
| addMessage(data[0].generated_text.replace(message, '').trim(), false); |
| } else { |
| addMessage("I received your message but couldn't process it properly.", false); |
| } |
| } catch (error) { |
| hideTyping(); |
| addMessage(`Sorry, I encountered an error: ${error.message}`, false); |
| console.error('API Error:', error); |
| } |
| } |
| |
| |
| sendButton.addEventListener('click', sendMessage); |
| messageInput.addEventListener('keypress', (e) => { |
| if (e.key === 'Enter') { |
| sendMessage(); |
| } |
| }); |
| }); |
| </script> |
| </body> |
| </html> |