-
Notifications
You must be signed in to change notification settings - Fork 0
Worker Backend Template
Lionel Timothy Tarigan edited this page May 13, 2026
·
5 revisions
CloudChat requires a Cloudflare Worker backend to connect Minecraft chat to Cloudflare Workers AI.
This backend handles:
- AI requests
- API authentication
- Model selection
- Server awareness context
- AI responses
-
Create a Cloudflare Worker ( Use the existing one if you already made it before )
-
Delete the default Worker code
-
Copy and paste the CloudChat Worker template below
-
Deploy the Worker
-
Copy your Worker URL
Example:
https://cloudchat.yourname.workers.dev- Put the Worker URL into your CloudChat config:
worker_url=https://cloudchat.yourname.workers.devPaste this code into your Cloudflare Worker: Note : This code Last Updated was V1.1.3 ( Backend and Model Revamp )
// Last updated: v1.1.3 (Backend and model revamp)
export default {
async fetch(request, env) {
if (request.method !== "POST") {
return Response.json(
{ error: "Method not allowed" },
{ status: 405 }
);
}
const authHeader = request.headers.get("Authorization");
const expectedSecret = `Bearer ${env.API_SECRET}`;
if (authHeader !== expectedSecret) {
return Response.json(
{ error: "Unauthorized" },
{ status: 401 }
);
}
let data;
try {
data = await request.json();
} catch {
return Response.json(
{ error: "Invalid JSON body" },
{ status: 400 }
);
}
const {
player,
message,
system_prompt,
model,
safe_mode,
online_players,
max_players,
dimension,
world_time,
can_access_online_player_count,
can_access_dimension,
can_access_world_time,
can_access_player_coordinates
} = data;
const defaultModel = "@cf/meta/llama-3.1-8b-instruct";
const allowedModels = new Set([
defaultModel
]);
if (
model !== undefined &&
(typeof model !== "string" || !allowedModels.has(model))
) {
return Response.json(
{ error: "Unsupported model" },
{ status: 400 }
);
}
const selectedModel = model || defaultModel;
let serverContext = "";
if (can_access_online_player_count) {
serverContext +=
`Online players: ${online_players}/${max_players}\n`;
}
if (can_access_dimension) {
serverContext +=
`Player dimension: ${dimension}\n`;
}
if (can_access_world_time) {
serverContext +=
`World time: ${world_time}\n`;
}
serverContext += `
Capabilities:
- Can access online player count: ${can_access_online_player_count}
- Can access player coordinates: ${can_access_player_coordinates}
- Can access dimension: ${can_access_dimension}
- Can access world time: ${can_access_world_time}
- Safe mode: ${safe_mode}
Important rules:
- Do not invent player counts, coordinates, structures, inventories, commands, or admin data.
- Only use server data provided in this request.
- If the requested data is not provided, say you do not have access to it.
`;
try {
const aiResponse = await env.AI.run(selectedModel, {
messages: [
{
role: "system",
content: `${system_prompt}\n\n${serverContext}`
},
{
role: "user",
content: `${player}: ${message}`
}
]
});
return Response.json({
reply: aiResponse.response || "No response from AI."
});
} catch (error) {
return Response.json(
{
error: "Failed to get response from AI service",
details: error instanceof Error ? error.message : "Unknown AI error"
},
{ status: 502 }
);
}
}
};