Типичная ситуация: сервис обращается к OpenAI напрямую, затем подключает Anthropic, потом Google — и каждый раз новый ключ, отдельная страница с логами, свой код обработки сбоев. Cloudflare соединила свой Workers AI и AI Gateway в один слой: один вызов, общий баланс, единый набор политик для любых провайдеров.

Через единую точку входа — AI binding внутри Worker или REST API по пути /ai/* — сервис получает кэширование, повторы, лимиты трафика, контроль бюджета, запасные модели и журналирование. Модели Cloudflare, OpenAI и Anthropic вызываются единообразно — отличается только идентификатор.

Важно: материал актуален на 15 августа 2026 года. Unified Billing и Dynamic Routing — свежие возможности, которые Cloudflare продолжает дорабатывать.

Что это

AI Gateway — прослойка между сервисом и поставщиками моделей. Сервис передаёт идентификатор модели, запрос и служебные параметры, а шлюз применяет настроенные политики и перенаправляет вызов нужному провайдеру. Workers AI — запуск моделей на инфраструктуре Cloudflare; через тот же шлюз доступны и внешние поставщики: OpenAI, Anthropic, Google и десятки других.

7 августа 2026 года Cloudflare сообщила о слиянии двух сервисов. Теперь один AI binding и общий набор REST-вызовов по пути /ai/* даёт доступ к моделям на инфраструктуре Cloudflare и моделям внешних поставщиков через тот же код.

Интерфейс внутри Worker выглядит одинаково. Отличие — в идентификаторе модели: модели Cloudflare носят префикс @cf/, внешние — префикс провайдера.

await env.AI.run(model, input, {
  gateway: {
    id: "default",
  },
});
Источник моделиФормат идентификатораПример
Workers AI@cf/автор/модель@cf/moonshotai/kimi-k2.6
OpenAIopenai/модельopenai/gpt-4.1-mini
Anthropicanthropic/модельanthropic/claude-sonnet-4
Googlegoogle/модельgoogle/gemini-3-flash

Шлюз с именем default появляется сам после первого аутентифицированного запроса. При желании можно создать отдельные шлюзы для production-среды, тестов, команд или приложений: до 10 на бесплатном тарифе, до 20 на платном.

Важно: общий баланс подключается отдельным шагом. Для Workers AI нужно активировать режим Unified billing в настройках шлюза. Вызовы внешних моделей через env.AI.run() расходуют предоплаченные кредиты AI Gateway.

Зачем нужно

Шлюз берёт на себя задачи, которые иначе приходится решать в коде сервиса или дублировать в каждой интеграции:

  • Единый вход — модели Cloudflare, OpenAI, Anthropic и Google вызываются через один интерфейс.
  • Запасные модели — если основной поставщик недоступен, шлюз переключается на резервный вариант.
  • Кэш — повторные идентичные запросы не идут к провайдеру, экономя токены и время.
  • Лимиты трафика — ограничение запросов за период: фиксированное или скользящее окно.
  • Бюджет — предельная стоимость вызовов по модели, пользователю или команде.
  • Журналирование и метрики — модель, токены, задержка, стоимость, попадания в кэш, метаданные — в единой панели.
  • Атрибуция — каждый запрос привязан к пользователю, агенту или команде через метаданные.

Как устроено

Архитектура прослойки проста: сервис обращается к AI binding или REST API, запрос проходит через шлюз, шлюз применяет политики и перенаправляет вызов поставщику. Весь маршрут — от кэширования до лимитов — конфигурируется в одном месте.

flowchart LR
    A["Worker или приложение"] --> B["AI binding / REST API"]
    B --> C["AI Gateway"]
    C --> D["Workers AI"]
    C --> E["OpenAI"]
    C --> F["Anthropic"]
    C --> G["Google"]
    C --> H["Другие провайдеры"]
    C --> I["Логи и аналитика"]
    C --> J["Кэш и повтор"]
    C --> K["Лимиты и бюджеты"]

Подготовка Worker и AI binding

Для работы понадобятся: аккаунт Cloudflare, проект Workers, Wrangler, AI binding и кредиты AI Gateway для внешних моделей. Для вызовов через REST API нужен API-токен с правом Workers AI: Read.

Binding добавляется в wrangler.jsonc:

{
  "name": "ai-control-plane-demo",
  "main": "src/index.ts",
  "compatibility_date": "2026-08-15",
  "ai": {
    "binding": "AI"
  }
}

После изменения конфигурации обновите типы:

npx wrangler types

Вызов модели Workers AI

Минимальный Worker для вызова модели Cloudflare:

interface Env {
  AI: Ai;
}

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const result = await env.AI.run(
      "@cf/moonshotai/kimi-k2.6",
      {
        messages: [
          {
            role: "user",
            content: "Объясни, чем шлюз отличается от обычного прокси.",
          },
        ],
      },
      {
        gateway: {
          id: "default",
        },
      },
    );

    return Response.json(result);
  },
};

Запустите проект локально:

npx wrangler dev

Первый аутентифицированный запрос через default автоматически создаст шлюз. После вызова в панели AI Gateway появится журнал с моделью, временем ответа и числом токенов.

Вызов OpenAI, Anthropic и Gemini

Для внешней модели меняется лишь идентификатор — первая строка:

const result = await env.AI.run(
  "openai/gpt-4.1-mini",
  {
    messages: [
      {
        role: "user",
        content: "Составь краткий чеклист проверки API.",
      },
    ],
  },
  {
    gateway: {
      id: "default",
    },
  },
);

Для Anthropic или Google — соответствующий идентификатор:

const models = {
  openai: "openai/gpt-4.1-mini",
  anthropic: "anthropic/claude-sonnet-4",
  gemini: "google/gemini-3-flash",
};

Внимание: собственные ключи провайдеров (BYOK) через AI binding не поддерживаются. Вызовы внешних моделей через env.AI.run() расходуют Unified Billing и ключи под управлением Cloudflare. Если нужно работать со своим ключом OpenAI, Anthropic или Google — используйте нативный интерфейс провайдера в AI Gateway.

Из внешней среды модели можно вызывать через общий REST API:

curl -X POST \
  "https://api.cloudflare.com/client/v4/accounts/$CLOUDFLARE_ACCOUNT_ID/ai/v1/chat/completions" \
  --header "Authorization: Bearer $CLOUD...OKEN" \
  --header "cf-aig-gateway-id: default" \
  --header "Content-Type: application/json" \
  --data '{
    "model": "openai/gpt-4.1-mini",
    "messages": [
      {
        "role": "user",
        "content": "Что такое единый шлюз для моделей?"
      }
    ]
  }'

Под /ai/* работают четыре формата. Универсальный /ai/run принимает любые модели и типы вывода — текст, изображения, синтез речи. OpenAI-совместимый /ai/v1/chat/completions работает с OpenAI SDK. Responses API /ai/v1/responses — для агентных сценариев, также совместим с OpenAI SDK. Anthropic-совместимый /ai/v1/messages — для Anthropic SDK, но не поддерживает модели Workers AI.

ВызовФорматСторонние моделиМодели Workers AI
POST /ai/runКонверт с моделью и входными даннымиДаДа
POST /ai/v1/chat/completionsOpenAI chat completionsДаДа
POST /ai/v1/responsesOpenAI Responses APIДаЗависит от модели
POST /ai/v1/messagesAnthropic Messages APIДаНет

Важно: /ai/v1/messages строго использует схему Anthropic и не поддерживает модели @cf/. Для моделей Workers AI используйте /ai/run или /ai/v1/chat/completions.

Резервные модели

Cloudflare предлагает два механизма резервного вызова. Оба обеспечивают переключение на другую модель, если основная вернула ошибку или не уложилась в тайм-аут.

Последовательность через Universal Endpoint

Universal Endpoint получает массив шагов. Если первый поставщик вернул ошибку или не уложился в тайм-аут, шлюз переходит к следующему шагу. Заголовок ответа указывает, какой шаг сработал: cf-aig-step: 0 — ответила основная модель, cf-aig-step: 1 — первый резерв, cf-aig-step: 2 — второй резерв.

Внимание: Universal Endpoint помечен как устаревший. Cloudflare рекомендует использовать OpenAI-совместимый вызов для новых интеграций и Dynamic Routing для резервных моделей, повторов и условных маршрутов. Universal Endpoint продолжит работать для существующих интеграций.

Dynamic Routing

Dynamic Routing даёт возможность собрать версионируемый маршрут из условий, моделей, ограничений и переходов. В маршрут можно включить основную модель, резервную модель, лимит трафика, бюджет и процентное распределение для A/B-теста. Маршрут настраивается через визуальный интерфейс или JSON-конфигурацию, а вызывается из кода по имени — без изменения приложения.

Из Worker такой маршрут вызывается так:

const response = await env.AI.gateway("my-gateway").run({
  provider: "compat",
  endpoint: "chat/completions",
  headers: {},
  query: {
    model: "dynamic/support",
    messages: [
      {
        role: "user",
        content: "Помоги разобрать ошибку API.",
      },
    ],
  },
});

Для Dynamic Routing включите аутентификацию шлюза и сохраните ключи используемых поставщиков через BYOK. Маршрут вызывается через OpenAI-совместимый интерфейс /compat/chat/completions. На 15 августа 2026 года Dynamic Routing не доступен через новые REST-вызовы /ai/run, /ai/v1/chat/completions, /ai/v1/responses и /ai/v1/messages.

Важно: автоматический выбор провайдера по модели, при котором Cloudflare сама выбирает поставщика для заданной модели, 7 августа был заявлен как следующий этап. На момент проверки это будущая функция, а не готовый режим.

Кэш, повтор и ограничение трафика

Кэширование

Шлюз кэширует ответы поставщиков и отдаёт повторные идентичные запросы из своего кэша. Для AI binding доступны параметры cacheTtl, cacheKey и skipCache:

const result = await env.AI.run(
  "openai/gpt-4.1-mini",
  {
    messages: [
      {
        role: "user",
        content: "Какие форматы поддерживает API?",
      },
    ],
  },
  {
    gateway: {
      id: "default",
      cacheTtl: 3600,
    },
  },
);

Без пользовательского cacheKey шлюз формирует ключ из провайдера, интерфейса, модели, заголовка авторизации и полного тела запроса — любое отличие создаёт отдельную запись. Пользовательский cacheKey заменяет стандартный механизм, поэтому в него следует включить все параметры, влияющие на ответ: версию промпта, пользователя, язык, модель и другие значимые признаки. Минимальный TTL — 60 секунд, максимальный — один месяц.

Внимание: не используйте общий cacheKey для персонализированных запросов. Разные запросы с одинаковым ключом могут получить один и тот же закэшированный ответ, включая ответ, подготовленный для другого пользователя.

Для HTTP-запроса результат кэша проверяется по заголовку: cf-aig-cache-status: HIT означает попадание, MISS — промах. Кэш работает только для текстовых и графических ответов и применяется к точно совпадающим запросам.

Повторные попытки

Шлюз может автоматически повторять неудачные запросы. Параметры:

  • Количество попыток — максимум 5.
  • Задержка — до 5 секунд перед повтором.
  • Метод задержки — постоянный, линейный или экспоненциальный.

Для REST API параметры передаются заголовками:

--header "cf-aig-request-timeout: 5000" \
--header "cf-aig-max-attempts: 3" \
--header "cf-aig-retry-delay: 500" \
--header "cf-aig-backoff: exponential"

Для binding общую политику повторов можно настроить на уровне шлюза. Повтор выполняется к текущей модели — сам по себе он не меняет модель. Переход к другой модели происходит только в явно настроенной цепочке через Universal Endpoint или Dynamic Routing. В Universal Endpoint Cloudflare сперва выполняет предусмотренные повторы, затем переходит к следующему шагу.

Ограничение трафика

Ограничение трафика (rate limiting) задаёт лимит запросов за период. Cloudflare поддерживает фиксированное и скользящее окно. При превышении лимита шлюз возвращает 429 Too Many Requests.

Глобальный лимит задаётся в настройках шлюза. Лимиты для отдельных пользователей, агентов или команд проще собирать в Dynamic Routing с ключом из метаданных.

Атрибуция по пользователям и агентам

Custom metadata привязывает каждый запрос к пользователю, агенту, команде или окружению. Метаданные появляются в журналах и служат для фильтрации, аналитики, Dynamic Routing и индивидуальных бюджетов.

const result = await env.AI.run(
  "@cf/moonshotai/kimi-k2.6",
  {
    messages: [
      {
        role: "user",
        content: "Подготовь краткое резюме документа.",
      },
    ],
  },
  {
    gateway: {
      id: "production",
      metadata: {
        user_id: "u_42",
        agent_id: "knowledge-agent",
        team: "content",
        environment: "production",
        request_kind: "summary",
      },
    },
  },
);
Панель Cloudflare AI Gateway Cost Attribution с расходами по группам, моделям и пользователям

Шлюз сохраняет до 5 полей метаданных на запрос. Допустимые типы значений — строки, числа и логические. Объекты не поддерживаются, а ключи с префиксом cf. зарезервированы Cloudflare — шлюз удаляет такие ключи из пользовательских данных.

Внимание: при передаче более 5 записей метаданных сохраняются только первые пять, остальные игнорируются. Держите количество в пределах пяти.

Бюджеты и наблюдаемость

Spend limits управляют расчётной стоимостью запросов по данным о токенах и известной цене модели. Правила можно разделять или фильтровать по модели, поставщику и custom metadata: пользователю, агенту, команде или приложению. При исчерпании бюджета шлюз возвращает 429.

Каждое правило задаёт бюджет в долларах на временной период — фиксированный или скользящий. Шлюз рассчитывает стоимость каждого запроса на основе токенов и цены модели, затем отслеживает накопленные расходы в реальном времени. На один шлюз разрешено до 20 правил расходов.

Важно: учёт расходов не мгновенный. Короткий всплеск параллельных запросов способен кратковременно превысить установленный бюджет до обновления счётчика. Spend limit работает как оперативный ограничитель, но не гарантирует абсолютной точности финансового барьера.

Интерфейс Cloudflare AI Gateway с правилами Spend Limits для шлюза, пользователя и модели

В Dynamic Routing вместо блокировки можно направить запрос в более дешёвую модель. Например, основная модель — дорогая, а при исчерпании бюджета запрос уходит на резервную. Стоимость считается по токенам и известной цене модели. При использовании собственных ключей итоговую сумму сверяйте в кабинете поставщика. При Unified Billing проверяйте списания кредитов и счёт Cloudflare.

В панели доступны:

  • Количество запросов и ошибок
  • Задержка
  • Входные и выходные токены
  • Модель и поставщик
  • Примерная стоимость
  • Попадания в кэш
  • Метаданные
  • Сохранённые промпты и ответы

Внимание: журналы по умолчанию могут содержать полные тексты промптов и ответов. Для чувствительных данных отключите журналирование либо передайте cf-aig-collect-log-payload: false, чтобы сохранить метаданные, токены, стоимость и длительность без тела запроса.

Unified Billing расходует предоплаченные кредиты Cloudflare. При покупке кредитов начисляется комиссия 5%: при покупке кредита на $100 списания составят $105. Стоимость вызова у внешнего поставщика передаётся без дополнительной наценки — те же повременные тарифы, что и напрямую у поставщика. Zero Data Retention направляет трафик через интерфейсы поставщика, которые не сохраняют промпты и ответы, но не отключает журналы самого шлюза.

Чеклист

Чеклист проверки рабочего контура

После настройки шлюза полезно проверить, что все ключевые возможности работают. Список ниже покрывает основные точки контроля.

Worker возвращает успешный JSON-ответ

— базовый вызов проходит.

Шлюз default или выбранный шлюз появился в панели

— первый запрос создал шлюз.

В журнале видны модель, токены, длительность и стоимость

— журналирование работает.

Метаданные содержат идентификатор пользователя или агента

— атрибуция настроена.

Повторный идентичный запрос возвращает HIT

— для REST по заголовку cf-aig-cache-status, для binding — в журнале шлюза.

Искусственная ошибка основной модели включает резерв

— в ответе присутствует ожидаемый заголовок cf-aig-step.

Ограничение трафика возвращает 429

— после превышения порога.

Бюджет блокирует запрос или переключает на дешёвую модель

— при исчерпании лимита.

Чувствительные данные не сохраняются в журналах — cf-aig-collect-log-payload:

false или журналирование отключено.

Когда шлюз полезен

Шлюз имеет смысл, когда в системе присутствует хотя бы одна из этих задач:

  • Несколько моделей или поставщиков — единый вызов для всех.
  • Нужен резерв при ошибках и тайм-аутах — автоматическое переключение.
  • Расходы нужно разделять по пользователям, агентам или командам — атрибуция через метаданные.
  • Требуется общий лимит бюджета — spend limits на шлюзе.
  • Нужны централизованные журналы и метрики — одна панель для всех поставщиков.
  • Повторяющиеся запросы можно кэшировать — экономия токенов.
  • Модель должна переключаться без переписывания приложения — маршрут в Dynamic Routing.

Для агентной платформы шлюз служит местом применения общих правил. Каждый агент вправе работать со своей моделью, но ограничения, атрибуция и наблюдаемость остаются в одном месте.

Когда шлюз — лишний слой

Прямой вызов поставщика может оказаться проще, если:

  • Небольшой прототип с одной моделью
  • Расходы уже контролируются средствами поставщика
  • Резерв и кэш не нужны
  • Приложение сильно зависит от специфических возможностей нативного API
  • В компании уже работает другой шлюз для моделей
  • Вы не готовы учитывать ещё один слой аутентификации и конфигурации

Практичный путь — начать с шлюза default и наблюдаемости. Кэш, маршруты и бюджеты добавлять после появления понятной задачи.

Частые ошибки

ОшибкаЧто проверить
401 при REST-вызовеУ токена есть право Workers AI: Read
Сторонняя модель не запускаетсяНа балансе есть кредиты AI Gateway
Собственные ключи не работают через env.AI.run()Используйте нативный интерфейс провайдера
Запросы не видны в журналахВключено журналирование и не достигнут лимит хранения
Кэш постоянно возвращает MISSПроверьте полное совпадение запроса или используемый cacheKey
Шлюз отвечает 429Превышен лимит трафика, бюджет или лимит модели
Резерв не включаетсяНастроена явная цепочка Universal Endpoint или Dynamic Routing, маршрут опубликован, а ошибка соответствует условию перехода
Расходы отличаются от счётаМетрика шлюза — оценка, а не точная сумма

Если вы строите агентную платформу или подключаете к продукту несколько моделей, единый шлюз помогает заранее определить правила расходов, отказоустойчивости и доступа.

Ограничения

Ограничения

Что учитывать

Что учитывать при планировании.

Собственные ключи через AI binding не поддерживаются — Вызовы сторонних моделей через env.AI.run() используют Unified Billing и ключи, которыми управляет Cloudflare.

Для работы со своим ключом OpenAI, Anthropic или Google нужен нативный интерфейс провайдера. Это ограничение архитектуры binding, а не временный недостаток.

Dynamic Routing недоступен через новые REST-вызовы — На 15 августа 2026 года маршруты Dynamic Routing вызываются только через OpenAI-совместимый интерфейс /compat/chat/completions.

Новые вызовы /ai/run, /ai/v1/chat/completions, /ai/v1/responses и /ai/v1/messages поддержку Dynamic Routing пока не получили.

Universal Endpoint помечен как устаревший — Cloudflare рекомендует переходить на OpenAI-совместимый вызов и Dynamic Routing.

Старый интерфейс продолжит работать для существующих интеграций, но новые возможности будут добавляться в Dynamic Routing.

Учёт расходов не мгновенный — Spend limit работает с задержкой обновления счётчика.

Всплеск параллельных запросов может кратковременно превысить заданный бюджет до того, как счётчик догонит. Для абсолютного финансового барьера нужен дополнительный контроль на стороне приложения.

Шлюзов на аккаунт — не более 20 на платном тарифе — На бесплатном — 10.

Если каждый агент или команда требуют отдельный шлюз, на крупных развёртываниях этого может не хватить. Альтернатива — один шлюз с разделением через метаданные.

Кэш работает только для текста и изображений — Точные совпадения запросов кэшируются.

Семантический поиск для кэша заявлен как будущая возможность. Для динамических и персонализированных ответов кэш бесполезен.

Антипаттерны

Антипаттерны

Чего не делать

Чего не делать.

Использовать общий cacheKey для персонализированных запросов — Разные пользователи с одинаковым ключом получат один и тот же закэшированный ответ.

В ключ нужно включать все параметры, влияющие на ответ: пользователя, версию промпта, язык, модель. Иначе кэш начнёт подмешивать чужие ответы.

Рассчитывать на точный финансовый барьер от spend limit — Метрика шлюза — оценка по токенам и цене модели, а не точный счёт.

При использовании собственных ключей итоговую сумму нужно сверять в кабинете поставщика. При Unified Billing — в счёте Cloudflare. Spend limit — оперативный ограничитель, но не бухгалтерия.

Оставлять журналы с полными промптами для чувствительных данных — По умолчанию журналы могут содержать полные тексты запросов и ответов.

Для конфиденциальных данных отключите журналирование или передайте cf-aig-collect-log-payload: false, чтобы сохранить метаданные без тела запроса.

Пользоваться AI binding с ожиданием BYOK — Через env.AI.run() собственные ключи поставщиков не работают.

Если архитектура требует свои ключи — используйте нативные интерфейсы поставщиков в шлюзе. Попытка передать ключ в заголовке через binding приведёт к падению вызова.

Чеклист

Чеклист

Проверка перед запуском

Проверка перед запуском.

AI binding добавлен в wrangler.jsonc — В конфигурации Worker есть блок ai с binding AI.

Типы обновлены через npx wrangler types.

Кредиты AI Gateway пополнены — Для вызова сторонних моделей через Unified Billing на балансе есть кредиты.

Для Workers AI в настройках шлюза выбран режим Unified billing.

API-токен имеет право Workers AI: Read — Для REST-вызовов через /ai/* нужен токен с этим разрешением.

Только разрешение AI Gateway вернёт 401.

Идентификатор модели указан верно — Модели Cloudflare — с префиксом @cf/, сторонние — с префиксом провайдера.

Актуальные идентификаторы проверяются в каталоге моделей Cloudflare.

Метаданные содержат не более 5 полей — Шлюз сохраняет до 5 записей метаданных на запрос.

Типы значений — строки, числа, логические. Объекты не поддерживаются. Ключи с префиксом cf. зарезервированы.

cacheKey учитывает все параметры ответа — Пользовательский ключ кэша включает пользователя, версию промпта, язык, модель.

Минимальный TTL — 60 секунд, максимальный — один месяц.

Резервная цепочка явно настроена — Для автоматического переключения настроен Universal Endpoint или Dynamic Routing.

Маршрут опубликован, условие перехода соответствует типу ожидаемой ошибки.

Чувствительные данные защищены в журналах — Передан заголовок cf-aig-collect-log-payload: false или журналирование отключено.

Метаданные, токены и стоимость сохраняются без тела запроса.

Ссылки

Ссылки