diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 8338a78..f2f8951 100755 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -66,10 +66,16 @@ PRAutoBlogger is a WordPress plugin that monitors social media (starting with Re │ ▼ ┌─────────────────────────┐ -│ 6b. Image Pipeline │ (commit 1b) Generates two A/B images: +│ 6b. Image Pipeline │ Generates two A/B images in parallel: │ (optional, if enabled) │ - Image A: article-driven (featured) │ │ - Image B: source-driven (post meta) -│ │ Sideloads to media library, logs costs +│ │ Provider derived from the saved Image Model +│ │ via Image_Model_Registry::provider_for(). +│ │ NSFW-blocked slots (CF error code 3030) are +│ │ retried once with a rule-based fallback +│ │ prompt via Image_NSFW_Retry; a second block +│ │ logs WARNING and publishes without that image. +│ │ Sideloads to media library, logs costs. └────────────┬────────────┘ │ ▼ @@ -431,7 +437,11 @@ All prefixed with `prautoblogger_`: | `prautoblogger_schedule_time` | Daily generation time (HH:MM, default: '03:00') | | `prautoblogger_cloudflare_ai_token` | Encrypted Cloudflare Workers AI API token | | `prautoblogger_cloudflare_account_id` | Cloudflare account UUID (plaintext — identifier, not secret) | -| `prautoblogger_image_model` | Image model alias: `flux-1-schnell` (default) or `flux-1-dev` | +| `prautoblogger_image_model` | Image model slug from `Image_Model_Registry::get_models()`; provider is derived from this on save | +| `prautoblogger_image_provider` | Derived from the chosen model on save (v0.8.0+); not editable in admin UI | +| `prautoblogger_image_prompt_instructions` | System prompt given to the image rewriter LLM (v0.8.0+); falls back to `Image_Prompt_Builder::REWRITER_SYSTEM_PROMPT` when empty | +| `prautoblogger_image_nsfw_retry` | Toggle: retry NSFW-blocked image slots with a rule-based fallback prompt (default: '1') | +| `prautoblogger_migrated_image_provider_v080` | One-shot migration flag — auto-heals mismatched provider/model pairs on first admin_init after v0.8.0 upgrade | | `prautoblogger_article_font_family` | Font family key: 'default', 'inter', 'georgia', 'merriweather', 'lora', 'open_sans', 'roboto', 'system' | | `prautoblogger_article_font_size` | Body font size in px (0 = theme default). Recommended: 16–18. | | `prautoblogger_table_borders` | Toggle: add borders/padding/striping to tables (default: '1') | diff --git a/CHANGELOG.md b/CHANGELOG.md index 782916b..8ac782e 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,46 @@ All notable changes to PRAutoBlogger will be documented in this file. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project uses [Semantic Versioning](https://semver.org/). +## [0.8.0] — 2026-04-21 + +### Changed + +- **Single Image Model dropdown in admin → Images.** The separate Image + Provider select has been removed. The provider (OpenRouter or + Cloudflare Workers AI) is now derived from the chosen model's entry + in `PRAutoBlogger_Image_Model_Registry` on save, so mismatched + provider/model pairs — the root cause of posts 650 and 657 silently + missing their featured image on 2026-04-20 — are no longer possible. + A one-shot migration runs on first admin_init after upgrade and + auto-heals any existing site where the saved provider and model + disagreed. The `prautoblogger_image_provider` option key is + preserved; all existing reads in the pipeline continue to work. + +### Added + +- **Image Prompt Instructions setting.** The system prompt used to + rewrite articles into SCENE + CAPTION is now editable from admin → + Images. Default preserves prior behavior; edit to reshape the + creative direction without a code change. +- **Retry NSFW-Blocked Images setting** (default on). When the image + provider rejects a prompt as NSFW — Cloudflare Workers AI returns + HTTP 400 with `errors[].code === 3030` on FLUX.1 schnell — + PRAutoBlogger now retries the slot once with a rule-based fallback + prompt (article title + style suffix, no LLM rewrite). On a second + block it logs a WARNING and publishes without that image, matching + existing behaviour for any unrecoverable image failure. + +### Fixed + +- **Silent per-image failures in the event log.** The OpenRouter batch + provider now emits `Logger::error` with the request key for every + per-slot HTTP/cURL/parse failure (previously logged the error but + not which slot it was), and `Image_Pipeline::process_image_a/_b` + emit `Logger::warning` on `['error' => …]` results whether or not + the outer catch fires. Operators can now see NSFW blocks, 4xx + bodies, and timeouts in the admin Event Log without cross- + referencing PHP error_log timestamps. + ## [0.7.3] — 2026-04-20 ### Fixed diff --git a/prautoblogger.php b/prautoblogger.php index bfb0c11..6a5222a 100644 --- a/prautoblogger.php +++ b/prautoblogger.php @@ -8,7 +8,7 @@ declare(strict_types=1); * Plugin Name: PRAutoBlogger * Plugin URI: https://peptiderepo.com/prautoblogger * Description: Monitors social media for trending topics, generates SEO-friendly blog posts using AI, and publishes them on a daily schedule with full cost tracking and self-improvement metrics. - * Version: 0.7.3 + * Version: 0.8.0 * Requires at least: 6.0 * Requires PHP: 7.4 * Author: PeptideRepo @@ -35,7 +35,7 @@ if ( ! defined( 'ABSPATH' ) ) { | and limits without magic strings. */ -define( 'PRAUTOBLOGGER_VERSION', '0.7.3' ); +define( 'PRAUTOBLOGGER_VERSION', '0.8.0' ); define( 'PRAUTOBLOGGER_DB_VERSION', '1.1.0' ); define( 'PRAUTOBLOGGER_PLUGIN_FILE', __FILE__ ); define( 'PRAUTOBLOGGER_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );