大家好,今天来薅Deno的羊毛。

对于想使用OpenAI的API,日常使用或者研究的场景来说。专门为此充个VPN,买20刀一个月的plus,成本也略高了点。如果使用API的话,只按照token计数,估计三四个月都用不了20刀。也可以找个国内代理商,或者找人拼团,但是我觉得这种还是自己控制比较好,就研究了怎么低成本的使用API。

第一步

登录https://dash.deno.com/projects,New Playground

第二步

复制下面代码

const targetOrigin = "https://api.openai.com";

Deno.serve(async (request) => {
  // 获取原始请求的 URL 和方法
  const { method, url, headers } = request;
  const originalUrl = new URL(url);
  
  // 记录日志
  console.info(`Incoming request: ${method} ${originalUrl.pathname}${originalUrl.search}`);

  // 构建目标 URL
  const targetUrl = new URL(originalUrl.pathname + originalUrl.search, targetOrigin);
  
  try {
    // 准备转发请求的选项
    const requestOptions: RequestInit = {
      method,
      headers: new Headers(headers), // 复制 headers
    };

    // 对于 POST、PUT、PATCH 方法,透传请求体
    if (request.method === "POST" || request.method === "PUT" || request.method === "PATCH") {
      requestOptions.body = await request.arrayBuffer();
    }

    console.info(`targetUrl: ${targetUrl}`);
    // console.debug('requestOptions:', requestOptions); // 里面会有API KEY,可另外处理。
    // 向目标 API 发起请求
    const response = await fetch(targetUrl.toString(), requestOptions);

    // 检查是否是 SSE
    const contentType = response.headers.get("Content-Type");
    console.info(`${targetUrl} response content type is:`, contentType);
    if (contentType === "text/event-stream") {
      // 返回一个新的 ReadableStream,用于将事件流传递给客户端
      const stream = new ReadableStream({
        start(controller) {
          const reader = response.body.getReader();
          return (function pump() {
            reader.read().then(({ done, value }) => {
              if (done) {
                controller.close();
                return;
              }
              controller.enqueue(value);
              pump();
            }).catch(error => {
              console.error('Error while reading the stream', error);
              controller.error(error);
              controller.close();
            });
          })();
        },
        cancel() {
          reader.cancel();
        }
      });

      // 返回 Response 对象,透传 SSE
      return new Response(stream, {
        headers: {
          "Content-Type": "text/event-stream",
          "Cache-Control": "no-cache",
          "Connection": "keep-alive",
        },
      });
    } else {
      // 其他类型的响应,直接透传
      const responseBody = await response.arrayBuffer();
      return new Response(responseBody, {
        status: response.status,
        headers: response.headers,
      });
    }
  } catch (error) {
    console.error(`Error proxying request to ${targetUrl}:`, error);
    return new Response(`Server error: ${error.message}`, { status: 500 });
  }
}, { port: 8000 });

console.log(`Proxy server running at http://localhost:8000/`);

第三步

Save & Deploy

第四步

https://platform.openai.com/api-keys 从里面来个OpenAI 的API key,发请求时候带上。 没Key的可以 https://bewildcard.com/i/HB0O8Q0Y 从里面注册,按照教程生成,有提供限时虚拟机的梯子,充值可以直接使用支付宝,省事儿;不过手续费不便宜。

客户端

可以去下载chatBox,将当前服务的域名设置在API域名既可。

验证

不需要使用chatbox的话直接,终端curl一哈。

curl --location --request POST 'https://{{YOUR_PROJECT}}.deno.dev' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {{YOUR_API_KEY}}' \
--data-raw '{
    "model": "gpt-3.5-turbo",
    "messages": [
      {
        "role": "system",
        "content": "You are a helpful assistant."
      },
      {
        "role": "user",
        "content": "Hello!"
      }
    ]
  }'

最后

在这只是提供一些思路,仅供参考。Deno牛逼🐶。

今天这一分钟,希望对您有帮助/doge。