我用来运行30个以上生产Agent的技术栈(无Python)
我使用TypeScript、Cloudflare Workers/Queues/KV和Claude模型运行30个以上的生产AI Agent——无Python,无Agent框架。这个技术栈故意保持简单:Workers处理调度和队列,KV存储状态,Anthropic SDK直接驱动模型调用。真正的约束不是AI层——而是围绕它的基础设施。
每周三。28,400+ 读者。纯干货。
✓ Check your inbox — click the confirmation link to complete sign-up.
✓ You're subscribed!
✓ You're already on the list.
目录
2026年5月更新。
TL;DR: 我使用TypeScript、Cloudflare Workers/Queues/KV和Claude模型运行30个以上的生产AI Agent——无Python,无Agent框架。这个技术栈故意保持简单:Workers处理调度和队列,KV存储状态,Anthropic SDK直接驱动模型调用。真正的约束不是AI层——而是围绕它的基础设施。
[运营者视角] 我经营两个业务:一个AI咨询品牌和Pickleland——德克萨斯州普弗卢格维尔的一个匹克球设施。两者加在一起,今天在生产中运行着30个以上的Agent。这是真实的技术栈,不是演示。
为什么不用Python
说实话:我每天都在为网站和产品工作写TypeScript。为Agent添加第二种语言意味着两个运行时、两个依赖树、两个部署流水线。生产力成本不是理论上的——我在之前的项目中付出过,并决定不再重复。
第二个原因是Cloudflare。Workers在边缘原生运行TypeScript,内置了Queues、KV、Durable Objects和Cron Triggers。我需要的所有Agent基础设施——调度、状态、异步任务处理——只需一个wrangler deploy命令。没有Python等价物具有相同的运营简单性。
第三个原因:大多数”Python更适合AI”的论点实际上是在说”Python有更多ML库”。我不训练模型。我调用API。Anthropic SDK是一流的TypeScript。LangChain及其同类是我不想要的复杂性。当你在部署Agent而不是研究它们时,简单性获胜。
核心基础设施:三个Cloudflare原语
我运行的每个Agent至少接触这三个中的一个:
Cloudflare Workers — 计算层。Worker是Agent的运行时:它接收触发器(cron、Queue消息、HTTP),运行模型调用,并将输出写到某处。冷启动低于5ms。免费计划CPU时间限制30秒,付费计划15分钟。我构建的几乎所有内容都能在30秒内完成;不能的则使用Queues进行扇出。
Cloudflare Queues — 异步任务处理。当任务可能比请求花费更长时间,或当我需要扇出(并行生成12个翻译)时,我将消息推送到Queue,让绑定的消费者独立处理它们。无轮询,无setTimeout黑客。
Cloudflare KV — 轻量级状态。Agent运行历史、最后处理的时间戳、缓存的API响应。KV是最终一致的,这对Agent来说没问题——我不运行事务。它给了我一个简单的键值存储,我可以从任何Worker读写,无需启动数据库。
模型层:Anthropic SDK,两个模型
我只使用两个Claude模型:
claude-sonnet-4-6— 用于需要真正推理的任务:写博客文章、分析事件数据、生成社交文案、规划序列claude-haiku-4-5— 用于快速/廉价的分类、路由决策、不需要完整推理的简短提取
TypeScript中的Anthropic SDK很直接。以下是我用于每次模型调用的模式:
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({ apiKey: env.ANTHROPIC_API_KEY });
async function runAgent(prompt: string, systemPrompt: string): Promise<string> {
const message = await client.messages.create({
model: "claude-sonnet-4-6",
max_tokens: 2048,
system: systemPrompt,
messages: [{ role: "user", content: prompt }],
});
const block = message.content[0];
if (block.type !== "text") throw new Error("Unexpected content type");
return block.text;
}这就是整个模型接口。上面没有抽象。当我需要工具使用时,添加tools数组。当我需要流式传输时,将messages.create换成messages.stream。没有框架在为我管理这些——我也不想要。
真实Agent:内容流水线
我运行的最复杂的Agent是内容流水线。它生成博客文章,将其翻译成12种语言,渲染OG卡片SVG,并起草LinkedIn推广——全部作为草稿,在我审核之前什么都不发布。
Worker入口点如下:
// src/workers/content-pipeline.ts
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const { topic, slug } = await request.json<{ topic: string; slug: string }>();
// 步骤1:生成EN文章
const enPost = await generatePost(topic, env);
await env.CONTENT_KV.put(`draft:${slug}:en`, enPost);
// 步骤2:通过Queue扇出翻译
const locales = ["ar", "de", "es", "fr", "hi", "it", "ja", "ko", "nl", "pt", "ru", "zh"];
for (const locale of locales) {
await env.TRANSLATION_QUEUE.send({ slug, locale, content: enPost });
}
return Response.json({ status: "queued", slug });
},
};每个翻译都在自己的Worker调用中运行。如果一个失败,Queue会自动重试。我得到12个并行翻译,无需自己管理线程、Promise或速率限制退避。
真实Agent:活动推广者
Pickleland举办匹克球活动。我构建了一个Agent,扫描预订平台寻找未来4天的活动,为每个活动起草Facebook群组帖子,并在任何内容发出之前提交给我审核。
系统提示:
const systemPrompt = `You are a community manager for a pickleball facility.
Write Facebook group posts for upcoming events.
Rules:
- Max 150 words per post
- Lead with what's fun about the event, not the price
- Include the booking URL exactly as provided
- Do not use exclamation marks more than once per post
- Tone: friendly, local, not corporate`;这里真正的约束不是模型——是工作流程。Agent每天早上8点通过cron触发器运行。草稿帖子落入审核队列。我批准或编辑,然后单独的发布Worker触发。没有任何活动在人看到之前就发布。
如何管理30个以上Agent而不失去理智
Cloudflare的控制面板是我的控制平面。每个Worker向我显示调用次数、错误率和CPU时间。每个Queue显示消息吞吐量和失败。KV显示存储使用情况。
除此之外:
- 每个Agent在每次运行结束时记录一个结构化JSON对象:
{ agent, status, durationMs, inputTokens, outputTokens, costUsd } - 我在一个简单的Airtable数据库中按月跟踪每个Agent的累计支出
- 超过成本阈值的Agent被标记审核——通常意味着提示太冗长,或者我在Haiku就够用的地方使用了Sonnet
规律不是技术性的。它是决定Agent可以自主做什么,以及什么需要我的批准。内容草稿:自主。任何涉及客户的事:人工审核。任何涉及资金的事:不是Agent的工作。
如果今天重新开始我会改变什么
一件事:我会从第一天就设置结构化输出(JSON模式),而不是在已发布的Agent上事后改造。解析Claude的自由文本是一种税。当你定义一个Zod schema并将其作为预期响应形式传递时,你会得到类型化数据,下游Workers不需要猜测。
import { z } from "zod";
const EventPostSchema = z.object({
headline: z.string().max(80),
body: z.string().max(600),
bookingUrl: z.string().url(),
suggestedPostTime: z.enum(["morning", "afternoon", "evening"]),
});运营者的结论
在生产中有效的Agent技术栈是你在深夜10点出问题时可以调试的那个。对我来说,那就是TypeScript + Cloudflare + Anthropic SDK——不是因为它是最华丽的组合,而是因为每一层都是独立可观察的、可部署的、可替换的。框架是对抽象的赌注。我宁愿拥有管道本身。
每周三。28,400+ 读者。纯干货。
✓ Check your inbox — click the confirmation link to complete sign-up.
✓ You're subscribed!
✓ You're already on the list.
将AI实战手册发送到您的邮箱
每周三。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.