Zum Inhalt
Gegen eine laufende Instanz geprüft, mit AI Content Generator 1.1.6 und Ollama 0.32.13 (Modell Qwen3.6 35B-A3B)

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:

  1. Anfrage an https://api.openai.com/v1/chat/completions erkennen.
  2. In eine Anfrage an Ollamas /api/chat übersetzen, mit think: false gegen lange Denkphasen und einer vorangestellten Anweisung, auf Deutsch zu antworten. Das Plugin formuliert seine Prompts nämlich auf Englisch.
  3. 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 unter wp-content/languages/plugins/ai-content-generator-for-woocommerce-de_DE.mo deckt 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 MutationObserver neu 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:

  1. Trigger „New Product" (echter Webhook product.created, kein Polling)
  2. Beschreibung erzeugen (Ollama)
  3. Kurzbeschreibung erzeugen, auf Basis der Beschreibung
  4. 8 bis 12 Schlagwörter erzeugen, als JSON-Array
  5. Markenvorschlag erzeugen
  6. Beschreibung, Kurzbeschreibung, Schlagwörter und KI-Kennzeichnung per REST-API (PUT /wp-json/wc/v3/products/<id>) zurückschreiben
  7. 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:

  1. LibrePIM meldet Änderungen über sein Events-API per Webhook.
  2. 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.
  3. Ein Filter lässt nur Produkte der eigenen Kategorien durch. Die Events feuern instanzweit, nicht je Kanal.
  4. Texte erzeugen, per Token an der LibrePIM-API anmelden und per PATCH ins 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.