Public
HTTP
Forked from janpaul123/VALLErun
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
/** @jsxImportSource https://esm.sh/react */
import valleGetValsContextWindow from "https://esm.town/v/janpaul123/valleGetValsContextWindow";
import archiveVal from "https://esm.town/v/nbbaier/archiveVal?v=10";
import { updateValByName } from "https://esm.town/v/nbbaier/updateValByName?v=14";
import { createVal } from "https://esm.town/v/neverstew/createVal?v=6";
import { passwordAuth } from "https://esm.town/v/pomdtr/password_auth?v=84";
import { verifyToken } from "https://esm.town/v/pomdtr/verifyToken";
import { anthropic } from "npm:@ai-sdk/anthropic";
import { openai } from "npm:@ai-sdk/openai";
import ValTown from "npm:@valtown/sdk";
import { StreamingTextResponse, streamText } from "npm:ai";
import { Hono } from "npm:hono@3";
import _ from "npm:lodash@4";
import { renderToString } from "npm:react-dom/server";
// Set these to your own
const username = "janpaul123";
const tempValsParentFolderId = "4bb7b010-4443-11ef-8642-de64eea55b61";
export default function(
{ username, tempValsParentFolderId }: { username: string; tempValsParentFolderId: string },
) {
const valTownToken = Deno.env.get("valtown");
const vt = new ValTown({ bearerToken: valTownToken });
const app = new Hono();
const jsxResponse = (jsx) => {
return new Response(renderToString(jsx), { headers: { "Content-Type": "text/html" } });
};
const systemprompt = `All the above are example conversations and context you can refer to, but don't
consider it part of the current conversation. The conversation below is your recent interaction with the user.
Your entire response should only be TypeScript.
Your response should start with \`\`\`ts and end with \`\`\`, so full code fences.
Make an HTTP val (other vals are currently not supported to run, even though we have examples for them).
Start your response with a comment explaining how your approach will work, what libraries or
API calls you will use, and any tradeoffs you're making. Then write the code in a consise way,
the simplest way to achieve the goal, though you can add some inline comments to explain your
reasoning (not for every line, but for major groups of lines). Don't use any environment variables
unless strictly necessary, for example use APIs that don't require a key, prefer internal function
imports (using esm.town), and prefer putting API keys as inline variables. Use built-in Deno
functions where possible. Unless specified, don't add error handling,
make sure that errors bubble up to the caller.
Avoid external images or base64 images, use emojis, unicode symtols, or icon fonts/libraries instead, unless that's
not practical for the user's request (e.g. if they ask for a particular animated gif).
If the user asks for something that requires persistence, use the Val Town Blob storage API, unless
explicitly specified otherwise. Use the current val name for the storage key, which you can get
using the "pomdtr/extractValInfo" val, which you can call like this:
\`\`\`ts
const {owner, name} = extractValInfo(import.meta.url);
\`\`\`
There should be no comments like "more content here", it should be complete and directly runnable.
The val should create a "export default async function main" which is the main function that gets
executed on every HTTP request.
`.replace("\n", " ");
// Your response should start with \`\`\`ts and end with \`\`\`.
// The val should create a "export default async function main() {" which
// is the main function that gets executed, without any arguments. Don't return a Response object,
// just return a plain Javascript object, array, or string.
const systemprompt2 = `Since your last response the user might have changed the code.
The current version of the code is below. Keep your response as close to their current
code as possible, only changing things that are strictly necessary to change.`.replace("\n", "");
const makeBubbleHeader = (emoji: string, id?: string, spin?: boolean) => {
const idStr = id ? ` id="${id}"` : "";
const spinStr = spin ? " animate-spin" : "";
return `
<div class="flex mb-4" ${idStr}>
<div class="${spinStr}" style="width:32px; height:32px; line-height:32px; font-size:28px; overflow:hidden; text-align: center; display:inline-block; background:#ddd; border-radius:100%; flex-shrink: 0">${emoji}</div>
<div class="flex-1 ml-4" style="margin-top: 3px; min-width: 0">
`;
};
const makeBubbleFooter = () => {
return `
</div>
</div>
`;
};
const makeAssistantMessageHeader = (maxHeight: number) => {
return `I wrote some new code for your Val: <div class="js-scroll-container-assistant font-mono whitespace-pre-wrap text-xs overflow-auto p-2 mt-2 rounded" style="max-height: ${maxHeight}px; background: rgb(249 250 251)">`;
};
app.post("/save", async (c) => {
const body = await c.req.parseBody();
console.log(body);
const valName = body.valName as any;
const code = body.code as any;
await updateValByName({ token: valTownToken, code, name: valName });
return new Response();
});
const mainHandler = async (c) => {
const { readable, writable } = new TransformStream();
const writer = writable.getWriter();
const textEncoder = new TextEncoder();
function write(text) {
Val Town is a social website to write and deploy JavaScript.
Build APIs and schedule functions from your browser.
Comments
Nobody has commented on this val yet: be the first!
July 25, 2024