Spaces:
Runtime error
Runtime error
| 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 path = data.output; | |
| document.getElementById("downloadLink").setAttribute("href", 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, | |
| }; | |
| })(); |