Konfiguration¶
Alle Einstellungen befinden sich in der Erweiterungskonfiguration: Admin Tools → Settings → Extension Configuration → nt_ai.
Werte lassen sich auch je Umgebung über den Standard-TYPO3-Mechanismus in config/system/settings.php überschreiben:
Für Geheimnisse können Umgebungsvariablen-Platzhalter direkt im Erweiterungskonfigurationsformular verwendet werden:
provider.anthropic.apiKey = %env(NT_AI_ANTHROPIC_KEY)%
provider.openai.apiKey = %env(NT_AI_OPENAI_KEY)%
nt-ai löst diese zur Laufzeit über getenv() auf.
Anbieter-Einstellungen¶
provider.default legt fest, welcher Anbieter verwendet wird, wenn bei einem Aufruf kein Anbieter angegeben ist. Mögliche Werte: anthropic, openai, gemini, deepseek, mistral, groq, ollama.
Anthropic Claude¶
| Einstellung | Typ | Standard | Beschreibung |
|---|---|---|---|
provider.anthropic.apiKey |
string | (leer) | API-Schlüssel von console.anthropic.com. Erforderlich zur Nutzung von Claude. Unterstützt %env(VAR)%-Platzhalter. |
provider.anthropic.model |
string | claude-sonnet-4-5 |
Modell-Bezeichner. Beispiele: claude-opus-4-5, claude-haiku-4-5. Vision wird bei allen Claude-3+- und 4+-Modellen unterstützt. |
provider.anthropic.baseUrl |
string | https://api.anthropic.com/v1 |
Nur überschreiben, wenn Anthropic über eine eigene Infrastruktur als Proxy betrieben wird. |
OpenAI¶
| Einstellung | Typ | Standard | Beschreibung |
|---|---|---|---|
provider.openai.apiKey |
string | (leer) | API-Schlüssel von platform.openai.com. Erforderlich zur Nutzung von OpenAI. |
provider.openai.model |
string | gpt-4o-mini |
Beispiele: gpt-4o, gpt-4o-mini, gpt-4-turbo. Für die Alt-Text-Generierung ein Vision-Modell verwenden (gpt-4o, gpt-4o-mini). |
provider.openai.baseUrl |
string | https://api.openai.com/v1 |
Überschreiben für Azure OpenAI, OpenRouter, LM Studio oder andere OpenAI-API-kompatible Endpunkte. |
Google Gemini¶
| Einstellung | Typ | Standard | Beschreibung |
|---|---|---|---|
provider.gemini.apiKey |
string | (leer) | API-Schlüssel von aistudio.google.com. Erforderlich zur Nutzung von Gemini. |
provider.gemini.model |
string | gemini-2.0-flash |
Beispiele: gemini-2.5-pro, gemini-2.0-flash, gemini-1.5-flash. Alle aufgeführten Modelle unterstützen Vision. |
provider.gemini.baseUrl |
string | https://generativelanguage.googleapis.com/v1beta |
Überschreiben bei Proxy-Setups. |
DeepSeek¶
| Einstellung | Typ | Standard | Beschreibung |
|---|---|---|---|
provider.deepseek.apiKey |
string | (leer) | API-Schlüssel von platform.deepseek.com. Erforderlich zur Nutzung von DeepSeek. |
provider.deepseek.model |
string | deepseek-chat |
deepseek-chat = DeepSeek-V3 (allgemein), deepseek-reasoner = R1 (Chain-of-Thought). Keines der Modelle unterstützt Vision. |
provider.deepseek.baseUrl |
string | https://api.deepseek.com/v1 |
Überschreiben bei Proxy-Setups. |
Mistral AI¶
| Einstellung | Typ | Standard | Beschreibung |
|---|---|---|---|
provider.mistral.apiKey |
string | (leer) | API-Schlüssel von console.mistral.ai. |
provider.mistral.model |
string | mistral-small-latest |
Beispiele: mistral-large-latest, pixtral-large-latest (Vision). Vision ist nur bei pixtral-*-Modellen verfügbar. |
provider.mistral.baseUrl |
string | https://api.mistral.ai/v1 |
Überschreiben bei Proxy-Setups. |
Groq¶
| Einstellung | Typ | Standard | Beschreibung |
|---|---|---|---|
provider.groq.apiKey |
string | (leer) | API-Schlüssel von console.groq.com. |
provider.groq.model |
string | llama-3.3-70b-versatile |
Beispiele: llama-3.1-8b-instant, gemma2-9b-it. Groq unterstützt kein Vision. |
provider.groq.baseUrl |
string | https://api.groq.com/openai/v1 |
Überschreiben bei Proxy-Setups. |
Ollama (lokal)¶
| Einstellung | Typ | Standard | Beschreibung |
|---|---|---|---|
provider.ollama.baseUrl |
string | http://localhost:11434 |
URL der Ollama-Instanz. Bei getrennten Containern für TYPO3 und Ollama die container-interne URL verwenden (z. B. http://host.docker.internal:11434). |
provider.ollama.model |
string | llama3.2 |
Lokal installierter Modellname. Für Vision-Funktionen zuerst ein multimodales Modell installieren: ollama pull llama3.2-vision |
Verhalten¶
| Einstellung | Typ | Standard | Beschreibung |
|---|---|---|---|
behavior.timeout |
integer (Sekunden) | 60 |
Maximale Wartezeit für KI-Anfragen. Bei sehr langsamen lokalen Modellen erhöhen. |
behavior.maxTokens |
integer | 2048 |
Maximale Token pro Antwort. Gilt für alle Anbieter. |
behavior.logRequests |
boolean | aus | Wenn aktiv, wird jeder KI-Aufruf über den Standard-TYPO3-Logger protokolliert. Hilfreich zum Debuggen, kann jedoch sensible Prompt-Inhalte in Log-Dateien schreiben. Im Produktivbetrieb deaktiviert lassen. |
behavior.defaultLanguage |
string (ISO 639-1) | en |
Wird verwendet, wenn bei einem Aufruf keine Sprache angegeben ist. Beeinflusst Inhaltserstellung, Übersetzungen und Alt-Texte. |
Alt-Text-Anpassung¶
Diese Einstellungen formen die von der KI erzeugten Alt-Texte so, dass sie zur Tonalität und Barrierefreiheitsrichtlinie Ihrer Website passen. Die Einstellungen gelten für jede Alt-Text-Generierung, einschließlich Massen-CLI-Läufen und den „Alt-Text generieren"-Schaltflächen.
| Einstellung | Typ | Standard | Beschreibung |
|---|---|---|---|
altText.customInstructions |
mehrzeiliger Text | (leer) | Freiformige zusätzliche Regeln für die KI. Eine Anweisung pro Zeile. Werden wörtlich an den System-Prompt angehängt. |
altText.maxLength |
integer | 125 |
Weiche Obergrenze für die Alt-Text-Länge in Zeichen. 0 deaktiviert die Begrenzung. Die KI wird angewiesen, das Limit einzuhalten; die Ausgabe wird zusätzlich hart an Wortgrenzen gekürzt, falls das Modell es überschreitet. WCAG-/Screenreader-Best-Practice liegt bei ca. 125 Zeichen. |
altText.style |
enum | concise |
concise — ein kurzer Satz. descriptive — 1–2 Sätze. detailed — 2–3 Sätze, geeignet für Diagramme und Inhaltsbilder. |
altText.forbidImagePrefix |
boolean | an | Entfernt Formulierungen wie „Bild von…", „Abbildung zeigt…", „Image of…" aus dem Prompt und defensiv aus der Antwort. Screenreader kündigen Grafiken bereits an, solche Präfixe sind daher überflüssig. |
altText.includeDetectedText |
boolean | an | Die KI transkribiert sichtbaren Text im Bild (Schilder, Screenshots, Beschriftungen, Verpackungen). Wichtig für die Barrierefreiheit — Text in Bildern ist für Screenreader-Nutzer sonst nicht zugänglich. |
altText.tone |
string | neutral, factual |
Freiformige Tonbeschreibung. Beispiele: friendly, casual (Blogs), marketing, enthusiastic (Landingpages), technical, precise (Dokumentation). |
altText.brandContext |
string (max. 500 Zeichen) | (leer) | Ein kurzer Hinweis zu Ihrer Website oder Marke, der jeder Alt-Text-Anfrage beigefügt wird. Nützlich für kontextsensitive Beschreibungen. |
Strikte Alt-Text-Richtlinie — deutsches Kunstmuseum
altText.style = descriptive
altText.maxLength = 200
altText.tone = neutral, sachlich
altText.brandContext = Museum für moderne Kunst. Bildbeschreibungen für ein Fachpublikum, Künstlernamen nur wenn klar erkennbar.
altText.customInstructions:
Bei Kunstwerken: Stil, Material und ungefähre Epoche nennen.
Personen nur als "Besucher", "Mitarbeiter" o.ä. bezeichnen.
Texttafeln und Beschriftungen wörtlich übernehmen.
Audit-Einstellungen¶
| Einstellung | Typ | Standard | Beschreibung |
|---|---|---|---|
audit.enabled |
boolean | an | Hauptschalter für das Barrierefreiheits-Audit-Backend-Modul. |
audit.autoOnSave |
boolean | aus | Wenn aktiv, wird nach jedem Speichern einer Seite im Backend automatisch ein Audit ausgelöst (durch audit.autoCooldown ratenbegrenzt). |
audit.autoCooldown |
integer (Sekunden) | 120 |
Mindestabstand zwischen automatischen Audits für dieselbe Seite. Verhindert Audit-Stürme bei schnellem Speichern durch Redakteure. |
audit.aiRules |
boolean | an | Legt fest, ob KI-gestützte Audit-Regeln ausgeführt werden. Bei Deaktivierung laufen nur deterministische regelbasierte Prüfungen. KI-Regeln werden auch automatisch übersprungen, wenn kein Anbieter konfiguriert ist. |
audit.retentionDays |
integer (Tage) | 90 |
Audit-Berichte, die älter als dieser Wert sind, können über den Standard-TYPO3-Garbage-Collection-Task gelöscht werden. 0 deaktiviert die Bereinigung. |
audit.maxReportsPerPage |
integer | 10 |
Maximale Anzahl gespeicherter Berichte pro Seite. Ältere Berichte werden nach jedem neuen Audit-Lauf automatisch bereinigt. |
audit.explainPrompt |
mehrzeiliger Text | (integriert) | Benutzerdefinierte Prompt-Vorlage für KI-generierte Befund-Erläuterungen. Verfügbare Platzhalter: {ruleId}, {severity}, {message}, {wcagReference}, {snippet}. |
Barrierefreiheitserklärung¶
Angaben für den Reiter „Erklärung" im Audit-Modul, der aus den Audit-Daten einen Entwurf einer Erklärung zur Barrierefreiheit erzeugt (siehe Benutzerhandbuch → „Barrierefreiheitserklärung erstellen").
| Einstellung | Typ | Standard | Beschreibung |
|---|---|---|---|
declaration.targetPageUid |
integer | 0 |
Zielseite, auf der die Erklärung veröffentlicht wird. 0 = automatisch die Seite mit dem Slug /barrierefreiheit. |
declaration.organisation |
string | (leer) | Name der Organisation in der Erklärung. Leer = Website-Titel aus der Site-Konfiguration. |
declaration.feedbackContact |
Text | (leer) | Ansprechpartner für Barrierefreiheits-Feedback (Name, E-Mail, Telefon). Pflichtangabe der Erklärung. |
declaration.enforcementBody |
Text | (leer) | Zuständige Durchsetzungs-/Schlichtungsstelle (für Unternehmen unter BFSG i. d. R. die Marktüberwachungsstelle der Länder). |
declaration.enforcementUrl |
string | (leer) | Link zur zuständigen Stelle (optional). |
declaration.measures |
Text | (integriert) | Bereits umgesetzte Maßnahmen, eine pro Zeile oder mit \| getrennt. Installierte Schwester-Erweiterungen (nt-lingua) und das nt-ai-Audit werden automatisch ergänzt. |
Publishing Quality Gate¶
Warnt beim Veröffentlichen einer Seite vor offenen Barrierefreiheits-Findings oder blockiert die Veröffentlichung, bis kritische Punkte behoben sind. Das Gate nutzt den zuletzt gespeicherten Audit-Bericht der Seite — daher audit.autoOnSave aktiviert lassen, damit der Bericht aktuell bleibt. Ablauf: beheben → speichern (re-Audit) → Bericht aktualisiert → Veröffentlichen erlaubt.
| Einstellung | Typ | Standard | Beschreibung |
|---|---|---|---|
audit.qualityGate |
Optionen (off/warn/block) |
off |
warn: Flash-Warnung beim Veröffentlichen. block: Veröffentlichen wird verhindert (Seite bleibt versteckt), solange das Gate nicht bestanden ist. |
audit.qualityGateSeverity |
Optionen (error/warning) |
error |
Ab welchem Schweregrad das Gate greift. error = nur kritische Fehler, warning = Fehler und Warnungen. |
audit.qualityGateScope |
Optionen (onPublish/onSave) |
onPublish |
onPublish: nur beim Sichtbarschalten (hidden=0). onSave: bei jedem Speichern einer nicht versteckten Seite. |
audit.qualityGateAdminBypass |
boolean | an | Administratoren dürfen trotz Findings veröffentlichen (erhalten nur eine Warnung). |
Für Pipelines: nt_ai:audit --fail-on=error (bzw. warning) liefert Exit-Code ≠ 0 bei Findings — nutzbar als CI/CD-Gate.
PDF-Barrierefreiheit (Upload-Gate)¶
Prüft PDFs beim Backend-Upload auf Barrierefreiheit (getaggtes PDF, Textebene, Dokumentsprache, Titel, Alternativtexte …) und warnt oder blockiert je nach Modus. Unabhängig vom Modus wird bei jedem Backend-PDF-Upload ein Bericht für das Modul Medien → PDF-Barrierefreiheit gespeichert. Frontend-Formular-Uploads sind ausgenommen. Details zu den Prüfregeln: Benutzerhandbuch.
| Einstellung | Typ | Standard | Beschreibung |
|---|---|---|---|
pdf.uploadGate |
Optionen (off/warn/block) |
off |
warn: Datei wird gespeichert, der Redakteur erhält eine bleibende Warnmeldung mit den Befunden. block: Der Upload wird mit einer Meldung inkl. Befunden abgelehnt — es entsteht keine Datei. |
pdf.uploadGateSeverity |
Optionen (error/warning) |
warning |
Ab welchem Schweregrad das Gate greift. warning = Fehler und Warnungen (z. B. fehlender Dokumenttitel), error = nur kritische Fehler. |
pdf.uploadGateAdminBypass |
boolean | an | Administratoren dürfen trotz Befunden hochladen (erhalten nur die Warnung statt einer Blockade). |
Für Bestandsprüfung und Pipelines: nt_ai:pdf-audit [--limit N] [--force] [--fail-on=error|warning]
— rein PHP-basiert (keine Systemwerkzeuge nötig), unveränderte Dateien werden übersprungen.
Token-Tracking und Kostenschätzung¶
| Einstellung | Typ | Standard | Beschreibung |
|---|---|---|---|
tokenTracking.enabled |
boolean | aus | Wenn aktiv, wird jeder KI-Aufruf in tx_ntai_token_usage protokolliert. Erforderlich für die Token-Verbrauchs-Dashboard-Widgets. |
tokenTracking.currency |
Optionen | USD |
Anzeigewährung für geschätzte Kosten. USD → ~$0.19, EUR → ~0,18 €. |
tokenTracking.eurRate |
float | 0.92 |
USD-zu-EUR-Umrechnungskurs. Wird nur verwendet, wenn die Währung auf EUR gesetzt ist. |
tokenTracking.customPricing |
Text (JSON) | (leer) | Integrierte Modellpreistabelle überschreiben oder erweitern. Preise in USD pro 1.000.000 Token. Präfix-Matching wird angewendet — "gpt-4o" trifft auf gpt-4o-2024-08-06. |
{
"my-fine-tuned-gpt4o": {"input": 4.00, "output": 12.00},
"custom-ollama-model": {"input": 0.00, "output": 0.00}
}
Integrierte Preistabelle (Stand 2026-07)¶
| Modell-Präfix | Anbieter | Input $/1M | Output $/1M |
|---|---|---|---|
gpt-4o-mini |
OpenAI | 0.15 | 0.60 |
gpt-4o |
OpenAI | 2.50 | 10.00 |
claude-haiku-4 |
Anthropic | 0.80 | 4.00 |
claude-sonnet-4 |
Anthropic | 3.00 | 15.00 |
claude-opus-4 |
Anthropic | 15.00 | 75.00 |
gemini-2.0-flash |
0.10 | 0.40 | |
gemini-2.5-pro |
1.25 | 10.00 | |
deepseek-chat |
DeepSeek | 0.27 | 1.10 |
mistral-small |
Mistral AI | 0.20 | 0.60 |
llama-3.3-70b |
Groq | 0.59 | 0.79 |
Die vollständige Tabelle befindet sich in EXT:nt_ai/Configuration/ModelPricing.php. Unbekannte Modelle werden im Dashboard-Widget als Warnung angezeigt. TTS-Modelle (tts-1, tts-1-hd, gpt-4o-mini-tts) sind dort mit dem Preis pro 1 Mio. Zeichen hinterlegt.
Vorlesen (TTS)¶
Engine, Tempo und Vorlese-Bereich werden in den Site-Einstellungen gewählt (Kategorie „Vorlesen (TTS)"). Die folgenden Werte gelten nur für die Cloud-Engine und stehen in der Erweiterungskonfiguration (Tab „Vorlesen (TTS)"):
| Einstellung | Typ | Standard | Beschreibung |
|---|---|---|---|
tts.cloudProvider |
Optionen | openai |
Anbieter der Premium-Sprachausgabe. API-Key = der des jeweiligen Providers (Tab „Anbieter-Einstellungen"). |
tts.voice |
string | alloy |
Stimme des Anbieters (OpenAI: alloy, echo, fable, onyx, nova, shimmer). |
tts.model |
string | tts-1 |
TTS-Modell (OpenAI: tts-1, tts-1-hd, gpt-4o-mini-tts). |
tts.rateLimit |
integer | 30 |
Max. neue Cloud-Anfragen pro IP und Minute (Schutz vor Bots/Massennutzung). 0 = unbegrenzt; Cache-Treffer zählen nicht. |
Der Cloud-Endpunkt /nt-ai/tts antwortet nur, wenn die Site-Engine auf cloud steht; er weist Cross-Site-Anfragen ab und ist rate-limitiert. Erzeugte Audios werden serverseitig gecacht, wiederholte Vorlesevorgänge desselben Textes sind kostenlos. Details siehe Benutzerhandbuch → Vorlesefunktion.
Lighthouse-Monitoring¶
Öffentlich erreichbare URLs erforderlich
Die PSI-API kann ausschließlich öffentlich zugängliche URLs analysieren. Diese Funktion auf Staging- oder Produktivservern verwenden, nicht auf lokalen DDEV-Instanzen — Google kann *.ddev.site-URLs nicht erreichen.
| Einstellung | Typ | Standard | Beschreibung |
|---|---|---|---|
lighthouse.apiKey |
string | (leer) | Google-API-Schlüssel von console.cloud.google.com (API „PageSpeed Insights" aktivieren). Ohne Schlüssel sind Anfragen auf ~25 pro 100 Sekunden begrenzt. Im Produktivbetrieb immer einen Schlüssel konfigurieren. Unterstützt %env(NT_AI_LIGHTHOUSE_KEY)%. |
lighthouse.strategy |
Optionen | mobile |
Geräteprofil für Lighthouse. mobile (Standard), desktop oder both (führt zwei PSI-Aufrufe pro Seite durch — verdoppelt den Kontingentverbrauch). |
# Alle Seiten, mobile Strategie (liest Einstellung aus der Erweiterungskonfiguration).
vendor/bin/typo3 nt_ai:lighthouse
# Seite 42 und vollständiger Teilbaum, nur Desktop.
vendor/bin/typo3 nt_ai:lighthouse 42 99 --strategy=desktop
# Unterseiten von Seite 1, beide Strategien ausführen.
vendor/bin/typo3 nt_ai:lighthouse 1 1 --strategy=both
Ergebnisse werden als rein additive Verlaufshistorie in tx_ntai_lighthouse_report gespeichert. Das Dashboard-Widget Lighthouse-Scores zeigt die durchschnittlichen Scores über alle analysierten Seiten.
Score-Schwellenwert-Alarme¶
| Einstellung | Typ | Standard | Beschreibung |
|---|---|---|---|
alerting.enabled |
boolean | aus | Hauptschalter. Kein E-Mail wird versendet, solange dieser deaktiviert ist. |
alerting.recipient |
string | (leer) | Eine oder mehrere E-Mail-Adressen, kommagetrennt. Beispiel: webmaster@example.com, seo@example.com. |
alerting.thresholdGeo |
integer (0–100) | 0 |
Alarm, wenn der GEO/SEO-KI-Score einer Seite diesen Wert unterschreitet. 0 deaktiviert den Alarm für diese Kategorie. |
alerting.thresholdPerformance |
integer (0–100) | 0 |
Schwellenwert für den Performance-KI-Score. |
alerting.thresholdSemantics |
integer (0–100) | 0 |
Schwellenwert für den Semantics-KI-Score. |
alerting.thresholdKeywords |
integer (0–100) | 0 |
Schwellenwert für den Keywords-KI-Score. |
alerting.thresholdAccessibility |
integer (0–100) | 0 |
Schwellenwert für den Barrierefreiheits-KI-Score. |
alerting.thresholdLighthousePerformance |
integer (0–100) | 0 |
Schwellenwert für den Lighthouse-Performance-Score. |
alerting.thresholdLighthouseAccessibility |
integer (0–100) | 0 |
Schwellenwert für den Lighthouse-Accessibility-Score. |
alerting.thresholdLighthouseBestPractices |
integer (0–100) | 0 |
Schwellenwert für den Lighthouse-Best-Practices-Score. |
alerting.thresholdLighthouseSeo |
integer (0–100) | 0 |
Schwellenwert für den Lighthouse-SEO-Score. |
Empfohlene Scheduler-Konfiguration — nt_ai:alert-check nach den Analyse-Befehlen ausführen, damit aktuelle Daten gelesen werden: