File size: 5,143 Bytes
776f33e
3f9f45e
 
f8d688e
3f9f45e
f1b7b9d
 
776f33e
 
 
c58c29b
 
 
 
 
 
 
 
 
 
 
 
776f33e
c58c29b
776f33e
 
 
c58c29b
 
 
 
776f33e
c58c29b
 
 
 
 
 
 
 
776f33e
c58c29b
776f33e
 
 
3f9f45e
f8d688e
 
 
 
 
 
 
 
e2011c3
f8d688e
 
3f9f45e
f8d688e
 
3f9f45e
f8d688e
 
3f9f45e
f8d688e
3f9f45e
f8d688e
 
 
e2011c3
f8d688e
 
 
 
 
 
 
3f9f45e
f8d688e
 
3f9f45e
 
f8d688e
776f33e
 
 
 
 
 
 
 
 
 
 
f8d688e
 
776f33e
f8d688e
 
 
 
3f9f45e
 
f8d688e
 
 
 
3f9f45e
f8d688e
 
7aab5de
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f8d688e
7aab5de
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f8d688e
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# 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_")