import gradio as ui import numpy as np import json from structguard import StructGuard, StructGuardValidator, Schema # 1. Standard-Schema definieren default_schema = Schema({ "text": str, "kategorie": ["Dosierung", "Einheit", "Negation", "Semantik"], "quelle": str, }) def pipeline_demonstration(json_input, query_val, answer_val): try: # JSON-Output parsen output_dict = json.loads(json_input) except Exception as e: return "⚠️ Ungültiges JSON-Format im Eingabefeld!", "ABGELEHNT", 0.0 # Einfache Dummy-Embeddings aus den numerischen Schiebereglern simulieren q_emb = np.array([float(query_val), 0.0, 0.0]) a_emb = np.array([float(answer_val), 0.0, 0.0]) # StructGuard initialisieren sem_validator = StructGuardValidator() guard = StructGuard(schema=default_schema, semantic_validator=sem_validator) # Validierung ausführen verdict = guard.pruefen(answer=output_dict, query_emb=q_emb, answer_emb=a_emb) # Ergebnis für die Verknüpfung mit SENTRY-DVL aufbereiten sentry_status = "WARTET" if verdict.ist_freigegeben() else "BLOCKIERT (Early-Exit)" details_str = json.dumps(verdict.details, indent=2) fehler_str = ", ".join(verdict.fehler) if verdict.fehler else "Keine Fehler" report = f"--- 🛠️ PIPELINE REPORT ---\n" \ f"Phase 1 & 2 Fehler: {fehler_str}\n" \ f"Status für SENTRY-DVL: {sentry_status}\n\n" \ f"Audit-Trail Details:\n{details_str}" return report, verdict.status, verdict.score # Gradio Interface aufbauen with ui.Blocks(title="StructGuard v2.1 Demo") as demo: ui.Markdown("# 🛡️ StructGuard v2.1") ui.Markdown("### Structural & Semantic Validation Layer for LLM Outputs") ui.Markdown("Diese Demo simuliert die Eingangsschicht vor der Übergabe an SENTRY-DVL.") with ui.Row(): with ui.Column(): json_box = ui.Textbox( label="LLM Output (JSON)", value='{"text": "Metformin 500 mg", "kategorie": "Dosierung", "quelle": "Arzt"}', lines=5 ) q_slider = ui.Slider(0.0, 1.0, value=1.0, label="Query Vektor Komponente X") a_slider = ui.Slider(0.0, 1.0, value=0.95, label="Answer Vektor Komponente X") btn = ui.Button("Output validieren", variant="primary") with ui.Column(): status_box = ui.Textbox(label="Verdict Status") score_box = ui.Number(label="Kohärenz-Score") report_box = ui.Code(label="Pipeline Verbindung & Log", language="json") btn.click( fn=pipeline_demonstration, inputs=[json_box, q_slider, a_slider], outputs=[report_box, status_box, score_box] ) demo.launch()