Eine Vektordatenbank löst den Retrieval-Teil einer RAG-Pipeline. Aber ein echtes Produkt muss auch Inhalte einlesen (ingest), Anfragen gegen die Datenbank stellen, die Ergebnisse neu ranken (rerank) und schließlich eine Antwort generieren — und das alles muss aus Ihrem eigenen Code heraus aufrufbar sein. Genau dafür haben wir jetzt zwei offizielle Client-Bibliotheken veröffentlicht: liviate-rag-py für Python und liviate-rag-dotnet für .NET.
Beide kapseln dieselbe zugrunde liegende Pipeline – ingest, embed, retrieve, rerank und (optional) generate – in wenigen Zeilen Code, statt dass Sie selbst HTTP-Aufrufe, Authentifizierung und Fehlerbehandlung rund um unsere API aufbauen müssen.
Python: liviate-rag
pip install liviate-rag
from liviate_rag import RAGClient
client = RAGClient(api_key="...") # eller sæt LIVIATE_API_KEY
client.ingest("handbook.pdf", collection="hotel-kirstine")
result = client.query("Har I parkering?", collection="hotel-kirstine", model="anthropic/claude-sonnet-5")
print(result.answer)
print(result.sources)
Wenn Sie selbst steuern möchten, welches Modell die Antwort generiert, können Sie sich auf den Retrieval-Teil beschränken und nur den gerankten Kontext abrufen:
context = client.retrieve("Har I parkering?", collection="hotel-kirstine", top_k=5)
Für asynchronen Code gibt es AsyncRAGClient mit denselben Methodennamen, einsatzbereit für async/await.
ingest() erkennt selbst, ob die Eingabe eine Datei, eine URL, ein reiner Textstring oder ein Stream ist, und unterstützt PDF, DOCX, Markdown, TXT, CSV, JSON und HTML. Soll statt einer einzelnen Datei eine ganze Website gecrawlt werden, gibt es dafür eine separate, explizite Methode: client.ingest_site("https://example.com", collection="x", max_pages=200).
.NET: Liviate.Rag
dotnet add package Liviate.Rag
using Liviate.Rag;
await using var client = new RagClient(); // eller new RagClient(apiKey: "sk-...")
await client.IngestAsync("handbook.pdf", "hotel-kirstine");
var result = await client.QueryAsync("Har I parkering?", "hotel-kirstine", "anthropic/claude-sonnet-5");
Console.WriteLine(result.Answer);
Die .NET-Version ist ein Port der Python-Bibliothek, jedoch mit einem strukturellen Unterschied: Es gibt keinen separaten Sync- und Async-Client. Das eingebaute async/Task von .NET macht diese Trennung überflüssig, sodass alle I/O-Aufrufe auf RagClient als async Task (bzw. IAsyncEnumerable für gestreamte Generierung) implementiert sind.
Dasselbe Retrieval-only-Muster gibt es auch hier:
var context = await client.RetrieveAsync("Har I parkering?", "hotel-kirstine", topK: 5);
Für einen Ingest, der während der Ausführung nicht blockieren soll, gibt es StartIngest, das sofort ein IngestJob zurückgibt, statt auf dessen Abschluss zu warten.
Ehrlich zum aktuellen Stand
Die beiden Bibliotheken sind nicht gleich weit. Die Python-Version ist ein v1-Scaffold, aufgebaut auf plausiblen Annahmen zu einigen der Request- und Response-Formate, wobei ein paar Verträge gegenüber dem Backend selbst noch nicht endgültig bestätigt sind – das ist im Code direkt mit Kommentaren markiert, wo es relevant ist.
Der .NET-Port entstand später und wurde direkt gegen Verträge gebaut, die bereits live in Produktion bestätigt waren: Ingest → Retrieve → Query sind alle end-to-end gegen die echte Pipeline verifiziert, nicht nur gegen ein Mock. Dafür ist IngestSiteAsync in .NET noch nicht implementiert – es wirft eine NotImplementedException. Soll heute von .NET aus eine ganze Website gecrawlt werden, geschieht das stattdessen, indem IngestAsync mit einer Liste einzelner Seiten-URLs aufgerufen wird.
Beide Bibliotheken sind Open Source, und beide nehmen Issues und PRs entgegen.
Wo das hineinpasst
Die Bibliotheken decken die eigentliche Aufruf-Schicht ab. Was sie aufrufen, ist dieselbe verwaltete Vektordatenbank und RAG-Pipeline, über die wir bereits geschrieben haben – Skalierung, Indexierung und Isolation zwischen Kunden werden für Sie übernommen, ohne dass Sie die dahinterliegende Datenbank selbst betreiben müssen.
Bauen Sie gerade etwas, das Ihre eigenen Inhalte einlesen und darauf basierend antworten soll? Schreiben Sie uns, und lassen Sie uns besprechen, wo Sie starten könnten.