// Configuration - Now using local AI simulation (no API required) const USE_LOCAL_AI = true; const LOCAL_AI_DELAY = 800; // ms delay to simulate AI thinking const LOCAL_IMAGE_MODEL = true; // Enable local image generation // State let isGenerating = false; let abortController = null; let localAiInterval = null; document.addEventListener('DOMContentLoaded', function() { const chatForm = document.getElementById('chatForm'); const messageInput = document.getElementById('messageInput'); const chatMessages = document.getElementById('chatMessages'); const charCount = document.getElementById('charCount'); const stopButton = document.getElementById('stopButton'); const sendButton = document.getElementById('sendButton'); const generateImageBtn = document.getElementById('generateImageBtn'); const generateImageButton = document.getElementById('generateImageButton'); const aiStatus = document.getElementById('aiStatus'); const apiStatus = document.getElementById('apiStatus'); // Character counter messageInput.addEventListener('input', function() { charCount.textContent = `${this.value.length}/1000`; }); // Image generation button if (generateImageBtn) { generateImageBtn.addEventListener('click', generateSceneImage); } // New image generation from last message if (generateImageButton) { generateImageButton.addEventListener('click', generateImageFromLastMessage); } // Send message chatForm.addEventListener('submit', async function(e) { e.preventDefault(); if (isGenerating) { stopGeneration(); return; } await sendMessage(); }); // Stop generation stopButton.addEventListener('click', stopGeneration); // Allow Shift+Enter for new line, Enter to send messageInput.addEventListener('keydown', function(e) { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); if (isGenerating) { stopGeneration(); } else { chatForm.dispatchEvent(new Event('submit')); } } }); // Send message function async function sendMessage() { const text = messageInput.value.trim(); if (!text) return; // Add user message addMessage('user', text); messageInput.value = ''; charCount.textContent = '0/1000'; // Show typing indicator showTyping(); setGenerating(true); updateAPIStatus(true, 'Generating locally...'); try { const characterName = document.getElementById('characterName').textContent; const characterRole = document.querySelector('.bg-surface.rounded-xl.p-5 span').textContent; const responseLength = document.getElementById('responseLength').value; // Build system prompt const systemPrompt = buildSystemPrompt(characterName, characterRole, responseLength); // Get conversation history const messages = getConversationHistory(systemPrompt); // Use local AI simulation (no API calls) const aiResponse = await generateLocalAIResponse(characterName, messages, responseLength); removeTyping(); addMessage('ai', aiResponse); setGenerating(false); updateAPIStatus(true, 'Response ready'); // Check if AI response suggests image generation if (aiResponse.includes('generate an image') || aiResponse.includes('Would you like me to generate')) { // Auto-suggest image generation after a delay setTimeout(() => { if (confirm(`${characterName} suggested generating an image. Would you like to create one based on your last message?`)) { generateImageFromLastMessage(); } }, 1500); } } catch (error) { removeTyping(); console.error('AI Error:', error); addMessage('system', `Local AI error: ${error.message}. Using fallback response.`); // Fallback to local response const fallbackResponse = getFallbackResponse(); addMessage('ai', fallbackResponse); setGenerating(false); updateAPIStatus(true, 'Using fallback'); } } // Generate scene image using local model async function generateSceneImage() { if (!LOCAL_IMAGE_MODEL) { addMessage('system', 'Local image model is not enabled.'); return; } // Create and show image generator component const generator = document.createElement('image-generator'); // Create a container for the generator in the chat const container = document.createElement('div'); container.className = 'message user animate-message-slide mb-6'; container.innerHTML = `
Generating an image of the current scene using local AI model...
Here's an image generated from your message using our built-in AI image model:
Prompt: "${prompt.substring(0, 100)}..."
${content}