suayptalha's picture
Update app.py
248eb14 verified
raw
history blame
11.9 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 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)