TYPO3-Extension · nr-llm

Ein LLM-Setup. Jede Extension. Volle Admin-Kontrolle.

nr-llm ist gemeinsame KI-Infrastruktur für TYPO3 — wie das Caching-Framework, nur für Sprachmodelle. Administratoren konfigurieren die Provider einmalig im Backend; jede KI-gestützte Extension der Website nutzt sie automatisch. Unterstützt OpenAI, Anthropic Claude, Google Gemini, Ollama und weitere.

Unterstützte Anbieter
OpenAI Anthropic Claude Google Gemini Mistral AI Ollama + Groq, OpenRouter, Azure OpenAI

Das Problem

Jede TYPO3-Extension, die heute KI-Funktionen möchte, muss dieselben Infrastrukturprobleme selbst lösen. Betreibt eine Website drei KI-Extensions, bedeutet das drei getrennte API-Key-Konfigurationen, drei Stellen zur Fehlersuche und keine Möglichkeit, den Provider global zu wechseln.

  • Eine eigene Provider-Anbindung bauen — HTTP-Aufrufe, Authentifizierung, Fehlerbehandlung, Streaming
  • API-Keys auf eigene Weise speichern, oft als Klartext in den Extension-Einstellungen
  • Eine eigene Backend-Oberfläche zur Konfiguration erstellen
  • Administratoren ohne zentralen Überblick über KI-Nutzung oder Kosten lassen

Die Lösung

nr-llm liefert die fehlende gemeinsame Schicht zwischen den Extensions und den LLM-Providern. Extension-Entwickler ergänzen KI in wenigen Zeilen Dependency Injection; Administratoren verwalten jede Verbindung, jeden Key und jedes Budget in einem einzigen Backend-Modul.

Extensions binden eine einzige Service-Schnittstelle ein und rufen Methoden für Chat, Completion, Übersetzung, Vision, Embeddings, Streaming und Tool Calling auf. Provider-Auswahl, API-Keys, Caching und Fehlerbehandlung übernimmt nr-llm.

Darunter bildet eine Provider-Abstraktionsschicht eine gemeinsame Schnittstelle auf OpenAI, Anthropic, Gemini, Ollama, OpenRouter, Mistral, Groq, Azure OpenAI und jeden OpenAI-kompatiblen Endpunkt ab. Der Provider-Wechsel ist eine Admin-Einstellung, keine Code-Änderung.

Das Backend-Modul Admin-Werkzeuge > LLM enthält verschlüsselte Keys, Nutzungs- und Kostenerfassung, benutzerbezogene Budgets und einen Einrichtungsassistenten — beschränkt auf Administratoren.

Deine Extensions Cowriter · SEO Assistant · …
nr-llm Service-Ebene Chat · Translation · Vision · Embeddings · Streaming · Tools · Caching
Provider-Abstraktion OpenAI · Anthropic · Gemini · Ollama · Mistral · Groq · …
Admin Tools > LLM Verschlüsselte Schlüssel · Nutzung/Kosten · Setup-Wizard
Extensions rufen die Service-Schicht von nr-llm auf (Chat, Übersetzung, Vision, Embeddings, Streaming, Tool Calling, Caching), die auf einer Provider-Abstraktionsschicht aufsetzt (OpenAI, Anthropic, Gemini, Ollama und weitere) und vom Backend-Modul Admin-Werkzeuge > LLM mit verschlüsselten Keys, Nutzungserfassung und Einrichtungsassistent gestützt wird.

Kernkonzepte

nr-llm ist um wenige Bausteine herum aufgebaut. Jeder löst ein Problem, das man sonst in jeder KI-Extension neu implementieren müsste.

Provider-Abstraktion

Alle Provider implementieren eine gemeinsame Schnittstelle. OpenAI, Anthropic Claude, Google Gemini, Ollama, OpenRouter, Mistral, Groq, Azure OpenAI und jeder OpenAI-kompatible Endpunkt (vLLM, LocalAI, LiteLLM) sind über dieselben Service-Aufrufe erreichbar. Der Provider-Wechsel erfolgt über eine einzige Konfigurationsänderung — ohne Code-Änderungen, ohne Vendor-Lock-in.

Zum Deep-Dive →

Verschlüsselte API-Keys über nr-vault

Jeder API-Key wird als Vault-Identifier (UUID) über die Envelope-Verschlüsselung von nr-vault gespeichert. nr-llm speichert oder protokolliert Rohschlüssel nie im Klartext. Fehlermeldungen werden bereinigt, sodass geheimnistragende Query-Parameter entfernt werden, bevor etwas protokolliert wird.

Zum Deep-Dive →

Dreistufige Konfiguration

Ein Provider hält einen Endpunkt, einen verschlüsselten Key und einen Adapter-Typ. Ein Model verweist auf einen Provider und definiert dessen Model-ID, Fähigkeiten und Preise. Eine Configuration verweist auf ein Model und ergänzt Einstellungen für den Anwendungsfall — System-Prompt, Temperatur, Token-Limits. So lassen sich mehrere Keys pro Provider vorhalten (Prod/Dev/Backup) und Model-Definitionen über Anwendungsfälle hinweg wiederverwenden.

Feature-Services

High-Level-Services decken gängige Aufgaben ab: CompletionService für Textgenerierung mit Steuerung von Format und Kreativität, TranslationService mit Unterstützung für Förmlichkeit und Glossar, VisionService für Alt-Texte und Bildanalyse sowie EmbeddingService für die Umwandlung von Text in Vektoren samt Ähnlichkeitsberechnung.

Streaming und Tool Calling

Antworten lassen sich Chunk für Chunk streamen — mit einer einzigen foreach-Schleife über streamChat() für Echtzeit-Oberflächen. Tool-/Function-Calling lässt das Model Funktionen anfragen, die der eigene Code ausführt, über chatWithTools() — die Antwort meldet, welche Tools aufgerufen wurden, sodass sie sich verarbeiten lassen.

Zum Deep-Dive →

RAG-Werkzeuge für die Website-Suche

41 eingebaute, schreibgeschützte Function-Calling-Tools in 8 umschaltbaren Gruppen geben dem Model fundierten Zugriff auf die TYPO3-Instanz — Inhaltssuche, TCA-/FlexForm-Schema, TypoScript, Quellcode- und Exception-Zugriff, FAL-Dateien, Diagnose und Backend-Konten. Die Gruppe rag liefert belegte Website-Inhalte aus dem installierten Suchindex (EXT:solr, ke_search, indexed_search oder einer Datenbank als Fallback).

Zum Deep-Dive →

Benutzerbezogene Budgets und Nutzungserfassung

Die Ausgaben pro Backend-Benutzer lassen sich über alle Presets hinweg nach Anfragen, Tokens oder geschätzten Kosten begrenzen — täglich oder monatlich. Die Analytics-Ansicht zeigt Kosten- und Nutzungstrends mit Aufschlüsselung nach Provider, Model und Service sowie den Verbrauch pro Benutzer gegenüber den Monatsbudgets.

Integration in das TYPO3-Caching-Framework

Antworten werden automatisch über das Caching-Framework von TYPO3 zwischengespeichert — mit dem Backend, das die Instanz konfiguriert (Redis, Valkey, Memcached oder dem Standard). Embedding-Ergebnisse werden deterministisch zwischengespeichert, standardmäßig 24 Stunden, und die Cache-Lebensdauer lässt sich pro Operationstyp konfigurieren.

Für wen es gedacht ist

nr-llm bedient drei Zielgruppen auf derselben gemeinsamen Grundlage.

Extension-Entwickler

KI-Funktionen ergänzen, ohne Provider-Anbindungen zu bauen, API-Keys zu verwalten oder Caching und Streaming zu implementieren. Eine Service-Schnittstelle einbinden und aufrufen. Eigene Provider registrieren, wenn nötig.

TYPO3-Administratoren

Jede KI-Verbindung, jeden verschlüsselten Key und jede Provider-Konfiguration aus einem einzigen Backend-Modul verwalten. Von OpenAI zu Anthropic wechseln, ohne Extension-Code anzufassen. Benutzerbezogene Budgets setzen und Kosten und Nutzung in einem Dashboard verfolgen.

Agenturen und Solution Architects

Den Integrationsaufwand über Kundenprojekte hinweg senken — mit einer einheitlichen KI-Architektur und ohne Vendor-Lock-in. Verschlüsselte Keys, ausschließlich administrativer Zugriff sowie SBOM und SLSA-Provenance bei jedem Release unterstützen die Compliance. Ollama bietet eine Local-First-Option für datensensible Umgebungen.

Entwickler

Kickstart für Entwickler

KI in wenigen Minuten in die eigene TYPO3-Extension ergänzen — ohne API-Key-Handhabung, ohne HTTP-Client-Code, ohne providerspezifische Logik.

Das Paket einbinden

Über Composer installieren. Anschließend in Admin-Werkzeuge > Erweiterungen aktivieren und Admin-Werkzeuge > LLM > Einrichtungsassistent ausführen.

bash
composer require netresearch/nr-llm

Den benötigten Service einbinden

LlmServiceManagerInterface per Constructor Promotion einbinden und aufrufen. Provider-Auswahl, API-Keys, Caching und Fehlerbehandlung übernimmt nr-llm.

php
use Netresearch\NrLlm\Service\LlmServiceManagerInterface;

class MyController
{
    public function __construct(
        private readonly LlmServiceManagerInterface $llm,
    ) {}

    public function summarizeAction(string $text): string
    {
        return $this->llm->complete("Summarize: {$text}")->content;
    }
}

Die benötigten Services nutzen

Chat, Completion, Streaming, Embeddings und Tool-Calling sind Methoden der injizierten LlmServiceManagerInterface. Übersetzung und Vision-Alt-Text sind eigene Feature-Services — injiziere sie genauso. Tool-Calling ist eine Schleife aus Anfrage, Ausführung und Antwort; das vollständige Beispiel steht im Deep-Dive „Streaming & Tool-Calling“.

php
use Netresearch\NrLlm\Domain\ValueObject\ChatMessage;

$messages = [
    ChatMessage::system('You are a helpful TYPO3 assistant.'),
    ChatMessage::user('Explain TYPO3 content elements in one paragraph.'),
];

// Chat & completion (LlmServiceManagerInterface)
$answer = $this->llm->chat($messages)->content;
$answer = $this->llm->complete('Summarize the TYPO3 release cycle.')->content;

// Streaming — yields string chunks
foreach ($this->llm->streamChat($messages) as $chunk) {
    echo $chunk;
}

// Embeddings — EmbeddingResponse carries the vector
$embedding = $this->llm->embed('semantic search query');

// Translation — dedicated service, returns a TranslationResult
$german = $this->translationService->translate('Hello world', 'de')->getText();

// Vision alt-text — dedicated service
$altText = $this->visionService->generateAltText($imageUrl);

Fehler mit typisierten Exceptions behandeln

Jeder Provider-Fehler ist eine typisierte Exception. Fange die ab, die dich interessieren, und zeige eine freundliche Meldung; die Fallback-Kette und die Retries sind bereits gelaufen, bevor diese auftauchen.

php
use Netresearch\NrLlm\Exception\BudgetExceededException;
use Netresearch\NrLlm\Provider\Exception\ProviderRateLimitException;
use Netresearch\NrLlm\Provider\Exception\ProviderConnectionException;
use Netresearch\NrLlm\Provider\Exception\FallbackChainExhaustedException;
use Netresearch\NrLlm\Provider\Exception\ProviderResponseException;

try {
    return $this->llm->complete("Summarize: {$text}")->content;
} catch (BudgetExceededException) {
    return 'The AI budget for this account is exhausted.';
} catch (ProviderRateLimitException) {
    return 'The AI provider is rate-limiting requests. Please retry shortly.';
} catch (FallbackChainExhaustedException | ProviderConnectionException) {
    return 'Could not reach any AI provider right now.';
} catch (ProviderResponseException $e) {
    $this->logger->warning('LLM provider error', ['status' => $e->httpStatus]);
    return 'The AI service returned an error.';
}

Ausgabe steuern und strukturiertes JSON erhalten

ChatOptions liefert abgestimmte Presets — factual, creative, balanced, json, code — plus fluente Overrides. CompletionService::completeJson() gibt ein dekodiertes Array zurück, sodass du Felder direkt ausliest.

php
use Netresearch\NrLlm\Service\Option\ChatOptions;

// Deterministic output, capped length
$options = ChatOptions::factual()->withMaxTokens(200);
$summary = $this->llm->complete('Summarize the changelog.', $options)->content;

// Decoded JSON straight from the model
$data = $this->completionService->completeJson(
    'Return {"title": ..., "tags": [...]} for this article: ' . $article,
);
$title = $data['title'];

Für Admins

Für Administratoren

Das Backend-Modul Admin-Werkzeuge > LLM gibt Administratoren die volle Kontrolle über KI auf der Website — Provider, Models, Configurations, Budgets und Analytics an einem Ort.

Providers, Models, Configurations

API-Verbindungen registrieren (OpenAI, Anthropic, Gemini, Ollama und weitere), festlegen, welche Models verfügbar sind und welche Fähigkeiten sie haben, und Presets für Anwendungsfälle mit Temperatur, System-Prompts und Token-Limits erstellen.

Einrichtungsassistent

Der Einrichtungsassistent erkennt den Provider-Typ automatisch anhand der Endpunkt-URL, ermittelt verfügbare Models und erzeugt in fünf geführten Schritten eine einsatzbereite Configuration. API-Key einfügen und loslegen.

KI-gestützte Assistenten

Der Task-Assistent und der Konfigurationsassistent erzeugen vollständige Tasks und Configurations — System-Prompt, Parameter und Model-Empfehlung — aus einer Beschreibung in normaler Sprache. Eine Schaltfläche „Models abrufen“ füllt Fähigkeiten und Preise automatisch aus der Provider-API.

Benutzerbudgets und Analytics

Die Ausgaben pro Backend-Benutzer nach Anfragen, Tokens oder Kosten begrenzen — täglich oder monatlich über alle Presets hinweg. Die Analytics-Ansicht zeigt geschätzte Kosten- und Nutzungstrends mit Aufschlüsselung nach Provider, Model und Service sowie den Verbrauch pro Benutzer gegenüber den Budgets.

Tools und RAG

41 schreibgeschützte Function-Calling-Tools in 8 umschaltbaren Gruppen lassen Models Inhalte, Schema, Konfiguration, Code, Dateien, Systemdiagnose und Konten inspizieren — wobei die Gruppe rag belegte Evidenz aus dem installierten Suchindex liefert.

Tool-Playground

Der ausschließlich Administratoren vorbehaltene Playground führt die begrenzte Agent-Schleife gegen jede Configuration aus und streamt den gesamten Dialog live — jede Anfrage, jede Antwort und jede Tool-Ausführung — samt Dry-Run-Modus, der den exakten Prompt zeigt, ohne das Model aufzurufen.

Ausfallsicherheit und Sicherheit

Configurations können Fallback-Configurations auflisten, die bei Verbindungsfehlern, HTTP-5xx oder Rate-Limits erneut versucht werden. Fähigkeitsbezogene Berechtigungen bilden sich auf native TYPO3-Backend-Gruppenoptionen ab. Keys werden über nr-vault verschlüsselt gespeichert, und das Modul ist auf Administratoren beschränkt.

On-Device-KI

nr-llm fragen

Stelle eine Frage zu nr-llm. Die Antwort entsteht vollständig in deinem Browser über die eingebaute KI von Chrome (Gemini Nano) und stützt sich auf die Inhalte dieser Website.

Architektur

Architektur

nr-llm nutzt eine dreistufige Konfigurationshierarchie, die Zuständigkeiten sauber trennt. Eine Configuration (Einstellungen für den Anwendungsfall wie System-Prompt, Temperatur und maximale Tokens) verweist auf ein Model (Model-ID, Fähigkeiten, Preise), das auf einen Provider verweist (Endpunkt, verschlüsselter API-Key, Adapter-Typ). So lassen sich mehrere API-Keys pro Provider-Typ vorhalten, eigene Endpunkte wie Azure OpenAI oder eine lokale Ollama- oder vLLM-Instanz ansprechen und Model-Definitionen über Configurations hinweg wiederverwenden. Anfragen durchlaufen eine Middleware-Pipeline, die Fallback-Ketten durchsetzt und die Nutzung nach jedem erfolgreichen Aufruf erfasst. Die Extension setzt PHP 8.2+ und TYPO3 v13.4 LTS oder v14.3 LTS voraus, mit einem PSR-18-HTTP-Client.

Architektur-Entscheidungen lesen (89)

Häufig gestellte Fragen

Welche TYPO3- und PHP-Versionen werden unterstützt?

TYPO3 v13.4 LTS oder v14.3 LTS und PHP 8.2 oder höher. Zusätzlich ist ein PSR-18-kompatibler HTTP-Client (etwa guzzlehttp/guzzle) erforderlich. Die Extension befindet sich derzeit in der Beta-Phase (Version 0.22.0).

Welche KI-Provider kann ich nutzen?

OpenAI, Anthropic Claude, Google Gemini, Ollama, OpenRouter, Mistral, Groq, Azure OpenAI und jeden OpenAI-kompatiblen Endpunkt (vLLM, LocalAI, LiteLLM). Die Fähigkeiten unterscheiden sich je nach Provider — so unterstützen etwa OpenAI, Gemini und OpenRouter Chat, Embeddings, Vision, Streaming und Tools, während Groq auf schnellen Chat und Streaming ausgerichtet ist.

Wo werden die API-Keys gespeichert?

Keys werden als Vault-Identifier (UUIDs) über die Envelope-Verschlüsselung von nr-vault gespeichert. nr-llm speichert oder protokolliert Rohschlüssel nie im Klartext, und das Backend-Modul ist auf Administratoren beschränkt. nr-vault ist eine erforderliche Abhängigkeit.

Ist es kostenlos und Open Source?

Ja. nr-llm steht unter der Lizenz GPL-2.0-or-later und wird von der Netresearch DTT GmbH entwickelt. Der Quellcode liegt auf GitHub, das Paket auf Packagist.

Funktioniert es offline mit Ollama?

Ja. Ollama führt Models lokal aus und benötigt keinen API-Key, sodass KI-Funktionen arbeiten können, ohne Daten an externe APIs zu senden — eine Local-First-Option für datensensible Umgebungen. Ollama unterstützt Chat, Embeddings und Streaming.

Wie ergänze ich KI in meiner eigenen Extension?

netresearch/nr-llm über Composer einbinden, LlmServiceManagerInterface (oder einen bestimmten Feature-Service) injizieren und dessen Methoden für Chat, Completion, Übersetzung, Vision, Embeddings, Streaming oder Tool Calling aufrufen. Zudem lassen sich eigene Provider registrieren. Siehe die Entwickler- und Integrationshandbücher.

Wie kontrolliere ich die Kosten?

Benutzerbezogene Budgets setzen, die die Ausgaben nach Anfragen, Tokens oder geschätzten Kosten begrenzen — täglich oder monatlich über alle Presets hinweg. Das Antwort-Caching über das TYPO3-Caching-Framework reduziert wiederholte Aufrufe, und die Analytics-Ansicht erfasst geschätzte Kosten und Nutzung pro Provider, Model, Service und Benutzer.

Wie steht es um den Datenschutz?

Der Provider ist frei wählbar, einschließlich einer lokalen Ollama-Instanz, die die Daten auf der eigenen Infrastruktur hält. Keys werden verschlüsselt gespeichert, der Zugriff ist auf Administratoren beschränkt, und Fehlermeldungen werden um Geheimnisse bereinigt. LLM-Antworten sind wie nicht vertrauenswürdige Inhalte zu behandeln, und Benutzereingaben sind vor dem Senden zu bereinigen — wie bei jeder KI-Integration.

Kann ich Provider ohne Code-Änderung wechseln?

Ja. Alle Provider implementieren eine gemeinsame Schnittstelle, sodass der Wechsel von OpenAI zu Anthropic oder zu einem lokalen Model eine Konfigurationsänderung im Backend ist, keine Code-Änderung. Configurations können zudem Fallback-Configurations auflisten, die bei Verbindungsfehlern, HTTP-5xx oder Rate-Limits erneut versucht werden.

Warum nr-llm nutzen statt ein Provider-SDK direkt aufzurufen?

Eine Eigenlösung bedeutet, Schlüsselverschlüsselung, Provider-Wechsel, Caching, Streaming, Tool-Calling, Kostenerfassung, Budgets, Guardrails und Fehlerbehandlung in jeder Extension neu zu bauen — und einen Anbieter fest zu verdrahten. nr-llm bündelt all das einmal, sodass Administratoren Provider und Keys in einem Backend-Modul verwalten und jede Extension der Website sie ohne Vendor-Lock-in wiederverwendet.

Ist nr-llm DSGVO-freundlich, und kann ich Daten in der EU halten?

Du wählst den Provider je Konfiguration. Ein lokal betriebenes Ollama oder ein anderer OpenAI-kompatibler Endpoint hält alle Prompt-Daten auf deiner eigenen Infrastruktur, ohne externe API-Aufrufe; bei gehosteten Providern kannst du EU-Region-Endpoints wie Azure OpenAI wählen. API-Keys sind über nr-vault verschlüsselt gespeichert, der Zugriff ist nur für Administratoren, und Fehlermeldungen werden um Secrets bereinigt.

Wie unterscheidet sich nr-llm von anderen TYPO3-KI-Extensions?

nr-llm ist kein Endnutzer-KI-Feature — es ist gemeinsame Infrastruktur, wie das TYPO3-Caching-Framework, auf der andere Extensions aufbauen. Es liefert eine Provider-Abstraktion über sieben und mehr Provider, verschlüsselte Schlüsselspeicherung und typisierte Dienste statt eines einzelnen gebündelten Anwendungsfalls.

Welche Governance- und Sicherheitskontrollen bietet nr-llm?

Verschlüsselte API-Keys über nr-vault, ein Backend-Modul nur für Administratoren mit kapabilitätsbezogenen Berechtigungen über Backend-Gruppen, eine Guardrail-Pipeline, die Secrets über Eingabe, Ausgabe und Streaming maskiert, optionale Human-in-the-Loop-Freigabe sowie Budgets pro Benutzer mit Nutzungsanalyse. Alle 41 Built-in-Tools sind nur lesend. Die Seite „Governance & Sicherheit“ beschreibt jede Kontrolle im Detail.