🌥️给 Bob 撸了个 Cloudflare AI Gateway 翻译插件

背景

Bob 是我在 macOS 上离不开的划词翻译工具,自带的系统翻译够用,社区的 OpenAI Translator 插件也很能打。但我有个小执念:想把所有翻译请求都收口到 Cloudflare AI Gateway
理由很简单 —— AI Gateway 是个统一网关,一个入口就能调 OpenAI / Anthropic / Google / Workers AI 一票模型,还自带日志、缓存、限流、用量统计。更香的是 Workers AI 上有一堆又便宜又能翻译的模型,每天还送 1 万 Neurons 免费额度,划词这种小打小闹基本白嫖。
于是今天就折腾了一个 Bob 插件,让翻译走 CF AI Gateway。

目标

  • 一套配置调用多家模型(换模型只改一行)
  • 翻译 + 润色 + 语法纠错(对标 openai-translator)
  • 支持流式输出
  • 默认走 Workers AI 上性价比最高的模型

原理

Bob 插件本质就是一段 JavaScript,跑在 JavaScriptCore 里,主程序按约定调用 supportLanguagestranslate 这些函数。翻译时我向 AI Gateway 的 OpenAI 兼容端点发请求:
请求头带上鉴权,body 就是标准的 messages 结构:
开了 stream 就按 SSE 一段段解析,边收边往 Bob 里吐字。

踩的坑

坑一:Invalid provider (HTTP 400)

一开始模型我填的是 @cf/zai-org/glm-5.2,结果验证直接报 Invalid provider。翻了半天文档才反应过来:/compat 端点要求模型格式必须是 {provider}/{model},而 @cf/... 前面没有 provider,网关把 @cf 当成 provider 了,自然不认。Workers AI 的模型得写成 workers-ai/@cf/...
更坑的是 Cloudflare 文档自己还自相矛盾:参数说明里写的是 google-ai-studio/...,但底下所有示例用的都是 google/...。实测统一端点认 googlegrok,不认 google-ai-studioxai

坑二:干脆自动补前缀

既然 @cf/ 本身就代表 Workers AI,何必让用户每次手敲 workers-ai/?于是改成:只要模型以 @ 开头,插件内部自动补 workers-ai/ 前缀,用户直接填 @cf/qwen/qwen3-30b-a3b-fp8 就行;其它厂商照常带前缀。

坑三:Qwen3 会「先想后说」

默认模型我挑了性价比之王 @cf/qwen/qwen3-30b-a3b-fp8(MoE 架构,30B 参数只激活 3B,价格和 3B 小模型一样,但中英互译质量高一截)。但它是推理模型,会先输出一段 <think>...</think> 再给答案 —— 翻译场景纯属浪费 token 还拖慢速度。于是插件检测到 Qwen3 就自动加 /no_think 关掉思考,并对输出兜底过滤 <think> 标签,保证译文干净。

配置

装好插件后,在 Bob 偏好设置 → 服务里填几项就能用:
notion image
  • Account ID:Cloudflare 账户 ID
  • CF AIG Token:AI Gateway 鉴权 Token(BYOK 模式必填)
  • 模型:默认 @cf/qwen/qwen3-30b-a3b-fp8,想换就改这一行
  • 温度、流式、同语言模式(润色 / 语法纠错)等

模型怎么选

翻译场景我对比了下 Workers AI 上几个便宜又能打的(价格单位:美元 / 百万 tokens):
模型
输入
输出
备注
@cf/qwen/qwen3-30b-a3b-fp8
0.051
0.335
中文最佳,性价比之王
@cf/meta/llama-3.1-8b-instruct-fp8-fast
0.045
0.384
无推理、干净快速
@cf/meta/llama-3.2-3b-instruct
0.051
0.335
最轻最省
@cf/ibm-granite/granite-4.0-h-micro
0.017
0.112
最便宜,质量一般
提醒一句:别拿带 reasoning 的模型当主力,它们会先思考再回答,又慢又费。Qwen3 我已经在插件里替它关掉思考了。

效果

实测划词翻译,速度和质量都在线:
notion image

发布

最后把插件打包成 .bobplugin(其实就是个 zip 改后缀),传到 GitHub Release,再配一个 appcast.json 就能让 Bob 自动检测更新。

小结

一个下午,从 0 到上架,中间被 Invalid provider 和文档的自相矛盾坑了一会儿,但整体还算顺。现在我的划词翻译全走自己的 Cloudflare 网关,模型随便换、用量看得见、成本几乎可以忽略,舒服。
Loading...