Spaces:
Sleeping
Sleeping
File size: 6,910 Bytes
22d2df6 |
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 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 |
# -*- coding: utf-8 -*-
"""app.py
Automatically generated by Colab.
Original file is located at
https://colab.research.google.com/drive/1fuzwSkyjYRLfvGxQGclxwX0Y9OD2IK6s
"""
# app.py
# Step 1: Install necessary libraries
# This is handled by requirements.txt in Hugging Face Spaces,
# but you would run this line in a fresh environment:
# !pip install -q gradio transformers torch sentencepiece
# Step 2: Import libraries
import gradio as gr
import re
from transformers import pipeline
# --- Backend Logic ---
# Step 3: Load the Hugging Face Model
print("Loading Hugging Face model (google/flan-t5-small)... This may take a moment.")
text_generator = pipeline(
"text2text-generation",
model="google/flan-t5-small"
)
print("Model loaded successfully!")
def parse_chat_file(file_content):
"""
A robust parser for both WhatsApp and Telegram text exports.
"""
lines = file_content.split('\n')
chat_data = []
pattern = re.compile(
r'^(?:\u200e)?\[?(\d{1,2}[/.]\d{1,2}[/.]\d{2,4}),?\s+(\d{1,2}:\d{2}(?::\d{2})?(?:\s*[AP]M)?)\]?\s*-\s*([^:]+):\s*(.*)',
re.IGNORECASE
)
for line in lines:
match = pattern.match(line)
if match:
sender, message = match.group(3), match.group(4)
if "created this group" not in message and "added" not in message and "changed the subject" not in message:
chat_data.append(f"{sender}: {message}")
elif chat_data and line.strip():
chat_data[-1] += "\n" + line
return "\n".join(chat_data) if chat_data else "Could not parse chat file."
def process_chat_request(user_question, chat_history, state_data):
"""
The main function that handles the chat logic using the local Hugging Face model.
"""
context_size = state_data.get("context_size")
chat_content = state_data.get("chat_content")
temperature = state_data.get("temperature")
if not all([context_size, chat_content, temperature is not None]):
raise gr.Error("Chat content or configuration is missing. Please restart by uploading a file.")
if not user_question:
raise gr.Error("Please enter a question.")
context_to_use = chat_content[-int(context_size):]
prompt = f"""
Based on the following chat history, provide a detailed answer to the user's question.
CONTEXT:
---
{context_to_use}
---
QUESTION: {user_question}
ANSWER:
"""
try:
result = text_generator(
prompt,
max_length=300,
num_beams=3,
temperature=temperature
)
bot_response = result[0]['generated_text']
except Exception as e:
raise gr.Error(f"An error occurred with the model: {e}")
chat_history.append((user_question, bot_response))
return "", chat_history
# --- Gradio UI Definition ---
with gr.Blocks(theme=gr.themes.Soft(primary_hue="orange", secondary_hue="orange"), title="Local Chat Analyzer") as demo:
app_state = gr.State({})
with gr.Column(visible=True) as welcome_page:
gr.Markdown(
"""
<div style='text-align: center; font-family: "Garamond", serif; padding-top: 30px;'>
<h1 style='font-size: 3.5em;'>Local Chat Analyzer</h1>
<p style='font-size: 1.5em; color: #555;'>Powered by a Hugging Face Model. No API key needed!</p>
</div>
"""
)
gr.HTML(
"""
<div style='text-align: center; padding: 20px;'>
<img src='https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExd2Vjb3M2eGZzN2FkNWZpZzZ0bWl0c2JqZzZlMHVwZ2l4b2t0eXFpcyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/YWjDA4k2n6d5Ew42zC/giphy.gif'
style='max-width: 350px; margin: auto; border-radius: 20px; box-shadow: 0 8px 16px rgba(0,0,0,0.1);' />
</div>
"""
)
with gr.Row():
with gr.Column():
with gr.Accordion("How do I get my chat file?", open=False):
gr.Markdown("""
### Exporting your WhatsApp Chat
1. **On your phone**, open the WhatsApp chat you want to analyze.
2. Tap the **three dots** (â‹®) in the top-right corner.
3. Select **More** > **Export chat**.
4. Choose **Without media**. This will create a smaller `.txt` file.
5. Save the file to your phone or email it to yourself to access it on your computer.
6. For more details, visit the [official WhatsApp Help Center](https://faq.whatsapp.com/1180414079177245/).
""")
gr.Markdown("### 1. Upload Your Chat File")
chat_file_upload = gr.File(label="Upload WhatsApp/Telegram .txt Export")
with gr.Column():
gr.Markdown("### 2. Customize Parameters")
context_slider = gr.Slider(500, 20000, value=5000, step=500, label="Context Window Size (Characters)")
temp_slider = gr.Slider(0.1, 1.5, value=0.7, step=0.1, label="Temperature (Creativity)")
lets_chat_button = gr.Button("💬 Start Chatting 💬", variant="primary")
with gr.Column(visible=False) as chat_page:
gr.Markdown("<h1 style='text-align: center;'>Chat Analyzer</h1>")
chatbot_ui = gr.Chatbot(height=600, bubble_full_width=False)
with gr.Row():
user_input_box = gr.Textbox(placeholder="Ask a question about your chat...", scale=5)
submit_button = gr.Button("Send", variant="primary", scale=1)
def go_to_chat(current_state, chat_file, context_size, temperature):
if chat_file is None:
raise gr.Error("A chat file must be uploaded.")
with open(chat_file.name, 'r', encoding='utf-8') as f:
content = f.read()
parsed_content = parse_chat_file(content)
if "Could not parse" in parsed_content:
raise gr.Error("Failed to parse the chat file. Please check the format.")
new_state = {
"chat_content": parsed_content,
"context_size": context_size,
"temperature": temperature,
}
return (
new_state,
gr.Column(visible=False),
gr.Column(visible=True)
)
lets_chat_button.click(
fn=go_to_chat,
inputs=[app_state, chat_file_upload, context_slider, temp_slider],
outputs=[app_state, welcome_page, chat_page]
)
submit_button.click(
fn=process_chat_request,
inputs=[user_input_box, chatbot_ui, app_state],
outputs=[user_input_box, chatbot_ui]
)
user_input_box.submit(
fn=process_chat_request,
inputs=[user_input_box, chatbot_ui, app_state],
outputs=[user_input_box, chatbot_ui]
)
if __name__ == "__main__":
demo.launch() |