SamiKoen commited on
Commit
75d80d2
·
verified ·
1 Parent(s): f4fa7fb

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +76 -56
app.py CHANGED
@@ -4,19 +4,17 @@ import json
4
  import requests
5
  import xml.etree.ElementTree as ET
6
 
7
-
8
-
9
-
10
- # API URL ve API anahtarı
11
  API_URL = "https://api.openai.com/v1/chat/completions"
12
  OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
13
 
14
- # XML'den ürün bilgilerini çekiyoruz
15
  url = 'https://www.trekbisiklet.com.tr/output/8582384479'
 
16
  response = requests.get(url)
17
  root = ET.fromstring(response.content)
18
 
19
  products = []
 
20
  for item in root.findall('item'):
21
  if item.find('isOptionOfAProduct').text == '1':
22
  if item.find('stockAmount').text > '0':
@@ -29,7 +27,6 @@ for item in root.findall('item'):
29
  # name: ilk kelime (marka), item_info: (stok adedi, fiyat)
30
  products.append((name, item_info, full_name))
31
 
32
-
33
  def predict(system_msg, inputs, top_p, temperature, chat_counter, chatbot=[], history=[]):
34
  headers = {
35
  "Content-Type": "application/json",
@@ -37,11 +34,6 @@ def predict(system_msg, inputs, top_p, temperature, chat_counter, chatbot=[], hi
37
  }
38
  print(f"system message is ^^ {system_msg}")
39
  initial_message = [{"role": "user", "content": f"{inputs}"},]
40
-
41
-
42
-
43
-
44
-
45
 
46
  multi_turn_message = [
47
  {"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 mağazası 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.."},
@@ -94,7 +86,7 @@ def predict(system_msg, inputs, top_p, temperature, chat_counter, chatbot=[], hi
94
 
95
  chat_counter += 1
96
  history.append(inputs)
97
-
98
 
99
  response = requests.post(API_URL, headers=headers, json=payload, stream=True)
100
  print(f"Logging : response code - {response}")
@@ -115,86 +107,114 @@ def predict(system_msg, inputs, top_p, temperature, chat_counter, chatbot=[], hi
115
  history[-1] = partial_words
116
  chat = [(history[i], history[i + 1]) for i in range(0, len(history) - 1, 2)]
117
  token_counter += 1
118
- yield chat, history, chat_counter
119
-
120
-
121
-
122
 
123
  def reset_textbox():
124
  return gr.update(value='')
125
 
126
-
127
- print("Mevcut dizinler:", os.listdir("/mnt"))
128
- print("Data klasöründeki dosyalar:", os.listdir("/mnt/data") if os.path.exists("/mnt/data") else "Klasör yok")
129
- # CSS ayarları
130
  demo_css = """
131
  #send_button {
132
- background-color: #0b93f6;
133
- border: none;
134
- color: white;
135
- font-size: 24px;
136
- border-radius: 10%;
137
- width: 35px !important;
138
- height: 37px !important;
139
- display: inline-flex;
140
- align-items: center;
141
- justify-content: center;
142
- cursor: pointer;
143
- transition: background-color 0.3s;
144
  }
145
  #send_button:hover {
146
- background-color: #0077c0;
147
  }
 
 
 
 
 
 
 
148
  .fixed_button_container {
149
- padding: 0px;
150
- margin: 0px 0 0 0px;
 
151
  }
152
  #custom_row {
153
- width: 150% !important;
154
- flex-wrap: nowrap !important;
155
  }
 
 
156
  @media only screen and (max-width: 1000px) {
157
- .custom_row {
158
- flex-wrap: nowrap !important;
159
- }
160
  }
161
  #chatbot {
162
- height: 60vh !important;
163
- overflow-y: auto;
164
  }
 
 
165
  """
166
 
 
 
167
  # Tema ayarları
168
- theme = gr.themes.Base(neutral_hue="blue", text_size="sm", spacing_size="sm")
 
 
 
 
169
 
170
- # Gradio arayüzü
171
- with gr.Blocks(css=demo_css) as demo:
172
  with gr.Column(elem_id="col_container"):
173
  with gr.Accordion("", open=False, visible=False):
174
  system_msg = gr.Textbox(value="")
175
  new_msg = gr.Textbox(value="")
176
  accordion_msg = gr.HTML(value="", visible=False)
 
177
  chatbot = gr.Chatbot(label='Trek Asistanı', elem_id="chatbot")
178
 
 
179
  with gr.Row(elem_id="custom_row"):
180
- inputs = gr.Textbox(placeholder="Buraya yazın", show_label=False, container=False)
 
 
 
 
 
 
181
  with gr.Column(elem_classes="fixed_button_container"):
182
  send_button = gr.Button(value="✈", elem_id="send_button")
 
183
  state = gr.State([])
184
- save_button = gr.Button("Sohbeti Kaydet")
185
- save_button.click(save_current_chat, [state], [state])
186
-
187
-
188
  with gr.Accordion("", open=False, visible=False):
189
- top_p = gr.Slider(minimum=0, maximum=1.0, value=0.5, step=0.05, interactive=False, visible=False)
190
- temperature = gr.Slider(minimum=0, maximum=5.0, value=0.1, step=0.1, interactive=False, visible=False)
 
 
191
  chat_counter = gr.Number(value=0, visible=False, precision=0)
192
 
193
- # ENTER ile gönderme
194
- inputs.submit(predict, [system_msg, inputs, top_p, temperature, chat_counter, chatbot, state], [chatbot, state, chat_counter])
 
 
 
 
195
  inputs.submit(reset_textbox, [], [inputs])
196
- send_button.click(predict, [system_msg, inputs, top_p, temperature, chat_counter, chatbot, state], [chatbot, state, chat_counter])
 
 
 
 
 
 
197
  send_button.click(reset_textbox, [], [inputs])
198
 
199
  demo.queue(max_size=10).launch(debug=True)
200
-
 
4
  import requests
5
  import xml.etree.ElementTree as ET
6
 
7
+ # os.getenv("API_URL") + "/generate_stream"
 
 
 
8
  API_URL = "https://api.openai.com/v1/chat/completions"
9
  OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
10
 
 
11
  url = 'https://www.trekbisiklet.com.tr/output/8582384479'
12
+
13
  response = requests.get(url)
14
  root = ET.fromstring(response.content)
15
 
16
  products = []
17
+
18
  for item in root.findall('item'):
19
  if item.find('isOptionOfAProduct').text == '1':
20
  if item.find('stockAmount').text > '0':
 
27
  # name: ilk kelime (marka), item_info: (stok adedi, fiyat)
28
  products.append((name, item_info, full_name))
29
 
 
30
  def predict(system_msg, inputs, top_p, temperature, chat_counter, chatbot=[], history=[]):
31
  headers = {
32
  "Content-Type": "application/json",
 
34
  }
35
  print(f"system message is ^^ {system_msg}")
36
  initial_message = [{"role": "user", "content": f"{inputs}"},]
 
 
 
 
 
37
 
38
  multi_turn_message = [
39
  {"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 mağazası 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.."},
 
86
 
87
  chat_counter += 1
88
  history.append(inputs)
89
+ print(f"Logging : payload is - {payload}")
90
 
91
  response = requests.post(API_URL, headers=headers, json=payload, stream=True)
92
  print(f"Logging : response code - {response}")
 
107
  history[-1] = partial_words
108
  chat = [(history[i], history[i + 1]) for i in range(0, len(history) - 1, 2)]
109
  token_counter += 1
110
+ yield chat, history, chat_counter, response
 
 
 
111
 
112
  def reset_textbox():
113
  return gr.update(value='')
114
 
115
+ # CSS: Butonun sabit, yuvarlak kalması ve sağa doğru hafifçe 2px uzaklaşması için ayarlandı.
116
+ # Ek olarak, mobilde giriş alanının genişliğini kısıtlamak için "#input_text" id'sine genişlik ayarı ekledik.
 
 
117
  demo_css = """
118
  #send_button {
119
+ background-color: #0b93f6;
120
+ border: none;
121
+ color: white;
122
+ font-size: 24px;
123
+ border-radius: 10%;
124
+ width: 35px !important;
125
+ height: 37px !important;
126
+ display: inline-flex;
127
+ align-items: center;
128
+ justify-content: center;
129
+ cursor: pointer;
130
+ transition: background-color 0.3s;
131
  }
132
  #send_button:hover {
133
+ background-color: #0077c0;
134
  }
135
+
136
+
137
+
138
+
139
+
140
+
141
+ /* Buton kapsayıcısındaki sol margin değerini kaldırıyoruz */
142
  .fixed_button_container {
143
+
144
+ padding: 0px;
145
+ margin: 0px 0 0 0px; /* Sol boşluk kaldırıldı */
146
  }
147
  #custom_row {
148
+ width: 150% !important; /* İstediğiniz yüksekliği girin */
149
+ flex-wrap: nowrap !important;
150
  }
151
+
152
+ /* Mobil ekranlar için özel düzenleme */
153
  @media only screen and (max-width: 1000px) {
154
+ .custom_row { /* Eğer Row'a bu sınıf atanmışsa */
155
+ flex-wrap: nowrap !important;
156
+ }
157
  }
158
  #chatbot {
159
+ height: 100vh; /* Bu, chatbotun yüksekliğini sayfanın tamamına yayacaktır */
160
+ overflow-y: auto; /* Bu, dikey kaydırma çubuğunu etkinleştirir */
161
  }
162
+
163
+
164
  """
165
 
166
+
167
+
168
  # Tema ayarları
169
+ theme = gr.themes.Base(
170
+ neutral_hue="blue",
171
+ text_size="sm",
172
+ spacing_size="sm",
173
+ )
174
 
175
+ with gr.Blocks(css=demo_css, theme=theme) as demo:
 
176
  with gr.Column(elem_id="col_container"):
177
  with gr.Accordion("", open=False, visible=False):
178
  system_msg = gr.Textbox(value="")
179
  new_msg = gr.Textbox(value="")
180
  accordion_msg = gr.HTML(value="", visible=False)
181
+
182
  chatbot = gr.Chatbot(label='Trek Asistanı', elem_id="chatbot")
183
 
184
+ # Row içinde, metin kutusu ve buton arasındaki boşluğu sıfırlıyoruz.
185
  with gr.Row(elem_id="custom_row"):
186
+ inputs = gr.Textbox(
187
+ placeholder="Buraya yazın",
188
+ show_label=False,
189
+ container=False,
190
+
191
+ )
192
+ # Butonu, genişlemesini engelleyen sabit kapsayıcı içinde yerleştiriyoruz.
193
  with gr.Column(elem_classes="fixed_button_container"):
194
  send_button = gr.Button(value="✈", elem_id="send_button")
195
+
196
  state = gr.State([])
 
 
 
 
197
  with gr.Accordion("", open=False, visible=False):
198
+ top_p = gr.Slider(minimum=0, maximum=1.0, value=0.5,
199
+ step=0.05, interactive=False, visible=False)
200
+ temperature = gr.Slider(minimum=0, maximum=5.0, value=0.1,
201
+ step=0.1, interactive=False, visible=False)
202
  chat_counter = gr.Number(value=0, visible=False, precision=0)
203
 
204
+ # ENTER tuşuyla gönderme işlemi
205
+ inputs.submit(
206
+ predict,
207
+ [system_msg, inputs, top_p, temperature, chat_counter, chatbot, state],
208
+ [chatbot, state, chat_counter]
209
+ )
210
  inputs.submit(reset_textbox, [], [inputs])
211
+
212
+ # Gönder butonuna tıklandığında işlemin gerçekleşmesi
213
+ send_button.click(
214
+ predict,
215
+ [system_msg, inputs, top_p, temperature, chat_counter, chatbot, state],
216
+ [chatbot, state, chat_counter]
217
+ )
218
  send_button.click(reset_textbox, [], [inputs])
219
 
220
  demo.queue(max_size=10).launch(debug=True)