// ==UserScript==
// @name Canvas ChatGPT
// @namespace http://tampermonkey.net/
// @version 1.3
// @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.indexOf("instructure.com") !== -1) {
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')
},
});
if (!response.ok) {
return 0;
}
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)
}
}
}
let elem = document.createElement('div')
elem.id='chatGPTbox'
elem.setAttribute('style','margin-left:auto;margin-right:auto;width:95%')
document.getElementById('wrapper').appendChild(elem)
document.getElementById('chatGPTbox').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()
}
})
};
}
})();