{"id":317200,"date":"2026-07-18T12:42:48","date_gmt":"2026-07-18T12:42:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/sohay-ai-chatbot-for-knowledge-base-support\/"},"modified":"2026-09-20T01:08:03","modified_gmt":"2026-09-20T01:08:03","slug":"sohaychat","status":"publish","type":"plugin","link":"https:\/\/pt.wordpress.org\/plugins\/sohaychat\/","author":14068367,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.4.0","stable_tag":"1.4.0","tested":"7.1.1","requires":"6.6","requires_php":"8.1","requires_plugins":null,"header_name":"Sohaychat \u2013 AI Chatbot & Support Agent for WooCommerce","header_author":"Bengal Studio","header_description":"AI chatbot with a Knowledge Base for customer support. Streaming answers, plus a Conversations admin and team assignment.","assets_banners_color":"f5f5f5","last_updated":"2026-09-20 01:08:03","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/sohaychat.com\/","header_author_uri":"https:\/\/bengal-studio.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":334,"num_ratings":0,"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":"bhoot","date":"2026-07-18 12:42:29","revision":3612581},"1.1.0":{"tag":"1.1.0","author":"bhoot","date":"2026-07-31 20:18:30","revision":3630461},"1.2.0":{"tag":"1.2.0","author":"bhoot","date":"2026-08-03 10:02:20","revision":3632666},"1.3.0":{"tag":"1.3.0","author":"bhoot","date":"2026-08-26 16:39:08","revision":3667472},"1.4.0":{"tag":"1.4.0","author":"bhoot","date":"2026-09-20 01:08:03","revision":3703757}},"upgrade_notice":{"1.4.0":"<p>Now listed as Sohaychat. Adds quick replies, order lookups for signed-in customers, and a setting for what visitors must share before reaching your team. Upgrading sites keep allowing anonymous chats. Optional reply-by-email to visitors, off by default. Runs a one-time database update.<\/p>","1.3.0":"<p>Security fix to message authorship. Adds human handoff: a teammate can take over a chat, off by default; enable under Sohay \u2192 Settings. Also adds a Knowledge Base index page. If your permalinks use a prefix like \/blog\/, Knowledge Base URLs move to the site root; add redirects.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3630463,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3630463,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3630463,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3630463,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3630463,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.1.0","1.2.0","1.3.0","1.4.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3630463,"resolution":"1","location":"assets","locale":"","width":2400,"height":1640},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3630463,"resolution":"2","location":"assets","locale":"","width":2400,"height":1640},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3630463,"resolution":"3","location":"assets","locale":"","width":2400,"height":1640},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3630463,"resolution":"4","location":"assets","locale":"","width":2400,"height":1640},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3630463,"resolution":"5","location":"assets","locale":"","width":2880,"height":1880},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3630463,"resolution":"6","location":"assets","locale":"","width":2880,"height":1880},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3630463,"resolution":"7","location":"assets","locale":"","width":2880,"height":2150},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3630463,"resolution":"8","location":"assets","locale":"","width":2880,"height":2360}},"screenshots":{"1":"The chat launcher sitting in the bottom-right of the site, respecting iOS safe-area-inset above the home indicator.","2":"The expanded chat panel mid-conversation, streaming an answer grounded in a Knowledge Base article.","3":"Shopping in the chat \u2014 a product search returning live catalog results, each card carrying the store's own price, stock, and \"Add to cart\".","4":"Adding to the cart from the chat, with the running cart, totals, an Undo button, and a link straight to checkout.","5":"<strong>Sohaychat \u2192 Conversations<\/strong> \u2014 the admin SPA listing recent conversations with filter, search, and assignee controls.","6":"A single conversation opened in the admin, showing message history and the reply composer.","7":"<strong>Sohaychat \u2192 AI Settings \u2192 Spend protection<\/strong> \u2014 daily per-visitor and site-wide token caps with the live usage readout.","8":"<strong>Sohaychat \u2192 Dashboard<\/strong> \u2014 conversation volume and trends, recent activity, recently published Knowledge Base articles, and quick actions."}},"plugin_section":[],"plugin_tags":[2353,2364,2369,14090,286],"plugin_category":[47],"plugin_contributors":[154526],"plugin_business_model":[],"class_list":["post-317200","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-chatbot","plugin_tags-customer-support","plugin_tags-knowledge-base","plugin_tags-woocommerce","plugin_category-education-and-support","plugin_contributors-bhoot","plugin_committers-bhoot"],"banners":{"banner":"https:\/\/ps.w.org\/sohaychat\/assets\/banner-772x250.png?rev=3630463","banner_2x":"https:\/\/ps.w.org\/sohaychat\/assets\/banner-1544x500.png?rev=3630463","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/sohaychat\/assets\/icon.svg?rev=3630463","icon":"https:\/\/ps.w.org\/sohaychat\/assets\/icon.svg?rev=3630463","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/sohaychat\/assets\/screenshot-1.png?rev=3630463","caption":"The chat launcher sitting in the bottom-right of the site, respecting iOS safe-area-inset above the home indicator."},{"src":"https:\/\/ps.w.org\/sohaychat\/assets\/screenshot-2.png?rev=3630463","caption":"The expanded chat panel mid-conversation, streaming an answer grounded in a Knowledge Base article."},{"src":"https:\/\/ps.w.org\/sohaychat\/assets\/screenshot-3.png?rev=3630463","caption":"Shopping in the chat \u2014 a product search returning live catalog results, each card carrying the store's own price, stock, and \"Add to cart\"."},{"src":"https:\/\/ps.w.org\/sohaychat\/assets\/screenshot-4.png?rev=3630463","caption":"Adding to the cart from the chat, with the running cart, totals, an Undo button, and a link straight to checkout."},{"src":"https:\/\/ps.w.org\/sohaychat\/assets\/screenshot-5.png?rev=3630463","caption":"<strong>Sohaychat \u2192 Conversations<\/strong> \u2014 the admin SPA listing recent conversations with filter, search, and assignee controls."},{"src":"https:\/\/ps.w.org\/sohaychat\/assets\/screenshot-6.png?rev=3630463","caption":"A single conversation opened in the admin, showing message history and the reply composer."},{"src":"https:\/\/ps.w.org\/sohaychat\/assets\/screenshot-7.png?rev=3630463","caption":"<strong>Sohaychat \u2192 AI Settings \u2192 Spend protection<\/strong> \u2014 daily per-visitor and site-wide token caps with the live usage readout."},{"src":"https:\/\/ps.w.org\/sohaychat\/assets\/screenshot-8.png?rev=3630463","caption":"<strong>Sohaychat \u2192 Dashboard<\/strong> \u2014 conversation volume and trends, recent activity, recently published Knowledge Base articles, and quick actions."}],"raw_content":"<!--section=description-->\n<p>Sohaychat adds an AI chat widget to your WordPress site that answers visitor questions from the articles you publish. You write articles in the built-in Knowledge Base, and the chatbot looks up the best matches before it replies \u2014 so it stays on-topic and uses your real content instead of guessing.<\/p>\n\n<p><strong>On a WooCommerce store, the chatbot shops with your visitors.<\/strong> It searches your catalog, pulls up a product with its size and colour options, reads live stock and prices, answers shipping, returns, and refund questions from your store's own pages, and adds, changes, or removes items in the shopper's cart \u2014 without them leaving the conversation. Signed-in customers can also ask where their own order has got to. Every cart change comes with an Undo button, and every price and stock status is read from your store rather than invented. On sites without WooCommerce, none of it appears.<\/p>\n\n<p>Every conversation is saved in a built-in inbox under <strong>Sohaychat \u2192 Conversations<\/strong> \u2014 your team can read, search, filter, assign, and reply from one place.<\/p>\n\n<h4>Why site owners pick Sohaychat<\/h4>\n\n<ul>\n<li><strong>Answers from your own content<\/strong> \u2014 the chatbot reads the articles you publish in your Knowledge Base. It doesn't make up product details or invent prices.<\/li>\n<li><strong>Sells, not just supports<\/strong> \u2014 on a WooCommerce store the chatbot searches your catalog, checks stock and prices, and fills the shopper's cart inside the conversation. Signed-in customers can ask after their own orders instead of opening a ticket. Declares HPOS and Cart-Checkout-Blocks compatibility. On sites without WooCommerce the shopping tools stay hidden and everything else works the same.<\/li>\n<li><strong>No coding to set up<\/strong> \u2014 paste an OpenAI or Google Gemini API key, publish a few articles, click \"Sync All Articles\". The widget appears on every page.<\/li>\n<li><strong>A real inbox for your team<\/strong> \u2014 every conversation is saved. Search, filter by status, assign one to a teammate, or reply yourself.<\/li>\n<li><strong>Predictable costs<\/strong> \u2014 set a daily token cap and the plugin stops calling your AI provider for the rest of the day once you hit it. A runaway loop or a hostile bot can't drain your account overnight.<\/li>\n<li><strong>GDPR-friendly out of the box<\/strong> \u2014 conversations are stored on your own site, in your own database. A chat belonging to a signed-in visitor, or carrying an email address the visitor gave you, flows through WordPress's built-in <strong>Export \/ Erase Personal Data<\/strong> tools; a chat from someone who shared nothing has no email to match on and is erased by deleting it from the <strong>Conversations<\/strong> inbox. See <strong>Privacy<\/strong> below.<\/li>\n<\/ul>\n\n<h4>What's included<\/h4>\n\n<ul>\n<li>A <strong>chat widget<\/strong> that drops into every page (you can hide it on pages you don't want it on).<\/li>\n<li><strong>WooCommerce shopping tools<\/strong> (WooCommerce 7.0 or later) \u2014 catalog search and browse, product and variant lookup, live stock and prices, shipping\/returns\/refund answers, add, change, or remove in the shopper's cart, and order status for signed-in customers. Each result renders as a card in the chat rather than a wall of text.<\/li>\n<li>A <strong>Knowledge Base<\/strong> section in the WordPress admin, with a \"Sync All Articles\" button.<\/li>\n<li>A <strong>Conversations admin<\/strong> where you can read, search, filter, assign, reply, pin, and close chats.<\/li>\n<li><strong>Quick replies<\/strong> \u2014 saved answers your team can drop into a reply from the lightning-bolt button in the composer, or by typing <code>\/<\/code> in an empty draft. Search them, pick one with the arrow keys, and edit it before sending. Managed under <strong>Sohaychat \u2192 Quick replies<\/strong>.<\/li>\n<li><strong>Collect customer details<\/strong> \u2014 decide what a visitor has to share before someone from your team joins their chat: require them to sign in, ask for a name and email, or ask for nothing. Set it under <strong>Sohaychat \u2192 Settings<\/strong>, with an optional marketing opt-in whose wording you write yourself. The chatbot still answers everyone in every mode.<\/li>\n<li><strong>Email visitors when you reply<\/strong> \u2014 answer a chat the visitor has already closed and Sohaychat can email them your reply, with a one-click link to stop further emails. Off by default.<\/li>\n<li>An <strong>AI Settings<\/strong> screen for picking the AI provider and model, writing the welcome message, and setting daily spend caps.<\/li>\n<li>A <strong>Diagnostics<\/strong> screen that shows today's token usage and the most recent plugin log entries.<\/li>\n<li><strong>Fast page loads<\/strong> \u2014 the chat code only downloads when a visitor actually opens the chat, not on every page view.<\/li>\n<li><strong>Your API keys are encrypted<\/strong> in the database and never shown in the admin UI after you save them.<\/li>\n<\/ul>\n\n<h4>You'll need<\/h4>\n\n<ul>\n<li>A WordPress site running version 6.6 or later, on PHP 8.1 or later.<\/li>\n<li>An account and API key with <strong>OpenAI<\/strong> or <strong>Google (Gemini)<\/strong>. You pay that provider directly for the model usage \u2014 Sohaychat does not resell access. A typical small support site stays in single-digit dollars per month. If you use the Knowledge Base, you need an OpenAI key regardless of which provider answers the chat \u2014 see <strong>External services<\/strong>.<\/li>\n<li>Optional \u2014 WooCommerce 7.0 or later, if you want the shopping tools. Everything else works without it.<\/li>\n<\/ul>\n\n<h4>External services<\/h4>\n\n<p>Sohaychat sends data to an AI provider to generate chat answers, and to OpenAI to index and search your Knowledge Base. Without an account and API key for at least one provider, the plugin has no upstream model to call and the chat widget cannot answer questions.<\/p>\n\n<p><strong>Which service receives your visitors' messages depends on the provider you select<\/strong> under <strong>Sohaychat \u2192 AI Settings<\/strong>:<\/p>\n\n<ul>\n<li><strong>OpenAI<\/strong> (https:\/\/openai.com) \u2014 the default.<\/li>\n<li><strong>Google (Gemini)<\/strong> (https:\/\/ai.google.dev) \u2014 optional alternative.<\/li>\n<\/ul>\n\n<p><strong>Knowledge Base indexing and search always go to OpenAI<\/strong>, whichever provider answers the chat. If you select Google and switch the Knowledge Base on, keep an OpenAI key saved as well; without one the chatbot answers without consulting your articles.<\/p>\n\n<p><strong>What is sent, and when<\/strong><\/p>\n\n<ul>\n<li><strong>When a visitor sends a chat message<\/strong> \u2014 the message text and recent conversation history are forwarded over HTTPS to the selected provider and processed by the model configured under <strong>Sohaychat \u2192 AI Settings<\/strong>. That is <code>https:\/\/api.openai.com\/v1\/responses<\/code> for OpenAI, or <code>https:\/\/generativelanguage.googleapis.com\/v1beta\/models\/*:streamGenerateContent<\/code> for Google.<\/li>\n<li><strong>When you publish or update a Knowledge Base article<\/strong> \u2014 the title and body are sent in the background to OpenAI Files and Vector Stores (<code>https:\/\/api.openai.com\/v1\/files<\/code>, <code>\/v1\/vector_stores<\/code>, <code>\/v1\/vector_stores\/*\/files<\/code>) so the chat can retrieve them. The sync runs in the background, not while you click Save. This happens on OpenAI regardless of which provider answers the chat.<\/li>\n<li><strong>When the chatbot looks something up in your Knowledge Base<\/strong> \u2014 the visitor's question is sent to <code>https:\/\/api.openai.com\/v1\/vector_stores\/*\/search<\/code> to find matching articles, and the matched article text is then sent on to whichever provider is generating the reply.<\/li>\n<li><strong>On a WooCommerce store, when the chatbot uses a shopping tool<\/strong> \u2014 the answer it looks up is sent back to the model so it can reply, in the same conversation as the message that prompted it. Depending on the tool, that is: product names, descriptions, prices, sale prices, stock status, categories, tags, option names and values (size, colour), product page and image URLs; the text of the store pages you have set as Terms, Privacy, Refunds and Returns, plus any Knowledge Base articles matched to a shipping, returns or refund question; and the contents of the shopper's cart \u2014 the items in it, their quantities and options, and the cart totals. This happens only on stores running WooCommerce, and only for the tools the chatbot actually calls in that conversation.<\/li>\n<li><strong>On a WooCommerce store, when a signed-in customer asks about their own orders<\/strong> \u2014 the order number, its status, the date it was placed, the order total, and the names, quantities and line totals of what was in it are sent to the model so it can answer. Up to ten orders at a time. This happens only for a visitor signed in to a WordPress account, and only for that account's own orders: the customer is taken from the current login, and there is no way to ask the chatbot about anybody else's.<\/li>\n<\/ul>\n\n<p><strong>What is <em>not<\/em> sent.<\/strong> No postal address, phone number, or payment or transaction detail is ever sent to your AI provider \u2014 not from the cart, not from an order, not from anywhere else. The cart data describes the basket, not the shopper, and carries no name or email address either. The order lookup is deliberately narrow for the same reason: a customer asking where their order is needs its status, date and contents, so billing and shipping addresses, phone numbers, the customer's own email address, payment methods and transaction ids are all left out of what the model is given. Sohaychat never sends WooCommerce customer records or anything from your checkout.<\/p>\n\n<p><strong>Where it goes<\/strong><\/p>\n\n<p>All requests go over HTTPS to <code>api.openai.com<\/code> and, if you select Google, <code>generativelanguage.googleapis.com<\/code>. The plugin does not contact any other external service \u2014 no analytics, no telemetry, no third-party fonts or CDN assets, and no phone-home for updates. Updates come from WordPress.org.<\/p>\n\n<p><strong>How your API keys are handled<\/strong><\/p>\n\n<p>The API key you enter for a provider under <strong>AI Settings<\/strong> authenticates that provider's requests. Keys are encrypted at rest (AES-256-GCM) in your WordPress database, masked in the admin UI after the first save, and excluded from the WordPress REST API. A key is only ever sent to the service it belongs to. Saving a key for a provider you have not selected stores it but does not use it \u2014 that is what lets you switch back without re-entering it.<\/p>\n\n<p><strong>Your responsibilities<\/strong><\/p>\n\n<p>Before activating the plugin, please review the terms of the provider you select \u2014 OpenAI's <a href=\"https:\/\/openai.com\/policies\/terms-of-use\">Terms of Use<\/a> and <a href=\"https:\/\/openai.com\/policies\/privacy-policy\">Privacy Policy<\/a>, and if you use Gemini, Google's <a href=\"https:\/\/ai.google.dev\/gemini-api\/terms\">Gemini API Additional Terms of Service<\/a> and <a href=\"https:\/\/policies.google.com\/privacy\">Privacy Policy<\/a>. Note that Google applies different data-handling terms to free-tier and paid API keys; read the terms for the tier you are on. Because Knowledge Base indexing runs on OpenAI either way, a site with the Knowledge Base switched on shares data with OpenAI even when Gemini answers the chat. Site owners are responsible for obtaining the appropriate legal basis (consent, contract, legitimate interest, etc.) to share visitor messages with these services under GDPR, CCPA, and other applicable privacy regimes in the jurisdictions they operate in. On a WooCommerce store that basis needs to cover the shopping tools too \u2014 what a visitor has put in their cart is information about that visitor, even though no name or address is attached to it, and an order a signed-in customer asks about is information about a named account. If you ask visitors for a name and email before they can reach your team, or switch on the reply emails described under <strong>Privacy<\/strong>, the basis needs to cover those as well. If you would rather any of it never left your site, the shopping tools can be switched off individually in code; see the FAQ below.<\/p>\n\n<h4>Privacy<\/h4>\n\n<p>Conversations and messages are stored in custom database tables on your own site.<\/p>\n\n<p>For <strong>signed-in visitors<\/strong>, the plugin registers WordPress's personal-data exporter and eraser, so the standard <strong>Tools \u2192 Export Personal Data<\/strong> and <strong>Tools \u2192 Erase Personal Data<\/strong> flows include their Sohaychat conversations, matched on their account email.<\/p>\n\n<p><strong>Details a visitor gives you in the chat.<\/strong> If you ask visitors for a name and email before they can reach your team (<strong>Sohaychat \u2192 Settings \u2192 Collect customer details<\/strong>), what they type is stored on that conversation \u2014 along with whether they accepted your marketing opt-in, when they accepted it, and the exact wording they were shown at the time. Those details go into a personal-data export and are removed by an erasure request, for guests as well as registered users. Because the widget never verifies an address typed into it, an export keeps two groups apart: conversations owned by the requester's account, and conversations that merely carry their email address. The second group is labelled as unverified, because it may contain somebody else's chat.<\/p>\n\n<p><strong>Chats from visitors who shared nothing<\/strong> aren't tied to an email address, so those email-based tools can't locate them. To erase a specific guest conversation, open it under <strong>Sohaychat \u2192 Conversations<\/strong> and delete it (available to users with the AI-settings capability); it leaves the inbox immediately and is permanently purged after the retention window \u2014 30 days by default, filterable in code. A visitor can also delete their own chat from the widget, and every soft-delete follows the same purge path.<\/p>\n\n<p><strong>Emails to visitors.<\/strong> With <strong>Email visitors when you reply<\/strong> switched on (<strong>Sohaychat \u2192 Settings<\/strong>, off by default), a reply your team sends to a chat the visitor has already left is emailed to the address on that conversation. It is the only mail Sohaychat sends to somebody who is not staff. The email goes out from your own site through WordPress, not through any third-party service, and carries a one-click link that stops further emails about that conversation.<\/p>\n\n<p><strong>On a WooCommerce store<\/strong>, the chatbot's shopping tools read your catalog, your policy pages, and the visitor's own cart. What they find is sent to your AI provider so the model can answer, and it is also saved with the conversation \u2014 that is what lets the product card or cart summary still be there when the visitor scrolls back. So a stored conversation on a WooCommerce store can contain a snapshot of what that visitor had in their cart at the time. A signed-in customer who asks about their own orders leaves the same kind of trace: the order numbers, statuses, dates, totals and item names the chatbot was given in order to answer. Both are covered by the same export, erase and retention paths as the rest of the conversation \u2014 erasing the chat erases them with it. No postal address, phone number, or payment detail is involved in either \u2014 see <strong>External services<\/strong> for the exact list.<\/p>\n\n<p>See the <strong>External services<\/strong> section above for what gets sent, and to which service.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>From the <strong>Plugins \u2192 Add New<\/strong> screen, search for <strong>Sohaychat<\/strong> and click <strong>Install Now<\/strong>, then <strong>Activate<\/strong>. A new <strong>Sohaychat<\/strong> menu appears in your WordPress admin sidebar.<\/li>\n<li>Visit <strong>Sohaychat \u2192 AI Settings<\/strong>, choose your AI provider, and paste that provider's API key into its field. (If you don't have one yet, create an OpenAI key at platform.openai.com or a Gemini key at aistudio.google.com\/apikey.) Click <strong>Save<\/strong>. Keys are stored encrypted \u2014 the field shows a masked placeholder from now on.<\/li>\n<li>While still on <strong>AI Settings<\/strong>, pick the model you want to use, set a daily token cap under <strong>Spend protection<\/strong>, and (optionally) write a welcome message that greets visitors when they open the chat.<\/li>\n<li>Add at least one article under <strong>KB Articles \u2192 Add New<\/strong>. This is the content the chatbot draws from. You can write as many as you like; longer-form support articles work best.<\/li>\n<li>Visit <strong>Sohaychat \u2192 KB Settings \u2192 Dashboard<\/strong> and click <strong>Sync All Articles<\/strong>. The sync runs in the background \u2014 articles become searchable to the chatbot within a minute or two.<\/li>\n<li>Visit your site's front-end. The chat launcher appears in the bottom-right corner. Click it to open the chat and try a question your Knowledge Base can answer.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"which%20ai%20provider%20should%20i%20pick%2C%20and%20can%20i%20switch%20later%3F\"><h3>Which AI provider should I pick, and can I switch later?<\/h3><\/dt>\n<dd><p>Sohaychat works with <strong>OpenAI<\/strong> or <strong>Google (Gemini)<\/strong> \u2014 choose one under <strong>Sohaychat \u2192 AI Settings<\/strong>. OpenAI is the default. You can switch at any time; each provider's key and model choice are stored separately, so switching back does not mean re-entering anything.<\/p>\n\n<p>One thing to know before choosing: the Knowledge Base indexes and searches your articles through OpenAI whichever provider answers the chat. If you select Gemini and use the Knowledge Base, keep an OpenAI key saved as well. Without one, the chatbot still replies but stops consulting your articles.<\/p><\/dd>\n<dt id=\"do%20i%20need%20an%20account%20with%20an%20ai%20provider%3F\"><h3>Do I need an account with an AI provider?<\/h3><\/dt>\n<dd><p>Yes. Sohaychat is a front-end for someone else's models \u2014 without an API key the plugin has no model to call and the chat cannot answer questions. The provider bills you directly per token; Sohaychat does not resell access. The <strong>Spend protection<\/strong> controls under <strong>AI Settings<\/strong> let you cap daily token usage to keep costs predictable.<\/p><\/dd>\n<dt id=\"how%20much%20will%20it%20cost%20me%3F\"><h3>How much will it cost me?<\/h3><\/dt>\n<dd><p>Providers charge per token, and the per-token rate depends on the model you pick (the cheaper models cost a fraction of a cent per chat reply). A small support site typically stays in single-digit dollars per month. The <strong>Spend protection<\/strong> controls under <strong>AI Settings<\/strong> let you cap daily token usage \u2014 once the cap is hit, the plugin stops calling the provider for the rest of the day. The <strong>Diagnostics<\/strong> page shows today's usage so you can spot a runaway loop or a hostile bot before it costs you real money.<\/p><\/dd>\n<dt id=\"will%20the%20chatbot%20make%20things%20up%3F\"><h3>Will the chatbot make things up?<\/h3><\/dt>\n<dd><p>The chatbot is <em>grounded<\/em> in the articles you publish \u2014 if it can't find a matching article, it tells the visitor it doesn't know instead of inventing an answer. To improve answer quality, publish articles covering the questions you actually get asked, and write a fallback \"Contact us\" article so the chatbot can route off-topic questions to your human support team.<\/p><\/dd>\n<dt id=\"where%20can%20i%20see%20what%20visitors%20are%20asking%3F\"><h3>Where can I see what visitors are asking?<\/h3><\/dt>\n<dd><p><strong>Sohaychat \u2192 Conversations<\/strong> lists every chat \u2014 search them, filter by status, assign a chat to a teammate, or reply yourself. Turn on human handoff and you also get views for visitors waiting to talk to a person and for conversations your team has handled. The <strong>Diagnostics<\/strong> page shows OpenAI errors if you're investigating a technical problem.<\/p><\/dd>\n<dt id=\"can%20a%20real%20person%20take%20over%20a%20chat%20from%20the%20assistant%3F\"><h3>Can a real person take over a chat from the assistant?<\/h3><\/dt>\n<dd><p>Yes. Turn on <strong>Human handoff<\/strong> under <strong>Sohaychat \u2192 Settings<\/strong>, and your team can step into any conversation. While someone is handling a chat the assistant stops replying, and the visitor sees that person's name and picture on the answers rather than the AI marker. Hand it back and the assistant picks up again, with the whole exchange still in front of it.<\/p>\n\n<p>Visitors can ask for a person with a button above the message box, the assistant can fetch one when it gets stuck, and you can simply jump in \u2014 replying to a conversation takes it over.<\/p>\n\n<p>The setting is off until you switch it on, because handing someone to a person who is not there is worse than not offering it. Set the hours your team actually covers; outside them the widget stops offering, and anyone who asks anyway gets a message you write.<\/p><\/dd>\n<dt id=\"do%20i%20have%20to%20collect%20names%20and%20email%20addresses%3F\"><h3>Do I have to collect names and email addresses?<\/h3><\/dt>\n<dd><p>No \u2014 that's your call, under <strong>Sohaychat \u2192 Settings \u2192 Collect customer details<\/strong>. You can require visitors to sign in, ask them for a name and email, or ask for nothing at all. Whichever you pick, the chatbot still answers everyone straight away: the requirement applies only to reaching a person, so nobody meets a form before they have been helped. A visitor who gave their details in an earlier chat is not asked again.<\/p>\n\n<p>Sites upgrading from an earlier version keep allowing anonymous chats, so nothing changes for visitors already talking to you. New installs start on <strong>Require customers to sign in<\/strong>, which is the one the settings screen marks as recommended \u2014 it identifies people by their account rather than by an address they typed, which Sohaychat has no way to verify.<\/p>\n\n<p>The one exception is order lookups: the chatbot will only discuss a customer's orders with someone signed in, whatever you choose here.<\/p><\/dd>\n<dt id=\"will%20visitors%20know%20when%20we%20reply%20after%20they%27ve%20left%3F\"><h3>Will visitors know when we reply after they've left?<\/h3><\/dt>\n<dd><p>Only if you switch it on. <strong>Email visitors when you reply<\/strong>, under <strong>Sohaychat \u2192 Settings<\/strong>, emails your reply to a visitor who has already closed the chat \u2014 otherwise your answer sits in a thread nobody is watching. It's off by default, because it is the only mail Sohaychat sends to somebody who isn't staff.<\/p>\n\n<p>It needs an address to write to, so it does nothing unless the visitor is signed in or you're asking for a name and email. It waits a couple of minutes first and skips the mail entirely if the visitor came back and read the reply on screen, sends at most one email per conversation every 15 minutes however fast your team types, and puts a one-click link in every message that stops further emails about that chat.<\/p><\/dd>\n<dt id=\"how%20do%20i%20know%20when%20somebody%20is%20waiting%20to%20talk%20to%20us%3F\"><h3>How do I know when somebody is waiting to talk to us?<\/h3><\/dt>\n<dd><p>Four ways, so you don't have to sit watching the inbox. A <strong>Waiting for a Person<\/strong> view in <strong>Sohaychat \u2192 Conversations<\/strong> lists them oldest first. The browser tab shows a count, so a background tab still tells you. An email goes out when a request comes in \u2014 to addresses you choose, or whoever the conversation is assigned to. And the conversation itself carries a banner with a <strong>Take over<\/strong> button.<\/p>\n\n<p>If nobody picks it up within the time you set (10 minutes by default), the assistant takes the conversation back and tells the visitor honestly that nobody was available, rather than leaving them waiting.<\/p><\/dd>\n<dt id=\"does%20human%20handoff%20slow%20my%20site%20down%3F\"><h3>Does human handoff slow my site down?<\/h3><\/dt>\n<dd><p>Only while it's switched on, and only for visitors with the chat window actually open \u2014 those windows quietly check for new replies. Nothing checks while the chat is closed, while the browser tab is in the background, or after ten quiet minutes.<\/p>\n\n<p>If your host is tight on resources, that background checking is the thing to weigh. A developer can slow it down without touching the plugin's code. The full arithmetic is in the handoff documentation in the plugin's GitHub repository.<\/p><\/dd>\n<dt id=\"will%20my%20visitors%27%20chats%20be%20visible%20to%20other%20admins%3F\"><h3>Will my visitors' chats be visible to other admins?<\/h3><\/dt>\n<dd><p>By default, every WordPress administrator can read every conversation. The plugin ships with five granular capabilities so you can delegate access \u2014 for example, give a support agent the ability to read and reply to chats without granting them access to AI Settings. See the developer questions below for an overview, and the capability documentation in the plugin's GitHub repository for the full matrix with worked role-configuration examples.<\/p><\/dd>\n<dt id=\"does%20this%20slow%20down%20my%20site%3F\"><h3>Does this slow down my site?<\/h3><\/dt>\n<dd><p>A tiny launcher (~8 KB) loads on every page. The full chat code only downloads when a visitor actually clicks to open the chat, so most visitors never download it. No third-party scripts, fonts, or trackers are loaded from external CDNs.<\/p><\/dd>\n<dt id=\"why%20don%27t%20my%20translation%20or%20session-recording%20plugins%20see%20the%20chat%20widget%3F\"><h3>Why don't my translation or session-recording plugins see the chat widget?<\/h3><\/dt>\n<dd><p>The chat renders inside an isolated container so that your theme's styling cannot break the chat, and the chat's styling cannot change your site's fonts, colours, borders, or spacing. That isolation is deliberate \u2014 it is what makes the widget look and behave the same way on every theme.<\/p>\n\n<p>The trade-off is that other plugins and scripts which scan your pages for content do not look inside that container. In practice:<\/p>\n\n<ul>\n<li><strong>Translation plugins<\/strong> (TranslatePress, Weglot, and similar) will not translate the chat's own wording. This does not affect your visitors' answers \u2014 the chatbot replies in the language the visitor writes in \u2014 and Sohaychat's own buttons and labels are translated through WordPress's standard translation files.<\/li>\n<li><strong>Session-replay and heatmap tools<\/strong> (Hotjar, Clarity, FullStory) record the widget as a blank area.<\/li>\n<li><strong>Accessibility overlays<\/strong> that restyle a page from the outside will not restyle the chat.<\/li>\n<\/ul>\n\n<p>Screen readers and keyboard navigation are unaffected \u2014 assistive technology reads the accessibility tree, which the isolation does not hide.<\/p>\n\n<p>The container is open rather than sealed, so a script that explicitly supports this kind of isolation can still reach the chat's content. Most third-party scripts do not.<\/p><\/dd>\n<dt id=\"what%20can%20shoppers%20do%20in%20the%20chat%20on%20a%20woocommerce%20store%3F\"><h3>What can shoppers do in the chat on a WooCommerce store?<\/h3><\/dt>\n<dd><p>On stores running WooCommerce 7.0 or later, a shopper can:<\/p>\n\n<ul>\n<li><strong>Search and browse your catalog<\/strong> \u2014 \"show me waterproof jackets under $100\", \"what's new?\", \"what's on sale?\" \u2014 results come back as product cards with photo, price, and stock.<\/li>\n<li><strong>Look at one product in detail<\/strong>, including its options, so they can pick a size or colour without leaving the chat.<\/li>\n<li><strong>See live stock and prices<\/strong>, read from your store at the moment they ask.<\/li>\n<li><strong>Ask about shipping, returns, refunds, and payment<\/strong> \u2014 answered from your WooCommerce store pages first, then from Knowledge Base articles you've tagged \"policy\" or \"faq\".<\/li>\n<li><strong>Manage their cart<\/strong> \u2014 add an item, change a quantity, or remove a line, each with an Undo button.<\/li>\n<li><strong>Ask about their own orders<\/strong>, if they are signed in \u2014 \"where's my order?\", \"what did I buy last month?\" \u2014 answered with the order's status, date, total and contents. Signing in is always required for this, whichever <strong>Collect customer details<\/strong> option you pick, and a customer can only ever see their own orders: the chatbot takes the customer from the current login and has no way to be pointed at anybody else. Addresses, phone numbers and payment details are never part of the answer.<\/li>\n<\/ul>\n\n<p>The chatbot cannot take payment or place an order. When the shopper is ready it hands them to your normal WooCommerce checkout.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20work%20without%20woocommerce%3F\"><h3>Does the plugin work without WooCommerce?<\/h3><\/dt>\n<dd><p>Yes. The chat widget, Knowledge Base, and Conversations inbox work on any WordPress site \u2014 the shopping tools simply never appear. On stores running WooCommerce 7.0 or later they switch on by themselves, with no configuration. The plugin also declares HPOS and Cart-Checkout-Blocks compatibility so stores don't see an \"uncertified plugin\" banner.<\/p><\/dd>\n<dt id=\"can%20i%20hide%20the%20widget%20on%20specific%20pages%3F\"><h3>Can I hide the widget on specific pages?<\/h3><\/dt>\n<dd><p>Uncheck <strong>Show widget<\/strong> under <strong>Sohaychat \u2192 AI Settings<\/strong> to hide it everywhere. To hide it only on certain pages or post types, see the developer questions below.<\/p><\/dd>\n<dt id=\"can%20i%20customize%20the%20welcome%20message%20and%20system%20prompt%3F\"><h3>Can I customize the welcome message and system prompt?<\/h3><\/dt>\n<dd><p>Yes. <strong>Sohaychat \u2192 AI Settings<\/strong> has a Welcome Message field (max 280 characters). <strong>Sohaychat \u2192 KB Settings \u2192 Settings<\/strong> has a Custom System Prompt field (max 4000 characters) for the instructions the chatbot follows when it generates answers. The Custom System Prompt field recognises <code>{site_name}<\/code> and <code>{current_date}<\/code> placeholders \u2014 they are replaced with your site's title and today's date before the prompt is sent to the model.<\/p><\/dd>\n<dt id=\"where%20can%20visitors%20read%20my%20knowledge%20base%3F\"><h3>Where can visitors read my Knowledge Base?<\/h3><\/dt>\n<dd><p>At <strong>\/knowledge-base\/<\/strong> on your site. The page lists your KB categories as cards with an article count on each, a search box, and the articles filed under each category. Clicking a card opens that category; searching stays inside the Knowledge Base rather than dropping visitors into your site-wide search results.<\/p>\n\n<p>These pages are public and indexable on purpose \u2014 support articles answer the questions people type into search engines, and the chatbot cites the same URLs when it uses an article to answer.<\/p><\/dd>\n<dt id=\"can%20i%20change%20the%20knowledge%20base%20url%3F\"><h3>Can I change the Knowledge Base URL?<\/h3><\/dt>\n<dd><p>Yes. <strong>Sohaychat \u2192 KB Settings \u2192 Settings<\/strong> has a <strong>URL Base<\/strong> field. Set it to <code>docs<\/code>, <code>help<\/code>, <code>support<\/code> \u2014 whatever suits your site \u2014 and the index and every article move together, from <code>\/knowledge-base\/getting-started\/<\/code> to <code>\/docs\/getting-started\/<\/code>.<\/p>\n\n<p>Two things worth knowing before you change it. Links to the old addresses stop working, including any a search engine has already indexed, so if the Knowledge Base has been public for a while consider adding redirects. And a base that's already taken \u2014 by one of your pages, by another plugin, or by WordPress itself (<code>category<\/code>, <code>author<\/code>, <code>tag<\/code>, and so on) \u2014 is refused with an explanation rather than accepted; pick another, or move the page that's using it first.<\/p>\n\n<p>Category pages have their own <strong>Category URL Base<\/strong> field just below, defaulting to <code>kb-category<\/code>. It has to stay separate from the base above \u2014 a value equal to it, or sitting inside it, is refused, because the two would compete for the same URLs.<\/p>\n\n<p>You don't need to re-save your permalinks afterwards. Sohaychat rebuilds the URL rules itself.<\/p><\/dd>\n<dt id=\"can%20i%20change%20how%20the%20knowledge%20base%20pages%20look%3F\"><h3>Can I change how the Knowledge Base pages look?<\/h3><\/dt>\n<dd><p>They're deliberately plain, and they inherit your theme's fonts, colours, and link styling so they don't look bolted on. If you want to go further, your theme can replace any of it: copy <code>archive-kb.php<\/code>, <code>taxonomy-kb-category.php<\/code>, <code>search-kb.php<\/code>, or any file from <code>parts\/<\/code> out of the plugin's <code>templates\/<\/code> folder into a <code>sohaychat\/<\/code> folder in your theme, and Sohaychat will use yours instead. Block themes that define their own Knowledge Base template keep it untouched. <code>docs\/KB-ARCHIVE.md<\/code> in the GitHub repository documents each template and what it receives.<\/p><\/dd>\n<dt id=\"where%20are%20my%20api%20keys%20stored%3F\"><h3>Where are my API keys stored?<\/h3><\/dt>\n<dd><p>Encrypted with AES-256-GCM in your WordPress database. The admin UI shows a masked placeholder once you've saved a key, and the values are excluded from the WordPress REST API. Each key is only ever sent to the service it belongs to.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20my%20data%20if%20i%20uninstall%20sohaychat%3F\"><h3>What happens to my data if I uninstall Sohaychat?<\/h3><\/dt>\n<dd><p>Uninstalling deletes the plugin's own database tables (conversations, messages, sync jobs, diagnostic logs), its settings, and the capabilities it added. <strong>Your Knowledge Base articles are kept<\/strong> \u2014 they're regular WordPress content, so removing the plugin doesn't delete them, and they're still there if you reinstall. If you want them gone too, delete the articles under <strong>KB Articles<\/strong> before you uninstall.<\/p><\/dd>\n<dt id=\"does%20sohaychat%20work%20on%20wordpress%20multisite%3F\"><h3>Does Sohaychat work on WordPress Multisite?<\/h3><\/dt>\n<dd><p>Yes. Each site in the network keeps its own conversations, Knowledge Base, and settings \u2014 nothing is shared across the network. Network-activate to enable Sohaychat everywhere (each site sets itself up on first load) or activate it per-site. Uninstalling from the network removes Sohaychat's data from every site.<\/p><\/dd>\n<dt id=\"for%20developers\"><h3>For developers<\/h3><\/dt>\n<dd><p>The questions below cover code-level customization. Sohaychat exposes 61 filters and 15 actions in total; the most-used ones appear here, and the full catalog lives in <code>docs\/HOOKS.md<\/code> in the plugin's GitHub repository, alongside <code>docs\/CAPABILITIES.md<\/code> for the full capability matrix and <code>docs\/KB-ARCHIVE.md<\/code> for the Knowledge Base templates.<\/p><\/dd>\n<dt id=\"how%20do%20i%20customize%20the%20plugin%20with%20code%3F\"><h3>How do I customize the plugin with code?<\/h3><\/dt>\n<dd><p>The most commonly customized filters:<\/p>\n\n<ul>\n<li><code>sohaychat_should_render_widget<\/code> (bool) \u2014 per-request gate on the chat widget. Combine with <code>is_singular()<\/code> \/ <code>is_product()<\/code> to scope the widget to specific pages.<\/li>\n<li><code>sohaychat_allowed_openai_models<\/code> \/ <code>sohaychat_allowed_google_models<\/code> (string[]) \u2014 allowlist of model slugs the proxy may call for each provider. Restrict to cheaper models to cap spend.<\/li>\n<li><code>sohaychat_default_ai_provider<\/code> (string) \u2014 which provider answers the chat when no choice is saved in the admin.<\/li>\n<li><code>sohaychat_provider_options<\/code> (array) \u2014 provider-specific request settings, such as Gemini's safety thresholds, thinking budget, or search grounding.<\/li>\n<li><code>sohaychat_help_url<\/code> and <code>sohaychat_upgrade_url<\/code> (string) \u2014 override the admin-header \"Help\" and \"Upgrade\" links for resellers.<\/li>\n<li><code>sohaychat_admin_conversation_scope<\/code> \u2014 restrict which conversations a non-admin operator can see.<\/li>\n<li><code>sohaychat_tools<\/code> \u2014 the resolved tool list for the request. Remove an entry and the chatbot is never told that tool exists, so it can neither call it nor send its data to your AI provider.<\/li>\n<\/ul>\n\n<p>Example \u2014 keep the WooCommerce catalog answers but never let the cart leave the site:<\/p>\n\n<pre><code>add_filter( 'sohaychat_tools', function ( $tools ) {\n    unset( $tools['sohaychat-wc\/get-cart'], $tools['sohaychat-wc\/update-cart'] );\n    return $tools;\n} );\n<\/code><\/pre>\n\n<p>The keys are the tool names: <code>sohaychat-wc\/search-catalog<\/code>, <code>sohaychat-wc\/lookup-catalog<\/code>, <code>sohaychat-wc\/get-product<\/code>, <code>sohaychat-wc\/search-shop-policies-and-faqs<\/code>, <code>sohaychat-wc\/get-cart<\/code>, <code>sohaychat-wc\/update-cart<\/code>, <code>sohaychat-wc\/get-orders<\/code> for a signed-in customer's own orders, and <code>sohaychat-kb\/get-information<\/code> for the Knowledge Base lookup. Returning an empty array disables tool use entirely \u2014 the chatbot still replies, just with no way to look anything up.<\/p>\n\n<p>Example \u2014 hide the widget everywhere except the WooCommerce shop and product pages:<\/p>\n\n<pre><code>add_filter( 'sohaychat_should_render_widget', function ( $enabled ) {\n    if ( ! $enabled ) { return false; }\n    return function_exists( 'is_shop' ) &amp;&amp; ( is_shop() || is_product() );\n} );\n<\/code><\/pre>\n\n<p>The constants on <code>Bengal_Studio\\Sohaychat\\Sohaychat_Hooks<\/code> are the recommended form for new code; the legacy literal form continues to work across releases.<\/p><\/dd>\n<dt id=\"how%20do%20i%20delegate%20access%20to%20non-admin%20roles%3F\"><h3>How do I delegate access to non-admin roles?<\/h3><\/dt>\n<dd><p>Five granular capabilities let you delegate parts of the plugin to non-admin roles:<\/p>\n\n<ul>\n<li><code>sohaychat_manage<\/code> \u2014 AI Settings page, provider selection, API key entry, model selection, and creating \/ editing \/ deleting quick replies. Implicitly grants all four other plugin caps.<\/li>\n<li><code>sohaychat_view_conversations<\/code> \u2014 Sohaychat menu, Dashboard + Conversations submenus (read-only), and reading the quick replies the composer offers. Non-admin users with this cap are scoped to \"assigned to me or unassigned\" conversations.<\/li>\n<li><code>sohaychat_reply_conversations<\/code> \u2014 everything <code>sohaychat_view_conversations<\/code> grants, plus operator reply, assignee changes, pin \/ unpin, close \/ reopen. Implicitly grants <code>sohaychat_view_conversations<\/code>.<\/li>\n<li><code>sohaychat_manage_kb<\/code> \u2014 KB Settings admin page and KB sync routes.<\/li>\n<li><code>sohaychat_view_logs<\/code> \u2014 Diagnostics admin page (read-only). Clearing the log buffer is escalated to <code>sohaychat_manage<\/code> for forensics integrity.<\/li>\n<\/ul>\n\n<p>WordPress's built-in <code>manage_options<\/code> capability implicitly grants all five, so administrators keep working unchanged. Use Members, User Role Editor, or WP-CLI (<code>wp cap add &lt;role&gt; sohaychat_view_conversations<\/code>) to delegate caps to non-admin roles. See <code>docs\/CAPABILITIES.md<\/code> in the GitHub repository for the full matrix, every REST route's required cap, three worked role-configuration examples, and the conversation-scope filter contract.<\/p><\/dd>\n<dt id=\"how%20do%20i%20adjust%20rate%20limits%20or%20the%20daily%20openai%20token%20budget%20in%20code%3F\"><h3>How do I adjust rate limits or the daily OpenAI token budget in code?<\/h3><\/dt>\n<dd><p>Three independent limiter filters. The chat-message rate limit (<code>limit<\/code> requests per rolling <code>window<\/code> seconds, per visitor):<\/p>\n\n<pre><code>add_filter( 'sohaychat_rate_limit_options', function ( $opts ) {\n    $opts['limit']  = 60;\n    $opts['window'] = 60;\n    return $opts;\n} );\n<\/code><\/pre>\n\n<p>Behind Cloudflare or another reverse proxy, enable proxy-aware client-IP detection so per-visitor limits key off the real visitor rather than the proxy:<\/p>\n\n<pre><code>add_filter( 'sohaychat_rate_limit_options', function ( $opts ) {\n    $opts['proxy_support'] = true;\n    return $opts;\n} );\n<\/code><\/pre>\n\n<p>Enable <code>proxy_support<\/code> <strong>only<\/strong> when your site is reachable exclusively through the trusted proxy, and that proxy overwrites the <code>CF-Connecting-IP<\/code> \/ <code>X-Real-IP<\/code> \/ <code>X-Forwarded-For<\/code> headers on every request. On an origin that's also reachable directly, a visitor could forge those headers to sidestep per-visitor limits; the site-wide daily token budget still caps total spend.<\/p>\n\n<p>The public <code>\/auth\/guest-token<\/code> mint rate limit (separate so token-mint amplification protection can be tuned independently):<\/p>\n\n<pre><code>add_filter( 'sohaychat_auth_rate_limit_options', function ( $opts ) {\n    $opts['limit']  = 5;\n    $opts['window'] = 60;\n    return $opts;\n} );\n<\/code><\/pre>\n\n<p>The daily OpenAI token budget (caps also configurable under <strong>AI Settings \u2192 Spend protection<\/strong>; ceilings reset at UTC midnight; setting either value to 0 disables that particular ceiling):<\/p>\n\n<pre><code>add_filter( 'sohaychat_usage_tracker_options', function ( $opts ) {\n    $opts['site_cap']  = 5000000;\n    $opts['actor_cap'] = 25000;\n    return $opts;\n} );\n<\/code><\/pre>\n\n<p>The live readout on the Diagnostics page shows today's usage so you can spot a runaway loop before it 429s real visitors.<\/p><\/dd>\n<dt id=\"can%20i%20disable%20the%20kb%20search%20cache%3F\"><h3>Can I disable the KB search cache?<\/h3><\/dt>\n<dd><p>KB vector-search results are memoized in the <code>sohaychat_kb<\/code> object-cache group for 5 minutes by default. To shorten the window, lengthen it, or disable the cache entirely, use the <code>sohaychat_kb_search_cache_ttl<\/code> filter (return 0 to disable):<\/p>\n\n<pre><code>add_filter( 'sohaychat_kb_search_cache_ttl', '__return_zero' );\n<\/code><\/pre>\n\n<p>KB sync events flush the cache automatically, so content updates don't get masked.<\/p><\/dd>\n<dt id=\"why%20does%20the%20streaming%20response%20cut%20off%20behind%20my%20cdn%3F\"><h3>Why does the streaming response cut off behind my CDN?<\/h3><\/dt>\n<dd><p>The plugin sets <code>Cache-Control: no-cache<\/code>, <code>X-Accel-Buffering: no<\/code>, and clears output buffers, but some CDNs still buffer Server-Sent Events. If your CDN supports it, mark the chat REST route as bypassing the cache and disable transformations on the response.<\/p><\/dd>\n<dt id=\"where%20can%20i%20see%20streaming%2Fproxy%20errors%3F\"><h3>Where can I see streaming\/proxy errors?<\/h3><\/dt>\n<dd><p><strong>Sohaychat \u2192 Diagnostics<\/strong> shows the last 100 plugin log entries with timestamps and context. Each entry also fires the <code>sohaychat_log_error<\/code> action for integration with Sentry, Stackdriver, Query Monitor, etc.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>New \u2014 quick replies. Save the answers your team types over and over, then drop one into a reply from the lightning-bolt button in the composer or by typing <code>\/<\/code> in an empty draft; inserting fills the draft and never sends on its own. Managed under <strong>Sohaychat \u2192 Quick replies<\/strong>, shared across the site, with four starter replies you can edit or delete.<\/li>\n<li>New \u2014 choose what a visitor must share before somebody from your team joins their chat: sign in, give a name and email, or nothing. Set it under <strong>Sohaychat \u2192 Settings<\/strong>. The chatbot still answers everyone; the widget asks only when somebody asks for a person, on its own screen, and not again if they gave their details in an earlier chat. Upgrading sites keep allowing anonymous chats; new installs start on sign-in.<\/li>\n<li>New \u2014 an optional marketing opt-in beside the name and email fields, with wording you write yourself. What a visitor agreed to is stored with the exact wording they were shown.<\/li>\n<li>New \u2014 order history in the chat. On a WooCommerce store, a signed-in customer can ask the chatbot about their own orders \u2014 status, dates, contents. Signing in is always required for this, whichever option you picked above: the chatbot takes the customer from the current login and cannot be pointed at anybody else's orders. Addresses, phone numbers and payment details are never sent to the chatbot.<\/li>\n<li>New \u2014 email visitors when you reply. Answer a chat the visitor has already left and Sohaychat can email them your reply. Off by default, under <strong>Sohaychat \u2192 Settings<\/strong>. It sends only when they aren't still reading the chat, at most once per conversation every 15 minutes, always with a one-click link to stop further emails about that conversation. It needs an address, so it does nothing unless the visitor is signed in or you are asking for a name and email; with it on, the name-and-email screen tells visitors the details are so you can reply after they leave.<\/li>\n<li>New \u2014 <strong>Sohaychat \u2192 Conversations<\/strong> shows visitors by the name they gave \u2014 in the list, the customer panel and the dashboard \u2014 with their email and, where they opted in, when they agreed to marketing. Visitors who shared nothing still read as \"Guest\".<\/li>\n<li>Changed \u2014 a visitor asked to sign in before reaching your team keeps their chat; signing in used to clear the guest session and take the conversation with it.<\/li>\n<li>Changed \u2014 names, email addresses and marketing consent given in the chat are included in a visitor's personal-data export and removed by an erasure request, including for visitors who were never registered users. An export keeps chats owned by the requester's account apart from chats that merely carry their email address; the widget cannot verify a typed address, so that second group is labelled unverified and may contain somebody else's conversation.<\/li>\n<li>Changed \u2014 the plugin is now called <strong>Sohaychat<\/strong>, matching its address on WordPress.org, and is listed as \"Sohaychat \u2013 AI Chatbot &amp; Support Agent for WooCommerce\". Only the name changes: your settings, API keys, saved conversations and Knowledge Base articles are untouched, the update installs over your existing copy, and visitors see no difference.<\/li>\n<li>Changed \u2014 in <strong>Sohaychat \u2192 Conversations<\/strong>, the search box now sits in the page header and the sort control beside the \"Inbox\" title, giving the conversation list its full height. The header shows the logo mark on its own.<\/li>\n<li>Changed \u2014 the header of the Dashboard, Conversations and Quick replies screens now shows which version of Sohaychat is installed, and <strong>Sohaychat \u2192 Diagnostics<\/strong> lists it at the top of the health card along with the database schema version. The WordPress footer is hidden on these screens, so until now the version was only on the Plugins list.<\/li>\n<li>Removed \u2014 the <code>getInformation<\/code> alias for the Knowledge Base lookup tool. Since 1.1.0 every chat request offered the chatbot that tool twice, once under its old name; only <code>sohaychat-kb__get-information<\/code> is offered now. Older conversations keep their citations. If a <strong>Custom System Prompt<\/strong> under <strong>Sohaychat \u2192 KB Sync<\/strong> tells the assistant to call <code>getInformation<\/code>, change that to <code>sohaychat-kb__get-information<\/code>.<\/li>\n<li>Fixed \u2014 a site on Google with the model left on <strong>Use built-in default<\/strong> got a chat that failed on every message, because newly issued Gemini API keys can no longer use <code>gemini-2.5-flash<\/code>. The default is now <code>gemini-3.6-flash<\/code>, Google's named replacement, and sites on the default pick it up with this update. If you selected <code>gemini-2.5-flash<\/code> yourself, nothing changes \u2014 older keys can still use it; if yours cannot, pick another model under <strong>Sohaychat \u2192 AI Settings<\/strong>.<\/li>\n<li>Fixed \u2014 table cells in the Sohaychat admin screens now use the plugin's own font size and line height.<\/li>\n<li>Fixed \u2014 deactivating or uninstalling the plugin now clears every event it had scheduled with WordPress's cron; the per-article Knowledge Base sync and the notification emails used to be left behind, doing nothing but never going away.<\/li>\n<li>Fixed \u2014 on a short or zoomed browser window, scrolling the page to reach the bottom of the WordPress admin menu no longer pushes the Conversations workspace off the top; the workspace stays under the admin bar and only the menu scrolls.<\/li>\n<li>For developers \u2014 four new filters: <code>sohaychat_quick_replies_max_body_length<\/code> and <code>sohaychat_quick_reply_seed_defaults<\/code> for quick replies, <code>sohaychat_login_url<\/code> for sites whose sign-in lives somewhere other than the WooCommerce My Account page or <code>wp-login.php<\/code>, and <code>sohaychat_visitor_notification_body<\/code> for the wording of the visitor reply email. Managing quick replies needs the <code>sohaychat_manage<\/code> capability; reading them \u2014 all the composer picker does \u2014 needs only <code>sohaychat_view_conversations<\/code>. This release also runs a one-time, automatic database update on upgrade.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>New \u2014 a real person can take over a chat. When the chatbot isn't enough, one of your team can step into the conversation: the visitor sees that person's name and picture on the replies, new messages arrive without a page reload, and the chatbot stays quiet until the chat is handed back. Switched off by default \u2014 turn it on under Sohay \u2192 Settings.<\/li>\n<li>Three ways a handoff starts \u2014 a \"Talk to a person\" button in the chat, the chatbot asking for someone when it can't resolve a question, and a \"Take over\" button on the conversation. Replying to a conversation takes it over as well.<\/li>\n<li>Set the hours your team is around, week by week, in your site's own timezone, with your own message for visitors who ask outside them. A request nobody answers goes back to the chatbot after a timeout you set, and the visitor waits out a short cooldown before asking again.<\/li>\n<li>New \"Waiting for a Person\" and \"Handled by a Person\" views in Sohay \u2192 Conversations, each with a count. Waiting lists the longest wait first, so nobody jumps ahead of someone who has waited longer.<\/li>\n<li>Four ways to notice a waiting visitor \u2014 the Waiting view, a count in the browser tab, a banner on the conversation, and an email to addresses you choose (falling back to whoever the chat is assigned to, then the site admin). One email per conversation, and none at all if a colleague has already picked it up.<\/li>\n<li>New \u2014 the Knowledge Base has a real index. It now has a landing page of its own: your categories as cards with an article count on each, a search box, and the articles filed under each category. Category pages and Knowledge Base searches get matching pages. Until now these addresses fell through to whatever your theme does with an archive, which for most themes meant a bare reverse-chronological list of titles.<\/li>\n<li>New \u2014 the Knowledge Base address is yours to choose. <strong>Sohay \u2192 KB Settings \u2192 Settings<\/strong> has a <strong>URL Base<\/strong> field: set it to <code>docs<\/code>, <code>help<\/code>, <code>support<\/code>, whatever suits. The index and every article move together and the URL rules rebuild themselves, with no need to re-save your permalinks. A base already taken by one of your pages, another plugin, or WordPress itself is refused with an explanation rather than quietly breaking that address. Sites that never touch the setting stay on <code>\/knowledge-base\/<\/code>.<\/li>\n<li>Your theme can replace any of the new Knowledge Base pages \u2014 copy a template out of the plugin's <code>templates\/<\/code> folder into a <code>sohaychat\/<\/code> folder in your theme and Sohay uses yours instead. Block themes that already define their own Knowledge Base template keep it untouched.<\/li>\n<li>Changed \u2014 Knowledge Base addresses no longer sit under your permalink prefix. On sites whose permalinks start with a fixed prefix such as <code>\/blog\/<\/code>, the Knowledge Base was being served from <code>\/blog\/knowledge-base\/<\/code>; it now sits at <code>\/knowledge-base\/<\/code>. Most sites, which use a prefix-free permalink structure, are unaffected. If the old addresses are linked or already indexed, add redirects for them.<\/li>\n<li>Fixed \u2014 replies you type in <strong>Sohay \u2192 Conversations<\/strong> were coming back labelled \"AI Draft\" with the chatbot's avatar, so your own message looked like machine output. They now carry your name and picture, on both the admin thread and the visitor's.<\/li>\n<li>Fixed \u2014 PHP 8.4 was printing a deprecation notice on every request that loaded the chatbot's tools.<\/li>\n<li>Fixed \u2014 WordPress was printing a \"translation loaded too early\" notice above every page, front end and admin alike, on sites with debugging switched on.<\/li>\n<li>Security \u2014 the message endpoint no longer takes a staff identity from the visitor's browser, so a crafted request can't post a message that renders as coming from a named member of your team, nor fake a \"joined the conversation\" event. The chat endpoint also drops any instructions a crafted client tries to slip in alongside your own chatbot instructions.<\/li>\n<li>For developers \u2014 eight new hooks for handoff (<code>sohaychat_handoff_available<\/code>, <code>sohaychat_handoff_timeout<\/code>, <code>sohaychat_handoff_poll_intervals<\/code>, <code>sohaychat_handoff_notify_recipients<\/code>, <code>sohaychat_handoff_rate_limit_options<\/code>, <code>sohaychat_handoff_requested<\/code>, <code>sohaychat_handoff_started<\/code>, <code>sohaychat_handoff_ended<\/code>) and four for the Knowledge Base index (<code>sohaychat_kb_slug<\/code>, <code>sohaychat_kb_category_slug<\/code>, <code>sohaychat_kb_reserved_slugs<\/code>, <code>sohaychat_kb_articles_per_section<\/code>). This release also runs a one-time, automatic database update on upgrade.<\/li>\n<\/ul>\n\n<p>Older releases are listed in changelog.txt.<\/p>","raw_excerpt":"An AI chatbot that answers from your articles, shops your WooCommerce catalog and cart, and hands the chat to your team when a person is needed.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/pt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/317200","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/pt.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/pt.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=317200"}],"author":[{"embeddable":true,"href":"https:\/\/pt.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/bhoot"}],"wp:attachment":[{"href":"https:\/\/pt.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=317200"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/pt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=317200"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/pt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=317200"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/pt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=317200"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/pt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=317200"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/pt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=317200"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}