async function *CHATGPT(messages, {
model="gpt-3.5-turbo",
maxTokens=1024,
temperature=0.6,
label='ChatGPT',
}={}) {
let resolve, promise;
promise = new Promise((r) => {
resolve = r;
});
yield VIEW();
await promise;
const message = await COMPLETE();
messages.push(message);
resolve = null;
yield VIEW();
return message;
function VIEW() {
const STYLE = (i) => ({
0: { backgroundColor: '#fff', color: 'rgba(52,53,65)' },
1: { backgroundColor: 'rgba(247,247,248)', color: 'rgba(52,53,65)' },
}[i % 2]);
return htl.html`
<details>
<summary>${label} ${resolve && htl.html.fragment`<button onclick=${() => resolve()}>Execute</button>`}</summary>
<pre><code>${JSON.stringify({ model, maxTokens, temperature }, true, 2)}</code></pre>
${messages.map((message, i) => htl.html.fragment`
<p style=${ STYLE(i) }><span>${message.role}: </span>${message.content}
`)}
`;
}
async function COMPLETE() {
const context = {
messages,
model,
maxTokens,
temperature,
};
const key = md5(JSON.stringify(context));
if (cache.has(key)) {
return JSON.parse(cache.get(key)).json.choices[0].message;
}
const response = await fetch(`https://api.openai.com/v1/chat/completions`, {
method: `POST`,
mode: `cors`,
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': `application/json`,
},
body: JSON.stringify({
model,
max_tokens: maxTokens,
temperature,
messages,
}),
});
const json = await response.json();
cache.set(key, JSON.stringify({
context,
json,
}));
return json.choices[0].message;
}
}