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
Datenfluss
| Quelle | Crawler / Skript | Ziel |
|---|---|---|
| SAP DDIC (TADIR, TSTC, TFDIR, DD02L, โฆ) | crawlers/crawl_*.py | data/raw/*.jsonl |
data/raw/*.jsonl | graph/builder.py | data/graph/trm-knowledge.jsonl |
| DOKHL-Texte aus dem Crawl | ingest/embed_dokhl.py | data/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.py | data/vector/lancedb/ |
Installation
Auto-Installer wรคhlt selbst zwischen Native (Python venv) und Docker โ entscheidend ist Python 3.11+:
curl -sSL https://trm-oracle.pages.dev/install.sh | bash
- Mac/Linux mit Python 3.11+ โ native (schneller, weniger Disk, sieht
claudeCLI) - Windows oder kein Python โ docker (universell, isoliert)
Modus erzwingen:
curl -sSL https://trm-oracle.pages.dev/install.sh | bash -s -- --native curl -sSL https://trm-oracle.pages.dev/install.sh | bash -s -- --docker
Air-Gapped (keine Auto-Installation von Python/Docker):
curl -sSL https://trm-oracle.pages.dev/install.sh | bash -s -- --skip-prereq
Manuell:
git clone https://github.com/Lomtech/trm_oracle.git ~/trm-oracle cd ~/trm-oracle cp .env.example .env # editieren (oder Browser-Wizard verwenden) # Native: python3 -m venv .venv && .venv/bin/pip install -r requirements.txt .venv/bin/python -m uvicorn web.app:app --host 0.0.0.0 --port 8080 # Oder Docker: docker compose up -d
Nach dem Install: trm CLI ist global verfรผgbar โ siehe Daily Use.
Modes โ Docker vs. Native
Beide Modi liefern dasselbe Frontend, dieselbe API, dieselben Antworten. Sie unterscheiden sich nur im wie der Service lรคuft.
| Aspekt | Native | Docker |
|---|---|---|
| Runtime | Python-Prozess auf dem Host | Container (isolierte Linux-VM) |
| Voraussetzung | Python 3.11+ | Docker Desktop / Engine |
| Startzeit | ~2s | ~5s |
| Disk | ~600 MB venv | ~1.5 GB Image + Layer |
| RAM (idle) | ~400 MB | ~800 MB |
claude CLI nutzbar | โ ja (Host-PATH) | โ nein (Binary nicht im Image) |
| Update | pip install --upgrade | docker compose build |
| Reset | rm -rf .venv data/ | docker compose down -v |
| Multi-Instanz | 1 pro Port | einfach (Container) |
| Plattform | Mac / Linux | Mac / Linux / Windows |
Wahl-Hilfe:
- Single-User auf Mac/Linux mit Anthropic Pro/Max/Team/Enterprise โ Native (kostenlos via OAuth)
- Windows โ Docker (Python-Setup unter Windows ist Aufwand)
- Zentraler Team-Server / Enterprise-Deployment โ Docker (Isolation, Reproduzierbarkeit)
- Multi-Instance auf einem Host (z.B. Test + Prod) โ Docker
Wechsel jederzeit per CLI:
trm switch-to-native # Docker โ Python venv trm switch-to-docker # Native โ Docker trm mode # aktuellen Modus anzeigen
Daten (.env, data/) bleiben beim Wechsel erhalten โ nur das Runtime-Drumherum รคndert sich.
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:
- Browser: localhost:8080/setup
- SAP-Verbindung sollte grรผnes Hรคkchen zeigen
- 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)
trm CLI โ Daily Use
Der Installer richtet ein globales trm Command ein, das mode-aware ist (Docker oder Native). Du musst nie wieder docker compose โฆ oder .venv/bin/python โฆ tippen.
Steuerung
| Befehl | Was er tut |
|---|---|
trm up | Service starten + auf Health warten |
trm down | Service stoppen |
trm restart | Neu starten (ohne Rebuild) |
trm status | Mode + Container/Prozess-Status + Health-Check |
trm logs | Live-Logs (Ctrl+C raus) |
trm logs 100 | Letzte 100 Zeilen statt Live |
Browser
trm open | Hauptseite รถffnen (Fragen stellen) |
trm wizard | Setup-Wizard รถffnen (SAP / Provider / Lizenz) |
Nutzung
trm ask "Frage" | Frage via CLI (ohne Browser, JSON-Output verfรผgbar) |
Wartung
trm update | git pull + Update + Restart (mode-aware) |
trm crawl | Verfรผgbare Crawler auflisten |
trm crawl bapi_params | Einzelnen Crawler ausfรผhren |
trm shell | Container-bash oder venv-Shell รถffnen |
trm reset | Komplett-Reset (mit Bestรคtigung โ lรถscht data/ + .env) |
Mode-Wechsel
trm mode | Aktuellen Mode anzeigen (docker oder native) |
trm switch-to-native | Docker stoppen โ Python venv aufsetzen โ Native starten |
trm switch-to-docker | Native stoppen โ Docker-Container starten |
Einrichten
trm install-cli | Symlink anlegen damit trm global verfรผgbar ist (vom Installer aufgerufen) |
trm help | Komplette Befehlsliste |
Backups + manueller Zugriff
# .env-Backups (automatisch bei jedem Wizard-Save, 5 Versionen) ls ~/trm-oracle/data/.env-backups/ # Knowledge-Graph + Vector-Store backuppen tar czf trm-backup-$(date +%F).tgz ~/trm-oracle/data/ # Pfad-Overrides TRM_INSTALL_DIR=/anderer/pfad trm up TRM_URL=http://server:8080 trm status
Crawler (14)
Jeder Crawler ist eigenstรคndig in crawlers/crawl_*.py:
| Crawler | SAP-Quelle | Zweck |
|---|---|---|
packages | TDEVC, TDEVCT | TRM-Pakete + Hierarchie |
tcodes | TSTC, TSTCT, TADIR, TSTCA | Transaktionen + Programm + Auth-Objekt |
function_modules | TFDIR, TFTIT, ENLFDIR | FMs + BAPIs |
bapi_params | FUPARAREF | BAPI/FM-Parameter-Schemas |
ddic_tables | DD02L, DD02T, DD03L | Tabellen + Felder |
domains | DD01L, DD01T, DD07L, DD07T | Domรคnen + Festwerte |
data_elements | DD04L, DD04T | Datenelemente |
views | DD25L, DD25T, VCLDIR | Views + View-Cluster |
auth_objects | TOBJ, TOBJT | Berechtigungsobjekte |
messages | T100 | TRM-Nachrichten-Klassen |
img_nodes | TCUS_XREF / CUS_ACTH | IMG-Customizing-Pfade (Schema-abhรคngig) |
customizing_values | T-Tabellen + T-Text-Partner | Echte Pflege-Werte (AT10/SANLF, TZKN2 etc.) |
securities | VWP*/VVS*/VWB*/VFP* | Wertpapier-Stammdaten |
dokhl | DOKHL, DOKTL | System-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_PROVIDER | Beschreibung | Voraussetzung |
|---|---|---|
local (default) | sentence-transformers, lรคuft offline | 250 MB Modell-Download einmalig |
openai | text-embedding-3-large | OPENAI_API_KEY |
anthropic / voyage | Voyage 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
Direkter Script-Zugriff
Fรผr Automation oder wenn das trm CLI nicht reicht โ direkter Aufruf der Python-Scripts:
# Native: cd ~/trm-oracle .venv/bin/python scripts/ask.py "Welche Felder hat VTBFHA?" .venv/bin/python scripts/ask.py --json "BAPI_FTR_CREATEFROMDATA" .venv/bin/python scripts/bootstrap.py # Konfig-Check .venv/bin/python scripts/crawl_all.py --quick .venv/bin/python scripts/status.py .venv/bin/python eval/run_eval.py # 12 Test-Szenarien # Docker: docker compose exec trm-oracle python3 scripts/ask.py "Welche Felder hat VTBFHA?" docker compose exec trm-oracle python3 scripts/ask.py --json "BAPI_FTR_CREATEFROMDATA" docker compose exec trm-oracle python3 scripts/crawl_all.py --quick docker compose exec trm-oracle python3 eval/run_eval.py # Mode-agnostisch via trm CLI (empfohlen fรผr 90% der Fรคlle): trm ask "Welche Felder hat VTBFHA?" trm ask --json "BAPI_FTR_CREATEFROMDATA" trm crawl # zeigt Liste der Crawler trm crawl bapi_params # einzelner Crawler
Web-API
| Endpoint | Methode | Beschreibung |
|---|---|---|
/ | GET | Web-UI |
/ask | POST | Frage stellen (form-encoded: question=...) |
/setup | GET | Setup-Dashboard (SAP-Status, Lizenz, Crawl-Trigger) |
/health | GET | Liveness + Entity-Count + License-Status |
/api/stats | GET | JSON-Stats รผber Graph + History |
/api/crawl | POST | Crawl-Job triggern (Body: {"mode":"quick"}) |
/license | GET | Lizenz-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
| Variable | Default | Beschreibung |
|---|---|---|
SAP_HOST | โ | SAP-Backend-URL (mit Port) |
SAP_CLIENT | 100 | Mandant |
SAP_USER | โ | SAP-User |
SAP_PASSWORD | โ | Passwort (in Single-Quotes wenn $-Zeichen drin) |
SAP_VERIFY_TLS | true | false bei selbst-signierten Zerts |
ANTHROPIC_API_KEY | โ | Optional, fรผr LLM-Synthese |
TRM_EMBED_PROVIDER | local | local / openai / anthropic / voyage |
TRM_LOCAL_EMBED_MODEL | intfloat/multilingual-e5-base | HF-Modell-ID |
TRM_ORACLE_LICENSE_KEY | โ | Aus Trial-Mail (trmo-XXXX-โฆ) |
TRM_LICENSE_API | license-Worker-URL | License-Server-Endpoint |
TRM_LICENSE_OFFLINE | 0 | 1 = Air-Gapped-Modus, kein Online-Verify |
TRM_TRIAL_DAYS | 30 | Trial-Dauer wenn kein License-Key |
TRM_DATA_DIR | ./data | Persistente Daten |
TRM_LOG_LEVEL | INFO | DEBUG / INFO / WARNING / ERROR |
SAP_HELP_FETCH_BACKEND | playwright | playwright / http / pdf-local |
SAP_HELP_USER_AGENT | ClaudeBot/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
| Tier | SAP-Systeme | Berater | Slack-Bot | Custom Crawler | Preis |
|---|---|---|---|---|---|
| Trial | 1 | 1 | โ | โ | 0 โฌ / 30 Tage |
| Starter | 1 | 1 | โ | โ | 299 โฌ/Mon |
| Pro | 3 | bis 5 | โ | โ | 799 โฌ/Mon |
| Enterprise | unlimited | unlimited | โ | โ | ab 2.500 โฌ/Mon |
Troubleshooting
| Problem | Lรถsung |
|---|---|
| Service startet nicht | docker compose logs trm-oracle ansehen |
| SAP-Verbindung schlรคgt fehl | VPN/Cloud-Connector aktiv? Test: docker compose exec trm-oracle curl -sk <SAP_HOST>/sap/bc/adt/discovery |
| "401 Unauthorized" am ADT | User hat S_DEVELOP nicht. User-Rechte-Checkliste |
| Crawl liefert 0 Rows | TRM-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 neu | Modell wird in Docker-Image gebakt (Dockerfile RUN python -c ...). Bei native-Install: ~/.cache/huggingface/ |
| LLM-Synthese antwortet seltsam | ANTHROPIC_API_KEY-Format prรผfen (sk-ant-api03-โฆ). Wenn leer: Fallback-Markdown ist erwartet |
| License-Trial abgelaufen | Antworten 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
- 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)