Hadiil commited on
Commit
72bab89
·
verified ·
1 Parent(s): ee44384

Update static/index.html

Browse files
Files changed (1) hide show
  1. static/index.html +221 -275
static/index.html CHANGED
@@ -1,329 +1,275 @@
1
  <!DOCTYPE html>
2
  <html lang="en">
 
3
  <head>
4
  <meta charset="UTF-8">
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github-dark.min.css">
7
  <link href='https://unpkg.com/boxicons@2.1.4/css/boxicons.min.css' rel='stylesheet'>
8
- <title>Vion AI</title>
9
  <style>
10
- body {
11
- font-family: Arial, sans-serif;
12
- margin: 20px;
13
- }
14
- .section {
15
- margin-bottom: 30px;
 
 
16
  }
17
- .section h2 {
18
- margin-bottom: 10px;
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  }
20
- .form-group {
21
- margin-bottom: 15px;
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  }
23
- .form-group label {
24
- display: block;
25
- margin-bottom: 5px;
 
 
 
 
 
 
26
  }
27
- .form-group input, .form-group textarea, .form-group select {
 
 
28
  width: 100%;
29
- padding: 8px;
30
- box-sizing: border-box;
31
- }
32
- .result {
33
- margin-top: 10px;
34
- padding: 10px;
35
- background-color: #f4f4f4;
36
- border-radius: 5px;
37
  }
38
- .result pre {
39
- white-space: pre-wrap;
40
- word-wrap: break-word;
 
41
  }
42
- </style>
43
- </head>
44
- <body>
45
- <h1>Vion AI - All Functionalities</h1>
46
-
47
- <!-- Summarization Section -->
48
- <div class="section">
49
- <h2>Summarization</h2>
50
- <form id="summarizeForm">
51
- <div class="form-group">
52
- <label for="summarizeText">Enter Text:</label>
53
- <textarea id="summarizeText" rows="5" placeholder="Paste your text here..."></textarea>
54
- </div>
55
- <div class="form-group">
56
- <label for="summarizeFile">Or Upload a File (PDF, DOCX, TXT):</label>
57
- <input type="file" id="summarizeFile" accept=".pdf,.docx,.txt">
58
- </div>
59
- <button type="submit">Summarize</button>
60
- </form>
61
- <div class="result" id="summarizeResult"></div>
62
- </div>
63
 
64
- <!-- Image Captioning Section -->
65
- <div class="section">
66
- <h2>Image Captioning</h2>
67
- <form id="captionForm">
68
- <div class="form-group">
69
- <label for="imageInput">Upload an Image (JPEG, PNG):</label>
70
- <input type="file" id="imageInput" accept="image/jpeg, image/png" required>
71
- </div>
72
- <button type="submit">Generate Caption</button>
73
- </form>
74
- <div class="result" id="captionResult"></div>
75
- </div>
76
 
77
- <!-- Question Answering Section -->
78
- <div class="section">
79
- <h2>Question Answering</h2>
80
- <form id="qaForm">
81
- <div class="form-group">
82
- <label for="qaText">Enter Context:</label>
83
- <textarea id="qaText" rows="5" placeholder="Paste your text here..."></textarea>
84
- </div>
85
- <div class="form-group">
86
- <label for="qaFile">Or Upload a File (PDF, DOCX, TXT):</label>
87
- <input type="file" id="qaFile" accept=".pdf,.docx,.txt">
88
- </div>
89
- <div class="form-group">
90
- <label for="qaQuestion">Enter Question:</label>
91
- <input type="text" id="qaQuestion" placeholder="Enter your question..." required>
92
- </div>
93
- <button type="submit">Get Answer</button>
94
- </form>
95
- <div class="result" id="qaResult"></div>
96
- </div>
97
 
98
- <!-- Visual Question Answering Section -->
99
- <div class="section">
100
- <h2>Visual Question Answering</h2>
101
- <form id="vqaForm">
102
- <div class="form-group">
103
- <label for="vqaImage">Upload an Image (JPEG, PNG):</label>
104
- <input type="file" id="vqaImage" accept="image/jpeg, image/png" required>
105
- </div>
106
- <div class="form-group">
107
- <label for="vqaQuestion">Enter Question:</label>
108
- <input type="text" id="vqaQuestion" placeholder="Enter your question..." required>
109
- </div>
110
- <button type="submit">Get Answer</button>
111
- </form>
112
- <div class="result" id="vqaResult"></div>
113
- </div>
114
 
115
- <!-- Data Visualization Code Generation Section -->
116
- <div class="section">
117
- <h2>Data Visualization Code Generation</h2>
118
- <form id="visualizeForm">
119
- <div class="form-group">
120
- <label for="visualizeFile">Upload an Excel File:</label>
121
- <input type="file" id="visualizeFile" accept=".xlsx,.xls" required>
122
- </div>
123
- <div class="form-group">
124
- <label for="visualizeRequest">Enter Visualization Request:</label>
125
- <input type="text" id="visualizeRequest" placeholder="e.g., bar chart, line chart" required>
126
- </div>
127
- <button type="submit">Generate Code</button>
128
- </form>
129
- <div class="result" id="visualizeResult"></div>
130
- </div>
131
 
132
- <!-- Document Translation Section -->
133
- <div class="section">
134
- <h2>Document Translation</h2>
135
- <form id="translateForm">
136
- <div class="form-group">
137
- <label for="translateText">Enter Text:</label>
138
- <textarea id="translateText" rows="5" placeholder="Paste your text here..."></textarea>
139
- </div>
140
- <div class="form-group">
141
- <label for="translateFile">Or Upload a File (PDF, DOCX, TXT):</label>
142
- <input type="file" id="translateFile" accept=".pdf,.docx,.txt">
143
- </div>
144
- <div class="form-group">
145
- <label for="translateLanguage">Select Target Language:</label>
146
- <select id="translateLanguage">
147
- <option value="fr">French</option>
148
- <option value="es">Spanish</option>
149
- <option value="de">German</option>
150
- </select>
151
- </div>
152
- <button type="submit">Translate</button>
153
- </form>
154
- <div class="result" id="translateResult"></div>
155
- </div>
156
 
157
- <script>
158
- // Summarization
159
- document.getElementById('summarizeForm').addEventListener('submit', async (e) => {
160
- e.preventDefault();
161
- const text = document.getElementById('summarizeText').value.trim();
162
- const file = document.getElementById('summarizeFile').files[0];
163
-
164
- if (!text && !file) {
165
- alert("Please enter text or upload a file.");
166
- return;
167
- }
168
 
169
- const formData = new FormData();
170
- if (file) formData.append('file', file);
171
- if (text) formData.append('text', text);
 
172
 
173
- try {
174
- const response = await fetch('/summarize', {
175
- method: 'POST',
176
- body: formData
177
- });
178
- const data = await response.json();
179
- document.getElementById('summarizeResult').innerText = `Summary: ${data.summary}`;
180
- } catch (error) {
181
- console.error('Error:', error);
182
- document.getElementById('summarizeResult').innerText = 'Failed to summarize. Please try again.';
183
- }
184
- });
185
 
186
- // Image Captioning
187
- document.getElementById('captionForm').addEventListener('submit', async (e) => {
188
- e.preventDefault();
189
- const file = document.getElementById('imageInput').files[0];
190
 
191
- if (!file) {
192
- alert("Please select an image file.");
193
- return;
194
- }
 
 
 
195
 
196
- const formData = new FormData();
197
- formData.append('file', file);
 
 
198
 
199
- try {
200
- const response = await fetch('/caption', {
201
- method: 'POST',
202
- body: formData
203
- });
204
- const data = await response.json();
205
- document.getElementById('captionResult').innerText = `Caption: ${data.caption}`;
206
- } catch (error) {
207
- console.error('Error:', error);
208
- document.getElementById('captionResult').innerText = 'Failed to generate caption. Please try again.';
209
- }
210
- });
211
 
212
- // Question Answering
213
- document.getElementById('qaForm').addEventListener('submit', async (e) => {
214
- e.preventDefault();
215
- const text = document.getElementById('qaText').value.trim();
216
- const file = document.getElementById('qaFile').files[0];
217
- const question = document.getElementById('qaQuestion').value.trim();
 
 
218
 
219
- if (!text && !file) {
220
- alert("Please enter text or upload a file.");
221
- return;
222
- }
223
 
224
- const formData = new FormData();
225
- if (file) formData.append('file', file);
226
- if (text) formData.append('text', text);
227
- formData.append('question', question);
 
 
 
 
 
228
 
229
- try {
230
- const response = await fetch('/answer', {
231
- method: 'POST',
232
- body: formData
233
- });
234
- const data = await response.json();
235
- document.getElementById('qaResult').innerText = `Answer: ${data.answer}`;
236
- } catch (error) {
237
- console.error('Error:', error);
238
- document.getElementById('qaResult').innerText = 'Failed to get an answer. Please try again.';
239
- }
240
- });
241
 
242
- // Visual Question Answering
243
- document.getElementById('vqaForm').addEventListener('submit', async (e) => {
244
- e.preventDefault();
245
- const file = document.getElementById('vqaImage').files[0];
246
- const question = document.getElementById('vqaQuestion').value.trim();
247
 
248
- if (!file) {
249
- alert("Please select an image file.");
250
- return;
251
- }
 
252
 
253
- const formData = new FormData();
254
- formData.append('file', file);
255
- formData.append('question', question);
256
 
257
- try {
258
- const response = await fetch('/vqa', {
259
- method: 'POST',
260
- body: formData
261
- });
262
- const data = await response.json();
263
- document.getElementById('vqaResult').innerText = `Answer: ${data.answer}`;
264
- } catch (error) {
265
- console.error('Error:', error);
266
- document.getElementById('vqaResult').innerText = 'Failed to get an answer. Please try again.';
267
- }
268
- });
269
 
270
- // Data Visualization Code Generation
271
- document.getElementById('visualizeForm').addEventListener('submit', async (e) => {
272
- e.preventDefault();
273
- const file = document.getElementById('visualizeFile').files[0];
274
- const request = document.getElementById('visualizeRequest').value.trim();
275
 
276
- if (!file) {
277
- alert("Please upload an Excel file.");
278
- return;
279
- }
 
 
 
 
 
 
 
280
 
281
- const formData = new FormData();
282
- formData.append('file', file);
283
- formData.append('request', request);
 
284
 
285
- try {
286
- const response = await fetch('/visualize', {
287
- method: 'POST',
288
- body: formData
289
- });
290
- const data = await response.json();
291
- document.getElementById('visualizeResult').innerHTML = `<pre>${data.code}</pre>`;
292
- } catch (error) {
293
- console.error('Error:', error);
294
- document.getElementById('visualizeResult').innerText = 'Failed to generate code. Please try again.';
295
- }
296
- });
297
 
298
- // Document Translation
299
- document.getElementById('translateForm').addEventListener('submit', async (e) => {
300
- e.preventDefault();
301
- const text = document.getElementById('translateText').value.trim();
302
- const file = document.getElementById('translateFile').files[0];
303
- const language = document.getElementById('translateLanguage').value;
304
 
305
- if (!text && !file) {
306
- alert("Please enter text or upload a file.");
307
- return;
 
 
 
 
 
 
 
 
 
 
 
 
308
  }
309
 
310
- const formData = new FormData();
311
- if (file) formData.append('file', file);
312
- if (text) formData.append('text', text);
313
- formData.append('target_language', language);
314
-
315
  try {
316
- const response = await fetch('/translate', {
317
  method: 'POST',
318
- body: formData
 
 
 
319
  });
320
  const data = await response.json();
321
- document.getElementById('translateResult').innerText = `Translated Text: ${data.translated_text}`;
322
  } catch (error) {
323
  console.error('Error:', error);
324
- document.getElementById('translateResult').innerText = 'Failed to translate. Please try again.';
325
  }
 
 
 
 
 
 
326
  });
327
  </script>
328
  </body>
 
329
  </html>
 
1
  <!DOCTYPE html>
2
  <html lang="en">
3
+
4
  <head>
5
  <meta charset="UTF-8">
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github-dark.min.css">
8
  <link href='https://unpkg.com/boxicons@2.1.4/css/boxicons.min.css' rel='stylesheet'>
9
+ <title>Vion AI Chatbot</title>
10
  <style>
11
+ @import url('https://fonts.googleapis.com/css2?family=Open+Sans:wght@300;400;600;800&display=swap');
12
+
13
+ * {
14
+ margin: 0;
15
+ padding: 0;
16
+ outline: none;
17
+ box-sizing: border-box;
18
+ font-family: "Open Sans", sans-serif;
19
  }
20
+
21
+ :root {
22
+ --primary-color: #0A0A0B;
23
+ --secondary-color: #1A1B1E;
24
+ --secondary-hover-color: #2A2B2E;
25
+ --focus-color: #242528;
26
+ --focus-hover-color: #343538;
27
+ --button-hover-color: #252627;
28
+ --text-color: #FFFFFF;
29
+ --text-secondary-color: #A0A1A3;
30
+ --heading-secondary-color: #606162;
31
+ --placeholder-color: #78797A;
32
+ --accent-color: #00A3FF;
33
+ --star-color: #FFFFFF;
34
+ --background-color: #000;
35
  }
36
+
37
+ .light_mode {
38
+ --primary-color: #FFFFFF;
39
+ --secondary-color: #F5F6F5;
40
+ --secondary-hover-color: #E5E6E5;
41
+ --focus-color: #ECEDEC;
42
+ --focus-hover-color: #E0E1E0;
43
+ --button-hover-color: #ECEDED;
44
+ --text-color: #0A0A0B;
45
+ --text-secondary-color: #4A4B4C;
46
+ --heading-secondary-color: #BABBBB;
47
+ --placeholder-color: #868788;
48
+ --accent-color: #007ACC;
49
+ --star-color: #666;
50
+ --background-color: #E0E7FF;
51
  }
52
+
53
+ body {
54
+ min-height: 100vh;
55
+ display: flex;
56
+ flex-direction: column;
57
+ justify-content: space-between;
58
+ background: var(--background-color);
59
+ position: relative;
60
+ overflow-y: auto;
61
  }
62
+
63
+ .stars {
64
+ position: fixed;
65
  width: 100%;
66
+ height: 100%;
67
+ background: url('https://www.transparenttextures.com/patterns/stardust.png');
68
+ animation: starsAnim 100s linear infinite;
69
+ z-index: -1;
 
 
 
 
70
  }
71
+
72
+ .light_mode .stars {
73
+ background: url('https://www.transparenttextures.com/patterns/stardust.png') rgba(224, 231, 255, 0.8);
74
+ opacity: 0.3;
75
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
 
77
+ @keyframes starsAnim {
78
+ from { background-position: 0 0; }
79
+ to { background-position: 10000px 10000px; }
80
+ }
 
 
 
 
 
 
 
 
81
 
82
+ .chat-container {
83
+ flex: 1;
84
+ display: flex;
85
+ flex-direction: column;
86
+ justify-content: space-between;
87
+ max-width: 900px;
88
+ margin: 0 auto;
89
+ padding: 2rem;
90
+ }
 
 
 
 
 
 
 
 
 
 
 
91
 
92
+ .chat-header {
93
+ text-align: center;
94
+ margin-bottom: 2rem;
95
+ }
 
 
 
 
 
 
 
 
 
 
 
 
96
 
97
+ .chat-header h1 {
98
+ color: var(--text-color);
99
+ font-size: 3.5rem;
100
+ font-weight: 800;
101
+ margin-bottom: 1rem;
102
+ text-shadow: 0 0 10px rgba(0, 163, 255, 0.5);
103
+ }
 
 
 
 
 
 
 
 
 
104
 
105
+ .chat-header h2 {
106
+ color: var(--text-secondary-color);
107
+ font-size: 1.5rem;
108
+ font-weight: 400;
109
+ max-width: 600px;
110
+ margin: 0 auto;
111
+ text-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
112
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
113
 
114
+ .chat-messages {
115
+ flex: 1;
116
+ overflow-y: auto;
117
+ margin-bottom: 1rem;
118
+ }
 
 
 
 
 
 
119
 
120
+ .message {
121
+ display: flex;
122
+ margin-bottom: 1rem;
123
+ }
124
 
125
+ .message.user {
126
+ justify-content: flex-end;
127
+ }
 
 
 
 
 
 
 
 
 
128
 
129
+ .message.bot {
130
+ justify-content: flex-start;
131
+ }
 
132
 
133
+ .message-content {
134
+ max-width: 70%;
135
+ padding: 0.75rem 1rem;
136
+ border-radius: 1rem;
137
+ background: var(--secondary-color);
138
+ color: var(--text-color);
139
+ }
140
 
141
+ .message.user .message-content {
142
+ background: var(--accent-color);
143
+ color: var(--text-color);
144
+ }
145
 
146
+ .chat-input {
147
+ display: flex;
148
+ align-items: center;
149
+ background: var(--secondary-color);
150
+ border: 1px solid var(--focus-color);
151
+ border-radius: 0.5rem;
152
+ padding: 0.2rem;
153
+ }
 
 
 
 
154
 
155
+ .chat-input input {
156
+ flex-grow: 1;
157
+ border: none;
158
+ background: transparent;
159
+ color: var(--text-color);
160
+ padding: 0.5rem;
161
+ outline: none;
162
+ }
163
 
164
+ .chat-input input::placeholder {
165
+ color: var(--placeholder-color);
166
+ }
 
167
 
168
+ .chat-input button {
169
+ background: none;
170
+ border: none;
171
+ color: var(--text-secondary-color);
172
+ font-size: 1.1rem;
173
+ cursor: pointer;
174
+ padding: 0.5rem;
175
+ transition: color 0.3s ease;
176
+ }
177
 
178
+ .chat-input button:hover {
179
+ color: var(--accent-color);
180
+ }
181
+ </style>
182
+ </head>
 
 
 
 
 
 
 
183
 
184
+ <body>
185
+ <div class="stars"></div>
 
 
 
186
 
187
+ <div class="chat-container">
188
+ <div class="chat-header">
189
+ <h1>Vion AI</h1>
190
+ <h2>Ask me anything and I'll provide helpful and truthful answers from an outside perspective on humanity.</h2>
191
+ </div>
192
 
193
+ <div class="chat-messages" id="chatMessages">
194
+ <!-- Chat messages will appear here -->
195
+ </div>
196
 
197
+ <div class="chat-input">
198
+ <input type="text" id="chatInput" placeholder="Ask me anything...">
199
+ <button type="button" id="sendButton"><i class='bx bx-send'></i></button>
200
+ </div>
201
+ </div>
 
 
 
 
 
 
 
202
 
203
+ <script>
204
+ const chatMessages = document.getElementById('chatMessages');
205
+ const chatInput = document.getElementById('chatInput');
206
+ const sendButton = document.getElementById('sendButton');
 
207
 
208
+ // Function to add a message to the chat
209
+ function addMessage(sender, text) {
210
+ const messageDiv = document.createElement('div');
211
+ messageDiv.classList.add('message', sender);
212
+ const messageContent = document.createElement('div');
213
+ messageContent.classList.add('message-content');
214
+ messageContent.innerText = text;
215
+ messageDiv.appendChild(messageContent);
216
+ chatMessages.appendChild(messageDiv);
217
+ chatMessages.scrollTop = chatMessages.scrollHeight; // Auto-scroll to the bottom
218
+ }
219
 
220
+ // Function to handle user input
221
+ async function handleUserInput() {
222
+ const userInput = chatInput.value.trim();
223
+ if (!userInput) return;
224
 
225
+ // Add user message to the chat
226
+ addMessage('user', userInput);
227
+ chatInput.value = ''; // Clear the input field
 
 
 
 
 
 
 
 
 
228
 
229
+ // Determine the functionality based on the input
230
+ let endpoint = '/summarize'; // Default to summarization
231
+ let payload = { text: userInput };
 
 
 
232
 
233
+ if (userInput.startsWith("/caption")) {
234
+ endpoint = '/caption';
235
+ payload = { file: "image.jpg" }; // Placeholder for image upload
236
+ } else if (userInput.startsWith("/qa")) {
237
+ endpoint = '/answer';
238
+ payload = { text: userInput.replace("/qa", "").trim(), question: "What is this about?" };
239
+ } else if (userInput.startsWith("/vqa")) {
240
+ endpoint = '/vqa';
241
+ payload = { file: "image.jpg", question: userInput.replace("/vqa", "").trim() };
242
+ } else if (userInput.startsWith("/visualize")) {
243
+ endpoint = '/visualize';
244
+ payload = { file: "data.xlsx", request: userInput.replace("/visualize", "").trim() };
245
+ } else if (userInput.startsWith("/translate")) {
246
+ endpoint = '/translate';
247
+ payload = { text: userInput.replace("/translate", "").trim(), target_language: "fr" };
248
  }
249
 
250
+ // Send the input to the backend
 
 
 
 
251
  try {
252
+ const response = await fetch(endpoint, {
253
  method: 'POST',
254
+ headers: {
255
+ 'Content-Type': 'application/json',
256
+ },
257
+ body: JSON.stringify(payload),
258
  });
259
  const data = await response.json();
260
+ addMessage('bot', JSON.stringify(data));
261
  } catch (error) {
262
  console.error('Error:', error);
263
+ addMessage('bot', 'Failed to get a response. Please try again.');
264
  }
265
+ }
266
+
267
+ // Event listeners
268
+ sendButton.addEventListener('click', handleUserInput);
269
+ chatInput.addEventListener('keypress', (e) => {
270
+ if (e.key === 'Enter') handleUserInput();
271
  });
272
  </script>
273
  </body>
274
+
275
  </html>