EmincanY commited on
Commit
b2fb0e2
·
1 Parent(s): 0000221

App updated according to HuggingFace space.

Browse files
Files changed (2) hide show
  1. app.py +105 -132
  2. requirements.txt +1 -1
app.py CHANGED
@@ -4,19 +4,18 @@ import time
4
  import datetime
5
  import tempfile
6
  import gradio as gr
7
- from dotenv import load_dotenv
8
  from openai import OpenAI
9
 
10
- # 1) .env'den API anahtarını çekelim
11
  # load_dotenv()
 
12
  api_key = os.getenv("OPENAI_API_KEY")
13
  if not api_key:
14
- raise ValueError("API Key bulunamadı! Lütfen .env dosyasında OPENAI_API_KEY'i tanımlayın.")
15
 
16
- # 2) OpenAI istemcisi
17
  client = OpenAI(api_key=api_key)
18
 
19
- # 3) Sistem Rolü (prompt)
20
  SYSTEM_PROMPT = (
21
  "Sen bir tıp asistanısın. Amacın şudur: "
22
  "Kullanıcıya olası yaygın hastalıkları sormak ve olasılıkları eleyerek "
@@ -35,22 +34,16 @@ SYSTEM_PROMPT = (
35
  "Bu konuşma sadece bilgi amaçlıdır."
36
  )
37
 
38
- # Kullanıcı/Hasta adı (sade bir örnek)
39
- NAME = "Ali"
40
 
41
  def create_initial_conversation():
42
- """
43
- Sohbetin başlangıcında system prompt + asistanın ilk mesajı
44
- """
45
  return [
46
  {"role": "system", "content": SYSTEM_PROMPT},
47
  {"role": "assistant", "content": f"Merhaba {NAME}, tam olarak şikayetiniz nedir?"}
48
  ]
49
 
50
  def chat_with_model(user_input, conversation_history, model_name="gpt-4o"):
51
- """
52
- OpenAI Chat API'ye istekte bulunur.
53
- """
54
  try:
55
  conversation_history.append({"role": "user", "content": user_input})
56
  response = client.chat.completions.create(
@@ -65,7 +58,6 @@ def chat_with_model(user_input, conversation_history, model_name="gpt-4o"):
65
 
66
  conversation_history.append({"role": "assistant", "content": assistant_message})
67
  return assistant_message
68
-
69
  except Exception as e:
70
  error_message = f"Hata oluştu: {str(e)}"
71
  conversation_history.append({"role": "assistant", "content": error_message})
@@ -73,15 +65,15 @@ def chat_with_model(user_input, conversation_history, model_name="gpt-4o"):
73
 
74
  def user_submit(user_message, chatbot_history, conversation_state, session_id):
75
  """
76
- Gradio'nun 'submit' callback'i (chat).
77
  Dört değer döndürüyoruz:
78
- 1) (Textbox'a yazılacak yeni metin, yani "")
79
- 2) (Chatbot geçmişi)
80
- 3) (OpenAI API'ye gönderdiğimiz asıl conversation_state)
81
- 4) (Textbox bileşeninin interactive parametresi => True/False)
82
  """
83
- # Konuşma yoksa başlat
84
  if not conversation_state:
 
85
  conversation_state = create_initial_conversation()
86
  chatbot_history = [
87
  {"role": "assistant", "content": conversation_state[-1]["content"]}
@@ -90,7 +82,6 @@ def user_submit(user_message, chatbot_history, conversation_state, session_id):
90
  # Kullanıcı 'quit' / 'exit' yazarsa sonlandır
91
  if user_message.lower() in ["quit", "exit"]:
92
  chatbot_history.append({"role": "assistant", "content": "Konuşma sonlandırıldı."})
93
- # Textbox'ı kilitle
94
  return "", chatbot_history, conversation_state, gr.update(interactive=False)
95
 
96
  # OpenAI'den cevap al
@@ -111,31 +102,21 @@ def user_submit(user_message, chatbot_history, conversation_state, session_id):
111
  ]
112
  if any(phrase in assistant_reply.lower() for phrase in end_phrases):
113
  chatbot_history.append({"role": "assistant", "content": "Doktor Robotum konuşmayı sonlandırdı."})
114
- # Bitişte de kilitliyoruz
115
  return "", chatbot_history, conversation_state, gr.update(interactive=False)
116
 
117
- # Sohbet devam ediyorsa textbox açık kalsın
118
  return "", chatbot_history, conversation_state, gr.update(interactive=True)
119
 
120
  def clear_conversation():
121
- """
122
- 'Yeni Konuşma' butonuna basılınca
123
- sohbeti başa sarsın (ilk asistan mesajını yazsın),
124
- textbox'u etkin hale getirsin
125
- """
126
  new_conv = create_initial_conversation()
127
- new_chatbot = [
128
- {"role": "assistant", "content": new_conv[-1]["content"]}
129
- ]
130
  return "", new_chatbot, new_conv, gr.update(interactive=True)
131
 
132
- # -------------------------------------------------------
133
- # Değerlendirme fonksiyonları
134
- # -------------------------------------------------------
135
  def evaluation_submit(q1, q2, q3, q4, q5, q6, q7, evaluation_state):
136
  """
137
  Doktorun 7 soruya verdiği yanıtları kaydediyoruz.
138
- Ekranda da "kaydedildi" mesajı döndürüyoruz.
139
  """
140
  data = {
141
  "q1": q1, # 1..5 => Hasta bilgileri netliği
@@ -151,29 +132,27 @@ def evaluation_submit(q1, q2, q3, q4, q5, q6, q7, evaluation_state):
151
 
152
  def export_conversation_and_evaluation(conversation_state, evaluation_state, session_id):
153
  """
154
- Tek bir CSV olarak konuşma ve değerlendirmeyi birleştirir.
155
  """
156
  if not conversation_state:
157
  return None
158
 
159
  timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
160
  filename = f"session_{session_id}_{timestamp}.csv"
161
- tmp_file = tempfile.NamedTemporaryFile(
162
- delete=False, suffix=".csv", mode="w", encoding="utf-8"
163
- )
164
 
165
  writer = csv.writer(tmp_file)
166
  writer.writerow(["role", "content"])
167
 
168
- # 1) Konuşma satırları
169
  for msg in conversation_state:
170
  writer.writerow([msg["role"], msg["content"]])
171
 
172
- # 2) Boşluk
173
  writer.writerow([])
174
  writer.writerow(["Evaluation"])
175
 
176
- # 3) Değerlendirme
177
  if evaluation_state:
178
  writer.writerow(["(1) Hasta bilgileri netliği (1-5)", evaluation_state.get("q1", "")])
179
  writer.writerow(["(2) Modelin sorularının doğruluğu (1-5)", evaluation_state.get("q2", "")])
@@ -185,59 +164,55 @@ def export_conversation_and_evaluation(conversation_state, evaluation_state, ses
185
  else:
186
  writer.writerow(["Herhangi bir değerlendirme kaydedilmedi."])
187
 
188
- # 4) Son satır
189
  writer.writerow([])
190
  writer.writerow(["Son", "Değerlendirme tamamlandı."])
191
 
192
  tmp_file.close()
193
  return tmp_file.name
194
 
195
- # -------------------------------------------------------
196
- # Ana Gradio arayüzü
197
- # -------------------------------------------------------
198
  def create_demo():
199
  with gr.Blocks() as demo:
200
  gr.Markdown("## Doktor Robotum - Hastalık Teşhis ve Öneri")
201
 
202
- session_id = gr.State(str(time.time())) # Oturum ID
203
- conversation_state = gr.State([]) # ChatGPT formatındaki geçmiş
204
- evaluation_state = gr.State({}) # Doktorun değerlendirmesi
205
-
206
- # --- Sekme 1: Chatbot ---
207
- with gr.Tab("Chatbot"):
208
- initial_conv = create_initial_conversation()
209
- default_chatbot = [
210
- {"role": "assistant", "content": initial_conv[-1]["content"]}
211
- ]
212
-
213
- chatbot = gr.Chatbot(
214
- value=default_chatbot,
215
- label="Doktor Robotum ile Sohbet",
216
- type="messages",
217
- height=400
218
- )
219
- msg = gr.Textbox(label="Mesajınızı yazıp Enter'a basın", placeholder="Buraya yaz...")
220
-
221
- clear_btn = gr.Button("Yeni Konuşma")
222
-
223
- # 4 output: (msg_text, chatbot, conversation_state, msg_update)
224
- msg.submit(
225
- fn=user_submit,
226
- inputs=[msg, chatbot, conversation_state, session_id],
227
- outputs=[msg, chatbot, conversation_state, msg],
228
- )
229
-
230
- clear_btn.click(
231
- fn=clear_conversation,
232
- inputs=[],
233
- outputs=[msg, chatbot, conversation_state, msg],
234
- queue=False
235
- )
236
-
237
- # --- Sekme 2: Değerlendirme ---
238
- with gr.Tab("Değerlendirme"):
239
- gr.Markdown(
240
- """**Doktor Değerlendirmesi:**
241
  1) Hasta tarafından verilen bilgiler ne derece net ve anlaşılırdı?
242
  2) Model tarafından sorulan devam soruları, hastalık tespiti için ne derece doğru sorulardı?
243
  3) Modelin en son aşamada yaptığı teşhis ne derece doğruydu?
@@ -245,55 +220,53 @@ def create_demo():
245
  5) Modelin verdiği kısa tavsiyeler ne derece doğruydu?
246
  6) Genel olarak model değerlendirmesi nasıldı?
247
  7) Model değerlendirmesinde eksik bulduğunuz, “ben olsaydım şunları da söylerdim” dediğiniz kısımlar?
248
- """
249
- )
250
-
251
- # Sliderlar (1..5) + metinsel yorum
252
- q1_slider = gr.Slider(minimum=1, maximum=5, step=1, label="(1) Hasta bilgileri netliği (1-5)", value=3)
253
- q2_slider = gr.Slider(minimum=1, maximum=5, step=1, label="(2) Model sorularının doğruluğu (1-5)", value=3)
254
- q3_slider = gr.Slider(minimum=1, maximum=5, step=1, label="(3) Teşhisin doğruluğu (1-5)", value=3)
255
- q4_slider = gr.Slider(minimum=1, maximum=5, step=1, label="(4) Tavsiye edilen doktorların doğruluğu (1-5)", value=3)
256
- q5_slider = gr.Slider(minimum=1, maximum=5, step=1, label="(5) Verilen tavsiyelerin doğruluğu (1-5)", value=3)
257
- q6_slider = gr.Slider(minimum=1, maximum=5, step=1, label="(6) Genel değerlendirme (1-5)", value=3)
258
- q7_text = gr.Textbox(
259
- label="(7) Ek yorumlarınız",
260
- lines=3,
261
- placeholder="Ör: Model şunu da sormalıydı..."
262
- )
263
-
264
- save_eval_button = gr.Button("Değerlendirmeyi Kaydet")
265
- eval_info = gr.Markdown("", visible=True)
266
-
267
- def eval_submit_wrapper(q1, q2, q3, q4, q5, q6, q7, evaluation_state):
268
- ev_st, message = evaluation_submit(q1, q2, q3, q4, q5, q6, q7, evaluation_state)
269
- return ev_st, message
270
-
271
- save_eval_button.click(
272
- fn=eval_submit_wrapper,
273
- inputs=[q1_slider, q2_slider, q3_slider, q4_slider, q5_slider, q6_slider, q7_text, evaluation_state],
274
- outputs=[evaluation_state, eval_info],
275
- )
276
-
277
- gr.Markdown("### Konuşma + Değerlendirme İndir")
278
- download_btn = gr.Button("Tek CSV Oluştur ve İndir")
279
- download_file = gr.File(label="Tek CSV")
280
-
281
- def export_all(conversation_state, evaluation_state, session_id):
282
- csv_path = export_conversation_and_evaluation(conversation_state, evaluation_state, session_id)
283
- return csv_path
284
-
285
- download_btn.click(
286
- fn=export_all,
287
- inputs=[conversation_state, evaluation_state, session_id],
288
- outputs=[download_file],
289
- queue=False
290
- )
291
 
292
  return demo
293
 
 
294
  if __name__ == "__main__":
295
  demo_app = create_demo()
296
- # python app.py
297
- # Ardından tarayıcıda http://127.0.0.1:7860
298
- # demo_app.launch(server_port=7860, server_name="0.0.0.0")
299
- demo_app.launch(share= True)
 
4
  import datetime
5
  import tempfile
6
  import gradio as gr
7
+ # from dotenv import load_dotenv # İstersen local kullanım için açabilirsin
8
  from openai import OpenAI
9
 
10
+ # Eğer localde .env kullanıyorsan:
11
  # load_dotenv()
12
+
13
  api_key = os.getenv("OPENAI_API_KEY")
14
  if not api_key:
15
+ raise ValueError("API Key bulunamadı! Lütfen .env veya Hugging Face Secrets ile 'OPENAI_API_KEY' tanımlayın.")
16
 
 
17
  client = OpenAI(api_key=api_key)
18
 
 
19
  SYSTEM_PROMPT = (
20
  "Sen bir tıp asistanısın. Amacın şudur: "
21
  "Kullanıcıya olası yaygın hastalıkları sormak ve olasılıkları eleyerek "
 
34
  "Bu konuşma sadece bilgi amaçlıdır."
35
  )
36
 
37
+ NAME = "Ali" # Kullanıcı/Hasta adı örnek
 
38
 
39
  def create_initial_conversation():
40
+ """Sohbetin başlangıcındaki mesajlar."""
 
 
41
  return [
42
  {"role": "system", "content": SYSTEM_PROMPT},
43
  {"role": "assistant", "content": f"Merhaba {NAME}, tam olarak şikayetiniz nedir?"}
44
  ]
45
 
46
  def chat_with_model(user_input, conversation_history, model_name="gpt-4o"):
 
 
 
47
  try:
48
  conversation_history.append({"role": "user", "content": user_input})
49
  response = client.chat.completions.create(
 
58
 
59
  conversation_history.append({"role": "assistant", "content": assistant_message})
60
  return assistant_message
 
61
  except Exception as e:
62
  error_message = f"Hata oluştu: {str(e)}"
63
  conversation_history.append({"role": "assistant", "content": error_message})
 
65
 
66
  def user_submit(user_message, chatbot_history, conversation_state, session_id):
67
  """
68
+ Gradio 'submit' callback'i (chat).
69
  Dört değer döndürüyoruz:
70
+ 1) Metin kutusunu temizlemek için "" döndürüyoruz
71
+ 2) Chatbot geçmişini
72
+ 3) conversation_state (OpenAI'ye gönderdiğimiz geçmiş)
73
+ 4) Textbox'u kilitleyip kilitlemeyeceğimize dair ayar (True/False)
74
  """
 
75
  if not conversation_state:
76
+ # Konuşma yoksa başlat
77
  conversation_state = create_initial_conversation()
78
  chatbot_history = [
79
  {"role": "assistant", "content": conversation_state[-1]["content"]}
 
82
  # Kullanıcı 'quit' / 'exit' yazarsa sonlandır
83
  if user_message.lower() in ["quit", "exit"]:
84
  chatbot_history.append({"role": "assistant", "content": "Konuşma sonlandırıldı."})
 
85
  return "", chatbot_history, conversation_state, gr.update(interactive=False)
86
 
87
  # OpenAI'den cevap al
 
102
  ]
103
  if any(phrase in assistant_reply.lower() for phrase in end_phrases):
104
  chatbot_history.append({"role": "assistant", "content": "Doktor Robotum konuşmayı sonlandırdı."})
 
105
  return "", chatbot_history, conversation_state, gr.update(interactive=False)
106
 
 
107
  return "", chatbot_history, conversation_state, gr.update(interactive=True)
108
 
109
  def clear_conversation():
110
+ """'Yeni Konuşma' butonu callback."""
 
 
 
 
111
  new_conv = create_initial_conversation()
112
+ new_chatbot = [{"role": "assistant", "content": new_conv[-1]["content"]}]
 
 
113
  return "", new_chatbot, new_conv, gr.update(interactive=True)
114
 
115
+ # --------------- Değerlendirme Fonksiyonları ---------------
 
 
116
  def evaluation_submit(q1, q2, q3, q4, q5, q6, q7, evaluation_state):
117
  """
118
  Doktorun 7 soruya verdiği yanıtları kaydediyoruz.
119
+ 'Değerlendirme kaydedildi!' mesajı döndürüyoruz.
120
  """
121
  data = {
122
  "q1": q1, # 1..5 => Hasta bilgileri netliği
 
132
 
133
  def export_conversation_and_evaluation(conversation_state, evaluation_state, session_id):
134
  """
135
+ Tek bir CSV oluşturup, önce konuşma, sonra değerlendirme verilerini ekler.
136
  """
137
  if not conversation_state:
138
  return None
139
 
140
  timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
141
  filename = f"session_{session_id}_{timestamp}.csv"
142
+ tmp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".csv", mode="w", encoding="utf-8")
 
 
143
 
144
  writer = csv.writer(tmp_file)
145
  writer.writerow(["role", "content"])
146
 
147
+ # Konuşma satırları
148
  for msg in conversation_state:
149
  writer.writerow([msg["role"], msg["content"]])
150
 
151
+ # Boşluk
152
  writer.writerow([])
153
  writer.writerow(["Evaluation"])
154
 
155
+ # Değerlendirme
156
  if evaluation_state:
157
  writer.writerow(["(1) Hasta bilgileri netliği (1-5)", evaluation_state.get("q1", "")])
158
  writer.writerow(["(2) Modelin sorularının doğruluğu (1-5)", evaluation_state.get("q2", "")])
 
164
  else:
165
  writer.writerow(["Herhangi bir değerlendirme kaydedilmedi."])
166
 
167
+ # Son satır
168
  writer.writerow([])
169
  writer.writerow(["Son", "Değerlendirme tamamlandı."])
170
 
171
  tmp_file.close()
172
  return tmp_file.name
173
 
174
+ # --------------- Ana Gradio Arayüzü ---------------
 
 
175
  def create_demo():
176
  with gr.Blocks() as demo:
177
  gr.Markdown("## Doktor Robotum - Hastalık Teşhis ve Öneri")
178
 
179
+ session_id = gr.State(str(time.time())) # Oturum ID
180
+ conversation_state = gr.State([]) # ChatGPT formatındaki sohbet geçmişi
181
+ evaluation_state = gr.State({}) # Doktorun değerlendirmesi
182
+
183
+ # ------------------- Chatbot Kısmı -------------------
184
+ gr.Markdown("### Chatbot")
185
+ initial_conv = create_initial_conversation()
186
+ default_chatbot = [{"role": "assistant", "content": initial_conv[-1]["content"]}]
187
+
188
+ chatbot = gr.Chatbot(
189
+ value=default_chatbot,
190
+ label="Doktor Robotum ile Sohbet",
191
+ type="messages",
192
+ height=400
193
+ )
194
+
195
+ msg = gr.Textbox(label="Mesajınızı yazıp Enter'a basın", placeholder="Buraya yaz...")
196
+ clear_btn = gr.Button("Yeni Konuşma")
197
+
198
+ # Chat botu callback
199
+ msg.submit(
200
+ fn=user_submit,
201
+ inputs=[msg, chatbot, conversation_state, session_id],
202
+ outputs=[msg, chatbot, conversation_state, msg],
203
+ )
204
+
205
+ clear_btn.click(
206
+ fn=clear_conversation,
207
+ inputs=[],
208
+ outputs=[msg, chatbot, conversation_state, msg],
209
+ queue=False
210
+ )
211
+
212
+ # ------------------- Değerlendirme Kısmı -------------------
213
+ gr.Markdown("### Doktor Değerlendirmesi")
214
+ gr.Markdown(
215
+ """
 
 
216
  1) Hasta tarafından verilen bilgiler ne derece net ve anlaşılırdı?
217
  2) Model tarafından sorulan devam soruları, hastalık tespiti için ne derece doğru sorulardı?
218
  3) Modelin en son aşamada yaptığı teşhis ne derece doğruydu?
 
220
  5) Modelin verdiği kısa tavsiyeler ne derece doğruydu?
221
  6) Genel olarak model değerlendirmesi nasıldı?
222
  7) Model değerlendirmesinde eksik bulduğunuz, “ben olsaydım şunları da söylerdim” dediğiniz kısımlar?
223
+ """
224
+ )
225
+
226
+ # Sliderlar (1..5) + Metinsel yorum
227
+ q1_slider = gr.Slider(minimum=1, maximum=5, step=1, label="(1) Hasta bilgileri netliği (1-5)", value=3)
228
+ q2_slider = gr.Slider(minimum=1, maximum=5, step=1, label="(2) Model sorularının doğruluğu (1-5)", value=3)
229
+ q3_slider = gr.Slider(minimum=1, maximum=5, step=1, label="(3) Teşhisin doğruluğu (1-5)", value=3)
230
+ q4_slider = gr.Slider(minimum=1, maximum=5, step=1, label="(4) Tavsiye edilen doktorların doğruluğu (1-5)", value=3)
231
+ q5_slider = gr.Slider(minimum=1, maximum=5, step=1, label="(5) Verilen tavsiyelerin doğruluğu (1-5)", value=3)
232
+ q6_slider = gr.Slider(minimum=1, maximum=5, step=1, label="(6) Genel değerlendirme (1-5)", value=3)
233
+ q7_text = gr.Textbox(
234
+ label="(7) Ek yorumlarınız",
235
+ lines=3,
236
+ placeholder="Örnek: Model şunu da sormalıydı..."
237
+ )
238
+
239
+ save_eval_button = gr.Button("Değerlendirmeyi Kaydet")
240
+ eval_info = gr.Markdown("", visible=True)
241
+
242
+ def eval_submit_wrapper(q1, q2, q3, q4, q5, q6, q7, evaluation_state):
243
+ ev_st, message = evaluation_submit(q1, q2, q3, q4, q5, q6, q7, evaluation_state)
244
+ return ev_st, message
245
+
246
+ save_eval_button.click(
247
+ fn=eval_submit_wrapper,
248
+ inputs=[q1_slider, q2_slider, q3_slider, q4_slider, q5_slider, q6_slider, q7_text, evaluation_state],
249
+ outputs=[evaluation_state, eval_info],
250
+ )
251
+
252
+ gr.Markdown("### Konuşma + Değerlendirme İndir")
253
+ download_btn = gr.Button("Tek CSV Oluştur ve İndir")
254
+ download_file = gr.File(label="İndirilen CSV Dosyası")
255
+
256
+ def export_all(conversation_state, evaluation_state, session_id):
257
+ csv_path = export_conversation_and_evaluation(conversation_state, evaluation_state, session_id)
258
+ return csv_path
259
+
260
+ download_btn.click(
261
+ fn=export_all,
262
+ inputs=[conversation_state, evaluation_state, session_id],
263
+ outputs=[download_file],
264
+ queue=False
265
+ )
266
 
267
  return demo
268
 
269
+
270
  if __name__ == "__main__":
271
  demo_app = create_demo()
272
+ demo_app.launch() # Spaces üzerinde parametresiz launch genellikle yeterli
 
 
 
requirements.txt CHANGED
@@ -1,4 +1,4 @@
1
  huggingface_hub==0.25.2
2
- gradio==3.22.0
3
  openai
4
  python-dotenv
 
1
  huggingface_hub==0.25.2
2
+ gradio
3
  openai
4
  python-dotenv