Connecting WordPress to local AI means running an OpenAI-compatible inference server on hardware you control, then registering that server as an AI connector so the WordPress AI Client can send prompts to it. WordPress does not run the model. It sends HTTP requests to an endpoint you configure, and the endpoint returns generated text. Almost everything else — model choice, memory pressure, latency, privacy, and the majority of failures — follows from that single architectural fact.
This guide is written for site owners, developers, and technically curious administrators who want WordPress AI features to run against their own hardware rather than a cloud provider. By the end you should be able to describe the request path end to end, choose between a local-only endpoint and a tunneled one, complete a first working connection, judge whether the result is good enough for your purpose, and diagnose the failures that actually occur. It is a conceptual and operational guide; it does not replace the installation documentation of any specific runtime, and it does not assume a particular model or machine.
What Connecting WordPress to Local AI Actually Means
Three separate things are frequently collapsed into one phrase. Separating them prevents most confusion later.
- The WordPress AI Client is the layer inside WordPress that AI features call when they want a completion. It is the consumer of AI output, not the producer.
- An AI connector (sometimes called a provider) is a plugin that registers an endpoint, optional credentials, and a model list with WordPress so the AI Client can route requests there. The MW Local AI Connector and the Jokiruiz Local Model Connector are two examples of plugins that register connectors on the WordPress Connectors screen.
- The inference server is the process that actually holds model weights in memory and generates tokens. Examples named in the connector documentation include Ollama, LM Studio, llama.cpp’s
llama-server, and vLLM, along with any other server that exposes an OpenAI-compatible endpoint.
The connector’s job is translation and trust. It holds the endpoint URL, optionally an API key, and the discovered model list, and it presents them to WordPress in a form the AI Client understands. The inference server’s job is generation. WordPress’s job is orchestration: deciding which AI feature fires, with what prompt, and what to do with the answer.
It helps to distinguish this arrangement from three things it is not. It is not a cloud AI plugin that calls a vendor API — the shape is similar, but the destination is different. It is not a chat widget embedded in a page, which is a front end that may or may not use the AI Client underneath. And it is not “running a model inside WordPress.” PHP does not hold model weights in memory; the model lives in a separate process, on the same machine or on another one.
A concrete mental model
An administrator opens the Connectors screen and saves a Local AI connector pointing at a self-hosted OpenAI-compatible proxy on the same machine. The plugin calls /v1/models on that endpoint to populate a model selector in settings. The administrator chooses a model. Later, an editorial feature calls the WordPress AI Client, which routes the prompt through the connector, which sends it to /v1/chat/completions. The inference server generates text and returns it. WordPress stores or displays the result.
That sequence contains every element you will ever troubleshoot: a configuration event, a discovery request, a generation request, a network path, a credential, and a model selection. When something breaks, the useful first question is always which of those five elements failed.
The Architecture in Detail
The request path, step by step
- Configuration. An administrator enters an endpoint URL and, optionally, an API key on the connector’s settings page, then saves.
- Model discovery. Saving triggers a request to
/v1/modelson the configured endpoint so the connector can populate its model selector. The MW Local AI Connector documents this behavior explicitly; the Jokiruiz Local Model Connector describes the same pattern as live model discovery, cached so the admin interface does not block on a slow or offline backend. - Model selection. The administrator picks a model from the discovered list. This selection is what later requests will reference.
- Generation. When a WordPress AI feature needs output, the AI Client routes the request through the connector. The connector sends the prompts, messages, provider-prefixed model selection, and any other AI parameters supplied by the caller to the endpoint. If an API key is configured, it is sent as a
Bearertoken so the proxy can authenticate the request. - Response handling. The inference server returns generated text, which flows back through the connector to the AI Client and then to whichever feature requested it.
Two timing details matter for troubleshooting. Model discovery happens when an administrator saves connection details, and generation requests happen whenever WordPress generates a response through that connector. These are different operations with different failure modes: discovery is cheap and should be fast, while generation is expensive and may legitimately take many seconds on consumer hardware.
The two endpoints that matter
An OpenAI-compatible server exposes a small, predictable surface. Two routes do most of the work in this integration.
/v1/modelsanswers the question “what can you run?” It is used for discovery and should return quickly. If it is slow or unavailable, the connector cannot populate a model list, and the administrator is stuck before generation even begins./v1/chat/completionsanswers the question “generate something.” It is where prompts, messages, and parameters are sent, and where the model’s output is returned.
Because the connector speaks the OpenAI-compatible API rather than each backend’s native API, one connector can serve many runtimes. That is the central design decision that makes this integration portable: Ollama, LM Studio, llama.cpp, and vLLM all present the same routes, so the WordPress side does not need to know which one is behind the endpoint.
Where the trust boundary sits
Everything on the WordPress side — the AI Client, the connector plugin, the stored credentials — is your site. Everything past the endpoint URL is your inference host. The connector is the only place credentials live, and the endpoint URL is the only place the two halves meet. This is why the endpoint URL is the single most consequential field in the entire configuration: it determines which machine receives your prompts.
What actually travels over the wire
According to the MW Local AI Connector documentation, the Local AI connector sends the prompts, messages, provider-prefixed model selection, and any other AI parameters supplied by callers of the WordPress AI Client. If an API key is configured, it also sends that key as a Bearer token. It also calls /v1/models to populate the model selector in settings. Nothing else is sent by the connector itself; the content of the request is whatever the calling AI feature supplies.
That last point deserves emphasis. The connector is a pipe, not a filter. If a WordPress feature sends a post draft, a customer message, or a private note to the AI Client, that content reaches the endpoint. The privacy properties of the whole system are therefore determined by where the endpoint lives, not by the connector.
Choosing an Approach: Local-Only, Tunneled, or Hosted
There is no universal best configuration. The right choice depends on where WordPress runs, where your hardware runs, and how much you care about the boundary between them.
| Approach | Where the endpoint lives | Authentication | Typical use | Main consideration |
|---|---|---|---|---|
| Local-only | Same machine or same local network as the web server | None required in local-only mode; a Bearer token can be added | Single-site private use, development, testing | Whether the web server can actually reach the address you entered |
| Tunneled or remote | Another machine, reached through a tunnel or reverse proxy | Bearer token recommended | Home server plus hosted WordPress, or multi-machine setups | Exposure surface, TLS, and credential handling |
| Hosted endpoint | A fixed third-party API endpoint | API key | Sites that want a managed endpoint rather than their own hardware | Prompts leave your network by design |
The Jokiruiz Local Model Connector documents a local-first posture: no cloud service, no account, and no API key in local-only mode, with a Bearer token added only if the endpoint sits behind a tunnel. It also notes that prompts never leave your machine or your network in that configuration. The MW Local AI Connector supports both a user-controlled Local AI proxy and the fixed Actual Computer API endpoint with an API key, which is why the same plugin can serve very different privacy postures depending on how it is configured.
Both plugins are independent projects. The MW Local AI Connector documentation states that it is not affiliated with, endorsed by, or sponsored by Actual Computer, Tailscale, Ollama, LM Studio, or any other third-party service it can be configured to talk to. That is worth remembering when reading compatibility claims anywhere in this space: the connector is a generic adapter, and the runtime is a separate project with its own release cadence.
Which option fits which goal
If WordPress and your hardware are the same machine, or on the same trusted network, local-only is the simplest and most private choice. There is no credential to manage, no tunnel to keep alive, and no third party in the path.
If WordPress is hosted elsewhere and your hardware is at home or in an office, a tunnel or reverse proxy is the practical option. This adds a credential and a network dependency, but it keeps the model on hardware you own. The tradeoff is that you are now running an internet-reachable service, even if only through a tunnel, and that service needs authentication and a considered exposure policy.
If you do not want to operate inference hardware at all, a hosted endpoint is the remaining option. The connector still works the same way; only the destination changes. The privacy posture changes with it, because prompts now travel to a third party.
Prerequisites and Environment Planning
Before configuring anything, it is worth confirming that each layer exists and can be reached. Most setup failures are actually prerequisites that were never verified.
Hardware and memory expectations
The most common planning mistake is assuming that a model’s file size equals the memory it needs. It does not. Total memory use includes the model weights, the context or KV cache, and runtime overhead. The KV cache grows with context length and with the number of concurrent requests, so a model that fits comfortably at a short context can fail at a long one. Quantization reduces weight size, which helps memory fit, but it can also change output quality, so quantization level is a quality decision as much as a resource decision.
Practical planning therefore means asking three questions: how much memory do the weights require, how much context will your WordPress features actually use, and how many requests might arrive at once. A conservative answer to all three is better than an optimistic answer to the first one.
Software prerequisites
- A WordPress installation that exposes the Connectors screen and the AI Client.
- An AI connector plugin that registers a provider on that screen.
- An inference server that exposes an OpenAI-compatible API — for example Ollama, LM Studio, llama.cpp’s
llama-server, or vLLM. - Administrative capability on the WordPress site to configure connectors.
Network and access prerequisites
You need to know the host and port your inference server listens on, whether that address is reachable from the web server’s network context, and whether a firewall or container boundary sits between them. This is the single most common source of confusing failures, because an address that works from your laptop may be meaningless from inside a container or from a remote host.
Credential prerequisites
If the endpoint sits behind a tunnel or a reverse proxy, prepare a Bearer token and configure the endpoint to require it. The Jokiruiz Local Model Connector documents careful key handling: your API key is never re-printed to the browser, and the plugin relaxes WordPress’s SSRF protection only for the exact host and port you configured. Both behaviors are worth expecting from any connector you evaluate.
A Practical First Connection
The following path is a suggested sequence, not a record of a tested environment. Treat each step as a checkpoint: do not continue until the previous step produces the observable result described.
- Start an OpenAI-compatible server. Pick one runtime and start it, binding it to an address your web server can reach. If WordPress runs in a container,
127.0.0.1inside that container is not the same machine as your host. - Verify the server locally. From the machine running the server, request the model list:
curl -s http://127.0.0.1:11434/v1/modelsReplace the host and port with your server’s actual address. A JSON list of models means the server is up and speaking the expected protocol.
- Verify reachability from the web server. This is the step most people skip. Run a request from the same environment that WordPress runs in, for example through WP-CLI:
$response = wp_remote_get( 'http://127.0.0.1:11434/v1/models', array( 'timeout' => 5 ) ); if ( is_wp_error( $response ) ) { error_log( $response->get_error_message() ); } else { error_log( wp_remote_retrieve_response_code( $response ) ); }A logged
200means WordPress can reach the endpoint. A logged error means no amount of connector configuration will help until the network path is fixed. - Install and activate a connector plugin. Activate the connector that matches your situation — for example the MW Local AI Connector or the Jokiruiz Local Model Connector.
- Configure the connector. Open the Connectors screen, add the connector, enter the endpoint URL, and enter an API key only if your endpoint requires one. Save. Saving triggers a model list refresh against
/v1/models. - Confirm discovery succeeded. The model selector should populate. The Jokiruiz connector also exposes connector health at a glance — connected, unreachable, or auth failed — along with the active model and the latency of the last check.
- Select a model. Choose one from the discovered list rather than typing a name by hand. Hand-typed names are a frequent source of generation-time failures.
- Trigger a generation. Use whatever WordPress AI feature you intend to rely on, or a minimal test feature, and confirm that text comes back.
Observable success looks like this: the model list populates, the connector health state reads connected, a generation request returns text, and you have a rough sense of how long it took. If any of those four is missing, the troubleshooting section below maps symptoms to causes.
A Worked Example: An Editorial Drafting Workflow
The following scenario is illustrative. It describes a plausible workflow rather than a measured case study, and the specific model, hardware, and timings are deliberately left open.
Imagine a small publishing site that wants first-draft assistance without sending unpublished material to a third party. An editor writes a structured outline in the WordPress editor. A custom AI feature collects the outline and calls the WordPress AI Client with a drafting prompt. The AI Client routes the request through the local connector, which sends it to /v1/chat/completions on a machine in the same office. The local model returns a draft, which the feature inserts into the editor as a draft post.
The responsibilities split cleanly. WordPress owns the prompt template, the feature trigger, and where the output lands. The connector owns the endpoint, the credential, and the model selection. The inference server owns generation quality, speed, and memory use. The human editor owns review: checking facts, tone, structure, and attribution before anything is published.
Human review is not optional in this workflow, and it is not a formality. A local model’s output is a draft, and the cost of publishing an unverified claim is the same whether the claim came from a cloud API or a machine in the next room. The privacy advantage of local inference does not transfer any accuracy advantage.
Evaluating the Result
Once a connection works, the useful question changes from “does it work?” to “is it good enough for this task?” Four dimensions matter, and each can be checked without special tooling.
- Quality. Compare output against your own criteria on a fixed set of prompts. Keep the prompt set stable so that changes in output reflect the model or configuration, not the test.
- Latency. Separate connect time from generation time. A short connect timeout is a deliberate design choice in the Jokiruiz connector, because it detects an offline backend quickly, while a long generation timeout leaves room for slow local generation on consumer hardware. Those two numbers answer different questions and should be recorded separately.
- Reliability. Run the same prompt repeatedly and count failures. A connector that works once and fails under repeated load is not ready for an editorial workflow.
- Resource behavior. Watch memory and processor or accelerator use on the inference host during generation. Rising memory across requests suggests the context cache is growing; sudden failure suggests the model plus cache plus overhead exceeded available memory.
To run a fair comparison, fix the model, the quantization, the context length, and the prompt set; warm the model before measuring; record time to first token and total generation time separately where your runtime exposes them; repeat each measurement several times; and note the hardware alongside the result. Without those controls, a latency number is a story rather than a measurement. This guide deliberately does not publish benchmark figures, because none were measured here, and because results on one machine rarely transfer to another.
Troubleshooting: Symptoms, Causes, and Fixes
The table below maps the failures that occur most often in this integration. The connector health states referenced here — connected, unreachable, and auth failed — are documented behaviors of the Jokiruiz Local Model Connector; other causes are diagnostic hypotheses to test rather than confirmed explanations.
| Symptom | Likely cause | Diagnostic | Action | Verification |
|---|---|---|---|---|
| Connector reports unreachable or the request is refused | Server not running, wrong host or port, or a firewall in the path | Request /v1/models from the web server’s environment | Start the server, correct the bind address, or open the port | Health state returns to connected |
| Auth failed | Missing, wrong, or rotated Bearer token | Check the token value and the endpoint’s authentication setting | Re-enter the key and save | Health state returns to connected |
| Model list is empty after saving | Endpoint does not implement /v1/models, returns an unexpected shape, or the backend is offline | Request /v1/models directly and inspect the response | Confirm runtime compatibility or restart the backend | Selector populates with model names |
| Generation fails with a model-not-found error | Selected model name does not match the server’s model identifiers, or the provider prefix is wrong | Compare the selector value against the server’s model list | Re-select a model from the discovered list | Generation returns a normal response |
| Generation stalls and times out | Generation timeout too short for the hardware, or the model is too large for interactive use | Distinguish connect success from generation stall in the logs | Increase the generation timeout, reduce model size, or shorten context | A completion returns within the new limit |
| Connect attempt fails almost immediately | Endpoint genuinely unreachable; the short connect timeout is working as designed | Test the endpoint from the server environment | Fix the network path rather than the timeout | Connect succeeds |
| WordPress blocks the outbound request | Endpoint host is not permitted by the site’s SSRF protections | Check whether the connector’s allowed host and port match the endpoint | Configure the exact host and port the connector expects | Request completes without a blocked-request error |
| Endpoint works from your laptop but not from WordPress | Different network context — container, virtual machine, or remote host | Run the reachability test from the web server itself | Use an address meaningful inside that context, such as a host IP or the host gateway name | Reachability test returns 200 |
| TLS or certificate error | Self-signed or untrusted certificate on a tunnel or proxy | Inspect the certificate chain presented by the endpoint | Install a trusted certificate or correct the proxy configuration | No transport error on save |
| Gateway timeout or bad gateway from a reverse proxy | Proxy read timeout shorter than local generation time | Compare proxy logs with the generation duration | Raise the proxy read timeout | Request completes normally |
| PHP execution limit reached | Long generation exceeds the PHP or web server time limit | Check PHP and web server error logs | Raise limits where appropriate or move long generations to a queued process | Completion returns without a fatal error |
| Newly pulled model does not appear | Cached model list | Re-save the connector to trigger a refresh | Save connection details again | New model appears in the selector |
| Inference host runs out of memory | Weights plus context cache plus runtime overhead exceed available memory | Monitor host memory during generation | Use a smaller or more quantized model, reduce context, or limit concurrency | Generation completes without host-level failure |
Two habits make this table far more useful. First, always test from the web server’s environment, not your workstation, because the two are frequently not on the same network. Second, treat the health state as the first diagnostic rather than the last: unreachable points at the network, auth failed points at the credential, and connected-but-failing points at the model or the generation parameters.
Security, Privacy, and Responsible Operation
Local inference is often chosen for privacy reasons, and it is worth being precise about what that actually buys.
The Jokiruiz Local Model Connector documents two security behaviors worth understanding. Your API key is never re-printed to the browser, which prevents a stored credential from being displayed back to anyone with access to the settings screen. And the plugin relaxes WordPress’s SSRF protection only for the exact host and port you configured, which keeps the exception narrow rather than disabling the protection globally. If you evaluate other connectors, those are reasonable expectations to check.
Privacy depends entirely on where the endpoint lives. In a local-only configuration, prompts never leave your machine or your network. In a tunneled configuration, they leave the machine but remain within infrastructure you control, assuming the tunnel terminates where you think it does. In a hosted configuration, they travel to a third party, and the connector’s privacy properties are no longer the deciding factor.
Operational cautions follow from the same logic. Do not expose a raw inference server to the public internet without authentication. Do not send Bearer tokens over plain HTTP across an untrusted network. Consider what your WordPress AI features actually send — drafts, customer messages, internal notes — and confirm that the destination matches the sensitivity of that content. Finally, remember that open weights, open source, and permission for commercial use are three different things; check the specific license that applies to any model you deploy rather than inferring rights from how the weights are distributed.
Limitations and What This Approach Is Not
Local inference on consumer hardware has real ceilings. Throughput is lower than hosted accelerators, so long generations take longer and concurrent requests compete for the same memory. Larger models may fit only at reduced quantization, which can affect output quality. Context length is bounded by memory, and the KV cache grows with it.
Connector plugins are also independent projects with their own maturity curves. The two referenced here document model discovery, health states, and scoped SSRF exceptions, but plugin behavior can change between releases, and not every WordPress AI feature will necessarily behave identically across every connector. Treat the Connectors screen and the connector’s own settings as the authoritative source for what a given version supports.
Finally, this approach does not eliminate the need for human review, and it does not guarantee better output than a cloud model. It changes where generation happens and who holds the data. That is a meaningful change, but it is a different change from an accuracy improvement.
Learning Path and Next Step
A practical progression runs in three stages. Begin by getting one connector healthy with one modest model and a single AI feature, and confirm the four success signals: populated model list, connected health state, a returned generation, and a rough latency figure. Move next to measurement: fix a prompt set, run it repeatedly, and record quality, latency, and failure rate so you can tell whether a configuration change actually helped. Then move to operations: add authentication if the endpoint is tunneled, decide what gets logged and for how long, and place human review explicitly in the publishing workflow.
The immediate next action depends on where you are. If you have not yet connected anything, start an OpenAI-compatible server and confirm /v1/models responds from the web server’s environment before touching any plugin. If you have a working connection but uncertain quality, build a small fixed prompt set and measure. If you have a working connection that fails intermittently, work through the troubleshooting table from the top, testing from the server environment rather than your workstation.
Deeper questions branch naturally from here: which local model best fits your hardware and task, how to secure a tunneled endpoint with scoped credentials, how to measure latency reproducibly, and how to interpret each connector health state. Those are separate, focused problems, and each deserves its own investigation rather than a paragraph here.
If you are working through a connection problem, the most useful thing you can share with the community is your environment — WordPress host, inference runtime, endpoint address style, and connector — along with the exact step where it failed, the health state you observed, and what the reachability test returned. That combination lets other people reproduce your situation instead of guessing at it.
FAQ
Does WordPress run the AI model itself?
No. WordPress sends HTTP requests to an OpenAI-compatible endpoint you configure. The model runs in a separate inference server process, on the same machine or on another one, and returns generated text to WordPress.
Do I need an API key to connect WordPress to a local model?
Not in local-only mode. The Jokiruiz Local Model Connector documents that local-only operation needs no credential, and that a Bearer token is added only when the endpoint sits behind a tunnel. The MW Local AI Connector sends a configured key as a Bearer token so a proxy can authenticate the request.
Which local runtimes work with a WordPress AI connector?
Any server that exposes an OpenAI-compatible API. The connector documentation names Ollama, LM Studio, llama.cpp's llama-server, and vLLM, and notes that one connector serves them all because it speaks the shared API rather than each backend's native interface.
Why does the connector call /v1/models?
To populate the model selector in settings. The MW Local AI Connector documents calling /v1/models on the configured endpoint, and the Jokiruiz connector describes the same pattern as live model discovery that is cached so the admin interface does not block on a slow or offline backend.
Why does the endpoint work from my laptop but not from WordPress?
Almost always a network-context mismatch. Containers, virtual machines, and remote hosts have their own view of localhost, so an address that resolves on your workstation may be meaningless to the web server. Test /v1/models from the web server's environment and use an address that is valid there.
Is local inference automatically more private?
Only if the endpoint is actually local. In a local-only configuration prompts never leave your machine or network. A tunneled endpoint keeps data within infrastructure you control, while a hosted endpoint sends prompts to a third party regardless of which connector you use.