import gradio as gr # Define the theme with custom colors and styles, including larger text sizes theme = gr.themes.Default( primary_hue=gr.themes.Color( c100="#ffedd5", c200="#fed7aa", c300="#ffe09e", c400="#c2814c", c50="#fff8f0", c500="#f97316", c600="#ea580c", c700="#c2410c", c800="#9a3412", c900="#7c2d12", c950="#611f00" ), secondary_hue="red", neutral_hue="slate", font=[gr.themes.GoogleFont('jack armstrong'), 'ui-sans-serif', 'system-ui', 'sans-serif'], font_mono=[gr.themes.GoogleFont('xkcd'), 'ui-monospace', 'Consolas', 'monospace'], ).set( body_text_color='*primary_950', body_text_color_dark='*secondary_50', body_text_size='26px', # Increase body text size body_text_color_subdued='*primary_400', body_text_weight='500', background_fill_primary='*primary_300', background_fill_primary_dark='*primary_800', background_fill_secondary='*primary_50', background_fill_secondary_dark='*primary_600', border_color_accent='*secondary_950', border_color_accent_dark='*body_text_color', border_color_accent_subdued='*border_color_accent', link_text_color='*secondary_800', code_background_fill='*neutral_200', code_background_fill_dark='*neutral_100', block_shadow='none', block_shadow_dark='none', form_gap_width='0px', checkbox_label_background_fill='*button_secondary_background_fill', checkbox_label_background_fill_dark='*button_secondary_background_fill', checkbox_label_background_fill_hover='*button_secondary_background_fill_hover', checkbox_label_background_fill_hover_dark='*button_secondary_background_fill_hover', checkbox_label_shadow='none', error_background_fill_dark='*background_fill_primary', input_background_fill='*neutral_100', input_background_fill_dark='*neutral_700', input_border_width='0px', input_border_width_dark='0px', input_shadow='none', input_shadow_dark='none', input_shadow_focus='*input_shadow', input_shadow_focus_dark='*input_shadow', stat_background_fill='*primary_300', stat_background_fill_dark='*primary_500', button_shadow='none', button_shadow_active='none', button_shadow_hover='none', button_transition='background-color 0.2s ease', button_primary_background_fill='*primary_200', button_primary_background_fill_dark='*primary_700', button_primary_background_fill_hover='*button_primary_background_fill', button_primary_background_fill_hover_dark='*button_primary_background_fill', button_primary_border_color_dark='*primary_600', button_secondary_background_fill='*neutral_200', button_secondary_background_fill_dark='*neutral_600', button_secondary_background_fill_hover='*button_secondary_background_fill', button_secondary_background_fill_hover_dark='*button_secondary_background_fill', button_cancel_background_fill='*button_secondary_background_fill', button_cancel_background_fill_dark='*button_secondary_background_fill', button_cancel_background_fill_hover='*button_cancel_background_fill', button_cancel_background_fill_hover_dark='*button_cancel_background_fill', button_cancel_border_color='*button_secondary_border_color', button_cancel_border_color_dark='*button_secondary_border_color', button_cancel_text_color='*button_secondary_text_color', button_cancel_text_color_dark='*button_secondary_text_color' ) from sentence_transformers import SentenceTransformer, util import openai import os os.environ["TOKENIZERS_PARALLELISM"] = "false" filename = "output_chess_details.txt" retrieval_model_name = 'output/sentence-transformer-finetuned/' openai.api_key = os.environ["OPENAI_API_KEY"] try: retrieval_model = SentenceTransformer(retrieval_model_name) print("Models loaded successfully.") except Exception as e: print(f"Failed to load models: {e}") def load_and_preprocess_text(filename): try: with open(filename, 'r', encoding='utf-8') as file: segments = [line.strip() for line in file if line.strip()] print("Text loaded and preprocessed successfully.") return segments except Exception as e: print(f"Failed to load or preprocess text: {e}") return [] segments = load_and_preprocess_text(filename) def find_relevant_segment(user_query, segments): try: lower_query = user_query.lower() query_embedding = retrieval_model.encode(lower_query) segment_embeddings = retrieval_model.encode(segments) similarities = util.pytorch_cos_sim(query_embedding, segment_embeddings)[0] best_idx = similarities.argmax() return segments[best_idx] except Exception as e: print(f"Error in finding relevant segment: {e}") return "" def generate_response(user_query, relevant_segment): try: system_message = "You are a chatbot specialized in providing information on local events, pro-Palestine movements, and community outreach, pride movements/events and community resources." user_message = f"Here's the information on St. Louis local events, outreach programs, community resources and local activism and movements: {relevant_segment}" messages = [ {"role": "system", "content": system_message}, {"role": "user", "content": user_message} ] response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=messages, max_tokens=500, temperature=0.2, top_p=1, frequency_penalty=0, presence_penalty=0 ) return response['choices'][0]['message']['content'].strip() except Exception as e: print(f"Error in generating response: {e}") return f"Error in generating response: {e}" def query_model(question): if question == "": return "Welcome to GloBot! Ask me anything about the St. Louis Community!" relevant_segment = find_relevant_segment(question, segments) if not relevant_segment: return "Could not find specific information. Please refine your question." response = generate_response(question, relevant_segment) return response welcome_message = """ ## Your AI-driven assistant for STL community outreach queries. Created by Honna, Davonne, and Maryam of the 2024 Kode With Klossy St.Louis Camp! """ topics = """ ### Feel free to ask me anything from the topics below! - Pro-Palestine Events - Pride Events - Social Justice Workshops - Cultural Festivals - Community Outreach Programs - Environmental Activism - Health & Wellness Events - How to Support Local Businesses """ def display_image(): return "Globot_Logo3.jpg" # Setup the Gradio Blocks interface with custom layout components with gr.Blocks(theme=theme) as demo: gr.Image(display_image(), width=2000, height=600) gr.Markdown(welcome_message) with gr.Row(): with gr.Column(): gr.Markdown(topics) with gr.Row(): with gr.Column(): question = gr.Textbox(label="Your question", placeholder="What do you want to ask about?") answer = gr.Textbox(label="GloBot Response", placeholder="GloBot will respond here...", interactive=False, lines=10) submit_button = gr.Button("Submit") submit_button.click(fn=query_model, inputs=question, outputs=answer) # Launch the Gradio app to allow user interaction demo.launch(share=True)