Public
Edited
Mar 13, 2023
1 star
Insert cell
Insert cell
viewof API_KEY = Inputs.text({ label: 'OpenAI API Key:' });
Insert cell
Insert cell
cache.view()
Insert cell
Insert cell
import { md5 } from '@elmisback/zero-import-md5-hash';
Insert cell
GPT3Tokenizer = {
const library = await import("https://cdn.skypack.dev/gpt3-tokenizer@1.1.5/dist-browser/gpt3-tokenizer.js");
return library.default;
}
Insert cell
function TOKENIZE(s) {
const tokenizer = new GPT3Tokenizer({ type: 'gpt3' });
return tokenizer.encode(s);
}
Insert cell
function *SPLIT(s, { numberOfTokens=2*1024, numberOfTokenOverlap=128, prefix='... ', suffix=' ...' }={}) {
const numberOfPrefixTokens = TOKENIZE(prefix).text.length;
const numberOfSuffixTokens = TOKENIZE(suffix).text.length;
const { text } = TOKENIZE(s);
for (let i=0, n=text.length; i<n;) {
yield prefix + text.slice(i, i + numberOfTokens).join('') + suffix;

i += numberOfTokens;
i -= numberOfTokenOverlap;
i -= numberOfPrefixTokens;
i -= numberOfSuffixTokens;
}
}
Insert cell
{
const fragments = Array.from(SPLIT(DOCUMENT));

return htl.html`
<details>
<summary>Number of Fragments: ${fragments.length}</summary>
${fragments.map((fragment) => htl.html.fragment`
<textarea rows=24 cols=80>${fragment}
`)}
`; // htl.html
}
Insert cell
Insert cell
Insert cell
Insert cell
{
8220// return;

let resolve;
const promise = new Promise((r) => resolve = r);
yield htl.html`<button onclick=${()=> resolve()}>Execute`;
await promise;

const messages = [];
for await (const message of MAP(DOCUMENT)) {
messages.push(message);
yield htl.html`
<details>
<summary>Number of Messages: ${messages.length}</summary>
${messages.map((message) => htl.html.fragment`
<textarea rows=24 cols=80>${message}</textarea>
`)}
`; // htl.html
}

async function *MAP(document, { split={}, request={} }={}) {
for (const text of SPLIT(document, split)) {
yield await COMPLETE([
{ role: 'system', content: INSTRUCTIONS },
{ role: 'user', content: PROMPT.replace('{}', QUESTION) },
{ role: 'user', content: text },
]);
}
}

async function COMPLETE(messages, {
model="gpt-3.5-turbo",
maxTokens=1024,
temperature=0.6,
}={}) {
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.content;
}
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.content;
};
}
Insert cell
import { start as runGeneratorWithIntermediates, run as runGeneratorResultOnly } from '@fil/test-yield-or-return'
Insert cell
{
for
CHATGPT([
{ role: 'system', content: INSTRUCTIONS },
{ role: 'user', content: PROMPT.replace('{}', QUESTION) },
{ role: 'user', content: '' },
]);
Insert cell
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}:&nbsp;</span>${message.content}
`)}
`; // htl.html
}

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;
}
}
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more