suayptalha commited on
Commit
b003f52
·
verified ·
1 Parent(s): 9cb68a8

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +230 -0
app.py ADDED
@@ -0,0 +1,230 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ from gradio_client import Client
3
+
4
+ # Qwen API istemcisini başlatıyoruz.
5
+ client = Client("Qwen/Qwen2.5-72B-Instruct")
6
+
7
+ SYSTEM_PROMPT = (
8
+ "Sen bir asistansın ve deniz canlıları hakkında evet ya da hayır soruları soracaksın. "
9
+ "Amacın bu sorulardan kullanıcının aklında tuttuğu deniz canlısını bilmek. "
10
+ "Bu görevden asla uzaklaşmayacaksın. En son sadece cevabı bulduğunda cevabını <cevap></cevap> tagleri arasında yaz. "
11
+ "Şimdi sorarak başla."
12
+ )
13
+
14
+ def start_game():
15
+ """
16
+ Oyunu başlatır; ilk soruyu getirir.
17
+ Soru çerçevesi görünür, final tahmin alanı boş,
18
+ cevap butonları (Evet, Hayır, Bilmiyorum) görünür, değerlendirme ve yeniden başlama butonları gizlidir.
19
+ """
20
+ history = []
21
+ result = client.predict(
22
+ query="",
23
+ history=history,
24
+ system=SYSTEM_PROMPT,
25
+ api_name="/model_chat"
26
+ )
27
+ assistant_message = result[1][-1][1]
28
+ history.append(("", assistant_message))
29
+ answer_buttons_update = gr.update(visible=True)
30
+ eval_buttons_update = gr.update(visible=False)
31
+ restart_update = gr.update(visible=False)
32
+ return (
33
+ assistant_message, # assistant_display: Soru çerçevesindeki metin
34
+ "", # final_answer_display: final tahmin alanı (şimdilik boş)
35
+ history, # state: konuşma geçmişi
36
+ answer_buttons_update, # btn_evet görünür
37
+ answer_buttons_update, # btn_hayir görünür
38
+ answer_buttons_update, # btn_bilmiyorum görünür
39
+ eval_buttons_update, # btn_dogru gizli
40
+ eval_buttons_update, # btn_yanlis gizli
41
+ "", # final_state: final tahmin metni (şimdilik boş)
42
+ restart_update # btn_restart gizli
43
+ )
44
+
45
+ def process_turn(user_answer, history):
46
+ """
47
+ Kullanıcının verdiği cevabı API'ye gönderir.
48
+ Eğer API cevabında <cevap>...</cevap> varsa:
49
+ - Soru çerçevesi gizlenir.
50
+ - Final tahmini "Tahminim: ..." şeklinde büyük ve kalın yazıyla gösterilir.
51
+ - Cevap butonları gizlenir.
52
+ - Değerlendirme butonları (Doğru, Yanlış) görünür hale gelir.
53
+ """
54
+ result = client.predict(
55
+ query=user_answer,
56
+ history=history,
57
+ system=SYSTEM_PROMPT,
58
+ api_name="/model_chat"
59
+ )
60
+ assistant_message = result[1][-1][1]
61
+ history.append((user_answer, assistant_message))
62
+ final_answer = ""
63
+ if "<cevap>" in assistant_message and "</cevap>" in assistant_message:
64
+ start_idx = assistant_message.index("<cevap>") + len("<cevap>")
65
+ end_idx = assistant_message.index("</cevap>")
66
+ final_answer = assistant_message[start_idx:end_idx].strip()
67
+ if final_answer:
68
+ # Final tahmin yapıldı: soru çerçevesini gizle, final tahmini göster, cevap butonlarını gizle, değerlendirme butonlarını göster.
69
+ assistant_update = gr.update(visible=False)
70
+ final_text = f"**Tahminim:** **{final_answer}**"
71
+ answer_update = gr.update(visible=False)
72
+ eval_update = gr.update(visible=True)
73
+ restart_update = gr.update(visible=False)
74
+ else:
75
+ assistant_update = assistant_message
76
+ final_text = ""
77
+ answer_update = gr.update(visible=True)
78
+ eval_update = gr.update(visible=False)
79
+ restart_update = gr.update(visible=False)
80
+ return (
81
+ assistant_update, # assistant_display: Soru çerçevesi (veya gizli)
82
+ final_text, # final_answer_display: final tahmin metni (varsa)
83
+ history, # state: güncellenmiş konuşma geçmişi
84
+ answer_update, # btn_evet görünürlüğü
85
+ answer_update, # btn_hayir görünürlüğü
86
+ answer_update, # btn_bilmiyorum görünürlüğü
87
+ eval_update, # btn_dogru görünürlüğü
88
+ eval_update, # btn_yanlis görünürlüğü
89
+ final_answer, # final_state: final tahmin metni
90
+ )
91
+
92
+ # Cevap butonları için sarmalayıcı fonksiyonlar.
93
+ def process_evet(history):
94
+ return process_turn("Evet", history)
95
+
96
+ def process_hayir(history):
97
+ return process_turn("Hayır", history)
98
+
99
+ def process_bilmiyorum(history):
100
+ return process_turn("Bilmiyorum", history)
101
+
102
+ def evaluate_correct(final_state):
103
+ """
104
+ Eğer final tahmin doğru ise:
105
+ - Final metin "Tahminim doğru! Tekrar oynayalım mı?" olarak güncellenir.
106
+ - Değerlendirme butonları gizlenir.
107
+ - Yeniden başlama butonu görünür hale gelir.
108
+ """
109
+ new_text = "**Tahminim doğru! Tekrar oynayalım mı?**"
110
+ return new_text, gr.update(visible=False), gr.update(visible=False), gr.update(visible=True)
111
+
112
+ def evaluate_incorrect(final_state):
113
+ """
114
+ Eğer final tahmin yanlış ise:
115
+ - Final metin "Maalesef bulamadım" olarak güncellenir.
116
+ - Değerlendirme butonları gizlenir.
117
+ - Yeniden başlama butonu görünür hale gelir.
118
+ """
119
+ new_text = "**Maalesef bulamadım**"
120
+ return new_text, gr.update(visible=False), gr.update(visible=False), gr.update(visible=True)
121
+
122
+ def restart_game():
123
+ """
124
+ "Tekrar Oyna" butonuna tıklandığında oyunu en baştan başlatır.
125
+ Soru çerçevesi yeniden görünür, cevap butonları aktif hale gelir,
126
+ final tahmin alanı temizlenir ve history sıfırlanır.
127
+ """
128
+ return start_game()
129
+
130
+ # Özel CSS ile:
131
+ # - .question-box: Soru çerçevesine kenarlık ve ortalama
132
+ # - .final-answer: Final tahmini büyük, kalın ve ortalanmış gösterir.
133
+ # - .button-group: Butonları ortalar.
134
+ css = """
135
+ .question-box {
136
+ border: 2px solid #ccc;
137
+ padding: 10px;
138
+ border-radius: 5px;
139
+ margin: 10px auto;
140
+ width: 80%;
141
+ text-align: center;
142
+ }
143
+ .final-answer {
144
+ font-size: 2em;
145
+ font-weight: bold;
146
+ text-align: center;
147
+ margin: 20px;
148
+ }
149
+ .button-group {
150
+ display: flex;
151
+ justify-content: center;
152
+ gap: 20px;
153
+ }
154
+ """
155
+
156
+ with gr.Blocks(css=css) as demo:
157
+ gr.Markdown("### Deniz Canlıları Asistanı - Evet/Hayır Oyunu")
158
+
159
+ # Üstteki soru çerçevesi: asistanın sorduğu soru burada görünecek.
160
+ assistant_display = gr.Markdown(label="Soru", elem_classes="question-box")
161
+ # Final tahmin alanı: final tahmin büyük, kalın şekilde burada gösterilecek.
162
+ final_answer_display = gr.Markdown("", label="Tahmin", elem_classes="final-answer")
163
+
164
+ # Soru aşamasında cevap için butonlar (Evet, Hayır, Bilmiyorum)
165
+ with gr.Row(elem_classes="button-group"):
166
+ btn_evet = gr.Button("Evet")
167
+ btn_hayir = gr.Button("Hayır")
168
+ btn_bilmiyorum = gr.Button("Bilmiyorum")
169
+
170
+ # Final tahminin değerlendirilmesi için butonlar (Doğru, Yanlış) – başlangıçta gizli.
171
+ with gr.Row(elem_classes="button-group"):
172
+ btn_dogru = gr.Button("Doğru", visible=False)
173
+ btn_yanlis = gr.Button("Yanlış", visible=False)
174
+
175
+ # Yeniden başlatma butonu: "Tekrar Oyna" metni ile – başlangıçta gizli.
176
+ btn_restart = gr.Button("Tekrar Oyna", visible=False)
177
+
178
+ # Gizli state'ler:
179
+ state = gr.State([])
180
+ final_state = gr.State("")
181
+
182
+ # Sayfa yüklendiğinde oyunu başlatır.
183
+ demo.load(
184
+ fn=start_game,
185
+ outputs=[assistant_display, final_answer_display, state,
186
+ btn_evet, btn_hayir, btn_bilmiyorum, btn_dogru, btn_yanlis, final_state, btn_restart]
187
+ )
188
+
189
+ # Cevap butonlarına tıklanıldığında:
190
+ btn_evet.click(
191
+ fn=process_evet,
192
+ inputs=[state],
193
+ outputs=[assistant_display, final_answer_display, state,
194
+ btn_evet, btn_hayir, btn_bilmiyorum, btn_dogru, btn_yanlis, final_state]
195
+ )
196
+ btn_hayir.click(
197
+ fn=process_hayir,
198
+ inputs=[state],
199
+ outputs=[assistant_display, final_answer_display, state,
200
+ btn_evet, btn_hayir, btn_bilmiyorum, btn_dogru, btn_yanlis, final_state]
201
+ )
202
+ btn_bilmiyorum.click(
203
+ fn=process_bilmiyorum,
204
+ inputs=[state],
205
+ outputs=[assistant_display, final_answer_display, state,
206
+ btn_evet, btn_hayir, btn_bilmiyorum, btn_dogru, btn_yanlis, final_state]
207
+ )
208
+
209
+ # Değerlendirme butonları:
210
+ btn_dogru.click(
211
+ fn=evaluate_correct,
212
+ inputs=[final_state],
213
+ outputs=[final_answer_display, btn_dogru, btn_yanlis, btn_restart]
214
+ )
215
+ btn_yanlis.click(
216
+ fn=evaluate_incorrect,
217
+ inputs=[final_state],
218
+ outputs=[final_answer_display, btn_dogru, btn_yanlis, btn_restart]
219
+ )
220
+
221
+ # Yeniden başlatma butonu: "Tekrar Oyna"ya tıklandığında tüm state sıfırlanır,
222
+ # soru çerçevesi görünür, cevap butonları tekrar ortaya çıkar.
223
+ btn_restart.click(
224
+ fn=restart_game,
225
+ inputs=[],
226
+ outputs=[assistant_display, final_answer_display, state,
227
+ btn_evet, btn_hayir, btn_bilmiyorum, btn_dogru, btn_yanlis, final_state, btn_restart]
228
+ )
229
+
230
+ demo.launch(debug=True, show_error=True)