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)
| Komponente | USD/Tag | USD/Monat |
|---|---|---|
| Bedrock Sonnet 4.6 | 11,93 | 358 |
| Bedrock Haiku 4.5 | 1,57 | 47 |
| Bedrock Cohere Embed v4 | 0,32 | 10 |
| Bedrock Cohere Rerank | 0,11 | 3 |
| ECS Fargate (beide Stacks) | 4,41 | 132 |
| CloudWatch | 1,43 | 43 |
| RDS | 0,91 | 27 |
| VPC (Public-IP-Fees) | 0,64 | 19 |
| Sonstige | 0,62 | 19 |
| Total av-production | ~21,95 | ~659 |
Was bereits umgesetzt war (✅)
- Anthropic Prompt-Caching aktiviert — LiteLLM
cache_control_injection_points: role: system, alle Modelle mitsupports_prompt_caching: true - Dynamisches Modell-Routing Sonnet/Haiku/Opus — VFClassifyRouter Pre-Hook seit Welle 1 Tag 4 (2026-05-17)
- mcp-vf-hosted ECS-Rightsizing 256/512 (Fargate-Min)
- RDS-Migration weg von SQLite-EFS (Phase 6, 2026-05-14)
- Tavily-Bypass-Embedding-and-Retrieval — kein Embedding-Roundtrip bei Web-Search
- ECR-Lifecycle mcp-vf-hosted — Keep last 10
function_calling: 'native'— verhindert KV-Cache-Invalidierung pro Tool-Call-Rundethinking budget_tokens: 4096— Extended-Thinking gecappt- MODEL_FILTER_LIST — User-Dropdown nur
claude-sonnet-4-6, Backend-Modelle versteckt
Diese Audit-Session umgesetzt (✅)
| Aktion | Status | Ersparnis/Mo |
|---|---|---|
| Lifecycle-Policies fuer 3 nackte ECR-Repos (whatsapp/presenton/calcom) | live | ~$2-5 |
| mcp-vf-hosted LogGroup-Retention 30d → 7d | deployed | ~$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 deploy | indirekt |
System-Prompt-Restructure (<session> ans Ende, {{CURRENT_TIME}} raus) | File-Edit done, OWUI-DB-Update pending | siehe Cache-Hebel unten |
Tiefer Treffer #1: Prompt-Cache laeuft fast nicht (Cache-Hit-Rate 17%)
Sonnet-Token-Breakdown gestern:
| Token-Typ | Tokens (MM) | Cost USD | Anteil |
|---|---|---|---|
| Cache Read | 0,61 | $0,20 | 17% |
| Cache Write | 0,19 | $0,78 | 5% |
| Plain Input (uncached) | 3,00 | $9,91 | 83% |
| Output | 0,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:
cat ~/source/apps/open-webui-vf/prompts/vf-sonnet.txt | pbcopy- OWUI Admin → Workspace → Models →
vf-sonnet→ System-Prompt-Feld leeren, einfuegen, save - 24h nach Update: Cache-Hit-Rate erneut messen via
aws ce get-cost-and-usagemit USAGE_TYPE-Aufschluesselung. Erwartung:EUC1_CacheReadInputTokenCount-Unitswird 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)
| Hebel | Ersparnis/Mo | Aufwand | Status |
|---|---|---|---|
| Prompt-Cache-Fix in OWUI-Custom-Model uebertragen | ~$215 | 5 Min Marvin (Copy/Paste) | File-Edit done |
| Klassifikator-Verteilung messen + Routing-Tuning | $30-60 | 2 Std + Daten | Patch done |
| OWUI ECS-Rightsizing 1 vCPU/3 GB → 0,5/2 GB | $38 | 30 Min + Quality-Probe | Pruefen nach Welle-4-Stabilisierung |
| Fargate x86 → ARM (Graviton) | $15-25 | Multi-Arch-Build | Mittel-Aufwand, nach Welle 4 |
| Compute Savings Plan 1y | $22 | 1y-Commitment | Nach 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, abertmp/-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-prodAenderungen im Diff:
- LogGroup-Retention 30 → 14 Tage
- TASK_MODEL + TASK_MODEL_EXTERNAL
claude-sonnet-4-6→vf-haiku-backend - LITELLM_LOG
DEBUG→INFO - 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_routeDecisions geloggt, Verteilung ROUTE/REASON/PLAN sichtbar
Related
- open-webui-vf — Stack-Doku
- welle-4-capability-rollout
- 2026-05-18-001-feat-vf-eigener-aws-account-plan — VF-Account-Migration (parallel)
- _index — org-weites Cost-Projekt