2.6.0
Added
- The AI Query Log now offers a Search Quality Grader skill for download on some environments.
Changed
- The
/statusavailability endpoint now returns HTTP 503 when no usable WordPress 7.0 AI connector can generate an answer, even when both AI feature flags are enabled. Integration validation therefore reflects whether an answer is actually possible rather than only whether the features are switched on.
2.5.0
Removed
-
The plugin no longer makes its own OpenAI HTTP requests to generate text. The AI search summary and the Contact Form 7 suggested reply go through the WordPress 7.0 Connector and nothing else. WordPress 7.0 is now required for AI answers — below it there is no Connectors screen, so nothing can generate.
-
CMOPT_AI_MODELis retired and removed from client databases on the next deploy. It configured the removed path;CMOPT_AI_CONNECTOR_MODELis the model setting now. -
CMOPT_AI_PROVIDERno longer acceptslegacy, and the dropdown no longer offers it. A site still carrying that value is read asautorather than being left unable to answer.
Changed
CMOPT_AI_OPENAI_KEYis now read only by the ChatKit chatbot, whose session endpoint is OpenAI-specific and has no equivalent in the AI layer. It has no part in search answers, and no longer decides which path serves a request — there is only one.
2.4.1
Fixed
- An empty
CMOPT_AI_CONNECTOR_MODELnow resolves to the configured default rather than letting WordPress choose. Sites retaining the option’s original empty value could otherwise use whichever model the provider listed first, which on OpenAI may be a more expensive flagship model. A caller can still passmodel => ''explicitly to let WordPress choose.
2.3.2
Added
- Added a View Documentation button to the Command Media Features settings screen.
Fixed
- Closed the AI response wrapper correctly. The missing closing tag caused blocks following an AI answer, such as a search form or query loop, to be visually absorbed into the response container.
2.3.1
Changed
- The default AI model is now
gpt-5.6-luna, and the documentation recommends it. Luna is the small, fast tier of OpenAI’s 5.6 family and the successor to the olderminimodels. Tested against the previous default,gpt-5.4-mini, on the Torah Class reference questions (CMD-948): answer quality came out level or slightly ahead, speed level or a shade behind, and cost materially lower — the right trade for a search summariser. Both paths move together, soCMOPT_AI_MODELandCMOPT_AI_CONNECTOR_MODELstill default to the same model and switching transports changes nothing else. This affects installs that have never stored the option; a site with a model already saved keeps it and is moved deliberately, one environment at a time.
Fixed
-
Clearing
CMOPT_AI_OPENAI_KEYdid not guarantee the connector path. When no connector could serve a request — provider plugin inactive, or no credential — the route collapsed to the same empty string that means “use the legacy path”, andcmd_ai_openai_key()then read the connector’s own key, so the plugin quietly sent a direct OpenAI request on a credential the administrator believed they had stopped using. Routing now has an explicit third state and such a request fails visibly instead. -
service_tierwas sent to every connector. It is an OpenAI parameter, and custom options are merged verbatim into whichever provider answers, so enablingCMOPT_AI_PRIORITYput an unknown field in Anthropic and Google requests. It is now gated to connectors that accept it, with acmd_ai_connector_supports_service_tierfilter for OpenAI-compatible gateways registered under another ID. -
The priority retry fired on any error, not only a rejected service tier. Authentication failures, rate limits and network timeouts each triggered a second generation; on a timeout the provider may have completed and billed the first request already, so the retry paid for the same answer twice. Only a rejection naming the tier retries now.
Added
CMOPT_AI_PROVIDERrenders as a dropdown of the AI connectors the site actually has, with theautoentry naming the connector it currently resolves to and unusable connectors marked rather than hidden. Built at render time through the newcmd_cmopt_field_specfilter, never as a fixed list in the options file — that is what leftCMOPT_AI_MODELoffering retired models.
2.3.0
Added
-
Added an availability endpoint at
GET /wp-json/commandmedia/v1/status.
It reports whether the site can answer an AI query without running one, so an integration can validate a site without billing the owner for a generation. It needs no API key and no WordPress login, and returns only what a caller needs to route a request: the product name, the API version, the answer endpoint, and the site’s name and URL. It is registered wheneverCMFLAG_AIis on, whether or not the answer API itself is — so a site withCMFLAG_AI_REST_APIoff returns a 503 naming the problem rather than the same 404 as a site without the plugin. Built for the Make app (CMD-945); the/answerAPI is unchanged. -
Added the Command Media AI app for Make. A Make user connects a WordPress site by URL — no credentials — and the Ask a WordPress site module returns the answer and its citation titles and URLs as separately mappable fields. A Make an API call universal module covers the rest of the API and accepts only paths relative to the connected site. The setup and troubleshooting guide is published at https://www.commandmedia.net/docs/connect-command-media-ai-to-make/.
2.2.4
Fixed
- A saved password option could not be emptied from the settings screen. The field is rendered blank and a blank submission means “keep the stored value”, so there was no input that meant “remove it” — which left
CMOPT_AI_OPENAI_KEYstuck, and with it the switch between the plugin’s own requests and the OpenAI Connector, since that switch is exactly whether the option is empty. Password fields with a stored value now offer a “Remove the saved value” checkbox. A blank field still keeps the value, so a routine save cannot wipe a credential by accident.
2.2.3
Changed
-
Options may now declare a
summaryalongside theirdescriptionindocs/cmd-features-options.json. The settings screen shows the summary; the documentation portal keeps the full description. An option without one is unaffected and still shows its description. -
Shortened the help text under the four longest fields, which had grown to as much as 821 characters against a norm of roughly 100 and turned the top of the settings screen into a wall of prose that buried the fields themselves.
2.2.2
Fixed
-
Corrected the layout of the AI provider panel on the settings screen. The panel had no width limit, so it stretched the full content column while the table inside it stayed narrow, and below roughly 760px the padding pushed that table past the panel edge where it was clipped. The panel is now capped and
border-box, and the table scrolls within its own container rather than overflowing. -
The “Test stored credentials” label sat on its own line inside the anchor. That whitespace is rendered, inflating the button box and pushing the label off centre. The label is now on one line, and the explanatory text moved out of the button’s paragraph onto its own line.
2.2.1
Changed
-
CMOPT_AI_OPENAI_KEYnow decides which path serves a request. While it holds a key the plugin makes its own OpenAI requests; clearing it hands generation to the OpenAI Connector. Moving a site onto the Connector is therefore one reversible action with a visible result, rather than something that changes underneath the site when WordPress is upgraded or a provider plugin is activated. Naming a connector inCMOPT_AI_PROVIDERstill overrides the key. -
Removed the silent fallback from the connector path to the plugin’s own requests. Exactly one path serves any request, so which one is in use stays observable.
-
CMOPT_AI_CONNECTOR_MODELnow defaults togpt-5.4-miniinstead of empty, matching whatCMOPT_AI_MODELdefaults to, so both paths answer with the same model out of the box. Left empty, WordPress picks the first model the provider lists that supports the prompt — neither the cheapest nor the most suitable, and on OpenAI a flagship model.
Fixed
-
CMOPT_AI_PRIORITYwas applied on the legacy path only. The WordPress AI layer models just the settings every provider shares, so OpenAI’sservice_tierhad nowhere to go and was silently dropped on the connector path. It is now passed throughModelConfig‘scustomOptions, which the provider merges verbatim into its request body, and a request rejected for asking for the priority tier is retried once without it — the same behaviour the legacy path has. -
Added the
cmd_ai_connector_custom_optionsfilter for any other provider-specific request parameter.
2.2.0
Added
-
Added WordPress 7.0 Connector support, so AI requests can be generated through the credentials a site owner enters on the WordPress Connectors screen instead of an API key stored in a plugin option.
The practical gain is that the single-shot AI Search Summary is no longer OpenAI-only: it can be generated by any provider a connector exists for — Anthropic, Google, OpenAI, or one added by a third-party provider plugin — using WordPress’s own PHP AI layer rather than the plugin’s HTTP requests. Contact Form 7 suggested replies take the same path. -
Added
CMOPT_AI_PROVIDERto choose which provider answers AI requests:auto(default) prefers a connector and falls back to the plugin’s own OpenAI requests,legacypins the site to those requests, and a connector ID pins the site to that connector. -
Added
CMOPT_AI_CONNECTOR_MODELfor a preferred model identifier on the connector path. Left empty, WordPress selects a model that supports the request.CMOPT_AI_MODELis not reused, because it holds an OpenAI name that means nothing to Anthropic or Google. -
Added the
cmd_ai_connector_providerfilter for routing individual features to different providers. -
Added a log warning when the model named in
CMOPT_AI_CONNECTOR_MODELis not one the connector offers for the prompt. The WordPress AI client discards an unmatched model preference silently and answers with the first model that fits, so a typo, or a model the provider does not expose for text generation, otherwise looks like a working configuration while billing a different model. -
Added an AI provider panel to the settings screen showing which connectors WordPress can reach, which one will answer, and a button that tests stored credentials against the provider.
Changed
-
The OpenAI API key used by the plugin’s own requests now falls back to the
openaiconnector’s key whenCMOPT_AI_OPENAI_KEYis empty.CMOPT_AI_OPENAI_KEYstill wins when both are set, so upgrading WordPress cannot move an existing site’s billing to a different key. This is what keeps the ChatKit chatbot working on a site that has retired the plugin option — ChatKit sessions are an OpenAI-specific endpoint with no equivalent in the WordPress AI layer, so that path still needs the key itself. -
Extracted the legacy OpenAI request in the RAG flow into
cmd_rag_generate_via_openai(). Behaviour, including theservice_tierpriority flag and its retry, is unchanged.
2.0.0
Command Media AI has grown from AI Search Summaries into a broader set of AI tools for WordPress: Search Summaries, ChatKit-powered chatbots, and Contact Form 7 suggested replies. This release also adds richer logging, feedback collection, REST access, stronger prompt-injection defenses, better retrieval controls, and more cost/token management options.
Added
-
Added CM ChatKit Chatbot, a Gutenberg block that embeds OpenAI ChatKit chatbots on WordPress pages.
Each block can use its own Agent Builder workflow ID, allowing one site to host multiple specialized chatbots. ChatKit sessions are created server-side through a WordPress REST endpoint, with workflow IDs allow-listed viaCMOPT_AI_CHATKIT_WORKFLOW_IDSor the legacyCMOPT_AI_CHATKIT_WORKFLOW_IDoption so arbitrary workflows cannot consume the site’s OpenAI key. -
Added RAG-powered ChatKit client tools so chatbots can answer from site content instead of relying on model training data.
The chatbot can callsite_summaryfor concise AI Search Summary answers with citations, orsite_searchto retrieve full text from top matching WordPress documents when a user asks for specific details that summaries might omit. The oldersearch_sitetool name is still accepted as a compatibility alias. -
Added configurable ChatKit retrieval limits for the full-document
site_searchtool.
Site owners can tune the number of documents pulled withCMOPT_AI_CHATKIT_SEARCH_MAX_RESULTSand the maximum characters per document withCMOPT_AI_CHATKIT_SEARCH_MAX_CHARS; both are filterable and clamped to safe bounds. These limits are independent from the Search Summary article count, so chatbot deep-search behavior can be tuned separately from one-shot summaries. -
Added ChatKit block appearance controls.
Editors can configure height, max width, color scheme, accent color, corner radius, density, font family, and chrome toggles for hiding the chat title or history icon. -
Added Contact Form 7 AI suggested replies.
Forms can opt in by placing the[_ai_suggested_response]special mail tag in the admin email template. The plugin reads the visitor’s submitted inquiry, retrieves relevant site content with the same RAG search conventions used by AI Search Summaries, and drafts a plain-text response that the site team can review and copy into their reply. Suggestions are only added where the admin places the tag and are not automatically sent to the visitor. -
Added Contact Form 7 AI configuration options.
The suggested-reply workflow has configurable system prompt, user prompt, article count, post types, email label, and OpenAI timeout viaCMOPT_AI_CF7_*options. CF7 can inherit the Search Summary post types or use a separate context source. -
Added shared AI query logging for Contact Form 7 generations.
CF7 suggested replies now appear in the same AI query log as Search Summaries, with readable inquiry text, source posts, generated reply, timestamp, and execution time. -
Added AI Query Log admin UI using WordPress DataViews.
The log is available under Settings, shows search term/inquiry, WordPress source results, AI response, timestamp, execution time, and feedback fields. -
Added CSV export for the AI Query Log, including date-range filters and UTF-8 BOM support for non-English characters.
-
Added front-end feedback collection for Search Summaries.
Users can give thumbs-up or thumbs-down feedback on AI answers, optionally add a short reason, and the result is saved back to the matching query-log row. Feedback can be filtered in the admin log. -
Added automatic AI query log rotation.
A daily WP-Cron task trims the oldest rows when the log exceeds 10,000 entries, preserving recent data while keeping the table bounded. -
Added public REST access for AI answers at
/wp-json/commandmedia/v1/answer/.
The endpoint returns structured status codes/messages and response data suitable for ChatKit and other integrations. -
Added centralized OpenAI request handling through
cmd_openai_request().
Search Summaries, ChatKit sessions, and CF7 suggested replies now share one helper for OpenAI authentication, JSON encoding, request execution, response decoding, and WordPress HTTP API integration.
Improved
-
Improved Search Summary retrieval with configurable
CMOPT_AI_SYSTEM_PROMPT,CMOPT_AI_USER_PROMPT,CMOPT_AI_NUM_ARTICLES,CMOPT_AI_POST_TYPES, andCMOPT_AI_MODEL. -
Changed the default AI model to
gpt-5.4-minifor better speed/cost behavior. -
Added
CMOPT_AI_MAX_COMPLETION_TOKENSto cap completion length and control token usage. -
Added
CMOPT_AI_PRIORITYsupport for OpenAI priority processing, including a fallback retry without priority if the selected model or account rejectsservice_tier: priority. -
Added
CMOPT_AI_USE_DEFAULT_WPQUERYso Search Summaries can reuse the already-ranked WordPress search results instead of running a second custom query. This preserves Relevanssi/ElasticPress ranking and avoids unnecessary extra retrieval work. -
Improved context formatting by converting post HTML to Markdown before sending it to the model, with fallback to original HTML if conversion fails.
-
Improved AI response formatting with a stricter allowed HTML set, support for richer semantic tags, and safer output wrapping.
-
Added filters for customizing the AI response heading, disclaimer text, per-post context formatting, visible taxonomy/category labels, and ChatKit
site_searchlimits. -
Added support for displaying source taxonomy/category labels next to related results.
-
Added ElasticPress score capture in debug/source output to help diagnose ranking behavior.
-
Added configurable “privileged phrases” that are quoted in search queries so exact important phrases can receive better treatment from search engines such as Relevanssi.
-
Improved REST and API query handling with server-side query length limits and shorter REST query truncation.
-
Improved query-log readability, including preserved line breaks for CF7 inquiries and wider feedback/reason display.
