import base64
import gradio as gr
from gradio_client import Client
# Start the Qwen API client.
client = Client("Qwen/Qwen2.5-72B-Instruct")
SYSTEM_PROMPT = (
"You are an assistant and you will ask yes or no questions about sea creatures. "
"Your goal is to guess the sea creature that the user has in mind from these questions. "
"You will never deviate from this task. Only when you find the answer, write it between tags. "
"Start asking now. If your answer is wrong, continue asking. Never ask the user for the answer."
)
def start_game():
history = []
result = client.predict(
query="",
history=history,
system=SYSTEM_PROMPT,
api_name="/model_chat"
)
assistant_message = result[1][-1][1]
history.append(("", assistant_message))
answer_buttons_update = gr.update(visible=True)
eval_buttons_update = gr.update(visible=False)
restart_update = gr.update(visible=False)
continue_update = gr.update(visible=False)
return (
gr.update(visible=True, value=assistant_message), # assistant_display
gr.update(visible=True, value=""), # final_answer_display
history, # state
answer_buttons_update, # btn_yes
answer_buttons_update, # btn_no
answer_buttons_update, # btn_dont_know
eval_buttons_update, # btn_correct
eval_buttons_update, # btn_incorrect
"", # final_state
restart_update, # btn_restart
continue_update # btn_continue
)
def process_turn(user_answer, history):
result = client.predict(
query=user_answer,
history=history,
system=SYSTEM_PROMPT,
api_name="/model_chat"
)
assistant_message = result[1][-1][1]
history.append((user_answer, assistant_message))
final_answer = ""
if "" in assistant_message and "" in assistant_message:
start_idx = assistant_message.index("") + len("")
end_idx = assistant_message.index("")
final_answer = assistant_message[start_idx:end_idx].strip()
if final_answer:
assistant_update = gr.update(visible=False)
final_text = f"**My guess:** **{final_answer}**"
answer_update = gr.update(visible=False)
eval_update = gr.update(visible=True)
restart_update = gr.update(visible=False)
continue_update = gr.update(visible=False)
else:
assistant_update = gr.update(visible=True, value=assistant_message)
final_text = ""
answer_update = gr.update(visible=True)
eval_update = gr.update(visible=False)
restart_update = gr.update(visible=False)
continue_update = gr.update(visible=False)
return (
assistant_update,
final_text,
history,
answer_update,
answer_update,
answer_update,
eval_update,
eval_update,
final_answer,
restart_update,
continue_update
)
def process_yes(history):
return process_turn("Yes", history)
def process_no(history):
return process_turn("No", history)
def process_dont_know(history):
return process_turn("I don't know", history)
def evaluate_correct(final_state):
new_text = "**My guess is correct! Shall we play again?**"
return (
new_text,
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=True, value="Play Again"),
gr.update(visible=False)
)
def evaluate_incorrect(final_state):
new_text = "**Let's continue, press the continue button.**"
return (
new_text,
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=True, value="Continue")
)
def continue_game(history):
result = client.predict(
query="",
history=history,
system=SYSTEM_PROMPT,
api_name="/model_chat"
)
assistant_message = result[1][-1][1]
history.append(("", assistant_message))
return (
gr.update(visible=True, value=assistant_message),
gr.update(visible=True, value=""),
history,
gr.update(visible=True),
gr.update(visible=True),
gr.update(visible=True),
gr.update(visible=False),
gr.update(visible=False),
"",
gr.update(visible=False),
gr.update(visible=False)
)
def restart_game():
global client
client = Client("Qwen/Qwen2.5-72B-Instruct")
return start_game()
css = """
body, .gradio-container {
font-family: 'Roboto', sans-serif;
background-color: #f0f2f5;
background-image: url('https://cdn.glitch.global/e803869d-6fae-4322-93f8-f15353a38bf3/pexels-jeremy-bishop-1260133-2397651.jpg?v=1740128669007') !important;
background-size: cover !important;
background-position: center !important;
background-repeat: no-repeat !important;
background-attachment: fixed !important;
color: #333; /* Varsayılan yazı rengi */
}
/* Tüm yazıların rengini siyah yapmak için */
* {
color: black !important; /* Butonlar dışındaki tüm yazıları siyah yapar */
}
/* Üstteki başlık için stil */
.header-text {
text-align: center;
margin-top: 20px;
font-size: 2em;
color: #4261a8;
}
/* Özel buton sınıfımız: my-button */
.my-button {
background-color: #4261a8 !important;
color: #fff !important;
border: none !important;
transition: transform 0.3s, background-color 0.3s !important;
}
.my-button:hover {
background-color: #1c4196 !important;
transform: scale(1.05);
}
/* Soru kutusu */
.question-box {
border: 2px solid #ccc;
padding: 10px;
border-radius: 5px;
margin: 10px auto;
width: 80%;
text-align: center;
background-color: rgba(173, 216, 230, 0);
}
/* Gradio Markdown’un varsayılan arka planını şeffaf yapmak */
.question-box .gr-prose {
background-color: transparent !important;
box-shadow: none !important;
border: none !important;
}
.final-answer {
font-size: 2em;
font-weight: bold;
text-align: center;
margin: 20px;
}
.button-group {
display: flex;
justify-content: center;
gap: 20px;
}
/* Gradio footer kısmını gizle */
footer, .footer, .gradio-footer {
display: none !important;
}
"""
# Light mode zorunluluğu için ek CSS
custom_css = """
:root {
color-scheme: light;
}
""" + css
# Yerel ikonu Base64'e çevirme
with open("tubitech-su.png", "rb") as image_file:
encoded_string = base64.b64encode(image_file.read()).decode("utf-8")
icon_data_uri = f"data:image/png;base64,{encoded_string}"
icon_html = f"""
"""
with gr.Blocks(css=custom_css, theme=gr.themes.Default()) as demo:
# Üstteki başlık
gr.Markdown("### TUBITECH # 9694 - Sea Creature Akinator", elem_classes="header-text")
# Arayüz elemanları
assistant_display = gr.Markdown(
value="",
label="",
show_label=False,
elem_classes="question-box"
)
final_answer_display = gr.Markdown(
value="",
label="",
show_label=False,
elem_classes="final-answer"
)
with gr.Row(elem_classes="button-group"):
btn_yes = gr.Button("Yes", elem_classes=["my-button"])
btn_no = gr.Button("No", elem_classes=["my-button"])
btn_dont_know = gr.Button("I don't know", elem_classes=["my-button"])
with gr.Row(elem_classes="button-group"):
btn_correct = gr.Button("Correct", visible=False, elem_classes=["my-button"])
btn_incorrect = gr.Button("Incorrect", visible=False, elem_classes=["my-button"])
btn_restart = gr.Button("Play Again", visible=False, elem_classes=["my-button"])
btn_continue = gr.Button("Continue", visible=False, elem_classes=["my-button"])
state = gr.State([])
final_state = gr.State("")
# Sayfa yüklendiğinde oyunu başlat
demo.load(
fn=start_game,
outputs=[
assistant_display,
final_answer_display,
state,
btn_yes,
btn_no,
btn_dont_know,
btn_correct,
btn_incorrect,
final_state,
btn_restart,
btn_continue
]
)
# Butonların click event'leri
btn_yes.click(
fn=process_yes,
inputs=[state],
outputs=[
assistant_display,
final_answer_display,
state,
btn_yes,
btn_no,
btn_dont_know,
btn_correct,
btn_incorrect,
final_state,
btn_restart,
btn_continue
]
)
btn_no.click(
fn=process_no,
inputs=[state],
outputs=[
assistant_display,
final_answer_display,
state,
btn_yes,
btn_no,
btn_dont_know,
btn_correct,
btn_incorrect,
final_state,
btn_restart,
btn_continue
]
)
btn_dont_know.click(
fn=process_dont_know,
inputs=[state],
outputs=[
assistant_display,
final_answer_display,
state,
btn_yes,
btn_no,
btn_dont_know,
btn_correct,
btn_incorrect,
final_state,
btn_restart,
btn_continue
]
)
btn_correct.click(
fn=evaluate_correct,
inputs=[final_state],
outputs=[
final_answer_display,
btn_correct,
btn_incorrect,
btn_restart,
btn_continue
]
)
btn_incorrect.click(
fn=evaluate_incorrect,
inputs=[final_state],
outputs=[
final_answer_display,
btn_correct,
btn_incorrect,
btn_restart,
btn_continue
]
)
btn_restart.click(
fn=restart_game,
inputs=[],
outputs=[
assistant_display,
final_answer_display,
state,
btn_yes,
btn_no,
btn_dont_know,
btn_correct,
btn_incorrect,
final_state,
btn_restart,
btn_continue
]
)
btn_continue.click(
fn=continue_game,
inputs=[state],
outputs=[
assistant_display,
final_answer_display,
state,
btn_yes,
btn_no,
btn_dont_know,
btn_correct,
btn_incorrect,
final_state,
btn_restart,
btn_continue
]
)
gr.HTML(icon_html)
demo.launch(debug=True, show_error=True)