herbatrium/.env.example
Till JS 55199ba80e
Some checks are pending
CI / validate (push) Waiting to run
η-2: Klassifikation (mana-llm primär, Pl@ntNet sekundär) + Sensitivity-Worker
Pipeline-Architektur folgt Playbook §Klassifikations-Pipeline:
- mana-llm primär (Port 3025, mana/vision-Alias, OpenAI-kompatibel):
  display-Layer als base64-data-URL, strenges JSON-Schema-System-Prompt
  → { candidates[1..3]: { scientific_name, common_name_de?, confidence,
  rationale }, phenology, damage_indicators[], notes }
- Pl@ntNet sekundär als Verifier (Stub wenn PLANTNET_API_KEY leer):
  wird zugeschaltet bei LLM-Confidence < 0.6 ODER Sensitivity-Verdacht
  (FFH-IV-Genera) ODER force_verifier=true. display-only-Outbound.
- Sensitivity-Worker async beim species-upsert: GBIF /species/match →
  IUCN-Kategorie + family + lifeForm; FFH-Anhang-IV-Liste-Lookup.
  Setzt is_sensitive auf false NUR bei erfolgreichem Lookup ohne
  Schutz-Indikation. Fail-closed bei Fehler.

Neue Libs:
- lib/mana-llm.ts: identifyPlant + fetchAsBase64DataUrl
- lib/gbif.ts: lookupGbif mit 5min-Cache (kein API-Key nötig, höflicher
  User-Agent)
- lib/ffh-list.ts: kuratierte FFH-Anhang-IV-Plant-Liste (~30 Taxa Stand
  η-2, Quellen BfN + EU-92/43/EEC; Subspezies-Match)
- lib/plantnet.ts: identifyWithPlantnet, isPlantnetConfigured;
  Default no-store (User opt-in für CC-BY-SA-Pool-Beiträge in η-4)
- lib/sensitivity.ts: resolveSpeciesSensitivity (async, void-Promise
  vom Caller getriggert)

Route:
- POST /api/v1/identify: { observation_id, force_verifier? }.
  Owner-Check, photos→display→base64, mana-llm, optional Pl@ntNet,
  combined-Sort (Pl@ntNet-Tiebreak), species-upsert, identification_
  proposal-Rows, Auto-Confirm wenn confidence >= 0.7 UND nicht
  sensitive, sonst pending.

Smoke:
- pnpm type-check ✓ (API + Web)
- POST /api/v1/identify ohne Auth → 401
- Mit X-User-Id ohne dev-stub-Flag → 401 (fail-secure)

Offen für Live-Smoke: mana-llm laufend (lokal :3025 oder prod), und
für Pl@ntNet-Verifier: API-Key besorgen (operativ, Playbook §Operative
Helfer hat den Antragsweg).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 19:41:27 +02:00

51 lines
1.7 KiB
Text

# Herbatrium — Lokale Entwicklungs-Konfiguration
# Kopiere nach .env und passe an.
# API-Server
PORT=3101
NODE_ENV=development
BASE_URL=http://localhost:3101
# Web (SvelteKit)
WEB_PORT=3102
# Datenbank (lokales PostGIS aus docker-compose, exposed auf 5449)
DATABASE_URL=postgresql://herbatrium:devpassword@localhost:5449/mana_herbatrium
# Plattform-Services
MANA_AUTH_URL=http://localhost:3001
MANA_AUTH_JWKS_URL=http://localhost:3001/api/auth/jwks
MANA_SHARE_URL=http://localhost:3072
MANA_LINKS_URL=http://localhost:3073
MANA_EVENTS_URL=http://localhost:3074
MANA_MCP_URL=http://localhost:3069
MANA_CREDITS_URL=http://localhost:3061
MANA_NOTIFY_URL=http://localhost:3066
MANA_GEOCODING_URL=http://localhost:3075
MANA_MEDIA_URL=http://localhost:3015
MANA_LLM_URL=http://localhost:3025
MANA_LLM_VISION_ALIAS=mana/vision
# Service-Identität — wird beim ersten Deploy von mana-auth generiert
# (POST /api/v1/admin/apps/herbatrium/service-keys)
MANA_SERVICE_KEY=msk_test_replace-after-onboarding
# Pl@ntNet-API (Sekundär-Klassifikator, Citizen-Science-Account)
# Anfrage-Pfad: siehe playbooks/HERBATRIUM_GREENFIELD.md § „Operative Helfer"
PLANTNET_API_KEY=
PLANTNET_API_BASE=https://my-api.plantnet.org/v2
PLANTNET_PROJECT=all
# User-Agent für Pl@ntNet-API-Calls (Attribution + Take-Down-Kontakt)
HERBATRIUM_USER_AGENT=herbatrium/0.0.1 (+https://herbatrium.mana.how; kontakt@mana.how)
# Map-Tiles — Cloudflare-Pull-through-Cache vor opentopomap.org
# (Phase η-4; in η-0/η-1 leer, MapLibre rendert ohne Tiles als Stub)
MAP_TILE_BASE=
# Public-URL — für CORS und Manifest-Validation
PUBLIC_WEB_ORIGIN=http://localhost:3102
CORS_ORIGINS=https://herbatrium.mana.how,http://localhost:3102
# Verdaccio — für pnpm install gegen pkg.mana.how
NPM_AUTH_TOKEN=