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
| Schicht | Wahl | Begruendung |
|---|---|---|
| Compute | AWS Lambda in av-production (eu-central-1) | Cron-Workloads, kurz, billig, IAM-Role am Function statt Long-Lived-Credentials |
| Trigger | EventBridge Schedule | Nativ in AWS, kein zusaetzlicher Scheduler |
| Runtime | Python 3.12 ARM64 | Bedrock-SDK ausgereift, PDF-Libraries verfuegbar, Graviton 20% billiger |
| LLM | Bedrock Haiku 4.5 eu-central-1 | DSGVO + eine Bill, EU-Inference-Profile |
| Shared Code | Lambda Layer agentic-common | Telegram + Bedrock-Wrapper + MCP-Client + Logging — einmal warten, alle Agents nutzen |
| Secrets | AWS Secrets Manager | nativ, IAM-Role-zugang, automatische Rotation moeglich |
| IaC | AWS CDK (TypeScript) | konsistent mit mcp-vf-hosted |
| Cross-Account-Schreibzugriff | STS AssumeRole av-production → mk-privat | fuer Privat-Belege ohne Long-Lived Credentials |
Stand 2026-05-12 (Skeleton-Deploy live)
| Komponente | Status |
|---|---|
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
lambdas/<name>/main.pymithandler(event, context)- Stack-File
infra/lib/<name>-stack.tsanalog zubeleg-pipeline-stack.ts(kopieren, Permissions anpassen) - Stack in
infra/bin/app.tsinstanzieren npm run synthzur Verifikation- Eintrag in
intern/projekte/<name>/_index.mdim Vault - Wenn produktiv: hier in der Tabelle „Aktive Agents” ergaenzen
Aktive Agents
| Name | Schedule | Was | Status |
|---|---|---|---|
agent-beleg-pipeline | cron(0 8 ? * MON *) (wöchentlich MON ~10 Berlin) | Belege aus Gmail → S3 + Lexware + Vault | Heartbeat 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-briefing | cron(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>.md | Live 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.
Related
- _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 synthgruen. 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 BelegPipelineStackdurchgelaufen (118s, 12/12 Resources CREATE_COMPLETE). Lambdaagent-beleg-pipelineinvocable 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-secretsentfernt). 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 mitrun_id, Secrets-Manager-Cache mit JSON-Auto-Parsing, Telegram-Push mitTelegramReport-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 mitrefresh_token+client_id+client_secret+token_uri). Stack erweitert umTELEGRAM_CHAT_IDEnv-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-Smokestatus: 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 kuerzereclaude-haiku-4-5-v1:0).