{"id":22965,"date":"2025-11-09T11:09:45","date_gmt":"2025-11-09T10:09:45","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=22965"},"modified":"2025-11-09T11:46:41","modified_gmt":"2025-11-09T10:46:41","slug":"mindmap-bot-fuer-plantuml-format-mit-perplexity-ki-in-java-zum-9-november","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=22965","title":{"rendered":"Mindmap KI-Bot f\u00fcr plantUML Format mit Perplexity KI in Java zum  9. November"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/11\/reichsprogromnacht.jpg\" alt=\"\" width=\"2117\" height=\"529\" class=\"aligncenter size-full wp-image-22966\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/11\/reichsprogromnacht.jpg 2117w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/11\/reichsprogromnacht-300x75.jpg 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/11\/reichsprogromnacht-1024x256.jpg 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/11\/reichsprogromnacht-768x192.jpg 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/11\/reichsprogromnacht-1536x384.jpg 1536w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/11\/reichsprogromnacht-2048x512.jpg 2048w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/p>\n<p>Heute wollen wir mal einen Mindmap-Bot f\u00fcr das PlantUML-Format mit <a href=\"https:\/\/docs.perplexity.ai\/getting-started\/overview\" target=\"_blank\">Perplexity KI<\/a> 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. <\/p>\n<p>Diese Mindmap wird mit den typischen Tags @startmindmap und @endmindmap versehen. Die KI unterst\u00fctzt dabei die kreative und sinnvolle Verzweigung von Ideen und Unterpunkten. In Java l\u00e4sst sich dies mit einer Schnittstelle zur Perplexity API realisieren, die den Input sendet und die formatierte Antwort als Mindmap-String zur\u00fcckgibt. <\/p>\n<p>Anschlie\u00dfend 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\u00e4chtige, textbasierte Mindmap-Erstellung erm\u00f6glicht, die leicht versionierbar und automatisierbar ist. Die Nutzung von Java als Plattform erlaubt eine nahtlose Integration in viele Entwicklungsumgebungen und Workflows, insbesondere f\u00fcr Entwickler mit Java-Hintergrund. Dadurch kann der Prozess der Mindmap-Erstellung deutlich effizienter und dynamischer gestaltet werden.<\/p>\n<p>Diese L\u00f6sung verbindet technische Eleganz mit innovativer KI-Unterst\u00fctzung f\u00fcr kreative Diagrammerstellung mit Perplexity KI. Hier der Output, zu der Eingabe:<\/p>\n<p><strong><br \/>\nWas sind die Fakten in einfachen Worten zum 9. November zum Thema: Reichspogromnacht<\/strong><\/p>\n<p>Der Qutput: <!--more--><\/p>\n<pre class=\"theme:dark-terminal nums:false nums-toggle:false lang:default decode:true \" >@startmindmap\r\nskinparam backgroundColor #E0F2FF\r\nskinparam defaultTextAlignment center\r\n\r\n* &lt;size:36&gt;Reichspogromnacht 9. November 1938&lt;\/size&gt;\r\n** &lt;size:24&gt;Gewalttaten&lt;\/size&gt;\r\n*** Synagogen wurden angez\u00fcndet\r\n*** J\u00fcdische Gesch\u00e4fte und Wohnungen zerst\u00f6rt\r\n*** Friedh\u00f6fe gesch\u00e4ndet\r\n\r\nleft side\r\n** &lt;size:24&gt;Folgen&lt;\/size&gt;\r\n*** Viele Menschen get\u00f6tet oder in den Suizid getrieben\r\n*** \u00dcber 30.000 Verhaftungen und Verschleppung in KZs\r\n*** Offener staatlicher Antisemitismus\r\n\r\n** &lt;size:24&gt;Hintergrund &amp; Bedeutung&lt;\/size&gt;\r\n*** Von Nationalsozialisten organisiert\r\n*** Polizei\/Feuerwehr griffen nicht ein\r\n*** \u00dcbergang zu systematischer Verfolgung und Holocaust\r\n\r\n** &lt;size:24&gt;Begriff&lt;\/size&gt;\r\n*** \"Kristallnacht\" wegen der Glasscherben\r\n*** Heute als Reichspogromnacht bezeichnet\r\n*** \"Kristallnacht\" gilt als verharmlosend\r\n@endmindmap<\/pre>\n<p>Das Java-Programm dazu verwendet das\u00a0com.squareup.okhttp3\u00a0Framework, bekannt als OkHttp, leistungsstarker und effizienter HTTP-Client f\u00fcr Java-Anwendungen. Er dient dazu, Netzwerk-Anfragen zu senden und zu empfangen und zeichnet sich durch seine Robustheit und moderne Feature-Unterst\u00fctzung aus.OkHttp wurde entwickelt, um HTTP-Anfragen standardm\u00e4\u00dfig effizient durchzuf\u00fchren. Es braucht dazu nur einen Eintrag in der pom.xml:<\/p>\n<pre class=\"nums:false nums-toggle:false minimize:true lang:xhtml decode:true \" >\r\n&lt;dependency&gt;\r\n\t        &lt;groupId&gt;com.squareup.okhttp3&lt;\/groupId&gt;\r\n\t        &lt;artifactId&gt;okhttp&lt;\/artifactId&gt;\r\n\t        &lt;version&gt;4.12.0&lt;\/version&gt;\r\n&lt;\/dependency&gt;<\/pre>\n<pre class=\"nums:false nums-toggle:false lang:java decode:true \" >package de.wenzlaff.ki.model;\r\n\r\nimport java.util.concurrent.TimeUnit;\r\n\r\nimport okhttp3.MediaType;\r\nimport okhttp3.OkHttpClient;\r\nimport okhttp3.Request;\r\nimport okhttp3.RequestBody;\r\nimport okhttp3.Response;\r\n\r\n\/**\r\n * Mindmap Bot f\u00fcr Perplexity KI.\r\n * \r\n * @author Thomas Wenzlaff\r\n *\/\r\npublic class MindmapPerplexityKiBot {\r\n\r\n    \/**\r\n     * KI-Abfrage Chat.\r\n     * \r\n     * @param args erster Parameter ist der KI-Prompt.\r\n     * @throws Exception bei Fehler\r\n     *\/\r\n    public static void main(String[] args) throws Exception {\r\n\r\n\tString apiKey = System.getenv(\"PPLX_API_KEY\");\r\n\tif (apiKey == null) {\r\n\t    throw new IllegalStateException(\"PPLX_API_KEY ist nicht in Environment gesetzt\");\r\n\t}\r\n\r\n\tif (args == null || args.length == 0 || args[0].isEmpty()) {\r\n\t    System.err.println(\"Kein Prompt \u00fcbergeben.\");\r\n\t    return;\r\n\t}\r\n\tString prompt = args[0];\r\n\r\n\t\/\/ Evl. system role anpassen oder model sonar oder sonar-pro ...\r\n\t\/\/ oder auch den System Prompt\r\n\tString jsonInputPrompt = \"{\" + \"\\\"model\\\": \\\"sonar-pro\\\", \" + \"\\\"messages\\\": [\"\r\n\t\t+ \"  {\\\"role\\\": \\\"system\\\", \\\"content\\\": \\\"\" + \"1. Du bist ein hilfreicher Assistent. \"\r\n\t\t+ \"2. Antworte immer ohne Quellenangaben im Ergebnis. \"\r\n\t\t+ \"3. Erzeuge dazu auch eine Mindmap im plantUml Format.\"\r\n\t\t+ \"4. Formatiere den Haupt Node in der Gr\u00f6\u00dfe von 36pt z.B &lt;size:36&gt;THEMA des Nodes&lt;\/size&gt;.\"\r\n\t\t+ \"5. Verwende als Hintergrundfarbe ein helles blau\"\r\n\t\t+ \"6. Alle Nodes der 1. Ebene mit Gr\u00f6\u00dfe 24pt z.B. &lt;size:24&gt;NODE Thema&lt;\/size&gt;\"\r\n\t\t+ \"7. Verteile die Nodes gleichm\u00e4\u00dfig auf die rechte und linke Seite, in dem das: left side ohne ** nur einmal in der H\u00e4lfte der Map eingef\u00fcgt wird\"\r\n\t\t+ \"8. F\u00fcge: skinparam defaultTextAlignment center in die Konfiguration ein.\" + \"\" + \"\\\"},\"\r\n\t\t+ \"  {\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"\" + prompt.replace(\"\\\"\", \"\\\\\\\"\") + \"\\\"}\" + \"], \"\r\n\t\t+ \"\\\"temperature\\\": 0.8, \" + \"\\\"max_tokens\\\": 5000 \" + \"}\";\r\n\r\n\tRequest request = new Request.Builder().url(\"https:\/\/api.perplexity.ai\/chat\/completions\")\r\n\t\t.post(RequestBody.create(jsonInputPrompt, MediaType.get(\"application\/json\")))\r\n\t\t.addHeader(\"Authorization\", \"Bearer \" + apiKey).build();\r\n\r\n\tOkHttpClient client = new OkHttpClient.Builder().connectTimeout(5, TimeUnit.MINUTES)\r\n\t\t.readTimeout(5, TimeUnit.MINUTES).writeTimeout(5, TimeUnit.MINUTES).build();\r\n\r\n\ttry (Response response = client.newCall(request).execute()) {\r\n\t    if (!response.isSuccessful())\r\n\t\tthrow new RuntimeException(\"HTTP \" + response.code());\r\n\r\n\t    Ausgabe.printResult(response);\r\n\t}\r\n    }\r\n}\r\n<\/pre>\n<p>Und noch eine Ausgabe Klasse:<\/p>\n<pre class=\"lang:java decode:true \" >package de.wenzlaff.ki.model;\r\n\r\nimport java.io.IOException;\r\n\r\nimport com.fasterxml.jackson.core.JsonProcessingException;\r\nimport com.fasterxml.jackson.databind.JsonMappingException;\r\nimport com.fasterxml.jackson.databind.JsonNode;\r\nimport com.fasterxml.jackson.databind.ObjectMapper;\r\n\r\nimport okhttp3.Response;\r\n\r\n\/**\r\n * Ausgabe f\u00fcr Mindmap Bot f\u00fcr Perplexity KI.\r\n * \r\n * @author Thomas Wenzlaff\r\n *\/\r\npublic class Ausgabe {\r\n\r\n    public static void printResult(Response response)\r\n\t    throws IOException, JsonProcessingException, JsonMappingException {\r\n\r\n\tObjectMapper mapper = new ObjectMapper();\r\n\r\n\tString jsonRaw = response.body().string();\r\n\tObject jsonObject = mapper.readValue(jsonRaw, Object.class);\r\n\tString pretty = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonObject);\r\n\tSystem.out.println(pretty);\r\n\r\n\t\/\/ JSON in JsonNode parsen\r\n\tJsonNode rootNode = mapper.readTree(jsonRaw);\r\n\r\n\t\/\/ Auf das Array 'choices' zugreifen\r\n\tJsonNode choicesNode = rootNode.get(\"choices\");\r\n\tif (choicesNode != null &amp;&amp; choicesNode.isArray() &amp;&amp; choicesNode.size() &gt; 0) {\r\n\t    \/\/ Das erste Element im Array w\u00e4hlen\r\n\t    JsonNode firstChoice = choicesNode.get(0);\r\n\t    \/\/ Das 'message'-Objekt\r\n\t    JsonNode messageNode = firstChoice.get(\"message\");\r\n\t    if (messageNode != null) {\r\n\t\t\/\/ Den Content-Wert extrahieren\r\n\t\tString content = messageNode.get(\"content\").asText();\r\n\t\tSystem.out.println(content);\r\n\t\tSystem.out.println(\"PlantUML Mindmap:\");\r\n\t\tSystem.out.println(getPlantUml(content));\r\n\t    }\r\n\t}\r\n    }\r\n\r\n    private static String getPlantUml(String input) {\r\n\tif (input == null) {\r\n\t    return null;\r\n\t}\r\n\tString startTag = \"@startmindmap\";\r\n\tString endTag = \"@endmindmap\";\r\n\r\n\tint startIndex = input.indexOf(startTag);\r\n\tint endIndex = input.indexOf(endTag);\r\n\r\n\tif (startIndex == -1 || endIndex == -1 || endIndex &lt; startIndex) {\r\n\t    \/\/ Wenn eines der Tags fehlt oder endTag vor startTag liegt, gib null zur\u00fcck\r\n\t    return null;\r\n\t}\r\n\r\n\t\/\/ endIndex + L\u00e4nge des endTags, um den endTag mit einzuschlie\u00dfen\r\n\treturn input.substring(startIndex, endIndex + endTag.length());\r\n    }\r\n}\r\n<\/pre>\n<p>In dem Beispiel verwende ich das sonar-pro Modell, so das eine Anfrage ca. 0,02 Dollar kostet. Das sonar Modell w\u00e4hre billiger, tut aber nicht alles so wie gew\u00fcnscht. Und die anderen Modelle sind teurer, und k\u00f6nnen leicht angepasst werde. Dann mal noch ein Beispiel, mit diesem Eingabe Prompt:<\/p>\n<p>&#8222;Was sind die Fakten in einfachen Worten zum Thema Salutogenese im Gegensatz zu Krankheit&#8220;<\/p>\n<p>Es wird eine Mindmap, mit einen kleinen Fehler (zwei Sterne vor left side) erzeut, der leicht manuell gefixt werden kann:<\/p>\n<pre class=\"lang:default decode:true \" >@startmindmap\r\nskinparam defaultTextAlignment center\r\nskinparam backgroundColor #E3F2FD\r\n* &lt;size:36&gt;Salutogenese&lt;\/size&gt;\r\n** &lt;size:24&gt;Kernkonzept&lt;\/size&gt;\r\n*** Gesundheit als Kontinuum\r\n*** Nicht: gesund ODER krank\r\n*** Sondern: Spektrum zwischen Poles\r\n** &lt;size:24&gt;Koh\u00e4renzgef\u00fchl&lt;\/size&gt;\r\n*** Verstehbarkeit\r\n*** Handhabbarkeit\r\n*** Bedeutsamkeit\r\nleft side\r\n** &lt;size:24&gt;Stressoren &amp; Ressourcen&lt;\/size&gt;\r\n*** Stressoren aktiv bew\u00e4ltigen\r\n*** Generalisierte Widerstands-ressourcen\r\n*** Widerstandskraft aufbauen\r\n** &lt;size:24&gt;Unterschied zu Pathogenese&lt;\/size&gt;\r\n*** Pathogenese: Wie entsteht Krankheit?\r\n*** Salutogenese: Wie entsteht Gesundheit?\r\n*** Ressourcenorientiert statt Risikofokus\r\n** &lt;size:24&gt;Praktische Anwendung&lt;\/size&gt;\r\n*** Gesundheitsf\u00f6rderung\r\n*** Pr\u00e4vention\r\n*** Pers\u00f6nliche Widerstandskraft\r\n@endmindmap<\/pre>\n<p>Hier die gerenderte Map:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/11\/gesundheit.jpg\" alt=\"\" width=\"1536\" height=\"529\" class=\"aligncenter size-full wp-image-22969\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/11\/gesundheit.jpg 1536w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/11\/gesundheit-300x103.jpg 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/11\/gesundheit-1024x353.jpg 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/11\/gesundheit-768x265.jpg 768w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/p>\n<p>Kosten und Token:<\/p>\n<pre class=\"lang:yaml decode:true \" >\"usage\" : {\r\n    \"prompt_tokens\" : 203,\r\n    \"completion_tokens\" : 895,\r\n    \"total_tokens\" : 1098,\r\n    \"search_context_size\" : \"low\",\r\n    \"cost\" : {\r\n      \"input_tokens_cost\" : 0.001,\r\n      \"output_tokens_cost\" : 0.013,\r\n      \"request_cost\" : 0.006,\r\n      \"total_cost\" : 0.02\r\n    }<\/pre>\n<p>Wer noch mehr Beispiele sehen will, schaut einfach bei <a href=\"http:\/\/kleinhirn.eu\/category\/mindmaps\/plantuml\/\" target=\"_blank\">Kleinhirn.eu<\/a> vorbei oder auch der ganze <a href=\"https:\/\/gitlab.com\/IT-Berater\/twmathe\/-\/tree\/main\/src\/main\/java\/de\/wenzlaff\/ki\/model?ref_type=heads\" target=\"_blank\">Code<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Heute wollen wir mal einen Mindmap-Bot f\u00fcr 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 &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/blog.wenzlaff.de\/?p=22965\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eMindmap KI-Bot f\u00fcr plantUML Format mit Perplexity KI in Java zum  9. November\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[220,5,3897,217,5348],"tags":[2178,6076,218,6077,5306],"class_list":["post-22965","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-java","category-java-programmierung","category-mind-map","category-openais-gpt-4","tag-java","tag-ki","tag-mindmap","tag-perplexity","tag-plantuml"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/22965","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=22965"}],"version-history":[{"count":0,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/22965\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=22965"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=22965"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=22965"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}