Cloudflare Worker that fronts edu-role-play bundles. Learners' bundled HTML calls this Worker; the Worker calls the model. API keys live as Worker secrets — never in the HTML.
After deploy, in the Cloudflare dashboard go to your new Worker → Settings → Variables and Secrets → Add variable and add one of:
ANTHROPIC_API_KEY(recommended for role-play quality — Claude holds character better)OPENAI_API_KEY
Mark it as a Secret (encrypted). With neither set, the Worker falls back to Cloudflare Workers AI (free, lower quality).
Two ways, no re-bundle required:
- Open
your-roleplay.bundled.htmland add this to<head>:<meta name="edu-role-play-proxy" content="https://<your-worker>.workers.dev">
- Or share the URL with a query param:
your-roleplay.bundled.html?erp-proxy=https://<your-worker>.workers.dev
POST /v1/chat
Content-Type: application/json
{
"messages": [{ "role": "user", "content": "..." }],
"model": "@cf/meta/llama-3.1-8b-instruct", // optional
"temperature": 0.7, // optional, clamped 0..2
"maxTokens": 512 // optional, capped at 1024
}
Response: { "text": "..." }. Errors: { "error": "...", "code"?: "rate_limited" | "upstream_error" }.
Picked at request time:
ANTHROPIC_API_KEYset → Anthropic Messages API (defaultclaude-haiku-4-5-20251001)OPENAI_API_KEYset → OpenAI Chat Completions (defaultgpt-4o-mini)- Neither set → Cloudflare Workers AI via
env.AI(default@cf/meta/llama-3.1-8b-instruct)
Built-in: 30 requests per IP per 60s (RL binding). Tune in wrangler.toml and redeploy.
The Worker does not log request or response bodies (they contain learner transcripts). Standard Workers logs (IP, status, model) appear in your Cloudflare dashboard.
This file is generated from packages/cli/templates/proxy-worker/ in edu-role-play via scripts/sync-proxy-worker.mjs. Send PRs to that repo.