Agents-Plattform — Lambda + CDK

Pattern fuer viele kleine Cron-Agents in av-production. Jeder Agent ist eine Lambda + EventBridge-Rule + IAM-Role, alle nutzen einen gemeinsamen Layer agentic-common und pushen Updates ueber Telegram an Marvin.

Erstanwendung: Beleg-Pipeline (Ziel: Gmail-Label Belege → S3 + Lexware + Vault, geplante Frequenz 30-60 Min wenn Pipeline-Logik live ist; aktuell nur wöchentlicher Heartbeat).

Wann nutzt man dieses Pattern

  • Cron-getriggerter Background-Job (kein interaktiver Chat, kein Multi-Turn)
  • Ruft MCPs auf (Lexware, Vault, GSuite — Papierkram nur fuer VF-Kunden-Pipelines, niemals AV-Belege)
  • Soll mac-unabhaengig laufen
  • Telegram-Push an Marvin am Run-Ende

Nicht fuer:

  • Konversations-Agents mit Memory → siehe AgentCore-Evaluation in agentcore-evaluation (noch zu schreiben wenn HeyJulia anfaengt)
  • HTTP-MCP-Hosting → siehe mcp-vf-hosted (Fargate-Tunnel)

Architektur

EventBridge Cron */15
   └─ Lambda  agent-<name>  (av-production, eu-central-1, ARM64)
       ├─ Bedrock InvokeModel  (Haiku 4.5, falls Klassifikation noetig)
       ├─ MCP-Call  (lexware fuer AV, papierkram/ticketpay/m365 nur fuer VF-Kunden ueber mcp-vf.agenticventures.de)
       ├─ S3 PutObject  (av-finanzen lokal, mk-finanzen via AssumeRole)
       ├─ GitHub-API  (Vault-Stub commit ins agentic-ventures-Repo)
       └─ Telegram-Push  (Sammel-Update am Run-Ende)

Stack-Entscheidungen

SchichtWahlBegruendung
ComputeAWS Lambda in av-production (eu-central-1)Cron-Workloads, kurz, billig, IAM-Role am Function statt Long-Lived-Credentials
TriggerEventBridge ScheduleNativ in AWS, kein zusaetzlicher Scheduler
RuntimePython 3.12 ARM64Bedrock-SDK ausgereift, PDF-Libraries verfuegbar, Graviton 20% billiger
LLMBedrock Haiku 4.5 eu-central-1DSGVO + eine Bill, EU-Inference-Profile
Shared CodeLambda Layer agentic-commonTelegram + Bedrock-Wrapper + MCP-Client + Logging — einmal warten, alle Agents nutzen
SecretsAWS Secrets Managernativ, IAM-Role-zugang, automatische Rotation moeglich
IaCAWS CDK (TypeScript)konsistent mit mcp-vf-hosted
Cross-Account-SchreibzugriffSTS AssumeRole av-production → mk-privatfuer Privat-Belege ohne Long-Lived Credentials

Stand 2026-05-12 (Skeleton-Deploy live)

KomponenteStatus
Repo ~/source/agents-platform/ mit CDK-Struktur
AgenticVenturesAgent Construct
CommonLayer Construct (Skeleton)
BelegPipelineStack mit Lambda-Skeleton, EventBridge-Rule, IAM-Permissions
cdk synth laeuft sauber durch
cdk deploy BelegPipelineStack erfolgreich (12/12 Resources, 118s)
Cross-Account-Trust in mk-privat auf Lambda-Role umgestellt
Lambda-Invoke-Smoke-Test gruen (agent-beleg-pipeline antwortet)
Alte IAM-User-Pfad bereinigt (User geloescht, Access-Key invalidiert, .env entfernt)
3 Secrets in Secrets Manager — Werte eingespielt (Telegram-Bot ✅, Gmail-OAuth ✅, GitHub-PAT ☐ pending)🟡
Layer-Code Foundations: logging.py, secrets.py, telegram.py, bedrock.py (Converse + Tool-Use)
Layer-Code Pipeline-Teile (mcp_client.py, vault.py, gmail.py, pdf.py)
Lambda-Heartbeat: Bedrock-Probe + Telegram-Push laufen End-to-End
Lambda-Pipeline-Logik (Gmail-Pull, PDF, Klassifikator, S3, Lexware, Vault-Stub)
Smoke-Test mit echtem Beleg
Backfill ~486 historische Belege

Neuen Agent hinzufuegen

  1. lambdas/<name>/main.py mit handler(event, context)
  2. Stack-File infra/lib/<name>-stack.ts analog zu beleg-pipeline-stack.ts (kopieren, Permissions anpassen)
  3. Stack in infra/bin/app.ts instanzieren
  4. npm run synth zur Verifikation
  5. Eintrag in intern/projekte/<name>/_index.md im Vault
  6. Wenn produktiv: hier in der Tabelle „Aktive Agents” ergaenzen

Aktive Agents

NameScheduleWasStatus
agent-beleg-pipelinecron(0 8 ? * MON *) (wöchentlich MON ~10 Berlin)Belege aus Gmail → S3 + Lexware + VaultHeartbeat live in av-production (Layer-Code aktiv, Bedrock-Probe + Telegram-Push). Schedule am 2026-05-13 von 15 Min auf wöchentlich reduziert, weil Pipeline-Logik fehlt und 96 Telegram-Pushes/Tag unnötig waren. Beim Pipeline-Live-Schalten in Session 2-4 wieder auf 30-60 Min hochziehen.
agent-daily-briefingcron(30 7,8 ? * MON-FRI *) (= 9:30 Berlin Mo-Fr, sommer-/wintertolerant)Morgens 9:30 Berlin Tagesueberblick: Gmail (beide Konten) + Calendar (primary) + Action-Items via GitHub-API → Bedrock-Haiku-Summary → Telegram-Push + Vault-Archiv operations/briefings/<datum>.mdLive in av-production seit 2026-05-12. Erste Routine die ueber den routine-anlegen-Skill gebaut wurde. Siehe _index.

Telegram-Push-Konvention

Eine zentrale Bot-Identitaet, alle Agents pushen denselben Chat. Format pro Push:

[<Agent-Name> · HH:MM]
✓ <Erfolg-Liste>
◯ <Pending-Liste, mit Deep-Links zum Klassifizieren>
⚠ <Fehler, falls vorhanden>
🔗 <weiterfuehrende Links>

Beispiel:

[Beleg-Pipeline · 14:30]
✓ 3 archiviert: Hetzner 12,49€ (UG), Apple 0,99€ (Privat), Anthropic 18,00€ (UG)
◯ 1 pending: Cloudflare 0,00€ — bitte klassifizieren
🔗 https://t.me/marvin-ai-ops?start=classify_<id>

Reply-Handler verarbeitet /b <id> (business), /p <id> (privat), /snooze <id>, /skip <id>.

Cost-Estimate

Pro Agent Cron alle 15 Min × 200ms Run-Time:

  • Lambda: 4 × 24 × 30 × 0.2s = ~600s/Monat = im Free-Tier (1M Req + 400k GB-s)
  • Bedrock (wenn LLM-Aufruf): ~10 Klassifikationen/Tag × Haiku-Pricing = unter 1 €/Monat
  • S3 PutObject + Storage: einstellige Cents/Monat
  • Secrets Manager: 0.40 USD/Secret/Monat → 3 Secrets = 1.20 USD = ~1 EUR
  • CloudWatch Logs: meist Free-Tier

Grobschaetzung: ~2 EUR/Monat pro Agent, skaliert linear mit Anzahl.

  • _index — AWS-Org und Account-Inventar
  • buckets — S3-Bucket-Map (av-finanzen, mk-finanzen)
  • mcp-vf-hosted — MCP-Layer den die Agents anrufen
  • _index — Phase 1.5 Beleg-Pipeline (jetzt unter Lambda statt Cloudflare Worker)
  • beleg-quellen — Beleg-Workflow
  • ~/source/agents-platform/README.md — Repo-Doku

Verlauf

  • 2026-05-12 vormittag Repo + CDK-Skeleton + AgenticVenturesAgent-Construct + BelegPipelineStack angelegt. cdk synth gruen. Pivot von Cloudflare Worker (deprecated, archiviert) zu Lambda + EventBridge — Grund: IAM-Execution-Role statt Long-Lived AWS Access Key, AWS-First-Konsistenz, Bedrock-native ohne SigV4-Cross-Cloud, eine Bill.
  • 2026-05-12 nachmittag cdk deploy BelegPipelineStack durchgelaufen (118s, 12/12 Resources CREATE_COMPLETE). Lambda agent-beleg-pipeline invocable mit Skeleton-Response. Cross-Account-Trust in mk-privat auf Lambda-Role-ARN umgestellt. Alter IAM-User-Pfad bereinigt (Access-Key invalidiert, User geloescht, .env.beleg-secrets entfernt). Entscheidung als Standard fuer Cron-Agents festgeschrieben: agent-platform-lambda-cdk-2026.
  • 2026-05-12 abend (Session 1/4 Foundations) Layer-Code-Foundations live: agentic_common.{logging, secrets, telegram, bedrock} — strukturiertes JSON-Logging mit run_id, Secrets-Manager-Cache mit JSON-Auto-Parsing, Telegram-Push mit TelegramReport-Dataclass (Plain-Text-Format, MDV2-Escape-Helper liegt bereit), Bedrock-Klassifikator via Converse API + Tool-Use (Schema-erzwungener Output). 2 von 3 Secrets eingespielt (Telegram-Bot-Token, Gmail-OAuth-Refresh als nested Bundle mit refresh_token + client_id + client_secret + token_uri). Stack erweitert um TELEGRAM_CHAT_ID Env-Var (8257793678 hardcoded) + Secret-Namen als Env-Vars. Zwei IAM-Bugs gefixt: Inference-Profile-ARN braucht Account-ID-Slot (Cross-Region-Profiles sind per-Account materialisiert, nicht service-owned), Secrets-Manager-ARN braucht -* Suffix (zufaelliges 6-char-Suffix pro Secret). End-to-End-Lambda-Smoke status: ok, Bedrock-Latenz 848ms, Telegram-message_id=5. Stand fuer Session 2: Gmail-API + PDF-Extraktion implementieren. Korrigierter Default-Modell-Identifier: eu.anthropic.claude-haiku-4-5-20251001-v1:0 (Date-Tag im ID, nicht der kuerzere claude-haiku-4-5-v1:0).