templates/index.html aktualisiert

This commit is contained in:
2026-03-05 22:44:00 +00:00
parent 4b944f1fdb
commit b646e7bebc

View File

@@ -272,41 +272,51 @@
const provider = providerSelect.value; const provider = providerSelect.value;
// Sichtbarkeit umschalten // URL-Feld nur bei Ollama einblenden
if (provider === "ollama") { if (provider === "ollama") {
urlContainer.style.display = "flex"; urlContainer.style.display = "flex";
// AUTOMATIK: Modelle von Ollama abrufen
const baseUrl = ollamaUrlInput.value.replace(/\/v1\/?$/, ''); // Entfernt /v1 für den API-Check
if (baseUrl) {
try {
const response = await fetch(`${baseUrl}/api/tags`);
const data = await response.json();
modelSelect.innerHTML = '';
data.models.forEach(m => {
const opt = document.createElement('option');
opt.value = m.name; // Nimmt den exakten Namen inkl. Tag (z.B. gemma3:4b)
opt.textContent = m.name;
modelSelect.appendChild(opt);
});
console.log("Ollama Modelle geladen:", data.models);
} catch (e) {
console.error("Konnte Ollama Modelle nicht laden:", e);
// Fallback auf die statische Liste, falls der Server offline ist
fillStaticModels(provider, modelSelect);
}
}
} else { } else {
urlContainer.style.display = "none"; urlContainer.style.display = "none";
}
// Lade-Indikator setzen, damit du siehst, dass etwas passiert
modelSelect.innerHTML = '<option value="">Lade Modelle...</option>';
try {
// Wir fragen jetzt DEIN Backend, nicht die Anbieter direkt!
// Wir schicken die Provider-Wahl und (falls Ollama) die URL mit.
const targetUrl = (provider === "ollama") ? ollamaUrlInput.value : "";
const response = await fetch(`/api/models?provider=${provider}&url=${encodeURIComponent(targetUrl)}`);
if (!response.ok) throw new Error("Backend antwortet nicht korrekt");
const data = await response.json();
modelSelect.innerHTML = ''; // Lade-Text entfernen
// Wenn das Backend Modelle liefert, füllen wir das Dropdown
if (data.models && data.models.length > 0) {
data.models.forEach(m => {
const opt = document.createElement('option');
opt.value = m;
opt.textContent = m;
modelSelect.appendChild(opt);
});
} else {
// Fallback, falls die Liste leer ist
fillStaticModels(provider, modelSelect);
}
} catch (e) {
console.error("Konnte Modelle nicht laden, nutze Standard-Liste:", e);
fillStaticModels(provider, modelSelect); fillStaticModels(provider, modelSelect);
} }
// Gespeicherten Wert setzen (nur beim ersten Laden) // Gespeichertes Modell wiederherstellen (beim Neuladen der Seite)
if (isInitialLoad && currentSettings) { if (isInitialLoad && currentSettings) {
const savedModel = currentSettings[`${provider}_model`]; const savedModel = currentSettings[`${provider}_model`];
if (savedModel) { if (savedModel) {
// Falls das Modell noch nicht im Dropdown ist (weil es neu geladen wurde), hinzufügen // Falls das gespeicherte Modell nicht in der Liste ist, fügen wir es an
if (!Array.from(modelSelect.options).some(opt => opt.value === savedModel)) { if (!Array.from(modelSelect.options).some(opt => opt.value === savedModel)) {
const opt = document.createElement('option'); const opt = document.createElement('option');
opt.value = savedModel; opt.value = savedModel;