From 98243044ca1153b5730ab40443158a6b76796742 Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Mon, 27 Apr 2026 18:59:21 +0200 Subject: [PATCH] docs: add CRITICAL batch API duplicate warning to cost benchmark Co-Authored-By: Claude Opus 4.6 (1M context) --- docs-src/development/pass0b-cost-benchmark.md | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/docs-src/development/pass0b-cost-benchmark.md b/docs-src/development/pass0b-cost-benchmark.md index b59cc95..b787e88 100644 --- a/docs-src/development/pass0b-cost-benchmark.md +++ b/docs-src/development/pass0b-cost-benchmark.md @@ -148,3 +148,37 @@ Token-Verbrauch (Stichprobe 20 Requests): 4. **Backfill lohnt sich nicht** — Der Overhead (DB-Updates, Monitoring, Fehlerbehandlung) ueberwiegt die minimale Ersparnis 5. **Mac Mini (qwen3) ist zu langsam** — 77h fuer 20k Controls, und schwaechere Qualitaet bei applicability 6. **v4-Prompt ist der Sweet Spot** — Alle Felder in einem Call, konsistente Qualitaet, akzeptable Kosten + +--- + +## KRITISCH: Duplikat-Batch-Schutz + +!!! danger "Batch API Duplikat-Fehler (2026-04-27) — $170 Mehrkosten" + `curl` meldete einen Timeout/Parse-Error obwohl der Server den Batch bereits an Anthropic + gesendet hatte. Durch Retry-Versuche wurden **3 identische Batches** erstellt statt 1. + Die Anthropic Batch API ist NICHT idempotent — jeder POST erstellt einen neuen Batch. + Auch ein `cancel` stoppt nur unverarbeitete Requests — bereits laufende werden abgerechnet. + +### Schutzmassnahmen (implementiert) + +1. **Idempotency-Sperre im Submit-Endpoint** — Verweigert Submit wenn letzter Batch <10 Min alt +2. **NIEMALS `curl` fuer Batch-Submits** — Immer `python3 httpx` mit 600s Timeout +3. **Vor jedem Submit** Batch-Liste pruefen: `GET /v1/messages/batches?limit=3` +4. **Anthropic Dashboard** pruefen wenn Kosten unklar + +### Korrekte Submit-Methode + +```python +# RICHTIG — Python httpx mit langem Timeout, kein Retry +ssh macmini "/usr/local/bin/docker exec bp-core-control-pipeline python3 -c \" +import httpx +resp = httpx.post('http://127.0.0.1:8098/v1/canonical/generate/submit-pass0b', + json={'limit': 10000, 'batch_size': 5}, + timeout=600) +print(resp.json()) +\"" + +# FALSCH — curl mit Retry-Risiko +# curl -sf -X POST http://127.0.0.1:8098/v1/canonical/generate/submit-pass0b ... +# Bei Timeout → NICHT nochmal ausfuehren! +```