From 1736a74d1083497be59652545f4210525dda8235 Mon Sep 17 00:00:00 2001 From: svemagie <869694+svemagie@users.noreply.github.com> Date: Fri, 27 Mar 2026 21:24:17 +0100 Subject: [PATCH] feat: add Aktualisieren button to fetch models from API Co-Authored-By: Claude Sonnet 4.6 --- src/SettingsTab.ts | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/src/SettingsTab.ts b/src/SettingsTab.ts index 89a6220..08fcb75 100644 --- a/src/SettingsTab.ts +++ b/src/SettingsTab.ts @@ -1,4 +1,4 @@ -import { App, PluginSettingTab, Setting } from "obsidian"; +import { App, ButtonComponent, DropdownComponent, Notice, PluginSettingTab, Setting } from "obsidian"; import type MemexChatPlugin from "./main"; import { EMBEDDING_MODELS } from "./EmbedSearch"; @@ -32,7 +32,7 @@ export interface MemexChatSettings { export const DEFAULT_SETTINGS: MemexChatSettings = { apiKey: "", - model: "claude-opus-4-5-20251101", + model: "claude-opus-4-6", maxTokens: 8192, maxContextNotes: 6, maxCharsPerNote: 2500, @@ -70,8 +70,8 @@ Wenn du Fragen beantwortest: }; export const MODELS = [ - { id: "claude-opus-4-5-20251101", name: "Claude Opus 4.5 (Stärkste)" }, - { id: "claude-sonnet-4-5-20250929", name: "Claude Sonnet 4.5 (Empfohlen)" }, + { id: "claude-opus-4-6", name: "Claude Opus 4.6 (Stärkste)" }, + { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6 (Empfohlen)" }, { id: "claude-haiku-4-5-20251001", name: "Claude Haiku 4.5 (Schnell)" }, ]; @@ -148,15 +148,40 @@ export class MemexChatSettingsTab extends PluginSettingTab { }) ); + let modelDrop: DropdownComponent; + let refreshBtn: ButtonComponent; + new Setting(containerEl) .setName("Modell") .setDesc("Welches Claude-Modell verwenden?") .addDropdown((drop) => { + modelDrop = drop; for (const m of MODELS) drop.addOption(m.id, m.name); drop.setValue(this.plugin.settings.model).onChange(async (value) => { this.plugin.settings.model = value; await this.plugin.saveSettings(); }); + }) + .addButton((btn) => { + refreshBtn = btn; + btn.setButtonText("Aktualisieren").onClick(async () => { + const prev = modelDrop.getValue(); + refreshBtn.setDisabled(true); + refreshBtn.setButtonText("..."); + try { + const models = await this.plugin.claude.fetchModels(this.plugin.settings.apiKey); + modelDrop.selectEl.empty(); + for (const m of models) modelDrop.addOption(m.id, m.name); + modelDrop.setValue(prev); + this.plugin.settings.model = modelDrop.getValue(); + await this.plugin.saveSettings(); + } catch (err) { + new Notice("Modelle konnten nicht geladen werden: " + (err as Error).message); + } finally { + refreshBtn.setDisabled(false); + refreshBtn.setButtonText("Aktualisieren"); + } + }); }); new Setting(containerEl)