Cost-Audit Open-WebUI-VF (2026-05-18)

Audit gestartet nach Marvin-Frage „Einsparpotenziale rechnen”. Erst pauschal 50/Mo realisiert, weil viele Hebel schon umgesetzt sind. Tiefer Re-Audit legte zwei strukturelle Treffer frei die zusammen ~$245/Mo bringen koennen.

Cost-Baseline (gestern, 2026-05-17)

KomponenteUSD/TagUSD/Monat
Bedrock Sonnet 4.611,93358
Bedrock Haiku 4.51,5747
Bedrock Cohere Embed v40,3210
Bedrock Cohere Rerank0,113
ECS Fargate (beide Stacks)4,41132
CloudWatch1,4343
RDS0,9127
VPC (Public-IP-Fees)0,6419
Sonstige0,6219
Total av-production~21,95~659

Was bereits umgesetzt war (✅)

  1. Anthropic Prompt-Caching aktiviert — LiteLLM cache_control_injection_points: role: system, alle Modelle mit supports_prompt_caching: true
  2. Dynamisches Modell-Routing Sonnet/Haiku/Opus — VFClassifyRouter Pre-Hook seit Welle 1 Tag 4 (2026-05-17)
  3. mcp-vf-hosted ECS-Rightsizing 256/512 (Fargate-Min)
  4. RDS-Migration weg von SQLite-EFS (Phase 6, 2026-05-14)
  5. Tavily-Bypass-Embedding-and-Retrieval — kein Embedding-Roundtrip bei Web-Search
  6. ECR-Lifecycle mcp-vf-hosted — Keep last 10
  7. function_calling: 'native' — verhindert KV-Cache-Invalidierung pro Tool-Call-Runde
  8. thinking budget_tokens: 4096 — Extended-Thinking gecappt
  9. MODEL_FILTER_LIST — User-Dropdown nur claude-sonnet-4-6, Backend-Modelle versteckt

Diese Audit-Session umgesetzt (✅)

AktionStatusErsparnis/Mo
Lifecycle-Policies fuer 3 nackte ECR-Repos (whatsapp/presenton/calcom)live~$2-5
mcp-vf-hosted LogGroup-Retention 30d → 7ddeployed~$10
OWUI LogGroup-Retention 30d → 14d (Stack-Edit)pending deploy~$15-20
OWUI TASK_MODEL Sonnet → vf-haiku-backend (Stack-Edit)pending deploy~$3-5
OWUI LITELLM_LOG DEBUG → INFO (Stack-Edit)pending deploy~$20-30
2 Stale Secrets geloescht (mongo + stirling-pdf, 7d Recovery)scheduled~$0,80
Klassifikator-Patch: logger.info bei JEDER Decision (Stack-Edit)pending deployindirekt
System-Prompt-Restructure (<session> ans Ende, {{CURRENT_TIME}} raus)File-Edit done, OWUI-DB-Update pendingsiehe Cache-Hebel unten

Tiefer Treffer #1: Prompt-Cache laeuft fast nicht (Cache-Hit-Rate 17%)

Sonnet-Token-Breakdown gestern:

Token-TypTokens (MM)Cost USDAnteil
Cache Read0,61$0,2017%
Cache Write0,19$0,785%
Plain Input (uncached)3,00$9,9183%
Output0,06$1,04

Root Cause (vf-sonnet.txt Zeile 44-48 vor Patch):

<kontext>
Heute ist {{CURRENT_DATE}} ({{CURRENT_WEEKDAY}}), aktuelle Uhrzeit {{CURRENT_TIME}}.
Du sprichst mit {{USER_NAME}} ({{USER_EMAIL}}, Rolle: {{USER_ROLE}}).
...

{{CURRENT_TIME}} wechselt pro Request sekunden-genau → Prompt-Prefix wechselt → Cache invalidiert. Plus: der <kontext>-Block sitzt mitten drin im stabilen Prompt (Zeile 44 von 446), die cache_control_injection_points: role: system Auto-Injection setzt den Marker am Ende der system-message — alles bis dahin wird zu einem grossen Cache-Block der durch den Date/Time-Suffix pro Request dirty wird.

Patch (File-Edit done, OWUI-DB-Update pending):

  • {{CURRENT_TIME}} komplett entfernt — Sekunden-Praezision war Cache-Killer pro Request, Time-of-Day ist 99% irrelevant
  • <kontext><session> umbenannt + ans absolute Ende des System-Prompts verschoben (nach </output_stil>)
  • Verbleibende Variables ({{CURRENT_DATE}}, {{CURRENT_WEEKDAY}}, {{USER_*}}) wechseln nur 1x pro Tag bzw. pro User-Login

Erwartete Wirkung: Cache-Hit-Rate 17% → 80%+, ~$215/Mo Sonnet-Ersparnis.

Anschluss-Aktion fuer Marvin:

  1. cat ~/source/apps/open-webui-vf/prompts/vf-sonnet.txt | pbcopy
  2. OWUI Admin → Workspace → Models → vf-sonnet → System-Prompt-Feld leeren, einfuegen, save
  3. 24h nach Update: Cache-Hit-Rate erneut messen via aws ce get-cost-and-usage mit USAGE_TYPE-Aufschluesselung. Erwartung: EUC1_CacheReadInputTokenCount-Units wird 80%+ der Sonnet-Input-Tokens

Tiefer Treffer #2: Klassifikator-Routing scheitert teilweise

18 Bedrock-RateLimitError-Failures in 24h im Klassifikator:

vf_classify_route: classifier failed, fallback to claude-sonnet-4-6:
litellm.RateLimitError: BedrockException - "Too many requests"

Jedes Failure → Call faellt auf Sonnet zurueck (Default REASON-Pfad). Plus: logger.info triggert nur bei new_model != data["model"] → REASON-Decisions (=Sonnet) waren silent. Heisst: wir wissen nicht ob der Klassifikator faktisch auf Haiku routet oder alles bei Sonnet endet.

Patch (Stack-Edit done, deploy pending): logger.info bei JEDER Decision (auch REASON). Nach Deploy: 24h messen, dann Verteilung sichtbar.

Folgemassnahmen wenn Daten gesehen:

  • Wenn ROUTE-Anteil <10%: Klassifikator-System-Prompt scharfstellen (Beispiele erweitern)
  • Wenn RateLimit-Failures >100/Tag: Bedrock-Quota erhoehen lassen (AWS-Support Case)

Was wirklich noch nicht ausgeschoepft ist (nach Audit)

HebelErsparnis/MoAufwandStatus
Prompt-Cache-Fix in OWUI-Custom-Model uebertragen~$2155 Min Marvin (Copy/Paste)File-Edit done
Klassifikator-Verteilung messen + Routing-Tuning$30-602 Std + DatenPatch done
OWUI ECS-Rightsizing 1 vCPU/3 GB → 0,5/2 GB$3830 Min + Quality-ProbePruefen nach Welle-4-Stabilisierung
Fargate x86 → ARM (Graviton)$15-25Multi-Arch-BuildMittel-Aufwand, nach Welle 4
Compute Savings Plan 1y$221y-CommitmentNach av-vibe-factory-Cutover

Realistisches Gesamt-Spar-Potenzial nach Audit: ~50).

Stale Secrets (Decisions)

  • open-webui-vf/mongo-credentials — gescheduled fuer 2026-05-25 (Mongo abgeloest durch RDS Phase 6 2026-05-14)
  • stirling-pdf-vf/cloudflared-token — gescheduled fuer 2026-05-25 (lastAccessed: None, Service nie deployed)
  • tmp/owui-admin-key — geprueft, lastAccessed=heute, wird aktiv genutzt fuer Admin-Automation (Welle 4 Permission-Updates). Nicht stale, aber tmp/-Prefix suggeriert geplantes Cleanup nach Welle 4. Marvin-Item in active-work fuer Sep 2026.

Deploy-Plan fuer Marvin

mcp-vf-hosted (LogGroup-Retention 30d → 7d): ✅ already deployed 2026-05-18 12:27 UTC

open-webui-vf (4 Aenderungen, TaskDef-Replacement = ~60-90s Reconnect):

cd ~/source/apps/open-webui-vf/infra && npx cdk deploy --profile av-prod

Aenderungen im Diff:

  1. LogGroup-Retention 30 → 14 Tage
  2. TASK_MODEL + TASK_MODEL_EXTERNAL claude-sonnet-4-6vf-haiku-backend
  3. LITELLM_LOG DEBUGINFO
  4. vf_classify_route Pre-Hook: logger.info bei jeder Decision

System-Prompt-Update in OWUI:

  • vf-sonnet.txt File-Edit ist done. Marvin muss Copy-Paste in OWUI Admin → Workspace → Models → vf-sonnet machen.

Anschluss-Messung (24-48h nach Cutover):

  • aws ce get-cost-and-usage --time-period Start=2026-05-19,End=2026-05-20 --granularity DAILY --metrics UnblendedCost --group-by Type=DIMENSION,Key=USAGE_TYPE --filter '{"Dimensions":{"Key":"SERVICE","Values":["Claude Sonnet 4.6 (Amazon Bedrock Edition)"]}}'
  • Erwartet: Plain-Input-Anteil von 83% auf 20% gefallen, Cache-Read-Anteil von 17% auf 70%+ gestiegen
  • CloudWatch Logs Insights: vf_classify_route Decisions geloggt, Verteilung ROUTE/REASON/PLAN sichtbar

0 Dateien in diesem Ordner.