File size: 3,834 Bytes
d00ab12
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
dd1b723
d00ab12
 
 
 
 
 
 
 
 
 
 
 
 
 
dd1b723
d00ab12
 
 
 
 
dd1b723
d00ab12
 
 
 
 
 
 
 
 
 
 
 
 
 
dd1b723
d00ab12
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
dd1b723
d00ab12
 
 
 
 
 
dd1b723
d00ab12
 
 
 
 
 
 
dd1b723
d00ab12
 
dd1b723
d00ab12
 
 
 
 
dd1b723
 
d00ab12
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import { pipeline, TextStreamer } from '@huggingface/transformers';

// DOM Elements
const chatHistory = document.getElementById('chat-history');
const userInput = document.getElementById('user-input');
const sendButton = document.getElementById('send-button');

// Global pipeline variable
let generator = null;

// Initialize the model when the page loads
async function initializeModel() {
  try {
    showLoader('Loading model...');
    generator = await pipeline('text-generation', 'onnx-community/Qwen3-0.6B-ONNX', { dtype: 'q4f16' });
    hideLoader();
    addMessage('System', 'Model loaded successfully! You can now start chatting.', 'system');
  } catch (error) {
    hideLoader();
    addMessage('System', `Error loading model: ${error.message}`, 'error');
  }
}

// Show loading message
function showLoader(message) {
  const loaderElement = document.createElement('div');
  loaderElement.className = 'chat-message system';
  loaderElement.id = 'loader';
  loaderElement.innerHTML = `
    <div class="message-content">
      <div class="loader"></div>
      <span>${message}</span>
    </div>
  `;
  chatHistory.appendChild(loaderElement);
  chatHistory.scrollTop = chatHistory.scrollHeight;
}

// Hide loading message
function hideLoader() {
  const loaderElement = document.getElementById('loader');
  if (loaderElement) loaderElement.remove();
}

// Add message to chat display
function addMessage(role, content, type = 'user') {
  const messageElement = document.createElement('div');
  messageElement.className = `chat-message ${type}`;
  
  if (type === 'user' || type === 'assistant') {
    messageElement.innerHTML = `<strong>${role}:</strong> ${content}`;
  } else {
    messageElement.innerHTML = `<em>${content}</em>`;
  }
  
  chatHistory.appendChild(messageElement);
  chatHistory.scrollTop = chatHistory.scrollHeight;
}

// Handle sending messages
async function handleSendMessage() {
  if (!generator) {
    addMessage('System', 'Model is still loading. Please wait...', 'error');
    return;
  }

  const input = userInput.value.trim();
  if (!input) return;

  // Add user message to chat
  addMessage('You', input, 'user');
  userInput.value = '';

  try {
    // Prepare messages for model
    const messages = [
      { role: 'system', content: 'You are a helpful assistant.' },
      { role: 'user', content: input }
    ];

    // Create temporary element for streaming response
    const assistantMessageElement = document.createElement('div');
    assistantMessageElement.className = 'chat-message assistant';
    assistantMessageElement.innerHTML = '<strong>Assistant:</strong> ';
    const contentSpan = document.createElement('span');
    assistantMessageElement.appendChild(contentSpan);
    chatHistory.appendChild(assistantMessageElement);

    // Create streamer to handle response tokens
    const streamer = new TextStreamer(generator.tokenizer, {
      skip_prompt: true,
      skip_special_tokens: true,
      callback_function: (token) => {
        contentSpan.textContent += token;
        chatHistory.scrollTop = chatHistory.scrollHeight;
      }
    });

    // Generate response
    await generator(messages, {
      max_new_tokens: 256,
      do_sample: false,
      streamer: streamer
    });

    // Final response element update
    contentSpan.textContent = contentSpan.textContent.trim();
    chatHistory.scrollTop = chatHistory.scrollHeight;
  } catch (error) {
    addMessage('System', `Error generating response: ${error.message}`, 'error');
  }
}

// Event Listeners
sendButton.addEventListener('click', handleSendMessage);

userInput.addEventListener('keydown', (e) => {
  if (e.key === 'Enter' && !e.shiftKey) {
    e.preventDefault();
    handleSendMessage();
  }
});

// Initialize the model on page load
document.addEventListener('DOMContentLoaded', initializeModel);