
Heute wollen wir mal einen Mindmap-Bot für das PlantUML-Format mit Perplexity KI in Java erstellen. Er soll eine Mindmap wie die obige erstellt werden. Als Eingabe soll ein Thema oder Stichworte eingegeben werden und mit KI soll dann die strukturierte Mindmap-Definition im PlantUML-Format erzeugt werden.
Diese Mindmap wird mit den typischen Tags @startmindmap und @endmindmap versehen. Die KI unterstützt dabei die kreative und sinnvolle Verzweigung von Ideen und Unterpunkten. In Java lässt sich dies mit einer Schnittstelle zur Perplexity API realisieren, die den Input sendet und die formatierte Antwort als Mindmap-String zurückgibt.
Anschließend kann der Bot in Anwendungen integriert werden, um automatisch Visualisierungen von komplexen Informationen zu erzeugen. Diese Visualisierungen helfen besonders bei der Planung, Wissensorganisation oder Brainstorming. Durch die Kombination von PlantUML und KI wird so eine mächtige, textbasierte Mindmap-Erstellung ermöglicht, die leicht versionierbar und automatisierbar ist. Die Nutzung von Java als Plattform erlaubt eine nahtlose Integration in viele Entwicklungsumgebungen und Workflows, insbesondere für Entwickler mit Java-Hintergrund. Dadurch kann der Prozess der Mindmap-Erstellung deutlich effizienter und dynamischer gestaltet werden.
Diese Lösung verbindet technische Eleganz mit innovativer KI-Unterstützung für kreative Diagrammerstellung mit Perplexity KI. Hier der Output, zu der Eingabe:
Was sind die Fakten in einfachen Worten zum 9. November zum Thema: Reichspogromnacht
Der Qutput:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
@startmindmap skinparam backgroundColor #E0F2FF skinparam defaultTextAlignment center * <size:36>Reichspogromnacht 9. November 1938</size> ** <size:24>Gewalttaten</size> *** Synagogen wurden angezündet *** Jüdische Geschäfte und Wohnungen zerstört *** Friedhöfe geschändet left side ** <size:24>Folgen</size> *** Viele Menschen getötet oder in den Suizid getrieben *** Über 30.000 Verhaftungen und Verschleppung in KZs *** Offener staatlicher Antisemitismus ** <size:24>Hintergrund & Bedeutung</size> *** Von Nationalsozialisten organisiert *** Polizei/Feuerwehr griffen nicht ein *** Übergang zu systematischer Verfolgung und Holocaust ** <size:24>Begriff</size> *** "Kristallnacht" wegen der Glasscherben *** Heute als Reichspogromnacht bezeichnet *** "Kristallnacht" gilt als verharmlosend @endmindmap |
Das Java-Programm dazu verwendet das com.squareup.okhttp3 Framework, bekannt als OkHttp, leistungsstarker und effizienter HTTP-Client für Java-Anwendungen. Er dient dazu, Netzwerk-Anfragen zu senden und zu empfangen und zeichnet sich durch seine Robustheit und moderne Feature-Unterstützung aus.OkHttp wurde entwickelt, um HTTP-Anfragen standardmäßig effizient durchzuführen. Es braucht dazu nur einen Eintrag in der pom.xml:
|
1 2 3 4 5 |
<dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.12.0</version> </dependency> |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
package de.wenzlaff.ki.model; import java.util.concurrent.TimeUnit; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; /** * Mindmap Bot für Perplexity KI. * * @author Thomas Wenzlaff */ public class MindmapPerplexityKiBot { /** * KI-Abfrage Chat. * * @param args erster Parameter ist der KI-Prompt. * @throws Exception bei Fehler */ public static void main(String[] args) throws Exception { String apiKey = System.getenv("PPLX_API_KEY"); if (apiKey == null) { throw new IllegalStateException("PPLX_API_KEY ist nicht in Environment gesetzt"); } if (args == null || args.length == 0 || args[0].isEmpty()) { System.err.println("Kein Prompt übergeben."); return; } String prompt = args[0]; // Evl. system role anpassen oder model sonar oder sonar-pro ... // oder auch den System Prompt String jsonInputPrompt = "{" + "\"model\": \"sonar-pro\", " + "\"messages\": [" + " {\"role\": \"system\", \"content\": \"" + "1. Du bist ein hilfreicher Assistent. " + "2. Antworte immer ohne Quellenangaben im Ergebnis. " + "3. Erzeuge dazu auch eine Mindmap im plantUml Format." + "4. Formatiere den Haupt Node in der Größe von 36pt z.B <size:36>THEMA des Nodes</size>." + "5. Verwende als Hintergrundfarbe ein helles blau" + "6. Alle Nodes der 1. Ebene mit Größe 24pt z.B. <size:24>NODE Thema</size>" + "7. Verteile die Nodes gleichmäßig auf die rechte und linke Seite, in dem das: left side ohne ** nur einmal in der Hälfte der Map eingefügt wird" + "8. Füge: skinparam defaultTextAlignment center in die Konfiguration ein." + "" + "\"}," + " {\"role\": \"user\", \"content\": \"" + prompt.replace("\"", "\\\"") + "\"}" + "], " + "\"temperature\": 0.8, " + "\"max_tokens\": 5000 " + "}"; Request request = new Request.Builder().url("https://api.perplexity.ai/chat/completions") .post(RequestBody.create(jsonInputPrompt, MediaType.get("application/json"))) .addHeader("Authorization", "Bearer " + apiKey).build(); OkHttpClient client = new OkHttpClient.Builder().connectTimeout(5, TimeUnit.MINUTES) .readTimeout(5, TimeUnit.MINUTES).writeTimeout(5, TimeUnit.MINUTES).build(); try (Response response = client.newCall(request).execute()) { if (!response.isSuccessful()) throw new RuntimeException("HTTP " + response.code()); Ausgabe.printResult(response); } } } |
Und noch eine Ausgabe Klasse:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
package de.wenzlaff.ki.model; import java.io.IOException; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import okhttp3.Response; /** * Ausgabe für Mindmap Bot für Perplexity KI. * * @author Thomas Wenzlaff */ public class Ausgabe { public static void printResult(Response response) throws IOException, JsonProcessingException, JsonMappingException { ObjectMapper mapper = new ObjectMapper(); String jsonRaw = response.body().string(); Object jsonObject = mapper.readValue(jsonRaw, Object.class); String pretty = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonObject); System.out.println(pretty); // JSON in JsonNode parsen JsonNode rootNode = mapper.readTree(jsonRaw); // Auf das Array 'choices' zugreifen JsonNode choicesNode = rootNode.get("choices"); if (choicesNode != null && choicesNode.isArray() && choicesNode.size() > 0) { // Das erste Element im Array wählen JsonNode firstChoice = choicesNode.get(0); // Das 'message'-Objekt JsonNode messageNode = firstChoice.get("message"); if (messageNode != null) { // Den Content-Wert extrahieren String content = messageNode.get("content").asText(); System.out.println(content); System.out.println("PlantUML Mindmap:"); System.out.println(getPlantUml(content)); } } } private static String getPlantUml(String input) { if (input == null) { return null; } String startTag = "@startmindmap"; String endTag = "@endmindmap"; int startIndex = input.indexOf(startTag); int endIndex = input.indexOf(endTag); if (startIndex == -1 || endIndex == -1 || endIndex < startIndex) { // Wenn eines der Tags fehlt oder endTag vor startTag liegt, gib null zurück return null; } // endIndex + Länge des endTags, um den endTag mit einzuschließen return input.substring(startIndex, endIndex + endTag.length()); } } |
In dem Beispiel verwende ich das sonar-pro Modell, so das eine Anfrage ca. 0,02 Dollar kostet. Das sonar Modell währe billiger, tut aber nicht alles so wie gewünscht. Und die anderen Modelle sind teurer, und können leicht angepasst werde. Dann mal noch ein Beispiel, mit diesem Eingabe Prompt:
„Was sind die Fakten in einfachen Worten zum Thema Salutogenese im Gegensatz zu Krankheit“
Es wird eine Mindmap, mit einen kleinen Fehler (zwei Sterne vor left side) erzeut, der leicht manuell gefixt werden kann:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
@startmindmap skinparam defaultTextAlignment center skinparam backgroundColor #E3F2FD * <size:36>Salutogenese</size> ** <size:24>Kernkonzept</size> *** Gesundheit als Kontinuum *** Nicht: gesund ODER krank *** Sondern: Spektrum zwischen Poles ** <size:24>Kohärenzgefühl</size> *** Verstehbarkeit *** Handhabbarkeit *** Bedeutsamkeit left side ** <size:24>Stressoren & Ressourcen</size> *** Stressoren aktiv bewältigen *** Generalisierte Widerstands-ressourcen *** Widerstandskraft aufbauen ** <size:24>Unterschied zu Pathogenese</size> *** Pathogenese: Wie entsteht Krankheit? *** Salutogenese: Wie entsteht Gesundheit? *** Ressourcenorientiert statt Risikofokus ** <size:24>Praktische Anwendung</size> *** Gesundheitsförderung *** Prävention *** Persönliche Widerstandskraft @endmindmap |
Hier die gerenderte Map:

Kosten und Token:
|
1 2 3 4 5 6 7 8 9 10 11 |
"usage" : { "prompt_tokens" : 203, "completion_tokens" : 895, "total_tokens" : 1098, "search_context_size" : "low", "cost" : { "input_tokens_cost" : 0.001, "output_tokens_cost" : 0.013, "request_cost" : 0.006, "total_cost" : 0.02 } |
Wer noch mehr Beispiele sehen will, schaut einfach bei Kleinhirn.eu vorbei oder auch der ganze Code.
