KI-ProdukttexteLink zu diesem Abschnitt
Zuletzt geändert am
Ziel: Produktbeschreibungen, Kurzbeschreibungen, Schlagwörter und Marken per KI erzeugen, ohne Produktdaten an einen Cloud-Anbieter zu schicken. Gelöst mit einem offenen Sprachmodell, das per Ollama auf dem eigenen Server läuft.
Das Plugin und sein HakenLink zu diesem Abschnitt
Gewählt wurde „AI Content Generator for WooCommerce" (WebToffee). Es wirbt mit einer offenen Connector-Architektur über das KI-Framework von WordPress. Im Code (get_provider_credentials() in trait-helper-core.php) ist die Anbieterauswahl aber fest verdrahtet:
$connectors = array(
'openai' => 'connectors_ai_openai_api_key',
'google' => 'connectors_ai_google_api_key',
'anthropic' => 'connectors_ai_anthropic_api_key',
);
Das zusätzliche Plugin „AI Provider for Ollama" registriert sich zwar korrekt im Framework, das Modell taucht sogar in der Auswahl auf. Sobald man es wählt, bricht der Generator aber mit „ChatGPT API key is not configured" ab.
Lösung: die Anfrage umleitenLink zu diesem Abschnitt
Statt den Plugin-Code zu ändern (nicht updatesicher), bekommt das Plugin einen Platzhalter-Schlüssel für OpenAI. Es schickt seine Anfrage dann wie gewohnt an api.openai.com, und genau diese Anfrage fängt ein Must-Use-Plugin über den Filter pre_http_request ab:
- Anfrage an
https://api.openai.com/v1/chat/completionserkennen. - In eine Anfrage an Ollamas
/api/chatübersetzen, mitthink: falsegegen lange Denkphasen und einer vorangestellten Anweisung, auf Deutsch zu antworten. Das Plugin formuliert seine Prompts nämlich auf Englisch. - Die Antwort von Ollama zurück ins OpenAI-Format bringen (
choices[0].message.content).
Das Plugin merkt nichts davon. Vereinfacht:
<?php
// wp-content/mu-plugins/ollama-redirect.php
add_filter( 'pre_http_request', function ( $preempt, $args, $url ) {
if ( $url !== 'https://api.openai.com/v1/chat/completions' ) {
return $preempt;
}
$openai = json_decode( $args['body'], true );
$messages = array_merge(
[ [ 'role' => 'system', 'content' => 'Antworte ausschließlich auf Deutsch.' ] ],
$openai['messages']
);
$antwort = wp_remote_post( 'http://ollama:11434/api/chat', [
'timeout' => 120,
'body' => wp_json_encode( [ 'model' => 'qwen3.6:35b-a3b', 'messages' => $messages, 'think' => false, 'stream' => false ] ),
] );
$text = json_decode( wp_remote_retrieve_body( $antwort ), true )['message']['content'] ?? '';
return [
'headers' => [],
'body' => wp_json_encode( [ 'choices' => [ [ 'message' => [ 'role' => 'assistant', 'content' => $text ] ] ] ] ),
'response' => [ 'code' => 200, 'message' => 'OK' ],
'cookies' => [],
'filename' => null,
];
}, 10, 3 );
Schlüssel nötig, obwohl ungenutzt
Ohne hinterlegten Schlüssel bricht das Plugin schon vor der HTTP-Anfrage ab. Gesetzt werden wtofe_use_custom_api_key = 1, ein beliebiger Wert in wtofe_chatgpt_api_key und zur Sicherheit connectors_ai_openai_api_key.
Modell und LeistungLink zu diesem Abschnitt
| Modell | Qwen3.6 35B-A3B (Alibaba, Apache-2.0) |
| Aufbau | Mixture of Experts: 35 Mrd. Parameter, 3 Mrd. davon pro Token aktiv |
| Hardware | nur CPU, keine GPU: 20 Kerne, 62 GB RAM, davon rund 23 GB fürs Modell |
| Tempo | etwa 14 bis 15 Tokens pro Sekunde, 20 bis 25 Sekunden je Produktbeschreibung |
Gerade der Mixture-of-Experts-Aufbau macht das Modell ohne GPU brauchbar. Der Ollama-Container ist nicht öffentlich erreichbar, nur im internen Docker-Netz.
Qualität: Ein kleines lokales Modell macht gelegentlich Rechtschreibfehler, etwa zusammengeklebte Wörter. Der Zusatz „Achte auf korrekte deutsche Rechtschreibung und Grammatik." in jedem Systemprompt hat das deutlich verbessert, aber nicht ganz beseitigt. Deshalb gibt es eine einfache Möglichkeit, Texte neu erzeugen zu lassen (siehe unten).
Übersetzung des PluginsLink zu diesem Abschnitt
Das Plugin liefert keine deutsche Sprachdatei mit:
- Eine eigene
.mo-Datei unterwp-content/languages/plugins/ai-content-generator-for-woocommerce-de_DE.modeckt alle Texte ab, die über__()und Co. laufen. WordPress lädt sie automatisch. - Einige Texte stehen fest im JavaScript. Die übersetzt ein Must-Use-Plugin, das per
MutationObserverneu eingefügte Buttons und Optionen beobachtet.
Ohne msgfmt auf dem Server lässt sich die .mo-Datei auch mit einem kleinen PHP-Skript direkt im GNU-gettext-Binärformat schreiben, einschließlich Plural-Forms.
KI-KennzeichnungLink zu diesem Abschnitt
Das Plugin zeigt bei KI-Texten das Abzeichen „Mit KI generiert", gesteuert über das Meta _wtofe_ai_generated. Gesetzt wird es nur über den Schalter in der Metabox, nie automatisch, auch nicht durch den eigenen Generieren-Button. Wer Texte über die REST-API schreibt, setzt das Meta im selben Request mit.
Automatische Abläufe mit ActivepiecesLink zu diesem Abschnitt
Die Texte entstehen auch ohne Klick, gesteuert über Activepieces.
Im Shop angelegtes Produkt. Gepflegt werden nur Titel, Bild und Kategorie, den Rest übernimmt der Flow:
- Trigger „New Product" (echter Webhook
product.created, kein Polling) - Beschreibung erzeugen (Ollama)
- Kurzbeschreibung erzeugen, auf Basis der Beschreibung
- 8 bis 12 Schlagwörter erzeugen, als JSON-Array
- Markenvorschlag erzeugen
- Beschreibung, Kurzbeschreibung, Schlagwörter und KI-Kennzeichnung per REST-API (
PUT /wp-json/wc/v3/products/<id>) zurückschreiben - Marke über den eigenen Endpunkt setzen (die Produkt-API kann keine Marken schreiben)
Produkt aus LibrePIM. Hier entstehen die Texte schon im PIM und kommen mit dem normalen Import in den Shop:
- LibrePIM meldet Änderungen über sein Events-API per Webhook.
- Der Flow prüft die Signatur selbst. LibrePIM signiert mit HMAC über Zeitstempel und Inhalt (
X-Akeneo-Request-Signature,X-Akeneo-Request-Timestamp), das passt nicht zur eingebauten HMAC-Prüfung von Activepieces. - Ein Filter lässt nur Produkte der eigenen Kategorien durch. Die Events feuern instanzweit, nicht je Kanal.
- Texte erzeugen, per Token an der LibrePIM-API anmelden und per
PATCHins PIM zurückschreiben.
Schleifenschutz. Der Rückschreib-PATCH ist selbst wieder eine Änderung. Zwei Ebenen verhindern eine Endlosschleife: LibrePIM stellt Ereignisse, die der Benutzer einer Verbindung selbst ausgelöst hat, nicht an dieselbe Verbindung zu. Zusätzlich markiert ein internes Attribut (wc_ai_marker) bereits erzeugte Texte.
Neu erzeugen per Haken. Ein Ja/Nein-Attribut wc_regenerate im PIM erzwingt eine Neuerzeugung. Der Flow setzt es im selben PATCH wieder zurück. Über die Massenbearbeitung von LibrePIM geht das für viele Produkte auf einmal.
Erst den Flow umstellen, dann die Daten
Ändert man den Schleifenschutz und bereinigt gleichzeitig Bestandsdaten, löst die Bereinigung Ereignisse aus, die noch an die alte Flow-Version gehen. Deshalb immer zuerst den Flow aktualisieren und erst danach Bestandsdaten migrieren.