Prompt templates, kesilapan biasa, cheatsheet SDK, dan tips integrasi Claude API untuk membina AI Agent.
Gunakan prompt templates ini untuk mempercepatkan pembinaan agent anda. Copy-paste ke AI assistant (Claude) untuk hasilkan kod dengan pantas.
Masalah: Worker cuba baca env.CLAUDE_API_KEY tapi variable tak wujud. Return error 500.
✅ Penyelesaian: Jalankan npx wrangler secret put CLAUDE_API_KEY SEBELUM deploy. Untuk local dev, guna .dev.vars file: CLAUDE_API_KEY=sk-ant-...
Masalah: npm dependencies tak diinstal. Worker gagal build sebab module missing.
✅ Penyelesaian: Jalankan npm install @anthropic-ai/sdk dalam folder projek. Pastikan package.json ada dependencies yang betul. Juga pastikan nodejs_compat flag di wrangler.toml.
Masalah: Setiap request baru, state bermula kosong. Agent lupa semua yang user cakap.
✅ Penyelesaian: Implement Durable Objects. Setiap request guna sessionId yang sama untuk access state yang sama. Pastikan messages array disimpan ke storage selepas setiap exchange.
Masalah: Browser block request sebab worker tak set Access-Control-Allow-Origin headers.
✅ Penyelesaian: Tambah CORS headers dalam setiap response: Access-Control-Allow-Origin: *. Handle OPTIONS (preflight) request dengan return 200. Jangan lupa Access-Control-Allow-Headers: Content-Type.
Masalah: Claude API ambil masa 5-15 saat. Cloudflare Workers ada 30 saat limit untuk HTTP fetch.
✅ Penyelesaian: Guna model lebih cepat (claude-haiku-3-5). Kurangkan max_tokens. Implement streaming response supaya user nampak progres. Atau guna WebSocket untuk elakkan HTTP timeout.
Masalah: System prompt tak specify bahasa. Claude default kepada English.
✅ Penyelesaian: Dalam system prompt, tulis dengan explicit: "Anda MESTI menjawab dalam Bahasa Melayu sahaja. Walaupun user bertanya dalam Bahasa Inggeris, jawab dalam Bahasa Melayu." Letakkan peraturan ini di awal system prompt.
Masalah: wrangler.toml takde migration config. DO gagal di-deploy.
✅ Penyelesaian: Tambah [[migrations]] block dalam wrangler.toml. Setiap kali tambah class DO baru, kena tambah migration entry dengan new_classes. Juga pastikan [[durable_objects.bindings]] pointing ke class yang betul.
Masalah: Conversation terlalu panjang, melebihi context window Claude.
✅ Penyelesaian: Implement conversation summarization — ringkaskan old messages bila panjang melebihi threshold. Atau trim oldest messages. Claude Sonnet ada 200K context, tapi untuk agent dengan memory panjang, summarization adalah penting.
Masalah: Agent panggil tool berulang kali tanpa henti, atau tool result menyebabkan agent panggil tool lagi.
✅ Penyelesaian: Set maximum tool calls per request (contoh: 5). Track number of tool calls dalam loop. Bila exceed limit, force Claude untuk give final response tanpa tools. Simpan limit dalam state.
Masalah: Bundle size melebihi 1MB (Cloudflare Workers limit untuk free tier).
✅ Penyelesaian: Guna wrangler deploy --dry-run untuk check bundle size. Optimize: tree-shake dependencies, jangan import semua SDK (guna REST API terus), atau upgrade ke Workers Paid Plan (bundle sehingga 10MB).
| Command / Config | Penerangan |
|---|---|
| npx create-cloudflare@latest [name] | Create projek Workers baru |
| npm install @anthropic-ai/sdk | Install Claude API SDK |
| npm install agents-sdk | Install Cloudflare Agents SDK |
| compatibility_flags = ["nodejs_compat"] | Flags penting dalam wrangler.toml |
| npx wrangler dev | Run worker di localhost:8787 |
| npx wrangler deploy | Deploy worker ke Cloudflare |
| npx wrangler secret put [KEY] | Set environment variable sebagai secret |
| Konsep | Penerangan | Code Example |
|---|---|---|
| Agent Class | Class utama untuk agent | export class MyAgent extends Agent {} |
| fetch handler | Entry point worker | async fetch(request, env) {} |
| State/Storage | Persistent state guna DO | this.state.storage.put(key, val) |
| State get | Baca state dari storage | this.state.storage.get(key) |
| Agent ID | Unique ID untuk setiap session | env.CHAT_AGENT.idFromName(sessionId) |
| Agent Stub | Reference ke agent instance | env.CHAT_AGENT.get(agentId) |
| Code | Penerangan |
|---|---|
| new Anthropic({apiKey: env.CLAUDE_API_KEY}) | Init Claude client |
| anthropic.messages.create({model, max_tokens, messages}) | Send message ke Claude |
| response.content[0].text | Extract text reply dari response |
| model: 'claude-sonnet-4-20250514' | Model Sonnet terkini (recommended) |
| model: 'claude-haiku-3-5-20241022' | Model Haiku — lebih murah & cepat |
| system: 'Anda adalah...' | System prompt untuk personality |
| tools: [{name, description, input_schema}] | Define tools untuk Claude |
| response.stop_reason === 'tool_use' | Check jika Claude nak guna tool |
| Code | Penerangan |
|---|---|
| new WebSocketPair() | Create WebSocket connection pair |
| server.accept() | Accept WebSocket connection |
| server.addEventListener('message', fn) | Handle incoming WebSocket messages |
| server.send(JSON.stringify(data)) | Send data melalui WebSocket |
| return new Response(null, { status: 101, webSocket: client }) | Upgrade ke WebSocket |
| stub.chat(message) | Panggil method agent lain (RPC) |
| Command | Penerangan |
|---|---|
| npx wrangler tail | Stream live logs dari worker production |
| npx wrangler deploy --dry-run | Check bundle size tanpa deploy |
| npx wrangler dev --ip 0.0.0.0 | Local dev accessible dari device lain |
| npx wrangler d1 execute [db] --command "SQL" | Execute SQL query terus di D1 database |
| CF_ACCOUNT_ID + CF_API_TOKEN | Environment variables untuk API access |
| Model | Kelebihan | Kekurangan | Sesuai Untuk |
|---|---|---|---|
| claude-sonnet-4-20250514 | Paling pintar, 200K context | Lebih mahal, lebih lambat | Agent yang perlukan reasoning mendalam |
| claude-haiku-3-5-20241022 | Cepat, murah, masih bagus | Kurang sesuai untuk complex tasks | Chat agent ringkas, real-time apps |
cached: true untuk jimat cost.| Model | Input (per 1M tokens) | Output (per 1M tokens) |
|---|---|---|
| claude-sonnet-4 | $3.00 | $15.00 |
| claude-haiku-3-5 | $0.80 | $4.00 |
Untuk kelas 20 pelajar selama 4-6 jam, budget $10-20 adalah mencukupi jika guna model haiku untuk development dan sonnet untuk production.
| Tindakan | Command / Code |
|---|---|
| Create Workers project | npx create-cloudflare@latest project-name --framework=javascript |
| Install Claude SDK | npm install @anthropic-ai/sdk |
| Local dev | npx wrangler dev |
| Deploy | npx wrangler deploy |
| Set secret | npx wrangler secret put CLAUDE_API_KEY |
| View logs | npx wrangler tail |
| Init Claude | new Anthropic({apiKey: env.CLAUDE_API_KEY}) |
| Send message | anthropic.messages.create({model, max_tokens, messages}) |
| Get reply text | response.content[0].text |
| Durable Object binding | [[durable_objects.bindings]] name / class_name |
| DO get state | this.state.storage.get('messages') |
| DO set state | this.state.storage.put('messages', val) |
| DO agent ID | env.BINDING.idFromName(sessionId) |
| DO agent stub | env.BINDING.get(agentId) |
| WebSocket upgrade | new Response(null, {status: 101, webSocket: client}) |
| CORS headers | Access-Control-Allow-Origin: * |
Nota: Semua sumber di atas adalah percuma untuk diakses. Cloudflare Workers ada free tier yang generous (100k requests/day). Claude API adalah berbayar — gunakan API key yang disediakan oleh pengajar.