Alejandro Rioja.
AI Agents

Mein Agent-Stack für 30+ Produktions-Agenten (kein Python)

Alejandro Rioja
Alejandro Rioja
5 Min. Lesezeit
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.

Kostenloser Newsletter

Jeden Mittwoch. 28.400+ Experten. Kein Füllstoff.

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:

Das Anthropic SDK in TypeScript ist geradlinig. Hier ist das Muster, das ich für jeden Modellaufruf verwende:

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

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:

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

    // 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:

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

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:

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.

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

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.

Weiterlesen

Holen Sie sich das KI-Playbook in Ihr Postfach

Jeden Mittwoch. 28.400+ Experten. Kein Füllstoff.

↵ alle Ergebnisse anzeigen esc esc zum Schließen