趁我完成一些机器人时的另一个教程(已更新脚本)

译自英语

Another Tutorial While I Finish Some Bots (Updated With Script)

66

74

免费 JanitorAI AI 代理 · 分步 Cloudflare 指南

☁ MEL 的免费代理实验室指南 / 2026 年 10 月 · 社区版
免费套餐 · 自托管 Worker · 多模型 属于你自己的 AI 代理 Cloudflare Workers AI × JanitorAI
一个 Worker。五个模型。在符合条件的免费额度内使用无需包月订阅。
新手友好无需本地 GPU每天 10,000 神经元模型切换嗨嗨,大家好!🌸 我做这个教程,是希望你能搭建并理解自己的代理,而不是依赖别人的。
开始之前 —— 本教程做什么
我们会创建一个免费的 Cloudflare Worker,把私密的 Cloudflare 令牌保存在 Secrets 中,添加一个受保护的 OpenAI 兼容代理,选择一个模型,并将它连接到 JanitorAI。图片用于说明步骤,实际的 Worker 脚本附在下方,你可以直接复制。

它是免费的在账户的每日额度内,并非无限,也不保证每个账户都能支持所有模型。切勿公开 API 令牌或你的代理密码。
第 01 节 // 云端手册 你需要准备什么 你的准备工作清单
一个免费的 Cloudflare 账户
在dash.cloudflare.com创建一个。你的 Worker 在线上运行;你的电脑不必一直开着。
一个 JanitorAI 账户
使用支持自定义代理的聊天/角色。
一个安全的私密密码
由你自己创建。它将成为PROXY_KEY,与 Cloudflare API 令牌是分开的。
免费额度: Cloudflare Workers AI 目前文档写明每天 10,000 个免费神经元,于 UTC 00:00 重置。输入/输出长度和模型选择会改变消耗。达到上限时你会收到错误,直到额度重置或你更改套餐。
第 02 节 // 云端手册 部署你的 Cloudflare Worker 创建那个转发请求的小服务器
截图 01 · CLOUDFLARE 控制台视觉参考
将此截图作为控制台的视觉参考。标签可能会随时间变化。
前往 Cloudflare 控制台 → Workers & 页面 → 创建。用起始模板创建一个 Worker,命名为类似janitor-free-proxy,然后点击部署。
截图 02 · WORKER 设置视觉参考
按照当前的 Worker 创建提示操作,直到 Cloudflare 给你一个 *.workers.dev 地址。
https://janitor-free-proxy.YOUR-SUBDOMAIN.workers.dev
第 03 节 // 云端手册 获取你的 Workers AI 令牌 此令牌是私密的;它绝不能放进 JanitorAI
截图 03 · WORKERS AI / 令牌视觉参考
在你的控制台中找到 Workers AI 以及 REST API / 令牌创建区域。
打开AI → Workers AI,寻找使用 REST API或创建 API 令牌的操作。创建一个可访问 Workers AI 的令牌,并复制你的Cloudflare 账户 ID。
安全规则
Cloudflare API 令牌是服务器机密。不要将它粘贴到 JanitorAI、Discord 或公开代码中。JanitorAI 只会收到一个不同的私密密码(PROXY_KEY)。
第 04 节 // 云端手册 添加 3 个 Worker 设置 一个 Cloudflare 账户 ID 加两个 Secrets
截图 04 · 变量 & 机密视觉参考
在你的 Worker 中,打开设置 → 变量和机密。
CLOUDFLARE_ACCOUNT_ID —— 文本:你的账户 ID
CLOUDFLARE_API_TOKEN —— 机密:Cloudflare 令牌
PROXY_KEY —— 机密:你自己选择的一个唯一强密码
保存变量,如果 Cloudflare 要求就重新部署。不要使用你的账户登录密码作为 PROXY_KEY。
你的三个 Worker 设置 —— 精确名称 CLOUDFLARE_ACCOUNT_ID · 文本 · 你的账户 ID,从你自己的 Cloudflare 控制台获取。这不是 Worker 名称或 URL。
CLOUDFLARE_API_TOKEN · 机密 · 你在 Cloudflare 中生成的 Workers AI API 令牌。切勿将其放入公开的 Worker 代码或 Janitor 的 API Key 字段。
PROXY_KEY · 机密 · 你自己创建的一个较长的唯一密码。你将在 Janitor 的API Key字段中粘贴同一个密码。
仅为示例结构(不是真实密钥)
CLOUDFLARE_ACCOUNT_ID = [你自己的账户 ID]
CLOUDFLARE_API_TOKEN = [你自己的私密 AI 令牌]
PROXY_KEY = [你自己的私密随机密码]
第 05 节 // 云端手册 粘贴完整的代理代码 这是实际可用的 Worker 源码,不是占位符
截图 05 · WORKER 代码编辑器视觉参考
在你的 Worker 上点击编辑代码,并替换起始代码。
打开编辑代码,移除现有的起始源码,粘贴下方的完整 JavaScript,然后点击部署。该脚本支持/v1/chat/completions和/chat/completions、流式传输、你所选的模型以及个人密码。
☁ 这个脚本就是实际的桥梁 —— 它做什么? 1 · CORS + OPTIONS: 让基于浏览器的客户端安全地发起预检请求。 2 · POST 端点: 在/v1/chat/completions或/chat/completions接受请求。 3 · 个人密码: 将 Janitor 发送的 API Key 与你的PROXY_KEY机密进行比对。没有这个,任何发现该 URL 的人都能消耗你的免费额度。 4 · 完整 RP 对话: 保留 Janitor 的messages数组,而不是把你的故事缩减为最后一条消息。 5 · 模型选择: 从 Gemma 4 开始,但也接受本教程中列出的五个受支持模型 ID。原代码总是强制使用 Gemma;此版本让你可以从 Janitor 的 Model Name 字段切换。 6 · 流式传输 + 设置: 启用流式传输,并使用 temperature 0.9、top_p 0.95和 max_tokens 2048,仅当 Janitor 未提供有效值时。 7 · Cloudflare API: 使用你的 Cloudflare 账户 ID 及其单独的 API 令牌来调用 Workers AI。你的 Cloudflare 令牌永远不必粘贴到 Janitor 中。 8 · 直接透传: 将响应流原样转发回 Janitor,而不重建单个 token 或数据块。
将下方整段代码复制到 Cloudflare 的 Worker 代码编辑器中。 不要将它粘贴到 Janitor 的代理 URL 字段。你不要用你的机密替换脚本内的任何内容:在设置 → 变量和机密下添加它们。保持其精确名称,包括下划线。粘贴后,点击部署。
</> 完整 CLOUDFLARE WORKER 脚本 —— JAVASCRIPT · 展开 / 复制 ↓
// JANITORAI + CLOUDFLARE WORKERS AI 代理 // 改编自 Mel 可用的流式透传。 // 步骤 1:设置 > 变量和机密 // CLOUDFLARE_ACCOUNT_ID = 你自己的 Cloudflare 账户 ID(文本) // CLOUDFLARE_API_TOKEN = 你自己的 Workers AI API 令牌(机密) // PROXY_KEY = 由你创建的一个强密码(机密) // 步骤 2:将此完整脚本粘贴到编辑代码中并部署。 // 步骤 3:在 JanitorAI 中将代理 URL 设为: // https://YOUR-WORKER.YOUR-SUBDOMAIN.workers.dev/v1/chat/completions // 并将 API Key 设为与你的 PROXY_KEY 相同的值。 const MODELS = new Set([ "@cf/google/gemma-4-26b-a4b-it", "@cf/zai-org/glm-4.7-flash", "@cf/qwen/qwen3-30b-a3b-fp8", "@cf/mistralai/mistral-small-3.1-24b-instruct", "@cf/meta/llama-3.3-70b-instruct-fp8-fast", ]); const DEFAULT_MODEL = "@cf/google/gemma-4-26b-a4b-it"; export default { async fetch(request, env) { const origin = request.headers.get("Origin") || "*"; const corsHeaders = { "Access-Control-Allow-Origin": origin, "Access-Control-Allow-Methods": "GET, POST, OPTIONS", "Access-Control-Allow-Headers": request.headers.get("Access-Control-Request-Headers") || "Content-Type, Authorization, X-API-Key", "Access-Control-Max-Age": "86400", "Vary": "Origin", }; const json = (data, status = 200) => Response.json(data, { status, headers: corsHeaders }); if (request.method === "OPTIONS") { return new Response(null, { status: 204, headers: corsHeaders }); } const path = new URL(request.url).pathname; if (request.method === "GET" && path === "/") { return json({ status: "ok", service: "Private Workers AI proxy" }); } if (request.method !== "POST" || (path !== "/v1/chat/completions" && path !== "/chat/completions")) { return json({ error: { message: "Not found" } }, 404); } // 重要补充:防止陌生人使用你的额度。 if (!env.PROXY_KEY || !env.CLOUDFLARE_ACCOUNT_ID || !env.CLOUDFLARE_API_TOKEN) { return json({ error: { message: "Missing Worker secrets" } }, 500); } const auth = request.headers.get("Authorization") || ""; const suppliedKey = auth.replace(/^Bearer\s+/i, "").trim() || request.headers.get("X-API-Key") || ""; if (suppliedKey !== env.PROXY_KEY) { return json({ error: { message: "Invalid PROXY_KEY" } }, 401); } try { const raw = await request.text(); if (raw.length > 500000) { return json({ error: { message: "Request too large" } }, 413); } const body = JSON.parse(raw); if (!Array.isArray(body.messages) || !body.messages.length) { return json({ error: { message: "Missing messages array" } }, 400); } // 保留 Janitor 的对话。原版在这里固定了 Gemma: // body.model = "@cf/google/gemma-4-26b-a4b-it"; // 此更新版本还支持在 Janitor 中切换模型。 body.model = body.model || DEFAULT_MODEL; if (!MODELS.has(body.model)) { return json({ error: { message: "Model not in tutorial allowlist" } }, 400); } body.stream = true; // 保留 Janitor 的设置,并带合理默认值。 if (typeof body.temperature !== "number") body.temperature = 0.9; if (typeof body.top_p !== "number" || body.top_p <= 0) body.top_p = 0.95; if (!body.max_tokens || body.max_tokens <= 0) body.max_tokens = 2048; const upstream = await fetch( `https://api.cloudflare.com/client/v4/accounts/${encodeURIComponent(env.CLOUDFLARE_ACCOUNT_ID)}/ai/v1/chat/completions`, { method: "POST", headers: { "Authorization": `Bearer ${env.CLOUDFLARE_API_TOKEN}`, "Content-Type": "application/json", "Accept": "text/event-stream", }, body: JSON.stringify(body), } ); // 直接透传:不重建模型流式输出的文本。 if (!upstream.ok) { const errorText = await upstream.text(); return new Response(errorText, { status: upstream.status, headers: { ...corsHeaders, "Content-Type": upstream.headers.get("Content-Type") || "application/json", }, }); } return new Response(upstream.body, { status: upstream.status, headers: { ...corsHeaders, "Content-Type": upstream.headers.get("Content-Type") || "text/event-stream; charset=utf-8", "Cache-Control": "no-cache, no-transform", }, }); } catch (error) { return json({ error: { message: error?.message || String(error) } }, 500); } }, };
为什么要用 3 个设置?
Cloudflare 账户 ID 标识你的账户;Cloudflare API 令牌授予模型访问权限;PROXY_KEY 阻止其他人通过你的公开 Worker URL 发送请求。
不要期待自动越狱
这是传输代理,不是模型微调。所有模型策略和 Cloudflare 限制仍然适用。
第 06 节 // 云端手册 从五个 AI 模型中选择一个 可复制到 JanitorAI 的模型 ID
截图 06 · WORKERS AI 模型视觉参考
使用 Cloudflare 模型页面比较能力、当前资格和使用定价。
模型 01 GEMMA 4 · 从这里开始
@cf/google/gemma-4-26b-a4b-it
通用叙事,256K 令牌的大上下文窗口。适合第一个尝试的模型。
模型 02 GLM-4.7 FLASH · 对话
@cf/zai-org/glm-4.7-flash
多语言、面向对话的选择,131K 上下文窗口。
模型 03 QWEN3 30B A3B · 细节
@cf/qwen/qwen3-30b-a3b-fp8
指令遵循和复杂场景。32K 上下文;推理行为可能影响令牌用量。
模型 04 MISTRAL SMALL 3.1 · 散文
@cf/mistralai/mistral-small-3.1-24b-instruct
另一种写作风格,可用于比较创意散文。最高 128K 上下文。
模型 05 LLAMA 3.3 70B · 备选
@cf/meta/llama-3.3-70b-instruct-fp8-fast
较大的模型,24K 上下文窗口,可能会相对较快地消耗免费额度。
这些是用于测试的建议,并非经过验证的角色扮演排名。可用性和仅限付费的限制可能会变化。如果模型返回403,请检查 Cloudflare 访问权限和模型资格,而不要假定代理坏了。
第 07 节 // 云端手册 将 Worker 连接到 JanitorAI 使用 Worker URL 和 PROXY_KEY —— 而不是你的 Cloudflare API 令牌
截图 07 · JANITORAI 代理设置视觉参考
打开 JanitorAI 聊天设置 → 代理 → 添加或配置代理。
配置名称
Cloudflare Free AI
模型名称
@cf/google/gemma-4-26b-a4b-it
代理 URL
https://YOUR-WORKER.YOUR-SUBDOMAIN.workers.dev/v1/chat/completions
API Key
你的私密PROXY_KEY机密 —— 不是 Cloudflare API 令牌。
保存设置,选择该配置并发送一条简短的测试消息。成功时,模型回复应通过你的 Worker 从 Cloudflare 返回。如果代理无法连接,请检查 Worker 日志和 Janitor 聊天设置。
🔗 你的代理 URL 实际应该是什么样? MEL 的真实 URL —— 仅为示例格式 https://janitor-ai-proxy.melancholux.workers.dev/v1/chat/completions 你自己的 URL —— 替换此部分 https://YOUR-WORKER.YOUR-SUBDOMAIN.workers.dev/v1/chat/completions 示例:Cloudflare 说你的 Worker 地址是https://my-rp-proxy.abc123.workers.dev。你的 Janitor代理 URL就是这个确切地址加上 /v1/chat/completions: https://my-rp-proxy.abc123.workers.dev/v1/chat/completions 不要将 Mel 的 URL 用作你自己的。 你账户的 Worker 域名会不同。不要字面输入YOUR-WORKER这些字样,也不要将你的 Cloudflare API 令牌粘贴到 Janitor 中:在其 API Key 字段使用PROXY_KEY。
第 08 节 // 云端手册 无需重新部署即可切换模型 五个模型,一个 Worker,一份免费配额
截图 08 · 最终检查 / 测试视觉参考
在验证你的聊天和所选模型时,将最终截图作为参考。
在 JanitorAI 中,仅将Model Name改为上面列出的任意 ID。Worker URL 和 PROXY_KEY 保持不变。你可以为每个模型保存单独的配置,但它们都会消耗同一账户额度。
从:@cf/google/gemma-4-26b-a4b-it 到:@cf/zai-org/glm-4.7-flash
第 09 节 // 云端手册 建议的 RP 设置 可选的起点,并非通用最佳设置
Temperature
0.8–1.0 可获得更多变化;如果角色偏离就调低。
Top P
0.90–0.95,如果所选模型支持。
最大输出令牌
1024–2048;更短的回复消耗更少神经元。
流式传输
开启,如果你当前的 Janitor 界面和所选模型都支持。
较长的对话历史会消耗大量令牌。模型支持超大上下文并不意味着整个上下文都能放进你的每日免费预算内。
第 10 节 // 云端手册 常见问题 & 故障排查 通常出问题的那些事
我的电脑需要一直开着吗?↓
不需要。你的 Cloudflare Worker 运行在 Cloudflare 基础设施上。
它是无限的吗?↓
不是。免费额度目前为该账户每天 10,000 个神经元。
保证 NSFW 吗?↓
不保证。安全和审核行为取决于模型和服务政策。
朋友能用我的代理吗?↓
不要随意分享你的 PROXY_KEY。任何拥有该 URL 和密钥的人都能消耗你的额度。
401 未授权 ↓
JanitorAI 的 API Key 必须与 PROXY_KEY 完全一致。
403 禁止访问 ↓
检查 Cloudflare 令牌权限、模型资格以及是否需要付费套餐。
404 未找到 ↓
仔细核对 workers.dev URL 和 /v1/chat/completions 路径。
400 模型无效 ↓
检查你是否准确复制了受支持的模型 ID。
429 请求过多 ↓
你可能已用完免费神经元或触及临时容量上限。
回复不显示 ↓
检查 Worker 部署、日志、你的机密以及聊天/代理设置;尝试更短的提示词。
切换模型会删除聊天吗?↓
更改所选模型本身不会删除已保存的 Janitor 对话。每个模型处理可用上下文的方式可能不同。
第 11 节 // 云端手册 结语 & 官方资源 让它成为你自己的 —— 并保管好你的密钥
亲爱的们,就是这样啦!🌸
一个个人代理,五个可比较的模型,还有多一点自由去尝试。本教程不是无限免费的高级服务,只是在可用额度内学习和探索的一种方式。

我分享这个,是因为创造东西应该是有趣的,而且我知道不是每个人都付得起高级模型的钱。
保持毛茸茸。🤍
社区制作教程,作者 Melancholux。与 JanitorAI、Cloudflare 或任何列出的模型提供商无关。
私密密钥绝不应出现在公开帖子中。

已创建 10月25日

已更新 10月25日

已发布 10月25日

已发布聊天