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 (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:
- 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)
Operations
| Aufgabe | Befehl |
|---|---|
| Logs | docker compose logs -f trm-oracle |
| Restart | docker compose restart |
| Stop | docker compose down |
| Update | git pull && docker compose build && docker compose up -d |
| Backup | tar czf trm-backup-$(date +%F).tgz data/ |
| Status | curl localhost:8080/health |
| Re-Crawl | Web-UI Setup โ "Crawl starten" oder scripts/crawl_all.py --full |
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
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
| 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)