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 cevabını <cevap></cevap> tagleri arasında yaz. " | |
"Şimdi sorarak başla." | |
) | |
def start_game(): | |
""" | |
Oyunu başlatır; ilk soruyu getirir. | |
Soru çerçevesi görünür, final tahmin alanı boş, | |
cevap butonları (Evet, Hayır, Bilmiyorum) görünür, değerlendirme ve yeniden başlama 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) | |
return ( | |
assistant_message, # assistant_display: Soru çerçevesindeki metin | |
"", # final_answer_display: final tahmin alanı (şimdilik boş) | |
history, # state: konuşma geçmişi | |
answer_buttons_update, # btn_evet görünür | |
answer_buttons_update, # btn_hayir görünür | |
answer_buttons_update, # btn_bilmiyorum görünür | |
eval_buttons_update, # btn_dogru gizli | |
eval_buttons_update, # btn_yanlis gizli | |
"", # final_state: final tahmin metni (şimdilik boş) | |
restart_update # btn_restart gizli | |
) | |
def process_turn(user_answer, history): | |
""" | |
Kullanıcının verdiği cevabı API'ye gönderir. | |
Eğer API cevabında <cevap>...</cevap> varsa: | |
- Soru çerçevesi gizlenir. | |
- Final tahmini "Tahminim: ..." şeklinde büyük ve kalın yazıyla gösterilir. | |
- Cevap butonları gizlenir. | |
- Değerlendirme butonları (Doğru, Yanlış) görünür hale gelir. | |
""" | |
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ı: soru çerçevesini gizle, final tahmini göster, cevap butonlarını gizle, değerlendirme butonlarını göster. | |
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) | |
else: | |
assistant_update = assistant_message | |
final_text = "" | |
answer_update = gr.update(visible=True) | |
eval_update = gr.update(visible=False) | |
restart_update = gr.update(visible=False) | |
return ( | |
assistant_update, # assistant_display: Soru çerçevesi (veya gizli) | |
final_text, # final_answer_display: final tahmin metni (varsa) | |
history, # state: güncellenmiş konuşma geçmişi | |
answer_update, # btn_evet görünürlüğü | |
answer_update, # btn_hayir görünürlüğü | |
answer_update, # btn_bilmiyorum görünürlüğü | |
eval_update, # btn_dogru görünürlüğü | |
eval_update, # btn_yanlis görünürlüğü | |
final_answer, # final_state: final tahmin metni | |
) | |
# Cevap butonları için sarmalayıcı fonksiyonlar. | |
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. | |
- Yeniden başlama butonu görünür hale gelir. | |
""" | |
new_text = "**Tahminim doğru! Tekrar oynayalım mı?**" | |
return new_text, gr.update(visible=False), gr.update(visible=False), gr.update(visible=True) | |
def evaluate_incorrect(final_state): | |
""" | |
Eğer final tahmin yanlış ise: | |
- Final metin "Maalesef bulamadım" olarak güncellenir. | |
- Değerlendirme butonları gizlenir. | |
- Yeniden başlama butonu görünür hale gelir. | |
""" | |
new_text = "**Maalesef bulamadım**" | |
return new_text, gr.update(visible=False), gr.update(visible=False), gr.update(visible=True) | |
def restart_game(): | |
""" | |
"Tekrar Oyna" butonuna tıklandığında oyunu en baştan başlatır. | |
Soru çerçevesi yeniden görünür, cevap butonları aktif hale gelir, | |
final tahmin alanı temizlenir ve history sıfırlanır. | |
""" | |
return start_game() | |
# Özel CSS ile: | |
# - .question-box: Soru çerçevesine kenarlık ve ortalama | |
# - .final-answer: Final tahmini büyük, kalın ve ortalanmış gösterir. | |
# - .button-group: Butonları ortalar. | |
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") | |
# Üstteki soru çerçevesi: asistanın sorduğu soru burada görünecek. | |
assistant_display = gr.Markdown(label="Soru", elem_classes="question-box") | |
# Final tahmin alanı: final tahmin büyük, kalın şekilde burada gösterilecek. | |
final_answer_display = gr.Markdown("", label="Tahmin", elem_classes="final-answer") | |
# Soru aşamasında cevap için 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") | |
# Final tahminin değerlendirilmesi için 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) | |
# Yeniden başlatma butonu: "Tekrar Oyna" metni ile – başlangıçta gizli. | |
btn_restart = gr.Button("Tekrar Oyna", visible=False) | |
# Gizli state'ler: | |
state = gr.State([]) | |
final_state = gr.State("") | |
# Sayfa yüklendiğinde oyunu başlatır. | |
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] | |
) | |
# 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_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_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] | |
) | |
# Değerlendirme butonları: | |
btn_dogru.click( | |
fn=evaluate_correct, | |
inputs=[final_state], | |
outputs=[final_answer_display, btn_dogru, btn_yanlis, btn_restart] | |
) | |
btn_yanlis.click( | |
fn=evaluate_incorrect, | |
inputs=[final_state], | |
outputs=[final_answer_display, btn_dogru, btn_yanlis, btn_restart] | |
) | |
# Yeniden başlatma butonu: "Tekrar Oyna"ya tıklandığında tüm state sıfırlanır, | |
# soru çerçevesi görünür, cevap butonları tekrar ortaya çıkar. | |
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] | |
) | |
demo.launch(debug=True, show_error=True) | |