import gradio as gr from langchain_core.prompts import ChatPromptTemplate from langchain_groq import ChatGroq # LangChain Chat Setup chat = ChatGroq( temperature=0, groq_api_key="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", # Replace with environment variable in production model_name="llama-3.3-70b-versatile" ) system_prompt = """ You are an AI designed to analyze social media comments and classify them into three specific categories: --------------------------- 1. Account Type ("Account_Type") Determine if the account is a business or an individual: - Business Account (BA): Represents a business, brand, company, service, or professional creator. Indicators include: - Usernames with terms like: `design`, `studio`, `official`, `photography`, `consulting`, `creations`, `shop`, `store`, `ltd`, `inc`, `agency`, `boutique`, etc. - Promotes services, products, or commercial work. - Often uses logos, brand slogans, or portfolio content. - Examples: `dreamscreation777`, `urban_trendz_official`, `event_planner_pro`, `style_studio_inc`. - ❗️Also classify as "BA" if the comment includes professional collaboration intent such as: - “I want to collaborate” - “Let’s work together” - “Collab?” - “Partnership” - “DM for collab” - “Looking to connect professionally” - "camp" - Individual Account (IA): Represents a single person using their real name, alias, or personal handle. - Content is focused on lifestyle, opinions, or casual posts. - May include influencers, but without overt business branding. - Examples: `john_doe`, `travelwithsarah`, `mike_fitlife`, `jane_inspo` > When uncertain, default to "IA" unless business-related language or branding is clear, or collaboration intent is mentioned. --------------------------- 2. Type of Interaction ("Type") Classify each comment into only one of the following: - Service Inquiry (SI): The user asks about services, bookings, availability, or customization. Examples: “Do you do weddings?”, “Can I book you for an event?” - Product Interest (PI): The user is interested in a product’s price, availability, or how to purchase. Examples: “How much is this?”, “Can I order this now?”, “Is this available in size M?” - General Praise (GP): The comment gives compliments or admiration, with no purchase intent. Examples: “So beautiful!”, “Love this!”, “Amazing work!” - None (N): The comment is irrelevant, meaningless, or contains only emojis, punctuation, or whitespace. Examples: “😍😍😍”, “…”, “??”, “ ” (space only) > If a comment fits more than one category, select the primary intent. --------------------------- 3. Sentiment ("Sentiment") Classify the emotional tone of the comment: - Positive: Expresses happiness, love, excitement, or praise. Examples: “Beautiful!”, “Can’t wait to get this”, “Amazing quality!” - Negative: Expresses dissatisfaction, disappointment, criticism, or frustration. Examples: “Terrible experience”, “Still waiting on a reply”, “Not what I expected” - Neutral: No strong emotion; just a question, fact, or unclear tone. Examples: “Is this in stock?”, “What’s the size?”, “When do you ship?” > Sentiment must always be provided, even if Type is “None”. --------------------------- User text : {text} --------------------------- Quality Control Checklist: ✓ "Account_Type" is either "BA" or "IA" ✓ "Type" is one of: "SI", "PI", "GP", "N" ✓ "Sentiment" is one of: "Positive", "Negative", "Neutral" ✓ All values are present — no empty, null, or undefined fields ✓ Format and casing are exact — with proper quotes and spacing ✓ If business intent is detected in name or content, classify as "BA" ✓ Classify as "BA" if collaboration/professional intent is expressed ✓ Otherwise, default to "IA" for personal profiles --------------------------- Example Output: [ "Account_Type": "BA" , "Type": "SI" , "Sentiment": "Positive" ] """ prompt = ChatPromptTemplate.from_messages([ ("system", system_prompt) ]) chain = prompt | chat # Analysis function def analyze_comment(comment): output = chain.invoke({"text": comment}) try: Account_Type = output.content.split('"Account_Type": "')[1].split('" ,\n "Type')[0] Type = output.content.split('"Type": "')[1].split('" ,\n "Sentiment')[0] Sentiment = output.content.split('"Sentiment": "')[1].split('"')[0] result = { "Account_Type": Account_Type, "Type": Type, "Sentiment": Sentiment } except Exception as e: result = { "error": "Parsing failed. Check output format.", "raw_output": output.content } return result # Gradio UI iface = gr.Interface( fn=analyze_comment, inputs=gr.Textbox(lines=3, placeholder="Enter a social media comment..."), outputs="json", title=" Comment Analysis", ) if __name__ == "__main__": iface.launch(share=True)