SamiKoen commited on
Commit
3665df9
·
verified ·
1 Parent(s): 207df5b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +28 -19
app.py CHANGED
@@ -3,19 +3,20 @@ import os
3
  import json
4
  import requests
5
  import xml.etree.ElementTree as ET
 
6
 
7
 
8
- # os.getenv("API_URL") + "/generate_stream"
 
9
  API_URL = "https://api.openai.com/v1/chat/completions"
10
  OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
11
 
 
12
  url = 'https://www.trekbisiklet.com.tr/output/8582384479'
13
-
14
  response = requests.get(url)
15
  root = ET.fromstring(response.content)
16
 
17
  products = []
18
-
19
  for item in root.findall('item'):
20
  if item.find('isOptionOfAProduct').text == '1':
21
  if item.find('stockAmount').text > '0':
@@ -28,13 +29,24 @@ for item in root.findall('item'):
28
  # name: ilk kelime (marka), item_info: (stok adedi, fiyat)
29
  products.append((name, item_info, full_name))
30
 
 
 
 
 
 
 
 
 
 
 
 
31
  def predict(system_msg, inputs, top_p, temperature, chat_counter, chatbot=[], history=[]):
32
  headers = {
33
  "Content-Type": "application/json",
34
  "Authorization": f"Bearer {OPENAI_API_KEY}"
35
  }
36
  print(f"system message is ^^ {system_msg}")
37
- initial_message = [{"role": "user", "content": f"{inputs}"},]
38
 
39
  multi_turn_message = [
40
  {"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.."},
@@ -54,7 +66,7 @@ def predict(system_msg, inputs, top_p, temperature, chat_counter, chatbot=[], hi
54
  {"role": "system", "content": "Tüm modellerimizin ağırlıkları: Madone SL 5 Gen 8 8.70 kg, Madone SL 6 Gen 8 8.16 kg, Madone SL 7 Gen 8 7.88 kg, Madone SLR 7 Gen 8 7.30 kg, Madone SLR 7 AXS Gen 8 7.44 kg, Madone SLR 8 AXS Gen 8 7.18 kg, Madone SLR 9 Gen 8 7.00 kg, Madone SLR 9 AXS Gen 8 7.00 kg, Madone SLR 9 Etap Gen 7 7.36 kg, Madone SLR 9 Gen 7 7.10 kg, Madone SLR 7 Etap Gen 7 7.76 kg, Madone SLR 7 Gen 7 7.48 kg, Émonda SLR 9 6.72 kg, Émonda SLR 7 Etap 7.37 kg, Émonda SL 9 7.44 kg, Émonda SLR 7 7.10 kg, Émonda SLR 6 7.35 kg, Émonda SL 7 Etap 7.95 kg, Émonda SL 7 7.95 kg, Émonda SL 6 Pro Di2 8.25 kg, Émonda SL 5 9.15 kg, Émonda ALR 5 9.15 kg, Émonda ALR 4 9.50 kg, Domane SLR 7 Gen 4 7.25 kg, Domane SLR 7 AXS Gen 4 8.48 kg, Domane SL 6 Gen 4 8.90 kg, Domane SL 6 9.30 kg, Domane SL 5 Gen 4 8.93 kg, Domane AL 2 Gen 4 10.55 kg, Domane AL 2 Rim 9.57 kg, Checkmate SLR 7 AXS 9.00 kg, Checkpoint SL 7 AXS Gen 3 9.05 kg, Checkpoint SL 5 AXS Gen 3 9.30 kg, Domane+ SLR 7 AXS 12.40 kg, Speed Concept SLR 9 Etap 8.60 kg, Speed Concept SLR 9 8.70 kg, Speed Concept SLR 7 Etap 9.35 kg, Speed Concept SLR 7 8.97 kg, Fuel EXe 9.8 GX AXS T-Type 18.1 kg, Fuel EXe 9.7 SLX/XT 19.00 kg, Fuel EXe 5 20.8 kg, Rail 9.8 GX AXS T-Type 22.9 kg, Rail 5 21.53 kg, Rail 5 Gen 3 23.53 kg, Powerfly Gen 4 23.37 kg, Marlin+ 8 21.30 kg, Marlin+ 6 22.45 kg, Domane+ SLR 7 AXS 12.40 kg, Dual Sport+ 2 17.41 kg, FX+ 2 18.20 kg, Verve+ 3 24.70 kg, Townie Go 7D EQ Step Thru 20.41 kg, Marlin 8 13.2 kg, Marlin 7 13.77 kg, Marlin 5 13.90 kg, Marlin 4 14.60 kg, Procaliber 9.7 AXS Gen 3 10.58 kg, Procaliber 9.5 Gen 3 11.74 kg, Procaliber 9.5 11.74 kg, Supercaliber SL 9.7 Gen 2 11.98 kg, Fuel EX 8 GX AXS 13.77 kg, FX Sport 6 9.30 kg, FX 3 11.50 kg, FX 2 12.30 kg, DS 3 Gen 5 12.05 kg, DS 3 Gen 4 13.00 kg, DS 2 Gen 5 12.79 kg, Verve 3 Low Step 14.20 kg, Verve 3 14.30 kg"}
55
  ]
56
 
57
- messages = multi_turn_message.copy()
58
 
59
  # Kullanıcı girişindeki kelimeleri küçük harfe çevirip listeye alıyoruz.
60
  input_words = [str(word).lower() for word in inputs.split()]
@@ -110,13 +122,13 @@ def predict(system_msg, inputs, top_p, temperature, chat_counter, chatbot=[], hi
110
  token_counter += 1
111
  yield chat, history, chat_counter, response
112
 
 
 
 
113
  def reset_textbox():
114
  return gr.update(value='')
115
 
116
- # CSS: Butonun sabit, yuvarlak kalması ve sağa doğru hafifçe 2px uzaklaşması için ayarlandı.
117
- # Ek olarak, mobilde giriş alanının genişliğini kısıtlamak için "#input_text" id'sine genişlik ayarı ekledik.
118
-
119
- # CSS: Chatbot yüksekliğini ayarlama ve mevcut CSS'i koruma
120
  demo_css = """
121
  #send_button {
122
  background-color: #0b93f6;
@@ -135,30 +147,29 @@ demo_css = """
135
  #send_button:hover {
136
  background-color: #0077c0;
137
  }
138
- /* Buton kapsayıcısındaki sol margin değerini kaldırıyoruz */
139
  .fixed_button_container {
140
  padding: 0px;
141
- margin: 0px 0 0 0px; /* Sol boşluk kaldırıldı */
142
  }
143
  #custom_row {
144
- width: 150% !important; /* İstediğiniz yüksekliği girin */
145
  flex-wrap: nowrap !important;
146
  }
147
- /* Mobil ekranlar için özel düzenleme */
148
  @media only screen and (max-width: 1000px) {
149
- .custom_row { /* Eğer Row'a bu sınıf atanmışsa */
150
  flex-wrap: nowrap !important;
151
  }
152
  }
153
  #chatbot {
154
- height: 75vh !important; /* Bu, chatbotun yüksekliğini sayfanın tamamına yayacaktır */
155
- overflow-y: auto; /* Bu, dikey kaydırma çubuğunu etkinleştirir */
156
  }
157
  """
158
 
159
  # Tema ayarları
160
  theme = gr.themes.Base(neutral_hue="blue", text_size="sm", spacing_size="sm")
161
 
 
162
  with gr.Blocks(css=demo_css) as demo:
163
  with gr.Column(elem_id="col_container"):
164
  with gr.Accordion("", open=False, visible=False):
@@ -167,7 +178,6 @@ with gr.Blocks(css=demo_css) as demo:
167
  accordion_msg = gr.HTML(value="", visible=False)
168
  chatbot = gr.Chatbot(label='Trek Asistanı', elem_id="chatbot")
169
 
170
- # Row içinde, metin kutusu ve buton arasındaki boşluğu sıfırlıyoruz
171
  with gr.Row(elem_id="custom_row"):
172
  inputs = gr.Textbox(placeholder="Buraya yazın", show_label=False, container=False)
173
  with gr.Column(elem_classes="fixed_button_container"):
@@ -179,10 +189,9 @@ with gr.Blocks(css=demo_css) as demo:
179
  temperature = gr.Slider(minimum=0, maximum=5.0, value=0.1, step=0.1, interactive=False, visible=False)
180
  chat_counter = gr.Number(value=0, visible=False, precision=0)
181
 
182
- # ENTER tuşuyla gönderme işlemi
183
  inputs.submit(predict, [system_msg, inputs, top_p, temperature, chat_counter, chatbot, state], [chatbot, state, chat_counter])
184
  inputs.submit(reset_textbox, [], [inputs])
185
- # Gönder butonuna tıklandığında işlemin gerçekleşmesi
186
  send_button.click(predict, [system_msg, inputs, top_p, temperature, chat_counter, chatbot, state], [chatbot, state, chat_counter])
187
  send_button.click(reset_textbox, [], [inputs])
188
 
 
3
  import json
4
  import requests
5
  import xml.etree.ElementTree as ET
6
+ from datetime import datetime
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
  # name: ilk kelime (marka), item_info: (stok adedi, fiyat)
30
  products.append((name, item_info, full_name))
31
 
32
+ # Sohbet geçmişini kalıcı depolamaya yazan fonksiyon
33
+ def log_chat(history):
34
+ # Hugging Face Spaces persistent storage, genellikle /mnt/data dizininde yer alır
35
+ file_path = "/mnt/data/sohbet_kaydi.json"
36
+ log_entry = {
37
+ "timestamp": datetime.now().isoformat(),
38
+ "chat_history": history
39
+ }
40
+ with open(file_path, "a", encoding="utf-8") as f:
41
+ f.write(json.dumps(log_entry, ensure_ascii=False) + "\n")
42
+
43
  def predict(system_msg, inputs, top_p, temperature, chat_counter, chatbot=[], history=[]):
44
  headers = {
45
  "Content-Type": "application/json",
46
  "Authorization": f"Bearer {OPENAI_API_KEY}"
47
  }
48
  print(f"system message is ^^ {system_msg}")
49
+ initial_message = [{"role": "user", "content": f"{inputs}"}]
50
 
51
  multi_turn_message = [
52
  {"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.."},
 
66
  {"role": "system", "content": "Tüm modellerimizin ağırlıkları: Madone SL 5 Gen 8 8.70 kg, Madone SL 6 Gen 8 8.16 kg, Madone SL 7 Gen 8 7.88 kg, Madone SLR 7 Gen 8 7.30 kg, Madone SLR 7 AXS Gen 8 7.44 kg, Madone SLR 8 AXS Gen 8 7.18 kg, Madone SLR 9 Gen 8 7.00 kg, Madone SLR 9 AXS Gen 8 7.00 kg, Madone SLR 9 Etap Gen 7 7.36 kg, Madone SLR 9 Gen 7 7.10 kg, Madone SLR 7 Etap Gen 7 7.76 kg, Madone SLR 7 Gen 7 7.48 kg, Émonda SLR 9 6.72 kg, Émonda SLR 7 Etap 7.37 kg, Émonda SL 9 7.44 kg, Émonda SLR 7 7.10 kg, Émonda SLR 6 7.35 kg, Émonda SL 7 Etap 7.95 kg, Émonda SL 7 7.95 kg, Émonda SL 6 Pro Di2 8.25 kg, Émonda SL 5 9.15 kg, Émonda ALR 5 9.15 kg, Émonda ALR 4 9.50 kg, Domane SLR 7 Gen 4 7.25 kg, Domane SLR 7 AXS Gen 4 8.48 kg, Domane SL 6 Gen 4 8.90 kg, Domane SL 6 9.30 kg, Domane SL 5 Gen 4 8.93 kg, Domane AL 2 Gen 4 10.55 kg, Domane AL 2 Rim 9.57 kg, Checkmate SLR 7 AXS 9.00 kg, Checkpoint SL 7 AXS Gen 3 9.05 kg, Checkpoint SL 5 AXS Gen 3 9.30 kg, Domane+ SLR 7 AXS 12.40 kg, Speed Concept SLR 9 Etap 8.60 kg, Speed Concept SLR 9 8.70 kg, Speed Concept SLR 7 Etap 9.35 kg, Speed Concept SLR 7 8.97 kg, Fuel EXe 9.8 GX AXS T-Type 18.1 kg, Fuel EXe 9.7 SLX/XT 19.00 kg, Fuel EXe 5 20.8 kg, Rail 9.8 GX AXS T-Type 22.9 kg, Rail 5 21.53 kg, Rail 5 Gen 3 23.53 kg, Powerfly Gen 4 23.37 kg, Marlin+ 8 21.30 kg, Marlin+ 6 22.45 kg, Domane+ SLR 7 AXS 12.40 kg, Dual Sport+ 2 17.41 kg, FX+ 2 18.20 kg, Verve+ 3 24.70 kg, Townie Go 7D EQ Step Thru 20.41 kg, Marlin 8 13.2 kg, Marlin 7 13.77 kg, Marlin 5 13.90 kg, Marlin 4 14.60 kg, Procaliber 9.7 AXS Gen 3 10.58 kg, Procaliber 9.5 Gen 3 11.74 kg, Procaliber 9.5 11.74 kg, Supercaliber SL 9.7 Gen 2 11.98 kg, Fuel EX 8 GX AXS 13.77 kg, FX Sport 6 9.30 kg, FX 3 11.50 kg, FX 2 12.30 kg, DS 3 Gen 5 12.05 kg, DS 3 Gen 4 13.00 kg, DS 2 Gen 5 12.79 kg, Verve 3 Low Step 14.20 kg, Verve 3 14.30 kg"}
67
  ]
68
 
69
+ messages = multi_turn_message.copy()
70
 
71
  # Kullanıcı girişindeki kelimeleri küçük harfe çevirip listeye alıyoruz.
72
  input_words = [str(word).lower() for word in inputs.split()]
 
122
  token_counter += 1
123
  yield chat, history, chat_counter, response
124
 
125
+ # Sohbet akışı tamamlandıktan sonra geçmişi kalıcı depolamaya kaydet
126
+ log_chat(history)
127
+
128
  def reset_textbox():
129
  return gr.update(value='')
130
 
131
+ # CSS ayarları
 
 
 
132
  demo_css = """
133
  #send_button {
134
  background-color: #0b93f6;
 
147
  #send_button:hover {
148
  background-color: #0077c0;
149
  }
 
150
  .fixed_button_container {
151
  padding: 0px;
152
+ margin: 0px 0 0 0px;
153
  }
154
  #custom_row {
155
+ width: 150% !important;
156
  flex-wrap: nowrap !important;
157
  }
 
158
  @media only screen and (max-width: 1000px) {
159
+ .custom_row {
160
  flex-wrap: nowrap !important;
161
  }
162
  }
163
  #chatbot {
164
+ height: 60vh !important;
165
+ overflow-y: auto;
166
  }
167
  """
168
 
169
  # Tema ayarları
170
  theme = gr.themes.Base(neutral_hue="blue", text_size="sm", spacing_size="sm")
171
 
172
+ # Gradio arayüzü
173
  with gr.Blocks(css=demo_css) as demo:
174
  with gr.Column(elem_id="col_container"):
175
  with gr.Accordion("", open=False, visible=False):
 
178
  accordion_msg = gr.HTML(value="", visible=False)
179
  chatbot = gr.Chatbot(label='Trek Asistanı', elem_id="chatbot")
180
 
 
181
  with gr.Row(elem_id="custom_row"):
182
  inputs = gr.Textbox(placeholder="Buraya yazın", show_label=False, container=False)
183
  with gr.Column(elem_classes="fixed_button_container"):
 
189
  temperature = gr.Slider(minimum=0, maximum=5.0, value=0.1, step=0.1, interactive=False, visible=False)
190
  chat_counter = gr.Number(value=0, visible=False, precision=0)
191
 
192
+ # ENTER ile gönderme
193
  inputs.submit(predict, [system_msg, inputs, top_p, temperature, chat_counter, chatbot, state], [chatbot, state, chat_counter])
194
  inputs.submit(reset_textbox, [], [inputs])
 
195
  send_button.click(predict, [system_msg, inputs, top_p, temperature, chat_counter, chatbot, state], [chatbot, state, chat_counter])
196
  send_button.click(reset_textbox, [], [inputs])
197