Самый дешёвый способ запустить контент-агента на Cloudflare
Вы можете запустить полный пайплайн генерации и перевода контента на Cloudflare Workers + Claude API примерно за $0,50 за пост с Sonnet 3.5 или $0,12 с Haiku. Бесплатный уровень Cloudflare обрабатывает 100K запросов/день — вы платите только когда масштаб этого требует. Ограничение — задержка холодного старта для долгих LLM-вызовов, которую решает Queues.
Каждую среду. 28 400+ читателей. Никакой воды.
✓ Check your inbox — click the confirmation link to complete sign-up.
✓ You're subscribed!
✓ You're already on the list.
Содержание
Обновлено май 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. Это единственная переменная, которую нужно оптимизировать.
Архитектура (текстовая диаграмма)
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/мес) | Моё реальное использование |
|---|---|---|---|
| Запросы Workers | 100K/день | 10M/месяц | ~500/день |
| CPU-время Workers | 10мс/запрос | 30с/запрос | ~8мс/запрос |
| Чтения KV | 100K/день | 10M/месяц | ~2K/день |
| Записи KV | 1K/день | 1M/месяц | ~300/день |
| Сообщения очередей | — | 1M/месяц включено | ~300/месяц |
| Хранилище KV | 1 ГБ | 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: оркестратор
// 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: писатель + переводчик
// 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 секунд.
Для контент-пайплайна я использую три паттерна ключей:
// Статус задачи
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+ читателей. Никакой воды.
✓ Check your inbox — click the confirmation link to complete sign-up.
✓ You're subscribed!
✓ You're already on the list.
Получайте ИИ-руководство на почту
Каждую среду. 28 400+ читателей. Никакой воды.
Check your inbox.
We sent you a confirmation email — click the link inside to complete your subscription. Check spam if you don't see it within a minute.
You're subscribed.
Welcome — the next edition lands in your inbox soon.
You're already on the list — look for it every Wednesday.