Explorer
/tmp/aa038_report.py
← Zurück ↓ Download
from pathlib import Path
import hashlib
report='''# AA-038 – Read-only Analyse des OpenRouter-Rate-Limits

## Prüfrahmen

Prüfzeitpunkt: `2026-08-18T19:08:22Z`, UTC.

Durchgeführt wurden ausschließlich read-only Abfragen gegen:

```text
/opt/struktur/graphiti/request-data/requests.db
/opt/struktur/graphiti/request-data/processing-events.jsonl
/opt/struktur/obsidian-graphiti-import/obsidian_graphiti_import.db
/opt/struktur/graphiti/service/main.py
Container-Logs von graphiti-service
Graphiti /health
```

Nicht durchgeführt:

- Queue 17 nicht erneut gestartet
- Queue 184 nicht gestartet
- keine Recovery fortgesetzt
- Run-Block nicht geändert
- kein Modell- oder Providerwechsel
- kein Code geändert
- kein Dienstneustart
- kein Test-Provideraufruf

## 1. Queue-17-Request

```text
request_id=req-52b794da1db59085b964d4cd
queue_id=17
run_id=run-2026-08-18T18:24:40.423126+00:00
provider=Nvidia
model=nvidia/nemotron-3-super-120b-a12b:free
started_at=2026-08-18T18:24:40.424376+00:00
completed_at=2026-08-18T18:29:14.690583+00:00
llm_request_count=19
```

Request-Ebene:

```text
HTTP-Status des Graphiti-Requests: 500
Request status: error
error_phase: graphiti_processing
episode_uuid: NULL
```

Provider-/Fehler-Ebene:

```text
verschachtelter Provider-HTTP-Status: 429
error_type: RateLimitError
Provider-Fehler: Rate limit exceeded: free-models-per-day-high-balance.
limit_source: openrouter_free_tier_daily
provider_name: nicht gesetzt
```

Die OpenRouter-Fehlermeldung ist damit ausdrücklich im lokalen Request-/Eventbestand nachgewiesen. Der äußere Graphiti-HTTP-Status 500 ist die Fehlerabbildung des inneren Provider-429.

Betroffener LLM-Aufruf:

```text
llm_call_index=19
graphiti_phase=edge_resolution
operation=dates
max_tokens=8192
```

Der Fehler trat nicht im Edge-Extraction-Call, nicht wegen JSON-Truncation und nicht wegen `JSONDecodeError` auf.

## 2. Gespeicherte Rate-Limit-Header

Im gespeicherten Fehlertext sind folgende Headerwerte eingebettet:

```text
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1787097600000
```

Separat gespeicherte Response-Header-Spalten gibt es in `graphiti_requests` nicht. Ein separates `Retry-After`-Feld beziehungsweise ein `Retry-After`-Header ist im lokalen Bestand **nicht nachweisbar**.

Nicht ausgegeben wurden Credential-/Userwerte aus dem Rohfehler.

## 3. Limit-Klassifikation

Nachweis:

```text
limit_source=openrouter_free_tier_daily
X-RateLimit-Remaining=0
X-RateLimit-Limit=1000
```

Klassifikation:

```text
D. OpenRouter-Free-Tier-Limit: JA
C. Tages-/Kontingentlimit: JA, konkret durch den Tages-Reset-Header gestützt
```

Nicht nachgewiesen:

```text
A. kurzfristiges RPM-Limit: NEIN, lokal nicht ausgewiesen
B. Token-/TPM-Limit: NEIN, lokal nicht ausgewiesen
E. Nvidia-Provider-Limit: NEIN; provider_name ist nicht gesetzt und limit_source nennt OpenRouter
F. modellspezifisches Limit: NEIN; der Fehler nennt Free-Tier-Tageskontingent, nicht ein Modelllimit
G. nicht eindeutig bestimmbar: NEIN; der Limit-Typ ist lokal eindeutig klassifiziert
```

Die Zahl `1000` wird ausschließlich als gespeicherter `X-RateLimit-Limit`-Header berichtet. Nicht nachgewiesen ist, ob sich dieser Zähler auf Requests, Credits oder eine interne Free-Tier-Einheit bezieht; aus dem Headernamen allein darf keine zusätzliche Einheit abgeleitet werden.

## 4. Zeitliche Lage

Letzter erfolgreicher Provider-Aufruf vor dem Limit, innerhalb desselben Queue-17-Requests:

```text
llm_call_index=18
operation=dedupe
graphiti_phase=edge_resolution
outcome=completed
timestamp=2026-08-18T18:29:09.234685Z
max_tokens=8192
```

Rate-Limit-Aufruf:

```text
llm_call_index=19
operation=dates
graphiti_phase=edge_resolution
call_start=2026-08-18T18:29:12.587334Z
call_failure=2026-08-18T18:29:13.275982Z
```

Zeit zwischen dem letzten erfolgreichen Call und dem Fehler: ca. 4 Sekunden.

Nach dem Startzeitpunkt des Queue-17-Requests wurden in `graphiti_requests` keine weiteren Requests gefunden. In der Processing-Telemetrie wurden keine späteren erfolgreichen Provider-Calls mit demselben Modell/Provider gefunden.

Damit ist eine zwischenzeitliche erfolgreiche Nutzung oder eine inzwischen erfolgte Freigabe des Limits **nicht nachgewiesen**.

Reset-Zeit aus `X-RateLimit-Reset`:

```text
Unix-Millis: 1787097600000
UTC: 2026-08-19T00:00:00Z
```

Zum Prüfzeitpunkt `2026-08-18T19:08:22Z` lag dieser Reset noch in der Zukunft.

## 5. Bedeutung des Health-Status

Aktueller Health:

```text
ready=true
provider_ready=true
provider_authenticated=true
provider_rate_limited=false
active_request_count=0
```

Die produktive Implementierung in `/opt/struktur/graphiti/service/main.py` zeigt:

- `provider_rate_limited` wird als Prozessvariable beim Startup gesetzt.
- Bei einem Startup-Readiness-Test mit `RateLimitError` wird sie auf `true` gesetzt.
- Bei einem sonstigen Startup-Fehler wird sie auf `false` gesetzt.
- Der `/health`-Handler liest diese Variable aus.
- Der spätere Queue-17-Request setzt diese Health-Variable nicht automatisch zurück beziehungsweise aktualisiert sie nicht als laufenden Provider-Kapazitätsmonitor.

Daher beweist:

```text
provider_rate_limited=false
```

**nicht**, dass das OpenRouter-Free-Tier-Kontingent aktuell wieder verfügbar ist. Es bedeutet hier lediglich, dass im aktuellen Health-Prozesszustand kein Rate-Limit als Startup-/Health-State gespeichert ist. Der Status ist kein live ausgeführter Provider-Test und wurde durch diesen Auftrag auch nicht getestet.

## 6. Reichweite

Der Fehler ist eindeutig kontingentbezogen und OpenRouter-Free-Tier-seitig. Er ist nicht als Queue-17-spezifischer Truncation- oder JSON-Fehler belegt.

Der lokale Bestand weist nach dem Fehler keine weiteren erfolgreichen Provider-Calls mit demselben Modell/Provider nach. Eine Aussage über andere externe Systeme oder über eine tatsächliche Freigabe vor dem Reset ist nicht möglich.

## 7. Recovery-Folgerung

Einzige Empfehlung:

```text
B. Vor einem erneuten Queue-17-Test muss das konkrete Reset-/Kontingentfenster abgewartet werden.
```

Konkret nachweisbares Resetfenster:

```text
2026-08-19T00:00:00Z
```

Queue 17 ist zum Prüfzeitpunkt nicht erneut freigabefähig, weil der Reset noch nicht erreicht war und kein späterer erfolgreicher Provider-Call die Freigabe belegt.

Queue 184 bleibt unabhängig davon gesperrt.

## Abschluss

```text
Rate-Limit-Typ: OpenRouter-Free-Tier-Tages-/Kontingentlimit
Ursache: openrouter_free_tier_daily; Remaining=0; Limit=1000
Reset-/Retry-Zeit: 2026-08-19T00:00:00Z, aus X-RateLimit-Reset
Aktueller Providerzustand: provider_ready=true, provider_rate_limited=false; Kapazität nicht nachgewiesen
Queue-17-Retry freigabefähig: NEIN
Allgemeine Recovery danach freigabefähig: NEIN
Begründung: Resetzeitpunkt war zum Audit noch nicht erreicht; keine spätere erfolgreiche Nutzung nachgewiesen; Run-Block bleibt aktiv
```

Arbeitsauftrag AA-038 erledigt.'''
Path('/opt/struktur/knowledge-pipeline-aggregator-staging/AA-038.md').write_text(report)
print(hashlib.sha256(report.encode()).hexdigest())