消費量は、この中継 Worker を通した利用分の推定値です(Cloudflare 公式の消費量とは一致しません)。全員で共有する枠で、毎朝9時にリセットされます。
Enter で送信、Shift + Enter で改行。会話の履歴はこのページの中だけに保持され、送信のたびに Worker へ一緒に送られます。
接続先の Worker と、その用意のしかたです。通常の会話では触る必要はありません。
チャットはこの URL の Worker を経由して Workers AI を呼びます。入力した URL はこのブラウザに保存され、次回開いたときも使われます。
中継役の Cloudflare Worker を1つ作ると、このページから Workers AI と会話できるようになります。Cloudflare のアカウント操作はご自身で行う部分です。
workers-ai-chat)を付けてデプロイします。AI にして保存・デプロイします。これで API トークンを画面側に持たせずに済みます。https://〜.workers.dev)をコピーして、この設定画面の上の「中継 Worker の URL」に貼り付けます。// Workers AI チャット — 中継 Worker
// チャット画面から { model, messages } を受け取り、Workers AI を呼び出して
// { reply } を返します。鍵(バインディング)は Worker 側だけに置き、
// 画面には URL しか渡しません。会話の保存はしません。
const MODELS = {
"gpt-oss-20b": "@cf/openai/gpt-oss-20b",
"gpt-oss-120b": "@cf/openai/gpt-oss-120b",
// Qwen のモデル ID は Workers AI のカタログ表記に合わせています。
// カタログ側の ID が変わっていたら、この行を実際の ID に書き換えてください。
"qwen3.8-27b": "@cf/qwen/qwen3.8-27b",
"glm-4.7-flash": "@cf/zai-org/glm-4.7-flash",
"granite-4.0-micro": "@cf/ibm-granite/granite-4.0-h-micro",
"llama-4-scout": "@cf/meta/llama-4-scout-17b-16e-instruct",
};
const CORS_HEADERS = {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "POST, OPTIONS",
"Access-Control-Allow-Headers": "Content-Type",
};
function jsonResponse(data, status) {
return new Response(JSON.stringify(data), {
status: status || 200,
headers: {
"Content-Type": "application/json; charset=utf-8",
...CORS_HEADERS,
},
});
}
export default {
async fetch(request, env) {
// ブラウザからの事前確認(プリフライト)に応答
if (request.method === "OPTIONS") {
return new Response(null, { headers: CORS_HEADERS });
}
if (request.method !== "POST") {
return jsonResponse({ error: "POST で送ってください。" }, 405);
}
let body;
try {
body = await request.json();
} catch (e) {
return jsonResponse({ error: "リクエストを JSON として読めませんでした。" }, 400);
}
const modelId = MODELS[body.model] || MODELS["gpt-oss-20b"];
const messages = Array.isArray(body.messages) ? body.messages : [];
try {
const result = await env.AI.run(modelId, { messages: messages });
const reply = result ? result.response : "";
if (!reply) {
return jsonResponse(
{ error: "モデルから返答が得られませんでした: " + JSON.stringify(result) },
502
);
}
return jsonResponse({ reply: reply });
} catch (e) {
// 無料枠の使い切りなど、Workers AI 側のエラー内容をそのまま返す
const message = e instanceof Error ? e.message : String(e);
return jsonResponse({ error: message }, 502);
}
},
};
無料枠は1日あたりの上限があり、使い切ると翌日リセットされるまでエラーが返ります。その場合はエラーの内容がそのままチャット画面に表示されます。外部のクラウドですので、病院や機密の話題は入れない範囲でお使いください。