# Cloudflare AI Gateway

Source: https://docs.aiand.com/ja/integrations/cloudflare-ai-gateway/

[Cloudflare AI Gateway](https://developers.cloudflare.com/ai-gateway/) は、[カスタムプロバイダ](https://developers.cloudflare.com/ai-gateway/configuration/custom-providers/) として `https://api.aiand.com` をプロキシできます。Gateway のログ・分析・キャッシュ・レート制限が使え、課金はこれまで通り ai& の `sk-` キーです。

ai& は Gateway のネイティブプロバイダではありません。URL は `/openai` や `/aiand` ではなく `custom-{slug}` です。

## セットアップ

先に [API キー](https://console.aiand.com) を発行します。

<Steps>

1. Cloudflare ダッシュボードの **AI → AI Gateway → Custom Providers** でプロバイダを追加します。

   - Slug: `aiand`
   - Base URL: `https://api.aiand.com`（末尾スラッシュも `/v1` も付けない）
   - 有効化する

2. ゲートウェイを作成します（名前は任意。以下では `aiand-gateway`）。

3. ai& のキーは `Authorization: Bearer sk-…` に載せます。この経路では **Authenticated Gateway** は任意です。オンなら **AI Gateway Run** 権限の Cloudflare トークンを `cf-aig-authorization` にも付けます。

4. キーを **Provider Keys**（BYOK）に保存して `Authorization` を省略する場合は、Authenticated Gateway をオンにし、毎回 `cf-aig-authorization` を付けます。この Cloudflare トークンは `sk-` ではありません。

</Steps>

カスタムプロバイダの作成画面にキー欄はありません。それが正しいです。

## ゲートウェイ経由の呼び出し

`ACCOUNT_ID` は Cloudflare のアカウント ID に置き換えてください。

```bash
curl https://gateway.ai.cloudflare.com/v1/ACCOUNT_ID/aiand-gateway/custom-aiand/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $AIAND_API_KEY" \
  -H "cf-aig-authorization: Bearer $CF_AIG_TOKEN" \
  -d '{
    "model": "openai/gpt-oss-120b",
    "messages": [{"role": "user", "content": "Hello"}]
  }'
```

例には両方のヘッダがあります。`cf-aig-authorization` を外してよいのは、自分で `sk-` を送り、かつ Authenticated Gateway がオフのときだけです。`Authorization` を外してよいのは BYOK のときだけで、その場合は `cf-aig-authorization` を残します。

```ts

const client = new OpenAI({
  apiKey: process.env.AIAND_API_KEY,
  baseURL: "https://gateway.ai.cloudflare.com/v1/ACCOUNT_ID/aiand-gateway/custom-aiand/v1",
  defaultHeaders: {
    "cf-aig-authorization": `Bearer ${process.env.CF_AIG_TOKEN}`,
  },
});

const response = await client.chat.completions.create({
  model: "openai/gpt-oss-120b",
  messages: [{ role: "user", content: "Hello" }],
});
```

SDK が `/chat/completions` を付け、Gateway が `https://api.aiand.com/v1/chat/completions` を呼びます。同じ `baseURL` で `/v1/responses`、`/v1/messages`、`/v1/models`、`/v1/completions` も使えます。

<Aside type="caution">
  カスタムプロバイダの Base URL に `/v1` を含めないでください。`…/custom-aiand/v1/chat/completions` が `https://api.aiand.com/v1/v1/chat/completions` になります。
</Aside>

## Unified `/compat`（任意）

```bash
curl https://gateway.ai.cloudflare.com/v1/ACCOUNT_ID/aiand-gateway/compat/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $AIAND_API_KEY" \
  -H "cf-aig-authorization: Bearer $CF_AIG_TOKEN" \
  -d '{
    "model": "custom-aiand/openai/gpt-oss-120b",
    "messages": [{"role": "user", "content": "Hello"}]
  }'
```

`/compat` は chat completions だけです。Responses、Messages、カタログは `/custom-aiand/v1` を使ってください。

## キャッシュ

ゲートウェイ設定で **Cache Responses** をオンにします。同一リクエストは `cf-aig-cache-status: HIT` になり、ai& には届かず課金されません。ミスは `MISS` です。

デフォルトのキャッシュキーはプロバイダ・パス・モデル・認証・JSON ボディ全体の完全一致です。バイパスは `cf-aig-skip-cache: true` です。

<Aside type="caution">
  `cf-aig-cache-key` は完全一致キーを置き換えます。異なるプロンプトが同じカスタムキーを共有すると、同じキャッシュ応答が返ります。ユーザーごとのチャットに共有キーを使わないでください。
</Aside>

ストリーミングはデフォルトではキャッシュされません。**Cache Responses** の対象は同一の非ストリーミングのテキストと画像だけです。`stream: true` は ai& に届き、課金されます。

## エラー

- `cf-aig-authorization` の欠落や誤り（認証オン時）: Cloudflare の `401`（`AiGatewayError`）。OpenAI 形式ではありません。
- 誤ったカスタム slug: Cloudflare の `502`（`The provider did not return a valid response`）。ai& の `404` ではありません。
- 未知のモデル、壊れた JSON、空の `messages`、不正な `reasoning_effort`、テキスト専用モデルへの画像: いつもどおりの OpenAI 形式エラーがそのまま返ります。

## これではないもの

`env.AI.run("@cf/…")` は別製品の [Workers AI](https://developers.cloudflare.com/workers-ai/) です。Worker から AI Gateway なしで ai& を呼ぶなら、OpenAI SDK の `baseURL` を `https://api.aiand.com/v1` にしてください。
