Spaces:
Sleeping
Sleeping
Download frontend/src/components/ModelStatusModal.js from neongeckocom/LLM_Comparison_Tool: direct link, hf CLI and curl.
- Browser
- Download file 2.8 kB
-
https://huggingface.co/spaces/neongeckocom/LLM_Comparison_Tool/resolve/main/frontend/src/components/ModelStatusModal.js
- Command line
-
hf download hf://spaces/neongeckocom/LLM_Comparison_Tool/frontend/src/components/ModelStatusModal.js
-
curl -L -o ModelStatusModal.js https://huggingface.co/spaces/neongeckocom/LLM_Comparison_Tool/resolve/main/frontend/src/components/ModelStatusModal.js
2.8 kB
| import { X, RefreshCw, CheckCircle2, XCircle, AlertCircle } from 'lucide-react'; | |
| import { neonModelDisplayName } from '../utils/displayName'; | |
| const STATUS_META = { | |
| online: { label: 'Online', Icon: CheckCircle2, className: 'status-online' }, | |
| unavailable: { label: 'Unavailable', Icon: AlertCircle, className: 'status-unavailable' }, | |
| error: { label: 'Error', Icon: XCircle, className: 'status-error' }, | |
| }; | |
| export default function ModelStatusModal({ statuses, loading, onClose, onRefresh }) { | |
| return ( | |
| <div className="modal-overlay" onClick={onClose}> | |
| <div className="modal-panel model-status-modal" onClick={(e) => e.stopPropagation()}> | |
| <div className="modal-header"> | |
| <h2 className="modal-title">Model Status</h2> | |
| <div className="modal-header-actions"> | |
| <button className="icon-btn" onClick={onRefresh} title="Re-check models" disabled={loading}> | |
| <RefreshCw size={16} className={loading ? 'spin' : ''} /> | |
| </button> | |
| <button className="icon-btn" onClick={onClose} title="Close"> | |
| <X size={16} /> | |
| </button> | |
| </div> | |
| </div> | |
| <div className="modal-body"> | |
| {loading && !statuses.length ? ( | |
| <p className="model-status-empty">Checking models…</p> | |
| ) : !statuses.length ? ( | |
| <p className="model-status-empty">No models configured.</p> | |
| ) : ( | |
| <ul className="model-status-list"> | |
| {statuses.map((s) => { | |
| const meta = STATUS_META[s.status] || STATUS_META.unavailable; | |
| const { Icon } = meta; | |
| const displayName = s.is_neon | |
| ? neonModelDisplayName(s.model_name || s.model_id) | |
| : s.model_name; | |
| return ( | |
| <li key={`${s.is_neon ? 'neon' : s.provider}:${s.model_id}`} className="model-status-row"> | |
| <div className="model-status-main"> | |
| <span className="model-status-names"> | |
| <span className="model-status-provider">{s.provider_name}</span> | |
| <span className="model-status-model">{displayName}</span> | |
| </span> | |
| <span className={`model-status-badge ${meta.className}`}> | |
| <Icon size={12} /> | |
| {meta.label} | |
| </span> | |
| </div> | |
| {s.status === 'error' && s.error && ( | |
| <pre className="model-status-error">{s.error}</pre> | |
| )} | |
| </li> | |
| ); | |
| })} | |
| </ul> | |
| )} | |
| </div> | |
| </div> | |
| </div> | |
| ); | |
| } | |