Debate_Master / app.py
Sarath0x8f's picture
Update app.py
1699fe3 verified
raw
history blame
10.9 kB
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
# Function for single participant responses (Master vs You)
def debate_respond(message, history: list[tuple[str, str]],
max_tokens=128, temperature=0.4, top_p=0.95):
if position is None or topic is None:
return f"Please fill the Debate Topic -> choose Debate Master stance -> click START"
# global topic, position
# 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_chunk in Master1.chat_completion(
messages,
max_tokens=max_tokens,
stream=True,
temperature=temperature,
top_p=top_p,
):
response += message_chunk.choices[0].delta.content
yield response
print(f"{datetime.datetime.now()}::{messages[-1]['content']}->{response}\n")
# 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")
def generate_response(llm, position, 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. 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]
messages.append({"role": "user", "content": message})
response = ""
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 the complete response as a string
return response
def start_debate(topic, position_1, position_2):
global turn
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"
initial_message = "Opening Statement"
response = generate_response(Master1, position_1, topic, initial_message)
return f"The debate has started! {turn} begins.", [(initial_message, response)]
# Continue debate
def next_turn(topic, position_1, position_2, current_turn):
global turn
if current_turn == "Master-1":
turn = "Master-2"
llm, position = Master2, position_2
else:
turn = "Master-1"
llm, position = Master1, position_1
response = generate_response(llm, position, topic, "Your turn to respond.")
return f"It's now {turn}'s turn.", [("", 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 = """
<div style="background-color: #1d2938; color: white; padding: 10px; width: 100%; bottom: 0; left: 0; display: flex; justify-content: space-between; align-items: center; padding: .2rem 35px; box-sizing: border-box; font-size: 16px;">
<div style="text-align: left;">
<p style="margin: 0;">&copy; 2024 </p>
</div>
<div style="text-align: center; flex-grow: 1;">
<p style="margin: 0;"> This website is made with ❤ by SARATH CHANDRA</p>
</div>
<div class="social-links" style="display: flex; gap: 20px; justify-content: flex-end; align-items: center;">
<a href="https://github.com/21bq1a4210" target="_blank" style="text-align: center;">
<img src="data:image/png;base64,{}" alt="GitHub" width="40" height="40" style="display: block; margin: 0 auto;">
<span style="font-size: 14px;">GitHub</span>
</a>
<a href="https://www.linkedin.com/in/sarath-chandra-bandreddi-07393b1aa/" target="_blank" style="text-align: center;">
<img src="data:image/png;base64,{}" alt="LinkedIn" width="40" height="40" style="display: block; margin: 0 auto;">
<span style="font-size: 14px;">LinkedIn</span>
</a>
<a href="https://21bq1a4210.github.io/MyPortfolio-/" target="_blank" style="text-align: center;">
<img src="data:image/png;base64,{}" alt="Portfolio" width="40" height="40" style="display: block; margin-right: 40px;">
<span style="font-size: 14px;">Portfolio</span>
</a>
</div>
</div>
"""
# 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)