webinterface/client/js/chat.js

243 lines
8.8 KiB
JavaScript
Raw Normal View History

2024-10-30 15:06:17 +01:00
let chatCount = 0; // Zähler für Chat-Sessions
2024-10-30 15:11:26 +01:00
let currentChatId = null; // Aktuell angezeigte Chat-ID
2024-10-30 15:06:17 +01:00
document.getElementById('newChatButton').addEventListener('click', () => {
createNewChat();
});
document.getElementById('sendButton').addEventListener('click', () => {
const chatBox = document.getElementById('chatBox');
const chatInput = document.getElementById('chatInput');
const messageText = chatInput.value.trim();
2024-10-30 15:11:26 +01:00
if (messageText !== '' && currentChatId !== null) { // Stelle sicher, dass eine Chat-ID vorhanden ist
2024-10-30 15:06:17 +01:00
const messageElement = document.createElement('div');
messageElement.classList.add('chat-message', 'user');
messageElement.innerText = messageText;
chatBox.prepend(messageElement);
// Nachricht speichern
2024-10-30 15:11:26 +01:00
saveMessage(currentChatId, messageText); // Verwende die aktuelle Chat-ID
2024-10-30 15:06:17 +01:00
// Sidebar-Button für den Chat-Verlauf erstellen, falls noch nicht vorhanden
2024-10-30 15:11:26 +01:00
if (document.getElementById(`chatSession-${currentChatId}`) === null) {
createChatSessionButton(currentChatId);
2024-10-30 15:06:17 +01:00
}
chatInput.value = ''; // Input-Feld leeren
}
});
function createNewChat() {
// Erhöhe den Chat-Zähler und erstelle einen neuen Chat
const newChatId = chatCount++;
localStorage.setItem(`chatHistory-${newChatId}`, JSON.stringify([])); // Leeren Chat speichern
createChatSessionButton(newChatId); // Button für den neuen Chat erstellen
2024-10-30 15:11:26 +01:00
currentChatId = newChatId; // Setze die aktuelle Chat-ID
2024-10-30 16:16:39 +01:00
loadChatHistory(currentChatId); // Lade den neuen Chat
2024-10-30 15:06:17 +01:00
}
function saveMessage(chatId, message) {
const chatHistory = JSON.parse(localStorage.getItem(`chatHistory-${chatId}`)) || [];
chatHistory.push({ user: "user", text: message });
localStorage.setItem(`chatHistory-${chatId}`, JSON.stringify(chatHistory));
2024-10-30 15:11:26 +01:00
// Aktualisiere den Button-Text in der Sidebar
updateChatSessionButton(chatId, message);
}
function updateChatSessionButton(chatId, message) {
const button = document.getElementById(`chatSession-${chatId}`);
if (button) {
const chatHistory = JSON.parse(localStorage.getItem(`chatHistory-${chatId}`)) || [];
// Hole die erste Nachricht oder lasse es leer, wenn keine vorhanden ist
const chatName = chatHistory.length > 0 ? chatHistory[0].text.slice(0, 10) : ''; // Nimm die ersten 10 Zeichen der ersten Nachricht
button.innerText = chatName + "..." || `Chat ${chatId + 1}`; // Falls leer, setze auf "Chat x"
}
2024-10-30 15:06:17 +01:00
}
function createChatSessionButton(chatId) {
const chatList = document.getElementById('chatList');
// Container für Chat-Button und Löschen-Button
const buttonContainer = document.createElement('div');
buttonContainer.classList.add('chat-session-button-container');
// Chat-Button
const button = document.createElement('button');
button.classList.add('chat-session-button');
button.id = `chatSession-${chatId}`;
2024-10-30 15:11:26 +01:00
button.innerText = `Chat ${chatId + 1}`; // Vorläufiger Name
button.addEventListener('click', () => {
loadChatHistory(chatId); // Lade den Chat-Verlauf und setze die aktuelle Chat-ID
currentChatId = chatId; // Setze die aktuelle Chat-ID auf die ausgewählte Chat-ID
});
2024-10-30 15:06:17 +01:00
// Löschen-Button
const deleteButton = document.createElement('button');
deleteButton.classList.add('delete-chat-button');
deleteButton.innerText = "✕";
deleteButton.addEventListener('click', (event) => {
event.stopPropagation(); // Verhindert, dass der Chat geladen wird, wenn auf Löschen geklickt wird
deleteChat(chatId, buttonContainer);
2024-10-30 16:16:39 +01:00
clearChat();
2024-10-30 15:06:17 +01:00
});
// Elemente hinzufügen
buttonContainer.appendChild(button);
buttonContainer.appendChild(deleteButton);
chatList.appendChild(buttonContainer);
}
2024-10-30 16:16:39 +01:00
function clearChat(){
const chatBox = document.getElementById('chatBox');
chatBox.innerHTML = ''; // Aktuellen Chat leeren
}
2024-10-30 15:06:17 +01:00
function loadChatHistory(chatId) {
const chatBox = document.getElementById('chatBox');
chatBox.innerHTML = ''; // Aktuellen Chat leeren
2024-10-30 16:16:39 +01:00
if (currentChatId === null) {
return; // Wenn kein Chat ausgewählt ist, nichts laden
}
2024-10-30 15:06:17 +01:00
const chatHistory = JSON.parse(localStorage.getItem(`chatHistory-${chatId}`)) || [];
chatHistory.forEach(entry => {
const messageElement = document.createElement('div');
messageElement.classList.add('chat-message', entry.user);
messageElement.innerText = entry.text;
chatBox.prepend(messageElement);
});
}
function deleteChat(chatId, buttonContainer) {
// Entferne den Chat-Verlauf aus dem LocalStorage
localStorage.removeItem(`chatHistory-${chatId}`);
// Entferne den Button aus der Sidebar
buttonContainer.remove();
}
2024-10-30 16:16:39 +01:00
// Lade alle Chat-Sitzungen beim Start
2024-10-30 15:06:17 +01:00
function loadAllChatSessions() {
Object.keys(localStorage).forEach((key) => {
if (key.startsWith('chatHistory-')) {
const chatId = parseInt(key.split('-')[1], 10);
createChatSessionButton(chatId);
chatCount = Math.max(chatCount, chatId + 1); // Chat-Zähler aktualisieren
}
});
// Lade den neuesten Chat-Verlauf
if (chatCount > 0) {
loadChatHistory(chatCount - 1);
2024-10-30 16:16:39 +01:00
currentChatId = chatCount - 1; // Setze die aktuelle Chat-ID
} else {
const chatBox = document.getElementById('chatBox');
chatBox.innerHTML = ''; // Chat-Box leer, wenn keine Chats existieren
2024-10-30 15:06:17 +01:00
}
}
// Beim Laden der Seite alle Chat-Sitzungen laden
window.addEventListener('DOMContentLoaded', loadAllChatSessions);
2024-10-30 16:07:52 +01:00
const chatInput = document.getElementById('chatInput');
// Event-Listener für das Senden der Nachricht und das Erstellen eines Zeilenumbruchs
chatInput.addEventListener('keydown', (event) => {
if (event.key === 'Enter') {
// Prüfen, ob die Shift-Taste nicht gedrückt wird
if (!event.shiftKey) {
event.preventDefault(); // Verhindert das Standardverhalten (Absenden des Formulars)
const messageText = chatInput.value.trim();
if (messageText !== '' && currentChatId !== null) {
const messageElement = document.createElement('div');
messageElement.classList.add('chat-message', 'user');
messageElement.innerText = messageText;
document.getElementById('chatBox').prepend(messageElement);
// Nachricht speichern
saveMessage(currentChatId, messageText);
// Sidebar-Button für den Chat-Verlauf erstellen, falls noch nicht vorhanden
if (document.getElementById(`chatSession-${currentChatId}`) === null) {
createChatSessionButton(currentChatId);
}
chatInput.value = ''; // Input-Feld leeren
}
} else {
// Shift + Enter: Zeilenumbruch
chatInput.value += '\n'; // Zeilenumbruch in das Textfeld einfügen
}
2024-10-30 19:21:33 +01:00
let a = stream_api_open_ai()
console.log(a)
2024-10-30 16:07:52 +01:00
}
});
2024-10-30 19:21:33 +01:00
/* OpenAI zeug */
async function getModels() {
try {
const response = await fetch(`http://localhost:8015/v1/models`, {
method: 'GET',
headers: {
'Authorization': `Bearer YOUR_API_KEY`,
'Content-Type': 'application/json',
}
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const models = await response.json();
return models.data[0].id
} catch (error) {
console.error('Error fetching models:', error);
}
}
async function stream_api_open_ai() {
const response = await fetch('http://localhost:8015/v1/chat/completions', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer YOUR_API_KEY`,
},
body: JSON.stringify({
model: await getModels(),
messages: [
{ role: 'system', content: 'You are a knowledgeable assistant.' },
{ role: 'user', content: 'Hi, i have to go, bye.' }
],
stream: true,
temperature: 0.3
})
});
const reader = response.body.getReader();
const decoder = new TextDecoder('utf-8');
let result = '';
while (true) {
const { done, value } = await reader.read();
if (done) break;
const chunk = decoder.decode(value, { stream: true });
const lines = chunk.split('\n');
for (const line of lines) {
if (line && line.includes('data: ')) {
const json = JSON.parse(line.replace('data: ', ''));
if (json.choices[0].delta.content) {
result += json.choices[0].delta.content;
console.log(json.choices[0].delta.content); // Ausgabe in der Konsole
}
}
}
}
return result;
}