Merge pull request 'main' (#26) from React-Group/interstellar_ai:main into main
Reviewed-on: https://interstellardevelopment.org/code/code/YasinOnm08/interstellar_ai/pulls/26
|
@ -1,23 +1,37 @@
|
||||||
import React, { useState, useEffect } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
|
|
||||||
const Models: React.FC = () => {
|
// Define the available model options
|
||||||
const modelOptions = [
|
const offlineModels = [
|
||||||
'Offline Fast',
|
'Offline Fast',
|
||||||
'Offline Fast (FOSS)',
|
'Offline Fast (FOSS)',
|
||||||
'Offline Slow',
|
'Offline Slow',
|
||||||
'Offline Slow (FOSS)',
|
'Offline Slow (FOSS)',
|
||||||
'Online (La Plateforme)',
|
];
|
||||||
'Online (FOSS) (La Plateforme)',
|
|
||||||
'Online Cheap (OpenAI)',
|
|
||||||
'Online Expensive (OpenAI)',
|
|
||||||
'Online Cheap (Anthropic)',
|
|
||||||
'Online Expensive (Anthropic)',
|
|
||||||
'Online Cheap (Google)',
|
|
||||||
'Online Expensive (Google)',
|
|
||||||
];
|
|
||||||
|
|
||||||
|
const onlineModels = [
|
||||||
|
'Online (La Plateforme)',
|
||||||
|
'Online (FOSS) (La Plateforme)',
|
||||||
|
'Online Cheap (OpenAI)',
|
||||||
|
'Online Expensive (OpenAI)',
|
||||||
|
'Online Cheap (Anthropic)',
|
||||||
|
'Online Expensive (Anthropic)',
|
||||||
|
'Online Cheap (Google)',
|
||||||
|
'Online Expensive (Google)',
|
||||||
|
];
|
||||||
|
|
||||||
|
const fossModels = [
|
||||||
|
'Offline Fast (FOSS)',
|
||||||
|
'Offline Slow (FOSS)',
|
||||||
|
'Online (FOSS) (La Plateforme)',
|
||||||
|
];
|
||||||
|
|
||||||
|
// Define the properties passed to the Models component
|
||||||
|
interface ModelsProps {
|
||||||
|
selectedOption: string; // Privacy setting: "Offline", "AI Online", "None"
|
||||||
|
}
|
||||||
|
|
||||||
|
const Models: React.FC<ModelsProps> = ({ selectedOption }) => {
|
||||||
const [selectedModel, setSelectedModel] = useState<string>(() => {
|
const [selectedModel, setSelectedModel] = useState<string>(() => {
|
||||||
// Load the selected model from localStorage on initial render
|
|
||||||
return localStorage.getItem('selectedModel') || 'Offline Fast';
|
return localStorage.getItem('selectedModel') || 'Offline Fast';
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -26,31 +40,45 @@ const Models: React.FC = () => {
|
||||||
setSelectedModel(newModel);
|
setSelectedModel(newModel);
|
||||||
};
|
};
|
||||||
|
|
||||||
const isOfflineModel = (model: string) => {
|
const isOfflineModel = (model: string) => offlineModels.includes(model);
|
||||||
return model.includes('Offline');
|
const isOnlineModel = (model: string) => onlineModels.includes(model);
|
||||||
};
|
const isFossModel = (model: string) => fossModels.includes(model);
|
||||||
|
|
||||||
// Save selected model to localStorage whenever it changes
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
localStorage.setItem('selectedModel', selectedModel);
|
localStorage.setItem('selectedModel', selectedModel);
|
||||||
}, [selectedModel]);
|
}, [selectedModel]);
|
||||||
|
|
||||||
|
const filteredModels = (() => {
|
||||||
|
switch (selectedOption) {
|
||||||
|
case 'Offline':
|
||||||
|
return offlineModels; // Show only offline models
|
||||||
|
case 'AI Online':
|
||||||
|
return onlineModels; // Show only online models
|
||||||
|
default:
|
||||||
|
return [...offlineModels, ...onlineModels]; // Show all models
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="model-background">
|
<div className="model-background">
|
||||||
<div className="models">
|
<div className="models">
|
||||||
<div className="titel">
|
<div className="title">
|
||||||
<h1>Different AI models</h1>
|
<h3>Different AI models</h3>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* Model Selection Dropdown */}
|
||||||
<div className="model-dropdown">
|
<div className="model-dropdown">
|
||||||
<label htmlFor="model-select">Select AI Model:</label>
|
<label htmlFor="model-select">Select AI Model:</label>
|
||||||
<select id="model-select" value={selectedModel} onChange={handleModelChange}>
|
<select id="model-select" value={selectedModel} onChange={handleModelChange}>
|
||||||
{modelOptions.map((model) => (
|
{filteredModels.map((model) => (
|
||||||
<option key={model} value={model}>
|
<option key={model} value={model}>
|
||||||
{model}
|
{model}
|
||||||
</option>
|
</option>
|
||||||
))}
|
))}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* Model Grid with Cards */}
|
||||||
<div className="grid">
|
<div className="grid">
|
||||||
<button className="code-model model-box">
|
<button className="code-model model-box">
|
||||||
<div className="overlay">
|
<div className="overlay">
|
||||||
|
|
|
@ -6,7 +6,17 @@ const Settings: React.FC<{ closeSettings: () => void; accountName: string }> = (
|
||||||
|
|
||||||
const getItemFromLocalStorage = (key: string) => {
|
const getItemFromLocalStorage = (key: string) => {
|
||||||
const item = localStorage.getItem(key);
|
const item = localStorage.getItem(key);
|
||||||
return item ? JSON.parse(item) : false; // Default to false if item is null
|
|
||||||
|
if (item) {
|
||||||
|
try {
|
||||||
|
return JSON.parse(item); // Attempt to parse the item
|
||||||
|
} catch (e) {
|
||||||
|
console.error(`Error parsing JSON for key "${key}":`, e);
|
||||||
|
return false; // Return false if parsing fails
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false; // Default to false if item is null or empty
|
||||||
};
|
};
|
||||||
|
|
||||||
// Active section
|
// Active section
|
||||||
|
@ -24,8 +34,7 @@ const Settings: React.FC<{ closeSettings: () => void; accountName: string }> = (
|
||||||
const [timeZone, setTimeZone] = useState(() => localStorage.getItem('timeZone') || 'GMT');
|
const [timeZone, setTimeZone] = useState(() => localStorage.getItem('timeZone') || 'GMT');
|
||||||
|
|
||||||
// Online AI and chat history settings
|
// Online AI and chat history settings
|
||||||
// State declarations
|
const [selectedOption, setSelectedOption] = useState('Offline'); // Default to 'Offline'
|
||||||
const [disableOnlineAI, setDisableOnlineAI] = useState(() => getItemFromLocalStorage('disableOnlineAI'));
|
|
||||||
const [disableChatHistory, setDisableChatHistory] = useState(() => getItemFromLocalStorage('disableChatHistory'));
|
const [disableChatHistory, setDisableChatHistory] = useState(() => getItemFromLocalStorage('disableChatHistory'));
|
||||||
const [disableAIMemory, setDisableAIMemory] = useState(() => getItemFromLocalStorage('disableAIMemory'));
|
const [disableAIMemory, setDisableAIMemory] = useState(() => getItemFromLocalStorage('disableAIMemory'));
|
||||||
const [openSourceMode, setOpenSourceMode] = useState(() => getItemFromLocalStorage('openSourceMode'));
|
const [openSourceMode, setOpenSourceMode] = useState(() => getItemFromLocalStorage('openSourceMode'));
|
||||||
|
@ -58,7 +67,7 @@ const Settings: React.FC<{ closeSettings: () => void; accountName: string }> = (
|
||||||
const [inputBorderColor, setInputBorderColor] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--input-border-color').trim());
|
const [inputBorderColor, setInputBorderColor] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--input-border-color').trim());
|
||||||
const [fontFamily, setFontFamily] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--font-family').trim());
|
const [fontFamily, setFontFamily] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--font-family').trim());
|
||||||
const [fontSize, setFontSize] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--font-size').trim());
|
const [fontSize, setFontSize] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--font-size').trim());
|
||||||
const [burgerMenu, setBurgerMenu] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--burger-menu-background-color:').trim());
|
const [burgerMenu, setBurgerMenu] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--burger-menu-background-color').trim());
|
||||||
|
|
||||||
// Theme selection
|
// Theme selection
|
||||||
const [selectedTheme, setSelectedTheme] = useState(() => localStorage.getItem('selectedTheme') || 'default');
|
const [selectedTheme, setSelectedTheme] = useState(() => localStorage.getItem('selectedTheme') || 'default');
|
||||||
|
@ -69,162 +78,112 @@ const Settings: React.FC<{ closeSettings: () => void; accountName: string }> = (
|
||||||
const [anthropic, setAnthropic] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--online-cheap-anthropic').trim());
|
const [anthropic, setAnthropic] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--online-cheap-anthropic').trim());
|
||||||
const [google, setGoogle] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--online-cheap-google').trim());
|
const [google, setGoogle] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--online-cheap-google').trim());
|
||||||
|
|
||||||
|
|
||||||
// Effect hooks to update localStorage whenever any state changes
|
// Effect hooks to update localStorage whenever any state changes
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
localStorage.setItem('activeSection', activeSection);
|
const settings = {
|
||||||
}, [activeSection]);
|
activeSection,
|
||||||
|
preferredLanguage,
|
||||||
|
preferredCurrency,
|
||||||
|
dateFormat,
|
||||||
|
timeFormat,
|
||||||
|
timeZone,
|
||||||
|
selectedOption,
|
||||||
|
disableChatHistory,
|
||||||
|
disableAIMemory,
|
||||||
|
openSourceMode,
|
||||||
|
newName,
|
||||||
|
newEmail,
|
||||||
|
newPassword,
|
||||||
|
preferredMeasurement,
|
||||||
|
backgroundColor,
|
||||||
|
textColor,
|
||||||
|
inputBackgroundColor,
|
||||||
|
inputButtonColor,
|
||||||
|
inputButtonHoverColor,
|
||||||
|
userMessageBackgroundColor,
|
||||||
|
userMessageTextColor,
|
||||||
|
aiMessageBackgroundColor,
|
||||||
|
aiMessageTextColor,
|
||||||
|
buttonBackgroundColor,
|
||||||
|
buttonHoverBackgroundColor,
|
||||||
|
modelsBackgroundColor,
|
||||||
|
historyBackgroundColor,
|
||||||
|
leftPanelBackgroundColor,
|
||||||
|
conversationBackgroundColor,
|
||||||
|
popUpTextColor,
|
||||||
|
inputBorderColor,
|
||||||
|
fontFamily,
|
||||||
|
fontSize,
|
||||||
|
burgerMenu,
|
||||||
|
selectedTheme,
|
||||||
|
laPlateforme,
|
||||||
|
openAI,
|
||||||
|
anthropic,
|
||||||
|
google,
|
||||||
|
};
|
||||||
|
|
||||||
useEffect(() => {
|
// Update local storage
|
||||||
localStorage.setItem('preferredLanguage', preferredLanguage);
|
for (const [key, value] of Object.entries(settings)) {
|
||||||
}, [preferredLanguage]);
|
if (typeof value === 'boolean') {
|
||||||
|
localStorage.setItem(key, JSON.stringify(value));
|
||||||
|
} else {
|
||||||
|
localStorage.setItem(key, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, [
|
||||||
|
activeSection,
|
||||||
|
preferredLanguage,
|
||||||
|
preferredCurrency,
|
||||||
|
dateFormat,
|
||||||
|
timeFormat,
|
||||||
|
timeZone,
|
||||||
|
selectedOption,
|
||||||
|
disableChatHistory,
|
||||||
|
disableAIMemory,
|
||||||
|
openSourceMode,
|
||||||
|
newName,
|
||||||
|
newEmail,
|
||||||
|
newPassword,
|
||||||
|
preferredMeasurement,
|
||||||
|
backgroundColor,
|
||||||
|
textColor,
|
||||||
|
inputBackgroundColor,
|
||||||
|
inputButtonColor,
|
||||||
|
inputButtonHoverColor,
|
||||||
|
userMessageBackgroundColor,
|
||||||
|
userMessageTextColor,
|
||||||
|
aiMessageBackgroundColor,
|
||||||
|
aiMessageTextColor,
|
||||||
|
buttonBackgroundColor,
|
||||||
|
buttonHoverBackgroundColor,
|
||||||
|
modelsBackgroundColor,
|
||||||
|
historyBackgroundColor,
|
||||||
|
leftPanelBackgroundColor,
|
||||||
|
conversationBackgroundColor,
|
||||||
|
popUpTextColor,
|
||||||
|
inputBorderColor,
|
||||||
|
fontFamily,
|
||||||
|
fontSize,
|
||||||
|
burgerMenu,
|
||||||
|
selectedTheme,
|
||||||
|
laPlateforme,
|
||||||
|
openAI,
|
||||||
|
anthropic,
|
||||||
|
google,
|
||||||
|
]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
localStorage.setItem('preferredCurrency', preferredCurrency);
|
const savedOption = localStorage.getItem('radioSelection');
|
||||||
}, [preferredCurrency]);
|
if (savedOption) {
|
||||||
|
setSelectedOption(savedOption); // Set saved selection
|
||||||
|
}
|
||||||
|
}, []);
|
||||||
|
|
||||||
useEffect(() => {
|
const handleRadioChange = (newValue: string) => {
|
||||||
localStorage.setItem('dateFormat', dateFormat);
|
setSelectedOption(newValue); // Update the state with the selected option
|
||||||
}, [dateFormat]);
|
localStorage.setItem('radioSelection', newValue); // Save the selection for persistence
|
||||||
|
};
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('timeFormat', timeFormat);
|
|
||||||
}, [timeFormat]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('timeZone', timeZone);
|
|
||||||
}, [timeZone]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('disableOnlineAI', JSON.stringify(disableOnlineAI));
|
|
||||||
}, [disableOnlineAI]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('disableChatHistory', JSON.stringify(disableChatHistory));
|
|
||||||
}, [disableChatHistory]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('disableAIMemory', JSON.stringify(disableAIMemory));
|
|
||||||
}, [disableAIMemory]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('openSourceMode', JSON.stringify(openSourceMode));
|
|
||||||
}, [openSourceMode]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('newName', newName);
|
|
||||||
}, [newName]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('newEmail', newEmail);
|
|
||||||
}, [newEmail]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('newPassword', newPassword);
|
|
||||||
}, [newPassword]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('preferredMeasurement', preferredMeasurement);
|
|
||||||
}, [preferredMeasurement]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('backgroundColor', backgroundColor);
|
|
||||||
}, [backgroundColor]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('textColor', textColor);
|
|
||||||
}, [textColor]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('inputBackgroundColor', inputBackgroundColor);
|
|
||||||
}, [inputBackgroundColor]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('inputButtonColor', inputButtonColor);
|
|
||||||
}, [inputButtonColor]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('inputButtonHoverColor', inputButtonHoverColor);
|
|
||||||
}, [inputButtonHoverColor]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('userMessageBackgroundColor', userMessageBackgroundColor);
|
|
||||||
}, [userMessageBackgroundColor]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('userMessageTextColor', userMessageTextColor);
|
|
||||||
}, [userMessageTextColor]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('aiMessageBackgroundColor', aiMessageBackgroundColor);
|
|
||||||
}, [aiMessageBackgroundColor]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('aiMessageTextColor', aiMessageTextColor);
|
|
||||||
}, [aiMessageTextColor]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('buttonBackgroundColor', buttonBackgroundColor);
|
|
||||||
}, [buttonBackgroundColor]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('buttonHoverBackgroundColor', buttonHoverBackgroundColor);
|
|
||||||
}, [buttonHoverBackgroundColor]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('modelsBackgroundColor', modelsBackgroundColor);
|
|
||||||
}, [modelsBackgroundColor]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('historyBackgroundColor', historyBackgroundColor);
|
|
||||||
}, [historyBackgroundColor]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('leftPanelBackgroundColor', leftPanelBackgroundColor);
|
|
||||||
}, [leftPanelBackgroundColor]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('conversationBackgroundColor', conversationBackgroundColor);
|
|
||||||
}, [conversationBackgroundColor]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('popUpTextColor', popUpTextColor);
|
|
||||||
}, [popUpTextColor]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('inputBorderColor', inputBorderColor);
|
|
||||||
}, [inputBorderColor]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('fontFamily', fontFamily);
|
|
||||||
}, [fontFamily]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('fontSize', fontSize);
|
|
||||||
}, [fontSize]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('burgerMenu', burgerMenu);
|
|
||||||
}, [fontSize]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('selectedTheme', selectedTheme);
|
|
||||||
}, [selectedTheme]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('laPlateforme', laPlateforme);
|
|
||||||
}, [laPlateforme]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('openAI', openAI);
|
|
||||||
}, [openAI]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('anthropic', anthropic);
|
|
||||||
}, [anthropic]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
localStorage.setItem('google', google);
|
|
||||||
}, [google]);
|
|
||||||
|
|
||||||
// Apply imported settings to the CSS variables
|
// Apply imported settings to the CSS variables
|
||||||
const applySettings = (settings: any) => {
|
const applySettings = (settings: any) => {
|
||||||
|
@ -439,16 +398,33 @@ const Settings: React.FC<{ closeSettings: () => void; accountName: string }> = (
|
||||||
return (
|
return (
|
||||||
<div className="settings-section">
|
<div className="settings-section">
|
||||||
<h2>Privacy Settings</h2>
|
<h2>Privacy Settings</h2>
|
||||||
|
|
||||||
|
{/* AI Mode Radio Options */}
|
||||||
<div className="settings-option">
|
<div className="settings-option">
|
||||||
<label>
|
<p>Disable Options:</p>
|
||||||
<input
|
<div className="slider">
|
||||||
type="checkbox"
|
<div
|
||||||
checked={disableOnlineAI}
|
className={`slider-option ${selectedOption === 'Offline' ? 'active' : ''}`}
|
||||||
onChange={() => setDisableOnlineAI(!disableOnlineAI)}
|
onClick={() => handleRadioChange('Offline')} // Handle selection
|
||||||
/>
|
>
|
||||||
Disable Online AI
|
Offline tools
|
||||||
</label>
|
</div>
|
||||||
|
<div
|
||||||
|
className={`slider-option ${selectedOption === 'AI Online' ? 'active' : ''}`}
|
||||||
|
onClick={() => handleRadioChange('AI Online')}
|
||||||
|
>
|
||||||
|
Online tools
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
className={`slider-option ${selectedOption === 'None' ? 'active' : ''}`}
|
||||||
|
onClick={() => handleRadioChange('None')}
|
||||||
|
>
|
||||||
|
None
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* Disable Chat History Checkbox */}
|
||||||
<div className="settings-option">
|
<div className="settings-option">
|
||||||
<label>
|
<label>
|
||||||
<input
|
<input
|
||||||
|
@ -459,6 +435,8 @@ const Settings: React.FC<{ closeSettings: () => void; accountName: string }> = (
|
||||||
Disable Chat History
|
Disable Chat History
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* Disable AI Memory Checkbox */}
|
||||||
<div className="settings-option">
|
<div className="settings-option">
|
||||||
<label>
|
<label>
|
||||||
<input
|
<input
|
||||||
|
@ -941,7 +919,7 @@ const Settings: React.FC<{ closeSettings: () => void; accountName: string }> = (
|
||||||
dateFormat,
|
dateFormat,
|
||||||
timeFormat,
|
timeFormat,
|
||||||
timeZone,
|
timeZone,
|
||||||
disableOnlineAI,
|
selectedOption,
|
||||||
disableChatHistory,
|
disableChatHistory,
|
||||||
disableAIMemory,
|
disableAIMemory,
|
||||||
openSourceMode,
|
openSourceMode,
|
||||||
|
|
|
@ -160,3 +160,28 @@
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
margin: 10px;
|
margin: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.slider {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider-option {
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 10px;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
border-radius: 5px;
|
||||||
|
transition: background-color 0.3s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider-option.active {
|
||||||
|
background-color: #007bff; /* Change to your active color */
|
||||||
|
color: white;
|
||||||
|
border-color: #007bff;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="radio"] {
|
||||||
|
display: none; /* Hide the default radio buttons */
|
||||||
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
header{
|
header{
|
||||||
position: absolute;
|
position: absolute;
|
||||||
padding: 0 20px;
|
padding: 0 20px;
|
||||||
top: 2em;
|
top: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 5em;
|
height: 5em;
|
||||||
|
|
Before Width: | Height: | Size: 555 KiB After Width: | Height: | Size: 392 KiB |
Before Width: | Height: | Size: 140 KiB After Width: | Height: | Size: 93 KiB |
Before Width: | Height: | Size: 243 KiB After Width: | Height: | Size: 184 KiB |
Before Width: | Height: | Size: 105 KiB After Width: | Height: | Size: 100 KiB |
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 71 KiB |
Before Width: | Height: | Size: 156 KiB After Width: | Height: | Size: 105 KiB |
Before Width: | Height: | Size: 1.4 MiB After Width: | Height: | Size: 1.1 MiB |
11
py/api.py
|
@ -99,16 +99,9 @@ class API:
|
||||||
|
|
||||||
@self.app.route('/interstellar_ai/api/voice_recognition', methods=['POST'])
|
@self.app.route('/interstellar_ai/api/voice_recognition', methods=['POST'])
|
||||||
def voice_recognition():
|
def voice_recognition():
|
||||||
print(request.args)
|
|
||||||
recog_type = request.form.get('type')
|
|
||||||
print(recog_type)
|
|
||||||
audio = request.files.get('audio')
|
audio = request.files.get('audio')
|
||||||
option = request.form.get('option')
|
text = self.voice.recognition(audio)
|
||||||
if recog_type == "basic":
|
return jsonify({'status': 200, 'response': text})
|
||||||
text = self.voice.basic_recognition(audio, option)
|
|
||||||
return jsonify({'status': 200, 'response': text})
|
|
||||||
else:
|
|
||||||
return jsonify({'status': 401, 'response': "Invalid type"})
|
|
||||||
|
|
||||||
@self.app.route('/interstellar_ai/api/weather', methods=['POST'])
|
@self.app.route('/interstellar_ai/api/weather', methods=['POST'])
|
||||||
def get_weather():
|
def get_weather():
|
||||||
|
|
|
@ -14,3 +14,4 @@ pycouchdb
|
||||||
pyttsx3
|
pyttsx3
|
||||||
pip-licenses
|
pip-licenses
|
||||||
openai-whisper
|
openai-whisper
|
||||||
|
pydub
|
26
py/voice.py
|
@ -1,24 +1,10 @@
|
||||||
import speech_recognition as sr
|
import whisper
|
||||||
|
|
||||||
|
|
||||||
class VoiceRecognition:
|
class VoiceRecognition:
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def basic_recognition(audio, option):
|
def recognition(audio):
|
||||||
print(type(audio))
|
model = whisper.load_model("base")
|
||||||
print("preparing")
|
result = model.transcribe(audio)
|
||||||
r = sr.Recognizer()
|
print(result["text"])
|
||||||
if option == "online":
|
return result["text"]
|
||||||
with sr.AudioFile(audio) as source:
|
|
||||||
print("online")
|
|
||||||
text = r.recognize_google_cloud(source)
|
|
||||||
print("recognized as: " + text)
|
|
||||||
return text
|
|
||||||
elif option == "offline":
|
|
||||||
with sr.AudioFile(audio) as source:
|
|
||||||
print("offline")
|
|
||||||
text = r.recognize_sphinx(source)
|
|
||||||
print("recognized as: " + text)
|
|
||||||
return text
|
|
||||||
|
|
||||||
print("nothing")
|
|
||||||
return False
|
|
||||||
|
|