🌥️给 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 里,主程序按约定调用 supportLanguages、translate 这些函数。翻译时我向 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/...。实测统一端点认 google、grok,不认 google-ai-studio、xai。坑二:干脆自动补前缀
既然
@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 偏好设置 → 服务里填几项就能用:

- 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 我已经在插件里替它关掉思考了。
效果
实测划词翻译,速度和质量都在线:

发布
最后把插件打包成
.bobplugin(其实就是个 zip 改后缀),传到 GitHub Release,再配一个 appcast.json 就能让 Bob 自动检测更新。小结
一个下午,从 0 到上架,中间被
Invalid provider 和文档的自相矛盾坑了一会儿,但整体还算顺。现在我的划词翻译全走自己的 Cloudflare 网关,模型随便换、用量看得见、成本几乎可以忽略,舒服。Loading...