=== AI Provider for exo ===
Contributors: PerS
Tags: ai, exo, local-ai, llm, connector
Requires at least: 7.0
Tested up to: 7.1
Requires PHP: 8.3
Stable tag: 1.0.4
License: GPL-2.0-or-later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Connect WordPress to exo — run frontier AI models locally on your device cluster.

== Description ==

This plugin registers **exo** as an AI provider in WordPress 7's AI Client SDK and Connectors page.

[exo](https://github.com/exo-explore/exo) connects all your devices into an AI cluster, enabling you to run frontier models locally. It exposes an OpenAI-compatible API that this plugin connects to.

**Features:**

* Registers exo as a WordPress AI provider
* OpenAI-compatible text generation via exo's chat completions API
* Auto-detect active models from your running exo cluster
* Capability detection — displays model capabilities (Text, Code, Thinking, Vision) as badges
* "Connect & Detect" / "Save & Re-detect" connector flow
* Optional API key authentication with secure storage
* Configurable endpoint URL (default: `http://localhost:52415`)
* Settings integrated into WordPress 7's Connectors page

**Choosing a Model:**

exo exposes every model in its catalog, but only models actively loaded on your cluster will respond. Use "Connect & Detect" on the Connectors page to discover which models are running.

Recommended — **Instruct models** produce clean, usable output for WordPress AI features (title generation, content suggestions, etc.):

* `Llama-3.2-3B-Instruct-8bit` — ~3 GB, fast, great for short tasks
* `Meta-Llama-3.1-8B-Instruct-4bit` — ~4 GB, good balance of speed and quality
* `Llama-3.3-70B-Instruct-4bit` — ~35 GB, best quality, needs a larger cluster

Avoid — **Reasoning/thinking models** (Qwen3.5, DeepSeek, GLM, Nemotron-Nano) spend most tokens on internal chain-of-thought, producing slow responses with minimal visible output.

To load a model: `exo run mlx-community/Llama-3.2-3B-Instruct-8bit`

**Requirements:**

* WordPress 7.0 or later
* PHP 8.3 or later
* A running exo cluster (see [exo documentation](https://github.com/exo-explore/exo))

== Installation ==

1. Upload the `ai-provider-for-exo` folder to `/wp-content/plugins/`.
2. Activate the plugin through the Plugins menu in WordPress.
3. Go to **Settings → Connectors** and configure your exo endpoint.
4. Start using AI features powered by your local exo cluster.

== Configuration ==

The plugin can be configured via the Connectors page or environment variables:

* `AIPRFOEX_ENDPOINT` — exo API endpoint (default: `http://localhost:52415`)
* `AIPRFOEX_API_KEY` — Optional API key for authentication
* `AIPRFOEX_MODEL` — Model name to use (auto-detected if empty)

You can also define these as constants in `wp-config.php`.

== Screenshots ==

1. exo connector in the WordPress admin Connectors page, showing detected deployments and capabilities.


== Changelog ==

= 1.0.4 =
* Confirm compatibility with WordPress 7.1 and update "Tested up to".

= 1.0.3 =
* Update npm development dependencies and resolve npm audit findings.

= 1.0.2 =
* Fix AI plugin connector detection on WordPress 7.0 RC3 by pointing the hidden sentinel connector at its synced setting.

= 1.0.1 =
* Added GitHub Actions workflow for deployment to WordPress.org.

= 1.0.0 =
* Prefix all declarations, globals, and stored data for WordPress.org compliance.
* Namespace changed to `Aiprfoex`.
* Constants, options, REST namespace, script handles, and provider slug all use the `aiprfoex` prefix.
* Environment variable names changed: `AIPRFOEX_ENDPOINT`, `AIPRFOEX_API_KEY`, `AIPRFOEX_MODEL`.
* Add `sanitize_callback` to `register_setting()` for capabilities option.
* Remove `load_plugin_textdomain()` — WordPress.org handles translations automatically.

= 0.3.0 =
* Fix: resolve "RequestAuthenticationInterface instance not set" error in AI plugin title generation.
* Fix: emulate multi-candidate responses — exo ignores OpenAI `n` parameter, now issues N sequential requests.
* Implement `createRequest()` abstract method required by SDK.
* Always register authentication even with empty API key (SDK requires an instance).
* Whitelist localhost and non-standard ports for `wp_safe_remote_request()`.
* Prepend exo models to `wpai_preferred_text_models` filter for correct provider selection.
* Increase request timeout to 300s for local inference.
* Default `max_tokens` to 1024 to prevent unbounded reasoning in thinking models.
* Add model selection guidance to documentation.

= 0.2.0 =
* Add sentinel connector for WordPress AI plugin compatibility.
* AI plugin now recognizes exo as a valid, configured provider.
* Filter to hide internal sentinel connector from Connectors settings page.
* Custom exo wordmark logo (40×40 square) for the Connectors page.
* Fix: AI plugin showed "requires a valid AI Connector" despite exo being configured.

= 0.1.0 =
* Initial release.
* Register exo as a WordPress AI provider via the AI Client SDK.
* OpenAI-compatible text generation through exo's chat completions API.
* Auto-detect active models from the exo cluster (REST endpoint: POST /exo/v1/detect).
* Capability detection — captures and displays model capabilities (Text, Code, Thinking, Vision) as badges.
* Connector settings UI with "Connect & Detect" / "Save & Re-detect" flow.
* Detected active models displayed in a read-only panel with Refresh support.
* Custom exo logo icon for the Connectors page.
* Optional API key authentication with secure storage and masking.
* Configurable endpoint URL (default: http://localhost:52415).
* Environment variable and wp-config.php constant support (EXO_ENDPOINT, EXO_API_KEY, EXO_MODEL).
* Full i18n support with Norwegian Bokmål (nb_NO) translation.
