Merge pull request 'Merge pull request 'main' (#133) from sageTheDm/interstellar_ai:main into main' (#51) from React-Group/interstellar_ai:main into main #134

Merged
Patrick_Pluto merged 4 commits from sageTheDm/interstellar_ai:main into main 2024-10-10 10:39:45 +02:00
2 changed files with 161 additions and 55 deletions

View file

@ -120,7 +120,8 @@ const InputOutputBackend: React.FC = () => {
Communicate in the language specified by the user (country code: ${preferredLanguage}), and only in this language. Communicate in the language specified by the user (country code: ${preferredLanguage}), and only in this language.
You are only able to change language if the user specifically states you must. You are only able to change language if the user specifically states you must.
Do not answer in multiple languages or multiple measurement systems under any circumstances other than the user requesting it. Do not answer in multiple languages or multiple measurement systems under any circumstances other than the user requesting it.
These are the currently newest Weather infos for the region. In case the user asks about anything weather related, you can use the following data to help the user: ${weatherData}. If there is nothing there say there is no data` These are the currently newest Weather infos for the region. Only for the case when the user asks about anything weather related,
you can use the following data to help the user: ${weatherData}. If there is nothing there say there is no data`
: `You are a helpful assistant.`; : `You are a helpful assistant.`;
console.log(newSystemMessage) console.log(newSystemMessage)
setSystemMessage(newSystemMessage) setSystemMessage(newSystemMessage)

View file

@ -1,21 +1,8 @@
"use client"; "use client";
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect } from 'react';
// Define the types for ModelType and ModelListType // Define all models that should be available.
type ModelType = { const modelList = {
model_type: string;
Math: string;
Code: string;
Language: string;
Weather: string;
};
type ModelListType = {
[key: string]: ModelType;
};
// Define the AI models list
const modelList: ModelListType = {
'Offline Fast': { 'Offline Fast': {
model_type: 'local', model_type: 'local',
Math: 'qwen2-math:1.5b', Math: 'qwen2-math:1.5b',
@ -99,47 +86,161 @@ const modelList: ModelListType = {
Code: 'open-codestral-mamba', Code: 'open-codestral-mamba',
Language: 'open-mistral-nemo', Language: 'open-mistral-nemo',
Weather: 'open-mistral-nemo', Weather: 'open-mistral-nemo',
}, }
}
// Define the available selectedAIFunction options
const modelDropdown = {
offlineNonFoss: ['Offline Fast', 'Offline Slow'],
offlineFoss: ['Offline Fast (FOSS)', 'Offline Slow (FOSS)'],
onlineNonFoss: [
'Online Cheap (OpenAI)',
'Online Expensive (OpenAI)',
'Online Cheap (Anthropic)',
'Online Expensive (Anthropic)',
'Online Cheap (Google)',
'Online Expensive (Google)',
'Online (La Plateforme)'
],
onlineFoss: ['Online (FOSS) (La Plateforme)'],
}; };
// AI Functions list const selectedAIFunction = [
const aiFunctions = ['Math', 'Code', 'Language', 'Weather'] as const; 'Code',
type AIFunction = typeof aiFunctions[number]; // Restrict to these exact function names 'Math',
'Language',
'Weather'
]
const ModelSection: React.FC = () => { const ModelSection: React.FC = () => {
const [selectedModelDropdown, setSelectedModelDropdown] = useState(() => "Offline Fast"); // Initialize state with value from localStorage or default to ''
const [activeSelectedAIFunction, setActiveSelectedAIFunction] = useState(() => "Code"); const [selectedModelDropdown, setSelectedModelDropdown] = useState('');
const [, setSelectedModel] = useState<string>(""); const [radioSelection, setRadioSelection] = useState<string | null>("")
const [, setSelectedModelType] = useState<string>(""); const [activeSelectedAIFunction, setActiveSelectedAIFunction] = useState('');
const [currentSelectedAIFunction, setCurrentSelectedAIFunction] = useState<string | null>("");
const [isOpenSourceMode, setIsOpenSourceMode] = useState<string|null>("false")
useEffect(() => { useEffect(() => {
setSelectedModelDropdown(localStorage.getItem("selectedModelDropdown")|| "Offline Fast"); if (typeof localStorage !== 'undefined') {
setActiveSelectedAIFunction(localStorage.getItem("activeSelectedAIFunction") || "Code"); const defaultValues = {
selectedModelDropdown: 'Offline Fast',
activeSelectedAIFunction: 'Code',
model: 'starcoder2',
radioSelection: 'None',
type: 'local',
};
Object.entries(defaultValues).forEach(([key, value]) => {
if (!localStorage.getItem(key)) {
localStorage.setItem(key, value);
}
});
setIsOpenSourceMode(localStorage.getItem("openSourceMode"));
setActiveSelectedAIFunction(localStorage.getItem("activeSelectedAIFunction") || '');
setRadioSelection(localStorage.getItem("radioSelection") || '');
setSelectedModelDropdown(localStorage.getItem('selectedModelDropdown') || '');
const handleStorageChange = () => {
setSelectedModelDropdown(localStorage.getItem('selectedModelDropdown') || '');
};
// Update immediately when localStorage changes
window.addEventListener('storage', handleStorageChange);
// Cleanup listener on component unmount
return () => {
window.removeEventListener('storage', handleStorageChange);
};
}
}, []); }, []);
// Update the model and type when the dropdown or function changes
useEffect(() => { useEffect(() => {
const aiFunctionsActiveSelectedAIFunction = activeSelectedAIFunction as AIFunction if (typeof localStorage !== 'undefined') {
const newSelectedModel = modelList[selectedModelDropdown]?.[aiFunctionsActiveSelectedAIFunction] || ""; const storedActiveSelectedAIFunction = localStorage.getItem("activeSelectedAIFunction") || "";
const newModelType = modelList[selectedModelDropdown]?.model_type || ""; if (storedActiveSelectedAIFunction !== currentSelectedAIFunction) {
setCurrentSelectedAIFunction(storedActiveSelectedAIFunction);
setSelectedModel(newSelectedModel); }
setSelectedModelType(newModelType); }
}, [activeSelectedAIFunction]);
localStorage.setItem("model", newSelectedModel);
localStorage.setItem("type", newModelType);
}, [selectedModelDropdown, activeSelectedAIFunction]);
const handleModelChange = (event: React.ChangeEvent<HTMLSelectElement>) => { const handleModelChange = (event: React.ChangeEvent<HTMLSelectElement>) => {
const newModel = event.target.value; const newModel = event.target.value;
setSelectedModelDropdown(newModel); setSelectedModelDropdown(newModel);
localStorage.setItem('selectedModelDropdown', newModel); if (typeof localStorage !== 'undefined') {
localStorage.setItem('selectedModelDropdown', newModel); // Update localStorage directly
const model = localStorage.getItem('activeSelectedAIFunction') || "Code"
modelClicked(model)
}
}; };
const modelClicked = (functionName: AIFunction) => { // Determine the filtered models based on current radioSelection
setActiveSelectedAIFunction(functionName); const filteredModels = (() => {
localStorage.setItem('activeSelectedAIFunction', functionName); let models = [];
}; switch (radioSelection) {
case 'Offline':
models = [
...modelDropdown.onlineNonFoss,
...modelDropdown.onlineFoss,
];
if (isOpenSourceMode == "true") {
models = [
...modelDropdown.onlineFoss,
];
} // Show only offline models without FOSS
break;
case 'Online':
models = [
...modelDropdown.offlineNonFoss,
...modelDropdown.offlineFoss,
];
if (isOpenSourceMode == "true") {
models = [
...modelDropdown.offlineFoss,
];
} // Show only online models without FOSS
break;
case 'None':
models = [
...modelDropdown.offlineNonFoss,
...modelDropdown.offlineFoss,
...modelDropdown.onlineNonFoss,
...modelDropdown.onlineFoss,
];
if (isOpenSourceMode == "true") {
models = [
...modelDropdown.offlineFoss,
...modelDropdown.onlineFoss,
];
} // Show all models if nothing matches
break;
default:
models = [
...modelDropdown.offlineNonFoss,
...modelDropdown.offlineFoss,
...modelDropdown.onlineNonFoss,
...modelDropdown.onlineFoss,
]; // Show all models if nothing matches
break;
}
return Array.from(new Set(models)); // Remove duplicates using Set
})();
const isOfflineModel = (model: string) =>
modelDropdown.offlineNonFoss.includes(model) || modelDropdown.offlineFoss.includes(model);
const modelClicked = (model: string) => {
if (typeof localStorage !== 'undefined') {
localStorage.setItem('activeSelectedAIFunction', model)
setActiveSelectedAIFunction(model)
const modelDropdown = localStorage.getItem('selectedModelDropdown') || 'Offline Fast'
const selectedAIFunction = modelDropdown as keyof typeof modelList;
localStorage.setItem("model", modelList[selectedAIFunction][model as keyof typeof modelList[typeof selectedAIFunction]])
localStorage.setItem("type", modelList[selectedAIFunction]['model_type' as keyof typeof modelList[typeof selectedAIFunction]])
}
}
return ( return (
<div className="model-background"> <div className="model-background">
@ -148,29 +249,33 @@ const ModelSection: React.FC = () => {
<h3>Different AI Models</h3> <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={selectedModelDropdown} onChange={handleModelChange}> <select id="model-select" value={selectedModelDropdown} onChange={handleModelChange}>
{Object.keys(modelList).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">
{aiFunctions.map((functionName) => ( {selectedAIFunction.map(
(displayedCategory) => (
<button <button
key={functionName} key={displayedCategory}
className={`${functionName.toLowerCase()}-model model-box ${activeSelectedAIFunction === functionName ? 'selected' : ''}`} className={`${displayedCategory.toLowerCase()}-model model-box ${currentSelectedAIFunction === displayedCategory ? 'selected' : ''}`}
onClick={() => modelClicked(functionName)} onClick={() => modelClicked(displayedCategory)}
> >
<div className="overlay"> <div className="overlay">
<h3>{functionName}</h3> <h3>{displayedCategory}</h3>
{isOfflineModel(selectedModelDropdown) && <img src="/img/nowifi.svg" alt="No Wi-Fi" />}
</div> </div>
</button> </button>
))} )
)}
</div> </div>
</div> </div>
</div> </div>