分享个类似Cloudflare Worker的平台

废话少说,直接放链接,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 个赞

感谢分享

1 个赞

我超,哥们你机器人吗,我刚发完就回复了

3 个赞

刚好在嘎嘎回,看到了

免费=好

感谢分享

补充发现,可以白嫖openai,每分钟十次,OpenAI | Docs | Val Town

??马上c

谢谢分享

c 它的key

这个免费薅gpt的有点没看懂啊

求大佬们补充玩法。

1 个赞

这个不错,mark

谢谢分享!Deno貌似支持很多web api,很多cloudflare支持的代码可以直接移植,几乎不修改就可以对接。
只是这请求数量有点少,10 请求/min。

我也推荐一个,Deno运行时,100w请求/月

一个NodeJS运行时,找不到pricing配置,可以用nodejs库,但貌似多刷新几次就触发频率限制了。
https://runkit.com/

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 个赞

好耶

感谢

这个是可以放到cf的workder上吗?

不,只能在val上面用。在val.town部署这个代码。因为是借助了val提供的10/min的免费api。

请问大佬,如何使用您的代码? 我把他生成给我的脚本url地址,当做API地址去其他chat-web上调用,返回404 错误