1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import { zip } from "https://esm.town/v/pomdtr/sql";
import { db } from "https://esm.town/v/sqlite/db";
import OpenAI from "npm:openai";
async function getVals(username, type, limit) {
const res = await db.execute({
sql: `
SELECT * FROM vals
where
author_username = ?
AND type = ?
LIMIT ?
`,
args: [
username,
type,
limit,
],
});
return zip(res);
}
async function checkHTTPPreviewUpgrade(code) {
const openai = new OpenAI();
const completion = await openai.chat.completions.create({
messages: [
{
role: "system",
content: `
We built a new runtime for HTTP vals that is much faster at scale.
Your job is to input code from the old runtime and ensure the behavior is the same
in the new runtime.
Up until now, every time a val it starts a new Deno process and installs all dependencies from scratch.
With the new runtime, we keep Deno processes around and forward multiple requests to it.
There is one breaking change with this new feature: it only re-runs the val handler,
not any of the other code in val. This means that if any code outside of handler needs
to run on every request, to upgrade to the new runtime, move it into your handler.
Reply ONLY in JSON in the format: {
probabilityUpgradeNeeded: boolean,
reason: string,
}
No code fences.
`,
},
{
role: "user",
content: `const number = Math.random();
export default function(req: Request) {
return Response.json(number);
}`,
},
{
role: "assistant",
content: JSON.stringify({
probabilityUpgradeNeeded: "90%",
reason: `In the old runtime, every request to this handler would return
a newly generated random number. However in the new runtime, the
the random number would be cached sometimes. To ensure the
same behavior in the new runtime, we need to move the random generation
inside the handler.
`,
}),
},
{
role: "user",
content: `import { BrowserWebSocketClientAdapter } from "npm:@automerge/automerge-repo-network-websocket";
import { isValidAutomergeUrl, Repo } from "npm:@automerge/automerge-repo/slim";
/* set up Automerge's internal wasm guts manually */
import { automergeWasmBase64 } from "npm:@automerge/automerge/automerge.wasm.base64.js";
import * as automerge from "npm:@automerge/automerge/slim";
await automerge.next.initializeBase64Wasm(automergeWasmBase64);
/* This example will return the contents of a documentID passed in as the path as JSON. */
export default async function(req: Request): Promise<Response> {
const docId = new URL(req.url).pathname.substring(1);
if (!isValidAutomergeUrl("automerge:" + docId)) {
return Response.error();
}
const repo = new Repo({ network: [new BrowserWebSocketClientAdapter("wss://sync.automerge.org")] });
const handle = repo.find(docId);
const contents = await handle.doc();
return Response.json(contents);
}
`,
},
{
role: "assistant",
content: JSON.stringify({
probabilityUpgradeNeeded: "20%",
reason: `The only code outside of the handler is initializing a wasm module,