diff --git a/templates/index.html b/templates/index.html
index 5d20d0f..d7de7a9 100644
--- a/templates/index.html
+++ b/templates/index.html
@@ -169,7 +169,7 @@
-
+
@@ -262,38 +262,72 @@
}
}
- function updateModelDropdown(isInitialLoad = false) {
+ async function updateModelDropdown(isInitialLoad = false) {
const providerSelect = document.getElementById('ai-provider');
const modelSelect = document.getElementById('ai-model');
const urlContainer = document.getElementById('ollama-url-container');
-
+ const ollamaUrlInput = document.getElementById('ollama-url');
+
if (!providerSelect || !urlContainer) return;
const provider = providerSelect.value;
- console.log("Wechsel zu Provider:", provider);
// Sichtbarkeit umschalten
if (provider === "ollama") {
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 {
urlContainer.style.display = "none";
+ fillStaticModels(provider, modelSelect);
}
- // Modelle füllen
- modelSelect.innerHTML = '';
+ // Gespeicherten Wert setzen (nur beim ersten Laden)
+ if (isInitialLoad && currentSettings) {
+ const savedModel = currentSettings[`${provider}_model`];
+ if (savedModel) {
+ // Falls das Modell noch nicht im Dropdown ist (weil es neu geladen wurde), hinzufügen
+ if (!Array.from(modelSelect.options).some(opt => opt.value === savedModel)) {
+ const opt = document.createElement('option');
+ opt.value = savedModel;
+ opt.textContent = savedModel;
+ modelSelect.appendChild(opt);
+ }
+ modelSelect.value = savedModel;
+ }
+ }
+ }
+
+ // Hilfsfunktion für die statischen Listen (OpenAI/Google)
+ function fillStaticModels(provider, selectElement) {
+ selectElement.innerHTML = '';
const options = modelOptions[provider] || [];
options.forEach(m => {
const opt = document.createElement('option');
opt.value = m;
opt.textContent = m;
- modelSelect.appendChild(opt);
+ selectElement.appendChild(opt);
});
-
- // Gespeicherten Wert setzen
- if (isInitialLoad && currentSettings) {
- const savedModel = currentSettings[`${provider}_model`];
- if (savedModel) modelSelect.value = savedModel;
- }
}
async function saveSettings() {