Multimodal-PACA / utils.py
TVRRaviteja's picture
Create utils.py
388e865 verified
import openai # type: ignore
from openai import OpenAI
from dotenv import load_dotenv, find_dotenv # type: ignore
from huggingface_hub import InferenceClient # type: ignore
import pandas as pd # type: ignore
import os, time
load_dotenv(find_dotenv())
# Setup API keys
openai.api_key = os.getenv("OPENAI_API_KEY")
os.environ["HF_TOKEN"] = os.getenv("HF_TOKEN")
client = OpenAI()
# Define a few-shot prompt for personality prediction
few_shot_prompt = """
You are an expert in personality psychology. Based on the text provided, predict the personality scores for the Big Five personality traits: Openness, Conscientiousness, Extraversion, Agreeableness, and Neuroticism. Each score should be a floating-point number between 0 and 1.
Example 1:
Text: "I love exploring new ideas and trying new things."
Scores: Openness: 0.9, Conscientiousness: 0.4, Extraversion: 0.7, Agreeableness: 0.5, Neuroticism: 0.3
Example 2:
Text: "I prefer to plan everything in advance and stick to the plan."
Scores: Openness: 0.3, Conscientiousness: 0.8, Extraversion: 0.4, Agreeableness: 0.6, Neuroticism: 0.4
Now, predict the scores for the following text:
"""
def predict_personality(text):
# Prepare the prompt with the user's text
prompt = few_shot_prompt + f"Text: \"{text}\"\nScores:"
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": prompt}
]
# Call the OpenAI API to get the prediction
response = openai.chat.completions.create(
model="gpt-4",
messages=messages,
max_tokens=50,
temperature=0.5
)
# Extract the predicted scores from the response
scores_text = response.choices[0].message.content.strip()
scores = [float(score.split(":")[1].strip()) for score in scores_text.split(",")]
return scores
def create_line_plot(scores):
labels = ['Openness', 'Conscientiousness', 'Extraversion', 'Agreeableness', 'Neuroticism']
data = {'Personality': labels, 'Score': scores}
return pd.DataFrame(data)
# Gradio interface
def personality_app(text):
scores = predict_personality(text)
df = create_line_plot(scores)
return df
def transcribe_audio(audio_path):
with open(audio_path, "rb") as audio_file:
transcript = client.audio.transcriptions.create(model="whisper-1", file=audio_file)
return transcript.text
def openai_chat_completion(messages: list, selected_model: str) -> list[str]:
try:
response = openai.chat.completions.create(
# model='gpt-3.5-turbo',
model=selected_model,
messages=messages,
# temperature=0.5,
)
collected_messages = response.choices[0].message.content.strip().split('\n')
return collected_messages # return all the collected chunks of messages
except Exception as e:
return [str(e)]
def llama2_chat_completion(messages: list, hf_model_id: str, selected_model: str) -> list[str]:
try:
hf_token = os.getenv("HF_TOKEN")
client = InferenceClient(model=hf_model_id, token=hf_token)
# Start the chat completion process with streaming enabled
response_stream = client.chat_completion(messages, max_tokens=400, stream=True)
# Collect the generated message chunks
collected_messages = []
for completion in response_stream:
# Assuming the response structure is similar to OpenAI's
delta = completion['choices'][0]['delta']
if 'content' in delta.keys():
collected_messages.append(delta['content'])
# Return the collected messages
return collected_messages
except Exception as e:
return [str(e)]
def generate_messages(messages: list) -> list:
formatted_messages = [ # first format of messages for chat completion
{
'role': 'system',
'content': 'You are a helpful assistant.'
}
]
for m in messages: # Loop over the existing chat history and create user, assistant responses.
formatted_messages.append({
'role': 'user',
'content': m[0]
})
if m[1] != None:
formatted_messages.append({
'role': 'assistant',
'content': m[1]
})
return formatted_messages
def generate_audio_response(chat_history: list, selected_model: str) -> list: # type: ignore
messages = generate_messages(chat_history) # generates messages based on chat history
if selected_model == "gpt-4" or "gpt-3.5-turbo":
bot_message = openai_chat_completion(messages, selected_model) # Get all the collected chunks of messages for streaming
if selected_model == "Llama-3-8B":
hf_model_id = "meta-llama/Meta-Llama-3-8B"
bot_message = llama2_chat_completion(messages, hf_model_id, selected_model)
if selected_model == "Llama-2-7b-chat-Counsel-finetuned":
hf_model_id = "TVRRaviteja/Llama-2-7b-chat-Counsel-finetuned"
bot_message = llama2_chat_completion(messages, hf_model_id, selected_model)
else:
selected_model='gpt-3.5-turbo'
bot_message = openai_chat_completion(messages, selected_model)
chat_history[-1][1] = '' # [-1] -> last conversation, [1] -> current carebot message
for bm in bot_message: # Loop over the collected messages
chat_history[-1][1] += bm
time.sleep(0.05)
yield chat_history # For streamed carebot responses
def generate_text_response(chat_history: list, selected_model: str) -> list: # type: ignore
messages = generate_messages(chat_history) # generates messages based on chat history
if selected_model == "gpt-4" or "gpt-3.5-turbo":
bot_message = openai_chat_completion(messages, selected_model) # Get all the collected chunks of messages for streaming
if selected_model == "Llama-3-8B":
hf_model_id = "meta-llama/Meta-Llama-3-8B"
bot_message = llama2_chat_completion(messages, hf_model_id, selected_model)
if selected_model == "Llama-2-7b-chat-Counsel-finetuned":
hf_model_id = "TVRRaviteja/Llama-2-7b-chat-Counsel-finetuned"
bot_message = llama2_chat_completion(messages, hf_model_id, selected_model)
else:
selected_model='gpt-3.5-turbo'
bot_message = openai_chat_completion(messages, selected_model)
chat_history[-1][1] = '' # [-1] -> last conversation, [1] -> current carebot message
for bm in bot_message: # Loop over the collected messages
chat_history[-1][1] += bm
time.sleep(0.05)
yield chat_history # For streamed carebot responses
def set_user_response(user_message: str, chat_history: list) -> tuple:
chat_history += [[user_message, None]] #Append the recent user message into the chat history
return '', chat_history