forked from React-Group/interstellar_ai
		
	main #34
					 12 changed files with 834 additions and 502 deletions
				
			
		
							
								
								
									
										2
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							|  | @ -43,3 +43,5 @@ __pycache__/ | |||
| key.pem | ||||
| cert.pem | ||||
| api_key.txt | ||||
| 
 | ||||
| database.json | ||||
|  |  | |||
|  | @ -9,7 +9,6 @@ import { resolve } from "path"; | |||
| import { FFmpeg } from "@ffmpeg/ffmpeg"; | ||||
| import { fetchFile, toBlobURL } from "@ffmpeg/util" | ||||
| 
 | ||||
| 
 | ||||
| const InputOutputBackend: React.FC = () => { | ||||
|   // # variables
 | ||||
|   type Message = { | ||||
|  | @ -47,9 +46,9 @@ const InputOutputBackend: React.FC = () => { | |||
|             You will only answer in the language (you will receive the country code) ${preferredLanguage}.  | ||||
|             But in the case the user specifically states to answer in another language, do that. Speaking in  | ||||
|             another language is not stating you should answer in that language.  | ||||
|             Additionally, under no circumstances translate your answer into multiple languages.`,
 | ||||
|             Additionally, under no circumstances ever translate your answer into multiple languages.`,
 | ||||
|         }, | ||||
|         { role: "assistant", content: "Hello! How can I help you?" }, | ||||
|         { role: "assistant", content: "Hello! How may I help you?" }, | ||||
|       ]);  | ||||
|     } | ||||
|   }, [preferredCurrency, preferredLanguage, timeFormat, dateFormat, preferredMeasurement, timeZone]); | ||||
|  | @ -174,7 +173,15 @@ const InputOutputBackend: React.FC = () => { | |||
|         if (postWorkerRef.current) { | ||||
|           addMessage("user", inputValue) | ||||
|           console.log("input:", inputValue); | ||||
|           postWorkerRef.current.postMessage({ messages: [...messages, { role: "user", content: inputValue }], ai_model: "llama3.2", access_token: accessToken }) | ||||
|           const type = localStorage.getItem('type') | ||||
|           var api_key: string = "" | ||||
|           if (type != null && type != 'local') { | ||||
|             const try_key = localStorage.getItem(type) | ||||
|             if (try_key) { | ||||
|               api_key = try_key | ||||
|             } | ||||
|           } | ||||
|           postWorkerRef.current.postMessage({ messages: [...messages, { role: "user", content: inputValue }], ai_model: localStorage.getItem('model'), model_type: type, access_token: accessToken, api_key: api_key }) | ||||
|           startGetWorker() | ||||
|         } | ||||
|       } | ||||
|  |  | |||
|  | @ -18,27 +18,28 @@ if all went well, you will get the status 200 in response.data.status | |||
| to check if the request was accepted or declined, check response.data.response, it will be either true or false depending on if it worked, or not. | ||||
| */ | ||||
| 
 | ||||
| export const sendToDatabase = (data: any): Promise<boolean> => { | ||||
|   return axios.post("http://localhost:5000/interstellar_ai/db", data) | ||||
|     .then(response => { | ||||
|       const status = response.data.status; | ||||
|       const success = response.data.response; | ||||
|       postMessage({ status, success }); | ||||
|       return success;  // Ensure success is returned to the caller
 | ||||
|     }) | ||||
|     .catch(error => { | ||||
|       postMessage({ status: 500, success: false }); | ||||
|       return false;  // Return false in case of an error
 | ||||
|     }); | ||||
| export const sendToDatabase = async (data: any): Promise<boolean> => { | ||||
|   try { | ||||
|     const response = await axios.post("http://localhost:5000/interstellar_ai/db", data); | ||||
|     const status = response.data.status; | ||||
|     const success = response.data.response; | ||||
|     postMessage({ status, success }); | ||||
|     console.log(status); | ||||
|     return success; | ||||
|   } catch (error) { | ||||
|     postMessage({ status: 500, success: false }); | ||||
|     console.log("NO"); | ||||
|     return false; | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| // Functions for each action
 | ||||
| export const createAccount = async (username: string, email: string, password: string) => { | ||||
|   const data = { | ||||
|     action: "create_account", | ||||
|     username, | ||||
|     email, | ||||
|     password, | ||||
|     username: username, | ||||
|     email: email, | ||||
|     password: password, | ||||
|   }; | ||||
|   return await sendToDatabase(data); | ||||
| }; | ||||
|  |  | |||
|  | @ -1,14 +1,15 @@ | |||
| import axios from "axios"; | ||||
| 
 | ||||
| onmessage = (e) => { | ||||
|     const { messages, ai_model = "llama3.2", access_token } = e.data | ||||
|     const { messages, ai_model, model_type, access_token, api_key } = e.data | ||||
| 
 | ||||
| 
 | ||||
|     const Message = { | ||||
|         messages: messages, | ||||
|         ai_model: "llama3.2", | ||||
|         model_type: "local", | ||||
|         access_token: access_token | ||||
|         ai_model: ai_model, | ||||
|         model_type: model_type, | ||||
|         access_token: access_token, | ||||
|         api_key: api_key | ||||
|     } | ||||
| 
 | ||||
|     console.log(Message); | ||||
|  |  | |||
|  | @ -6,7 +6,6 @@ export const sendToVoiceRecognition = (audio_data: Blob): Promise<string> => { | |||
|     const formdata = new FormData() | ||||
|     formdata.append("audio", audio_data) | ||||
| 
 | ||||
|     const dataSend = { option: "offline", type: "basic", audio: audio_data } | ||||
|     return axios.post("http://localhost:5000/interstellar_ai/api/voice_recognition", formdata) | ||||
|         .then((response) => { | ||||
|             console.log(response.data) | ||||
|  |  | |||
|  | @ -55,9 +55,12 @@ const Login: React.FC = () => { | |||
|     const savedAccountName = localStorage.getItem('accountName'); | ||||
| 
 | ||||
|     // Check if savedAccountName or savedAccountEmail is not null before passing to checkCredentials
 | ||||
|     const accountIdentifier = savedAccountName || savedAccountEmail; | ||||
|     var accountIdentifier = savedAccountName || savedAccountEmail; | ||||
|     if (!accountIdentifier) { | ||||
|       accountIdentifier = accountName | ||||
|     } | ||||
| 
 | ||||
|     if (accountIdentifier && password === savedAccountPassword) { | ||||
|     if (accountIdentifier && password) { | ||||
|       const success = await checkCredentials(accountIdentifier, password); | ||||
|       if (success) { | ||||
|         setIsLoggedIn(true); // Successful login
 | ||||
|  |  | |||
|  | @ -240,6 +240,9 @@ const Models: React.FC = () => { | |||
|     console.log(model) | ||||
|     console.log(category) | ||||
|     console.log(modelList[category][model as keyof typeof modelList[typeof category]]); | ||||
|     console.log(modelList[category]['model_type' as keyof typeof modelList[typeof category]]) | ||||
|     localStorage.setItem("model", modelList[category][model as keyof typeof modelList[typeof category]]) | ||||
|     localStorage.setItem("type", modelList[category]['model_type' as keyof typeof modelList[typeof category]]) | ||||
|   } | ||||
| 
 | ||||
|   return ( | ||||
|  |  | |||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -92,5 +92,66 @@ export const applyBlackTheme = () => { | |||
|     document.documentElement.style.setProperty('--input-border-color', '#3c3c3c'); // Input border color
 | ||||
|     document.documentElement.style.setProperty('--font-family', "'Poppins', 'sans-serif'"); // Font family
 | ||||
|     document.documentElement.style.setProperty('--font-size', '16px'); // Font size
 | ||||
|     document.documentElement.style.setProperty('--burger-menu-background-color', '#79832e'); // Font size
 | ||||
|     document.documentElement.style.setProperty('--burger-menu-background-color', '# 79832e'); // Font size
 | ||||
| }; | ||||
| 
 | ||||
| export const applyCustomTheme = () => { | ||||
|     // Theme variables   
 | ||||
|     const themeVariables = { | ||||
|         backgroundColor: localStorage.getItem('backgroundColor'), | ||||
|         textColor: localStorage.getItem('textColor'), | ||||
|         inputBackgroundColor: localStorage.getItem('inputBackgroundColor'), | ||||
|         inputButtonColor: localStorage.getItem('inputButtonColor'), | ||||
|         inputButtonHoverColor: localStorage.getItem('inputButtonHoverColor'), | ||||
|         userMessageBackgroundColor: localStorage.getItem('userMessageBackgroundColor'), | ||||
|         userMessageTextColor: localStorage.getItem('userMessageTextColor'), | ||||
|         aiMessageBackgroundColor: localStorage.getItem('aiMessageBackgroundColor'), | ||||
|         aiMessageTextColor: localStorage.getItem('aiMessageTextColor'), | ||||
|         buttonBackgroundColor: localStorage.getItem('buttonBackgroundColor'), | ||||
|         buttonHoverBackgroundColor: localStorage.getItem('buttonHoverBackgroundColor'), | ||||
|         modelsBackgroundColor: localStorage.getItem('modelsBackgroundColor'), | ||||
|         historyBackgroundColor: localStorage.getItem('historyBackgroundColor'), | ||||
|         leftPanelBackgroundColor: localStorage.getItem('leftPanelBackgroundColor'), | ||||
|         conversationBackgroundColor: localStorage.getItem('conversationBackgroundColor'), | ||||
|         popUpTextColor: localStorage.getItem('popUpTextColor'), | ||||
|         inputBorderColor: localStorage.getItem('inputBorderColor'), | ||||
|         fontFamily: localStorage.getItem('fontFamily'), | ||||
|         fontSize: localStorage.getItem('fontSize'), | ||||
|         burgerMenu: localStorage.getItem('burgerMenu'), | ||||
|         faqBackgroundColor: localStorage.getItem('faqBackgroundColor'), | ||||
|         faqHeadingColor: localStorage.getItem('faqHeadingColor'), | ||||
|         faqItemBackgroundColor: localStorage.getItem('faqItemBackgroundColor'), | ||||
|         faqItemHeadingColor: localStorage.getItem('faqItemHeadingColor'), | ||||
|         faqItemTextColor: localStorage.getItem('faqItemTextColor'), | ||||
|         faqItemHoverBackgroundColor: localStorage.getItem('faqItemHoverBackgroundColor'), | ||||
|         popupBackgroundColor: localStorage.getItem('popupBackgroundColor'), | ||||
|         overlayTextColor: localStorage.getItem('overlayTextColor'), | ||||
|       }; | ||||
|            | ||||
|       document.documentElement.style.setProperty('--background-color', themeVariables.backgroundColor || '#121212'); // Main background color
 | ||||
|       document.documentElement.style.setProperty('--text-color', themeVariables.textColor || '#e0e0e0'); // Main text color
 | ||||
|       document.documentElement.style.setProperty('--input-background-color', themeVariables.inputBackgroundColor || '#1e1e1e'); // Input fields background
 | ||||
|       document.documentElement.style.setProperty('--input-button-color', themeVariables.inputButtonColor || '#3c3c3c'); // Button color
 | ||||
|       document.documentElement.style.setProperty('--input-button-hover-color', themeVariables.inputButtonHoverColor || '#5a5a5a'); // Button hover color
 | ||||
|       document.documentElement.style.setProperty('--user-message-background-color', themeVariables.userMessageBackgroundColor || '#000000'); // User messages background
 | ||||
|       document.documentElement.style.setProperty('--user-message-text-color', themeVariables.userMessageTextColor || '#ffffff'); // User messages text color
 | ||||
|       document.documentElement.style.setProperty('--ai-message-background-color', themeVariables.aiMessageBackgroundColor || '#202020'); // AI messages background
 | ||||
|       document.documentElement.style.setProperty('--ai-message-text-color', themeVariables.aiMessageTextColor || '#ffffff'); // AI messages text color
 | ||||
|       document.documentElement.style.setProperty('--button-background-color', themeVariables.buttonBackgroundColor || '#3c3c3c'); // Button background color
 | ||||
|       document.documentElement.style.setProperty('--button-hover-background-color', themeVariables.buttonHoverBackgroundColor || '#5a5a5a'); // Button hover color
 | ||||
|       document.documentElement.style.setProperty('--models-background-color', themeVariables.modelsBackgroundColor || '#1e1e1e'); // Models section background
 | ||||
|       document.documentElement.style.setProperty('--history-background-color', themeVariables.historyBackgroundColor || '#1a1a1a'); // History background
 | ||||
|       document.documentElement.style.setProperty('--left-panel-background-color', themeVariables.leftPanelBackgroundColor || '#1e1e1e'); // Left panel background
 | ||||
|       document.documentElement.style.setProperty('--conversation-background-color', themeVariables.conversationBackgroundColor || '#2c2c2c'); // Conversation container background
 | ||||
|       document.documentElement.style.setProperty('--faq-background-color', themeVariables.faqBackgroundColor || '#2c2c2c'); // FAQ section background
 | ||||
|       document.documentElement.style.setProperty('--faq-heading-color', themeVariables.faqHeadingColor || '#ffffff'); // FAQ heading color
 | ||||
|       document.documentElement.style.setProperty('--faq-item-background-color', themeVariables.faqItemBackgroundColor || '#3c3c3c'); // FAQ items background
 | ||||
|       document.documentElement.style.setProperty('--faq-item-heading-color', themeVariables.faqItemHeadingColor || '#ffffff'); // FAQ items heading color
 | ||||
|       document.documentElement.style.setProperty('--faq-item-text-color', themeVariables.faqItemTextColor || '#e0e0e0'); // FAQ items text color
 | ||||
|       document.documentElement.style.setProperty('--faq-item-hover-background-color', themeVariables.faqItemHoverBackgroundColor || '#5a5a5a'); // FAQ items hover background
 | ||||
|       document.documentElement.style.setProperty('--input-border-color', themeVariables.inputBorderColor || '#3c3c3c'); // Input border color
 | ||||
|       document.documentElement.style.setProperty('--font-family', themeVariables.fontFamily || "'Poppins', 'sans-serif'"); // Font family
 | ||||
|       document.documentElement.style.setProperty('--font-size', themeVariables.fontSize || '16px'); // Font size
 | ||||
|       document.documentElement.style.setProperty('--burger-menu-background-color', themeVariables.burgerMenu || '#79832e'); // Burger menu background color
 | ||||
|      | ||||
| } | ||||
|  |  | |||
							
								
								
									
										29
									
								
								app/page.tsx
									
										
									
									
									
								
							
							
						
						
									
										29
									
								
								app/page.tsx
									
										
									
									
									
								
							|  | @ -7,6 +7,8 @@ import Documentation from './components/Documentation'; // Ensure the import pat | |||
| import History from './components/History'; | ||||
| import Models from './components/Models'; | ||||
| import Credits from './components/Credits'; | ||||
| import Settings from './components/Settings'; | ||||
| import { applyIOMarketTheme, applyWhiteTheme, applyBlackTheme, applyCustomTheme } from './components/theme' | ||||
| import Head from 'next/head'; | ||||
| import './styles/master.css'; | ||||
| 
 | ||||
|  | @ -26,6 +28,33 @@ const LandingPage: React.FC = () => { | |||
|     } | ||||
|   }; | ||||
| 
 | ||||
|   const [selectedTheme, setSelectedTheme] = useState<string>(''); | ||||
| 
 | ||||
|     useEffect(() => { | ||||
|       const savedTheme = localStorage.getItem('selectedTheme'); | ||||
|       if (savedTheme) { | ||||
|         setSelectedTheme(savedTheme); | ||||
|         // Apply the saved theme on initial load
 | ||||
|         switch (savedTheme) { | ||||
|           case 'IOMARKET': | ||||
|             applyIOMarketTheme(); | ||||
|             break; | ||||
|           case 'WHITE': | ||||
|             applyWhiteTheme(); | ||||
|             break; | ||||
|           case 'BLACK': | ||||
|             applyBlackTheme(); | ||||
|             break; | ||||
|           case 'CUSTOM': | ||||
|             applyCustomTheme(); | ||||
|             break; | ||||
|           default: | ||||
|             applyIOMarketTheme(); | ||||
|             break; | ||||
|         } | ||||
|       }    | ||||
|     }, []); // Runs only once when the component mounts          
 | ||||
| 
 | ||||
|   return ( | ||||
|     <> | ||||
|         <Header | ||||
|  |  | |||
							
								
								
									
										16
									
								
								py/api.py
									
										
									
									
									
								
							
							
						
						
									
										16
									
								
								py/api.py
									
										
									
									
									
								
							|  | @ -89,20 +89,20 @@ class API: | |||
| 
 | ||||
|         @self.app.route('/interstellar_ai/db', methods=['POST']) | ||||
|         def db_manipulate(): | ||||
|             action = request.args.get('action') | ||||
|             data = request.args.get('data') | ||||
|             sent_data = request.get_json() | ||||
|             action = sent_data.get('action') | ||||
|             if action == "create_account": | ||||
|                 return jsonify({'status': 200, 'response': self.db.add_user(data)}) | ||||
|                 return jsonify({'status': 200, 'response': self.db.add_user(sent_data)}) | ||||
|             elif action == "change_password": | ||||
|                 return jsonify({'status': 200, 'response': self.db.update_password(data)}) | ||||
|                 return jsonify({'status': 200, 'response': self.db.update_password(sent_data)}) | ||||
|             elif action == "get_data": | ||||
|                 return jsonify({'status': 200, 'response': self.db.get_data(data)}) | ||||
|                 return jsonify({'status': 200, 'response': self.db.get_data(sent_data)}) | ||||
|             elif action == "change_data": | ||||
|                 return jsonify({'status': 200, 'response': self.db.change_data(data)}) | ||||
|                 return jsonify({'status': 200, 'response': self.db.change_data(sent_data)}) | ||||
|             elif action == "check_credentials": | ||||
|                 return jsonify({'status': 200, 'response': self.db.check_credentials(data)}) | ||||
|                 return jsonify({'status': 200, 'response': self.db.check_credentials(sent_data)}) | ||||
|             elif action == "delete_account": | ||||
|                 return jsonify({'status': 200, 'response': self.db.delete_user(data)}) | ||||
|                 return jsonify({'status': 200, 'response': self.db.delete_user(sent_data)}) | ||||
| 
 | ||||
|             return jsonify({'status': 401, 'response': "Invalid action"}) | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										35
									
								
								py/db.py
									
										
									
									
									
								
							
							
						
						
									
										35
									
								
								py/db.py
									
										
									
									
									
								
							|  | @ -9,11 +9,15 @@ class DB: | |||
|         self.database = {} | ||||
| 
 | ||||
|     def ensure_username(self, data): | ||||
|         if hasattr(data, 'username'): | ||||
|             return data.get['username'] | ||||
|         elif hasattr(data, 'email'): | ||||
|         print(data) | ||||
|         print(self.database) | ||||
|         if 'username' in data: | ||||
|             print("usr") | ||||
|             return data.get('username') | ||||
|         elif 'email' in data: | ||||
|             print("email") | ||||
|             for index, entry in self.database: | ||||
|                 if entry.get['email'] == data.get['email']: | ||||
|                 if entry.get('email') == data.get('email'): | ||||
|                     return index | ||||
| 
 | ||||
|     @staticmethod | ||||
|  | @ -23,19 +27,22 @@ class DB: | |||
|         return hashed_password | ||||
| 
 | ||||
|     def add_user(self, data): | ||||
|         username = data.get['username'] | ||||
|         password = data.get['password'] | ||||
|         email = data.get['email'] | ||||
|         username = data.get('username') | ||||
|         password = data.get('password') | ||||
|         email = data.get('email') | ||||
|         hashed_password = self.hash_password(password) | ||||
|         user_data = {"hashed_password": hashed_password, "email": email, "data": None} | ||||
|         if username not in self.database: | ||||
|             self.database[username] = user_data | ||||
|             print("yes") | ||||
|             self.save_database() | ||||
|             return True | ||||
|         print("fail") | ||||
|         return False | ||||
| 
 | ||||
|     def delete_user(self, data): | ||||
|         username = self.ensure_username(data) | ||||
|         data = data.get['data'] | ||||
|         data = data.get('data') | ||||
|         if not self.check_credentials(data): | ||||
|             return False | ||||
| 
 | ||||
|  | @ -45,7 +52,7 @@ class DB: | |||
| 
 | ||||
|     def change_data(self, data): | ||||
|         username = self.ensure_username(data) | ||||
|         data = data.get['data'] | ||||
|         data = data.get('data') | ||||
|         if not self.check_credentials(data): | ||||
|             return False | ||||
| 
 | ||||
|  | @ -55,7 +62,7 @@ class DB: | |||
| 
 | ||||
|     def update_password(self, data): | ||||
|         username = self.ensure_username(data) | ||||
|         new_password = data.get['new_password'] | ||||
|         new_password = data.get('new_password') | ||||
|         if not self.check_credentials(data): | ||||
|             return False | ||||
| 
 | ||||
|  | @ -66,12 +73,15 @@ class DB: | |||
| 
 | ||||
|     def check_credentials(self, data): | ||||
|         username = self.ensure_username(data) | ||||
|         password = data.get['password'] | ||||
|         password = data.get('password') | ||||
|         if username not in self.database: | ||||
|             print("no username") | ||||
|             print(username) | ||||
|             return False | ||||
| 
 | ||||
|         stored_hashed_password = self.database[username]["hashed_password"] | ||||
|         entered_hashed_password = self.hash_password(password) | ||||
|         print(stored_hashed_password == entered_hashed_password) | ||||
|         return stored_hashed_password == entered_hashed_password | ||||
| 
 | ||||
|     def get_data(self, data): | ||||
|  | @ -79,7 +89,7 @@ class DB: | |||
|         if not self.check_credentials(data): | ||||
|             return None | ||||
| 
 | ||||
|         send_back = self.database[username].get['data'] | ||||
|         send_back = self.database[username].get('data') | ||||
|         return send_back | ||||
| 
 | ||||
|     def save_database(self): | ||||
|  | @ -90,6 +100,7 @@ class DB: | |||
| 
 | ||||
|         else: | ||||
|             with open("database.json", 'w') as file: | ||||
|                 print("saving") | ||||
|                 json.dump(self.database, file) | ||||
| 
 | ||||
|     def load_database(self): | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue