{"id":380146,"date":"2026-10-21T14:49:51","date_gmt":"2026-10-21T14:49:51","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/knowscapes-ai-client\/"},"modified":"2026-10-21T14:46:28","modified_gmt":"2026-10-21T14:46:28","slug":"knowscapes-ai-client","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/knowscapes-ai-client\/","author":23556477,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.3.1","stable_tag":"2.3.1","tested":"7.1.3","requires":"6.5","requires_php":"7.4","requires_plugins":null,"header_name":"KnowScapes AI Client","header_author":"xplicator GmbH","header_description":"AI chat for your site, as a floating launcher or a shortcode. Works with your own OpenAI, Anthropic or OpenRouter key, or with a free fair-use key from KnowScapes. API keys stay server-side and are never exposed to visitors.","assets_banners_color":"73889d","last_updated":"2026-10-21 14:46:28","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/knowscapes.org\/","header_author_uri":"https:\/\/xplicator.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":52,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.3.1":{"tag":"2.3.1","author":"xplicator","date":"2026-10-21 14:46:28","revision":3758580}},"upgrade_notice":{"2.3.1":"<p>Rate limits and the daily ceiling now hold under parallel requests.<\/p>","2.3.0":"<p>Adds an AI notice under every chat, as required by the EU AI Act. It appears\nautomatically after the update; reword it under Appearance \u2192 AI notice if the\ndefault does not suit your site.<\/p>","2.2.1":"<p>Corrects the suggested privacy policy text, which implied something about your\nprovider&#039;s retention that the plugin cannot know. If you copied that text into\nyour privacy policy, re-copy it.<\/p>","2.2.0":"<p>Adds the [knowscapes_ai_chat] shortcode, placement and access control, starter\nquestions and optional page context. Nothing existing changes: the launcher keeps\nappearing everywhere until you say otherwise, and page context starts off.<\/p>","2.1.0":"<p>Adds a provider entry for a paid KnowScapes key, and fixes replies stopping\nmid-sentence by raising the reply length limit and reporting when it is reached.<\/p>","2.0.1":"<p>Fixes a Save button that silently did nothing on the settings screen. Update if\nyour settings would not persist.<\/p>","2.0.0":"<p>This release removes the shared API key that earlier versions shipped with. After\nupdating, open the settings screen, supply your own key or request a free one,\nconfirm the data transfer and switch the widget back on.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3758580,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3758580,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3758580,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3758580,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["2.3.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3758580,"resolution":"1","location":"assets","locale":"","width":1280,"height":960},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3758580,"resolution":"5","location":"assets","locale":"","width":1280,"height":960}},"screenshots":{"1":"The chat panel on the front end, opened from the floating launcher.","2":"Provider selection: your own OpenAI, Anthropic or OpenRouter key, or a free KnowScapes Community key.","3":"Requesting a free key. The transfer is named in full and happens only on this button press.","4":"Placement and access: where the launcher appears, which post types carry it, and whether only signed-in users may chat.","5":"The same assistant placed inline on a page with the shortcode."}},"plugin_section":[],"plugin_tags":[2353,1320,5707,2364,70446],"plugin_category":[41],"plugin_contributors":[287837],"plugin_business_model":[],"class_list":["post-380146","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-assistant","plugin_tags-chat","plugin_tags-chatbot","plugin_tags-rag","plugin_category-communication","plugin_contributors-xplicator","plugin_committers-xplicator"],"banners":{"banner":"https:\/\/ps.w.org\/knowscapes-ai-client\/assets\/banner-772x250.png?rev=3758580","banner_2x":"https:\/\/ps.w.org\/knowscapes-ai-client\/assets\/banner-1544x500.png?rev=3758580","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/knowscapes-ai-client\/assets\/icon-128x128.png?rev=3758580","icon_2x":"https:\/\/ps.w.org\/knowscapes-ai-client\/assets\/icon-256x256.png?rev=3758580","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/knowscapes-ai-client\/assets\/screenshot-1.png?rev=3758580","caption":"The chat panel on the front end, opened from the floating launcher."},{"src":"https:\/\/ps.w.org\/knowscapes-ai-client\/assets\/screenshot-5.png?rev=3758580","caption":"The same assistant placed inline on a page with the shortcode."}],"raw_content":"<!--section=description-->\n<p>KnowScapes AI Client adds a floating chat assistant to your site. Visitors type a\nquestion, the reply is generated by the AI provider you selected, and the answer\nis rendered as formatted text inside the chat panel.<\/p>\n\n<p>You choose where the answers come from:<\/p>\n\n<ul>\n<li><strong>KnowScapes Community (free key)<\/strong> \u2014 a retrieval-augmented agent run by xplicator GmbH that answers from your own website. You can request a free key directly from the settings screen, so no account with a commercial AI provider is needed to get started.<\/li>\n<li><strong>KnowScapes (paid plan)<\/strong> \u2014 the same service and the same endpoint, with a key from a paid plan instead of the fair-use allowance. Both entries keep their own key, so you can hold a free key and a paid one side by side and switch between them without pasting a key again.<\/li>\n<li><strong>OpenAI<\/strong> \u2014 with your own API key, billed to your own OpenAI account.<\/li>\n<li><strong>Anthropic<\/strong> \u2014 with your own API key, billed to your own Anthropic account.<\/li>\n<li><strong>OpenRouter<\/strong> \u2014 with your own API key, billed to your own OpenRouter account.<\/li>\n<li><strong>Any OpenAI-compatible endpoint<\/strong> \u2014 for example a self-hosted gateway on your own infrastructure.<\/li>\n<\/ul>\n\n<p>Where the chat appears is up to you: a floating launcher on every page, only on\nthe content types you pick, or nowhere at all \u2014 dropped into a post, a page or a\ntemplate with the <code>[knowscapes_ai_chat]<\/code> shortcode instead. Individual entries\ncan be excluded, the launcher can sit in either bottom corner and can be hidden\non phones, and the whole assistant can be kept for signed-in users only.<\/p>\n\n<p>Two things make a first message more likely and cost nothing until they are used:\nstarter questions, shown as buttons in the empty chat, and page context, which\nlets the assistant answer about the page the visitor is actually reading. Every\nreply carries a copy button.<\/p>\n\n<p>Every chat shows a short notice that the visitor is talking to an AI and that\nreplies may contain mistakes. You can reword it \u2014 into the language of your site,\nfor instance \u2014 but not switch it off, because the EU AI Act requires that people\ncan tell when they are talking to an AI.<\/p>\n\n<p>Every feature of the plugin is available with every provider. Nothing in the\nplugin is switched off, time-limited or gated behind a payment: which provider you\nuse, and what that provider charges you, is entirely your decision.<\/p>\n\n<h4>The KnowScapes Community plan<\/h4>\n\n<p>The Community plan is KnowScapes' free plan. On the KnowScapes side it covers one\nwebsite as the knowledge source plus one additional document, and the free key\nanswers a limited number of messages per hour and per day for the site it is used\non \u2014 at the time of writing 20 per hour and 480 per day, roughly three to six\nvisitor conversations an hour, which suits a small site. A short burst above the\nhourly rate is absorbed rather than refused.<\/p>\n\n<p>When the allowance is used up, the service declines further messages until the\nnext period. Nothing about the plugin changes: no feature is switched off, no\ncountdown starts, and every setting keeps working. Visitors see a short notice\nthat the assistant is unavailable for now, and you see the reason and the current\nallowance on the plugin's settings screen. The current figures \u2014 messages,\npages and document size \u2014 are published at https:\/\/knowscapes.org\/free-key-limits\/\nand the plans at https:\/\/knowscapes.org\/pricing\/<\/p>\n\n<p>You are never obliged to use this key. The same plugin works with your own\nOpenAI, Anthropic or OpenRouter key, or with your own endpoint, and it behaves\nidentically either way.<\/p>\n\n<h4>Your API key stays on the server<\/h4>\n\n<p>Visitors never see your key. The browser talks only to a REST route on your own\nWordPress site; that route adds the key and forwards the request. The key is\nstored in the WordPress options table and is never printed into a page, a script\nvariable or a response body. The settings screen only ever shows it masked.<\/p>\n\n<h4>Nothing happens until you say so<\/h4>\n\n<p>After activation the plugin is inert. It has no key, no provider endpoint it can\nreach, and no widget on your site, and it never contacts anything on its own \u2014\nnot on activation, not when an admin page loads, not when a visitor views your\nsite.<\/p>\n\n<p>Three things can send a request, and each one is something you start:<\/p>\n\n<ol>\n<li>Pressing <strong>Request free key<\/strong> sends your e-mail address and this site's URL to\nknowscapes.com, and only after you tick the box next to that button.<\/li>\n<li>Entering an API key, or pressing <strong>Load available entries<\/strong>, asks the\nselected provider which models your key may use. Installing a free key through\nthe link in its e-mail does this once as well, as part of that same button\npress. Opening the settings screen alone never does.<\/li>\n<li>A visitor sending a chat message, which is possible only once you have\nsupplied a key, chosen a model, confirmed the data transfer and switched the\nwidget on.<\/li>\n<\/ol>\n\n<p>No visitor data of any kind leaves your site before that last step.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li>Floating chat launcher with ten icons to pick from<\/li>\n<li>Light, dark or automatic colour scheme, and a configurable accent colour<\/li>\n<li>Markdown replies, sanitised before they are inserted into the page<\/li>\n<li>Optional collapsible reasoning block for reasoning-capable models<\/li>\n<li>Configurable system prompt, reply length cap and per-visitor rate limit<\/li>\n<li>Greeting message that costs nothing, because it is never sent to the provider<\/li>\n<li>AI notice under every chat, rewordable but always shown<\/li>\n<li>Uninstall routine that removes its options, its counter table and its transients, across every site of a multisite network<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin is a client for external AI services. Which service is contacted\ndepends on the provider you select in its settings. Nothing below happens on a\ndefault installation; each transfer requires the configuration steps described\nabove.<\/p>\n\n<h4>KnowScapes AI API (xplicator GmbH)<\/h4>\n\n<p>Used when either <strong>KnowScapes Community (free key)<\/strong> or <strong>KnowScapes (paid plan)<\/strong>\nis selected. Both reach the same service at the same address; they differ only in\nwhich key is sent, and therefore in the allowance that applies to it.<\/p>\n\n<ul>\n<li><strong>What is sent:<\/strong> the text of the visitor's current message, the earlier messages of that same conversation (at most the last 20, each truncated to 4,000 characters), your configured system prompt, and the agent identifier. If you switch page context on, your system prompt can also carry the title, address and text of the published page the visitor is reading, up to the character limit you set. The API key is sent as an authorisation header.<\/li>\n<li><strong>When:<\/strong> each time a visitor submits a message in the chat.<\/li>\n<li><strong>Endpoints:<\/strong> <code>https:\/\/knowscapes.com\/api\/v1\/chat\/completions<\/code> and, when you press the button to load the agent list, <code>https:\/\/knowscapes.com\/api\/v1\/models<\/code>.<\/li>\n<li>Terms of use: https:\/\/xplicator.com\/legal-terms-of-use\/<\/li>\n<li>Privacy policy: https:\/\/xplicator.com\/legal-service-privacy\/<\/li>\n<li>Service description (processing location, retention, sub-processors): https:\/\/xplicator.com\/legal-service-knowscapes\/<\/li>\n<\/ul>\n\n<h4>KnowScapes free key service (xplicator GmbH)<\/h4>\n\n<p>Used only when you fill in the request form on the settings screen, tick the\nconsent box and press the button. It is never called automatically.<\/p>\n\n<ul>\n<li><strong>What is sent:<\/strong> the e-mail address you entered; the URL and the name of this site; and the address of this plugin's own settings page inside your WordPress admin area. The settings-page address is what allows the confirmation e-mail to carry a button that offers to install the key on this site.<\/li>\n<li><strong>When:<\/strong> once, on that button press.<\/li>\n<li><strong>Endpoint:<\/strong> <code>https:\/\/knowscapes.com\/api\/trial-keys<\/code> \u2014 the path is the service's own name for its route; the key it issues is a free one with a fair-use allowance, not a time-limited trial.<\/li>\n<li><strong>What comes back:<\/strong> a confirmation that the key was sent. The key itself arrives by e-mail and is never contained in the response.<\/li>\n<li><strong>Stored locally:<\/strong> only a flag that expires after 60 seconds, which stops the button being pressed repeatedly. Neither your e-mail address nor the key is kept.<\/li>\n<li><strong>Note on the install link:<\/strong> the link in that e-mail carries the key as part of its address, so it can appear in your server's access log, and anyone holding the link could offer the key to any site. Opening it stores nothing \u2014 it shows a confirmation screen naming the key, and only your confirmation stores it. Confirm only a key you requested yourself, or ignore the link and paste the key from the e-mail into the API key field by hand.<\/li>\n<li>Terms of use: https:\/\/xplicator.com\/legal-terms-of-use\/<\/li>\n<li>Privacy policy: https:\/\/xplicator.com\/legal-service-privacy\/<\/li>\n<\/ul>\n\n<h4>OpenAI<\/h4>\n\n<p>Used when the provider <strong>OpenAI<\/strong> is selected, with your own key.<\/p>\n\n<ul>\n<li><strong>What is sent:<\/strong> the conversation and system prompt as described above \u2014 including the page context, if you switched it on \u2014 plus the model name, authorised with your key.<\/li>\n<li><strong>When:<\/strong> each time a visitor submits a message, and when you load the model list.<\/li>\n<li><strong>Endpoints:<\/strong> <code>https:\/\/api.openai.com\/v1\/chat\/completions<\/code>, <code>https:\/\/api.openai.com\/v1\/models<\/code><\/li>\n<li>Terms of use: https:\/\/openai.com\/policies\/terms-of-use\/<\/li>\n<li>Privacy policy: https:\/\/openai.com\/policies\/privacy-policy\/<\/li>\n<\/ul>\n\n<h4>Anthropic<\/h4>\n\n<p>Used when the provider <strong>Anthropic<\/strong> is selected, with your own key.<\/p>\n\n<ul>\n<li><strong>What is sent:<\/strong> the conversation and system prompt as described above, plus the model name, authorised with your key.<\/li>\n<li><strong>When:<\/strong> each time a visitor submits a message, and when you load the model list.<\/li>\n<li><strong>Endpoints:<\/strong> <code>https:\/\/api.anthropic.com\/v1\/messages<\/code>, <code>https:\/\/api.anthropic.com\/v1\/models<\/code><\/li>\n<li>Terms of use: https:\/\/www.anthropic.com\/legal\/commercial-terms<\/li>\n<li>Privacy policy: https:\/\/www.anthropic.com\/legal\/privacy<\/li>\n<\/ul>\n\n<h4>OpenRouter<\/h4>\n\n<p>Used when the provider <strong>OpenRouter<\/strong> is selected, with your own key.<\/p>\n\n<ul>\n<li><strong>What is sent:<\/strong> the conversation and system prompt as described above, plus the model name, authorised with your key.<\/li>\n<li><strong>When:<\/strong> each time a visitor submits a message, and when you load the model list.<\/li>\n<li><strong>Endpoints:<\/strong> <code>https:\/\/openrouter.ai\/api\/v1\/chat\/completions<\/code>, <code>https:\/\/openrouter.ai\/api\/v1\/models<\/code><\/li>\n<li>Terms of use: https:\/\/openrouter.ai\/terms<\/li>\n<li>Privacy policy: https:\/\/openrouter.ai\/privacy<\/li>\n<\/ul>\n\n<h4>Custom endpoint<\/h4>\n\n<p>When you select the custom provider, requests go to the HTTPS base URL you\nentered and to no one else. You are responsible for the terms that apply there.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin through <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>, then activate it.<\/li>\n<li>Open <strong>KnowScapes AI<\/strong> in the admin menu.<\/li>\n<li>Pick a provider.<\/li>\n<li>Enter that provider's API key. For KnowScapes you can instead request a free key right under the API key field: enter your e-mail address, confirm the transfer, press the button, then either press the button in the e-mail you receive or paste the key into the API key field.<\/li>\n<li>The list of models or agents loads by itself once the key is entered, and the first entry is selected. Pick another from the dropdown if you prefer, or choose <strong>Enter manually\u2026<\/strong> for an endpoint that publishes no list.<\/li>\n<li>Tick the consent box, tick <strong>Show the chat widget on the front end<\/strong>, and save.<\/li>\n<li>The launcher now appears in the bottom-right corner of your site. To put the chat inside a post, a page or a template instead, use the <code>[knowscapes_ai_chat]<\/code> shortcode and set <strong>Where the launcher appears<\/strong> to the shortcode-only option.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20a%20paid%20account%20anywhere%3F\"><h3>Do I need a paid account anywhere?<\/h3><\/dt>\n<dd><p>No. KnowScapes issues a free Community key, which is enough to run the widget.\nIf you would rather use OpenAI, Anthropic or OpenRouter, you use your own key\nthere and are billed by them.<\/p><\/dd>\n<dt id=\"i%20have%20a%20paid%20knowscapes%20key.%20which%20provider%20do%20i%20select%3F\"><h3>I have a paid KnowScapes key. Which provider do I select?<\/h3><\/dt>\n<dd><p><strong>KnowScapes (paid plan)<\/strong>. It is technically identical to the free entry \u2014 same\nservice, same address, same agents \u2014 but it is a separate entry with a key slot\nof its own, so a paid key is not pasted into a field labelled as the fair-use\ntier, and switching between the two does not overwrite either key. The free-key\nrequest form only appears while the free entry is selected.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20the%20community%20plan%27s%20allowance%20is%20reached%3F\"><h3>What happens when the Community plan's allowance is reached?<\/h3><\/dt>\n<dd><p>The KnowScapes service declines further messages until the next period, and\nvisitors see a short notice that the assistant is unavailable for now. The\nplugin itself is unaffected: nothing is disabled, no setting is lost, and the\nwidget resumes on its own once the allowance is back. The reason, and a link to\nthe current figures, appear on the plugin's settings screen while it lasts.<\/p>\n\n<p>If the allowance is too small for your site, enter your own OpenAI, Anthropic or\nOpenRouter key instead \u2014 the plugin works the same way with any of them.<\/p><\/dd>\n<dt id=\"a%20reply%20stops%20in%20the%20middle%20of%20a%20sentence\"><h3>A reply stops in the middle of a sentence<\/h3><\/dt>\n<dd><p>The reply ran into <strong>Maximum reply length<\/strong> on the settings screen. That setting\nis the room a single answer gets; when a model reaches it, it stops wherever it\nhappens to be, which reads as the assistant breaking mid-thought. Raise it \u2014 the\ndefault is 4096 tokens, roughly 3,000 words, and up to 32768 is accepted. Only the\ntokens actually used are billed, so a generous limit costs nothing by itself.<\/p>\n\n<p>The plugin now notices this rather than leaving you to spot it by reading the\nchat: the reply carries a short neutral line telling the visitor it was cut short\nand that they can ask for the rest, and the settings screen shows which limit was\nhit and suggests a higher one. That notice clears itself once the limit is raised.<\/p><\/dd>\n<dt id=\"how%20do%20i%20put%20the%20chat%20inside%20a%20page%20instead%20of%20in%20the%20corner%3F\"><h3>How do I put the chat inside a page instead of in the corner?<\/h3><\/dt>\n<dd><p>Use the shortcode <code>[knowscapes_ai_chat]<\/code> in a post, a page, a block or a\ntemplate. Add a height if the default of 480 pixels does not suit:\n    [knowscapes_ai_chat height=\"600\"]. Each shortcode is a chat of its own, so two\non one page do not share a conversation, and the floating launcher \u2014 if you leave\nit switched on \u2014 is a third. To have the chat only where you place it, set <strong>Where\nthe launcher appears<\/strong> to the shortcode-only option.<\/p><\/dd>\n<dt id=\"can%20i%20keep%20the%20chat%20off%20certain%20pages%3F\"><h3>Can I keep the chat off certain pages?<\/h3><\/dt>\n<dd><p>Three ways, and they combine. <strong>Where the launcher appears<\/strong> can restrict it to\nthe content types you choose, which means single entries of those types \u2014\narchives, the blog index and search results are not single entries and never\nmatch. <strong>Never on these entries<\/strong> takes a list of post or page IDs and suppresses\nthe launcher there whatever the rule above says, which is what you want for a\ncheckout or a contact page. And the launcher can be hidden on screens narrower\nthan 600 pixels, for sites where a chat panel would cover the page on a phone. A\nshortcode placed inside an entry always works, exclusions included \u2014 placing it\nthere is itself the decision.<\/p><\/dd>\n<dt id=\"what%20does%20page%20context%20actually%20send%3F\"><h3>What does page context actually send?<\/h3><\/dt>\n<dd><p>With page context on, the title, address and plain text of the page the visitor\nis reading are put into your system prompt wherever you wrote <code>{title}<\/code>, <code>{url}<\/code>\nor <code>{content}<\/code>, up to the character limit you set, and travel to the provider\nwith each message. <code>{site_name}<\/code> is also available.<\/p>\n\n<p>Only fully published, public content is ever read. A draft, a scheduled or\npending post, a private one, a password-protected one, a revision, an autosave\nand anything of a post type that is not publicly queryable are all refused, and\nthe text is taken from the stored content with shortcodes stripped rather than\nexecuted. This matters because the page is identified by an ID that comes from\nthe visitor's browser, so it has to be treated as something anyone can change:\nthe checks are what stop the assistant being asked about post 123 and answering\nout of an unpublished draft.<\/p>\n\n<p>It is off by default, because it changes what leaves your site. Switching it on\nalso adds a paragraph to the privacy policy text the plugin suggests under\n<strong>Tools \u2192 Privacy<\/strong>.<\/p><\/dd>\n<dt id=\"can%20i%20keep%20the%20assistant%20for%20my%20own%20team%3F\"><h3>Can I keep the assistant for my own team?<\/h3><\/dt>\n<dd><p>Set <strong>Who may use it<\/strong> to signed-in users only. That both hides the chat and\nrefuses the request behind it, so it is not bypassed by someone who knows the\nREST route. Signed-in users also get their own rate limit, counted per account\nrather than per address \u2014 which is fairer as well as more accurate, since\ncolleagues behind one office router no longer share a single budget.<\/p><\/dd>\n<dt id=\"why%20do%20so%20few%20visitors%20send%20a%20message%3F\"><h3>Why do so few visitors send a message?<\/h3><\/dt>\n<dd><p>An empty box asks the visitor to think of something. Starter questions give them\ntwo to four buttons instead; they cost nothing until one is clicked, and they\nalso steer people towards what your agent answers well. Set them under\nAppearance, one per line.<\/p><\/dd>\n<dt id=\"can%20i%20remove%20the%20%22ai%20assistant%22%20line%20under%20the%20chat%3F\"><h3>Can I remove the \"AI assistant\" line under the chat?<\/h3><\/dt>\n<dd><p>You can reword it, not remove it. The field is <strong>AI notice<\/strong> under Appearance;\nleave it empty for the built-in text, or write your own \u2014 in your site's\nlanguage, for example. Article 50 of the EU AI Act requires that people can tell\nthey are talking to an AI, and the same line tells them that replies can be wrong,\nwhich protects you as well. If you build your own front end on the REST route\ninstead of using this widget, show an equivalent notice there.<\/p><\/dd>\n<dt id=\"can%20visitors%20see%20my%20api%20key%3F\"><h3>Can visitors see my API key?<\/h3><\/dt>\n<dd><p>No. The browser only ever talks to a REST route on your own site. The key is\nadded server-side and never appears in any page, script or response.<\/p><\/dd>\n<dt id=\"is%20any%20visitor%20data%20stored%3F\"><h3>Is any visitor data stored?<\/h3><\/dt>\n<dd><p>The plugin stores no conversations, no cookies and no visitor identifiers. A\nconversation exists only in the visitor's browser and is gone when the page is\nclosed.<\/p>\n\n<p>That covers this plugin and your site. It says nothing about how long your\nchosen provider keeps the messages you transmit to them \u2014 that is set by their\nterms and privacy policy, it differs between providers, and the plugin has no\nway to know it. Read the policy of the provider you selected before you describe\nretention in your own privacy policy; the links are next to the consent box on\nthe settings screen. The visitor's IP address is hashed into a short-lived counter purely to\nenforce the rate limit. The counter lives in the plugin's own database table,\nexpires after two minutes and is deleted at the next clean-up. The address\nitself is never written anywhere.<\/p><\/dd>\n<dt id=\"the%20chat%20says%20the%20page%20has%20expired\"><h3>The chat says the page has expired<\/h3><\/dt>\n<dd><p>The request is protected by a WordPress nonce, and nonces have a limited\nlifetime, so a page served from a cache older than that carries a dead one. The\nwidget detects this, fetches a fresh nonce and retries the message once by\nitself, so in practice you should not see this. If you do, reloading the page\nalways fixes it.<\/p><\/dd>\n<dt id=\"the%20rate%20limit%20counts%20all%20my%20visitors%20as%20one\"><h3>The rate limit counts all my visitors as one<\/h3><\/dt>\n<dd><p>Visitors are bucketed by the address your web server reports. Forwarded-for\nheaders are deliberately not trusted, because anyone can send one and the limit\nwould be trivial to bypass. Behind a CDN or a reverse proxy, though, that address\nis the proxy, so every visitor shares one budget. If you trust your proxy, supply\nthe real address with the <code>knowscapes_ai_client_client_ip<\/code> filter:<\/p>\n\n<pre><code>add_filter( 'knowscapes_ai_client_client_ip', function () { return $_SERVER['HTTP_CF_CONNECTING_IP'] ?? $_SERVER['REMOTE_ADDR']; } );\n<\/code><\/pre><\/dd>\n<dt id=\"how%20do%20i%20stop%20the%20chat%20running%20up%20a%20bill%3F\"><h3>How do I stop the chat running up a bill?<\/h3><\/dt>\n<dd><p>Two limits work together. The per-visitor limit caps how fast one address can\nsend, and the daily ceiling caps how many messages the whole site will answer in\na day, which is the one that matters under abuse because an attacker can change\naddress. Both are on the settings screen; the daily ceiling defaults to 500 and\ncan be set to 0 to remove it. Only messages that actually reach the provider are\ncounted, so malformed requests cannot exhaust your budget.<\/p>\n\n<p>The daily counter is best-effort rather than exact: WordPress offers no atomic\ncounter that works both with and without a persistent object cache, so a burst of\ntruly simultaneous requests can slip a few past the ceiling. It undercounts, never\nover, so it will not lock out your visitors early. Treat it as a guardrail against\nrunaway usage, and set a hard spending limit at your provider as well if the bill\nmatters to you.<\/p><\/dd>\n<dt id=\"where%20do%20i%20see%20why%20the%20provider%20rejected%20something%3F\"><h3>Where do I see why the provider rejected something?<\/h3><\/dt>\n<dd><p>The chat itself only ever tells visitors that the assistant is unavailable, so\nnothing about your configuration leaks to them. The provider's own wording is\nshown to you when you press <strong>Load available entries<\/strong> on the settings screen,\nand, with <code>WP_DEBUG<\/code> and <code>WP_DEBUG_LOG<\/code> both enabled, is written to the WordPress\ndebug log. The API key is never included in either.<\/p><\/dd>\n<dt id=\"why%20does%20the%20reply%20appear%20all%20at%20once%20instead%20of%20word%20by%20word%3F\"><h3>Why does the reply appear all at once instead of word by word?<\/h3><\/dt>\n<dd><p>This version fetches the complete reply and then reveals it progressively in the\nbrowser, which keeps the whole transport on the WordPress HTTP API and needs no\ndirect socket handling. A token-by-token streaming transport is planned for a\nlater release.<\/p><\/dd>\n<dt id=\"which%20third-party%20libraries%20are%20bundled%3F\"><h3>Which third-party libraries are bundled?<\/h3><\/dt>\n<dd><p>Two, both GPL-compatible, both shipped unminified, both served locally and never\nfrom a CDN:<\/p>\n\n<ul>\n<li>marked 15.0.12 (MIT) \u2014 https:\/\/github.com\/markedjs\/marked<\/li>\n<li>DOMPurify 3.4.16 (Apache-2.0 \/ MPL-2.0) \u2014 https:\/\/github.com\/cure53\/DOMPurify<\/li>\n<\/ul>\n\n<p>Nothing in this package is minified and no build step runs over the plugin's own\ncode: every line that runs is a line you can read. Both libraries are the browser\ndistribution each project publishes, unmodified apart from a trailing source-map\ncomment removed because the map files are not shipped. marked is pinned to 15.0.12\nrather than the newest release because from version 16 on it publishes only a\nbundled, minified browser build.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.3.1<\/h4>\n\n<ul>\n<li>The per-visitor rate limit, the site-wide daily ceiling and the free-key request throttle now count atomically, in a small table of the plugin's own (<code>{prefix}knowscapes_ai_client_rate<\/code>). Before, each counter was read and written back as a transient in two steps, so requests arriving at the same moment could be counted as one and get past a limit. The table is created on activation and on update, and removed on uninstall.<\/li>\n<\/ul>\n\n<h4>2.3.0<\/h4>\n\n<ul>\n<li>Added an AI notice under every chat: visitors are told that they are talking to an AI and that replies may contain mistakes. The wording can be changed under Appearance \u2192 AI notice (up to 200 characters, plain text); an empty field uses the built-in text. The notice cannot be switched off, because the EU AI Act requires that people can tell they are interacting with an AI. It is linked to the chat panel for screen readers.<\/li>\n<li>The model or agent is now picked from a dropdown filled with the provider's own list, instead of typed. The list loads by itself as soon as an API key is entered \u2014 after a paste, when the field is left, or after a short pause in typing \u2014 and the first entry is selected unless the current one is in the list. <strong>Enter manually\u2026<\/strong> keeps free entry for endpoints that publish no list. Opening the settings screen still contacts no one.<\/li>\n<li>Moved the free-key request from the foot of the settings screen to the row directly under the API key field, where the key is needed. It is open while no key is stored and folds into one line once there is one. It still posts separately from the settings and only after its consent box is ticked.<\/li>\n<li>Renamed the free provider entry to <strong>KnowScapes Community (free key)<\/strong>, after the free KnowScapes plan. Stored keys and settings are unaffected.<\/li>\n<li>Translatable strings with several placeholders now number them, and the excluded-entries count uses a proper plural form, so every language can translate them correctly. The key from an install link is sanitised before it is validated.<\/li>\n<li>The readme now links the KnowScapes service description, which states processing location, retention and sub-processors.<\/li>\n<\/ul>\n\n<h4>2.2.1<\/h4>\n\n<ul>\n<li>Corrected the privacy policy text the plugin suggests under Tools \u2192 Privacy. It said conversations are held in the browser only \u2014 true of the plugin, but a site owner pasting it into their own policy would have been stating something about their chosen provider's retention that the plugin cannot know. Every claim is now scoped to the plugin, with a sentence pointing at the provider's own terms.<\/li>\n<li>The same clarification in the \"Is any visitor data stored?\" FAQ entry.<\/li>\n<\/ul>\n\n<h4>2.2.0<\/h4>\n\n<ul>\n<li>Added the <code>[knowscapes_ai_chat]<\/code> shortcode, so the chat can sit inside a post, a page, a block or a template instead of only in the corner. Each one is a conversation of its own, and the height is settable per shortcode.<\/li>\n<li>Added placement control: the floating launcher can appear on every page, only on the content types you choose, or nowhere at all. Individual entries can be excluded by ID, and the launcher can be hidden on screens narrower than 600 pixels.<\/li>\n<li>Added starter questions \u2014 up to four buttons in the empty chat. They are sent only when a visitor clicks one, so they cost nothing until then.<\/li>\n<li>Added page context: <code>{title}<\/code>, <code>{url}<\/code>, <code>{site_name}<\/code> and <code>{content}<\/code> in the system prompt are filled in from the page the visitor is reading. Off by default. Only fully published public content is ever read \u2014 drafts, scheduled, pending and private posts, password-protected posts, revisions, autosaves and non-public post types are all refused, because the page is identified by an ID that comes from the browser.<\/li>\n<li>Added a signed-in-users-only mode. It hides the chat and refuses the REST request, rather than only hiding it, and signed-in users get their own rate limit counted per account instead of per address.<\/li>\n<li>Added a copy button to every reply, optional avatars, and a choice of bottom corner and distance from the edge for the launcher.<\/li>\n<li>Avatars are drawn in the browser from the launcher icon and a generic symbol. No avatar service is contacted, so this adds no outbound request and tells no third party that the page was viewed.<\/li>\n<li>The privacy policy text the plugin suggests now describes the page-context transfer, but only while page context is switched on.<\/li>\n<li>Scripts and styles are now registered up front and enqueued only where a chat is actually rendered, so a page with no chat on it loads neither.<\/li>\n<\/ul>\n\n<h4>2.1.0<\/h4>\n\n<ul>\n<li>Added <strong>KnowScapes (paid plan)<\/strong> as a provider of its own, for sites using a paid KnowScapes key rather than the free fair-use one. It is the same service and endpoint as the free entry, with a separate key slot, so both keys can be stored side by side. The free-key request form now appears only while the free entry is selected.<\/li>\n<li>Raised the default reply length from 1024 to 4096 tokens, and the accepted maximum from 8192 to 32768. 1024 tokens is roughly 750 words, which a thorough answer passes easily \u2014 the reply then stopped mid-sentence with nothing to say why. Installations still on the old default are raised to the new one on update; a value you set yourself is left untouched.<\/li>\n<li>A reply that runs into the length limit is now recognised as such. Visitors get a short neutral line saying the reply was cut short and that they can ask for the rest, and the settings screen names the limit that was hit and suggests a higher one. Previously a truncated reply was indistinguishable from a finished one.<\/li>\n<li>The reply length field now explains what the setting does and what it costs.<\/li>\n<\/ul>\n\n<h4>2.0.1<\/h4>\n\n<ul>\n<li>Fixed the Save button doing nothing at all on the settings screen. The endpoint field was validated by the browser while being hidden for every provider except the custom one, and a browser refuses to submit a form holding an invalid control it cannot focus \u2014 with no message anywhere. The field is now validated on the server, which can report the problem properly.<\/li>\n<li>The endpoint URL is no longer discarded when a save does not include that field.<\/li>\n<li>Removed the 64-token step on the reply length, which rejected sensible values such as 1000.<\/li>\n<li>Turned off browser autofill on the endpoint and model fields.<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>Added support for OpenAI, Anthropic, OpenRouter and any OpenAI-compatible endpoint alongside KnowScapes, each with its own stored key.<\/li>\n<li>Added a request form for a free KnowScapes fair-use key, with the key delivered by e-mail and an install link that opens a confirmation screen on this site.<\/li>\n<li>Removed the shared API key and agent identifier that earlier versions shipped as defaults. Every installation now supplies its own key.<\/li>\n<li>The widget now stays hidden until the site owner has consented to the outbound data transfer and switched it on explicitly.<\/li>\n<li>Replaced the direct cURL streaming transport with the WordPress HTTP API; replies are revealed progressively in the browser instead.<\/li>\n<li>Added a configurable system prompt and reply length cap.<\/li>\n<li>Added suggested privacy policy text via the WordPress privacy tools.<\/li>\n<li>Renamed all CSS classes, script handles and JavaScript globals to a plugin-specific prefix.<\/li>\n<li>Every string is now translatable and every output escaped.<\/li>\n<li>Uninstalling now removes the plugin's transients as well as its option, across every site of a multisite network.<\/li>\n<li>Added a site-wide daily ceiling next to the per-visitor rate limit, so the assistant cannot run up an unbounded bill under abuse.<\/li>\n<li>A provider reporting that an allowance is used up is now told apart from one reporting momentary overload. The provider's own wording and any link it supplies are shown to the site owner on the settings screen and clear themselves once the allowance is back; visitors see only a short neutral notice.<\/li>\n<li>The chat widget now recovers by itself from a stale nonce on a heavily cached page instead of asking the visitor to reload.<\/li>\n<li>Visitor messages are no longer passed through a tag stripper, which used to truncate any message containing a \"&lt;\" character.<\/li>\n<li>Bundled marked and DOMPurify now ship unminified and readable, so no minified code remains anywhere in the package.<\/li>\n<\/ul>\n\n<p><h4>1.0.1<\/h4><\/p>\n\n<ul>\n<li>Fixed the launcher being distorted by themes that set global button dimensions.<\/li>\n<li>Fixed the launcher icon not rendering in Firefox.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"AI chat widget for your site. Use your own OpenAI, Anthropic or OpenRouter key, or a free KnowScapes Community key.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/380146","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=380146"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/xplicator"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=380146"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=380146"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=380146"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=380146"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=380146"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=380146"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}