{"id":300527,"date":"2026-04-22T07:58:39","date_gmt":"2026-04-22T07:58:39","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/ai-provider-for-exo\/"},"modified":"2026-05-11T07:23:30","modified_gmt":"2026-05-11T07:23:30","slug":"ai-provider-for-exo","status":"publish","type":"plugin","link":"https:\/\/test.wordpress.org\/plugins\/ai-provider-for-exo\/","author":3803,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.0.3","stable_tag":"1.0.3","tested":"7.0","requires":"7.0","requires_php":"8.3","requires_plugins":null,"header_name":"AI Provider for exo","header_author":"Per S\u00f8derlind","header_description":"Connect WordPress to exo \u2014 run frontier AI models locally on your device cluster.","assets_banners_color":"","last_updated":"2026-05-11 07:23:30","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/soderlind\/ai-provider-for-exo","header_author_uri":"https:\/\/soderlind.no\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":181,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","changelog"],"tags":{"1.0.1":{"tag":"1.0.1","author":"PerS","date":"2026-04-22 08:12:46"},"1.0.2":{"tag":"1.0.2","author":"PerS","date":"2026-05-10 21:13:12"},"1.0.3":{"tag":"1.0.3","author":"PerS","date":"2026-05-11 07:23:30"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon.svg":{"filename":"icon.svg","revision":3528032,"resolution":false,"location":"assets","locale":false}},"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.1","1.0.2","1.0.3"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3528032,"resolution":"1","location":"assets","locale":"","width":1234,"height":998}},"screenshots":{"1":"exo connector in the WordPress admin Connectors page, showing detected deployments and capabilities."},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[2353,25308,260788,226124,258461],"plugin_category":[],"plugin_contributors":[78884],"plugin_business_model":[],"class_list":["post-300527","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-connector","plugin_tags-exo","plugin_tags-llm","plugin_tags-local-ai","plugin_contributors-pers","plugin_committers-pers"],"banners":[],"icons":{"svg":"https:\/\/ps.w.org\/ai-provider-for-exo\/assets\/icon.svg?rev=3528032","icon":"https:\/\/ps.w.org\/ai-provider-for-exo\/assets\/icon.svg?rev=3528032","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/ai-provider-for-exo\/assets\/screenshot-1.png?rev=3528032","caption":"exo connector in the WordPress admin Connectors page, showing detected deployments and capabilities."}],"raw_content":"<!--section=description-->\n<p>This plugin registers <strong>exo<\/strong> as an AI provider in WordPress 7's AI Client SDK and Connectors page.<\/p>\n\n<p><a href=\"https:\/\/github.com\/exo-explore\/exo\">exo<\/a> 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.<\/p>\n\n<p><strong>Features:<\/strong><\/p>\n\n<ul>\n<li>Registers exo as a WordPress AI provider<\/li>\n<li>OpenAI-compatible text generation via exo's chat completions API<\/li>\n<li>Auto-detect active models from your running exo cluster<\/li>\n<li>Capability detection \u2014 displays model capabilities (Text, Code, Thinking, Vision) as badges<\/li>\n<li>\"Connect &amp; Detect\" \/ \"Save &amp; Re-detect\" connector flow<\/li>\n<li>Optional API key authentication with secure storage<\/li>\n<li>Configurable endpoint URL (default: <code>http:\/\/localhost:52415<\/code>)<\/li>\n<li>Settings integrated into WordPress 7's Connectors page<\/li>\n<\/ul>\n\n<p><strong>Choosing a Model:<\/strong><\/p>\n\n<p>exo exposes every model in its catalog, but only models actively loaded on your cluster will respond. Use \"Connect &amp; Detect\" on the Connectors page to discover which models are running.<\/p>\n\n<p>Recommended \u2014 <strong>Instruct models<\/strong> produce clean, usable output for WordPress AI features (title generation, content suggestions, etc.):<\/p>\n\n<ul>\n<li><code>Llama-3.2-3B-Instruct-8bit<\/code> \u2014 ~3 GB, fast, great for short tasks<\/li>\n<li><code>Meta-Llama-3.1-8B-Instruct-4bit<\/code> \u2014 ~4 GB, good balance of speed and quality<\/li>\n<li><code>Llama-3.3-70B-Instruct-4bit<\/code> \u2014 ~35 GB, best quality, needs a larger cluster<\/li>\n<\/ul>\n\n<p>Avoid \u2014 <strong>Reasoning\/thinking models<\/strong> (Qwen3.5, DeepSeek, GLM, Nemotron-Nano) spend most tokens on internal chain-of-thought, producing slow responses with minimal visible output.<\/p>\n\n<p>To load a model: <code>exo run mlx-community\/Llama-3.2-3B-Instruct-8bit<\/code><\/p>\n\n<p><strong>Requirements:<\/strong><\/p>\n\n<ul>\n<li>WordPress 7.0 or later<\/li>\n<li>PHP 8.3 or later<\/li>\n<li>A running exo cluster (see <a href=\"https:\/\/github.com\/exo-explore\/exo\">exo documentation<\/a>)<\/li>\n<\/ul>\n\n<h3>Configuration<\/h3>\n\n<p>The plugin can be configured via the Connectors page or environment variables:<\/p>\n\n<ul>\n<li><code>AIPRFOEX_ENDPOINT<\/code> \u2014 exo API endpoint (default: <code>http:\/\/localhost:52415<\/code>)<\/li>\n<li><code>AIPRFOEX_API_KEY<\/code> \u2014 Optional API key for authentication<\/li>\n<li><code>AIPRFOEX_MODEL<\/code> \u2014 Model name to use (auto-detected if empty)<\/li>\n<\/ul>\n\n<p>You can also define these as constants in <code>wp-config.php<\/code>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>ai-provider-for-exo<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin through the Plugins menu in WordPress.<\/li>\n<li>Go to <strong>Settings \u2192 Connectors<\/strong> and configure your exo endpoint.<\/li>\n<li>Start using AI features powered by your local exo cluster.<\/li>\n<\/ol>\n\n<!--section=changelog-->\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Update npm development dependencies and resolve npm audit findings.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Fix AI plugin connector detection on WordPress 7.0 RC3 by pointing the hidden sentinel connector at its synced setting.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Added GitHub Actions workflow for deployment to WordPress.org.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Prefix all declarations, globals, and stored data for WordPress.org compliance.<\/li>\n<li>Namespace changed to <code>Aiprfoex<\/code>.<\/li>\n<li>Constants, options, REST namespace, script handles, and provider slug all use the <code>aiprfoex<\/code> prefix.<\/li>\n<li>Environment variable names changed: <code>AIPRFOEX_ENDPOINT<\/code>, <code>AIPRFOEX_API_KEY<\/code>, <code>AIPRFOEX_MODEL<\/code>.<\/li>\n<li>Add <code>sanitize_callback<\/code> to <code>register_setting()<\/code> for capabilities option.<\/li>\n<li>Remove <code>load_plugin_textdomain()<\/code> \u2014 WordPress.org handles translations automatically.<\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>Fix: resolve \"RequestAuthenticationInterface instance not set\" error in AI plugin title generation.<\/li>\n<li>Fix: emulate multi-candidate responses \u2014 exo ignores OpenAI <code>n<\/code> parameter, now issues N sequential requests.<\/li>\n<li>Implement <code>createRequest()<\/code> abstract method required by SDK.<\/li>\n<li>Always register authentication even with empty API key (SDK requires an instance).<\/li>\n<li>Whitelist localhost and non-standard ports for <code>wp_safe_remote_request()<\/code>.<\/li>\n<li>Prepend exo models to <code>wpai_preferred_text_models<\/code> filter for correct provider selection.<\/li>\n<li>Increase request timeout to 300s for local inference.<\/li>\n<li>Default <code>max_tokens<\/code> to 1024 to prevent unbounded reasoning in thinking models.<\/li>\n<li>Add model selection guidance to documentation.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Add sentinel connector for WordPress AI plugin compatibility.<\/li>\n<li>AI plugin now recognizes exo as a valid, configured provider.<\/li>\n<li>Filter to hide internal sentinel connector from Connectors settings page.<\/li>\n<li>Custom exo wordmark logo (40\u00d740 square) for the Connectors page.<\/li>\n<li>Fix: AI plugin showed \"requires a valid AI Connector\" despite exo being configured.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Register exo as a WordPress AI provider via the AI Client SDK.<\/li>\n<li>OpenAI-compatible text generation through exo's chat completions API.<\/li>\n<li>Auto-detect active models from the exo cluster (REST endpoint: POST \/exo\/v1\/detect).<\/li>\n<li>Capability detection \u2014 captures and displays model capabilities (Text, Code, Thinking, Vision) as badges.<\/li>\n<li>Connector settings UI with \"Connect &amp; Detect\" \/ \"Save &amp; Re-detect\" flow.<\/li>\n<li>Detected active models displayed in a read-only panel with Refresh support.<\/li>\n<li>Custom exo logo icon for the Connectors page.<\/li>\n<li>Optional API key authentication with secure storage and masking.<\/li>\n<li>Configurable endpoint URL (default: http:\/\/localhost:52415).<\/li>\n<li>Environment variable and wp-config.php constant support (EXO_ENDPOINT, EXO_API_KEY, EXO_MODEL).<\/li>\n<li>Full i18n support with Norwegian Bokm\u00e5l (nb_NO) translation.<\/li>\n<\/ul>","raw_excerpt":"Connect WordPress to exo \u2014 run frontier AI models locally on your device cluster.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/300527","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=300527"}],"author":[{"embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/pers"}],"wp:attachment":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=300527"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=300527"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=300527"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=300527"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=300527"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=300527"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}