fxmq
(飞行煤球)
1
废话少说,直接放链接,https://www.val.town/
只能运行js/ts代码,运行时是Deno,官方的用例推荐:Use cases & examples | Val Town
我觉得比较有用的一点是,可以接收邮件,而且可以有很多个邮箱,这里放两段代码
这段是接收邮件,然后转发保存到平台
import { blob } from "https://esm.town/v/std/blob";
import { email } from "https://esm.town/v/std/email";
export async function testEmail2(e: {
from: string;
to: string[];
subject: string;
text: string;
html: string;
}) {
await blob.setJSON("testEmails", [{
...e,
}]);
return email({
text: JSON.stringify(e),
});
}
这段是打印出来你保存的所有邮件
import { blob } from "https://esm.town/v/std/blob";
const testEmails = await blob.getJSON("testEmails") as [];
console.log("Received emails:\n", testEmails ?? []);
虽然感觉没有cf worker那么强大,但是还挺好玩的
16 个赞
fxmq
(飞行煤球)
7
edwa
(edwa)
14
谢谢分享!Deno貌似支持很多web api,很多cloudflare支持的代码可以直接移植,几乎不修改就可以对接。
只是这请求数量有点少,10 请求/min。
我也推荐一个,Deno运行时,100w请求/月
一个NodeJS运行时,找不到pricing配置,可以用nodejs库,但貌似多刷新几次就触发频率限制了。
https://runkit.com/
edwa
(edwa)
15
val.town白嫖gpt代码:
支持 gpt-4-turbo,运行时不支持stream,即使 用stream返回,它也只能一次性返回,不能逐步返回。
import { OpenAI } from "https://esm.town/v/std/openai";
export default async function(req: Request): Promise<Response> {
if (req.method === "OPTIONS") {
return new Response(null, {
headers: {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Headers": "*",
},
status: 204,
});
}
const openai = new OpenAI();
try {
var body = await req.json();
} catch (e) {
var search = (new URL(req.url)).searchParams;
body = {
"messages": [{ "role": "user", "content": search.get("q") || "hello" }],
"temperature": 0.5,
"presence_penalty": 0,
"frequency_penalty": 0,
"top_p": 1,
stream: true,
model: "gpt-4-turbo",
};
}
const stream = await openai.chat.completions.create(body);
if (!body.stream) {
return new Response(JSON.stringify(stream), {
headers: {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Headers": "*",
"Content-Type": "application/json; charset=UTF-8",
},
});
}
const { readable, writable } = new TransformStream();
const my_stream_writer = writable.getWriter();
var reader = stream.toReadableStream().getReader();
var totalText = "";
const decoder = new TextDecoder("utf-8", { stream: true });
var encoder = new TextEncoder();
(async () => {
while (true) {
const { done, value } = await reader.read();
if (done) break;
totalText += decoder.decode(value, { stream: true });
var msgs = totalText.split("\n");
totalText = msgs.pop();
for (let i in msgs) {
my_stream_writer.write(encoder.encode(`data: ${msgs[i]}\n\n`));
}
await new Promise((r) => {
setTimeout(r, 20);
});
}
my_stream_writer.close();
})();
return new Response(readable, {
headers: {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Headers": "*",
"Content-Type": "text/event-stream; charset=UTF-8",
},
});
}
stream限制出在官方,测试官方的stream样例也不支持实时stream。
https://www.val.town/v/tmcw/streamExample
他们这样说:
展示了我们处理流式响应的能力。实际上,我们会读取流,然后返回响应 - 基本上是缓冲 - 但通过支持 Response 对象,我们包括了将 ReadableStream 实例作为第一个参数传递的选项。
5 个赞
edwa
(edwa)
19
不,只能在val上面用。在val.town部署这个代码。因为是借助了val提供的10/min的免费api。
cfbiso
(shoujunfeng)
20
请问大佬,如何使用您的代码? 我把他生成给我的脚本url地址,当做API地址去其他chat-web上调用,返回404 错误