{"id":341804,"date":"2026-07-21T07:28:47","date_gmt":"2026-07-21T07:28:47","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/local-ai-bridge\/"},"modified":"2026-07-21T08:01:58","modified_gmt":"2026-07-21T08:01:58","slug":"jokiruiz-local-model-connector","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/jokiruiz-local-model-connector\/","author":13517077,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.1","stable_tag":"1.0.1","tested":"7.0.2","requires":"7.0","requires_php":"7.4","requires_plugins":null,"header_name":"Jokiruiz Local Model Connector","header_author":"Joaqu\u00edn Ruiz","header_description":"AI provider connector for local models. Adds an AI connector to WordPress that talks to any OpenAI-compatible endpoint \u2014 Ollama, llama.cpp, LM Studio or vLLM \u2014 so your own hardware powers the WordPress AI features. No cloud, no API key required.","assets_banners_color":"94a1a6","last_updated":"2026-07-21 08:01:58","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/jokiruiz.com","header_plugin_uri":"https:\/\/jokiruiz.com\/jokiruiz-local-model-connector","header_author_uri":"https:\/\/jokiruiz.com","rating":5,"author_block_rating":0,"active_installs":0,"downloads":69,"num_ratings":1,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"jokioki","date":"2026-07-21 07:43:39"},"1.0.1":{"tag":"1.0.1","author":"jokioki","date":"2026-07-21 08:01:58"}},"upgrade_notice":[],"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3616613,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3616613,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3616613,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3616663,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3616663,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.0.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3616638,"resolution":"1","location":"assets","locale":"","width":1280,"height":752},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3616638,"resolution":"2","location":"assets","locale":"","width":1280,"height":754}},"screenshots":{"1":"The connector settings screen, with the health card, setup guide and live model selector.","2":"The connector listed on the WordPress Connectors screen."}},"plugin_section":[],"plugin_tags":[2353,259757,25308,226976,194533],"plugin_category":[],"plugin_contributors":[81220],"plugin_business_model":[],"class_list":["post-341804","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-ai-provider","plugin_tags-connector","plugin_tags-ollama","plugin_tags-openai","plugin_contributors-jokioki","plugin_committers-jokioki"],"banners":{"banner":"https:\/\/ps.w.org\/jokiruiz-local-model-connector\/assets\/banner-772x250.png?rev=3616663","banner_2x":"https:\/\/ps.w.org\/jokiruiz-local-model-connector\/assets\/banner-1544x500.png?rev=3616663","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/jokiruiz-local-model-connector\/assets\/icon.svg?rev=3616613","icon":"https:\/\/ps.w.org\/jokiruiz-local-model-connector\/assets\/icon.svg?rev=3616613","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/jokiruiz-local-model-connector\/assets\/screenshot-1.png?rev=3616638","caption":"The connector settings screen, with the health card, setup guide and live model selector."},{"src":"https:\/\/ps.w.org\/jokiruiz-local-model-connector\/assets\/screenshot-2.png?rev=3616638","caption":"The connector listed on the WordPress Connectors screen."}],"raw_content":"<!--section=description-->\n<p><strong>Jokiruiz Local Model Connector is an AI provider connector that runs WordPress AI features on your own hardware.<\/strong><\/p>\n\n<p>It registers a new AI connector on the WordPress <strong>Connectors<\/strong> screen and exposes your local model to the WordPress AI Client, so any AI feature on your site can use it \u2014 with no cloud service, no account and no API key.<\/p>\n\n<p>The connector speaks the OpenAI-compatible API (<code>\/v1\/models<\/code>, <code>\/v1\/chat\/completions<\/code>) instead of each backend's native API, so one connector serves them all.<\/p>\n\n<h4>Works with any OpenAI-compatible AI provider<\/h4>\n\n<ul>\n<li><strong>Ollama<\/strong><\/li>\n<li><strong>LM Studio<\/strong><\/li>\n<li><strong>llama.cpp<\/strong> (llama-server)<\/li>\n<li><strong>vLLM<\/strong><\/li>\n<li>Any other server exposing an OpenAI-compatible endpoint, local or tunneled.<\/li>\n<\/ul>\n\n<h4>Why this connector<\/h4>\n\n<ul>\n<li><strong>Private by default.<\/strong> Prompts never leave your machine or your network.<\/li>\n<li><strong>No API key needed.<\/strong> Local-only mode works without any credential; add a Bearer token only if your endpoint sits behind a tunnel.<\/li>\n<li><strong>Live model discovery.<\/strong> The model list is read from your endpoint, not hardcoded, and cached so the admin never blocks on a slow or offline backend.<\/li>\n<li><strong>Built for local inference.<\/strong> A short connect timeout detects an offline backend fast, while a long generation timeout leaves room for slow local generation on consumer hardware.<\/li>\n<li><strong>Connector health at a glance.<\/strong> See connected \/ unreachable \/ auth failed, the active model and the latency of the last check \u2014 so you can tell a downed tunnel from a bad key.<\/li>\n<li><strong>Careful with security.<\/strong> Your API key is never re-printed to the browser, and the plugin relaxes WordPress' SSRF protection only for the exact host and port you configured.<\/li>\n<li><strong>No surprise traffic.<\/strong> The plugin makes no network request at all until you save an endpoint.<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to external services in two places. Both only happen in the WordPress admin, and no data about your site or visitors is ever sent.<\/p>\n\n<ol>\n<li><p><strong>Your own AI endpoint.<\/strong> The core purpose of the plugin is to talk to the OpenAI-compatible endpoint <em>you<\/em> configure (for example a local Ollama server at <code>http:\/\/localhost:11434<\/code>). It calls that endpoint's <code>\/v1\/models<\/code> and <code>\/v1\/chat\/completions<\/code> paths to list models and generate text. No request is made until you save an endpoint. This is not a third-party service \u2014 it is the server you point the plugin at.<\/p><\/li>\n<li><p><strong>YouTube (video embed).<\/strong> The plugin settings screen embeds one video from the author's YouTube channel using YouTube's privacy-enhanced domain (<code>youtube-nocookie.com<\/code>). The embed loads only when you open that settings page. This sends your browser's request to YouTube\/Google under their terms; see the <a href=\"https:\/\/www.youtube.com\/t\/terms\">YouTube Terms of Service<\/a> and the <a href=\"https:\/\/policies.google.com\/privacy\">Google Privacy Policy<\/a>.<\/p><\/li>\n<\/ol>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the plugin.<\/li>\n<li>Start your local model server with an OpenAI-compatible API. For example, with Ollama: <code>OLLAMA_HOST=0.0.0.0:11434 ollama serve<\/code><\/li>\n<li>Go to <strong>Settings \u2192 Jokiruiz Local Model Connector<\/strong>.<\/li>\n<li>Enter your endpoint (for example <code>http:\/\/localhost:11434<\/code>), leaving the API key empty for local-only use.<\/li>\n<li>Refresh the model list, pick a model and save.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20connector%20send%20my%20content%20to%20a%20cloud%20ai%20provider%3F\"><h3>Does this connector send my content to a cloud AI provider?<\/h3><\/dt>\n<dd><p>No. Requests go only to the endpoint you configure, which is normally a model running on your own machine or your own network.<\/p><\/dd>\n<dt id=\"do%20i%20need%20an%20api%20key%3F\"><h3>Do I need an API key?<\/h3><\/dt>\n<dd><p>No. Local-only mode requires no key. The API key field is only for endpoints published through a tunnel that requires a Bearer token.<\/p><\/dd>\n<dt id=\"which%20ai%20providers%20and%20backends%20are%20supported%3F\"><h3>Which AI providers and backends are supported?<\/h3><\/dt>\n<dd><p>Any backend exposing an OpenAI-compatible API, including Ollama, LM Studio, llama.cpp's server and vLLM.<\/p><\/dd>\n<dt id=\"does%20it%20make%20network%20requests%20before%20i%20configure%20it%3F\"><h3>Does it make network requests before I configure it?<\/h3><\/dt>\n<dd><p>No. Nothing is requested until you save an endpoint.<\/p><\/dd>\n<dt id=\"the%20model%20list%20is%20empty.%20what%20now%3F\"><h3>The model list is empty. What now?<\/h3><\/dt>\n<dd><p>Check that your server is running and reachable from WordPress, then use the <strong>Refresh models<\/strong> button. The health card on the settings screen distinguishes an unreachable backend from an authentication failure or an empty model list.<\/p><\/dd>\n<dt id=\"my%20local%20model%20is%20slow%20and%20generation%20gets%20cut%20off.\"><h3>My local model is slow and generation gets cut off.<\/h3><\/dt>\n<dd><p>The connector already uses a 300 second generation timeout. You can change it with the <code>jokiruiz_local_model_connector_generation_timeout<\/code> filter.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"AI provider connector for local models: run WordPress AI on your own hardware with Ollama, LM Studio, llama.cpp or vLLM. No cloud, no API key.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/341804","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=341804"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/jokioki"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=341804"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=341804"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=341804"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=341804"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=341804"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=341804"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}