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ı 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 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 "" 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: # 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)