CSAle commited on
Commit
d2f126b
1 Parent(s): e27a3fb

Releasing RubiChat App

Browse files
Files changed (6) hide show
  1. .gitignore +4 -0
  2. Dockerfile +11 -0
  3. app.py +89 -0
  4. chainlit.md +11 -0
  5. data/Rubilabs.html +435 -0
  6. requirements.txt +7 -0
.gitignore ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ .env
2
+ __pycache__
3
+ cache
4
+ .chainlit
Dockerfile ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.9
2
+ RUN useradd -m -u 1000 user
3
+ USER user
4
+ ENV HOME=/home/user \
5
+ PATH=/home/user/.local/bin:$PATH
6
+ WORKDIR $HOME/app
7
+ COPY --chown=user . $HOME/app
8
+ COPY ./requirements.txt ~/app/requirements.txt
9
+ RUN pip install -r requirements.txt
10
+ COPY . .
11
+ CMD ["chainlit", "run", "app.py", "--port", "7860"]
app.py ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import chainlit as cl
2
+ from langchain.embeddings.openai import OpenAIEmbeddings
3
+ from langchain.document_loaders import BSHTMLLoader
4
+ from langchain.embeddings import CacheBackedEmbeddings
5
+ from langchain.text_splitter import RecursiveCharacterTextSplitter
6
+ from langchain.vectorstores import FAISS
7
+ from langchain.chains import RetrievalQA
8
+ from langchain.chat_models import ChatOpenAI
9
+ from langchain.storage import LocalFileStore
10
+ from langchain.prompts.chat import (
11
+ ChatPromptTemplate,
12
+ SystemMessagePromptTemplate,
13
+ HumanMessagePromptTemplate,
14
+ )
15
+ import chainlit as cl
16
+
17
+ text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
18
+
19
+ system_template = """
20
+ Use the following pieces of context to answer the users question.
21
+ If you don't know the answer, just say that you don't know, don't try to make up an answer.
22
+ ALWAYS return a "SOURCES" part in your answer.
23
+ The "SOURCES" part should be a reference to the source of the document from which you got your answer.
24
+
25
+ Example of your response should be:
26
+
27
+ ```
28
+ The answer is foo
29
+ SOURCES: xyz
30
+ ```
31
+
32
+ Begin!
33
+ ----------------
34
+ {context}"""
35
+
36
+ messages = [
37
+ SystemMessagePromptTemplate.from_template(system_template),
38
+ HumanMessagePromptTemplate.from_template("{question}"),
39
+ ]
40
+ prompt = ChatPromptTemplate(messages=messages)
41
+ chain_type_kwargs = {"prompt": prompt}
42
+
43
+
44
+ @cl.on_chat_start
45
+ async def init():
46
+ msg = cl.Message(content=f"Building Index...")
47
+ await msg.send()
48
+
49
+ # build FAISS index from csv
50
+ loader = BSHTMLLoader(file_path="./data/Rubilabs.html")
51
+ data = loader.load()
52
+ documents = text_splitter.transform_documents(data)
53
+ store = LocalFileStore("./cache/")
54
+ core_embeddings_model = OpenAIEmbeddings()
55
+ embedder = CacheBackedEmbeddings.from_bytes_store(
56
+ core_embeddings_model, store, namespace=core_embeddings_model.model
57
+ )
58
+ # make async docsearch
59
+ docsearch = await cl.make_async(FAISS.from_documents)(documents, embedder)
60
+
61
+ chain = RetrievalQA.from_chain_type(
62
+ ChatOpenAI(model="gpt-3.5-turbo", temperature=0, streaming=True),
63
+ chain_type="stuff",
64
+ return_source_documents=True,
65
+ retriever=docsearch.as_retriever(),
66
+ chain_type_kwargs=chain_type_kwargs,
67
+ )
68
+
69
+ msg.content = f"Index built!"
70
+ await msg.send()
71
+
72
+ cl.user_session.set("chain", chain)
73
+
74
+
75
+ @cl.on_message
76
+ async def main(message):
77
+ chain = cl.user_session.get("chain")
78
+ cb = cl.AsyncLangchainCallbackHandler(
79
+ stream_final_answer=True, answer_prefix_tokens=["FINAL", "ANSWER"]
80
+ )
81
+ cb.answer_reached = True
82
+ res = await chain.acall(message, callbacks=[cb])
83
+
84
+ answer = res["result"]
85
+
86
+ if cb.has_streamed_final_answer:
87
+ await cb.final_stream.update()
88
+ else:
89
+ await cl.Message(content=answer).send()
chainlit.md ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Assignment Part 2: Deploying Your Model to a Hugging Face Space
2
+
3
+ Now that you've done the hard work of setting up the RetrievalQA chain and sourcing your documents - let's tie it together in a ChainLit application.
4
+
5
+ ### Duplicating the Space
6
+
7
+ Since this is our first assignment, all you'll need to do is duplicate this space and add your own `OPENAI_API_KEY` as a secret in the space.
8
+
9
+ ### Conclusion
10
+
11
+ Now that you've shipped an LLM-powered application, it's time to share! 🚀
data/Rubilabs.html ADDED
@@ -0,0 +1,435 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <!-- saved from url=(0021)https://rubilabs.com/ -->
3
+ <html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4
+ <style>
5
+ .chat-widget {
6
+ position: fixed;
7
+ bottom: 30px;
8
+ right: 30px;
9
+ width: 60px;
10
+ height: 60px;
11
+ border-radius: 50%;
12
+ background-color: #145e5a;
13
+ display: flex;
14
+ justify-content: center;
15
+ align-items: center;
16
+ cursor: pointer;
17
+ box-shadow: 0 3px 6px rgba(0, 0, 0, .16), 0 3px 6px rgba(0, 0, 0, .23);
18
+ z-index: 1000
19
+ }
20
+
21
+ .chat-widget img {
22
+ width: 32px;
23
+ height: 32px;
24
+ padding: 4px
25
+ }
26
+
27
+ .chat-iframe-container {
28
+ position: fixed;
29
+ bottom: 100px;
30
+ right: 30px;
31
+ width: 400px;
32
+ height: 500px;
33
+ border: 1px solid #ccc;
34
+ border-radius: 10px;
35
+ padding: 10px;
36
+ box-shadow: 0 3px 6px rgba(0, 0, 0, .16), 0 3px 6px rgba(0, 0, 0, .23);
37
+ z-index: 1000;
38
+ display: none
39
+ }
40
+
41
+ .chat-iframe-container iframe {
42
+ width: 100%;
43
+ height: 100%;
44
+ border: none
45
+ }
46
+
47
+ .close-button {
48
+ position: absolute;
49
+ top: -12px;
50
+ right: -12px;
51
+ width: 24px;
52
+ height: 24px;
53
+ border-radius: 50%;
54
+ background-color: #145e5a;
55
+ color: #fff;
56
+ display: flex;
57
+ justify-content: center;
58
+ align-items: center;
59
+ cursor: pointer;
60
+ font-size: 18px;
61
+ font-weight: bold;
62
+ box-shadow: 0 3px 6px rgba(0, 0, 0, .16), 0 3px 6px rgba(0, 0, 0, .23)
63
+ }
64
+
65
+ @media (max-width:767px) {
66
+ .chat-iframe-container {
67
+ width: 90%;
68
+ height: 80%;
69
+ bottom: 10px;
70
+ right: 5%;
71
+ padding: 5px
72
+ }
73
+ }
74
+ </style>
75
+ <script>
76
+ document.addEventListener("DOMContentLoaded", function () {
77
+ var chatWidget = document.createElement("div");
78
+ chatWidget.id = "chatWidget";
79
+ chatWidget.className = "chat-widget";
80
+ chatWidget.innerHTML = '<img src="//s3.amazonaws.com/appforest_uf/f1680870188261x782123797109605800/bubble2.png" alt="Chat">';
81
+ var chatIframeContainer = document.createElement("div");
82
+ chatIframeContainer.id = "chatIframeContainer";
83
+ chatIframeContainer.className = "chat-iframe-container";
84
+ chatIframeContainer.innerHTML = '<div class="close-button" id="closeButton">×</div><iframe src="https://app.chatiq.ai/chatbot3d/mikesmart/English" name="myiFrame" scrolling="yes"></iframe>';
85
+ document.body.appendChild(chatWidget);
86
+ document.body.appendChild(chatIframeContainer);
87
+ document.getElementById('chatWidget').addEventListener('click', function () {
88
+ document.getElementById('chatIframeContainer').style.display = 'block';
89
+ });
90
+ document.getElementById('closeButton').addEventListener('click', function () {
91
+ document.getElementById('chatIframeContainer').style.display = 'none';
92
+ });
93
+ });
94
+ </script>
95
+
96
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
97
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
98
+ <title>Rubilabs</title>
99
+ <link rel="icon" type="image/x-icon" href="https://rubilabs.com/favi.jpeg">
100
+ <link rel="stylesheet" href="./Rubilabs_files/style.css">
101
+ <link href="./Rubilabs_files/bootstrap.min.css" rel="stylesheet">
102
+
103
+ <!-- Latest compiled JavaScript -->
104
+ <script src="./Rubilabs_files/bootstrap.bundle.min.js.download"></script>
105
+ <!-- <link rel="stylesheet" href="./CSS/button.css"> -->
106
+ <script src="chrome-extension://mooikfkahbdckldjjndioackbalphokd/assets/prompt.js"></script></head>
107
+ <body data-new-gr-c-s-check-loaded="14.1123.0" data-gr-ext-installed="" data-new-gr-c-s-loaded="14.1125.0">
108
+ <!--Nav + Hero Section-->
109
+ <header>
110
+ <nav class="nav-bar">
111
+ <ul class="nav-parent">
112
+ <li>
113
+ <a class="logo-link" href="https://rubilabs.com/"><img src="./Rubilabs_files/newlogo.png" alt="BirdPreneur Logo" class="logo-image"></a>
114
+ </li>
115
+ <li class="extreme position-el"><a href="https://rubilabs.com/#mission" class="nav-el">Our Mission</a></li>
116
+ <li class="extreme"><a href="https://rubilabs.com/#products" class="nav-el">Our Products</a></li>
117
+ <li class="extreme"><a href="https://rubilabs.com/#benefits" class="nav-el">Benefits</a></li>
118
+ <li class="extreme"><a href="https://rubilabs.com/#order" class="nav-el">Place Order</a></li>
119
+ <li class="extreme"><a href="https://rubilabs.com/#delivery" class="nav-el">Delivery</a></li>
120
+ <li class="extreme"><a href="https://rubilabs.com/#FAQs" class="nav-el">FAQs</a></li>
121
+ <li class="extreme"><a href="https://rubilabs.com/#contact" class="nav-el">Contact Us</a></li>
122
+ <li class="extreme"><button type="button" class="btn nav-el"><a id="get" href="https://shop.rubilabs.com/">Order Now</a></button></li>
123
+ </ul>
124
+ </nav>
125
+
126
+ </header>
127
+
128
+ <!--section 1-->
129
+ <section>
130
+ <div class="container-fluid" style="--bs-gutter-x: 0">
131
+ <div class="hero-image">
132
+ <h1 class="text"><b>RubilabsVet: Delivering Animal Vaccines and Farm Inputs Directly to You</b></h1>
133
+ <p class="text">RubilabsVet offers a wide range of high-quality and affordable animal vaccines, medications, and
134
+ other <br> farm
135
+ inputs, all
136
+ delivered straight to your door. Trust RubilabsVet to keep your livestock healthy and happy.</p>
137
+ <button type="button" class="btn nav-el"><a id="hero-btn" href="https://shop.rubilabs.com/" style="text-decoration: none; font-size: 20px;">Order Now</a></button>
138
+ </div>
139
+ </div>
140
+ </section>
141
+
142
+ <!--section 2-->
143
+ <section id="mission">
144
+ <div class="container-fluid" style="background-color: #d8f2f5;">
145
+ <div class="rubi">
146
+ <h1 style=" padding: 50px;"><b>RubilabsVet Overview and Mission</b></h1>
147
+ </div>
148
+ <div class="row">
149
+ <div class="col-sm-4">
150
+ <div class="card">
151
+ <h3><b>Affordables</b></h3>
152
+ <p>RubilabsVet is committed to providing high-quality products at competitive prices.</p>
153
+ </div>
154
+ </div>
155
+
156
+
157
+ <div class="col-sm-4">
158
+ <div class="card">
159
+ <h3><b>Quality Guaranteed</b></h3>
160
+ <p>All products are tested and approved, ensuring effective results and happy animals</p>
161
+ </div>
162
+ </div>
163
+ <!--row 2-->
164
+ <div class="col-sm-4">
165
+ <div class="card">
166
+ <h3><b>Convenient Delivery</b></h3>
167
+ <p>Get exactly what you need, when you need it, delivered directly to your doorstep.</p>
168
+ </div>
169
+ </div>
170
+
171
+
172
+ <div class="col-sm-4">
173
+ <div class="card">
174
+ <h4><b>Exceptional Customer Service</b></h4>
175
+ <p>The RubilabsVet team is always ready to give expert advice and quick support.</p>
176
+ </div>
177
+ </div>
178
+ </div>
179
+
180
+ </div>
181
+ </section>
182
+
183
+ <!--section 3-->
184
+ <section id="products">
185
+ <div class="container-fluid" style="background-color: #3e4a95;">
186
+ <div class="rubi">
187
+ <h1 id="products-h1"><b>Products Available for Delivery</b></h1>
188
+ </div>
189
+ <div class="row" id="product">
190
+ <div class="col-sm-3">
191
+ <h3 style="margin-left: 60px;"><b>Vaccines</b></h3>
192
+ <ol>
193
+ <li>Avian Influenza</li>
194
+ <li>Bovine Viral Diarrhea</li>
195
+ <li>Pseudrabies (Aujeszky's Disease)</li>
196
+ </ol>
197
+ </div>
198
+
199
+
200
+
201
+ <div class="col-sm-3">
202
+ <!-- <img src="./img5.jpeg" alt=""> -->
203
+ <!-- <div class="card-body"> -->
204
+ <h3 style="margin-left: 60px;"><b>Medications</b></h3>
205
+ <ol>
206
+ <li>Flunixin Meglumine Injection</li>
207
+ <li>Penicillin G Procaine Injection</li>
208
+ <li>Oxytetracycline Injection</li>
209
+ </ol>
210
+
211
+ </div>
212
+ <!--row 2-->
213
+ <div class="col-sm-3">
214
+ <h3><b>Other Farm Inputs</b></h3>
215
+ <ol>
216
+ <li>Iron Dextran Injection</li>
217
+ <li>B Complex Vitamins Injection</li>
218
+ <li>Disinfectants</li>
219
+ </ol>
220
+ </div>
221
+ </div>
222
+ </div>
223
+ </section>
224
+
225
+ <!--section 4-->
226
+ <div class="container-fluid" id="benefits">
227
+ <h1 id="benefits-h1"><b>Benefits of Using RubilabsVet</b></h1>
228
+ <div class="row">
229
+ <div class="col-sm-3">
230
+ <div class="card" id="new">
231
+ <img src="./Rubilabs_files/img5.jpeg" alt="">
232
+ <div class="card-body">
233
+ <h4 style="margin-top: 30px;">Delivery Time</h4>
234
+ <p>RubilabsVet products ensure your animals stay healthy, reducing the risk of diseases.</p>
235
+ </div>
236
+ </div>
237
+
238
+ </div>
239
+
240
+ <div class="col-sm-3">
241
+ <div class="card" id="new">
242
+ <img src="./Rubilabs_files/img3.jpeg" alt="">
243
+ <div class="card-body">
244
+ <h4 style="margin-top: 30px;">Increased Productivity</h4>
245
+ <p>Our products enhance growth and productivity of animals, improving farm yields.</p>
246
+ </div>
247
+ </div>
248
+
249
+ </div>
250
+
251
+ <div class="col-sm-3">
252
+ <div class="card" id="new">
253
+ <img src="./Rubilabs_files/img2.jpeg" alt="">
254
+ <div class="card-body">
255
+ <h4 style="margin-top: 30px;">Sustainable Agriculture</h4>
256
+ <p>Our products ensure the welfare and sustainability of your farm.</p>
257
+ </div>
258
+ </div>
259
+
260
+ </div>
261
+ </div>
262
+
263
+ <!--section 5-->
264
+ <section id="order" style="margin-top: 200px;">
265
+ <div class="container-fluid" id="orders-top" style="padding-right: calc(var(--bs-gutter-x) * .0); padding-left: calc(var(--bs-gutter-x) * .0); --bs-gutter-x: 0;">
266
+ <div class="rubi" style="--bs-gutter-x: 0;">
267
+ <h3 id="rubi-h1"><b>How to Place an Order</b></h3>
268
+ </div>
269
+ <div class="row">
270
+ <div class="col-sm-3">
271
+ <h4 style="margin-left: 90px;" id="orders"><b>Step 1:</b></h4>
272
+ <h4 style="margin-left: 10px;" id="orders"><b>Select Your Products</b></h4>
273
+ <p id="order">View our range of products online, and add them to your cart.</p>
274
+ </div>
275
+
276
+ <!--row 2-->
277
+ <div class="col-sm-3">
278
+ <h4 style="margin-left: 80px;" id="orders"><b>Step 2:</b></h4>
279
+ <h4 style="margin-left: 10px;" id="orders"><b>Choose Delivery Time</b></h4>
280
+ <p id="order">Select a suitable delivery date and time that works for you.</p>
281
+
282
+ </div>
283
+ <!--row 3-->
284
+ <div class="col-sm-3">
285
+ <h4 style="margin-left: 80px;" id="orders"><b>Step 3:</b></h4>
286
+ <h4 id="orders"><b>Complete Your Order</b></h4>
287
+ <p id="order">Enter your personal and payment information to complete your purchase.</p>
288
+ </div>
289
+ </div>
290
+ </div>
291
+ </section>
292
+
293
+
294
+ <!--section 6-->
295
+ <div class="container-fluid" id="delivery">
296
+ <h1 id="benefits-h1"><b>Delivery Process and Timelines</b></h1>
297
+ <div class="row">
298
+ <div class="col-sm-3" id="deliverys">
299
+ <div class="card" id="news">
300
+ <div class="card-body">
301
+ <h4 style="margin-top: 30px;">Delivery Time</h4>
302
+ <p>Expect delivery within 3 hours from the time of purchase.</p>
303
+ </div>
304
+ </div>
305
+
306
+ </div>
307
+
308
+ <div class="col-sm-3" id="deliverys">
309
+ <div class="card" id="news">
310
+ <div class="card-body">
311
+ <h4 style="margin-top: 30px;">Delivery Fees</h4>
312
+ <p>Delivery is free for all orders worth #30k and above.</p>
313
+ </div>
314
+ </div>
315
+
316
+ </div>
317
+
318
+ <div class="col-sm-3" id="deliverys">
319
+ <div class="card" id="news">
320
+ <div class="card-body">
321
+ <h4 style="margin-top: 30px;">Delivery Locations</h4>
322
+ <p>We deliver to all locations within the Nigeria.</p>
323
+ </div>
324
+ </div>
325
+
326
+ </div>
327
+
328
+
329
+ <div class="col-sm-3" id="deliverys">
330
+ <div class="card" id="news" style="height: 250px;">
331
+ <div class="card-body">
332
+ <h4 style="margin-top: 30px;">Delivery Tracking</h4>
333
+ <p>Track your order’s progress, right from dispatch to your doorstep.</p>
334
+ </div>
335
+ </div>
336
+
337
+ </div>
338
+ </div>
339
+ </div>
340
+
341
+ <!--section 7-->
342
+ <section id="FAQs" style="--bs-gutter-x: 0">
343
+ <div class="container-fluid">
344
+ <div class="rubi">
345
+ <h1 id="fqa-h1"><b>FAQs</b></h1>
346
+ </div>
347
+ <div class="row" id="fqa">
348
+ <div class="col-sm-4">
349
+ <div class="card">
350
+ <h4 class="fqa-h3"><b>What Payment Methods Are Accepted?</b></h4>
351
+ <p>We accept all major credit and debit cards, including Visa, MasterCard, and American Express.</p>
352
+ </div>
353
+
354
+ </div>
355
+
356
+
357
+
358
+ <div class="col-sm-4">
359
+ <div class="card">
360
+ <h4 class="fqa-h3"><b>How Do I Know If My Order Has Been Processed?</b></h4>
361
+ <p>You will receive an email confirming receipt of your order, and another email when your order has been dispatched.</p>
362
+ </div>
363
+
364
+
365
+ </div>
366
+ <!--row 3-->
367
+ <div class="col-sm-4">
368
+ <div class="card">
369
+ <h4 class="fqa-h3"><b>What Happens If I Am Not Satisfied With My Order?</b></h4>
370
+ <p>In the unlikely event that you are not fully satisfied with your order, contact our customer service team to make
371
+ arrangements for returns or exchanges.</p>
372
+ </div>
373
+
374
+ </div>
375
+
376
+ <div class="col-sm-4">
377
+ <div class="card" id="fourth" style="height: 260px;">
378
+ <h4 class="fqa-h3"><b>Are There Any Discounts Available?</b></h4>
379
+ <p>Yes! Check out our website to see our current promotions and discounts available.</p>
380
+ </div>
381
+
382
+ </div>
383
+ </div>
384
+ </div>
385
+ </section>
386
+
387
+ <!--section 8-->
388
+ <section id="contact" style="--bs-gutter-x: 0;">
389
+ <div class="container-fluid" style="--bs-gutter-x: 0; --bs-gutter-y: 0;">
390
+ <div class="footer" style="--bs-gutter-x: 0;">
391
+ <div class="row" id="conatct-col">
392
+ <!--col 1-->
393
+ <div class="col-sm-5">
394
+ <div class="card">
395
+ <img src="./Rubilabs_files/newlogo.png" alt="">
396
+ </div>
397
+ </div>
398
+
399
+ <!--col 2-->
400
+ <div class="col-sm-5">
401
+ <div class="card" id="faqs">
402
+ <h4 class="fqa-h3"><b>Contact RubilabsVet for More Information</b></h4>
403
+ <p>Looking for more information or have a question? Contact our friendly customer service team at <b>+2347016772509</b> or send an
404
+ email to <b>info@rubilabs.com.</b></p>
405
+ </div>
406
+ </div>
407
+ </div>
408
+ </div>
409
+ </div>
410
+ </section>
411
+
412
+
413
+
414
+
415
+ </div><div id="chatWidget" class="chat-widget"><img src="./Rubilabs_files/bubble2.png" alt="Chat"></div><div id="chatIframeContainer" class="chat-iframe-container" style="display: none;"><div class="close-button" id="closeButton">×</div><iframe src="./Rubilabs_files/English.html" name="myiFrame" scrolling="yes"></iframe></div></body><grammarly-desktop-integration data-grammarly-shadow-root="true"><template shadowrootmode="open"><style>
416
+ div.grammarly-desktop-integration {
417
+ position: absolute;
418
+ width: 1px;
419
+ height: 1px;
420
+ padding: 0;
421
+ margin: -1px;
422
+ overflow: hidden;
423
+ clip: rect(0, 0, 0, 0);
424
+ white-space: nowrap;
425
+ border: 0;
426
+ -moz-user-select: none;
427
+ -webkit-user-select: none;
428
+ -ms-user-select:none;
429
+ user-select:none;
430
+ }
431
+
432
+ div.grammarly-desktop-integration:before {
433
+ content: attr(data-content);
434
+ }
435
+ </style><div aria-label="grammarly-integration" role="group" tabindex="-1" class="grammarly-desktop-integration" data-content="{&quot;mode&quot;:&quot;full&quot;,&quot;isActive&quot;:true,&quot;isUserDisabled&quot;:false}"></div></template></grammarly-desktop-integration></html>
requirements.txt ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ chainlit==0.6.2
2
+ langchain==0.0.265
3
+ tiktoken==0.4.0
4
+ openai==0.27.8
5
+ faiss-cpu==1.7.4
6
+ beautifulsoup4
7
+ lxml