Skip to main content
Configuration is loaded from environment variables (and an optional .env file) via pydantic-settings — see src/scheduling_bridge/config.py.

Market setup

HOME_CONTROL_AREA defaults to TenneT as a placeholder. Set it to the real home area before any live use — it decides where the physical EPEX delivery lands.

Engrate

AREA_MARKET_IDS maps each control area to its identifiers:
The control-area EIC Y codes default to the public, stable values. The balancing-group EICs default to placeholders and must be configured; the TSO identifiers and receiver EICs follow Engrate’s documented pattern and need verification — see Assumptions.

Market communication

Beyond the identifiers above, the message loops have their own settings — PARTIN, Zuordnungsermächtigung and the APERAK acknowledgements. Whether a loop runs on the orchestrator is no setting any more: each loop is a process agent switched in the console’s Agenten tab (the former AUTO_* switches were read once into the seeded agents):

Trader sFTP

Erstkontakt mailbox (SMTP)

LLM reply classification: with a key set, every reply is read by the Claude API, which returns a strict verdict (bestätigt / Rückfrage / abwesend / unzustellbar / Empfangsbestätigung / Ablehnung / sonstiges) with a verbatim Beleg quote and a confidence. The model only labels — all actions stay in the bridge, which verifies the quote appears literally in the mail (and is not a sentence of our own template), only forwards to Vertreter addresses that literally occur in the mail, and demotes anything below the confidence bar to a Wiedervorlage. On API failure the regex classifier takes over (classifier_degraded event); LLM/regex disagreements are logged (classifier_disagreement). Replies are processed, not answered: the mailbox reconciliation adopts hand-sent Erstkontakt mails from Sent/Archive into the ledger, forwards the original mail to a Vertreter named in an Abwesenheitsnotiz — only while the Erstkontakt is still outstanding; a note answering a Quittungs-Nachfass or Korrektur mail, or from a partner already past Erstkontakt, becomes a Wiedervorlage with faellig_am read from the note (“bis einschließlich 04.09.” → due on the 5th) and nothing is forwarded — and files bounces and vertreterlose Abwesenheiten as Wiedervorlagen. The mail body ships with the package (data/erstkontakt_vorlage.txt), recipient addresses come from the BDEW code list (data/nb_kontakte.json), and the attached Kontaktdatenblatt (XLSX) is rendered from the PARTIN_COMPANY settings. PARTIN_COMPANY is our company’s record for every role, not only the PARTIN: VAT_ID holds a German USt-IdNr. or, for a company seated in Switzerland, its UID (CHE-...). Beside the PARTIN fields it carries what only the Kontaktdatenblätter print: fax, glaeubiger_id, geschaeftsfuehrung_name / geschaeftsfuehrung_email, edifact_email (the address the EDIFACT exchange runs over) and bilanzkreise_hinweis (say, an Unterbilanzkreis applied for whose EIC is still to come).

Lieferant

Every market role writes from a mailbox of its own. The Lieferant’s settings carry the prefix LF_ and are grouped as Lieferant in the console; the passwords are write-only there.

Inbound API scopes and audit

With no credential configured the service refuses the authenticated routes with 503 rather than serving them openly. /health stays reachable so the platform can still schedule the app. Set ALLOW_UNAUTHENTICATED=true only on a developer machine; the service announces it in the event log every time it starts.
See Security for the full model — named callers, rotation, OIDC and rate limiting.

Alerting

See Alerting for what pages and what stays quiet.
In the Azure deployment all of these are wired up by the Bicep template — secrets as Container Apps secrets, the audit directory on an Azure Files mount, and the orchestrator timer with the process key. See Azure deployment.