File size: 2,956 Bytes
db9b27f
 
71e0415
 
db9b27f
b31737a
 
 
 
 
 
 
db9b27f
b31737a
 
db9b27f
 
b31737a
db9b27f
b31737a
 
a2648f3
db9b27f
 
 
 
a2648f3
db9b27f
03bbb65
db9b27f
 
 
 
 
 
 
b31737a
db9b27f
b31737a
db9b27f
 
 
 
 
03bbb65
 
db9b27f
 
 
 
 
 
 
 
 
 
 
 
 
 
03bbb65
db9b27f
 
 
03bbb65
 
db9b27f
 
 
b31737a
a2648f3
db9b27f
03bbb65
 
db9b27f
 
a2648f3
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
// index.js

import { pipeline } from 'https://cdn.jsdelivr.net/npm/@xenova/transformers';

// Front-end copy of the Python AVAILABLE_MODELS list for dropdown population:
const AVAILABLE_MODELS = [
  { name: "Moonshot Kimi-K2", id: "moonshotai/Kimi-K2-Instruct" },
  { name: "DeepSeek V3", id: "deepseek-ai/DeepSeek-V3-0324" },
  { name: "DeepSeek R1", id: "deepseek-ai/DeepSeek-R1-0528" },
  { name: "ERNIE-4.5-VL", id: "baidu/ERNIE-4.5-VL-424B-A47B-Base-PT" },
  { name: "MiniMax M1", id: "MiniMaxAI/MiniMax-M1-80k" },
  { name: "Qwen3-235B-A22B", id: "Qwen/Qwen3-235B-A22B" },
  { name: "Qwen3-32B", id: "Qwen/Qwen3-32B" },                    // newly added
  { name: "SmolLM3-3B", id: "HuggingFaceTB/SmolLM3-3B" },
  { name: "GLM-4.1V-9B-Thinking", id: "THUDM/GLM-4.1V-9B-Thinking" },
  { name: "LLaMA-2-70B-Chat", id: "meta-llama/Llama-2-70b-chat" },  // powerful addition
  { name: "Mistral-7B-Instruct", id: "mistralai/Mistral-7B-Instruct" }, // powerful addition
  { name: "Qwen3-235B-A22B-Instruct-2507", id: "Qwen/Qwen3-235B-A22B-Instruct-2507" },
  { name: "Qwen3-Coder-480B-A35B", id: "Qwen/Qwen3-Coder-480B-A35B-Instruct" }
];

const modelSelect   = document.getElementById('modelSelect');
const analyzeForm   = document.getElementById('analyze-form');
const inputText     = document.getElementById('inputText');
const analyzeButton = document.getElementById('analyzeButton');
const resultSection = document.getElementById('result');

let sentimentPipeline = null;

// Populate the model dropdown
AVAILABLE_MODELS.forEach(model => {
  const option = document.createElement('option');
  option.value = model.id;
  option.textContent = model.name;
  modelSelect.appendChild(option);
});

// Initialize pipeline for the selected model
async function initPipeline(modelId) {
  analyzeButton.disabled = true;
  analyzeButton.textContent = 'Loading model…';
  sentimentPipeline = await pipeline('sentiment-analysis', modelId);
  analyzeButton.textContent = 'Analyze Sentiment';
  analyzeButton.disabled = false;
}

// On page load: initialize with the first model
initPipeline(modelSelect.value);

// When user changes model: reinitialize pipeline
modelSelect.addEventListener('change', () => {
  resultSection.textContent = '';
  initPipeline(modelSelect.value);
});

// Handle form submission
analyzeForm.addEventListener('submit', async (event) => {
  event.preventDefault();
  const text = inputText.value.trim();
  if (!text) return;

  analyzeButton.disabled = true;
  analyzeButton.textContent = 'Analyzing…';
  resultSection.textContent = '';

  try {
    const [output] = await sentimentPipeline(text);
    const { label, score } = output;
    resultSection.textContent = `Sentiment: ${label} (Confidence: ${(score * 100).toFixed(2)}%)`;
  } catch (err) {
    console.error(err);
    resultSection.textContent = 'Error analyzing sentiment.';
  }

  analyzeButton.textContent = 'Analyze Sentiment';
  analyzeButton.disabled = false;
});