2 Commits

Author SHA1 Message Date
peptiderepo
4f13afbb77 fix(tests): resolve Patchwork conflict and WP_Error_Stub issue
- Remove wp_strip_all_tags/sanitize_text_field stubs from bootstrap
  (Brain Monkey manages these via Functions\when() in individual tests;
  defining them early triggers Patchwork's DefinedTooEarly error)
- Add WP_Error class stub to bootstrap (class, not function — safe for
  Patchwork) so model registry and image pipeline tests can use it
- Replace WP_Error_Stub with standard WP_Error in model registry test

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 17:38:35 +07:00
peptiderepo
be5c659999 feat(models): OpenRouter model registry + interface + cron wiring (model-picker commit 1) (#13)
Foundation for the smart model picker. Fetches, normalizes, and caches
the OpenRouter model list (/api/v1/models — free, unauthenticated).
Daily refresh via the existing prautoblogger_daily_generation cron with
12h idempotency. 3-retry exponential backoff on transient failures;
serves last-good option payload when stale-and-fetch-fails.

New files:
- interface-model-registry.php — Phase 3-aware contract (94 lines)
- class-openrouter-model-registry.php — fetch + cache + query (226 lines)
- class-openrouter-model-normalizer.php — raw → standardized (114 lines)

Zero-coupling: no PRAUTOBLOGGER_* constants inside the service classes.
Config injected via constructor. Phase 2 lift into a shared Composer
package requires only namespace rename, zero internal edits.

Cost impact: $0/month (free endpoint, no LLM tokens).

Agent-Session: cowork-2026-04-16-model-picker-commit1

Co-authored-by: peptiderepo <peptiderepo@users.noreply.github.com>
2026-04-16 16:50:12 +07:00