Agentive
ツールレビュー

Cloudflare Workers AI — エッジでAI推論を無料実行

約8分で読めます

Cloudflare Workers AI — エッジでAI推論を無料実行

Cloudflare Workers AIは、エッジ(世界300以上の拠点)でAI推論を実行できるサービスだ。無料枠が毎日10,000ニューロン(推論単位)あり、Llama、Mistral、Stable Diffusion等のオープンモデルをサーバーレスで動かせる。APIキー管理もCloudflare側で完結する。

Workers AI vs 他社AI推論サービス比較

項目Workers AIAWS BedrockGoogle Vertex AIReplicate
無料枠10,000ニューロン/日なし$300クレジットなし
対応モデル50+20+30+1000+
エッジ実行あり(300+拠点)リージョンリージョンなし
セットアップ即時IAM設定必要GCP設定必要即時
レイテンシ最低(エッジ)
GPU管理不要不要不要不要

テキスト生成 — LlamaをエッジでLLM実行

基本的なテキスト生成Worker

// src/index.ts
export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const { prompt } = await request.json<{ prompt: string }>();

    const response = await env.AI.run('@cf/meta/llama-3.1-8b-instruct', {
      messages: [
        { role: 'system', content: 'あなたは親切な日本語アシスタントです。' },
        { role: 'user', content: prompt }
      ],
      max_tokens: 512,
      temperature: 0.7,
    });

    return Response.json(response);
  },
} satisfies ExportedHandler<Env>;

interface Env {
  AI: Ai;
}

ストリーミングレスポンス対応

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const { prompt } = await request.json<{ prompt: string }>();

    const stream = await env.AI.run('@cf/meta/llama-3.1-8b-instruct', {
      messages: [{ role: 'user', content: prompt }],
      max_tokens: 1024,
      stream: true,
    });

    return new Response(stream, {
      headers: {
        'Content-Type': 'text/event-stream',
        'Cache-Control': 'no-cache',
      },
    });
  },
} satisfies ExportedHandler<Env>;

画像生成 — Stable Diffusionをエッジで実行

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const { prompt } = await request.json<{ prompt: string }>();

    const image = await env.AI.run('@cf/stabilityai/stable-diffusion-xl-base-1.0', {
      prompt,
      num_steps: 20,
    });

    return new Response(image, {
      headers: { 'Content-Type': 'image/png' },
    });
  },
} satisfies ExportedHandler<Env>;

テキスト分類・感情分析

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const { text } = await request.json<{ text: string }>();

    // 感情分析
    const sentiment = await env.AI.run('@cf/huggingface/distilbert-sst-2-int8', {
      text,
    });

    // テキスト埋め込み(ベクトル化)
    const embedding = await env.AI.run('@cf/baai/bge-base-en-v1.5', {
      text: [text],
    });

    return Response.json({
      sentiment,
      embedding_dimensions: embedding.data[0].length,
    });
  },
} satisfies ExportedHandler<Env>;

Wrangler設定とデプロイ

# wrangler.toml
name = "ai-worker"
main = "src/index.ts"
compatibility_date = "2026-04-01"

[ai]
binding = "AI"

[vars]
ALLOWED_ORIGINS = "https://example.com"

# レート制限(無料枠保護)
[[unsafe.bindings]]
name = "RATE_LIMITER"
type = "ratelimit"
namespace_id = "1"
simple = { limit = 100, period = 60 }
# デプロイ
npx wrangler deploy

# ローカルテスト
npx wrangler dev

# モデル一覧確認
npx wrangler ai models

利用可能な主要モデル

モデル用途無料枠消費速度
@cf/meta/llama-3.1-8b-instructテキスト生成速い
@cf/meta/llama-3.1-70b-instruct高品質テキスト生成やや遅い
@cf/mistral/mistral-7b-instructテキスト生成速い
@cf/stabilityai/stable-diffusion-xl-base-1.0画像生成遅い
@cf/baai/bge-base-en-v1.5テキスト埋め込み最速
@cf/huggingface/distilbert-sst-2-int8感情分析最速
@cf/openai/whisper音声認識遅い

コスト最適化のポイント

無料枠(10,000ニューロン/日)を効率的に使うためのテクニック。

KVキャッシュで同一クエリの再実行を防止

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const { prompt } = await request.json<{ prompt: string }>();
    const cacheKey = `ai:${btoa(prompt).slice(0, 64)}`;

    // KVキャッシュ確認
    const cached = await env.CACHE.get(cacheKey);
    if (cached) {
      return Response.json(JSON.parse(cached));
    }

    const result = await env.AI.run('@cf/meta/llama-3.1-8b-instruct', {
      messages: [{ role: 'user', content: prompt }],
      max_tokens: 512,
    });

    // 1時間キャッシュ
    await env.CACHE.put(cacheKey, JSON.stringify(result), { expirationTtl: 3600 });
    return Response.json(result);
  },
} satisfies ExportedHandler<Env>;

関連記事

A

Agentive 編集部

AIエージェントを実際に使い倒す個人開発者。サイト制作の自動化を実践しながら、その知見を発信しています。