From a92eaf66cf998ddf006da496531e97f902b2b9fa Mon Sep 17 00:00:00 2001 From: Sven Carstensen Date: Fri, 10 Jul 2026 10:48:09 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20KI-Funktionalit=C3=A4t=20per=20.env-Sch?= =?UTF-8?q?alter=20AI=5FENABLED=20abschaltbar=20(Standard:=20aus)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- .env.example | 13 +++++++++++++ .../service/WorkflowAssistantService.java | 10 +++++++--- .../de/assecutor/tasklisteditor/view/MainView.java | 7 +++++-- src/main/resources/application.properties | 6 ++++-- 4 files changed, 29 insertions(+), 7 deletions(-) diff --git a/.env.example b/.env.example index 98430ee..e53ef8c 100644 --- a/.env.example +++ b/.env.example @@ -41,3 +41,16 @@ MONGODB_ELEMENT_SCRIPT_COLLECTION=element_script # true = Script-Element wird im Editor nicht angezeigt # false = Script-Element ist verfügbar (Standard) HIDE_SCRIPT_BLOCK=false + +# --- KI-Workflow-Assistent --------------------------------------------------- +# KI-Funktionalität ein-/ausschalten: +# true = KI-Assistent ist im Editor verfügbar +# false = KI-Assistent ist deaktiviert (Standard) +AI_ENABLED=false + +# API-Key für die Claude API (https://platform.claude.com/settings/keys). +# Ohne Key ist der KI-Assistent im Editor deaktiviert. +ANTHROPIC_API_KEY= + +# Verwendetes Claude-Modell (Standard: claude-opus-4-8): +#ANTHROPIC_MODEL=claude-opus-4-8 diff --git a/src/main/java/de/assecutor/tasklisteditor/service/WorkflowAssistantService.java b/src/main/java/de/assecutor/tasklisteditor/service/WorkflowAssistantService.java index f7c5729..d3ac7f2 100644 --- a/src/main/java/de/assecutor/tasklisteditor/service/WorkflowAssistantService.java +++ b/src/main/java/de/assecutor/tasklisteditor/service/WorkflowAssistantService.java @@ -31,6 +31,7 @@ import java.util.List; public class WorkflowAssistantService { private final BlockTypeRegistry registry; + private final boolean aiEnabled; private final String apiKey; private final String model; private final ObjectMapper lenientMapper; @@ -38,9 +39,11 @@ public class WorkflowAssistantService { private volatile AnthropicClient client; public WorkflowAssistantService(BlockTypeRegistry registry, + @Value("${tasklist.ai-enabled:false}") boolean aiEnabled, @Value("${tasklist.anthropic-api-key:}") String apiKey, @Value("${tasklist.anthropic-model:claude-opus-4-8}") String model) { this.registry = registry; + this.aiEnabled = aiEnabled; this.apiKey = apiKey == null ? "" : apiKey.trim(); this.model = model; this.lenientMapper = new ObjectMapper() @@ -51,9 +54,9 @@ public class WorkflowAssistantService { public record WorkflowDraft(String name, List tasks) { } - /** Ob der Assistent nutzbar ist (API-Key in der .env hinterlegt). */ + /** Ob der Assistent nutzbar ist (AI_ENABLED=true und API-Key in der .env). */ public boolean isEnabled() { - return !apiKey.isBlank(); + return aiEnabled && !apiKey.isBlank(); } /** @@ -84,7 +87,8 @@ public class WorkflowAssistantService { public WorkflowDraft generateWorkflow(String wish, String currentName, String currentTasksJson) { if (!isEnabled()) { throw new IllegalStateException( - "Kein Claude-API-Key konfiguriert (ANTHROPIC_API_KEY in der .env-Datei)."); + "KI-Assistent deaktiviert: AI_ENABLED=true und ANTHROPIC_API_KEY " + + "in der .env-Datei setzen."); } if (wish == null || wish.isBlank()) { throw new IllegalStateException("Bitte einen Workflow-Wunsch eingeben."); diff --git a/src/main/java/de/assecutor/tasklisteditor/view/MainView.java b/src/main/java/de/assecutor/tasklisteditor/view/MainView.java index 823ead6..410f0c3 100644 --- a/src/main/java/de/assecutor/tasklisteditor/view/MainView.java +++ b/src/main/java/de/assecutor/tasklisteditor/view/MainView.java @@ -229,6 +229,8 @@ public class MainView extends VerticalLayout implements BeforeEnterObserver { assistant.addThemeVariants(ButtonVariant.LUMO_TERTIARY); assistant.setTooltipText("Workflow aus einer Beschreibung erzeugen oder ändern (Claude)"); assistant.addClickListener(e -> openAssistantDialog()); + // KI-Funktionalität per .env (AI_ENABLED) abschaltbar. + assistant.setVisible(workflowAssistantService.isEnabled()); Button undo = new Button("Rückgängig", new Icon(VaadinIcon.ARROW_BACKWARD)); undo.addThemeVariants(ButtonVariant.LUMO_TERTIARY); @@ -1033,8 +1035,9 @@ public class MainView extends VerticalLayout implements BeforeEnterObserver { */ private void openAssistantDialog() { if (!workflowAssistantService.isEnabled()) { - Notification.show("KI-Assistent nicht verfügbar: Bitte ANTHROPIC_API_KEY " - + "in der .env-Datei hinterlegen und die Anwendung neu starten."); + Notification.show("KI-Assistent nicht verfügbar: Bitte AI_ENABLED=true und " + + "ANTHROPIC_API_KEY in der .env-Datei hinterlegen und die " + + "Anwendung neu starten."); return; } boolean modifying = !instances.isEmpty(); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 804e44e..43026eb 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -31,8 +31,10 @@ management.health.mongo.enabled=false tasklist.hide-script-block=${HIDE_SCRIPT_BLOCK:false} # --- KI-Workflow-Assistent (Claude API) -------------------------------------- -# API-Key und Modell kommen aus der .env-Datei (ANTHROPIC_API_KEY, -# ANTHROPIC_MODEL). Ohne Key ist der Assistent im Editor deaktiviert. +# Ein-/Ausschalter, API-Key und Modell kommen aus der .env-Datei (AI_ENABLED, +# ANTHROPIC_API_KEY, ANTHROPIC_MODEL). Der Assistent ist nur verfügbar, wenn +# AI_ENABLED=true gesetzt UND ein Key hinterlegt ist (Standard: aus). +tasklist.ai-enabled=${AI_ENABLED:false} tasklist.anthropic-api-key=${ANTHROPIC_API_KEY:} tasklist.anthropic-model=${ANTHROPIC_MODEL:claude-opus-4-8}