Alejandro Rioja.
AI Agents Growth

Самый дешёвый способ запустить контент-агента на Cloudflare

Alejandro Rioja
Alejandro Rioja
6 мин чтения
TL;DR

Вы можете запустить полный пайплайн генерации и перевода контента на Cloudflare Workers + Claude API примерно за $0,50 за пост с Sonnet 3.5 или $0,12 с Haiku. Бесплатный уровень Cloudflare обрабатывает 100K запросов/день — вы платите только когда масштаб этого требует. Ограничение — задержка холодного старта для долгих LLM-вызовов, которую решает Queues.

Бесплатная рассылка

Каждую среду. 28 400+ читателей. Никакой воды.

Содержание

Обновлено май 2026.

TL;DR: Вы можете запустить полный пайплайн генерации и перевода контента на Cloudflare Workers + Claude API примерно за $0,50 за пост с Sonnet 3.5 или $0,12 с Haiku. Бесплатный уровень Cloudflare обрабатывает 100K запросов/день — вы платите только когда масштаб этого требует. Ограничение — задержка холодного старта для долгих LLM-вызовов, которую решает Queues.

[Взгляд оператора] Я запускаю именно этот пайплайн для alejandrorioja.com: один TypeScript Worker пишет пост, распределяет 12 задач перевода и сохраняет всё в KV — всё это запускается одним HTTP-вызовом. Вот точные затраты и как всё устроено.

Почему Cloudflare, а не AWS или Vercel

AWS Lambda берёт плату за ГБ-секунду вычислений. Vercel берёт плату за каждое выполнение и имеет жёсткие ограничения скорости на хобби-уровне. Оба добавляют непредсказуемость холодных стартов при масштабировании.

Cloudflare Workers работает на изолятах V8, а не контейнерах. Холодные старты — менее миллисекунды. Бесплатный уровень действительно полезен: 100 000 запросов в день, 10 мс CPU-времени на запрос (реальное время больше). Платный план — $5/месяц за 10 миллионов запросов.

Для AI-контент-пайплайна вычислительные затраты Workers почти нулевые. Реальные затраты — это Claude API. Это единственная переменная, которую нужно оптимизировать.

Архитектура (текстовая диаграмма)

code
HTTP-триггер (cron или webhook)


  Worker: оркестратор

        ├─ Запись метаданных задачи → KV (статус: "pending")

        └─ Постановка 1 задачи генерации EN в очередь


         Очередь: content-jobs

        ┌──────┴──────┐
        ▼             ▼
  Worker: писатель   Worker: переводчик (×12 локалей)
        │                    │
        ▼                    ▼
  Claude API             Claude API
        │                    │
        └──────┬─────────────┘

        KV: posts/{slug}/{locale}


     Webhook → GitHub → деплой

Worker-оркестратор — это точка входа. Он записывает начальную запись статуса в KV, затем отправляет задачу в очередь Cloudflare. Fan-out очереди запускает Worker-писатель (EN) и, как только тело EN готово, 12 Worker-переводчиков параллельно. Всё попадает в KV с ключом {slug}/{locale}. Финальный webhook запускает деплой GitHub Actions.

Таблица затрат Cloudflare

РесурсБесплатный уровеньПлатный ($5/мес)Моё реальное использование
Запросы Workers100K/день10M/месяц~500/день
CPU-время Workers10мс/запрос30с/запрос~8мс/запрос
Чтения KV100K/день10M/месяц~2K/день
Записи KV1K/день1M/месяц~300/день
Сообщения очередей1M/месяц включено~300/месяц
Хранилище KV1 ГБ1 ГБ включено~200 МБ

Для сайта, публикующего 10 постов/месяц, счёт Cloudflare составит $0 на бесплатном уровне. Workers бесплатны. Чтения/записи KV при таком объёме бесплатны. Единственная платная функция — Queues, которая требует плана Workers Paid за $5/месяц, но этот план включает 1M сообщений в очереди.

Мой счёт Cloudflare: $5/месяц фиксировано, независимо от объёма постов до ~3000 постов/месяц.

Таблица затрат Claude API

Вот куда уходят реальные деньги. Разбивка по постам.

Генерация EN (один пост, ~1500 слов):

МодельВходные токеныВыходные токеныСтоимость
Claude Haiku 3.5~2 000~2 500$0,005
Claude Sonnet 3.5~2 000~2 500$0,042

12 переводов (каждый ~1500 слов):

МодельВходные токены (×12)Выходные токены (×12)Стоимость
Claude Haiku 3.5~24 000~30 000$0,054
Claude Sonnet 3.5~24 000~30 000$0,500

Итого за пост (EN + 12 переводов):

МодельОбщая стоимость
Claude Haiku 3.5~$0,059
Claude Sonnet 3.5~$0,542

Я использую Sonnet для генерации EN (качество важно для канонического поста) и Haiku для переводов (исходный текст уже написан; модели нужно только верно его перевести). Такой смешанный подход обходится примерно в $0,10 за пост на практике.

TypeScript Worker: оркестратор

typescript
// src/workers/orchestrator.ts
import { Queue } from "@cloudflare/workers-types";

interface Env {
  CONTENT_QUEUE: Queue;
  POSTS_KV: KVNamespace;
}

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

    // Запись начального статуса
    await env.POSTS_KV.put(
      `status:${slug}`,
      JSON.stringify({ status: "pending", createdAt: Date.now() })
    );

    // Постановка задачи генерации EN в очередь
    await env.CONTENT_QUEUE.send({
      type: "generate",
      slug,
      topic,
      locale: "en",
    });

    return Response.json({ queued: true, slug });
  },
};

TypeScript Worker: писатель + переводчик

typescript
// src/workers/content-processor.ts
interface Env {
  CONTENT_QUEUE: Queue;
  POSTS_KV: KVNamespace;
  ANTHROPIC_API_KEY: string;
}

const LOCALES = ["ar","de","es","fr","hi","it","ja","ko","nl","pt","ru","zh"];

export default {
  async queue(batch: MessageBatch<ContentJob>, env: Env): Promise<void> {
    for (const msg of batch.messages) {
      const job = msg.body;

      if (job.type === "generate") {
        const post = await generatePost(job.topic, env.ANTHROPIC_API_KEY);
        await env.POSTS_KV.put(`post:${job.slug}:en`, post);

        // Распределение переводов
        for (const locale of LOCALES) {
          await env.CONTENT_QUEUE.send({
            type: "translate",
            slug: job.slug,
            locale,
            sourceText: post,
          });
        }
      }

      if (job.type === "translate") {
        const translated = await translatePost(
          job.sourceText,
          job.locale,
          env.ANTHROPIC_API_KEY,
          // Использовать Haiku для переводов для снижения затрат
          "claude-haiku-3-5-20241022"
        );
        await env.POSTS_KV.put(`post:${job.slug}:${job.locale}`, translated);
      }

      msg.ack();
    }
  },
};

async function generatePost(topic: string, apiKey: string): Promise<string> {
  const res = await fetch("https://api.anthropic.com/v1/messages", {
    method: "POST",
    headers: {
      "x-api-key": apiKey,
      "anthropic-version": "2023-06-01",
      "content-type": "application/json",
    },
    body: JSON.stringify({
      model: "claude-sonnet-3-5-20241022",
      max_tokens: 4096,
      messages: [{ role: "user", content: `Write a detailed blog post about: ${topic}` }],
    }),
  });
  const data = await res.json<{ content: Array<{ text: string }> }>();
  return data.content[0].text;
}

async function translatePost(
  text: string,
  locale: string,
  apiKey: string,
  model: string
): Promise<string> {
  const res = await fetch("https://api.anthropic.com/v1/messages", {
    method: "POST",
    headers: {
      "x-api-key": apiKey,
      "anthropic-version": "2023-06-01",
      "content-type": "application/json",
    },
    body: JSON.stringify({
      model,
      max_tokens: 4096,
      messages: [
        {
          role: "user",
          content: `Translate the following blog post to ${locale}. Preserve all markdown. Keep code blocks in English.\n\n${text}`,
        },
      ],
    }),
  });
  const data = await res.json<{ content: Array<{ text: string }> }>();
  return data.content[0].text;
}

Сравнение альтернатив

ПлатформаБазовая стоимостьСтоимость за запросХолодные стартыTypeScript DX
Cloudflare Workers$0–$5/месПочти нольSub-msОтличный
AWS Lambda$0 (ограничено)$0,20/1M запр100мс–1сХороший
Vercel Functions$0 (ограничено)По использованию200мс–2сХороший
Собственный VPS$5–$20/мес$0Нет (всегда активен)Любой
Fly.io Machines$0 (ограничено)За ГБ-сек~500мсХороший

Собственный сервер — единственный случай, когда Cloudflare проигрывает. VPS Hetzner за $6/месяц запускает Node 24/7 без холодных стартов и без стоимости за запрос. Но вы сами управляете деплоями, аптаймом и масштабированием. Workers делает всё это бесплатно при моём объёме.

Сравнение с AWS Lambda выглядит конкурентоспособным на бумаге, но максимальное время выполнения Lambda в 15 минут — реальное ограничение для длинных LLM-цепочек. У Workers лимит CPU 30 секунд на платном плане — что звучит хуже, но в порядке, потому что вы используете Queues для асинхронной работы, а не блокируете одну Lambda.

KV для управления состоянием

KV — это глобально распределённое хранилище ключ-значение Cloudflare. Чтения быстрые везде (кешируются на edge). Записи распространяются глобально менее чем за 60 секунд.

Для контент-пайплайна я использую три паттерна ключей:

typescript
// Статус задачи
await kv.put(`status:${slug}`, JSON.stringify({ status, updatedAt: Date.now() }));

// Содержимое поста
await kv.put(`post:${slug}:${locale}`, markdownContent);

// Индекс для перечисления
const index = await kv.get<string[]>("index:posts", "json") ?? [];
await kv.put("index:posts", JSON.stringify([...index, slug]));

Затраты KV на моём масштабе: $0. Бесплатный уровень даёт 1K записей/день и 100K чтений/день. Я записываю ~300 записей KV в месяц (25 постов × 13 локалей = 325). Далеко до лимита.

Если вы публикуете 100+ постов/месяц на 12 языках, вы достигнете ~39 000 записей/месяц — всё ещё ниже 1M/месяц, включённого в платный план за $5.

Итоговый вывод оператора

Мой полный контент-пайплайн — генерация, перевод, хранение, деплой — обходится в $5,10/месяц на инфраструктуру ($5 Cloudflare Workers Paid + $0,10 Claude API за пост при 10 постах/месяц). Всё. Никаких серверов для управления, никакой оркестрации контейнеров, никаких неожиданных счетов от Lambda-холодных-стартов, достигающих порога запланированного параллелизма.

Стратегия смешанных моделей (Sonnet для EN, Haiku для переводов) снижает затраты на Claude на 80% без ощутимого снижения качества переводов. Посчитайте цифры для своего объёма — и вы обнаружите, что Cloudflare + Claude Haiku — это действительно самый дешёвый способ запустить такой пайплайн в масштабе основателя.

Читать дальше

Получайте ИИ-руководство на почту

Каждую среду. 28 400+ читателей. Никакой воды.

↵ — все результаты esc esc — закрыть