ボットを仕上げながらもう一つのチュートリアル(スクリプト付き更新版)
英語から翻訳·
66
74
by:@Melancholux
無料のJanitorAI AIプロキシ · ステップバイステップCloudflareガイド
☁ MELの無料プロキシラボガイド / 2026年10月 · コミュニティ版
無料枠 · セルフホストWorker · マルチモデル 自分だけのAIプロキシ Cloudflare Workers AI × JanitorAI
1つのWorker。5つのモデル。対象となる無料枠内での利用なら月額サブスク不要。
1つのWorker。5つのモデル。対象となる無料枠内での利用なら月額サブスク不要。
初心者歓迎ローカルGPU不要1日10,000ニューロンモデル切り替えはいはい、みなさん!🌸 これは、誰かのプロキシに頼るのではなく、自分でプロキシを構築して理解できるように作ったものです。
始める前に — このチュートリアルでやること
無料のCloudflare Workerを作成し、あなたのプライベートなCloudflareトークンをSecretsに保管し、保護されたOpenAI互換プロキシを追加し、モデルを選んでJanitorAIに接続します。画像で手順を示し、実際のWorkerスクリプトも以下に掲載しているのでコピーできます。
無料ですアカウントの1日あたりの許容量の範囲内で、無制限ではなく、すべてのアカウントですべてのモデルをサポートすることも保証されていません。APIトークンやプロキシパスワードは絶対に公開しないでください。
無料ですアカウントの1日あたりの許容量の範囲内で、無制限ではなく、すべてのアカウントですべてのモデルをサポートすることも保証されていません。APIトークンやプロキシパスワードは絶対に公開しないでください。
セクション01 // クラウドマニュアル 必要なもの セットアップチェックリスト
無料のCloudflareアカウント
dash.cloudflare.comで作成できます。Workerはオンラインで動作するので、PCを起動したままにする必要はありません。
JanitorAIアカウント
カスタムプロキシがサポートされているチャット/キャラクターを使ってください。
安全なプライベートパスワード
これは自分で作成します。これがPROXY_KEYになり、Cloudflare APIトークンとは別物です。
無料枠: Cloudflare Workers AIは現在、1日10,000無料ニューロンを記載しており、00:00 UTCにリセットされます。入出力の長さとモデルの選択によって消費量が変わります。上限に達すると、枠がリセットされるかプランを変更するまでエラーが返されます。
セクション02 // クラウドマニュアル Cloudflare Workerをデプロイする リクエストを転送する小さなサーバーを作成する
スクリーンショット01 · CLOUDFLAREダッシュボード視覚的参考
このスクリーンショットをダッシュボードの視覚的な目安として使ってください。ラベルは変更される場合があります。
Cloudflareダッシュボード → Workers & Pages → Createに進みます。スターターテンプレートでWorkerを作成し、janitor-free-proxyのような名前を付けて、Deployを押します。
スクリーンショット02 · WORKERセットアップ視覚的参考
Cloudflareが*.workers.devアドレスを発行するまで、現在のWorker作成プロンプトに従ってください。
https://janitor-free-proxy.YOUR-SUBDOMAIN.workers.dev
セクション03 // クラウドマニュアル Workers AIトークンを取得する このトークンはプライベートです。JanitorAIに入れるものではありません
スクリーンショット03 · WORKERS AI / トークン視覚的参考
ダッシュボードでWorkers AIとREST API / トークン作成エリアを探します。
AI → Workers AIを開き、Use REST APIまたはAPIトークン作成アクションを探します。Workers AIへのアクセス権があるトークンを作成し、CloudflareアカウントIDをコピーします。
セキュリティルール
Cloudflare APIトークンはサーバーシークレットです。JanitorAI、Discord、公開コードに貼り付けないでください。JanitorAIには別のプライベートパスワード(PROXY_KEY)のみが渡されます。
セクション04 // クラウドマニュアル Worker設定を3つ追加する CloudflareアカウントIDと2つのSecret
スクリーンショット04 · 変数 & シークレット視覚的参考
Worker内で、設定 → 変数とシークレットを開きます。
CLOUDFLARE_ACCOUNT_ID — テキスト:あなたのアカウントID
CLOUDFLARE_API_TOKEN — シークレット:Cloudflareトークン
PROXY_KEY — シークレット:あなたが選ぶ強力なランダムパスワード
CLOUDFLARE_API_TOKEN — シークレット:Cloudflareトークン
PROXY_KEY — シークレット:あなたが選ぶ強力なランダムパスワード
変数を保存し、Cloudflareから求められたら再デプロイしてください。アカウントのログインパスワードをPROXY_KEYに使わないでください。
3つのWorker設定 — 正確な名前 CLOUDFLARE_ACCOUNT_ID · テキスト · あなたのアカウントID。自分のCloudflareダッシュボードから取得します。Worker名やURLではありません。
CLOUDFLARE_API_TOKEN · シークレット · Cloudflareで生成したWorkers AI APIトークン。公開WorkerコードやJanitorのAPIキーフィールドに絶対に入れないでください。
PROXY_KEY · シークレット · あなたが自分で作成する長くユニークなパスワード。JanitorのAPIキーフィールドに同じパスワードを貼り付けます。
サンプル構造のみ(実際のキーではありません)
CLOUDFLARE_ACCOUNT_ID = [あなた自身のアカウントID]
CLOUDFLARE_API_TOKEN = [あなた自身の秘密のAIトークン]
PROXY_KEY = [あなた自身のプライベートなランダムパスワード]
CLOUDFLARE_API_TOKEN · シークレット · Cloudflareで生成したWorkers AI APIトークン。公開WorkerコードやJanitorのAPIキーフィールドに絶対に入れないでください。
PROXY_KEY · シークレット · あなたが自分で作成する長くユニークなパスワード。JanitorのAPIキーフィールドに同じパスワードを貼り付けます。
サンプル構造のみ(実際のキーではありません)
CLOUDFLARE_ACCOUNT_ID = [あなた自身のアカウントID]
CLOUDFLARE_API_TOKEN = [あなた自身の秘密のAIトークン]
PROXY_KEY = [あなた自身のプライベートなランダムパスワード]
セクション05 // クラウドマニュアル プロキシコード全体を貼 り付ける これはプレースホルダーではなく、実際に動作するWorkerソースです
スクリーンショット05 · WORKERコードエディタ視覚的参考
Workerのコード編集をクリックし、スターターコードを置き換えます。
コード編集を開き、既存のスターターソースを削除し、以下のJavaScript全体を貼り付けてから、Deployを押します。このスクリプトは
/v1/chat/completionsと/chat/completions、ストリーミング、選択したモデル、個人パスワードをサポートします。 ☁ このスクリプトが実際のブリッジです — 何をするのでしょうか? 1 · CORS + OPTIONS: ブラウザベースのクライアントがプリフライトリクエストを安全に行えるようにします。 2 · POST エンドポイント:
/v1/chat/completionsまたは/chat/completionsでリクエストを受け付けます。 3 · 個人パスワード: Janitorが送信するAPIキーとあなたのPROXY_KEYシークレットを比較します。これがないと、URLを発見した誰でもあなたの無料枠を消費できてしまいます。 4 · 完全なRP会話: ストーリーを最後のメッセージだけに縮めず、Janitorのmessages配列を維持します。 5 · モデル選択: Gemma 4から始まりますが、このチュートリアルに記載の5つのサポートモデルIDも受け付けます。元のコードは常にGemmaを強制していましたが、このバージョンではJanitorのモデル名フィールドから切り替えられます。 6 · ストリーミング + 設定: ストリーミングを有効にし、Janitorが有効な値を指定していない場合に限り、temperature 0.9、top_p 0.95、max_tokens 2048を使用します。 7 · Cloudflare API: あなたのCloudflareアカウントIDとその別のAPIトークンを使ってWorkers AIを呼び出します。CloudflareトークンをJanitorに貼り付ける必要はありません。 8 · 直接パススルー: 個々のトークンやチャンクを再構築せずに、レスポンスストリームをJanitorにそのまま転送します。 以下のブロック全体をCloudflareのWorkerコードエディタにコピーしてください。 JanitorのプロキシURLフィールドには貼り付けないでください。スクリプト内の何もシークレットに置き換える必要はありません。設定 → 変数とシークレットで追加してください。アンダースコアを含む正確な名前を維持してください。貼り付けたら、Deployを押します。
</> Cloudflare Workerスクリプト全体 — JAVASCRIPT · 開く / コピー ↓
// JANITORAI + CLOUDFLARE WORKERS AI PROXY // Adapted from Mel's working streaming passthrough. // STEP 1: Settings > Variables and Secrets // CLOUDFLARE_ACCOUNT_ID = your own Cloudflare Account ID (Text) // CLOUDFLARE_API_TOKEN = your own Workers AI API token (Secret) // PROXY_KEY = a strong password YOU create (Secret) // STEP 2: paste this ENTIRE script in Edit code and Deploy. // STEP 3: in JanitorAI set Proxy URL to: // https://YOUR-WORKER.YOUR-SUBDOMAIN.workers.dev/v1/chat/completions // and API Key to the SAME value as your 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); } // IMPORTANT ADDITION: prevent strangers from using your quota. 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); } // Preserve Janitor's conversation. The original fixed Gemma here: // body.model = "@cf/google/gemma-4-26b-a4b-it"; // This updated version also supports switching models in 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; // Keep Janitor's settings, with sensible defaults. 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), } ); // DIRECT PASSTHROUGH: no rebuilding the model's streamed text. 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 // クラウドマニュアル 5つのAIモデルから1つを選ぶ 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
モデル名
プロキシURL
APIキー
あなたのプライベートな
Cloudflare Free AI
モデル名
@cf/google/gemma-4-26b-a4b-itプロキシURL
https://YOUR-WORKER.YOUR-SUBDOMAIN.workers.dev/v1/chat/completionsAPIキー
あなたのプライベートな
PROXY_KEYシークレット — Cloudflare APIトークンではありません。設定を保存し、設定を選択して短いテストメッセージを送ります。うまくいけば、モデルの返信がCloudflareからあなたのWorkerを通じて返ってきます。プロキシが接続しない場合は、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キーフィールドにはPROXY_KEYを使用してください。 セクション08 // クラウドマニュアル 再デプロイせずにモデルを切り替 える 5つのモデル、1つのWorker、1つの無料割り当て
スクリーンショット08 · 最終確認 / テスト視覚的参考
チャットと選択したモデルを確認する際に、最後のスクリーンショットを参考にしてください。
JanitorAIで、モデル名だけを上記のいずれかの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インターフェースと選択したモデルの両方がサポートする場合はオン。
長い会話履歴は多くのトークンを消費する可能性があります。巨大なコンテキストをサポートするモデルでも、コンテキスト全体が1日の無料予算に収まるとは限りませ ん。
セクション10 // クラウドマニュアル FAQ & トラブルシューティング よくあるトラブルの数々
PCを起動したままにする必要はありますか? ↓
いいえ。あなたのCloudflare WorkerはCloudflareのインフラ上で動作します。
無制限ですか? ↓
いいえ。無料枠は現在、アカウント全体で1日10,000ニューロンです。
NSFWは保証されますか? ↓
いいえ。安 全性とモデレーションの動作は、モデルとサービスのポリシーによって異なります。
友達が私のプロキシを使えますか? ↓
PROXY_KEYを気軽に共有しないでください。URLとキーを持つ誰でもあなたの割り当てを消費する可能性があります。
401 Unauthorized ↓
JanitorAIのAPIキーはPROXY_KEYと完全に一致する必要があります。
403 Forbidden ↓
Cloudflareトークンの権限、モデルの利用資格、有料プランが必要かどうかを確認してください。
404 Not Found ↓
workers.devのURLと/v1/chat/completionsのパ スを再確認してください。
400 Invalid model ↓
サポートされているモデルIDを正確にコピーしたか確認してください。
429 Too many requests ↓
無料ニューロンを使い果たしたか、一時的な容量制限に達した可能性があります。
返信が表示されない ↓
Workerのデプロイ、ログ、シークレット、チャット/プロキシ設定を確認してください。より短いプロンプトを試してみてください。
モデルを切り替えるとチャットが削除されますか? ↓
選択したモデルを変更しても、それ自体で 保存されたJanitorの会話が削除されることはありません。モデルごとに利用可能なコンテキストの扱い方が異なる場合があります。
セクション11 // クラウドマニュアル 最後に & 公式リソース 自分だけのものに — そしてキーは秘密に
というわけで、みなさん!🌸
個人用プロキシが1つ、比較できるモデルが5つ、そして実験する自由が少しだけ増えました。このチュートリアルは無制限の無料プレミアムサービスではなく、利用可能な割り当ての範囲内で学び、探求するための方法にすぎません。
これを共有するのは、何かを作ることは楽しいべきだと思うからです。そして、誰もがプレミアムモデルにお金を払えるわけではないことも知っています。
ふわふわでいてね。🤍
個人用プロキシが1つ、比較できるモデルが5つ、そして実験する自由が少しだけ増えました。このチュートリアルは無制限の無料プレミアムサービスではなく、利用可能な割り当ての範囲内で学び、探求するための方法にすぎません。
これを共有するのは、何かを作ることは楽しいべきだと思うからです。そして、誰もがプレミアムモデルにお金を払えるわけではないことも知っています。
ふわふわでいてね。🤍
Melancholuxによるコミュニティ製チュートリアル。JanitorAI、Cloudflare、および記載のモデルプロバイダーとは提携していません。
プライベートキーは公開投稿に載せるべきではありません。
プライベートキーは公開投稿に載せるべきではありません。
作成済み 10月25日
更新済み 10月25日
公開済み 10月25日