# app.py import streamlit as st from transformers import pipeline from llama import load_llama_model, generate_llama_summary, PROMPT_TEMPLATE st.set_page_config(page_title="Email Summarizer", layout="wide") # Predefined examples with reference summaries EXAMPLES = { "Sample1": { "email": """ Sehr geehrte Damen und Herren, Leider wurden wir von einem Unwetter getroffen, weshalb unser Keller vollgelaufen ist. Deshalb hatten wir für 3 Wochen Trocknungsgeräte im Keller stehen. Anbei erhalten sie den Energieverbrauch/-nachweis der Geräte mit der Bitte, mir für diesen eine Zwischenrechnung zukommen zu lassen. Diese kann ich dann bei meiner Versicherung einreichen, welche die Kosten übernimmt. Mein Vertragskonto lautet 405604519. Aufgrund der Einfachheit halber, reicht mir die Rechnung per Email. Sollten sie noch Fragen haben, können sie sich jederzeit gerne bei mir melden. Mit freundlichen Grüßen Wladimir Klotz """, "reference": "Der Kunde bittet um eine Zwischenrechnung für den Energieverbrauch der Trocknungsgeräte zur Einreichung bei der Versicherung." }, "Sample2": { "email": """ Vertragsnummer: 403755518 Canan Schenk Verbraucherstelle: Hans-Henning-Wilmsen-Weg 958, 74815 Osterburg Zähler: 92739304 Sehr geehrte Damen und Herren, Ich kündige den Vertrag wegen dem Umzug zum 30.11.23 Um eine schriftliche Bestätigung wird gebeten. Neue Adresse: Dippelgasse 83 74815 Osterburg Viele Grüße Canan Schenk """, "reference": "Der Kunde kündigt den Vertrag wegen Umzug und erwartet eine schriftliche Bestätigung dazu." } } @st.cache_resource def load_all_models(): """Pre-load all models during app initialization""" with st.spinner("Loading models... This may take a few minutes"): models = { "mt5-small": pipeline( "summarization", model="ak2603/mt5-small-synthetic-data-plus-translated" ), "Llama 3.2": load_llama_model() } return models # Initialize models when app loads models = load_all_models() # Streamlit UI Configuration st.title("📧 Automated Email Summarization") # Sidebar Controls with st.sidebar: st.header("Configuration") model_choice = st.selectbox( "Select Model", ["mt5-small", "Llama 3.2"], index=0 ) st.markdown("---") st.markdown("**Model Information:**") st.info(f"Selected model: {model_choice}") st.info(f"Total loaded models: {len([m for m in models.values() if m is not None])}") # Main Content Area col1, col2 = st.columns([2, 1]) with col1: st.subheader("Input Email") # Example selection example_choice = st.selectbox( "Choose an example email:", ["Custom Email"] + list(EXAMPLES.keys()), index=0 ) # Set email text based on selection email_text = EXAMPLES[example_choice]["email"] if example_choice in EXAMPLES else "" email_input = st.text_area( "Paste your email here:", value=email_text, height=300, key="input_text", placeholder="Enter email content here..." ) with col2: st.subheader("Summary Generation") if st.button("Generate Summary", use_container_width=True): if not email_input: st.error("Please enter some email content first!") else: try: selected_model = models[model_choice] with st.spinner("Generating summary..."): if model_choice == "mt5-small": result = selected_model( email_input, max_length=150, do_sample=True, repetition_penalty=1.5 )[0]['summary_text'] elif model_choice == "Llama 3.2": model_obj, tokenizer = selected_model result = generate_llama_summary( email_input, model_obj, tokenizer, PROMPT_TEMPLATE ) # Display results st.success("**Generated Summary:**") st.write(result) # Show reference summary if example is selected if example_choice in EXAMPLES: st.success("**Reference Summary:**") st.write(EXAMPLES[example_choice]["reference"]) # Add export options st.download_button( label="Download Summary", data=result, file_name="email_summary.txt", mime="text/plain" ) except Exception as e: st.error(f"Error generating summary: {str(e)}") # Footer st.markdown("---") st.markdown("_Automated email summarization system v1.0_")