from huggingface_hub import InferenceClient import gradio as gr import base64 import datetime Master1 = InferenceClient("mistralai/Mixtral-8x7B-Instruct-v0.1") Master2 = InferenceClient("mistralai/Mixtral-8x7B-Instruct-v0.1") dictionary = InferenceClient("tiiuae/falcon-7b-instruct") # Global variables for debate settings topic = None position = None turn = None history = [] # Global history to track the conversation # Function to start the single-player debate def start(txt, dd): global topic, position topic, position = txt, dd return f"Debate Master is ready to start the debate on '{topic}' as a '{position}' debater. You can now enter your response." # Dictionary definition/clarification feature def explain_word(message, history: list[tuple[str, str]],max_tokens=128, temperature=0.4, top_p=0.95): system_message = { "role": "system", "content": "You are a helpful assistant providing concise definitions and explanations for words or phrases." } messages = [system_message] # Adding conversation history for val in history: if val[0]: messages.append({"role": "user", "content": val[0]}) if val[1]: messages.append({"role": "assistant", "content": val[1]}) # Adding the current user input messages.append({"role": "user", "content": message}) response = "" for message_chunk in dictionary.chat_completion( messages, max_tokens=64, stream=True, temperature=0.3, top_p=0.9): response += message_chunk.choices[0].delta.content yield response print(f"{datetime.datetime.now()}::{messages[-1]['content']}->{response}\n") # Function for generating debate responses def generate_response(llm, position, who, topic, message): system_message = { "role": "system", "content": f"You are a debate participant tasked with defending the position '{position}' on the topic '{topic}'. Your goal is to articulate your arguments with clarity, logic, and professionalism while addressing counterpoints made by the opposing side. " f"Ensure that your responses are thoughtful, evidence-based, and persuasive. Strictly keep them concise—aim for responses that are 4 to 5 lines in a single paragraph. " f"During the debate, if the user presents arguments challenging your stance, analyze their points critically and provide respectful but firm counterarguments. " f"Stay consistent with your assigned position ('{position}') and maintain a respectful, formal tone throughout." } messages = [system_message] messages.append({"role": "user", "content": message}) response = f"{who}:\n" for message_chunk in llm.chat_completion( messages, max_tokens=128, stream=True, temperature=0.4, top_p=0.95): response += message_chunk.choices[0].delta.content return response # Function to start the Master vs Master debate def start_debate(topic, position_1, position_2): global turn, history if not topic or not position_1 or not position_2: return "Please provide the debate topic and positions for both participants.", [] # Ensure positions are opposite if position_1 == position_2: return "The positions of both participants must be opposite. Please adjust them.", [] turn = "Master-1" history = [] # Reset history initial_message = "Opening Statement" response = generate_response(Master1, position_1, 'Master-1', topic, initial_message) history.append((initial_message, response)) return f"The debate has started! {turn} begins.", history # Function for alternating turns in Master vs Master debate def next_turn(topic, position_1, position_2, current_history): global turn, history if not current_history: return "No ongoing debate. Please start a debate first.", [] # Alternate turn logic if turn == "Master-1": turn = "Master-2" llm, position, who = Master2, position_2, 'Master-2' else: turn = "Master-1" llm, position, who = Master1, position_1, "Master-1" last_response = current_history[-1][1] # Get the last message response = generate_response(llm, position, who, topic, last_response) history.append(("", response)) # Add the response to history return f"It's now {turn}'s turn.", history # Debate response function def debate_respond(message, history: list[tuple[str, str]], max_tokens=128, temperature=0.4, top_p=0.95): if position == None and topic == None: return f"Please fill the Debate Topic -> choose Debate Master stance -> click START" # System message defining assistant behavior in a debate system_message = { "role": "system", "content": f"You are a debate participant tasked with defending the position '{position}' on the topic '{topic}'. Your goal is to articulate your arguments with clarity, logic, and professionalism while addressing counterpoints made by the opposing side." f"Ensure that your responses are thoughtful, evidence-based, and persuasive, strictly keep them concise—aim for responses that are 4 to 5 lines in a single paragraph." f"During the debate, if the user presents arguments challenging your stance, analyze their points critically and provide respectful but firm counterarguments. Avoid dismissive language and focus on strengthening your case through logical reasoning, data, and examples relevant to the topic." f"Stay consistent with your assigned position ('{position}'), even if the opposing arguments are strong. Your role is not to concede but to present a compelling case for your stance. Keep the tone respectful and formal throughout the discussion, fostering a constructive and engaging debate environment." } messages = [system_message] # Adding conversation history for val in history: if val[0]: messages.append({"role": "user", "content": val[0]}) if val[1]: messages.append({"role": "assistant", "content": val[1]}) # Adding the current user input messages.append({"role": "user", "content": message}) # Generating the response response = "" for message in Master1.chat_completion( messages, max_tokens=max_tokens, stream=True, temperature=temperature, top_p=top_p, ): response += message.choices[0].delta.content yield response print(f"{datetime.datetime.now()}::{messages[-1]['content']}->{response}\n") # Enhanced dictionary explanation function def explain_word(message, history: list[tuple[str, str]], max_tokens=128, temperature=0.4, top_p=0.95): system_message = { "role": "system", "content": "You are a professional English teacher with expertise in vocabulary, grammar, and etymology. " "When asked about a word or phrase, provide a clear and concise definition, its part of speech, examples of its use in sentences, synonyms, and any relevant etymological details. " "If the word has multiple meanings, explain them with clarity. Your goal is to enhance understanding and provide a comprehensive explanation in a conversational tone." } messages = [system_message] # Adding conversation history for val in history: if val[0]: messages.append({"role": "user", "content": val[0]}) if val[1]: messages.append({"role": "assistant", "content": val[1]}) # Adding the current user input messages.append({"role": "user", "content": message}) response = "" for message_chunk in dictionary.chat_completion( messages, max_tokens=max_tokens, stream=True, temperature=temperature, top_p=top_p): response += message_chunk.choices[0].delta.content return response # Encode image function for logos (optional, kept for design) def encode_image(image_path): with open(image_path, "rb") as image_file: return base64.b64encode(image_file.read()).decode('utf-8') # Encode the images github_logo_encoded = encode_image("Images/github-logo.png") linkedin_logo_encoded = encode_image("Images/linkedin-logo.png") website_logo_encoded = encode_image("Images/ai-logo.png") footer = """

© 2024

This website is made with ❤ by SARATH CHANDRA

""" # Gradio interface with gr.Blocks(theme=gr.themes.Soft(font=[gr.themes.GoogleFont("Roboto Mono")]), css='footer {visibility: hidden}') as demo: gr.Markdown("# Welcome to The Debate Master 🗣️🤖") with gr.Tabs(): with gr.TabItem("Master Vs You"): with gr.Row(): with gr.Column(scale=1): topic = gr.Textbox(label="STEP-1: Debate Topic", placeholder="Enter the topic of the debate") position = gr.Radio(["For", "Against"], label="STEP-2: Debate Master stance", scale=1) btn = gr.Button("STEP-3: Start", variant='primary') clr = gr.ClearButton() output = gr.Textbox(label='Status') with gr.Column(scale=4): debate_interface = gr.ChatInterface(debate_respond, chatbot=gr.Chatbot(height=475, label="Debate Arena")) with gr.TabItem("Master Vs Master"): with gr.Row(): with gr.Column(scale=1): topic_input = gr.Textbox(label="STEP-1: Debate Topic", placeholder="Enter the topic of the debate") position_1_input = gr.Radio(["For", "Against"], label="STEP-2: Master-1 Stance") position_2_input = gr.Radio(["For", "Against"], label="STEP-3: Master-2 Stance") start_button = gr.Button("STEP-4: Start", variant='primary') next_button = gr.Button("Next Turn") status_output = gr.Textbox(label="Status", interactive=False) with gr.Column(scale=2): chatbot = gr.Chatbot(label="Debate Arena", height=500) with gr.Column(scale=1): dictionary_search_interface = gr.ChatInterface(explain_word, chatbot=gr.Chatbot(height=450, label="Define word")) gr.HTML(footer.format(github_logo_encoded, linkedin_logo_encoded, website_logo_encoded)) btn.click(fn=start, inputs=[topic, position], outputs=output) start_button.click( fn=start_debate, inputs=[topic_input, position_1_input, position_2_input], outputs=[status_output, chatbot], ) next_button.click( fn=next_turn, inputs=[topic_input, position_1_input, position_2_input, chatbot], outputs=[status_output, chatbot], ) clr.click(lambda: [None], outputs=[output]) if __name__ == "__main__": demo.launch(share=True)