SamiKoen commited on
Commit
7fcabe0
·
verified ·
1 Parent(s): 5ede5a3

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +20 -25
app.py CHANGED
@@ -5,8 +5,8 @@ import requests
5
  import xml.etree.ElementTree as ET
6
 
7
  # Dosya yolu: Space'in ana dizinine kaydetmek için
8
- LOG_FILE = 'chat_logs.txt' # Uygulamanın çalıştığı dizinde oluşturulur
9
- print(f"Dosya yolu: {os.path.abspath(LOG_FILE)}") # Dosyanın tam yolunu kontrol et
10
 
11
  # API ayarları
12
  API_URL = "https://api.openai.com/v1/chat/completions"
@@ -38,11 +38,9 @@ def predict(system_msg, inputs, top_p, temperature, chat_counter, chatbot=[], hi
38
  "Authorization": f"Bearer {OPENAI_API_KEY}"
39
  }
40
  print(f"System message: {system_msg}")
41
- initial_message = [{"role": "user", "content": f"{inputs}"},]
42
 
43
  multi_turn_message = [
44
  {"role": "system", "content": "Bir önceki sohbeti unut. Vereceğin ürün bilgisi, bu bilginin içinde yan yana yazmıyorsa veya arada başka bilgiler yazıyor ise, o bilgiyi vermeyeceksin çünkü o bilgi yanlıştır. vereceğin bilgiyi bu bilgilerin içinden alıyorsan her kelimenin yan yana yazmazı şartı ile o bilgiyi verebilirsin. Madone SLR bisikletler soruluyorsa (GEN 7) ibaresini kendin ekleyerek, aramayı GEN 7'li yap.Sana verilen bilgilerin içinde bir ürün adı veya bisiklet modelinin rengi yoksa, ürün ile ilgili bilgi vermeyeceksin ve sorulan modelden farklı boy ve renkler stoklarda varsa, bu bilgileri vereceksin. Alternatif renk veya boyu yok ise, başka bir model adını öğrenirsen stokları tekrar kontrol edebileceğini söyleyeceksin. Sana bir model adı rakamı ile verilmiş ve bu ürün bu bilgiler içinde yok ise, o ürün stoklarımızda yoktur diye bilgi vereceksin ve model adı rakamsız girilmiş ise nodel adının rakamı ile girilmesini rica edeceksin, örnek olarak 'Madone SL 7' gibi 7 rakamının da yazılmasını rica edeceksin. Madone, Emonda, Domane ve Checpont modelleri birer yol bisikleti modelidir, bu modellerin renklerinden önce yazan ve 47, 49, 50, 52, 54, 56, 58, 60, 62, 64 rakamları, o bisikletlerin boylarıdır. Bu bilgi içindeki renkler ise o ürünlerin renkleridir. Sana bir ürün var mı diye sorulduğunda, sadece bilgi içinde olan ürünleri söyleyebilirsin. Stoklarımızda yok ise o ürün ile ilgili bilgi vermeyeceksin. En büyük veya en küçük boy sorulduğunda, bilgi içinde renki bilgisi olan modellerin bilgisini vereceksin. Gerçek zamanlı stok bilgilerine erişme yeteneğin var. En aşağıdaki ürünlerin adına, rengine, boyuna ve fiyatına tam erişimin var ve bunları bilmiyorum demeyeceksin. Üyelere özel fiyatları ve indirimleri görmek için kullanıcıların siteye üye olmaları gerekmektedir. Sen bir AI Trek marka bisiklet uzmanı, bilir kişisi ve asistanısın.Trek ve Electra bisikletler konusunda uzmanım.İzmir'de yeni bir mağazamız açılıyor. Mağazamız Nisan 2025 ayında açılmış olacak. Yeri is Alsancak'da. İstanbul'da üç Trek mağazamız var: Caddebostan, Ortaköy ve Sarıyer. Ortaköy maidği 10.00-19.00 saatleri arasında açık. ve Toyota Plaza ve Carrefour'un yanindadir,tam adresi Dereboyu Cad No:84 Ortaköy Beşiktaş ve telefon numarası 0212 2271015. Caddebostan mağazası, Prof. Dr. Hulusi Behçet 18 Caddebostan, Kadıköy adresinde, Göztepe Parkı karşısındadır, telefon numarası 0216 6292432, 10.00-19.00 saatleri arasında açık. Tüm mağazalar Pazar günü kapalıdır. Caddebostan mağazamızda haftanın her günü Bike fit yapılmaktadır ve ücreti 3500 TL ve süresi 60-90 dakika. Bike fit yaptırmak isteyenler, Bike fit sayfamızda sağ tarafta bulunan RANDEVU AL butonu ile randevu oluştumaları gerekmektedir. Sarıyer mağazamızın adresi şöyledir: Mareşal Fevzi Çakmak Cad. No 54 Kemer-Bahçeköy Mahallsi Sarıyer, hafta içleri ve cumartesi günleri 10.00 ile 19.00 saatleri arasında hizmet vermektedir. Bu mağazamız elektrikli bisikletlerin daha çok sergilendiği ve tüm çeşiti bir arada görebileceğiniz mağazamızdır. Maslaktan, Belgrad ormanına gelirken sol tarafta kalmaktadır ve telefon numarası 0542 137 1080.."},
45
- # Diğer system mesajları buraya eklenebilir...
46
  ]
47
 
48
  messages = multi_turn_message.copy()
@@ -53,14 +51,11 @@ def predict(system_msg, inputs, top_p, temperature, chat_counter, chatbot=[], hi
53
  if product_info[0] in input_words:
54
  new_msg = f"{product_info[2]} {product_info[1][0]} ve fiyatı EURO {product_info[1][1]}"
55
  print(new_msg)
56
- product_msg = {"role": "system", "content": new_msg}
57
- messages.append(product_msg)
58
 
59
  for data in chatbot:
60
- user_msg = {"role": "user", "content": data[0]}
61
- assistant_msg = {"role": "assistant", "content": data[1]}
62
- messages.append(user_msg)
63
- messages.append(assistant_msg)
64
 
65
  messages.append({"role": "user", "content": inputs})
66
 
@@ -79,7 +74,7 @@ def predict(system_msg, inputs, top_p, temperature, chat_counter, chatbot=[], hi
79
  history.append(inputs)
80
  print(f"Logging: Payload is - {payload}")
81
 
82
- # Kullanıcı mesajını anında yazma
83
  try:
84
  with open(LOG_FILE, 'a', encoding='utf-8') as f:
85
  f.write(f"User: {inputs}\n")
@@ -91,7 +86,7 @@ def predict(system_msg, inputs, top_p, temperature, chat_counter, chatbot=[], hi
91
  print(f"Logging: Response code - {response.status_code}")
92
  if response.status_code != 200:
93
  print(f"API hatası: {response.text}")
94
- yield chatbot, history, chat_counter, response # Hata durumunda erken çıkış
95
 
96
  token_counter = 0
97
  partial_words = ""
@@ -103,10 +98,9 @@ def predict(system_msg, inputs, top_p, temperature, chat_counter, chatbot=[], hi
103
  chunk_str = chunk.decode('utf-8')
104
  print(f"Chunk {counter}: {chunk_str}")
105
 
106
- # Veri akışını kontrol et
107
  if chunk_str.startswith("data: ") and chunk_str != "data: [DONE]":
108
  try:
109
- chunk_data = json.loads(chunk_str[6:]) # "data: " önekini çıkar
110
  delta = chunk_data['choices'][0]['delta']
111
  if 'content' in delta:
112
  content = delta['content']
@@ -114,23 +108,24 @@ def predict(system_msg, inputs, top_p, temperature, chat_counter, chatbot=[], hi
114
  print(f"İçerik eklendi: {content}")
115
  print(f"Güncel partial_words: {partial_words}")
116
  else:
117
- print("Bu chunk içerik içermiyor (delta boş veya başka bilgi taşıyor)")
118
  except json.JSONDecodeError as e:
119
  print(f"JSON parse hatası: {e} - Chunk: {chunk_str}")
120
  elif chunk_str == "data: [DONE]":
121
  print("Akış tamamlandı: [DONE] alındı")
122
 
123
- # Chatbot güncellemesi
124
  if partial_words:
125
  if token_counter == 0:
126
- history.append(" " + partial_words)
127
  else:
128
  history[-1] = partial_words
129
- chat = [(history[i], history[i + 1]) for i in range(0, len(history) - 1, 2)]
 
130
  token_counter += 1
131
- yield chat, history, chat_counter, response
132
 
133
- # Bot yanıtını dosyaya yazma
134
  if partial_words:
135
  try:
136
  with open(LOG_FILE, 'a', encoding='utf-8') as f:
@@ -141,15 +136,15 @@ def predict(system_msg, inputs, top_p, temperature, chat_counter, chatbot=[], hi
141
  else:
142
  print("Uyarı: partial_words boş, bot yanıtı yazılamadı!")
143
 
 
 
144
  def save_chat(chatbot):
145
- """ Sohbeti dosyaya kaydetme fonksiyonu """
146
  file_path = os.path.abspath(LOG_FILE)
147
  try:
148
  with open(LOG_FILE, 'a', encoding='utf-8') as f:
149
  f.write("\n--- Kayıt Edilen Sohbet ---\n")
150
- for user_msg, bot_msg in chatbot:
151
- f.write(f"User: {user_msg}\n")
152
- f.write(f"Bot: {bot_msg}\n")
153
  print(f"Sohbet dosyaya kaydedildi: {file_path}")
154
  return f"Sohbet başarıyla kaydedildi!\nDosya: {file_path}"
155
  except Exception as e:
@@ -214,7 +209,7 @@ with gr.Blocks(css=demo_css, theme=theme) as demo:
214
  new_msg = gr.Textbox(value="")
215
  accordion_msg = gr.HTML(value="", visible=False)
216
 
217
- chatbot = gr.Chatbot(label='Trek Asistanı', elem_id="chatbot")
218
 
219
  with gr.Row(elem_id="custom_row"):
220
  inputs = gr.Textbox(
 
5
  import xml.etree.ElementTree as ET
6
 
7
  # Dosya yolu: Space'in ana dizinine kaydetmek için
8
+ LOG_FILE = 'chat_logs.txt'
9
+ print(f"Dosya yolu: {os.path.abspath(LOG_FILE)}")
10
 
11
  # API ayarları
12
  API_URL = "https://api.openai.com/v1/chat/completions"
 
38
  "Authorization": f"Bearer {OPENAI_API_KEY}"
39
  }
40
  print(f"System message: {system_msg}")
 
41
 
42
  multi_turn_message = [
43
  {"role": "system", "content": "Bir önceki sohbeti unut. Vereceğin ürün bilgisi, bu bilginin içinde yan yana yazmıyorsa veya arada başka bilgiler yazıyor ise, o bilgiyi vermeyeceksin çünkü o bilgi yanlıştır. vereceğin bilgiyi bu bilgilerin içinden alıyorsan her kelimenin yan yana yazmazı şartı ile o bilgiyi verebilirsin. Madone SLR bisikletler soruluyorsa (GEN 7) ibaresini kendin ekleyerek, aramayı GEN 7'li yap.Sana verilen bilgilerin içinde bir ürün adı veya bisiklet modelinin rengi yoksa, ürün ile ilgili bilgi vermeyeceksin ve sorulan modelden farklı boy ve renkler stoklarda varsa, bu bilgileri vereceksin. Alternatif renk veya boyu yok ise, başka bir model adını öğrenirsen stokları tekrar kontrol edebileceğini söyleyeceksin. Sana bir model adı rakamı ile verilmiş ve bu ürün bu bilgiler içinde yok ise, o ürün stoklarımızda yoktur diye bilgi vereceksin ve model adı rakamsız girilmiş ise nodel adının rakamı ile girilmesini rica edeceksin, örnek olarak 'Madone SL 7' gibi 7 rakamının da yazılmasını rica edeceksin. Madone, Emonda, Domane ve Checpont modelleri birer yol bisikleti modelidir, bu modellerin renklerinden önce yazan ve 47, 49, 50, 52, 54, 56, 58, 60, 62, 64 rakamları, o bisikletlerin boylarıdır. Bu bilgi içindeki renkler ise o ürünlerin renkleridir. Sana bir ürün var mı diye sorulduğunda, sadece bilgi içinde olan ürünleri söyleyebilirsin. Stoklarımızda yok ise o ürün ile ilgili bilgi vermeyeceksin. En büyük veya en küçük boy sorulduğunda, bilgi içinde renki bilgisi olan modellerin bilgisini vereceksin. Gerçek zamanlı stok bilgilerine erişme yeteneğin var. En aşağıdaki ürünlerin adına, rengine, boyuna ve fiyatına tam erişimin var ve bunları bilmiyorum demeyeceksin. Üyelere özel fiyatları ve indirimleri görmek için kullanıcıların siteye üye olmaları gerekmektedir. Sen bir AI Trek marka bisiklet uzmanı, bilir kişisi ve asistanısın.Trek ve Electra bisikletler konusunda uzmanım.İzmir'de yeni bir mağazamız açılıyor. Mağazamız Nisan 2025 ayında açılmış olacak. Yeri is Alsancak'da. İstanbul'da üç Trek mağazamız var: Caddebostan, Ortaköy ve Sarıyer. Ortaköy maidği 10.00-19.00 saatleri arasında açık. ve Toyota Plaza ve Carrefour'un yanindadir,tam adresi Dereboyu Cad No:84 Ortaköy Beşiktaş ve telefon numarası 0212 2271015. Caddebostan mağazası, Prof. Dr. Hulusi Behçet 18 Caddebostan, Kadıköy adresinde, Göztepe Parkı karşısındadır, telefon numarası 0216 6292432, 10.00-19.00 saatleri arasında açık. Tüm mağazalar Pazar günü kapalıdır. Caddebostan mağazamızda haftanın her günü Bike fit yapılmaktadır ve ücreti 3500 TL ve süresi 60-90 dakika. Bike fit yaptırmak isteyenler, Bike fit sayfamızda sağ tarafta bulunan RANDEVU AL butonu ile randevu oluştumaları gerekmektedir. Sarıyer mağazamızın adresi şöyledir: Mareşal Fevzi Çakmak Cad. No 54 Kemer-Bahçeköy Mahallsi Sarıyer, hafta içleri ve cumartesi günleri 10.00 ile 19.00 saatleri arasında hizmet vermektedir. Bu mağazamız elektrikli bisikletlerin daha çok sergilendiği ve tüm çeşiti bir arada görebileceğiniz mağazamızdır. Maslaktan, Belgrad ormanına gelirken sol tarafta kalmaktadır ve telefon numarası 0542 137 1080.."},
 
44
  ]
45
 
46
  messages = multi_turn_message.copy()
 
51
  if product_info[0] in input_words:
52
  new_msg = f"{product_info[2]} {product_info[1][0]} ve fiyatı EURO {product_info[1][1]}"
53
  print(new_msg)
54
+ messages.append({"role": "system", "content": new_msg})
 
55
 
56
  for data in chatbot:
57
+ messages.append({"role": "user", "content": data["content"]})
58
+ messages.append({"role": "assistant", "content": data["content"]})
 
 
59
 
60
  messages.append({"role": "user", "content": inputs})
61
 
 
74
  history.append(inputs)
75
  print(f"Logging: Payload is - {payload}")
76
 
77
+ # Kullanıcı mesajını dosyaya yaz
78
  try:
79
  with open(LOG_FILE, 'a', encoding='utf-8') as f:
80
  f.write(f"User: {inputs}\n")
 
86
  print(f"Logging: Response code - {response.status_code}")
87
  if response.status_code != 200:
88
  print(f"API hatası: {response.text}")
89
+ return chatbot, history, chat_counter
90
 
91
  token_counter = 0
92
  partial_words = ""
 
98
  chunk_str = chunk.decode('utf-8')
99
  print(f"Chunk {counter}: {chunk_str}")
100
 
 
101
  if chunk_str.startswith("data: ") and chunk_str != "data: [DONE]":
102
  try:
103
+ chunk_data = json.loads(chunk_str[6:])
104
  delta = chunk_data['choices'][0]['delta']
105
  if 'content' in delta:
106
  content = delta['content']
 
108
  print(f"İçerik eklendi: {content}")
109
  print(f"Güncel partial_words: {partial_words}")
110
  else:
111
+ print("Bu chunk içerik içermiyor")
112
  except json.JSONDecodeError as e:
113
  print(f"JSON parse hatası: {e} - Chunk: {chunk_str}")
114
  elif chunk_str == "data: [DONE]":
115
  print("Akış tamamlandı: [DONE] alındı")
116
 
117
+ # Chatbot güncellemesi (messages formatı)
118
  if partial_words:
119
  if token_counter == 0:
120
+ history.append(partial_words)
121
  else:
122
  history[-1] = partial_words
123
+ chat = [{"role": "user", "content": history[i]} for i in range(0, len(history)-1, 2)] + \
124
+ [{"role": "assistant", "content": history[i+1]} for i in range(1, len(history), 2)]
125
  token_counter += 1
126
+ yield chat, history, chat_counter
127
 
128
+ # Bot yanıtını dosyaya yaz
129
  if partial_words:
130
  try:
131
  with open(LOG_FILE, 'a', encoding='utf-8') as f:
 
136
  else:
137
  print("Uyarı: partial_words boş, bot yanıtı yazılamadı!")
138
 
139
+ return chat, history, chat_counter
140
+
141
  def save_chat(chatbot):
 
142
  file_path = os.path.abspath(LOG_FILE)
143
  try:
144
  with open(LOG_FILE, 'a', encoding='utf-8') as f:
145
  f.write("\n--- Kayıt Edilen Sohbet ---\n")
146
+ for msg in chatbot:
147
+ f.write(f"{msg['role'].capitalize()}: {msg['content']}\n")
 
148
  print(f"Sohbet dosyaya kaydedildi: {file_path}")
149
  return f"Sohbet başarıyla kaydedildi!\nDosya: {file_path}"
150
  except Exception as e:
 
209
  new_msg = gr.Textbox(value="")
210
  accordion_msg = gr.HTML(value="", visible=False)
211
 
212
+ chatbot = gr.Chatbot(label='Trek Asistanı', elem_id="chatbot", type="messages") # Yeni format
213
 
214
  with gr.Row(elem_id="custom_row"):
215
  inputs = gr.Textbox(