Konfiguration
Alle Konfigurationsoptionen fuer das KnowledgeSDK an einem Ort — Umgebungsvariablen, Collection-Registry, LLM-Provider, Feedback-Store und Schwellenwerte.
Umgebungsvariablen
Such-Server
| Variable | Default | Beschreibung |
|---|---|---|
QMD_INDEX_PATH | /data/index.sqlite | Pfad zur SQLite-Datenbank |
QMD_SEARCH_MODE | fts | fts (nur BM25) oder hybrid (BM25 + Vektor) |
QMD_EMBED_PROVIDER | none | Embedding-Provider: none, openai, voyage |
QMD_API_KEY | (leer) | API-Key fuer Such-Endpoints (leer = kein Auth) |
QMD_MCP_ENABLED | false | MCP-Endpoint /api/mcp aktivieren |
PORT | 3001 | Server-Port |
Indexer
| Variable | Default | Beschreibung |
|---|---|---|
QMD_CONFIG | /app/config.json | Pfad zur Indexer-Konfigurationsdatei |
QMD_INDEX_PATH | /data/index.sqlite | Pfad zur Ziel-Datenbank |
QMD_EMBED_PROVIDER | none | Embedding-Provider fuer den Index |
SKIP_EMBED | false | Embeddings beim Indexieren ueberspringen |
GITHUB_TOKEN | (leer) | Token fuer das GitHub-Plugin (Content-Sources) |
Classifier
| Variable | Default | Beschreibung |
|---|---|---|
CLASSIFIER_API_KEY | (leer) | API-Key fuer Classifier-Endpoints (leer = offen) |
OPENAI_API_KEY | (leer) | Fuer LLM-Entscheider (Slow Path) mit OpenAI |
ANTHROPIC_API_KEY | (leer) | Fuer LLM-Entscheider mit Anthropic |
FEEDBACK_DB_PATH | neben dem qmd-Index | Pfad zur Feedback-SQLite-DB |
CLI / Single-Binary
Die CLI akzeptiert dieselben Umgebungsvariablen wie der Docker-Server:
QMD_INDEX_PATH Pfad zur SQLite-Datenbank
QMD_EMBED_PROVIDER none | openai | voyage
QMD_SEARCH_MODE fts | hybrid
QMD_API_KEY API-Key fuer Auth (Serve-Modus)
GITHUB_TOKEN Fuer GitHub-Plugin (Index-Modus)In der Produktion (K8s) werden Secrets ueber ExternalSecrets aus 1Password geladen. Der jeweilige Key muss als Feld im 1Password-Item hinterlegt sein.
Collection-Registry
Die Collection-Konfiguration definiert pro Collection Repositories, Keywords und Sub-Themen.
Sie liegt entweder in lib/classifier-config.ts (bei Library-Nutzung) oder in der
config.json (bei Docker/CLI).
Struktur
interface ClassifierCollectionMeta {
name: string; // z.B. "engine"
repos: RepoRef[]; // Zugeordnete GitHub-Repositories
keywords: WeightedKeyword[]; // Gewichtete Keywords
subThemes: SubTheme[]; // Sub-Themen fuer feingranulare Zuordnung
}Beispiel: Engine-Collection
{
name: 'engine',
repos: [
{ org: '5minds', name: 'ProcessCube.Engine.MonoRepo', branch: 'main' },
],
keywords: [
{ term: 'bpmn', weight: 2.0 },
{ term: 'workflow', weight: 2.0 },
{ term: 'timer', weight: 1.0 },
{ term: 'user-task', weight: 1.0 },
{ term: 'gateway', weight: 1.0 },
// ...
],
subThemes: [
{ name: 'bpmn/timer-events', keywords: ['timer', 'cron', 'delay'], docPath: '/engine/bpmn/timer-events' },
{ name: 'bpmn/gateways', keywords: ['gateway', 'exclusive', 'parallel'], docPath: '/engine/bpmn/gateways' },
// ...
],
}Keyword-Gewichte
| Gewicht | Bedeutung | Beispiel |
|---|---|---|
| 2.0 | Starkes Signal — eindeutig fuer diese Collection | bpmn → engine |
| 1.5 | Mittleres Signal | login → authority |
| 1.0 | Normales Signal | timer → engine |
| 0.8 | Schwaches Signal — kann mehrdeutig sein | prozess → engine |
Mehrere Keyword-Treffer derselben Collection verstaerken den Score (Multi-Hit-Bonus).
Repositories
Jede Collection kann ein oder mehrere GitHub-Repositories zugeordnet bekommen. Wenn ein Ticket aus einem dieser Repos stammt, erhaelt die Collection einen starken Repo-Match-Bonus (Gewicht 3.0x).
Sub-Themen
Innerhalb einer Collection ermoeglichen Sub-Themen eine feingranulare Zuordnung:
subThemes: [
{
name: 'bpmn/timer-events',
keywords: ['timer', 'cron', 'delay'],
docPath: '/engine/bpmn/timer-events',
},
]Das Sub-Thema mit den meisten Keyword-Treffern wird als subTheme im Ergebnis geliefert.
LLM-Provider
Der Slow Path nutzt ein LLM fuer unsichere Klassifikationen (Konfidenz unter dem Fast Path Threshold). Das LLM ist optional — ohne Konfiguration wird immer der regelbasierte Fast Path genutzt.
Konfiguration
{
llm: {
provider: 'openai', // oder 'anthropic'
model: 'gpt-4o-mini', // guenstig, schnell, ausreichend
temperature: 0, // deterministisch
maxTokens: 300, // JSON-Response braucht nicht viel
},
fastPathThreshold: 0.8, // Ab diesem Score kein LLM noetig
}Provider-Vergleich
| Provider | Modell-Empfehlung | Kosten/Ticket | Latenz | Env-Variable |
|---|---|---|---|---|
| OpenAI | gpt-4o-mini | ~0.001 USD | ~500ms | OPENAI_API_KEY |
| Anthropic | claude-haiku-4-5-20251001 | ~0.001 USD | ~600ms | ANTHROPIC_API_KEY |
Ohne LLM-Konfiguration funktioniert der Classifier rein regelbasiert. Das LLM verbessert nur unsichere Faelle (ca. 20-30% der Tickets).
Feedback-Store
Der Feedback-Store speichert Klassifikationen und Korrekturen in einer SQLite-Datenbank mit FTS5-Volltextsuche. Er ermoeglicht das Self-Improvement des Classifiers.
Datenbank-Pfad
| Umgebung | Pfad |
|---|---|
| Produktion (K8s) | /data/qmd/feedback.sqlite |
| Lokal | ./data/qmd/feedback.sqlite |
| Benutzerdefiniert | Ueber FEEDBACK_DB_PATH |
Verhalten
- Die Feedback-DB wird automatisch erstellt, wenn sie nicht existiert
- Sie ist unabhaengig vom Such-Index (
index.sqlite) - Kann geloescht werden, ohne die Suche zu beeintraechtigen — nur gelerntes Feedback geht verloren
- Jede Klassifikation wird gespeichert (fuer spaeteres Feedback)
- Korrekturen werden per
correlationIdzugeordnet
Tabellen
| Tabelle | Zweck |
|---|---|
classifications | Alle Klassifikationen mit Vorhersage + Korrektur |
classifications_fts | FTS5-Index ueber Titel + Body (fuer Textaehnlichkeit) |
Fast Path Threshold
Der Schwellenwert bestimmt, ab welchem Score der Classifier ohne LLM entscheidet:
{
fastPathThreshold: 0.8, // Default
}| Wert | Auswirkung |
|---|---|
| 0.8 (Default) | Guter Kompromiss — ~70-80% der Tickets werden regelbasiert entschieden |
| 0.9 | Konservativer — mehr LLM-Aufrufe, hoehere Genauigkeit |
| 0.6 | Aggressiver — weniger LLM-Aufrufe, hoehere Geschwindigkeit |
Zusaetzlich muss der Abstand zum zweitbesten Kandidaten mindestens 0.2 betragen, damit der Fast Path greift. Bei knappen Entscheidungen wird immer das LLM befragt.
Autorisierung
Lokal (Entwicklung)
Ohne CLASSIFIER_API_KEY und QMD_API_KEY sind alle Endpoints offen.
Produktion (K8s)
Die Keys werden ueber ExternalSecrets aus 1Password geladen:
1Password (docs-prd)
→ ExternalSecret (docs-env-secret)
→ Env-Vars CLASSIFIER_API_KEY, QMD_API_KEY im PodDie jeweiligen Keys muessen als Felder im 1Password-Item docs-prd hinterlegt sein.