mindnet/docs/03_Technical_References/PROD_PYTHON_CACHE_FIX.md
Lars 6d268d9dfb
All checks were successful
Deploy mindnet to llm-node / deploy (push) Successful in 4s
Enhance .env loading mechanism and EdgeDTO creation with error handling
- Updated the .env loading process to first check for an explicit path, improving reliability in different working directories.
- Added logging for successful .env loading and fallback mechanisms.
- Enhanced EdgeDTO creation with robust error handling, including fallbacks for unsupported provenance values and logging of errors for better traceability.
2026-01-12 15:27:23 +01:00

3.6 KiB

Fix: Python-Modul-Cache-Problem in Prod

Datum: 2026-01-12
Version: v4.5.10
Status: 🔴 Kritisch

Problem

Code in app/models/dto.py ist korrekt (enthält explicit:callout), aber Prod verwendet trotzdem eine alte Version.

Symptom:

ERROR: 1 validation error for EdgeDTO
provenance
  Input should be 'explicit', 'rule', 'smart' or 'structure' 
  [type=literal_error, input_value='explicit:callout', input_type=str]

Ursache

Python-Modul-Cache: Python speichert kompilierte .pyc Dateien in __pycache__ Verzeichnissen. Wenn der Code aktualisiert wird, aber der Service nicht neu gestartet wird, lädt Python die alte gecachte Version.

Sofortmaßnahmen

Schritt 1: Python-Cache leeren

# In Prod-System
cd ~/mindnet

# Finde und lösche alle __pycache__ Verzeichnisse
find . -type d -name __pycache__ -exec rm -r {} + 2>/dev/null || true

# Finde und lösche alle .pyc Dateien
find . -name "*.pyc" -delete

# Speziell für dto.py
rm -rf app/models/__pycache__
rm -rf app/__pycache__
rm -rf __pycache__

Schritt 2: Verifikation des Codes

# Prüfe, ob der Code korrekt ist
grep -A 10 "provenance.*Literal" app/models/dto.py | grep "explicit:callout"

Erwartete Ausgabe: Sollte explicit:callout enthalten

Schritt 3: Service neu starten

Option A: FastAPI/uvicorn direkt:

# Service stoppen (Ctrl+C oder kill)
# Dann neu starten
source .venv/bin/activate
uvicorn app.main:app --host 0.0.0.0 --port 8001 --reload

Option B: Systemd-Service:

sudo systemctl restart mindnet-prod
# oder
sudo systemctl restart mindnet

Option C: Docker-Container:

docker-compose restart mindnet
# oder
docker restart mindnet-container

Schritt 4: Verifikation zur Laufzeit

Test-Script ausführen (wenn verfügbar):

python3 scripts/verify_dto_import.py

Erwartete Ausgabe:

✅ EdgeDTO unterstützt 'explicit:callout'
✅ 'explicit:callout' ist in der Literal-Liste enthalten
✅ EdgeDTO mit 'explicit:callout' erfolgreich erstellt!

Oder manuell testen:

python3 -c "
from app.models.dto import EdgeDTO
test = EdgeDTO(
    id='test', kind='test', source='test', target='test',
    weight=1.0, provenance='explicit:callout'
)
print('✅ EdgeDTO mit explicit:callout funktioniert!')
"

Code-Fix (Fallback-Mechanismus)

Ein Fallback-Mechanismus wurde in retriever.py implementiert:

  • Wenn EdgeDTO mit explicit:callout fehlschlägt, wird automatisch explicit als Fallback verwendet
  • Dies verhindert, dass der gesamte Retrieval-Prozess fehlschlägt
  • WICHTIG: Dies ist nur eine temporäre Lösung - der Cache muss trotzdem geleert werden!

Verifikation nach Fix

  1. Test-Query ausführen:

    curl -X POST http://localhost:8001/api/chat \
      -H "Content-Type: application/json" \
      -d '{"message": "Was für einen Status hat das Projekt mindnet?"}'
    
  2. Log prüfen:

    • Keine validation error for EdgeDTO mehr
    • Keine ⚠️ [EDGE-DTO] Provenance 'explicit:callout' nicht unterstützt Warnungen
    • ✨ [SUCCESS] Stream 'facts_stream' lieferte X Treffer.
    • Ergebnisse werden zurückgegeben

Warum passiert das?

  1. Code wurde aktualisiert, aber Service läuft noch mit alter Version im Speicher
  2. Python lädt Module nur einmal - nach dem ersten Import wird die gecachte Version verwendet
  3. pycache Verzeichnisse enthalten kompilierte Bytecode-Versionen der alten Dateien

Prävention

  • Immer Service neu starten nach Code-Änderungen
  • Cache regelmäßig leeren bei Deployment
  • Verwende --reload Flag bei uvicorn für automatisches Neuladen (nur für Dev!)