Spaces:
Sleeping
Sleeping
import gradio as gr | |
from gradio_client import Client | |
# Qwen API istemcisini başlatıyoruz. | |
client = Client("Qwen/Qwen2.5-72B-Instruct") | |
SYSTEM_PROMPT = ( | |
"Sen bir asistansın ve deniz canlıları hakkında evet ya da hayır soruları soracaksın. " | |
"Amacın bu sorulardan kullanıcının aklında tuttuğu deniz canlısını bilmek. " | |
"Bu görevden asla uzaklaşmayacaksın. En son sadece cevabı bulduğunda sadece cevabını <cevap></cevap> tagleri arasında yaz. " | |
"Şimdi sorarak başla. Eğer verdiğin cevap yanlışsa sormaya devam et. Kullanıcıdan cevabı asla isteme." | |
) | |
def start_game(): | |
""" | |
Oyunu başlatır; ilk soruyu getirir. | |
Soru çerçevesi görünür, final tahmin alanı temizlenir, | |
cevap butonları görünür, değerlendirme ve yeniden başlatma/ devam butonları gizlidir. | |
""" | |
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) | |
devamet_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_evet | |
answer_buttons_update, # btn_hayir | |
answer_buttons_update, # btn_bilmiyorum | |
eval_buttons_update, # btn_dogru | |
eval_buttons_update, # btn_yanlis | |
"", # final_state | |
restart_update, # btn_restart | |
devamet_update # btn_devamet | |
) | |
def process_turn(user_answer, history): | |
""" | |
Kullanıcının cevabını API'ye gönderir. | |
Eğer API cevabında <cevap> tagleri varsa final tahmin yapılmıştır. | |
- Bu durumda soru çerçevesi gizlenir, | |
- Final tahmin büyük ve kalın gösterilir, | |
- Cevap butonları gizlenir, | |
- Değerlendirme butonları görünür. | |
Eğer final tahmin yoksa, asistanın cevabı (soru) güncellenir. | |
""" | |
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 "<cevap>" in assistant_message and "</cevap>" in assistant_message: | |
start_idx = assistant_message.index("<cevap>") + len("<cevap>") | |
end_idx = assistant_message.index("</cevap>") | |
final_answer = assistant_message[start_idx:end_idx].strip() | |
if final_answer: | |
# Final tahmin yapıldı. | |
assistant_update = gr.update(visible=False) | |
final_text = f"**Tahminim:** **{final_answer}**" | |
answer_update = gr.update(visible=False) | |
eval_update = gr.update(visible=True) | |
restart_update = gr.update(visible=False) | |
devamet_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) | |
devamet_update = gr.update(visible=False) | |
return ( | |
assistant_update, # assistant_display | |
final_text, # final_answer_display | |
history, # state | |
answer_update, # btn_evet | |
answer_update, # btn_hayir | |
answer_update, # btn_bilmiyorum | |
eval_update, # btn_dogru | |
eval_update, # btn_yanlis | |
final_answer, # final_state | |
restart_update, # btn_restart | |
devamet_update # btn_devamet | |
) | |
def process_evet(history): | |
return process_turn("Evet", history) | |
def process_hayir(history): | |
return process_turn("Hayır", history) | |
def process_bilmiyorum(history): | |
return process_turn("Bilmiyorum", history) | |
def evaluate_correct(final_state): | |
""" | |
Eğer final tahmin doğru ise: | |
- Final metin "Tahminim doğru! Tekrar oynayalım mı?" olarak güncellenir. | |
- Değerlendirme butonları gizlenir. | |
- "Tekrar Oyna" butonu görünür hale gelir. | |
- "Devam Et" butonu gizli kalır. | |
""" | |
new_text = "**Tahminim doğru! Tekrar oynayalım mı?**" | |
return ( | |
new_text, | |
gr.update(visible=False), # btn_dogru gizle | |
gr.update(visible=False), # btn_yanlis gizle | |
gr.update(visible=True, value="Tekrar Oyna"), # btn_restart görünür | |
gr.update(visible=False) # btn_devamet gizli | |
) | |
def evaluate_incorrect(final_state): | |
""" | |
Eğer final tahmin yanlış ise: | |
- Final metin "Devam edelim, devam et butonuna basın." olarak güncellenir. | |
- Değerlendirme butonları gizlenir. | |
- "Devam Et" butonu görünür hale gelir. | |
""" | |
new_text = "**Devam edelim, devam et butonuna basın.**" | |
return ( | |
new_text, | |
gr.update(visible=False), # btn_dogru gizle | |
gr.update(visible=False), # btn_yanlis gizle | |
gr.update(visible=False), # btn_restart gizle | |
gr.update(visible=True, value="Devam Et") # btn_devamet görünür | |
) | |
def continue_game(history): | |
""" | |
"Devam Et" butonuna tıklandığında mevcut history ile asistan yeni bir soru sorar. | |
Konuşma geçmişi korunur, soru çerçevesi ve cevap butonları yeniden aktif hale gelir. | |
""" | |
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), # assistant_display | |
gr.update(visible=True, value=""), # final_answer_display | |
history, # state | |
gr.update(visible=True), # btn_evet | |
gr.update(visible=True), # btn_hayir | |
gr.update(visible=True), # btn_bilmiyorum | |
gr.update(visible=False), # btn_dogru | |
gr.update(visible=False), # btn_yanlis | |
"", # final_state | |
gr.update(visible=False), # btn_restart | |
gr.update(visible=False) # btn_devamet | |
) | |
def restart_game(): | |
""" | |
"Tekrar Oyna" butonuna tıklandığında oyunu en baştan başlatır (history sıfırlanır). | |
""" | |
global client | |
client = Client("Qwen/Qwen2.5-72B-Instruct") | |
return start_game() | |
# Özel CSS: | |
css = """ | |
.question-box { | |
border: 2px solid #ccc; | |
padding: 10px; | |
border-radius: 5px; | |
margin: 10px auto; | |
width: 80%; | |
text-align: center; | |
} | |
.final-answer { | |
font-size: 2em; | |
font-weight: bold; | |
text-align: center; | |
margin: 20px; | |
} | |
.button-group { | |
display: flex; | |
justify-content: center; | |
gap: 20px; | |
} | |
""" | |
with gr.Blocks(css=css) as demo: | |
gr.Markdown("### Deniz Canlıları Asistanı - Evet/Hayır Oyunu") | |
# Asistanın sorduğu soru. | |
assistant_display = gr.Markdown(label="Soru", elem_classes="question-box") | |
# Final tahmin alanı. | |
final_answer_display = gr.Markdown("", label="Tahmin", elem_classes="final-answer") | |
# Cevap butonları: Evet, Hayır, Bilmiyorum. | |
with gr.Row(elem_classes="button-group"): | |
btn_evet = gr.Button("Evet") | |
btn_hayir = gr.Button("Hayır") | |
btn_bilmiyorum = gr.Button("Bilmiyorum") | |
# Değerlendirme butonları: Doğru, Yanlış (başlangıçta gizli). | |
with gr.Row(elem_classes="button-group"): | |
btn_dogru = gr.Button("Doğru", visible=False) | |
btn_yanlis = gr.Button("Yanlış", visible=False) | |
# Final durumunda gösterilecek butonlar: | |
# - Doğru ise "Tekrar Oyna" | |
btn_restart = gr.Button("Tekrar Oyna", visible=False) | |
# - Yanlış ise "Devam Et" | |
btn_devamet = gr.Button("Devam Et", visible=False) | |
# Gizli state'ler: | |
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_evet, | |
btn_hayir, | |
btn_bilmiyorum, | |
btn_dogru, | |
btn_yanlis, | |
final_state, | |
btn_restart, | |
btn_devamet | |
] | |
) | |
# Cevap butonlarına tıklanıldığında: | |
btn_evet.click( | |
fn=process_evet, | |
inputs=[state], | |
outputs=[ | |
assistant_display, | |
final_answer_display, | |
state, | |
btn_evet, | |
btn_hayir, | |
btn_bilmiyorum, | |
btn_dogru, | |
btn_yanlis, | |
final_state, | |
btn_restart, | |
btn_devamet | |
] | |
) | |
btn_hayir.click( | |
fn=process_hayir, | |
inputs=[state], | |
outputs=[ | |
assistant_display, | |
final_answer_display, | |
state, | |
btn_evet, | |
btn_hayir, | |
btn_bilmiyorum, | |
btn_dogru, | |
btn_yanlis, | |
final_state, | |
btn_restart, | |
btn_devamet | |
] | |
) | |
btn_bilmiyorum.click( | |
fn=process_bilmiyorum, | |
inputs=[state], | |
outputs=[ | |
assistant_display, | |
final_answer_display, | |
state, | |
btn_evet, | |
btn_hayir, | |
btn_bilmiyorum, | |
btn_dogru, | |
btn_yanlis, | |
final_state, | |
btn_restart, | |
btn_devamet | |
] | |
) | |
# Değerlendirme butonları: | |
btn_dogru.click( | |
fn=evaluate_correct, | |
inputs=[final_state], | |
outputs=[ | |
final_answer_display, | |
btn_dogru, | |
btn_yanlis, | |
btn_restart, | |
btn_devamet | |
] | |
) | |
btn_yanlis.click( | |
fn=evaluate_incorrect, | |
inputs=[final_state], | |
outputs=[ | |
final_answer_display, | |
btn_dogru, | |
btn_yanlis, | |
btn_restart, | |
btn_devamet | |
] | |
) | |
# "Tekrar Oyna" butonuna tıklanıldığında: | |
btn_restart.click( | |
fn=restart_game, | |
inputs=[], | |
outputs=[ | |
assistant_display, | |
final_answer_display, | |
state, | |
btn_evet, | |
btn_hayir, | |
btn_bilmiyorum, | |
btn_dogru, | |
btn_yanlis, | |
final_state, | |
btn_restart, | |
btn_devamet | |
] | |
) | |
# "Devam Et" butonuna tıklanıldığında: | |
btn_devamet.click( | |
fn=continue_game, | |
inputs=[state], | |
outputs=[ | |
assistant_display, | |
final_answer_display, | |
state, | |
btn_evet, | |
btn_hayir, | |
btn_bilmiyorum, | |
btn_dogru, | |
btn_yanlis, | |
final_state, | |
btn_restart, | |
btn_devamet | |
] | |
) | |
demo.launch(debug=True, show_error=True) | |