import gradio as gr from huggingface_hub import InferenceClient from sentence_transformers import SentenceTransformer import torch import numpy as np import requests #LLM we are using client = InferenceClient("HuggingFaceH4/zephyr-7b-beta") #adding text file with open("be_a_better_you.txt", "r", encoding="utf-8") as file1, open("journal_prompts.txt", "r", encoding="utf-8") as file2, open("workout.txt", "r", encoding="utf-8") as file3: wellness_text = file1.read() + "\n" + file2.read() +"\n" + file3.read() #cleaning up the text cleaned_text = wellness_text.strip() chunks = cleaned_text.split("\n") cleaned_chunks = [] #putting text in chunks for chunk in chunks: stripped_chunk = chunk.strip() if stripped_chunk: cleaned_chunks.append(stripped_chunk) #import model for embeddings model = SentenceTransformer('all-MiniLM-L6-v2') chunk_embeddings = model.encode(cleaned_chunks, convert_to_tensor=True) def get_top_chunks(query): # creating a function taking query as my parameter query_embedding = model.encode(query, convert_to_tensor=True) # encode query to vector embedding for comparison query_embedding_normalized = query_embedding / query_embedding.norm() # normalize query to 1: allows for comparison of meaning chunk_embeddings_normalized = chunk_embeddings / chunk_embeddings.norm(dim=1, keepdim=True) # normalizing chunks for comparison of meaning similarities = torch.matmul(chunk_embeddings_normalized, query_embedding_normalized) # using matmul (matrix multiplication) method to compare query to chunks top_indices = torch.topk(similarities, k=3).indices # get the indices of the chunks thart are most similar to my query top_chunks = [] for i in top_indices: chunk = cleaned_chunks[i] # for each index number in top_indices, get back the text top_chunks.append(chunk) return top_chunks def get_nutrition_info(food_query): url = "https://trackapi.nutritionix.com/v2/natural/nutrients" headers = { "x-app-id": "5e0843", "x-app-key": "00948483e0e3540ea8dc5297ad8216d9", "Content-Type": "application/json" } body = { "query": food_query } response = requests.post(url, headers=headers, json=body) if response.status_code == 200: data = response.json() return data else: return None def get_motivational_quote(): url = "https://zenquotes.io/api/random" response = requests.get(url) if response.status_code == 200: quote = response.json()['q'] + " -" + response.json()[0]['a'] return quote else: return "Keep going! You're doing great." def respond(message, history): messages = [{ "role": "system", "content": "You are a big sister chatbot named Nessie. You help people feel better in a simple manner. Always reply in 3 sentences or less. Do NOT stop mid-sentence, as you may confuse them even more. When the user is asking for ideas give 5 max, as you don't want to overwhelm them" }] # change the personality context = get_top_chunks(message) if history: messages.extend(history) messages.append({"role": "user", "content": message}) user_context = f"{message}\nInformation: {context}" messages.append({"role": "user", "content": user_context}) response = "" for messages in client.chat_completion( messages, max_tokens = 200, stream = True, ): token = messages.choices[0].delta.content response+= token yield response theme = gr.themes.Soft( primary_hue="rose", secondary_hue="zinc", neutral_hue="pink", ) with gr.Blocks(theme=theme) as demo: chatbot = gr.ChatInterface( fn=respond, type='messages', title="Hi! I'm Nessie, your personal wellness assistant. What can I assist you with today?", examples=[ "Can you help me with my dietary goals? I want to track my calories, macros, and get advice based on myself.", "Can you help me reach my fitness goals? I would like guidance and recommendations on workouts based on my goals.", "Can you give me some journal prompts? I want to start journaling to help myself reflect on my goals and have some daily affirmations. " ] ) #chatbot = gr.ChatInterface(respond, type = 'messages', title= "Hi! I'm Nessie, your personal wellness assistant. What can I assist you with today?",examples=["Can I help you with your dietary goals? I can help you track your calories, macros, and give advice based on personal goals, height, and weight.","Can I help you with your physical health and help you reach your fitness goals? I can give guidance and recommendations for specific workouts based on personal goals.","If you are struggling, I am here. You are so beautiful and so loved! I'm here for whatever you need. "]) demo.launch(debug=True)