// ==UserScript== // @name Canvas ChatGPT // @namespace http://tampermonkey.net/ // @version 1.2 // @description Adds ChatGPT into Instructure Canvas // @author Riley Campbell // @match *.instructure.com/* // @license https://creativecommons.org/licenses/by-nc/4.0/ // @downloadURL none // ==/UserScript== (async function() { 'use strict'; if(!window.location.href.includes("conversations")) { setInterval(function(){ window.defaultMessage = { "role": "system", "content": localStorage.getItem('AIprompt') } },1000) let prompt = localStorage.getItem('AIprompt') if (prompt==null) { prompt='' localStorage.setItem('AIprompt','') } window.defaultMessage = { "role": "system", "content": prompt } window.AImessages = [window.defaultMessage] window.renderMessages = function() { let container = document.getElementById('container') container.innerHTML = '' for(let message in window.AImessages) { message = window.AImessages[message] if(message.role == "system") { continue } container.innerHTML += '

' + message.role.charAt(0).toUpperCase() + message.role.slice(1) + ':

' + message.content + '

' } window.scrollTo({ top: document.body.scrollHeight, behavior: 'smooth' }); } window.sendMessage = async function() { document.getElementById('container').innerHTML += '' let message = { "role": "user", "content": document.getElementById('myTextArea').value } window.AImessages.push(message) document.getElementById('myTextArea').value = '' let messages = [window.defaultMessage, message] if(document.getElementById('memory').checked) { messages = window.AImessages } let response = await fetch('https://api.openai.com/v1/chat/completions', { method: "POST", headers: { "Content-Type": "application/json", "Authorization": `Bearer ` + localStorage.getItem('openaiAPIKey') }, body: JSON.stringify({ "model": localStorage.getItem('AImodel'), "messages": messages, "temperature": 1 }) }); if(response.ok) { let result = await response.json() window.AImessages.push(result.choices[0].message) window.renderMessages() } else { document.getElementById('container').innerHTML = `Error ${response.status}: ${response.statusText}`; }; } window.populateModels = async function() { let supportedModels = ['gpt-4', 'gpt-4-0314', 'gpt-4-32k', 'gpt-4-32k-0314', 'gpt-3.5-turbo', 'gpt-3.5-turbo-0301'] let response = await fetch('https://api.openai.com/v1/models', { method: "GET", headers: { "Content-Type": "application/json", "Authorization": `Bearer ` + localStorage.getItem('openaiAPIKey') }, }); let options = await response.json() let item = null let element = null let models = document.getElementById('models') models.innerHTML = '' for(let i = 0; i < options.data.length; i++) { item = options.data[i] if(supportedModels.includes(item.id)) { element = document.createElement("option") element.value = item.id element.innerHTML = item.id models.appendChild(element) } } } document.getElementById('wrapper').innerHTML += `





` await window.populateModels() document.getElementById('models').value = localStorage.getItem('AImodel') let checked = (localStorage.getItem('AImemory') === 'true') document.getElementById('memory').checked = checked setInterval(function() { localStorage.setItem('AImemory', document.getElementById('memory').checked) localStorage.setItem('AImodel', document.getElementById('models').value) localStorage.setItem('AIprompt', document.getElementById('systemPrompt').value) }, 1000) document.getElementById('submitButton').onclick = async () => { window.AImessages = [window.defaultMessage] window.renderMessages() }; document.getElementById('setAPIKey').onclick = async () => { localStorage.setItem('openaiAPIKey', document.getElementById('key').value) document.getElementById('key').value = '' await window.populateModels() }; const myTextarea = document.getElementById("myTextArea"); myTextarea.addEventListener("keydown", async function(event) { if(event.key === "Enter" && !event.shiftKey) { event.preventDefault(); await window.sendMessage() } }) }; })();