| import gradio as gr | |
| import requests | |
| import json | |
| import os | |
| import pandas as pd | |
| BASE_URL = "https://api.jigsawstack.com/v1" | |
| headers = { | |
| "x-api-key": os.getenv("JIGSAWSTACK_API_KEY") | |
| } | |
| def analyze_sentiment(text): | |
| if not text or not text.strip(): | |
| return "Error: Text input is required.", None, None, None, None | |
| try: | |
| response = requests.post( | |
| f"{BASE_URL}/ai/sentiment", | |
| headers=headers, | |
| json={"text": text.strip()} | |
| ) | |
| response.raise_for_status() | |
| result = response.json() | |
| if not result.get("success"): | |
| error_msg = f"Error: API call failed - {result.get('message', 'Unknown error')}" | |
| return error_msg, None, None, None, None | |
| sentiment_data = result.get("sentiment", {}) | |
| overall_emotion = sentiment_data.get("emotion", "N/A") | |
| overall_sentiment = sentiment_data.get("sentiment", "N/A") | |
| overall_score = sentiment_data.get("score", "N/A") | |
| sentences = sentiment_data.get("sentences", []) | |
| if sentences: | |
| sentence_df = pd.DataFrame(sentences) | |
| sentence_df = sentence_df[['text', 'emotion', 'sentiment', 'score']] | |
| sentence_df.rename(columns={'text': 'Sentence', 'emotion': 'Emotion', 'sentiment': 'Sentiment', 'score': 'Score'}, inplace=True) | |
| else: | |
| sentence_df = pd.DataFrame(columns=['Sentence', 'Emotion', 'Sentiment', 'Score']) | |
| status_message = "β Sentiment analysis complete." | |
| return status_message, overall_emotion, overall_sentiment, str(overall_score), sentence_df | |
| except requests.exceptions.RequestException as e: | |
| return f"Request failed: {str(e)}", None, None, None, None | |
| except Exception as e: | |
| return f"An unexpected error occurred: {str(e)}", None, None, None, None | |
| with gr.Blocks() as demo: | |
| gr.Markdown(""" | |
| <div style='text-align: center; margin-bottom: 24px;'> | |
| <h1 style='font-size:2.2em; margin-bottom: 0.2em;'>π§© Analyze Sentiment</h1> | |
| <p style='font-size:1.2em; margin-top: 0;'>Perform line-by-line sentiment analysis on any text with detailed emotion detection.</p> | |
| <p style='font-size:1em; margin-top: 0.5em;'>For more details and API usage, see the <a href='https://jigsawstack.com/docs/api-reference/ai/sentiment' target='_blank'>documentation</a>.</p> | |
| </div> | |
| """) | |
| with gr.Row(): | |
| with gr.Column(): | |
| gr.Markdown("#### Input Text") | |
| sentiment_text = gr.Textbox( | |
| label="Text to Analyze", | |
| lines=8, | |
| placeholder="Enter the text you want to analyze here..." | |
| ) | |
| sentiment_btn = gr.Button("Analyze Sentiment", variant="primary") | |
| with gr.Column(): | |
| gr.Markdown("#### Overall Analysis") | |
| sentiment_status = gr.Textbox(label="Status", interactive=False) | |
| sentiment_emotion = gr.Textbox(label="Overall Emotion", interactive=False) | |
| sentiment_sentiment = gr.Textbox(label="Overall Sentiment", interactive=False) | |
| sentiment_score = gr.Textbox(label="Overall Score", interactive=False) | |
| gr.Markdown("#### Sentence-Level Breakdown") | |
| sentiment_sentences_df = gr.DataFrame(label="Sentence Analysis") | |
| sentiment_btn.click( | |
| analyze_sentiment, | |
| inputs=[sentiment_text], | |
| outputs=[sentiment_status, sentiment_emotion, sentiment_sentiment, sentiment_score, sentiment_sentences_df] | |
| ) | |
| demo.launch() | |