SamiKoen commited on
Commit
e9d7e5b
·
verified ·
1 Parent(s): c3c477e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +71 -134
app.py CHANGED
@@ -4,16 +4,19 @@ import json
4
  import requests
5
  import xml.etree.ElementTree as ET
6
 
7
- # API URL ve API KEY ayarları
8
  API_URL = "https://api.openai.com/v1/chat/completions"
9
  OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
10
 
11
- # Ürün verilerini çekme işlemi
12
  url = 'https://www.trekbisiklet.com.tr/output/8582384479'
 
13
  response = requests.get(url)
 
 
14
  root = ET.fromstring(response.content)
15
 
16
  products = []
 
17
  for item in root.findall('item'):
18
  if item.find('isOptionOfAProduct').text == '1':
19
  if item.find('stockAmount').text > '0':
@@ -23,31 +26,40 @@ for item in root.findall('item'):
23
  stockAmount = "stokta"
24
  price = item.find('priceWithTax').text
25
  item_info = (stockAmount, price)
26
- # name: ilk kelime (marka), item_info: (stok durumu, fiyat)
27
  products.append((name, item_info, full_name))
28
 
29
 
30
-
31
- # ------------------ Predict Fonksiyonu ------------------ #
32
- def predict(system_msg, inputs, top_p, temperature, chat_counter, chatbot=[], history=[], session_id=""):
33
  headers = {
34
  "Content-Type": "application/json",
35
  "Authorization": f"Bearer {OPENAI_API_KEY}"
36
  }
37
  print(f"system message is ^^ {system_msg}")
38
- initial_message = [{"role": "user", "content": f"{inputs}"}]
39
-
40
- multi_turn_message = [
41
- {"role": "system", "content": "Sen bir Bıke Finder asistanısın. Görevin insanların doğru bisiklet modeli seçimini sağlamak. Kişilere sorucağın bir takım sorularala, kişileri tanıyıp, onlara stoklarımızda bulunan bisikletlerin model, boylarını tavsiye edeceksin."},
42
- {"role": "system", "content": "Merhaba, ben Trek Stok Danısmanı Asistanıyım! Size en uygun Trek bisiklet modelini belirleyebilmem için birkaç sorum olacak. Verdiğiniz bilgiler doğrultusunda, elimizdeki güncel stoklardan ihtiyaçlarınıza en uygun modeli seçip, satin alma sürecine yonlendirecegim. Unutmayin, tum Trek bisikletlerimiz omur boyu garantilidir! Adim 1: Bisiklet Kategorisi - Hangi tur Trek bisikletiyle ilgileniyorsunuz? Lutfen asagidaki seceneklerden birini belirtiniz: Yol Bisikleti ornek: Trek Emonda, Trek Domane; Dag Bisikleti ornek: Trek Fuel EX, Trek Remedy, Trek Procaliber; Hibrit Sehir Bisikleti; Gravel Bisikleti ornek: Trek Checkpoint; Elektrikli Bisikleti ornek: Trek Powerfly, Trek Allant+."},
43
- {"role": "system", "content": "Adim 2: Kullanim Amaci - Bisikletinizi hangi amaclarla kullanmayi planliyorsunuz? ornek: gunluk ulasim, spor, uzun mesafe turlari, yaris, offroad maceralari, dag yollari. Adim 3: Beklentiler - Trek bisikletinizde hangi ozellikler sizin icin en onemli? ornek: performans, konfor, dayaniklilik, teknoloji yenilik, estetk, diger. Adim 4: Zemin Kosullari - Bisikletinizi hangi zeminlerde kullanacaksiniz? ornek: sehir ici asfalt, hafif engebeli parkurlar, orman dogal parkurlar, zorlu dag yollari offroad, karisik kullanim. Adim 5: Fiziksel Olculer - Dogru model ve cerceve boyutunu belirleyebilmem icin lutfen boyunuzu ve ic bacak boyunuzu paylasir misiniz? ornek: Boyum 180 cm, ic bacak boyum 85 cm. Adim 6: Ek Tercihler - Ek olarak, bisikletinizde tercih ettiginiz baska ozellikler var mi? ornek: ekstra donanim, ozel renk, aksesuar tercihi veya butce araliginiz. Adim 7: Oneri ve Satisa Yonlendirme - Verdigimiz bilgiler dogrultusunda, stoklarimizda bulunan ve ihtiyaclariniza en uygun olan Onerilen Model modelini oneriyorum. Bu model, kisa teknik ozellikler, kullanim avantajlari ve hedeflenen zemin alan ile beklentilerinize hitap ediyor. Ustelik, tum Trek bisikletlerimiz omur boyu garantilidir! Su an stok durumumuz: Stokta mevcut, Sinirli stok. Urun detaylari ve satin alma islemi icin lutfen su linke tiklayin: Trek Onerilen Model Urun Sayfasi https:orneksite.comtrek-ornek-model. Kargo ve Teslimat - Siparisiniz odeme onayindan sonra en gec 24 saat icinde paketlenip kargoya verilir; Yuritici Kargo, MNG veya Aras Kargo ile gonderim yapilir. Kargo takip numarasi SMS ve eposta ile iletilecek; gonderim sureci 3-5 is gunu surer. Belirli tutar uzerindeki siparislerde ucretsiz kargo kampanyasi uygulanir."},
44
- {"role": "system", "content": "Stokları ve fiyatları https://www.trekbisiklet.com.tr den bakacaksın, diğer markalarla ilgigi soru gelirse kibarca cevaplayamayacağını ve trek in neden farklı olduğunu anlat. Yol bisikletlerinde Türkiye stoklarımızda, Madone, Domane, Emonda, CheckMate, CheckPoint ve SpeedConcept modelleri bulunuyor. Dağ bisikletlerinde ise Marlin, Procaliber, Supercaliber modeller, full amortisörlülerde ise Fuel Ex modeli bulunmakta. Şehir kullanımı için FX ve DS modelini stoklarda bulunduruyoruz."}
45
- ]
46
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  messages = multi_turn_message
48
- input_words = [str(word).lower() for word in inputs.split()]
 
 
49
 
50
  for product_info in products:
 
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)
@@ -55,174 +67,99 @@ def predict(system_msg, inputs, top_p, temperature, chat_counter, chatbot=[], hi
55
  messages.append(product_msg)
56
 
57
  for data in chatbot:
58
- user = {"role": "user", "content": data[0]}
59
- assistant = {"role": "assistant", "content": data[1]}
 
 
 
 
60
  messages.append(user)
61
  messages.append(assistant)
62
-
63
- messages.append({"role": "user", "content": inputs})
 
 
64
 
65
- # o3-mini modeli için payload'i güncelledik.
66
- # Eğer o3-mini modeli streaming desteklemiyorsa "stream": False yapıyoruz.
67
- payload = {
68
- "model": "gpt-4o",
69
- "messages": messages,
70
- "temperature": 0.7,
71
- "top_p": 0.9,
72
- "n": 1,
73
- "stream": False,
74
- "presence_penalty": 0,
75
- "frequency_penalty": 0,
76
- }
77
 
78
  chat_counter += 1
 
79
  history.append(inputs)
80
  print(f"Logging : payload is - {payload}")
81
 
82
- response = requests.post(API_URL, headers=headers, json=payload, stream=payload["stream"])
 
83
  print(f"Logging : response code - {response}")
84
-
85
  token_counter = 0
86
  partial_words = ""
 
87
  counter = 0
88
  for chunk in response.iter_lines():
 
89
  if counter == 0:
90
  counter += 1
91
  continue
 
92
  if chunk.decode():
93
  chunk = chunk.decode()
 
94
  if len(chunk) > 12 and "content" in json.loads(chunk[6:])['choices'][0]['delta']:
95
- partial_words += json.loads(chunk[6:])['choices'][0]["delta"]["content"]
 
96
  if token_counter == 0:
97
  history.append(" " + partial_words)
98
  else:
99
  history[-1] = partial_words
100
- chat = [(history[i], history[i + 1]) for i in range(0, len(history) - 1, 2)]
 
101
  token_counter += 1
102
- save_session(session_id, history)
103
  yield chat, history, chat_counter, response
104
 
 
105
  def reset_textbox():
106
  return gr.update(value='')
107
 
 
108
  def set_visible_false():
109
  return gr.update(visible=False)
110
 
 
111
  def set_visible_true():
112
  return gr.update(visible=False)
113
 
114
- # Yeni jenerasyon, okunaklı ve modern tasarım için özel CSS
115
- css = """
116
- /* Chat Başlığı: Temiz ve modern görünüm */
117
- .chat-header {
118
- background-color: #ffffff;
119
- color: #333;
120
- padding: 15px;
121
- text-align: center;
122
- font-size: 22px;
123
- font-weight: 600;
124
- border-bottom: 1px solid #e0e0e0;
125
- }
126
-
127
- /* Chat penceresi: Açık ve ferah arka plan */
128
- #chatbot {
129
- background-color: #fafafa;
130
- border: none;
131
- padding: 15px;
132
- }
133
-
134
- /* Kullanıcı mesajı: Açık mavi ton, modern görünüm */
135
- .chat-bubble.user {
136
- background-color: #e1f5fe;
137
- align-self: flex-end;
138
- border-radius: 16px;
139
- padding: 12px 18px;
140
- margin: 8px 0;
141
- max-width: 70%;
142
- box-shadow: 0px 1px 3px rgba(0,0,0,0.1);
143
- font-size: 16px;
144
- color: #333;
145
- }
146
-
147
- /* Bot mesajı: Beyaz, hafif gri kenarlık, modern görünüm */
148
- .chat-bubble.bot {
149
- background-color: #ffffff;
150
- align-self: flex-start;
151
- border: 1px solid #e0e0e0;
152
- border-radius: 16px;
153
- padding: 12px 18px;
154
- margin: 8px 0;
155
- max-width: 70%;
156
- box-shadow: 0px 1px 3px rgba(0,0,0,0.1);
157
- font-size: 16px;
158
- color: #333;
159
- }
160
-
161
- /* Mesaj gönderme alanı: Temiz ve modern */
162
- .chat-input-container {
163
- display: flex;
164
- padding: 15px;
165
- border-top: 1px solid #e0e0e0;
166
- background-color: #ffffff;
167
- }
168
-
169
- /* Chat input alanı */
170
- .chat-input {
171
- flex: 1;
172
- padding: 10px 15px;
173
- border: 1px solid #ddd;
174
- border-radius: 20px;
175
- font-size: 16px;
176
- outline: none;
177
- }
178
-
179
- /* Gönder butonu: Modern mavi ton */
180
- .send-button {
181
- background-color: #1976d2;
182
- border: none;
183
- color: #fff;
184
- padding: 10px 20px;
185
- margin-left: 10px;
186
- border-radius: 20px;
187
- font-size: 16px;
188
- cursor: pointer;
189
- }
190
- """
191
-
192
- # Tema ayarını güncelliyoruz: modern ve temiz görünüm için neutral_hue "blue"
193
  theme = gr.themes.Base(
194
  neutral_hue="blue",
195
  text_size="sm",
196
  spacing_size="sm",
197
  )
198
 
199
-
200
-
201
- with gr.Blocks(theme=theme, css=css) as demo:
202
- gr.Markdown("<div class='chat-header'>Trek Bike Finder Chatbot</div>")
203
-
204
  with gr.Column(elem_id="col_container"):
205
  with gr.Accordion("", open=False, visible=False):
206
  system_msg = gr.Textbox(value="")
207
  new_msg = gr.Textbox(value="")
208
  accordion_msg = gr.HTML(value="", visible=False)
209
- chatbot = gr.Chatbot(label='Trek Bike Finder', elem_id="chatbot")
210
  inputs = gr.Textbox(
211
- placeholder="Buraya yazın, istediğiniz modeli beraber bulalım.", show_label=False)
212
- # Oturum geçmişini session_id üzerinden yüklüyoruz.
213
- state = gr.State(load_session(session_id_value))
214
- # Gizli session ID
215
- session_id = gr.Textbox(value=session_id_value, visible=False, label="Session ID")
216
  with gr.Accordion("", open=False, visible=False):
217
- top_p = gr.Slider(minimum=0, maximum=1.0, value=0.5, step=0.05, interactive=False, visible=False)
218
- temperature = gr.Slider(minimum=0, maximum=5.0, value=0.1, step=0.1, interactive=False, visible=False)
 
 
219
  chat_counter = gr.Number(value=0, visible=False, precision=0)
220
 
221
- inputs.submit(
222
- predict,
223
- [system_msg, inputs, top_p, temperature, chat_counter, chatbot, state, session_id],
224
- [chatbot, state, chat_counter]
225
- )
226
  inputs.submit(reset_textbox, [], [inputs])
227
 
228
- demo.queue(max_size=10).launch(debug=True)
 
 
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
+
15
+
16
  root = ET.fromstring(response.content)
17
 
18
  products = []
19
+
20
  for item in root.findall('item'):
21
  if item.find('isOptionOfAProduct').text == '1':
22
  if item.find('stockAmount').text > '0':
 
26
  stockAmount = "stokta"
27
  price = item.find('priceWithTax').text
28
  item_info = (stockAmount, price)
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",
36
  "Authorization": f"Bearer {OPENAI_API_KEY}"
37
  }
38
  print(f"system message is ^^ {system_msg}")
39
+ initial_message = [{"role": "user", "content": f"{inputs}"},]
 
 
 
 
 
 
 
40
 
41
+ multi_turn_message = [{"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, 09.00-19.00 saatleri arasında açık. Caddebostan mağazası haftanın her günü açık, Pazar günleri 12.00-19.00 saatleri arasında hizmet veriyor. Salı günleri Caddebostan mağazamızda Retul firmasının bikefit makinesi ile Bike-Fit hizmeti veriliyor. Bike fit ücreti 1400 TL ve süresi 60-90 dakika. 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 09.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.."},
42
+ {"role": "system", "content": "Dağ bisikletleri modelleri: Marlin, Roscoe, Procaliber, Supercaliber, Fuel Ex. Şehit bisikletleri: FX ve DS (Dual Sport). Elektrikli Bisiklet modelleri: Powerfly, Powerfly FS, Rail, Fuel Exe, Domane SLR +, Verve +, Townie +, Fx +, DS +. Dağ bisikletlerinin boyları XXS, XS, S, M, ML, L, XL'dir. Canlı sohbet için sitemizdeki YEŞİL düğmeye basabilirsiniz. Web adresimiz: https://www.alatin.com.tr. Bayi bilgileri için https://www.alatin.com.tr/sayfa/bayilerimiz/ adresine bakabilirsiniz."},
43
+ {"role": "system", "content": "Başka marka bisikletleri önermeyeceksin. Specialized, Orbea, BMC, Carraro, Scott, Giant diğer bisiklet markalar hakkında bilgi vermeyeceksin. Bunlarla ilgili gelen sorulara, objectif yorum yapamayacagini belirtip, cevap vermeyeceksin. Trek bu kadrolara ömür boyu garanti veriyor. "},
44
+ {"role": "system", "content": "Bisiklet aksesuar ve yedek parçalarının marka adı Bontrager dir. Bryton marka yol bilgisayarını da ithal ediyoruz. Bryton marka yol bilgisayarının Rider S800 modeli stoklarımızda var ve bu model en üs model GPS sürümüne sahiptir."},
45
+ {"role": "system", "content": "Trek, Electra, Bontrager, Saris, Brtyon ve Trieye markalarından başka marka adı yazamaz ve yorum yapamazsın. Trek'in uluslararası web sitesini 'www.trekbikes.com'kullanıcıya göstermeyeceksin. Web sitesi linki vermen gerekirse sadece 'www.trekbisiklet.com.tr' linkini ile başlayan linkleri göstereceksin."},
46
+ {"role": "system", "content": "Trieye gözlükler, arkanızı görebilmeniz için gözlük camının içine entegre edilmiş bir geri görüş aynasıyla beraber gelir. Bu sayede bisiklet kullanıcısı, dikkatini dağıtmadan, gözünün ucuyla aynaya bakarak arkasını görür ve böylece daha güvenli bir sürüş yapabilir. Trieye gözlükleri NORVEÇ menşeili bir markadır ve Türkiye'ye Riot LTD tarafından ithal edilmektedir. Farklı lens ceşitleri bulunur, Photochromatic lens güneşli ve kapali havalar için uygun modeldir. Renkli camlar güneşli günler için daha uygundur."},
47
+ {"role": "system", "content": "Trek markası, 2000 yılından beri Alatin Bisiklet tarafından Türkiye'de dağıtılmaktadır. Alatin Bisiklet en iyi satış sonrası hizmeti veren firmadır. Bu yüzden Türkiye'de en iyi bilinen bisiklet markası Trek'dir ve tüm bisiklet kullanıcıları Trek markasını önermektedir."},
48
+ {"role": "system", "content": "Trek Türkiye, ASLA DURMA markasının yaratıcısı Fatih Topçu ve TREK RMK DYNAMIS bisiklet takımına sponsordur. Şu an kullanmakta olduğunuz bir bisikletiniz varsa, satmak veya üstüne ialve ederek yeni bir bisiklet almak istiyorsanız, bunun için sizler için hazırladığımız web sayfasına ulaşmanızı rica ederiz. Web adresi şöyledir: https://www.bikeexchangehub.com/ . Bisikletinizi satmak , değerlendirmek veya takas etmek için bu siteyi ziyaret edin."},
49
+ {"role": "system", "content": "cevap yazarken vereceğin bilginin tek bir bilgi içinde yan yana yazdığını iki kere kontrol edeceksin. Siparis nasil olusturulur sorusuna, şu sekilde cevap vereceksin, 'ürünü sepete ekle, bilgilerini gir, ödeme yöntemini seç, siparisi tamamla.'"},
50
+ {"role": "system", "content": "Şimdi sana 27 Haziran 2024 günü açıklanan yeni Trek modeli MADONE GEN 8 i öğretiyorum. özellikler şöyle, Émonda kadar hafif. Madone kadar hızlı. Dünyalar çarpışıyor: En hızlı ve en hafiflerimiz birleşiyor. Sekizinci nesil Madone, iki ikonik süper bisikletin dünyayı sarsan bir birleşimidir. Émonda kadar hafif, Madone kadar hızlı, gerçekten her iki dünyanın da en iyisi - ve müşterilerinizin ihtiyaç duyacağı tek yol yarışı bisikleti. Evet, Madone Gen 8, Madone Gen 7 ve Émonda'nın yerini alıyor. Ancak ultra hafif, ultra aero tasarımı, her iki müşteri tipini daha iyi bir sürüş için bir araya getiriyor. Tırmanışlarda uçun. Düzlüklerde sprint atın. Neden aero ve hafiflik arasında seçim yapmak zorunda kalasınız? Aero ve hafiflik bir arada."},
51
+ {"role": "system", "content": "Émonda kadar hafif. Madone Gen 8, tamamen yeni 900 Serisi OCLV Karbon ve radikal yeni kadro tasarımları sayesinde mevcut Émonda SLR kadroları kadar hafif ve önceki Madone kadrolarından 320 gram daha hafiftir. Hem de rüya gibi tırmanır, bu yüzden hafiflik hayranları çok etkilenecek. Madone Gen 7 kadar hızlı. Madone Gen 8, Émonda'dan saatte 77 saniye daha hızlıdır ve hızın nasıl göründüğünü yeniden tanımlayan yeni Full System Foil aero şekilleriyle önceki Madone kadar hızlıdır. Ayrıca, yeni RSL Aero suluklar ve Kafesler (Madone SLR ile birlikte verilir) tüm sistemini her bisiklette daha hızlı hale getirmeye yardımcı olur. Daha hafif ve daha konforlu IsoFlow teknolojisi. Madone Gen 8'in güncellenmiş IsoFlow teknolojisi eskisinden daha hafif ve dikey olarak %80'e kadar daha uyumludur, yol titreşimlerini emerek sürücülerin daha uzun süre daha güçlü sürüş yapmasını sağlar. Yeni daha hafif ve daha ergonomik gidon. Madone SLR modelleri, son derece hafif OCLV Karbondan üretilen güncellenmiş Aero RSL Yol Entegre gidonu, ultra hızlı aero şekilleri ile sürücüleri en üst aero pozisyonuna getirir. En iyi fiyata en iyi yarış bisikleti. Tamamen yeni Madone SL, SLR modeliyle aynı devrim niteliğindeki kadro teknolojisini paylaşıyor, ancak daha ekonomik 500 Serisi OCLV Karbon ve iki parçalı gidon/boğaz kombinasyonları ile maliyetleri düşürüyor. SL modelleri ayrıca mekanik vites uyumludur. Aero ve Hafiflik arasında seçim yapmanıza gerek yok. Artık hızlı ve hafif, sprint veya tırmanış arasında seçim yapmak zorunda değil. Madone Gen 8 ile Émonda müşterileri daha da aerodinamik bir sürüşe, Madone müşterileri ise her zamankinden daha hızlı tırmanmalarına yardımcı olan ultra hafif bir bisiklete sahip oluyor."},
52
+ {"role": "system", "content": "Sen aynı zamanda bir Bıke Finder asistanısın. Görevin insanların doğru bisiklet modeli seçimini sağlamak. Kişilere sorucağın bir takım sorularala, kişileri tanıyıp, onlara stoklarımızda bulunan bisikletlerin model, boylarını tavsiye edeceksin. "} ,
53
+ {"role": "system", "content": "Size en uygun Trek bisiklet modelini belirleyebilmem için birkaç sorum olacak. Verdiğiniz bilgiler doğrultusunda, elimizdeki güncel stoklardan ihtiyaçlarınıza en uygun modeli seçip, satin alma sürecine yonlendirecegim. Unutmayin, tum Trek bisikletlerimiz omur boyu garantilidir! Adim 1: Bisiklet Kategorisi - Hangi tur Trek bisikletiyle ilgileniyorsunuz? Lutfen asagidaki seceneklerden birini belirtiniz: Yol Bisikleti ornek: Trek Emonda, Trek Domane; Dag Bisikleti ornek: Trek Fuel EX, Trek Remedy, Trek Procaliber; Hibrit Sehir Bisikleti; Gravel Bisikleti ornek: Trek Checkpoint; Elektrikli Bisikleti ornek: Trek Powerfly, Trek Allant+. Adim 2: Kullanim Amaci - Bisikletinizi hangi amaclarla kullanmayi planliyorsunuz? ornek: gunluk ulasim, spor, uzun mesafe turlari, yaris, offroad maceralari, dag yollari. Adim 3: Beklentiler - Trek bisikletinizde hangi ozellikler sizin icin en onemli? ornek: performans, konfor, dayaniklilik, teknoloji yenilik, estetk, diger. Adim 4: Zemin Kosullari - Bisikletinizi hangi zeminlerde kullanacaksiniz? ornek: sehir ici asfalt, hafif engebeli parkurlar, orman dogal parkurlar, zorlu dag yollari offroad, karisik kullanim. Adim 5: Fiziksel Olculer - Dogru model ve cerceve boyutunu belirleyebilmem icin lutfen boyunuzu ve ic bacak boyunuzu paylasir misiniz? ornek: Boyum 180 cm, ic bacak boyum 85 cm. Adim 6: Ek Tercihler - Ek olarak, bisikletinizde tercih ettiginiz baska ozellikler var mi? ornek: ekstra donanim, ozel renk, aksesuar tercihi veya butce araliginiz. Adim 7: Oneri ve Satisa Yonlendirme - Verdigimiz bilgiler dogrultusunda, stoklarimizda bulunan ve ihtiyaclariniza en uygun olan Onerilen Model modelini oneriyorum. Bu model, kisa teknik ozellikler, kullanim avantajlari ve hedeflenen zemin alan ile beklentilerinize hitap ediyor. Ustelik, tum Trek bisikletlerimiz omur boyu garantilidir! Su an stok durumumuz: Stokta mevcut, Sinirli stok. Urun detaylari ve satin alma islemi icin lutfen su linke tiklayin: Trek Onerilen Model Urun Sayfasi https:orneksite.comtrek-ornek-model. Kargo ve Teslimat - Siparisiniz odeme onayindan sonra en gec 24 saat icinde paketlenip kargoya verilir; Yuritici Kargo, MNG veya Aras Kargo ile gonderim yapilir. Kargo takip numarasi SMS ve eposta ile iletilecek; gonderim sureci 3-5 is gunu surer. Belirli tutar uzerindeki siparislerde ucretsiz kargo kampanyasi uygulanir. Lutfen yukaridaki linke tiklayarak satin alma isleminizi tamamlayin. Herhangi bir sorunuz veya ek isteginiz olursa, ben buradayim. Hadi, siparisinizi tamamlayalim ve maceraya baslayalim!"} ,
54
+ {"role": "system", "content": "Stokları ve fiyatları https://www.trekbisiklet.com.tr den bakacaksın, diğer markalarla ilgigi soru gelirse kibarca cevaplayamayacağını ve trek in neden farklı olduğunu anlat. Yol bisikletlerinde Türkiye stoklarımızda, Madone, Domane, Emonda, CheckMate, CheckPoint ve SpeedConcept modelleri bulunuyor. Dağ bisikletlerinde ise Marlin, Procaliber, Supercaliber modeller, full amortisörlülerde ise Fuel Ex modeli bulunmakta. Şehir kullanımı için FX ve DS modelini stoklarda bulunduruyoruz. "} ]
55
+
56
  messages = multi_turn_message
57
+ input_words = []
58
+ for input in inputs.split():
59
+ input_words.append(str(input).lower())
60
 
61
  for product_info in products:
62
+
63
  if product_info[0] in input_words:
64
  new_msg = f"{product_info[2]} {product_info[1][0]} ve fiyatı EURO {product_info[1][1]}"
65
  print(new_msg)
 
67
  messages.append(product_msg)
68
 
69
  for data in chatbot:
70
+ user = {}
71
+ user["role"] = "user"
72
+ user["content"] = data[0]
73
+ assistant = {}
74
+ assistant["role"] = "assistant"
75
+ assistant["content"] = data[1]
76
  messages.append(user)
77
  messages.append(assistant)
78
+ temp = {}
79
+ temp["role"] = "user"
80
+ temp["content"] = inputs
81
+ messages.append(temp)
82
 
83
+
84
+ payload = {"model": "gpt-4o", "messages": messages, "temperature": 0.7,
85
+ "top_p": 0.9, "n": 1, "stream": True, "presence_penalty": 0, "frequency_penalty": 0,}
 
 
 
 
 
 
 
 
 
86
 
87
  chat_counter += 1
88
+
89
  history.append(inputs)
90
  print(f"Logging : payload is - {payload}")
91
 
92
+ response = requests.post(API_URL, headers=headers,
93
+ json=payload, stream=True)
94
  print(f"Logging : response code - {response}")
 
95
  token_counter = 0
96
  partial_words = ""
97
+
98
  counter = 0
99
  for chunk in response.iter_lines():
100
+
101
  if counter == 0:
102
  counter += 1
103
  continue
104
+
105
  if chunk.decode():
106
  chunk = chunk.decode()
107
+
108
  if len(chunk) > 12 and "content" in json.loads(chunk[6:])['choices'][0]['delta']:
109
+ partial_words = partial_words + \
110
+ json.loads(chunk[6:])['choices'][0]["delta"]["content"]
111
  if token_counter == 0:
112
  history.append(" " + partial_words)
113
  else:
114
  history[-1] = partial_words
115
+ chat = [(history[i], history[i + 1]) for i in range(0,
116
+ len(history) - 1, 2)] # convert to tuples of list
117
  token_counter += 1
118
+ # resembles {chatbot: chat, state: history}
119
  yield chat, history, chat_counter, response
120
 
121
+
122
  def reset_textbox():
123
  return gr.update(value='')
124
 
125
+
126
  def set_visible_false():
127
  return gr.update(visible=False)
128
 
129
+
130
  def set_visible_true():
131
  return gr.update(visible=False)
132
 
133
+
134
+ theme_addon_msg = ""
135
+ system_msg_info = ""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
136
  theme = gr.themes.Base(
137
  neutral_hue="blue",
138
  text_size="sm",
139
  spacing_size="sm",
140
  )
141
 
142
+ with gr.Blocks(theme=theme) as demo:
143
+ ...
144
+ ...
 
 
145
  with gr.Column(elem_id="col_container"):
146
  with gr.Accordion("", open=False, visible=False):
147
  system_msg = gr.Textbox(value="")
148
  new_msg = gr.Textbox(value="")
149
  accordion_msg = gr.HTML(value="", visible=False)
150
+ chatbot = gr.Chatbot(label='Trek Asistanı', elem_id="chatbot")
151
  inputs = gr.Textbox(
152
+ placeholder="Buraya yazın, yanıtlayalım.", show_label=False)
153
+ state = gr.State([])
 
 
 
154
  with gr.Accordion("", open=False, visible=False):
155
+ top_p = gr.Slider(minimum=-0, maximum=1.0, value=0.5,
156
+ step=0.05, interactive=False, visible=False)
157
+ temperature = gr.Slider(
158
+ minimum=-0, maximum=5.0, value=0.1, step=0.1, interactive=False, visible=False)
159
  chat_counter = gr.Number(value=0, visible=False, precision=0)
160
 
161
+ inputs.submit(predict, [system_msg, inputs, top_p, temperature, chat_counter, chatbot, state], [chatbot, state, chat_counter])
 
 
 
 
162
  inputs.submit(reset_textbox, [], [inputs])
163
 
164
+
165
+ demo.queue(max_size=10).launch(debug=True)