Compare commits

..

No commits in common. "b8eccfbefeffced21cd15fc359df737320cc3f9f" and "f1f124147d9815490aa3a70b905cbbc454320495" have entirely different histories.

13 changed files with 68 additions and 65 deletions

View file

@ -4,6 +4,7 @@ import ConversationFrontend from '../components/ConversationFrontend';
import InputFrontend from "../components/InputFrontend"; import InputFrontend from "../components/InputFrontend";
import { sendToVoiceRecognition } from "./voice_backend" import { sendToVoiceRecognition } from "./voice_backend"
import axios from "axios"; import axios from "axios";
import { changeHistory, checkCredentials, getHistory } from './database';
import { useChatHistory } from '../hooks/useChatHistory'; import { useChatHistory } from '../hooks/useChatHistory';
const InputOutputBackend: React.FC = () => { const InputOutputBackend: React.FC = () => {
@ -14,14 +15,14 @@ const InputOutputBackend: React.FC = () => {
} }
// Define state variables for user preferences and messages // Define state variables for user preferences and messages
const [chatHistory, setSelectedIndex, setChatHistory, updateMessage] = useChatHistory() const [chatHistory, setChatHistory, setSelectedIndex, updateMessage] = useChatHistory()
const [preferredCurrency, setPreferredCurrency] = useState<string>("USD"); const [preferredCurrency, setPreferredCurrency] = useState<string>("USD");
const [preferredLanguage, setPreferredLanguage] = useState<string>("english"); const [preferredLanguage, setPreferredLanguage] = useState<string>("english");
const [timeFormat, setTimeFormat] = useState<string>("24-hour"); const [timeFormat, setTimeFormat] = useState<string>("24-hour");
const [preferredMeasurement, setPreferredMeasurement] = useState<string>("metric"); const [preferredMeasurement, setPreferredMeasurement] = useState<string>("metric");
const [timeZone, setTimeZone] = useState<string>("GMT"); const [timeZone, setTimeZone] = useState<string>("GMT");
const [dateFormat, setDateFormat] = useState<string>("DD-MM-YYYY"); const [dateFormat, setDateFormat] = useState<string>("DD-MM-YYYY");
const [messages, setMessages] = useState<Message[]>(chatHistory.chats[chatHistory.selectedIndex].messages || []); const [messages, setMessages] = useState<Message[]>(chatHistory.chats[chatHistory.selectedIndex]?.messages || []);
const [myBoolean, setMyBoolean] = useState<boolean>(false); const [myBoolean, setMyBoolean] = useState<boolean>(false);
const [systemMessage, setSystemMessage] = useState<string>("You are a helpful assistant") const [systemMessage, setSystemMessage] = useState<string>("You are a helpful assistant")
const apiURL = new URL("http://localhost:5000/interstellar_ai/api/ai_create") const apiURL = new URL("http://localhost:5000/interstellar_ai/api/ai_create")
@ -31,26 +32,22 @@ const InputOutputBackend: React.FC = () => {
apiURL.hostname = "localhost" apiURL.hostname = "localhost"
} }
console.log(setSelectedIndex)
useEffect(() => {
useEffect(() => {
console.log("History", chatHistory); console.log("History", chatHistory);
console.log("Messages", messages); console.log("Messages", messages);
// Get the current chat's messages // Get the current chat's messages
const currentMessages = chatHistory.chats[chatHistory.selectedIndex].messages || []; const currentMessages = chatHistory.chats[chatHistory.selectedIndex]?.messages || [];
// If the selected chat has messages, set them // If currentMessages is not empty, update messages only if it's not the same
if (currentMessages.length > 0) { if (currentMessages.length > 0 && JSON.stringify(currentMessages) !== JSON.stringify(messages)) {
setMessages(currentMessages); setMessages(currentMessages);
} else if (currentMessages.length === 0) { } else if (messages.length === 0) {
// When creating a new chat and no messages exist yet, set default messages setMessages([{ role: "system", content: systemMessage }, { role: "assistant", content: "Hello! How can I help you?" }]);
addMessage("system", systemMessage)
addMessage("assistant", "Hello! How can I help you?")
console.log(systemMessage)
} }
}, [chatHistory, chatHistory.selectedIndex, systemMessage]); }, [chatHistory, setSelectedIndex]);
// Update messages when any of the settings change // Update messages when any of the settings change
useEffect(() => { useEffect(() => {
@ -83,9 +80,13 @@ useEffect(() => {
}, [preferredCurrency, preferredLanguage, timeFormat, preferredMeasurement, timeZone, dateFormat, myBoolean]); }, [preferredCurrency, preferredLanguage, timeFormat, preferredMeasurement, timeZone, dateFormat, myBoolean]);
useEffect(() => { useEffect(() => {
const messageIndex = 0 // system prompt is the first so index 0 const updateSystemprompt = (prompt: string) => {
updateMessage(messageIndex, systemMessage) setMessages(prevMessages => {
console.log(messages) const newMessage = { role: "system", content: prompt }
return [newMessage, ...prevMessages]
})
}
updateSystemprompt
},[systemMessage]) },[systemMessage])
@ -187,6 +188,17 @@ useEffect(() => {
} }
const messageIndex = chatHistory.chats[chatHistory.selectedIndex].messages.length-1 const messageIndex = chatHistory.chats[chatHistory.selectedIndex].messages.length-1
updateMessage(messageIndex,newContent) updateMessage(messageIndex,newContent)
// setMessages((prevMessages) => {
// const updatedMessages = prevMessages.slice(); // Create a shallow copy of the current messages
// if (updatedMessages.length > 0) {
// const lastMessage = updatedMessages[updatedMessages.length - 1];
// updatedMessages[updatedMessages.length - 1] = {
// ...lastMessage, // Keep the existing role and other properties
// content: newContent, // Update only the content
// };
// }
// return updatedMessages; // Return the updated array
// });
}; };
const addMessage = (role: string, content: string) => { const addMessage = (role: string, content: string) => {

View file

@ -0,0 +1,19 @@
/* import { Settings } from 'electron'
type Message = {
role: string
content: string
}
type Chat = {
name: string
messages: Message[]
}
type Data = {
chats: Chat[]
settings: Settings[]
} */

View file

@ -2,10 +2,14 @@
import React from 'react'; import React from 'react';
import InputOutputBackend from '../backend/InputOutputHandler'; import InputOutputBackend from '../backend/InputOutputHandler';
const AI: React.FC = () => { interface AIProps{
selectedIndex:number
}
const AI: React.FC<AIProps> = ({selectedIndex}) => {
return ( return (
<div className="ai-container"> <div className="ai-container">
<InputOutputBackend /> <InputOutputBackend selectedIndex={selectedIndex}/>
</div> </div>
); );
}; };

View file

@ -2,13 +2,16 @@ import React, { useState } from 'react';
import { useChatHistory } from '../hooks/useChatHistory'; import { useChatHistory } from '../hooks/useChatHistory';
const History: React.FC = () => { const History: React.FC = () => {
const [chatHistory, setSelectedIndex] = useChatHistory() const [chatHistory, setChatHistory, setSelectedIndex] = useChatHistory()
const [isEditing, setIsEditing] = useState(false); const [isEditing, setIsEditing] = useState(false);
const [inputValue, setInputValue] = useState<string>(''); const [inputValue, setInputValue] = useState<string>('');
const handleEditButtonClick = () => { const handleEditButtonClick = () => {
setIsEditing(true); setIsEditing(true);
/* Thank you Eslint for this masterpiece of a code snippet */
setChatHistory(chatHistory)
/* Wow i feel so secure now */
}; };
const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => { const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {
@ -35,10 +38,7 @@ const History: React.FC = () => {
{/* Populate with history items */} {/* Populate with history items */}
{chatHistory.chats.map((chats, index) => ( {chatHistory.chats.map((chats, index) => (
<li key={index}> <li key={index}>
<a href="#" onClick={() => handleHistoryClick(index)} style={{ <a href="#" onClick={() => handleHistoryClick(index)}>
backgroundColor: chatHistory.selectedIndex == index ? "var(--input-button-color)" : "",
borderRadius:"5px"
}}>
{chatHistory.chats[index].name} {chatHistory.chats[index].name}
</a> </a>
</li> </li>

View file

@ -45,6 +45,7 @@ export const sendToDatabase = async () => {
if (useName && usePassword) { if (useName && usePassword) {
const result = await changeSettings(useName, usePassword, JSON.parse(exportSettings())) const result = await changeSettings(useName, usePassword, JSON.parse(exportSettings()))
if (result == true) { if (result == true) {
alert('Data has been transferred')
window.location.reload(); window.location.reload();
} }
} }

View file

@ -19,7 +19,8 @@ interface GlobalChatHistory {
let globalChatHistory: GlobalChatHistory = { let globalChatHistory: GlobalChatHistory = {
chats: [ chats: [
{ name: "Welcome!", messages: [{role:"system",content:"you are a helpful assistant"},{role:"assistant",content:"Hello! How can I help you?"}], timestamp: 4 }, { name: "Chat 1", messages: [{role:"system",content:"you are a helpful assistant"},{role:"assistant",content:"how can i help you"}], timestamp: 4 },
{ name: "Chat 2", messages: [{role:"system",content:"you are a helpful assistant"},{role:"assistant",content:"how can i help you"}], timestamp: 4 },
], ],
selectedIndex:0 selectedIndex:0
} }
@ -30,7 +31,7 @@ const setGlobalState = (newState: GlobalChatHistory): void => {
listeners.forEach((listener) => listener(globalChatHistory)) listeners.forEach((listener) => listener(globalChatHistory))
} }
export const useChatHistory = (): [GlobalChatHistory, (index:number)=>void, (newState:GlobalChatHistory) => void,(messageIndex: number, newContent:string)=> void] => { export const useChatHistory = (): [GlobalChatHistory, (newState:GlobalChatHistory) => void, (index:number)=>void, (messageIndex: number, newContent:string)=> void] => {
const [state, setState] = useState<GlobalChatHistory>(globalChatHistory) const [state, setState] = useState<GlobalChatHistory>(globalChatHistory)
useEffect(() => { useEffect(() => {
@ -64,5 +65,5 @@ export const useChatHistory = (): [GlobalChatHistory, (index:number)=>void, (ne
} }
} }
return [state, setSelectedIndex, setGlobalState, updateMessage] return [state, setGlobalState, setSelectedIndex, updateMessage]
} }

View file

@ -14,6 +14,7 @@ const LandingPage: React.FC = () => {
const [showDivs, setShowDivs] = useState(true); const [showDivs, setShowDivs] = useState(true);
const [view, setView] = useState<'AI' | 'FAQ' | 'Documentation' | 'Credits'>('AI'); const [view, setView] = useState<'AI' | 'FAQ' | 'Documentation' | 'Credits'>('AI');
const conversationRef = useRef<HTMLDivElement>(null); const conversationRef = useRef<HTMLDivElement>(null);
const [selectedHistoryIndex, setSelectedHistoryIndex] = useState<number>(0)
const [primaryColor, setPrimaryColor] = useState("#fefefe"); const [primaryColor, setPrimaryColor] = useState("#fefefe");
const [secondaryColor, setSecondaryColor] = useState("#fefefe"); const [secondaryColor, setSecondaryColor] = useState("#fefefe");
@ -91,13 +92,13 @@ const LandingPage: React.FC = () => {
<div className={`left-panel ${showDivs ? 'visible' : 'hidden'}`}> <div className={`left-panel ${showDivs ? 'visible' : 'hidden'}`}>
{showDivs && ( {showDivs && (
<div className="history-models"> <div className="history-models">
<History /> <History selectedIndex={selectedHistoryIndex} setSelectedIndex={setSelectedHistoryIndex}/>
<Models /> <Models />
</div> </div>
)} )}
</div> </div>
<div className={`conversation-container ${showDivs ? 'collapsed' : 'expanded'}`} ref={conversationRef}> <div className={`conversation-container ${showDivs ? 'collapsed' : 'expanded'}`} ref={conversationRef}>
{view === 'AI' && <AI />} {view === 'AI' && <AI selectedIndex={selectedHistoryIndex} />}
{view === 'FAQ' && <FAQ />} {view === 'FAQ' && <FAQ />}
{view === 'Documentation' && <Documentation />} {view === 'Documentation' && <Documentation />}
{view === 'Credits' && <Credits />} {view === 'Credits' && <Credits />}

View file

@ -1,30 +0,0 @@
#!/bin/bash
chmod +x root.sh
pkexec ./root.sh
npm install
npm run build
cd py
python3 -m venv venv
source venv/bin/activate
python3 -m pip install -r requirements.txt
ollama pull qwen2-math:1.5b
ollama pull qwen2.5-coder:1.5b
ollama pull phi3.5
ollama pull mathstral
ollama pull qwen2.5-coder
ollama pull qwen2.5
ollama pull qwen2-math:1.5b
ollama pull starcoder2
ollama pull llama3.2
ollama pull wizard-math
ollama pull starcoder2:7b
ollama pull llama3.1
cd ..
chmod +x run.sh

View file

@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
apt install npm nodejs python3-full ffmpeg libgtk-3-0t64 libnotify4 libnss3 libxss1 libasound2t64 build-essential cmake -y apt install npm nodejs python3-full ffmpeg libgtk-3-0t64 libnotify4 libnss3 libxss1 libasound2 build-essential cmake -y
if ! ollama; then if ! ollama; then
curl -fsSL https://ollama.com/install.sh | sh curl -fsSL https://ollama.com/install.sh | sh
fi fi

View file

@ -9,7 +9,6 @@ cd ..
npm start & npm start &
pid_node=$! pid_node=$!
sleep 2
npx electron . npx electron .
kill $pid_py kill $pid_py

View file

@ -1,4 +0,0 @@
start /b scripts\prepare_py.bat
start /b scripts\prepare_npm.bat
start /b scripts\prepare_ollama_free.bat
start /b scripts\prepare_ollama_nonfree.bat