# -*- 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( """

Local Chat Analyzer

Powered by a Hugging Face Model. No API key needed!

""" ) gr.HTML( """
""" ) 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("

Chat Analyzer

") 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()