Shreyas094's picture
Upload 528 files
372531f verified
raw
history blame
3.36 kB
import { useRef, useState } from 'react';
import { Data, ChatBoxSettings, QuestionData } from '../types/data';
export const useWebSocket = (setOrderedData: React.Dispatch<React.SetStateAction<Data[]>>, setAnswer: React.Dispatch<React.SetStateAction<string>>, setLoading: React.Dispatch<React.SetStateAction<boolean>>, setShowHumanFeedback: React.Dispatch<React.SetStateAction<boolean>>, setQuestionForHuman: React.Dispatch<React.SetStateAction<boolean | true>>) => {
const [socket, setSocket] = useState<WebSocket | null>(null);
const heartbeatInterval = useRef<number>();
const initializeWebSocket = (promptValue: string, chatBoxSettings: ChatBoxSettings) => {
const storedConfig = localStorage.getItem('apiVariables');
const apiVariables = storedConfig ? JSON.parse(storedConfig) : {};
const headers = {
'retriever': apiVariables.RETRIEVER,
'langchain_api_key': apiVariables.LANGCHAIN_API_KEY,
'openai_api_key': apiVariables.OPENAI_API_KEY,
'tavily_api_key': apiVariables.TAVILY_API_KEY,
'google_api_key': apiVariables.GOOGLE_API_KEY,
'google_cx_key': apiVariables.GOOGLE_CX_KEY,
'bing_api_key': apiVariables.BING_API_KEY,
'searchapi_api_key': apiVariables.SEARCHAPI_API_KEY,
'serpapi_api_key': apiVariables.SERPAPI_API_KEY,
'serper_api_key': apiVariables.SERPER_API_KEY,
'searx_url': apiVariables.SEARX_URL
};
if (!socket && typeof window !== 'undefined') {
const { protocol, pathname } = window.location;
let { host } = window.location;
host = host.includes('localhost') ? 'localhost:8000' : host;
const ws_uri = `${protocol === 'https:' ? 'wss:' : 'ws:'}//${host}${pathname}ws`;
const newSocket = new WebSocket(ws_uri);
setSocket(newSocket);
newSocket.onmessage = (event) => {
const data = JSON.parse(event.data);
if (data.type === 'human_feedback' && data.content === 'request') {
setQuestionForHuman(data.output);
setShowHumanFeedback(true);
} else {
const contentAndType = `${data.content}-${data.type}`;
setOrderedData((prevOrder) => [...prevOrder, { ...data, contentAndType }]);
if (data.type === 'report') {
setAnswer((prev: any) => prev + data.output);
} else if (data.type === 'path' || data.type === 'chat') {
setLoading(false);
}
}
};
newSocket.onopen = () => {
const { report_type, report_source, tone } = chatBoxSettings;
let data = "start " + JSON.stringify({ task: promptValue, report_type, report_source, tone, headers });
newSocket.send(data);
heartbeatInterval.current = window.setInterval(() => {
socket?.send('ping');
}, 3000); // Send ping every 3 seconds
};
newSocket.onclose = () => {
if (heartbeatInterval.current) {
clearInterval(heartbeatInterval.current);
}
setSocket(null);
};
} else if (socket) {
const { report_type, report_source, tone } = chatBoxSettings;
let data = "start " + JSON.stringify({ task: promptValue, report_type, report_source, tone, headers });
socket.send(data);
}
};
return { socket, setSocket, initializeWebSocket };
};