karawaci.kode

← Semua snippet

TypeScript Pemula AI

Cloudflare Workers AI text inference

Run Llama / Mistral di Cloudflare Workers AI dari edge. Murah, latency rendah, pay-per-request. Cocok buat fitur AI ringan.

Dipublikasikan 15 Juni 2026

Tidak setiap fitur AI butuh Claude atau GPT-4. Klasifikasi review jadi positif/negatif, generate slug dari judul, deteksi bahasa kasar — model Llama 3 8B sudah cukup. Cloudflare Workers AI run di edge, latency 100-300ms, dan murah. Snippet ini chat endpoint dengan rate limit.

Kode

// src/index.ts — Cloudflare Worker
export interface Env {
  AI: Ai; // binding Workers AI
  RATE_LIMITER: RateLimit; // binding rate limiter
}

interface ChatRequest {
  message: string;
  system?: string;
}

interface AiTextResponse {
  response: string;
}

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    if (request.method !== "POST") {
      return Response.json({ error: "Hanya POST" }, { status: 405 });
    }

    // Rate limit per IP — 10 req per menit
    const ip = request.headers.get("CF-Connecting-IP") ?? "unknown";
    const { success } = await env.RATE_LIMITER.limit({ key: ip });
    if (!success) {
      return Response.json(
        { error: "Terlalu banyak request, coba lagi nanti" },
        { status: 429 }
      );
    }

    let body: ChatRequest;
    try {
      body = await request.json();
    } catch {
      return Response.json({ error: "Body bukan JSON valid" }, { status: 400 });
    }

    if (!body.message || body.message.length > 2000) {
      return Response.json(
        { error: "message wajib dan max 2000 char" },
        { status: 400 }
      );
    }

    const response = (await env.AI.run("@cf/meta/llama-3.1-8b-instruct", {
      messages: [
        {
          role: "system",
          content:
            body.system ??
            "Kamu asisten yang ringkas dan menjawab dalam Bahasa Indonesia.",
        },
        { role: "user", content: body.message },
      ],
      max_tokens: 512,
      temperature: 0.7,
    })) as AiTextResponse;

    return Response.json({
      reply: response.response,
      model: "llama-3.1-8b-instruct",
    });
  },
};
# wrangler.toml
name = "ai-chat-edge"
main = "src/index.ts"
compatibility_date = "2026-05-01"

[ai]
binding = "AI"

[[unsafe.bindings]]
name = "RATE_LIMITER"
type = "ratelimit"
namespace_id = "1001"
simple = { limit = 10, period = 60 }

Pemakaian

# Deploy
npx wrangler deploy
// Client fetch ke worker
async function tanyaAi(pertanyaan: string) {
  const r = await fetch("https://ai-chat-edge.your-subdomain.workers.dev", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      message: pertanyaan,
      system: "Jawab sebagai customer service Bukalapak yang ramah.",
    }),
  });

  if (!r.ok) {
    const err = await r.json();
    throw new Error(err.error);
  }

  const { reply } = await r.json();
  return reply as string;
}

const jawaban = await tanyaAi("Bagaimana cara return barang?");
console.log(jawaban);
// Use case: klasifikasi sentimen review
async function klasifikasiSentimen(review: string) {
  const r = await fetch("https://ai-chat-edge.your-subdomain.workers.dev", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      message: review,
      system:
        "Klasifikasi review berikut ke salah satu: POSITIF, NEGATIF, NETRAL. Jawab satu kata saja.",
    }),
  });
  const { reply } = await r.json();
  return reply.trim();
}

await klasifikasiSentimen("Barangnya bagus, ngirim cepat!"); // → "POSITIF"
await klasifikasiSentimen("Kemasan rusak, kecewa banget"); // → "NEGATIF"

Kapan dipakai

  • Klasifikasi text ringan (sentiment, topic, language detection).
  • Summarization comment / review pendek.
  • Slug / title generator dari konten.
  • Translation singkat untuk UI (bukan dokumen panjang).
  • Moderation pre-check sebelum kirim ke human review.

Catatan

  • Latency 100-300ms dari edge POP terdekat. Untuk Indonesia, Cloudflare punya POP di Jakarta — lumayan cepat.
  • Token limit beda per model. Llama 3.1 8B Instruct: 4096 token context. Untuk dokumen panjang, chunk dulu.
  • Model list rajin update — @cf/meta/llama-3.1-8b-instruct, @cf/mistral/mistral-7b-instruct-v0.2, embeddings, image generation. Cek docs Cloudflare AI catalog.
  • Pricing — neuron-based, ~10 ribu neuron per hari free. Llama 8B sekitar 0.011 USD per 1k token output. Cek calculator Cloudflare.
  • No streaming defaultenv.AI.run blocking. Untuk streaming, set stream: true dan pipe response sebagai SSE.

Workers AI tidak punya prompt caching seperti Claude. Kalau system prompt panjang berulang, cost-nya bakal naik. Pertimbangkan KV / Cache API untuk cache full response berdasarkan request hash.

# tags

cloudflareworkers-aillmedgeai

Ditulis oleh Asti Larasati · 15 Juni 2026