vimalk78's picture
feat: add frontend controls for similarity temperature and difficulty weight
5686111
import React, { useState } from 'react';
const AdvancedSettings = ({
similarityTemperature,
onTemperatureChange,
difficultyWeight,
onWeightChange
}) => {
const [isExpanded, setIsExpanded] = useState(false);
const presets = [
{
name: 'Default',
temp: 0.2,
weight: 0.5,
description: 'Balanced settings (recommended)'
},
{
name: 'Focused',
temp: 0.1,
weight: 0.3,
description: 'Deterministic, similarity-based'
},
{
name: 'Varied',
temp: 0.7,
weight: 0.5,
description: 'More randomness and variety'
},
{
name: 'Challenging',
temp: 0.5,
weight: 0.7,
description: 'Respects difficulty levels more'
}
];
const applyPreset = (preset) => {
onTemperatureChange(preset.temp);
onWeightChange(preset.weight);
};
const getTemperatureDescription = (value) => {
if (value <= 0.3) return 'Deterministic (top similar words)';
if (value <= 0.6) return 'Balanced (good variety)';
if (value <= 1.0) return 'Random (surprising choices)';
return 'Very random (unpredictable)';
};
const getWeightDescription = (value) => {
if (value <= 0.2) return 'Similarity-focused';
if (value <= 0.4) return 'Slightly similarity-focused';
if (value <= 0.6) return 'Balanced';
if (value <= 0.8) return 'Slightly frequency-focused';
return 'Frequency-focused';
};
return (
<div className="advanced-settings">
<div
className="advanced-settings-header"
onClick={() => setIsExpanded(!isExpanded)}
>
<span className="settings-icon">⚙️</span>
<span className="settings-title">Advanced Settings</span>
<span className="expand-icon">{isExpanded ? '▼' : '▶'}</span>
</div>
{isExpanded && (
<div className="advanced-settings-content">
<div className="setting-group">
<label className="setting-label">
Word Selection Randomness
<span className="setting-value">{similarityTemperature.toFixed(1)}</span>
</label>
<div className="slider-container">
<input
type="range"
min="0.1"
max="2.0"
step="0.1"
value={similarityTemperature}
onChange={(e) => onTemperatureChange(parseFloat(e.target.value))}
className="slider"
/>
<div className="slider-labels">
<span>More focused</span>
<span>More variety</span>
</div>
</div>
<div className="setting-description">
{getTemperatureDescription(similarityTemperature)}
</div>
</div>
<div className="setting-group">
<label className="setting-label">
Difficulty Balance
<span className="setting-value">{difficultyWeight.toFixed(1)}</span>
</label>
<div className="slider-container">
<input
type="range"
min="0.0"
max="1.0"
step="0.1"
value={difficultyWeight}
onChange={(e) => onWeightChange(parseFloat(e.target.value))}
className="slider"
/>
<div className="slider-labels">
<span>Similarity</span>
<span>Frequency</span>
</div>
</div>
<div className="setting-description">
{getWeightDescription(difficultyWeight)}
</div>
</div>
<div className="presets-section">
<div className="presets-label">Quick Presets:</div>
<div className="presets-container">
{presets.map((preset, index) => (
<button
key={index}
onClick={() => applyPreset(preset)}
className={`preset-button ${
similarityTemperature === preset.temp && difficultyWeight === preset.weight
? 'active'
: ''
}`}
title={preset.description}
>
{preset.name}
</button>
))}
</div>
</div>
<div className="settings-info">
<div className="info-item">
<strong>Temperature:</strong> Controls how random word selection is. Lower values pick the most similar words, higher values add variety.
</div>
<div className="info-item">
<strong>Weight:</strong> Balances similarity vs word frequency. Lower focuses on semantic similarity, higher respects difficulty levels.
</div>
</div>
</div>
)}
</div>
);
};
export default AdvancedSettings;