suayptalha's picture
Create app.py
b003f52 verified
raw
history blame
8.96 kB
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)