ANTIGRAVITY LABEN
記事一覧/アプリ開発
アプリ開発/2026-03-18上級

Antigravity エージェント × Cloudflare Workers AI でエッジ AI アプリを構築する

Antigravity IDE のエージェント機能を活用して Cloudflare Workers AI 上にエッジ AI アプリを構築・デプロイする完全ガイド。RAG パイプライン・ストリーミング・コスト最適化・本番監視まで詳細コード付きで解説。

Cloudflare Workers AIedge AIRAG5TypeScript11deployment5

エッジコンピューティングと AI の融合が加速する 2026 年、Cloudflare Workers AI はレイテンシゼロに近い AI 推論を世界 300 以上の PoP で提供します。Antigravity IDE のエージェント機能と組み合わせることで、コードの生成からデプロイまでを驚くほど短いサイクルで実現できます。

Cloudflare Workers AI とエッジ推論の仕組み

Workers AI は Cloudflare のエッジネットワーク上で直接 AI モデルを実行するサービスです。主な特徴は次のとおりです。

  • 超低レイテンシ: ユーザーから最近傍 PoP でモデルが動作するため、東京リージョンでも 50ms 以下のレイテンシを実現
  • ゼロコールドスタート: サーバーレスでありながら、GPU リソースを瞬時に割り当て
  • 課金モデル: Inference Units(IU)単位の従量課金。デフォルトで 1 日 10,000 IU の無料枠あり
  • 対応モデル: LLaMA 3.3、Mistral、Whisper、BAAI/bge(埋め込み)など主要 OSS モデルを提供

プロジェクト構成

my-edge-ai/
├── src/
│   ├── index.ts          ← メインの Worker エントリポイント
│   ├── rag.ts            ← RAG パイプライン
│   └── types.ts          ← 型定義
├── wrangler.toml         ← Cloudflare 設定
└── package.json

Antigravity でプロジェクトを高速セットアップ

Antigravity の Agent モードCmd+I)を活用すると、ボイラープレート生成から型補完まで AI がサポートします。

wrangler.toml の設定

# wrangler.toml
name = "edge-ai-api"
main = "src/index.ts"
compatibility_date = "2026-01-01"
compatibility_flags = ["nodejs_compat"]
 
[ai]
binding = "AI"   # TypeScript では env.AI でアクセス
 
[[vectorize]]
binding = "VECTORIZE"
index_name = "knowledge-base"   # ベクトル DB(RAG 用)
 
[[kv_namespaces]]
binding = "CACHE"
id = "your-kv-namespace-id"     # レスポンスキャッシュ用
 
[vars]
ENVIRONMENT = "production"
MAX_TOKENS = "1024"

POINT: Antigravity のエージェントに「wrangler.toml に Workers AI と Vectorize を追加して」と指示するだけで、上記のような構成を自動提案します。

基本的な AI エンドポイントの実装

// src/index.ts
import { Hono } from "hono";
import { cors } from "hono/cors";
import { stream } from "hono/streaming";
import { RagPipeline } from "./rag";
 
interface Env {
  AI: Ai;                  // Workers AI バインディング
  VECTORIZE: VectorizeIndex; // ベクトルDB バインディング
  CACHE: KVNamespace;      // KV キャッシュ
}
 
const app = new Hono<{ Bindings: Env }>();
 
// CORS の設定(本番では origin を厳格に制限すること)
app.use("*", cors({ origin: ["https://your-domain.com"] }));
 
// ─── テキスト生成エンドポイント(ストリーミング対応)───
app.post("/api/generate", async (c) => {
  const { prompt, stream: useStream = false } = await c.req.json();
 
  if (!prompt || prompt.length > 2000) {
    return c.json({ error: "prompt は 1〜2000 文字で指定してください" }, 400);
  }
 
  // キャッシュチェック(非ストリーミング時のみ)
  if (!useStream) {
    const cached = await c.env.CACHE.get(`gen:${btoa(prompt)}`);
    if (cached) {
      return c.json({ result: cached, cached: true });
    }
  }
 
  if (useStream) {
    // ストリーミングレスポンス
    return stream(c, async (s) => {
      const response = await c.env.AI.run(
        "@cf/meta/llama-3.3-8b-instruct",
        { prompt, stream: true, max_tokens: 1024 }
      ) as ReadableStream;
 
      const reader = response.getReader();
      const decoder = new TextDecoder();
 
      while (true) {
        const { done, value } = await reader.read();
        if (done) break;
        await s.write(decoder.decode(value));
      }
    });
  }
 
  // 通常レスポンス
  const result = await c.env.AI.run(
    "@cf/meta/llama-3.3-8b-instruct",
    { prompt, max_tokens: 1024 }
  ) as { response: string };
 
  // 5 分間キャッシュ(TTL: 300 秒)
  await c.env.CACHE.put(`gen:${btoa(prompt)}`, result.response, { expirationTtl: 300 });
 
  return c.json({ result: result.response, cached: false });
});
 
export default app;
 
// ─── 期待するレスポンス例(ストリーミングなし)───
// POST /api/generate
// Body: {"prompt": "Cloudflare Workers の利点を教えてください"}
// → {"result": "Cloudflare Workers は...", "cached": false}

RAG パイプラインの構築

単純な生成 AI に加え、**RAG(Retrieval-Augmented Generation)**で自社ナレッジベースを活用した応答を生成できます。

// src/rag.ts
interface QueryResult {
  answer: string;
  sources: string[];
  confidence: number;
}
 
export class RagPipeline {
  constructor(
    private ai: Ai,
    private vectorize: VectorizeIndex,
  ) {}
 
  /**
   * テキストを埋め込みベクトルに変換する
   */
  async embed(text: string): Promise<number[]> {
    const result = await this.ai.run(
      "@cf/baai/bge-large-en-v1.5",
      { text: [text] }
    ) as { data: number[][] };
    return result.data[0];
  }
 
  /**
   * クエリに関連するドキュメントを取得して回答を生成する
   */
  async query(userQuery: string): Promise<QueryResult> {
    // Step 1: クエリを埋め込みベクトルに変換
    const queryVector = await this.embed(userQuery);
 
    // Step 2: ベクトル DB から上位 5 件の関連ドキュメントを取得
    const matches = await this.vectorize.query(queryVector, {
      topK: 5,
      returnMetadata: "all",
    });
 
    if (matches.matches.length === 0) {
      return {
        answer: "関連する情報が見つかりませんでした。",
        sources: [],
        confidence: 0,
      };
    }
 
    // Step 3: 取得したコンテキストを使って LLM で回答を生成
    const context = matches.matches
      .map((m) => m.metadata?.text ?? "")
      .join("\n\n---\n\n");
 
    const sources = matches.matches
      .map((m) => m.metadata?.source as string)
      .filter(Boolean);
 
    const averageScore =
      matches.matches.reduce((sum, m) => sum + m.score, 0) / matches.matches.length;
 
    const prompt = `
以下のコンテキストに基づいて、質問に日本語で簡潔に答えてください。
コンテキスト外の情報は使用しないでください。
 
コンテキスト:
${context}
 
質問: ${userQuery}
回答:`;
 
    const result = await this.ai.run(
      "@cf/meta/llama-3.3-8b-instruct",
      { prompt, max_tokens: 512 }
    ) as { response: string };
 
    return {
      answer: result.response.trim(),
      sources: [...new Set(sources)],  // 重複排除
      confidence: averageScore,
    };
  }
 
  /**
   * ドキュメントをベクトル DB に追加する
   */
  async ingest(docs: { id: string; text: string; source: string }[]): Promise<number> {
    const vectors = await Promise.all(
      docs.map(async (doc) => ({
        id: doc.id,
        values: await this.embed(doc.text),
        metadata: { text: doc.text, source: doc.source },
      }))
    );
 
    await this.vectorize.upsert(vectors);
    return vectors.length;
  }
}
 
// RAG エンドポイントを index.ts に追加
// app.post("/api/rag", async (c) => {
//   const { query } = await c.req.json();
//   const rag = new RagPipeline(c.env.AI, c.env.VECTORIZE);
//   const result = await rag.query(query);
//   return c.json(result);
// });
//
// 期待するレスポンス例:
// {"answer": "Cloudflare Workers AI は...", "sources": ["doc1.pdf"], "confidence": 0.87}

Antigravity エージェントを使った効率的な開発フロー

Antigravity の Manager Surface(複数エージェント連携)を使うと、開発フローをさらに高速化できます。

推奨開発フロー

1. Antigravity Agent モード(Cmd+I)で初期コード生成
   └─ 「Hono × Workers AI のストリーミングエンドポイントを作って」

2. Plan モードで設計レビュー
   └─ 「このコードのセキュリティリスクと最適化ポイントを教えて」

3. ターミナルから直接デプロイ
   └─ wrangler deploy --env production

4. Antigravity でエラーログを解析
   └─ Cloudflare Dashboard のログを貼り付け → 原因特定

本番デプロイコマンド

# ローカル開発サーバー(Hot Reload 対応)
npx wrangler dev --local
 
# ステージング環境へデプロイ
npx wrangler deploy --env staging
 
# 本番環境へデプロイ
npx wrangler deploy --env production
 
# デプロイ後の動作確認
curl -X POST https://edge-ai-api.your-subdomain.workers.dev/api/generate \
  -H "Content-Type: application/json" \
  -d '{"prompt": "TypeScript の利点を 3 点挙げてください"}'
 
# 期待する出力例:
# {
#   "result": "1. 静的型付けによるバグの早期発見\n2. 優れた IDE サポート...",
#   "cached": false
# }

コスト最適化と本番監視

IU(Inference Unit)の節約戦略

施策削減効果実装難度
KV キャッシュ(同一クエリ)最大 80%
プロンプト圧縮(短縮化)20〜40%
軽量モデルへのルーティング30〜50%
ベクトル検索による RAG変動
// コスト最適化: クエリの複雑度に応じてモデルを自動選択する
function selectModel(prompt: string): string {
  const tokenEstimate = prompt.split(/\s+/).length;
 
  if (tokenEstimate < 50) {
    // 短いクエリには軽量モデル(低コスト)
    return "@cf/meta/llama-3.3-8b-instruct";
  } else if (tokenEstimate < 200) {
    // 中程度のクエリ
    return "@cf/mistral/mistral-7b-instruct-v0.2";
  } else {
    // 長い複雑なクエリには高性能モデル
    return "@cf/meta/llama-3.3-70b-instruct-fp8-fast";
  }
}

全体を振り返って

Antigravity × Cloudflare Workers AI の組み合わせで実現できることをまとめます。

  • 超低レイテンシ AI API:エッジ推論で世界中のユーザーに高速レスポンス
  • RAG パイプライン:Vectorize と組み合わせて自社ナレッジを活用
  • コスト効率:KV キャッシュとモデルルーティングで IU 消費を最小化
  • Antigravity エージェント活用:Plan モードと Manager Surface で設計からデプロイまで高速化

デプロイ基盤について詳しくは Cloudflare Workers デプロイガイド を参照してください。エージェント連携の詳細は Antigravity Agent Manager Framework と Cloudflare MCP サーバー活用ガイド も合わせてご覧ください。

シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

アプリ開発2026-06-13
TanStack Query v5 のキャッシュ整合性を壊さない設計 — 無効化境界・楽観的更新・SSR の落とし穴を Antigravity で詰めていく
いいねを押すと表示が一瞬で巻き戻る、別タブから戻ると古い値が残る。TanStack Query v5 で起きるキャッシュ不整合を「壊れる3地点」から逆算し、無効化境界・onMutateのロールバック・QueryClientのリクエスト分離を実コードで設計します。
アプリ開発2026-05-05
Antigravity で React Native iOS アプリを本番品質に仕上げるガイド
Antigravity を活用した React Native iOS アプリの本番開発ワークフローを解説。環境設定から TypeScript 型付きコード生成、TestFlight 提出まで、実際の開発フローに沿って紹介します。
アプリ開発2026-05-01
Antigravity × Railway 即デプロイガイド — Cloudflare と Vercel の隙間を埋める個人開発者向け選択肢
Antigravity から Railway へ即デプロイする実践ガイド。Cloudflare Workers が合わない長時間処理や永続ストレージが要る個人プロダクトの落としどころを示します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →