Indexer & Plugins
Der Indexer erstellt und aktualisiert den Such-Index. Content-Sources werden ueber ein Plugin-System geladen.
Collections
Jede Collection ist ein benannter Bereich im Index mit eigenem Pfad und Pattern:
const indexer = createIndexer({
dbPath: './data/index.sqlite',
collections: [
{ name: 'docs', path: './content', pattern: '**/*.md', context: 'Dokumentation', group: 'Platform' },
{ name: 'blog', path: './blog', pattern: '**/*.mdx', context: 'Blog-Artikel', group: 'Allgemein' },
{ name: 'changelogs', path: './changelogs', pattern: '**/*.md', context: 'Release Notes', group: 'Changelogs' },
],
plugins: [filesystemSource, githubSource],
});| Feld | Beschreibung |
|---|---|
name | Eindeutiger Name (fuer Filter in der Suche) |
path | Pfad zum Quellverzeichnis |
pattern | Glob-Pattern fuer Dateien |
context | Beschreibung fuer LLM-Suche |
group | Gruppierung (fuer UI-Filter) |
Built-in Plugins
Filesystem-Source
Liest lokale Dateien aus einem Verzeichnis:
{ plugin: 'filesystem', config: {
path: './docs',
pattern: '**/*.md',
collection: 'docs',
}}GitHub-Source
Laedt Dateien von GitHub-Repositories:
// Einzeldateien
{ plugin: 'github', config: {
collection: 'changelogs',
files: [
{ owner: 'org', repo: 'repo-a', branch: 'main', path: 'CHANGELOG.md', outputName: 'repo-a.md' },
],
}}
// Zwei Dateien mergen (z.B. Changelog + Dev-Changelog)
{ plugin: 'github', config: {
collection: 'changelogs',
mergeFiles: [
{
primary: { owner: 'org', repo: 'repo', branch: 'main', path: 'Changelog.md' },
secondary: { owner: 'org', repo: 'repo', branch: 'main', path: 'Changelog-Dev.md' },
outputName: 'repo.md',
label: 'Repo',
},
],
}}
// Verzeichnis auflisten
{ plugin: 'github', config: {
collection: 'faq',
directories: [
{ owner: 'org', repo: 'repo', branch: 'main', path: 'faq/', outputPrefix: 'faq', label: 'FAQ' },
],
}}Das GitHub-Plugin benoetigt einen Token (GITHUB_TOKEN Env-Var oder config.token).
Embeddings
Fuer Hybrid-Suche koennen beim Indexieren Vektor-Embeddings generiert werden:
const indexer = createIndexer({
// ...
embedProvider: {
provider: 'voyage', // oder 'openai'
apiKey: process.env.VOYAGE_API_KEY,
domainContext: 'eine technische Dokumentation',
maxRetries: 5,
retryBaseMs: 3000,
},
skipEmbed: false, // Default
});Der Indexer nutzt Delta-Erkennung — nur geaenderte Dokumente werden neu embedded.
Callbacks
await indexer.run({
onUpdateProgress: (info) => {
console.log(`${info.collection}: ${info.current}/${info.total}`);
},
onEmbedProgress: (info) => {
console.log(`Embedding: ${info.chunksEmbedded}/${info.totalChunks}`);
},
});