fishjar / kiss-translator

A simple, open source bilingual translation extension & Greasemonkey script (一个简约、开源的 双语对照翻译扩展 & 油猴脚本)
https://github.com/fishjar/kiss-translator
GNU General Public License v3.0
2.89k stars 114 forks source link

[Feature Request]能否考虑加入对Cloudflare Workers AI的支持 #38

Closed Minaduki-Shigure closed 1 year ago

Minaduki-Shigure commented 1 year ago

Cloudflare Workers AI是一个CF刚推出的能够访问其AI模型的Workers,由于CF带了个翻译的model,所以我心血来潮想到能不能用它配合KISS Translator进行翻译。

我写了一个简单的CF Worker作为概念验证(如下),CF目前支持的语言和语言的代码与KISS Translator的定义不同,由于个人水平限制,我在验证中写死了目标语言为中文,但是这个Worker代码我测试了能够配合KISS Translator正常翻译网页。

当然这个方案还是有一些问题,比如Workers AI还在Beta不知道会不会有大的变动、Pricing会不会不够合理、语言代码和模型会不会变化什么的,因此这个issue仅供您参考,谢谢您的耐心。

import { Ai } from './vendor/@cloudflare/ai';

export default {
  async fetch(request, env) {

    async function readRequestBody(request) {
      const contentType = request.headers.get("content-type");
      const Authorization = request.headers.get("Authorization");
      const expected_token = env.BEARER_TOKEN; // 在环境变量中设置
      if (Authorization === `Bearer ${expected_token}`) {
        if (contentType.includes("application/json")) {
          return await request.json();
        } else {
          throw new Error("Request's content-type is not supported. Please use application/json.");
        }
      } else {
        throw new Error("Authentication failed. Please check your access token.");
      }
    }

    if (request.method === "POST") {
      try {
        const reqBody = await readRequestBody(request);

        const ai = new Ai(env.AI);
        const inputs = {
          text: reqBody['text'],
          source_lang: '',
          target_lang: 'chinese'
        };
        const response = await ai.run('@cf/meta/m2m100-1.2b', inputs);

        const translated_text = response['translated_text'];
        const ret = {
          text: translated_text,
          from: "", // 识别的源语言,Cloudflare目前似乎并不支持
          to: "zh-CN"
        };
        return Response.json(ret);

      } catch (e) {
        return new Response(e.message);
      }
    } else if (request.method === "GET") {
      return new Response("Please use POST.");
    }

  }
};
fishjar commented 1 year ago

感谢您提供的信息。

不过目前 Cloudflare Workers AI 是早期测试版,支持的语言也很有限,等稍微稳定后可以考虑直接支持,暂时可通过自定义接口(如您提供的例子)使用。

Minaduki-Shigure commented 1 year ago

好的,感谢您的关注。