| import gradio as gr |
| import os |
| import json |
| from google import genai |
| from google.genai import types |
| from gradio_client import Client |
|
|
| prompt = """ |
| |
| <role> |
| <name>System-Rolle</name> |
| <description>Erfahrener Journalist für Pressemitteilungen</description> |
| </role> |
| |
| <task> |
| <name>Hauptaufgabe</name> |
| <description>Generiere eine prägnante Pressemitteilung, die eine Veranstaltung oder ein Ereignis ankündigt. Verwende die Informationen in den runden Klammern.</description> |
| </task> |
| |
| <schema> |
| <name>Schema der Pressemitteilung</name> |
| <format>[Ortschaft - Veranstalter/Veranstaltung/Ereignis Text der Mitteilung]</format> |
| </schema> |
| |
| <headline> |
| <name>Überschrift-Formatierung</name> |
| <rules> |
| <rule>Erstelle eine zweiteilige Überschrift mit maximal 20 Zeichen pro Zeile</rule> |
| <rule>Die erste Zeile muss mindestens 2 Wörter enthalten</rule> |
| <rule>Keine Datumsangaben oder Ortsnamen in der Überschrift</rule> |
| <rule>Folge den Beispielen der Überschriften</rule> |
| </rules> |
| </headline> |
| |
| <formatting> |
| <name>Formatierungs-Anweisungen</name> |
| <rules> |
| <rule>Datum: Wochentag + Tag + Monat (z. B. "Montag, 7. April")</rule> |
| <rule>Uhrzeiten: "19 Uhr" oder "19.30 Uhr"</rule> |
| <rule>Telefonnummern: "Tel. 0971/2347655"</rule> |
| <rule>Text: Fortlaufend ohne Absätze</rule> |
| <rule>Beachte best practice Formulierungen</rule> |
| </rules> |
| </formatting> |
| |
| <calendar> |
| <name>Kalender 2025</name> |
| <entries> |
| <entry>1. Oktober ist ein Mittwoch</entry> |
| <entry>1. November ist ein Samstag</entry> |
| <entry>1. Dezember ist ein Montag</entry> |
| </entries> |
| </calendar> |
| |
| <style> |
| <name>Stilistische Anweisungen</name> |
| <rules> |
| <rule>Schreibe stets in der dritten Person</rule> |
| <rule>Übernimm den Sprachstil der Beispiele</rule> |
| <rule>Ersetze "lädt", "einladen", "Einladung" durch "veranstalten" oder "abhalten"</rule> |
| <rule>Beginne mit dem Veranstalter oder der Veranstaltung</rule> |
| <rule>Verwende "Vorstand" statt "Vorstandschaft"</rule> |
| <rule>Vermeide emotionale Adjektive</rule> |
| </rules> |
| </style> |
| |
| <agenda> |
| <name>Tagesordnungen</name> |
| <rules> |
| <rule>Maximal 2 Punkte nach Relevanz nennen</rule> |
| <rule>Höchste Relevanz: Neuwahlen und Ehrungen</rule> |
| <rule>Niedrigste Relevanz: Bauanträge</rule> |
| </rules> |
| </agenda> |
| |
| <phrasing> |
| <name>Best Practice Formulierungen</name> |
| <examples> |
| <example>Eine Sitzung abhalten</example> |
| <example>Eine Versammlung abhalten</example> |
| <example>Ein Fest oder ein Event veranstalten</example> |
| <example>[Veranstalter] bietet Vortrag an / Referent hält Vortrag</example> |
| <example>Gemeinderat trifft sich zur Sitzung</example> |
| <example>Verein hält Mitgliederversammlung ab</example> |
| <example>Neuwahl des Vorstandes</example> |
| </examples> |
| </phrasing> |
| |
| <examples> |
| <name>Beispiel-Überschriften</name> |
| <headlines> |
| <headline>Gemeinderat hält<br/>Sitzung ab</headline> |
| <headline>Jahresversammlung des<br/>Gartenbauvereins</headline> |
| <headline>Bürger melden<br/>sich zu Wort</headline> |
| <headline>Passions-Konzert mit<br/>klassischem Touch</headline> |
| <headline>Ostereiersuche<br/>mit dem Rhönklub</headline> |
| <headline>Fidelia hält<br/>Jahresversammlung ab</headline> |
| <headline>Selbsthilfegruppe<br/>tauscht sich aus</headline> |
| </headlines> |
| |
| <name>Beispiel-Pressemitteilungen</name> |
| <texts> |
| <text>Gartenbauverein hält Generalversammlung ab<br/>Thulba Die diesjährige Generalversammlung des Obst- und Gartenbauvereins Thulba findet am Freitag, 24. Februar, um 19.30 Uhr im Sportheim in Thulba statt. Auf der Tagesordnung stehen die üblichen Regularien.</text> |
| <text>Bürger melden sich zu Wort<br/>Untererthal Die Bürgerversammlung für Untererthal findet am Donnerstag, 9. März, um 19 Uhr im Landgasthof zum Golden Kreuz statt. Alle Bürgerinnen und Bürger aus dem genannten Ortsteil können teilnehmen.</text> |
| <text>Mitgliederversammlung mit Neuwahlen<br/>Ramsthal Der SV Ramsthal 1921 veranstaltet seine Mitgliederversammlung am Samstag, 15. März, im Sportheim. Die Versammlung beginnt um 18.30 Uhr. Auf der Tagesordnung stehen unter anderem Ehrungen und Neuwahlen. Anträge sind schriftlich bis spätestens Freitag, 14. März, per E-Mail an info@sv-ramsthal.de zu richten.</text> |
| </texts> |
| </examples> |
| |
| <reminder> |
| <name>Abschließende Erinnerung</name> |
| <note>Beginne die Mitteilung niemals mit dem Datum!</note> |
| </reminder> |
| |
| think step by step! |
| |
| ( |
| """ |
|
|
| def clean_json_string(json_str): |
| """ |
| Removes any comments or prefixes before the actual JSON content. |
| Returns the cleaned JSON string. |
| """ |
| |
| json_start = json_str.find('{') |
| if json_start == -1: |
| |
| json_start = json_str.find('[') |
| if json_start == -1: |
| return json_str |
| |
| |
| cleaned_str = json_str[json_start:] |
| return cleaned_str |
| |
| try: |
| json.loads(cleaned_str) |
| return cleaned_str |
| except json.JSONDecodeError: |
| return json_str |
|
|
| def groq(input): |
| client = Client("mgokg/GroqApi") |
| result = client.predict( |
| model="llama-3.2-11b-vision-preview", |
| input_text=f"{prompt}\n {input})", |
| api_name="/predict" |
| ) |
| return result, "" |
|
|
| def generate_pressrelease(input_text): |
| client = Client("Qwen/Qwen2.5-Max-Demo") |
| result = client.predict( |
| query=f"{prompt}\n {input_text})", |
| history=[], |
| system="You are a helpful assistant.", |
| api_name="/model_chat" |
| ) |
|
|
| return result |
| |
| def generate_press_release(input_text): |
| try: |
| client = genai.Client( |
| api_key=os.environ.get("geminiapikey"), |
| |
| ) |
| except Exception as e: |
| return f"Error initializing client: {e}. Make sure GEMINI_API_KEY is set." |
|
|
| |
| |
| model = "gemini-flash-latest" |
|
|
|
|
| contents = [ |
| types.Content( |
| role="user", |
| parts=[ |
| types.Part.from_text(text=f"{prompt}\n{input_text})"), |
| ], |
| ), |
| ] |
|
|
| generate_content_config = types.GenerateContentConfig( |
| temperature=0.25, |
| top_p=0.95, |
| top_k=64, |
| max_output_tokens=8192, |
| response_mime_type="text/plain", |
| ) |
|
|
| response_text = "" |
| try: |
| for chunk in client.models.generate_content_stream( |
| model=model, |
| contents=contents, |
| config=generate_content_config, |
| ): |
| response_text += chunk.text |
| except Exception as e: |
| return f"Error during generation: {e}" |
| data = clean_json_string(response_text) |
| data = data[:-1] |
| |
| |
| |
| return response_text, "a" |
|
|
| if __name__ == '__main__': |
|
|
| with gr.Blocks() as demo: |
| title=gr.Markdown("# Erstellen von Pressemitteilungen") |
| output_textbox = gr.Markdown() |
| input_textbox = gr.Textbox(lines=3, label="", placeholder="Enter event details here...") |
| submit_button = gr.Button("send") |
| submit_button.click(fn=generate_press_release,inputs=input_textbox,outputs=[output_textbox, input_textbox]) |
| demo.launch() |