Jev в Cloudflare Workers AI

Обновлено

Cloudflare добавила Jev в каталог моделей как стороннюю модель typesafe/jev. Её вызывают из Worker через тот же биндинг AI, что и остальные модели. Ключ TypeSafe не нужен, а счёт выставляет Cloudflare.

Что известно о Jev в Cloudflare

  • Идентификатор: typesafe/jev, в каталоге помечен как сторонняя модель (Third-party).
  • Контекст: 32 000 токенов.
  • Цена: на странице модели не опубликована, Cloudflare показывает её в дашборде.
  • Формат: запрос и ответ такие же, как у API TypeSafe: state и questions на входе, model, answers и usage на выходе.
  • Условия использования: ссылка ведёт на юридические документы TypeSafe.

В каталоге Cloudflare Jev отнесена к категории Text Generation, хотя текст модель не генерирует. Ищите её по названию или по идентификатору.

Для сторонних моделей в документации Cloudflare есть условие: они работают только через AI Gateway и оплачиваются по схеме Unified Billing. Cloudflare сама хранит учётные данные провайдера и списывает стоимость с ваших кредитов.

Шаг 1. Биндинг AI в конфигурации Wrangler

Добавьте биндинг в wrangler.jsonc:

{
  "ai": {
    "binding": "AI"
  }
}

В коде Worker он будет доступен как env.AI. Если проект на TypeScript, после изменения конфигурации выполните wrangler types: команда обновит типы для env.

Шаг 2. Вызов из Worker

export default {
  async fetch(request, env) {
    const { text } = await request.json();

    const result = await env.AI.run(
      "typesafe/jev",
      {
        state: text,
        questions: {
          is_urgent: {
            type: "noul",
            instructions: "Клиент сообщает о срочной проблеме?",
          },
          department: {
            type: "choice",
            instructions: "Какая команда должна заняться обращением?",
            criteria: {
              billing: "Платежи, счета, возвраты",
              technical: "Ошибки, сбои, интеграции",
              sales: "Тарифы и покупка",
            },
          },
        },
      },
      { gateway: { id: "default" } },
    );

    return Response.json({
      urgent: result.answers.is_urgent.noul,
      department: result.answers.department.choice,
      confidence: result.answers.department.confidence,
    });
  },
};

Третий аргумент указывает шлюз AI Gateway. В примере на странице модели его нет, но справочник биндинга для сторонних моделей передаёт шлюз явно. Значение default создаёт шлюз автоматически при первом авторизованном запросе. Если у вас уже есть шлюз, передайте его имя: так проще разделять трафик разных приложений.

Ответ приходит в формате TypeSafe. Пример из документации Cloudflare, сокращённый:

{
  "model": "jev-1.13.0",
  "answers": {
    "is_urgent": { "type": "noul", "noul": 0.95 },
    "department": {
      "type": "choice",
      "choice": "billing",
      "confidence": 0.8,
      "probabilities": { "billing": 0.87, "sales": 0, "technical": 0.13 }
    }
  },
  "usage": { "input_tokens": 426, "output_tokens": 73 }
}

Поля ответов те же, что и при прямой работе с API. Что означают noul, probabilities и confidence, описано в справочнике API Jev.

Шаг 3. Пополнение кредитов

Без кредитов сторонние модели не вызываются. Порядок такой:

  1. Откройте в дашборде Cloudflare раздел AI Gateway.
  2. В карточке Credits Available нажмите Manage.
  3. Если способа оплаты нет, дашборд предложит его добавить.
  4. Нажмите Top-up credits, укажите сумму и подтвердите оплату.

Что стоит знать об этой схеме:

  • Комиссия 5% берётся при покупке кредитов: пополнение на $100 обойдётся в $105. Цены провайдеров, по словам Cloudflare, передаются без наценки.
  • Автопополнение включается там же: задайте порог и сумму пополнения.
  • Лимиты расходов настраиваются на уровне шлюза: по модели, провайдеру или по вашим метаданным, например по пользователю.
  • Отрицательный баланс в редких случаях возможен. Тогда Cloudflare спишет долг с привязанного способа оплаты в начале следующего месяца.

Вызов через REST API Cloudflare

Если код работает не в Worker, вызывайте ту же модель через API Cloudflare. Для сторонних и собственных моделей есть универсальный эндпоинт /ai/run: модель указывается в поле model, параметры — внутри input.

curl https://api.cloudflare.com/client/v4/accounts/$CLOUDFLARE_ACCOUNT_ID/ai/run \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "typesafe/jev",
    "input": {
      "state": "Третий день не проходят выплаты. Помогите срочно!",
      "questions": {
        "is_urgent": { "type": "noul", "instructions": "Клиент сообщает о срочной проблеме?" }
      }
    }
  }'

Токену нужно право Account → Workers AI → Read. Токен только с правами AI Gateway получит ответ 401 с кодом ошибки 10000. Идентификатор аккаунта покажет wrangler whoami.

Параметры шлюза: логи, кэш, метаданные

В третьем аргументе env.AI.run() кроме id можно передать:

Параметр Что делает
skipCache Пропустить кэш для этого запроса
cacheTtl Время жизни кэша в секундах
cacheKey Свой ключ кэша
collectLog Собирать ли лог запроса
metadata Произвольные метаданные для записи в логе

Запросы через шлюз попадают в аналитику: число запросов, ошибки, задержка, токены и стоимость. Идентификатор лога последнего вызова вернёт env.AI.aiGatewayLogId. Кэш полезен, когда одни и те же вопросы задаются к одному и тому же тексту, например при повторной обработке.

Вариант без Workers AI: fetch к API TypeSafe

Если ключ TypeSafe уже есть и платить вы хотите TypeSafe, биндинг не нужен. Сохраните ключ в секретах Worker:

npx wrangler secret put TYPESAFE_API_KEY

И вызывайте API обычным fetch:

export default {
  async fetch(request, env) {
    const { text } = await request.json();

    const res = await fetch("https://api.typesafe.ai/v1/systemone", {
      method: "POST",
      headers: {
        Authorization: `Bearer ${env.TYPESAFE_API_KEY}`,
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        model: "jev-latest",
        state: text,
        questions: { spam: { type: "noul", instructions: "Это спам?" } },
      }),
    });

    if (!res.ok) {
      return new Response(await res.text(), { status: res.status });
    }
    const data = await res.json();
    return Response.json({ spam: data.answers.spam.noul });
  },
};

С совместимыми площадками код тот же, меняются адрес, ключ и модель. Для OpenRouter это https://openrouter.ai/api/v1/systemone и typesafe/jev-1.13, для Polza.AI — https://polza.ai/api/v1/systemone и typesafe/jev. На ответы 429 и 529 делайте повтор с экспоненциальной задержкой: в этом варианте повторы остаются на вашей стороне. Подробности — в статье об ошибках API Jev.

Что выбрать

Биндинг Workers AI fetch к API TypeSafe
Ключ провайдера Не нужен Ключ TypeSafe в секретах Worker
Оплата Кредиты AI Gateway, комиссия 5% при пополнении Счёт TypeSafe или площадки
Логи и аналитика В AI Gateway Настраиваете сами
Кэш и лимиты Настройки шлюза Настраиваете сами
Формат запроса state и questions Тот же

Биндинг удобен, если инфраструктура уже в Cloudflare и вы хотите один счёт за все модели. Прямой fetch подходит, когда биллинг уже настроен у TypeSafe или у площадки вроде OpenRouter. Для покупки кредитов нужен способ оплаты, который принимает Cloudflare. Если его нет, посмотрите способы подключения из России. Похожая схема с оплатой кредитами есть и у Vercel AI Gateway.

Частые вопросы

Как называется Jev в Cloudflare Workers AI?

typesafe/jev. В каталоге Cloudflare модель помечена как сторонняя (Third-party), контекст — 32 000 токенов.

Нужен ли ключ TypeSafe для Jev в Cloudflare?

Нет. Сторонние модели Cloudflare вызывает со своими учётными данными и списывает стоимость с кредитов AI Gateway. Нужны аккаунт Cloudflare и пополненный баланс.

Сколько стоит Jev в Cloudflare?

На странице модели цена не указана, Cloudflare отсылает к дашборду. По правилам Unified Billing цены провайдеров передаются без наценки, а при покупке кредитов берётся комиссия 5%.

Можно ли вызвать Jev из Worker без Workers AI?

Да, обычным fetch к API TypeSafe или совместимой площадки. Ключ храните в секретах Worker, а не в коде.

Источники