Alejandro Rioja.
AI Agents

30+ प्रोडक्शन एजेंट चलाने के लिए मेरा एजेंट स्टैक (बिना Python के)

Alejandro Rioja
Alejandro Rioja
6 मिनट पढ़ें
TL;DR

मैं TypeScript, Cloudflare Workers/Queues/KV और Claude मॉडल का उपयोग करके 30+ प्रोडक्शन AI एजेंट चलाता हूं — बिना Python, बिना एजेंट फ्रेमवर्क के। स्टैक जानबूझकर सरल है: Workers शेड्यूलिंग और क्यूइंग संभालते हैं, KV स्टेट स्टोर करता है, और Anthropic SDK सीधे मॉडल कॉल चलाता है। जो बाधा मायने रखती है वह AI लेयर नहीं है — बल्कि उसके आसपास की इंफ्रास्ट्रक्चर है।

मुफ़्त न्यूज़लेटर

हर बुधवार। 28,400+ पाठक। बिना फालतू बात।

विषय सूची

मई 2026 में अपडेटेड।

TL;DR: मैं TypeScript, Cloudflare Workers/Queues/KV और Claude मॉडल का उपयोग करके 30+ प्रोडक्शन AI एजेंट चलाता हूं — बिना Python, बिना एजेंट फ्रेमवर्क के। स्टैक जानबूझकर सरल है: Workers शेड्यूलिंग और क्यूइंग संभालते हैं, KV स्टेट स्टोर करता है, और Anthropic SDK सीधे मॉडल कॉल चलाता है। जो बाधा मायने रखती है वह AI लेयर नहीं है — बल्कि उसके आसपास की इंफ्रास्ट्रक्चर है।

[ऑपरेटर का दृष्टिकोण] मैं दो व्यवसाय चलाता हूं: एक AI कंसल्टिंग ब्रांड और Pickleland — Pflugerville, TX में एक पिकलबॉल फैसिलिटी। दोनों के बीच आज प्रोडक्शन में 30+ एजेंट चल रहे हैं। यह असली स्टैक है, कोई डेमो नहीं।

Python क्यों नहीं

ईमानदार जवाब: मैं अपने वेबसाइट और प्रोडक्ट काम के लिए हर रोज TypeScript लिखता हूं। एजेंट के लिए एक दूसरी भाषा जोड़ने का मतलब है दो रनटाइम, दो डिपेंडेंसी ट्री, दो डिप्लॉय पाइपलाइन। प्रोडक्टिविटी कॉस्ट सैद्धांतिक नहीं है — मैंने इसे पिछले प्रोजेक्ट में चुकाया है और दोबारा न करने का फैसला किया।

दूसरा कारण Cloudflare है। Workers एज पर TypeScript को नेटिवली चलाता है, साथ में Queues, KV, Durable Objects और Cron Triggers बिल्ट-इन हैं। मुझे जो भी एजेंट इंफ्रास्ट्रक्चर चाहिए — शेड्यूलिंग, स्टेट, असिंक्रोनस जॉब प्रोसेसिंग — वह एक wrangler deploy कमांड की दूरी पर है। उतनी ही ऑपरेशनल सुविधा के साथ Python में इसका कोई समकक्ष नहीं है।

तीसरा कारण: ज्यादातर “Python-AI-के-लिए-बेहतर-है” तर्क दरअसल “Python के पास ज्यादा ML लाइब्रेरी हैं” का मतलब होते हैं। मैं मॉडल ट्रेन नहीं करता। मैं APIs कॉल करता हूं। Anthropic SDK फर्स्ट-क्लास TypeScript है। LangChain और उसके जैसे जटिलता हैं जो मुझे नहीं चाहिए। जब आप एजेंट शिप कर रहे हों, उन पर रिसर्च नहीं, तो सादगी जीतती है।

कोर इंफ्रास्ट्रक्चर: तीन Cloudflare प्रिमिटिव्स

मेरा हर एजेंट इन तीन में से कम से कम एक को टच करता है:

Cloudflare Workers — कंप्यूट लेयर। Worker एजेंट का रनटाइम है: यह एक ट्रिगर (cron, Queue मैसेज, HTTP) प्राप्त करता है, मॉडल कॉल चलाता है, और कहीं आउटपुट लिखता है। कोल्ड स्टार्ट 5ms से कम। फ्री प्लान पर CPU टाइम लिमिट 30 सेकंड, पेड पर 15 मिनट। मैं जो कुछ भी बनाता हूं वह लगभग 30 सेकंड में फिट हो जाता है; जो नहीं होता वह fan-out के लिए Queues का उपयोग करता है।

Cloudflare Queues — असिंक्रोनस जॉब प्रोसेसिंग। जब कोई टास्क एक रिक्वेस्ट से ज्यादा समय ले सकता है, या जब मुझे fan-out चाहिए (12 ट्रांसलेशन समानांतर में जनरेट करना), मैं Queue में मैसेज push करता हूं और बाउंड consumers को उन्हें स्वतंत्र रूप से प्रोसेस करने देता हूं। कोई polling नहीं, कोई setTimeout हैक नहीं।

Cloudflare KV — हल्का स्टेट। एजेंट रन हिस्ट्री, आखिरी प्रोसेस्ड टाइमस्टैम्प, कैश्ड API रिस्पांस। KV eventually consistent है, जो एजेंट के लिए ठीक है — मैं ट्रांजेक्शन नहीं चला रहा। यह मुझे एक सरल key-value स्टोर देता है जिसे मैं किसी भी Worker से database स्पिन अप किए बिना read/write कर सकता हूं।

मॉडल लेयर: Anthropic SDK, दो मॉडल

मैं सिर्फ दो Claude मॉडल उपयोग करता हूं:

TypeScript में Anthropic SDK सीधा है। यहां वह पैटर्न है जो मैं हर मॉडल कॉल के लिए उपयोग करता हूं:

typescript
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;
}

यही पूरा मॉडल इंटरफेस है। इसके ऊपर कोई abstraction नहीं। जब मुझे tool use चाहिए, मैं tools array जोड़ता हूं। जब streaming चाहिए, messages.create को messages.stream से बदल देता हूं। कोई फ्रेमवर्क इसे मेरे लिए manage नहीं करता — और मैं नहीं चाहता।

एक असली एजेंट: कंटेंट पाइपलाइन

मेरा सबसे जटिल एजेंट कंटेंट पाइपलाइन है। यह ब्लॉग पोस्ट जनरेट करता है, उन्हें 12 भाषाओं में ट्रांसलेट करता है, OG कार्ड SVGs रेंडर करता है, और LinkedIn प्रोमो ड्राफ्ट करता है — सब ड्राफ्ट के रूप में, कुछ भी पब्लिश होने से पहले मेरी समीक्षा की जरूरत होती है।

Worker एंट्री पॉइंट इस तरह दिखता है:

typescript
// 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 }>();

    // Step 1: EN पोस्ट जनरेट करें
    const enPost = await generatePost(topic, env);
    await env.CONTENT_KV.put(`draft:${slug}:en`, enPost);

    // Step 2: Queue के जरिए ट्रांसलेशन fan out करें
    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 });
  },
};

एक असली एजेंट: इवेंट प्रमोटर

Pickleland पिकलबॉल इवेंट आयोजित करता है। मैंने एक एजेंट बनाया जो अगले 4 दिनों के इवेंट के लिए बुकिंग प्लेटफॉर्म स्कैन करता है, प्रत्येक इवेंट के लिए Facebook ग्रुप पोस्ट ड्राफ्ट करता है, और कुछ भी जाने से पहले मेरी समीक्षा के लिए प्रस्तुत करता है।

सिस्टम प्रॉम्प्ट:

typescript
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`;

यहां जो बाधा मायने रखती है वह मॉडल नहीं है — वर्कफ्लो है। एजेंट रोज सुबह 8 बजे cron ट्रिगर पर चलता है। ड्राफ्ट पोस्ट एक रिव्यू क्यू में आते हैं। मैं approve या edit करता हूं, फिर एक अलग publish Worker फायर होता है। कोई इवेंट बिना किसी इंसान के देखे पोस्ट नहीं होता।

30+ एजेंट बिना पागल हुए कैसे manage करता हूं

Cloudflare का डैशबोर्ड मेरा कंट्रोल प्लेन है। हर Worker मुझे invocation count, error rate और CPU time दिखाता है। हर Queue मैसेज throughput और failures दिखाती है। KV storage usage दिखाता है।

इसके अलावा:

अनुशासन तकनीकी नहीं है। यह तय करना है कि एजेंट को autonomously क्या करने की अनुमति है बनाम क्या मेरी approval चाहिए। कंटेंट ड्राफ्ट: autonomous। जो कुछ भी customer को touch करे: human review। जो कुछ भी पैसे भेजे: एजेंट का काम नहीं।

आज शुरू करता तो क्या बदलता

एक बात: मैं day one से ही structured outputs (JSON mode) सेट अप करता बजाय इसके कि इसे बाद में already shipped एजेंट पर retrofit किया। free-text Claude output parse करना एक tax है। जब आप एक Zod schema define करते हैं और इसे expected response shape के रूप में pass करते हैं, तो आपको typed data वापस मिलती है और downstream Workers को guess नहीं करना पड़ता।

typescript
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"]),
});

ऑपरेटर का निष्कर्ष

प्रोडक्शन में जो एजेंट स्टैक काम करता है वह वही है जिसे आप रात 10 बजे debug कर सकते हैं जब कुछ टूट जाए। मेरे लिए, यह TypeScript + Cloudflare + Anthropic SDK है — इसलिए नहीं कि यह सबसे glamorous combination है, बल्कि इसलिए कि हर layer observable, deployable और independently replaceable है। Frameworks abstractions पर बाजी हैं। मैं खुद plumbing का मालिक होना पसंद करता हूं।

पढ़ते रहें

AI प्लेबुक अपने इनबॉक्स में पाएं

हर बुधवार। 28,400+ पाठक। बिना फालतू बात।

↵ सभी परिणाम देखें esc esc बंद करें