Mein Agent-Stack für 30+ Produktions-Agenten (kein Python)
Ich betreibe 30+ Produktions-KI-Agenten mit TypeScript, Cloudflare Workers/Queues/KV und Claude-Modellen — kein Python, kein Agenten-Framework. Der Stack ist bewusst simpel: Workers übernehmen Scheduling und Queuing, KV speichert den Zustand, und das Anthropic SDK steuert die Modellaufrufe direkt. Die entscheidende Einschränkung ist nicht die KI-Schicht — sondern die Infrastruktur darum herum.
Jeden Mittwoch. 28.400+ Experten. Kein Füllstoff.
✓ Check your inbox — click the confirmation link to complete sign-up.
✓ You're subscribed!
✓ You're already on the list.
Inhaltsverzeichnis
Aktualisiert Mai 2026.
TL;DR: Ich betreibe 30+ Produktions-KI-Agenten mit TypeScript, Cloudflare Workers/Queues/KV und Claude-Modellen — kein Python, kein Agenten-Framework. Der Stack ist bewusst simpel: Workers übernehmen Scheduling und Queuing, KV speichert den Zustand, und das Anthropic SDK steuert die Modellaufrufe direkt. Die entscheidende Einschränkung ist nicht die KI-Schicht — sondern die Infrastruktur darum herum.
[Betreiber-Perspektive] Ich führe zwei Unternehmen: eine KI-Beratungsmarke und Pickleland — eine Pickleball-Anlage in Pflugerville, TX. Zwischen beiden laufen heute 30+ Agenten in Produktion. Das hier ist der echte Stack, keine Demo.
Warum kein Python
Die ehrliche Antwort: Ich schreibe täglich TypeScript für meine Website- und Produktarbeit. Eine zweite Sprache für Agenten hinzuzufügen bedeutet zwei Laufzeitumgebungen, zwei Abhängigkeitsbäume, zwei Deployment-Pipelines. Die Produktivitätskosten sind nicht theoretisch — ich habe sie bei früheren Projekten bezahlt und beschlossen, es nicht wieder zu tun.
Der zweite Grund ist Cloudflare. Workers laufen TypeScript nativ am Edge, mit eingebautem Queues, KV, Durable Objects und Cron Triggers. Die gesamte Agenten-Infrastruktur, die ich brauche — Scheduling, State, asynchrone Job-Verarbeitung — ist einen wrangler deploy-Befehl entfernt. Es gibt kein Python-Äquivalent mit demselben operativen Aufwand.
Der dritte Grund: Die meisten “Python-ist-besser-für-KI”-Argumente meinen eigentlich “Python hat mehr ML-Bibliotheken.” Ich trainiere keine Modelle. Ich rufe APIs auf. Das Anthropic SDK ist erstklassiges TypeScript. LangChain und seine Geschwister sind Komplexität, die ich nicht will. Wenn man Agenten ausliefert statt sie zu erforschen, gewinnt Einfachheit.
Die Kerninfrastruktur: drei Cloudflare-Primitive
Jeder Agent, den ich betreibe, berührt mindestens eines dieser drei:
Cloudflare Workers — die Rechenschicht. Ein Worker ist die Laufzeitumgebung des Agenten: er empfängt einen Trigger (Cron, Queue-Nachricht, HTTP), führt die Modellaufrufe aus und schreibt Ausgaben irgendwo hin. Kaltstart unter 5ms. Ausführungslimit 30 Sekunden CPU-Zeit im kostenlosen Plan, 15 Minuten im bezahlten. Fast alles, was ich baue, passt in 30 Sekunden; was nicht passt, nutzt Queues zum Fan-out.
Cloudflare Queues — asynchrone Job-Verarbeitung. Wenn eine Aufgabe länger dauern könnte als eine Anfrage, oder wenn ich fan-out brauche (12 Übersetzungen parallel generieren), schiebe ich Nachrichten in eine Queue und lasse gebundene Consumer sie unabhängig verarbeiten. Kein Polling, keine setTimeout-Hacks.
Cloudflare KV — leichtgewichtiger Zustand. Agenten-Ausführungshistorie, letzte verarbeitete Zeitstempel, gecachte API-Antworten. KV ist eventually consistent, was für Agenten gut ist — ich führe keine Transaktionen durch. Es gibt mir einen simplen Key-Value-Store, den ich aus jedem Worker lesen/schreiben kann, ohne eine Datenbank hochzufahren.
Die Modellschicht: Anthropic SDK, zwei Modelle
Ich verwende genau zwei Claude-Modelle:
claude-sonnet-4-6— für Aufgaben, die echtes Reasoning brauchen: Blog-Posts schreiben, Event-Daten analysieren, Social-Copy generieren, Sequenzen planenclaude-haiku-4-5— für schnelle/günstige Klassifizierung, Routing-Entscheidungen, kurze Extraktionen wo vollständiges Reasoning übertrieben ist
Das Anthropic SDK in TypeScript ist geradlinig. Hier ist das Muster, das ich für jeden Modellaufruf verwende:
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;
}Das ist die gesamte Modell-Schnittstelle. Keine Abstraktionen darüber. Wenn ich Tool-Use brauche, füge ich ein tools-Array hinzu. Wenn ich Streaming brauche, tausche ich messages.create gegen messages.stream. Kein Framework verwaltet das für mich — und das will ich auch nicht.
Ein echter Agent: die Content-Pipeline
Der komplexeste Agent, den ich betreibe, ist die Content-Pipeline. Sie generiert Blog-Posts, übersetzt sie in 12 Sprachen, rendert OG-Card-SVGs und entwirft LinkedIn-Promos — alles als Entwürfe, die erst nach meiner Prüfung veröffentlicht werden.
Der Worker-Einstiegspunkt sieht so aus:
// 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 }>();
// Schritt 1: EN-Post generieren
const enPost = await generatePost(topic, env);
await env.CONTENT_KV.put(`draft:${slug}:en`, enPost);
// Schritt 2: Übersetzungen via 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 });
},
};Der Queue-Consumer verarbeitet jede Übersetzung unabhängig. Wenn eine fehlschlägt, wiederholt die Queue sie automatisch. Ich bekomme 12 parallele Übersetzungen, ohne Threads, Promises oder Rate-Limit-Backoff selbst verwalten zu müssen.
Ein echter Agent: der Event-Promoter
Pickleland veranstaltet Pickleball-Events. Ich habe einen Agenten gebaut, der die Buchungsplattform nach Events in den nächsten 4 Tagen durchsucht, Facebook-Gruppen-Posts pro Event entwirft und sie zur Überprüfung vorlegt, bevor irgendetwas veröffentlicht wird.
Der System-Prompt:
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`;Der entscheidende Constraint hier ist nicht das Modell — es ist der Workflow. Der Agent läuft täglich um 8 Uhr per Cron-Trigger. Die Entwurfs-Posts landen in einer Review-Queue. Ich genehmige oder bearbeite, dann feuert ein separater Publish-Worker. Kein Event wird gepostet, ohne dass ein Mensch es gesehen hat.
Wie ich 30+ Agenten verwalte, ohne den Verstand zu verlieren
Das Cloudflare-Dashboard ist meine Steuerzentrale. Jeder Worker zeigt mir Aufrufanzahl, Fehlerrate und CPU-Zeit. Jede Queue zeigt Nachrichten-Durchsatz und Fehler. KV zeigt Speichernutzung.
Darüber hinaus:
- Jeder Agent protokolliert am Ende jedes Laufs ein strukturiertes JSON-Objekt:
{ agent, status, durationMs, inputTokens, outputTokens, costUsd } - Ich verfolge kumulierte Ausgaben pro Agent pro Monat in einer einfachen Airtable-Datenbank
- Agenten, die einen Kostenschwellenwert überschreiten, werden zur Überprüfung markiert — meistens bedeutet das, dass ein Prompt zu ausführlich ist oder ich Sonnet verwende, wo Haiku reichen würde
Die Disziplin ist nicht technisch. Es ist die Entscheidung, was ein Agent autonom tun darf und was meine Genehmigung braucht. Content-Entwürfe: autonom. Alles, was einen Kunden berührt: menschliche Prüfung. Alles, was Geld bewegt: kein Agenten-Job.
Was ich ändern würde, wenn ich heute anfangen würde
Eines: Ich würde strukturierte Ausgaben (JSON-Modus) von Anfang an einrichten, statt es nachträglich auf bereits ausgelieferte Agenten anzuwenden. Freien Claude-Text zu parsen ist eine Steuer. Wenn man ein Zod-Schema definiert und es als erwartete Antwortform übergibt, bekommt man typisierte Daten zurück und nachgelagerte Workers müssen nicht raten.
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"]),
});Das Fazit des Betreibers
Der Agenten-Stack, der in Produktion funktioniert, ist der, den man um 22 Uhr debuggen kann, wenn etwas kaputt geht. Für mich ist das TypeScript + Cloudflare + Anthropic SDK — nicht weil es die glamouröseste Kombination ist, sondern weil jede Schicht beobachtbar, deploybar und unabhängig austauschbar ist. Frameworks sind Wetten auf Abstraktionen. Ich bevorzuge es, die Leitungen selbst zu besitzen.
Jeden Mittwoch. 28.400+ Experten. Kein Füllstoff.
✓ Check your inbox — click the confirmation link to complete sign-up.
✓ You're subscribed!
✓ You're already on the list.
Holen Sie sich das KI-Playbook in Ihr Postfach
Jeden Mittwoch. 28.400+ Experten. Kein Füllstoff.
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.