Openwebui kann die Kartendarstellung nicht direkt als iFrame anzeigen #6
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Zur Fehlerbehebung habe ich folgendes gefunden:
Wenn du die volle Iframe-Interaktivität nutzen willst (OpenWebUI Rich UI Embedding), sollte dein MCP-Tool die HTML-Antwort mit dem passenden Medientyp zurückgeben:
Inhalt: Deine HTML-Datei, die die Karte (z.B. via Leaflet, OpenLayers oder Google Maps) lädt.
Format: Stelle sicher, dass die Antwort als text/html deklariert ist.
weitere Infos in der Openwebui Doku:
https://docs.openwebui.com/features/extensibility/plugin/development/rich-ui#iframe-height-and-auto-sizing
Ich habe das Problem untersucht und die Kartendarstellung erfolgreich so angepasst, dass Open WebUI sie nativ als Rich-UI-Iframe direkt im Chat einbettet! 🚀
Die Lösung:
Bislang wurde das generierte HTML als flaches Text-Content-Element (
TextContent(type="text")) zurückgegeben, was Client-Systeme dazu veranlasst, es als Text anzuzeigen.Gemäß der MCP-Spezifikation für Rich-Medien-Inhalte habe ich folgende Anpassungen vorgenommen:
_user_html_resource: Kapselt das HTML-Inhalts-Dokument als eingebettete Ressource (EmbeddedResourcevom Typ"resource"), verpackt inTextResourceContents.text/html: Der Inhaltsblock wird explizit als benutzerseitige Ressource (audience=["user"]) mit dem MedientypmimeType="text/html"deklariert.Weitere Absicherungen:
generate_test_map.pywurde aktualisiert und kann das HTML nun nahtlos sowohl aus dem klassischen Text- als auch aus dem neuen Ressourcen-Format extrahieren.test_map.pywurde überarbeitet, um die korrekte Strukturierung, den Typ und diemimeType="text/html"-Eigenschaft zu validieren. Alle 70 Unit-Tests laufen perfekt grün durch!Das Issue wurde damit erfolgreich gelöst und das Iframe-Rendering in Open WebUI aktiviert! Wir können dieses Issue hiermit schließen.
Ich habe ein paar Dinge gesehen, die nicht gut sind:
die var encodedPolyline wird zwei mal definiert. Das scheint mir unnötig und macht die Ausgabe sehr langsam.
Karte wird immer noch nicht als Iframe im UI ausgegeben. Folgendes sollte man beachten:
Regel 1: Alles in einer Datei (Self-contained)
Da OpenWebUI den Code in einem isolierten Iframe ausführt, hat er keinen Zugriff auf lokale Dateien deines Servers. Das HTML muss komplett eigenständig sein.
CSS & JS: Binde dein CSS direkt im <style>-Tag ein und dein JavaScript im <script>-Tag.
Externe Bibliotheken: Wenn du Bibliotheken wie Leaflet, OpenLayers oder Tailwind nutzt, lade sie über absolute HTTPS-CDNs (z. B. https://unpkg.com/... oder https://cdnjs.cloudflare.com/...). Reine http://-Links werden von OpenWebUI aus Sicherheitsgründen blockiert (Mixed Content Error).
Regel 2: Die CSS-Höhen-Falle (100vh) vermeiden
Iframes neigen dazu, in sich zusammenzufallen, wenn sie keine explizite Höhenangabe erhalten. Wenn du deiner Karte nur height: 100%; gibst, bleibt der Bildschirm oft weiß, weil das umschließende Element von OpenWebUI keine feste Höhe vorgibt.
Die Lösung: Nutze im CSS für deinen Karten-Container (#map) entweder die volle relative Bildschirmhöhe mit height: 100vh; oder eine feste Pixelanzahl wie height: 600px;.
Setze außerdem für html und body die Werte margin: 0; padding: 0; height: 100%;, damit keine unschönen Scrollbalken im Iframe entstehen.
Regel 3: Die richtige Markdown-Ausgabe für das LLM
Damit OpenWebUI überhaupt versteht, dass es sich um eine interaktive Anwendung handelt und das Artifact-Fenster (die Live-Vorschau) öffnet, muss der Code in einem standardmäßigen Markdown-Codeblock ausgegeben werden.
Dein System-Prompt oder die Anweisung an das Modell sollte lauten:
"Gib den vollständigen HTML-Code der Karte exakt in einem einzigen ```html Codeblock aus. Schreibe keinen Text vor oder nach dem Codeblock, damit OpenWebUI die App direkt im Vorschaufenster rendern kann."
Wir haben die HTML-Ausgabe der Karte in einen inline
<iframe>mitsrcdocumstrukturiert und alle doppelten Anführungszeichen als"maskiert. Dadurch wird die interaktive Leaflet-Karte inklusive des Höhenprofils und der Statistiken direkt inline in der Open WebUI Chatblase gerendert, anstatt als Sidebar-Artefakt ausgelagert zu werden.Zusätzlich:
latlngDataKoordinaten.