robertselvam's picture
Update app.py
0518baf verified
raw
history blame
9.03 kB
# from pydantic import NoneStr
import os
import mimetypes
# import validators
import requests
import tempfile
import gradio as gr
from openai import OpenAI
import re
import json
from transformers import pipeline
import matplotlib.pyplot as plt
import plotly.express as px
import pandas as pd
import json
import plotly.graph_objects as go
client = OpenAI()
class SentimentAnalyzer:
def __init__(self):
pass
def emotion_analysis(self,text):
# Create a conversation for the OpenAI chat API
conversation = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": f""" Your task is find the emotions for this converstion.
Conversation: {text}
lables : [Sadness, Happiness, Fear, Anger]
provide emotion score for each label for given conversation.
Return answer should be in valid JSON format only.
"""}
]
# Call OpenAI GPT-3.5-turbo
chat_completion = client.chat.completions.create(
model = "gpt-3.5-turbo",
messages = conversation,
max_tokens=500,
temperature=0
)
response = chat_completion.choices[0].message.content
print("emotion_analysis", response)
return response
def analyze_sentiment_for_graph(self, text):
# Create a conversation for the OpenAI chat API
conversation = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": f""" Your task is analyse the conversarion to provide the sentiment analysis.
```converstion: {text}```
```labels :[ positive, negative, neutral]```
provide sentiment score for each label for given conversation. Return answer should be in valid JSON format only.
"""}
]
# Call OpenAI GPT-3.5-turbo
chat_completion = client.chat.completions.create(
model = "gpt-3.5-turbo",
messages = conversation,
max_tokens=500,
temperature=0
)
response = chat_completion.choices[0].message.content
print("analyze_sentiment_for_graph", response)
return response
class Summarizer:
def __init__(self):
# openai.api_key=os.getenv("OPENAI_API_KEY")
pass
def generate_summary(self, text):
# Create a conversation for the OpenAI chat API
conversation = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": f"""summarize the following conversation delimited by triple backticks. write within 60 words.```{text}``` """}
]
# Call OpenAI GPT-3.5-turbo
chat_completion = client.chat.completions.create(
model = "gpt-3.5-turbo-1106",
messages = conversation,
max_tokens=500,
temperature=0
)
response = chat_completion.choices[0].message.content
return response
history_state = gr.State()
summarizer = Summarizer()
sentiment = SentimentAnalyzer()
class LangChain_Document_QA:
def __init__(self):
# openai.api_key=os.getenv("OPENAI_API_KEY")
pass
def _display_history(self):
formatted_history=self._chat_history()
# formatted_history = _suggested_answer()
summary=summarizer.generate_summary(formatted_history)
return summary
def _display_graph(self,json_string):
# Parse the JSON string into a dictionary
json_data = json.loads(json_string)
sentiments = list(json_data.keys())
scores = list(json_data.values())
fig = go.Figure(data=[go.Bar(x=sentiments, y=scores, marker_color=['green', 'red', 'blue'])])
fig.update_layout(
title='Sentiment Analysis Scores',
xaxis=dict(title='Sentiment'),
yaxis=dict(title='Score'),
)
return fig
def _display_graph_emotion(self,json_string):
# Parse the JSON string into a dictionary
json_data = json.loads(json_string)
sentiments = list(json_data.keys())
scores = list(json_data.values())
fig = go.Figure(data=[go.Bar(x=sentiments, y=scores, marker_color=['green', 'red', 'blue'])])
fig.update_layout(
title='Emotion Analysis Scores',
xaxis=dict(title='Emotions'),
yaxis=dict(title='Score'),
)
return fig
def _suggested_answer(self, text, chat_history):
try:
file_path = "patient_details.json"
with open(file_path) as file:
patient_details = json.load(file)
except:
pass
# Create a conversation for the OpenAI chat API
conversation = [
{"role": "system", "content": "You are a Mental Healthcare Chatbot."},
{"role": "user", "content": f"""You are a Mental Healthcare Chatbot.
Ask more about the patient's problem as step by step.
Then give the short mental healthcare solution for patient's problems.
```Chat History:{chat_history}```
Patient Query:{text}.
Mental Healthcare Chatbot:
"""}
]
# Call OpenAI GPT-3.5-turbo
chat_completion = client.chat.completions.create(
model = "gpt-3.5-turbo",
messages = conversation,
max_tokens=300,
temperature=0
)
response = chat_completion.choices[0].message.content
chat_history.append((text, response))
return "", chat_history
def _on_sentiment_btn_click(self, history):
# client=self._history_of_chat()
customer_emotion=sentiment.emotion_analysis(history)
customer_sentiment_score = sentiment.analyze_sentiment_for_graph(history)
sentiment_graph = self._display_graph(customer_sentiment_score)
emotion_graph = self._display_graph_emotion(customer_emotion)
return sentiment_graph, emotion_graph
def gradio_interface(self):
with gr.Blocks(css="style.css",theme='JohnSmith9982/small_and_pretty') as demo:
with gr.Row():
gr.HTML("""<center><img class="image" src="https://www.syrahealth.com/images/SyraHealth_Logo_Dark.svg" alt="Image" width="210" height="210"></center>
""")
with gr.Row():
gr.HTML("""<center><h1>AI Mental Healthcare ChatBot</h1></center>""")
with gr.Row():
with gr.Column(scale=1):
with gr.Row():
chatbot = gr.Chatbot()
with gr.Row():
with gr.Column(scale=0.90):
txt = gr.Textbox(show_label=False,placeholder="Patient")
with gr.Column(scale=0.10):
emptyBtn = gr.ClearButton([txt, chatbot])
# emptyBtn = gr.Button()
with gr.Accordion("Conversational AI Analytics", open = False):
with gr.Row():
with gr.Column(scale=1.0):
txt4 =gr.Textbox(
show_label=False,
lines=4,
placeholder="Summary")
with gr.Row():
with gr.Column(scale=0.50, min_width=0):
end_btn=gr.Button(value="End")
with gr.Column(scale=0.50, min_width=0):
Sentiment_btn=gr.Button(value="📊")
with gr.Row():
gr.HTML("""<center><h1>Sentiment and Emotion Score Graph</h1></center>""")
with gr.Row():
with gr.Column(scale=1, min_width=0):
plot =gr.Plot(label="Patient")
with gr.Row():
with gr.Column(scale=1, min_width=0):
plot_3 =gr.Plot(label="Patient_Emotion")
# txt_msg = txt.submit(self._add_text, [chatbot, txt], [chatbot, txt]).then(
# self._suggested_answer, [chatbot,txt],chatbot)
# txt_msg.then(lambda: gr.update(interactive=True), None, [txt])
# txt.submit(self._suggested_answer, [chatbot,txt],chatbot)
# button.click(self._agent_text, [chatbot,txt3], chatbot)
txt.submit(self._suggested_answer, [txt,chatbot],[txt,chatbot])
print("chatbot", chatbot)
end_btn.click(summarizer.generate_summary,chatbot, txt4)
# emptyBtn.click(self.clear_func,[],[])
# emptyBtn.click(lambda: None, None, chatbot, queue=False)
Sentiment_btn.click(self._on_sentiment_btn_click,chatbot,[plot,plot_3])
demo.title = "AI Mental Healthcare ChatBot"
demo.launch(debug = True)
document_qa =LangChain_Document_QA()
document_qa.gradio_interface()