mirror of
				https://github.com/assafelovic/gpt-researcher.git
				synced 2024-04-09 14:09:35 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			151 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| const GPTResearcher = (() => {
 | |
|     const init = () => {
 | |
|       // Not sure, but I think it would be better to add event handlers here instead of in the HTML
 | |
|       //document.getElementById("startResearch").addEventListener("click", startResearch);
 | |
|       document.getElementById("copyToClipboard").addEventListener("click", copyToClipboard);
 | |
| 
 | |
|       updateState("initial");
 | |
|     }
 | |
| 
 | |
|     const startResearch = () => {
 | |
|       document.getElementById("output").innerHTML = "";
 | |
|       document.getElementById("reportContainer").innerHTML = "";
 | |
|       updateState("in_progress")
 | |
|   
 | |
|       addAgentResponse({ output: "🤔 Thinking about research questions for the task..." });
 | |
|   
 | |
|       listenToSockEvents();
 | |
|     };
 | |
|   
 | |
|     const listenToSockEvents = () => {
 | |
|       const { protocol, host, pathname } = window.location;
 | |
|       const ws_uri = `${protocol === 'https:' ? 'wss:' : 'ws:'}//${host}${pathname}ws`;
 | |
|       const converter = new showdown.Converter();
 | |
|       const socket = new WebSocket(ws_uri);
 | |
|   
 | |
|       socket.onmessage = (event) => {
 | |
|         const data = JSON.parse(event.data);
 | |
|         if (data.type === 'logs') {
 | |
|           addAgentResponse(data);
 | |
|         } else if (data.type === 'report') {
 | |
|           writeReport(data, converter);
 | |
|         } else if (data.type === 'path') {
 | |
|           updateState("finished")
 | |
|           updateDownloadLink(data);
 | |
|         }
 | |
|       };
 | |
|   
 | |
|       socket.onopen = (event) => {
 | |
|         const task = document.querySelector('input[name="task"]').value;
 | |
|         const report_type = document.querySelector('select[name="report_type"]').value;
 | |
|         const agent = document.querySelector('input[name="agent"]:checked').value;
 | |
|   
 | |
|         const requestData = {
 | |
|           task: task,
 | |
|           report_type: report_type,
 | |
|           agent: agent,
 | |
|         };
 | |
|   
 | |
|         socket.send(`start ${JSON.stringify(requestData)}`);
 | |
|       };
 | |
|     };
 | |
|   
 | |
|     const addAgentResponse = (data) => {
 | |
|       const output = document.getElementById("output");
 | |
|       output.innerHTML += '<div class="agent_response">' + data.output + '</div>';
 | |
|       output.scrollTop = output.scrollHeight;
 | |
|       output.style.display = "block";
 | |
|       updateScroll();
 | |
|     };
 | |
|   
 | |
|     const writeReport = (data, converter) => {
 | |
|       const reportContainer = document.getElementById("reportContainer");
 | |
|       const markdownOutput = converter.makeHtml(data.output);
 | |
|       reportContainer.innerHTML += markdownOutput;
 | |
|       updateScroll();
 | |
|     };
 | |
|   
 | |
|     const updateDownloadLink = (data) => {
 | |
|       const pdf_path = data.output.pdf;
 | |
|       const docx_path = data.output.docx;
 | |
|       document.getElementById("downloadLink").setAttribute("href", pdf_path);
 | |
|       document.getElementById("downloadLinkWord").setAttribute("href", docx_path);
 | |
|     };
 | |
|   
 | |
|     const updateScroll = () => {
 | |
|       window.scrollTo(0, document.body.scrollHeight);
 | |
|     };
 | |
|   
 | |
|     const copyToClipboard = () => {
 | |
|       const textarea = document.createElement('textarea');
 | |
|       textarea.id = 'temp_element';
 | |
|       textarea.style.height = 0;
 | |
|       document.body.appendChild(textarea);
 | |
|       textarea.value = document.getElementById('reportContainer').innerText;
 | |
|       const selector = document.querySelector('#temp_element');
 | |
|       selector.select();
 | |
|       document.execCommand('copy');
 | |
|       document.body.removeChild(textarea);
 | |
|     };
 | |
| 
 | |
|     const updateState = (state) => {
 | |
|       var status = "";
 | |
|       switch (state) {
 | |
|         case "in_progress":
 | |
|           status = "Research in progress..."
 | |
|           setReportActionsStatus("disabled");
 | |
|           break;
 | |
|         case "finished":
 | |
|           status = "Research finished!"
 | |
|           setReportActionsStatus("enabled");
 | |
|           break;
 | |
|         case "error":
 | |
|           status = "Research failed!"
 | |
|           setReportActionsStatus("disabled");
 | |
|           break;
 | |
|         case "initial":
 | |
|           status = ""
 | |
|           setReportActionsStatus("hidden");
 | |
|           break;
 | |
|         default:
 | |
|           setReportActionsStatus("disabled");
 | |
|       }
 | |
|       document.getElementById("status").innerHTML = status;
 | |
|       if (document.getElementById("status").innerHTML == "") {
 | |
|         document.getElementById("status").style.display = "none";
 | |
|       } else {
 | |
|         document.getElementById("status").style.display = "block";
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Shows or hides the download and copy buttons
 | |
|      * @param {str} status Kind of hacky. Takes "enabled", "disabled", or "hidden". "Hidden is same as disabled but also hides the div"
 | |
|      */
 | |
|     const setReportActionsStatus = (status) => {
 | |
|       const reportActions = document.getElementById("reportActions");
 | |
|       // Disable everything in reportActions until research is finished
 | |
| 
 | |
|       if (status == "enabled") {
 | |
|         reportActions.querySelectorAll("a").forEach((link) => {
 | |
|           link.classList.remove("disabled");
 | |
|           link.removeAttribute('onclick');
 | |
|           reportActions.style.display = "block";
 | |
|         });
 | |
|       } else {
 | |
|         reportActions.querySelectorAll("a").forEach((link) => {
 | |
|           link.classList.add("disabled");
 | |
|           link.setAttribute('onclick', "return false;");
 | |
|         });
 | |
|         if (status == "hidden") {
 | |
|           reportActions.style.display = "none";
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     document.addEventListener("DOMContentLoaded", init);
 | |
|     return {
 | |
|       startResearch,
 | |
|       copyToClipboard,
 | |
|     };
 | |
|   })(); | 
