File size: 2,805 Bytes
a2648f3
 
71e0415
 
a2648f3
b31737a
 
 
 
 
 
 
 
 
 
f70a193
 
 
 
b31737a
 
a2648f3
 
 
03bbb65
a2648f3
 
 
03bbb65
a2648f3
b31737a
a2648f3
 
 
 
b31737a
 
a2648f3
b31737a
03bbb65
a2648f3
b31737a
03bbb65
 
 
 
a2648f3
b31737a
 
a2648f3
b31737a
 
a2648f3
b31737a
 
71e0415
a2648f3
03bbb65
 
 
 
 
a2648f3
03bbb65
 
 
a2648f3
 
 
b31737a
a2648f3
03bbb65
 
 
 
 
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: "SmolLM3-3B", id: "HuggingFaceTB/SmolLM3-3B" },
  { name: "GLM-4.1V-9B-Thinking", id: "THUDM/GLM-4.1V-9B-Thinking" },
  { 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" },
  // New providers:
  { name: "OpenAI GPT-4", id: "openai/gpt-4" },
  { name: "Gemini Pro", id: "gemini/pro" }
];

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;
});