Dokumentation

Alles was du wissen musst, um TRM Oracle produktiv zu betreiben.

รœbersicht

TRM Oracle ist ein self-hosted KI-Assistent fรผr SAP Treasury and Risk Management. Das System crawlt dein eigenes SAP-System (DDIC-Schema, BAPIs, Customizing-Werte, System-Doku) und beantwortet Fragen mit konkreten Quellen-Zitaten โ€” kombiniert aus drei Ebenen:

  • Knowledge-Graph โ€” strukturiertes TRM-Inventar deines Systems
  • Vector-RAG โ€” semantische Suche in der DOKHL-System-Doku
  • Live-Verifikation โ€” jede Antwort wird gegen das laufende SAP-System gegengeprรผft

Architektur

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Browser / Slack / Cursor / Claude Desktop โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ Frage โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Web-UI (FastAPI, Port 8080) / MCP-Server (stdio) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ oracle/pipeline.py โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ Intent โ”‚โ†’ โ”‚ Graph โ”‚โ†’ โ”‚ Vector โ”‚โ†’ โ”‚ Live-Verify โ”‚ โ”‚ โ”‚ โ”‚ Parser โ”‚ โ”‚ Lookup โ”‚ โ”‚ RAG โ”‚ โ”‚ (XS1 SQL) โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ–ผ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ Synthesizer โ”‚ โ† Anthropic Claude (opt.) โ”‚ โ”‚ โ”‚ (anti-halluz.) โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ Antwort + Quellen โ–ผ User-Browser Datenseite (alles lokal in ./data/): โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Graph (trm-knowledge.jsonl) โ”‚ ~165k Entities โ”‚ Vector Store (LanceDB) โ”‚ ~2.8k Chunks โ”‚ Raw Crawls (data/raw/*.jsonl) โ”‚ ~204k Records โ”‚ Q&A-History (qa_history.jsonl) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Datenfluss

QuelleCrawler / SkriptZiel
SAP DDIC (TADIR, TSTC, TFDIR, DD02L, โ€ฆ)crawlers/crawl_*.pydata/raw/*.jsonl
data/raw/*.jsonlgraph/builder.pydata/graph/trm-knowledge.jsonl
DOKHL-Texte aus dem Crawlingest/embed_dokhl.pydata/vector/lancedb/
SAP Help Portal (TRM-Buch)ingest/embed_help_portal.py (Playwright)data/vector/lancedb/
OSS Notes (S-User-Export)ingest/embed_oss_notes.pydata/vector/lancedb/

Installation

Auto-Installer (Docker oder native):

curl -sSL https://trm-oracle.pages.dev/install.sh | bash

Native ohne Docker (Python venv):

curl -sSL https://trm-oracle.pages.dev/install.sh | bash -s -- --native

Air-Gapped (keine Auto-Installation):

curl -sSL https://trm-oracle.pages.dev/install.sh | bash -s -- --skip-prereq

Manuell (eigenes Clone):

git clone https://github.com/Lomtech/trm_oracle.git ~/trm-oracle
cd ~/trm-oracle
cp .env.example .env
# .env editieren
docker compose up -d
# oder: python3 -m uvicorn web.app:app --host 0.0.0.0 --port 8080

Konfiguration (.env)

Komplette Liste der Umgebungsvariablen siehe Abschnitt .env-Reference. Minimale Konfiguration:

# SAP-Verbindung
SAP_HOST=https://your-sap.intern:44383
SAP_CLIENT=100
SAP_USER=TRM_READ
SAP_PASSWORD='deinPasswort'
SAP_VERIFY_TLS=false

# Lizenz (aus Trial-Mail)
TRM_ORACLE_LICENSE_KEY=trmo-XXXX-XXXX-XXXX-XXXX

# LLM-Synthese (optional)
ANTHROPIC_API_KEY=sk-ant-api03-...

# Vector-Embeddings (lokal = kein API-Key nรถtig)
TRM_EMBED_PROVIDER=local

Erstes Crawling

รœber Web-UI:

  1. Browser: localhost:8080/setup
  2. SAP-Verbindung sollte grรผnes Hรคkchen zeigen
  3. Klick "Crawl starten (Quick: ~3 Min)"

Per CLI:

cd ~/trm-oracle
docker compose exec trm-oracle python3 scripts/crawl_all.py --quick
# oder Full-Crawl (alle 14 Crawler)
docker compose exec trm-oracle python3 scripts/crawl_all.py --full
# oder einzelne
docker compose exec trm-oracle python3 scripts/crawl_all.py --only tcodes,bapi_params

Was beim Quick-Crawl gezogen wird (~3-5 Min):

  • TRM-Transaktionen (~4.000)
  • BAPI-Familie + Parameter (~27.000)
  • Customizing-Werte (~1.500)
  • Help-URL-Index
  • System-Doku DOKHL (~2.600)

Operations

AufgabeBefehl
Logsdocker compose logs -f trm-oracle
Restartdocker compose restart
Stopdocker compose down
Updategit pull && docker compose build && docker compose up -d
Backuptar czf trm-backup-$(date +%F).tgz data/
Statuscurl localhost:8080/health
Re-CrawlWeb-UI Setup โ†’ "Crawl starten" oder scripts/crawl_all.py --full

Crawler (14)

Jeder Crawler ist eigenstรคndig in crawlers/crawl_*.py:

CrawlerSAP-QuelleZweck
packagesTDEVC, TDEVCTTRM-Pakete + Hierarchie
tcodesTSTC, TSTCT, TADIR, TSTCATransaktionen + Programm + Auth-Objekt
function_modulesTFDIR, TFTIT, ENLFDIRFMs + BAPIs
bapi_paramsFUPARAREFBAPI/FM-Parameter-Schemas
ddic_tablesDD02L, DD02T, DD03LTabellen + Felder
domainsDD01L, DD01T, DD07L, DD07TDomรคnen + Festwerte
data_elementsDD04L, DD04TDatenelemente
viewsDD25L, DD25T, VCLDIRViews + View-Cluster
auth_objectsTOBJ, TOBJTBerechtigungsobjekte
messagesT100TRM-Nachrichten-Klassen
img_nodesTCUS_XREF / CUS_ACTHIMG-Customizing-Pfade (Schema-abhรคngig)
customizing_valuesT-Tabellen + T-Text-PartnerEchte Pflege-Werte (AT10/SANLF, TZKN2 etc.)
securitiesVWP*/VVS*/VWB*/VFP*Wertpapier-Stammdaten
dokhlDOKHL, DOKTLSystem-Doku zu BAPIs, Domรคnen, IMG

Knowledge-Graph

JSONL-basiert (kompatibel mit MCP-Memory-Format). Liegt unter data/graph/trm-knowledge.jsonl.

Entity-Types (17)

TRM_PACKAGE          TRM_PROGRAM         TRM_CLASS
TRM_FUNCTION_MODULE  TRM_BAPI            TRM_BAPI_PARAM
TRM_TCODE            TRM_DDIC_TABLE      TRM_DDIC_FIELD
TRM_DOMAIN           TRM_DATA_ELEMENT    TRM_FIXED_VALUE
TRM_VIEW             TRM_VIEW_CLUSTER    TRM_IMG_NODE
TRM_CUSTOMIZING_TABLE TRM_AUTH_OBJECT    TRM_MESSAGE
TRM_DOC_CHUNK

Relation-Types

BELONGS_TO_PACKAGE   IMPLEMENTS         CALLS
READS                WRITES             USES_DOMAIN
HAS_FIELD            HAS_PARAM          HAS_FIXED_VALUE
HAS_DATA_ELEMENT     CUSTOMIZES         MAPS_TO_TABLE
MAPS_TO_TCODE        MAPS_TO_VIEW       DOCUMENTED_BY
AUTHORIZES           PART_OF_VIEW_CLUSTER

Vector-RAG

LanceDB-basiert. Default-Embedding-Modell: intfloat/multilingual-e5-base (768-dim, lokal, kein API-Key).

Provider-Auswahl

TRM_EMBED_PROVIDERBeschreibungVoraussetzung
local (default)sentence-transformers, lรคuft offline250 MB Modell-Download einmalig
openaitext-embedding-3-largeOPENAI_API_KEY
anthropic / voyageVoyage AI (Anthropic-Empfehlung)VOYAGE_API_KEY

LLM-Synthese

In oracle/synthesizer.py. Komponiert aus Graph-Treffern + RAG-Snippets + Live-Verifikation einen Customizing-Leitfaden mit Quellen-Zitaten inline. Anti-Halluzinations-System-Prompt: LLM darf nichts ausgeben das nicht in den รผbergebenen Daten vorkommt.

Fallback-Modus

Ohne ANTHROPIC_API_KEY rendert das System deterministisches Markdown statt LLM-Synthese. Funktioniert weiter, ist aber weniger fachlich formuliert.

MCP โ€” Claude Desktop / Cursor / Continue / Zed

Das Orakel exponiert seine 5 Tools als Model Context Protocol Server (stdio). Damit kannst du es direkt in deiner IDE / AI-Assistent nutzen โ€” Cursor ruft im Hintergrund trm_bapi_explain wenn du ABAP schreibst und einen BAPI-Aufruf brauchst.

Setup-Snippet (fรผr Claude Desktop):

{
  "mcpServers": {
    "trm-oracle": {
      "command": "/Users/<you>/.pyenv/versions/3.12.3/bin/python3",
      "args": [
        "/Users/<you>/trm-oracle/scripts/run_mcp.py"
      ],
      "env": {
        "TRM_EMBED_PROVIDER": "local"
      }
    }
  }
}

Pro IDE-Setup-Guide siehe Repo: integrations/mcp/setup-*.md

Slack-Bot (Pro-Tier)

FastAPI-basierter Slack-Bot reagiert auf @trm-orakel-Mentions in Channels.

# 1. Slack-App via Manifest erstellen (integrations/slack/manifest.yml)
# 2. SLACK_BOT_TOKEN + SLACK_SIGNING_SECRET in .env
# 3. Bot starten:
docker compose -f docker-compose.yml -f docker-compose.slack.yml up -d
# 4. In Slack: /invite @trm-orakel

Komplette Anleitung: integrations/slack/README.md

CLI

# Fragen stellen (kommando-zeile)
docker compose exec trm-oracle python3 scripts/ask.py "Welche Felder hat VTBFHA?"

# Mit JSON-Ausgabe (fรผr Pipes / Automation)
docker compose exec trm-oracle python3 scripts/ask.py --json "BAPI_FTR_CREATEFROMDATA"

# Bootstrap (Konfig-Check)
docker compose exec trm-oracle python3 scripts/bootstrap.py

# Crawl
docker compose exec trm-oracle python3 scripts/crawl_all.py --quick

# Status
docker compose exec trm-oracle python3 scripts/status.py

# Eval (12 Test-Szenarien)
docker compose exec trm-oracle python3 eval/run_eval.py

Web-API

EndpointMethodeBeschreibung
/GETWeb-UI
/askPOSTFrage stellen (form-encoded: question=...)
/setupGETSetup-Dashboard (SAP-Status, Lizenz, Crawl-Trigger)
/healthGETLiveness + Entity-Count + License-Status
/api/statsGETJSON-Stats รผber Graph + History
/api/crawlPOSTCrawl-Job triggern (Body: {"mode":"quick"})
/licenseGETLizenz-Status (Trial / Commercial)

5 MCP-Tools (Referenz)

trm_explain(scenario: str)

Vollstรคndiges Szenario-Routing. Default-Entry-Point fรผr freie Fragen.

trm_bapi_explain(name: str)

BAPI-Tiefenanalyse: Parameter, Doku, Live-Existenz-Check.

trm_field_lookup(table: str, field?: str)

DDIC-Tabelle bzw. einzelnes Feld erklรคren (Domain, Datenelement, Festwerte).

trm_customizing_path(topic: str)

IMG-Knoten + Customizing-Tabellen zu einem fachlichen Thema.

trm_doc_search(query: str, limit?: int)

Vektor-Suche im DOKHL-Korpus + Help + Notes.

.env-Reference

VariableDefaultBeschreibung
SAP_HOSTโ€”SAP-Backend-URL (mit Port)
SAP_CLIENT100Mandant
SAP_USERโ€”SAP-User
SAP_PASSWORDโ€”Passwort (in Single-Quotes wenn $-Zeichen drin)
SAP_VERIFY_TLStruefalse bei selbst-signierten Zerts
ANTHROPIC_API_KEYโ€”Optional, fรผr LLM-Synthese
TRM_EMBED_PROVIDERlocallocal / openai / anthropic / voyage
TRM_LOCAL_EMBED_MODELintfloat/multilingual-e5-baseHF-Modell-ID
TRM_ORACLE_LICENSE_KEYโ€”Aus Trial-Mail (trmo-XXXX-โ€ฆ)
TRM_LICENSE_APIlicense-Worker-URLLicense-Server-Endpoint
TRM_LICENSE_OFFLINE01 = Air-Gapped-Modus, kein Online-Verify
TRM_TRIAL_DAYS30Trial-Dauer wenn kein License-Key
TRM_DATA_DIR./dataPersistente Daten
TRM_LOG_LEVELINFODEBUG / INFO / WARNING / ERROR
SAP_HELP_FETCH_BACKENDplaywrightplaywright / http / pdf-local
SAP_HELP_USER_AGENTClaudeBot/1.0 โ€ฆUA fรผr SAP-Help-Crawl
SLACK_BOT_TOKENโ€”Nur fรผr Slack-Bot (Pro-Tier)
SLACK_SIGNING_SECRETโ€”Slack-Webhook-Verifikation

Lizenz-Tiers

TierSAP-SystemeBeraterSlack-BotCustom CrawlerPreis
Trial11โ€”โ€”0 โ‚ฌ / 30 Tage
Starter11โ€”โ€”299 โ‚ฌ/Mon
Pro3bis 5โœ“โ€”799 โ‚ฌ/Mon
Enterpriseunlimitedunlimitedโœ“โœ“ab 2.500 โ‚ฌ/Mon

Troubleshooting

ProblemLรถsung
Service startet nichtdocker compose logs trm-oracle ansehen
SAP-Verbindung schlรคgt fehlVPN/Cloud-Connector aktiv? Test: docker compose exec trm-oracle curl -sk <SAP_HOST>/sap/bc/adt/discovery
"401 Unauthorized" am ADTUser hat S_DEVELOP nicht. User-Rechte-Checkliste
Crawl liefert 0 RowsTRM-Paket-Patterns stimmen evtl. nicht. Live-Probe: SELECT TABNAME FROM DD02L WHERE TABNAME LIKE 'FTR%'
"LIKE is not allowed here"ADT-Datapreview-SQL-Limits. Siehe sap_client._normalize_open_sql + Memory-Eintrag ADT_DATAPREVIEW_SQL_LIMITS
Embedding-Modell lรคdt jedes Mal neuModell wird in Docker-Image gebakt (Dockerfile RUN python -c ...). Bei native-Install: ~/.cache/huggingface/
LLM-Synthese antwortet seltsamANTHROPIC_API_KEY-Format prรผfen (sk-ant-api03-โ€ฆ). Wenn leer: Fallback-Markdown ist erwartet
License-Trial abgelaufenAntworten funktionieren weiter. Neue Lizenz unter /pricing

FAQ

Verlassen meine SAP-Daten je den Container?

Nein fรผr Customizing-Daten / DDIC-Schema / DOKHL-Texte โ€” die bleiben lokal in ./data/. Nur bei aktivierter LLM-Synthese gehen pro Frage 3-8 relevante Snippets (~3 KB) an Anthropic. Air-Gapped-Modus deaktiviert auch das.

Kostet die Anthropic-API extra?

Ja, du brauchst einen eigenen Anthropic-Account + API-Key. ~0.03 โ‚ฌ pro Frage, bei 50 Fragen/Tag = ~45 โ‚ฌ/Monat. Bei einem Berater-Tagessatz von 1.500 โ‚ฌ: ROI > 100ร—.

Funktioniert das auch mit ECC statt S/4HANA?

Ja โ€” die DDIC-Tabellen heiรŸen gleich. Die Crawler-Patterns sind defensiv gegen Schema-Unterschiede getestet (z.B. CUS_ACTH vs. CUS_IMGACH fรผr IMG).

Wie oft sollte ich re-crawlen?

Nach jedem Customizing-Transport. Bei stabilem System: 1ร— pro Woche. Quick-Modus dauert 3-5 Min, daher unproblematisch.

Kann ich Z-Tabellen ergรคnzen?

Ja. config.py editieren โ†’ TRM_PACKAGE_PATTERNS erweitern. Bei Enterprise-Tier: wir bauen den Custom Crawler fรผr dich.

DSGVO-konform fรผr Banken?

Self-hosted = du behรคltst volle Daten-Hoheit. Air-Gapped-Modus = null externe API-Calls. Siehe Datenschutzerklรคrung fรผr alle Sub-Prozessoren.

Changelog

Vollstรคndig: GitHub-Commits

v0.1.0 โ€” 2026-05-15
  • Initial Public Release
  • 14 Crawler, 165k Entities Graph
  • LLM-Synthesizer + Fallback-Markdown
  • License-Server (Cloudflare Worker)
  • Landing-Page + Trial-Form
  • MCP-Integration fรผr Claude Desktop / Cursor / Continue.dev
  • Slack-Bot (Pro-Tier)