{"id":292250,"date":"2026-03-28T14:16:59","date_gmt":"2026-03-28T14:16:59","guid":{"rendered":"https:\/\/ja.wordpress.org\/plugins\/rapls-ai-chatbot\/"},"modified":"2026-05-03T08:02:19","modified_gmt":"2026-05-03T08:02:19","slug":"rapls-ai-chatbot","status":"publish","type":"plugin","link":"https:\/\/am.wordpress.org\/plugins\/rapls-ai-chatbot\/","author":23425763,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.7.6","stable_tag":"1.7.6","tested":"6.9.4","requires":"6.3","requires_php":"7.4","requires_plugins":null,"header_name":"Rapls AI Chatbot","header_author":"Rapls","header_description":"AI Chatbot plugin with OpenAI\/Claude\/Google support and automatic site content learning.","assets_banners_color":"9386f3","last_updated":"2026-05-03 08:02:19","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/raplsworks.com\/plugins\/rapls-ai-chatbot\/","header_author_uri":"https:\/\/raplsworks.com\/","rating":5,"author_block_rating":0,"active_installs":0,"downloads":578,"num_ratings":2,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.5.10":{"tag":"1.5.10","author":"rapls","date":"2026-04-19 13:09:24"},"1.5.11":{"tag":"1.5.11","author":"rapls","date":"2026-04-19 13:21:28"},"1.5.12":{"tag":"1.5.12","author":"rapls","date":"2026-04-20 12:15:59"},"1.5.13":{"tag":"1.5.13","author":"rapls","date":"2026-04-21 03:30:04"},"1.5.14":{"tag":"1.5.14","author":"rapls","date":"2026-04-21 13:41:52"},"1.5.18":{"tag":"1.5.18","author":"rapls","date":"2026-04-29 09:06:06"},"1.5.20":{"tag":"1.5.20","author":"rapls","date":"2026-04-29 09:20:35"},"1.5.21":{"tag":"1.5.21","author":"rapls","date":"2026-04-29 14:27:50"},"1.5.6":{"tag":"1.5.6","author":"rapls","date":"2026-03-28 14:59:09"},"1.5.7":{"tag":"1.5.7","author":"rapls","date":"2026-04-17 14:08:05"},"1.5.9":{"tag":"1.5.9","author":"rapls","date":"2026-04-19 13:09:24"},"1.6.4":{"tag":"1.6.4","author":"rapls","date":"2026-04-30 12:32:26"},"1.6.5":{"tag":"1.6.5","author":"rapls","date":"2026-04-30 12:44:03"},"1.7.1":{"tag":"1.7.1","author":"rapls","date":"2026-05-01 10:08:10"},"1.7.5":{"tag":"1.7.5","author":"rapls","date":"2026-05-03 04:07:35"},"1.7.6":{"tag":"1.7.6","author":"rapls","date":"2026-05-03 08:02:19"}},"upgrade_notice":{"1.7.0":"<p>New Glossary feature protects product \/ brand \/ service names from mistranslation across all 13 supported reply languages. Especially recommended for multilingual sites.<\/p>","1.6.0":"<p>Milestone release: current-date awareness, channel tracking, decluttered Conversations admin, and infrastructure to keep LINE answers in parity with Web. Recommended for everyone.<\/p>","1.5.17":"<p>Strengthens the date injection so smaller AI models (Gemini Flash Lite, etc.) can no longer dismiss it. Recommended for anyone on 1.5.15 or 1.5.16.<\/p>","1.5.16":"<p>Reliability fix for the 1.5.15 date injection \u2014 recommended for anyone running 1.5.15.<\/p>","1.5.15":"<p>The chatbot now knows today&#039;s date so it can answer questions involving &quot;today&quot;, &quot;yesterday&quot;, or relative timeframes correctly.<\/p>","1.5.12":"<p>Fixes multiple Display Settings bugs (vector-search toggle, mobile margin, theme primary color, iPhone Safari overflow) and adds mobile-specific margin and badge size settings.<\/p>","1.5.11":"<p>Fixes a fatal error introduced in 1.5.10 on the Settings page. Critical update.<\/p>","1.5.10":"<p>Re-ships template files missing from 1.5.9 (SVN upload issue). Users of 1.5.9 who saw blank admin screens should update immediately.<\/p>","1.5.9":"<p>Removes discontinued OpenAI and Claude models from the model dropdown. Recommended for all users.<\/p>","1.5.8":"<p>Fixes Gemini API key validation, auto-saves keys on test, updates deprecated Gemini models. Strongly recommended for Gemini users.<\/p>","1.5.7":"<p>Translation and UI improvements. Recommended for all users.<\/p>","1.5.6":"<p>Response Language setting fix: AI now correctly responds in the configured language. Recommended for all users.<\/p>","1.5.5":"<p>Major update: Complete Free\/Pro code separation, 50% smaller frontend JS, security hardening (CSS escaping, output sanitization), and unique prefix. Recommended for all users.<\/p>","1.5.2":"<p>Plugin Check compliance fixes and artificial limits removed. Recommended update.<\/p>","1.5.0":"<p>Major update: Gutenberg block, Abilities API, language auto-detect, OpenRouter. Recommended update for all users.<\/p>","1.4.0":"<p>Feature release: Web search integration (AI auto-searches the web when knowledge base is insufficient), cross-site embed support, PDF\/DOCX knowledge upload, vector embedding hybrid search, and updated AI model lists. Recommended update for all users.<\/p>","1.3.2":"<p>Security hardening: session ID header transport, XSS prevention via DOM API, rate-limited logging, and offline message dedup. <strong>Breaking change:<\/strong> GET requests no longer accept <code>?session_id=<\/code> \u2014 use the <code>X-RAPLSAICH-Session<\/code> header instead. Recommended update for all users.<\/p>","1.3.1":"<p>Enhanced rate limiting, server-side PDF export, and diagnostic option namespace migration (<code>raplsaich_diag_*<\/code>). Recommended update for all users.<\/p>","1.3.0":"<p>Major feature release: Response caching, audit logs, conversion tracking, offline messages, and answer templates. Reduces API costs and adds business-critical Pro features. Recommended update for all users.<\/p>","1.2.23":"<p>Sortable admin tables, knowledge base draft workflow, enhanced content extraction, and session management improvements. Recommended update for all users.<\/p>","1.2.22":"<p>Improved AI chat accuracy with better default prompts. All feature prompts now customizable. Added raplsaich_system_prompt filter. Recommended update for all users.<\/p>","1.2.21":"<p>Added knowledge base export support, budget management integration, and comprehensive debugging guide. Recommended update for Pro users.<\/p>","1.2.20":"<p>Knowledge page prefill support for quick FAQ creation from analytics.<\/p>","1.2.18":"<p>Security and performance improvements. Fixed message duplication bug affecting AI response accuracy. Recommended update for all users.<\/p>","1.2.5":"<p>Security and code quality improvements. Recommended update for all users.<\/p>","1.0.0":"<p>Initial release of Rapls AI Chatbot. Configure your AI provider API key to get started.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":2},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3493381,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3493381,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3493381,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3493381,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":{"rapls-ai-chatbot\/chatbot":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"rapls-ai-chatbot\/chatbot","version":"1.5.0","title":"AI Chatbot","category":"widgets","icon":"format-chat","description":"Embed an AI chatbot inline on your page.","keywords":["chat","ai","chatbot","assistant","rapls"],"supports":{"html":false,"multiple":false},"attributes":{"height":{"type":"string","default":"500px"},"theme":{"type":"string","default":""},"bot":{"type":"string","default":""}},"textdomain":"rapls-ai-chatbot","editorScript":"file:.\/editor.js","render":"file:.\/render.php"}},"tagged_versions":["1.5.10","1.5.11","1.5.12","1.5.13","1.5.14","1.5.18","1.5.20","1.5.21","1.5.6","1.5.7","1.5.9","1.6.4","1.6.5","1.7.1","1.7.5","1.7.6"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3493381,"resolution":"1","location":"assets","locale":""},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3493381,"resolution":"2","location":"assets","locale":""},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3493381,"resolution":"3","location":"assets","locale":""},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3493381,"resolution":"4","location":"assets","locale":""},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3493381,"resolution":"5","location":"assets","locale":""},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3493381,"resolution":"6","location":"assets","locale":""},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3493381,"resolution":"7","location":"assets","locale":""}},"screenshots":{"1":"Dashboard \u2014 Overview of conversations, messages, and usage statistics with cost tracking","2":"Settings \u2014 Configure AI provider, model selection, and chat behavior","3":"Site Learning \u2014 Automatic content indexing and manual learning controls","4":"Knowledge Base \u2014 Custom Q&amp;A management with priority levels and PDF\/DOCX upload","5":"Conversation History \u2014 View and manage all chat conversations","6":"Chatbot Widget \u2014 Clean, modern chat interface on your website","7":"Analytics Dashboard (Pro) \u2014 Conversation insights, satisfaction tracking, and FAQ analysis"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[2353,2364,229563,224606,194533],"plugin_category":[],"plugin_contributors":[253146],"plugin_business_model":[],"class_list":["post-292250","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-chatbot","plugin_tags-claude","plugin_tags-gemini","plugin_tags-openai","plugin_contributors-rapls","plugin_committers-rapls"],"banners":{"banner":"https:\/\/ps.w.org\/rapls-ai-chatbot\/assets\/banner-772x250.png?rev=3493381","banner_2x":"https:\/\/ps.w.org\/rapls-ai-chatbot\/assets\/banner-1544x500.png?rev=3493381","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/rapls-ai-chatbot\/assets\/icon-128x128.png?rev=3493381","icon_2x":"https:\/\/ps.w.org\/rapls-ai-chatbot\/assets\/icon-256x256.png?rev=3493381","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/rapls-ai-chatbot\/assets\/screenshot-1.png?rev=3493381","caption":"Dashboard \u2014 Overview of conversations, messages, and usage statistics with cost tracking"},{"src":"https:\/\/ps.w.org\/rapls-ai-chatbot\/assets\/screenshot-2.png?rev=3493381","caption":"Settings \u2014 Configure AI provider, model selection, and chat behavior"},{"src":"https:\/\/ps.w.org\/rapls-ai-chatbot\/assets\/screenshot-3.png?rev=3493381","caption":"Site Learning \u2014 Automatic content indexing and manual learning controls"},{"src":"https:\/\/ps.w.org\/rapls-ai-chatbot\/assets\/screenshot-4.png?rev=3493381","caption":"Knowledge Base \u2014 Custom Q&amp;A management with priority levels and PDF\/DOCX upload"},{"src":"https:\/\/ps.w.org\/rapls-ai-chatbot\/assets\/screenshot-5.png?rev=3493381","caption":"Conversation History \u2014 View and manage all chat conversations"},{"src":"https:\/\/ps.w.org\/rapls-ai-chatbot\/assets\/screenshot-6.png?rev=3493381","caption":"Chatbot Widget \u2014 Clean, modern chat interface on your website"},{"src":"https:\/\/ps.w.org\/rapls-ai-chatbot\/assets\/screenshot-7.png?rev=3493381","caption":"Analytics Dashboard (Pro) \u2014 Conversation insights, satisfaction tracking, and FAQ analysis"}],"raw_content":"<!--section=description-->\n<p>Rapls AI Chatbot adds an AI chatbot to your site with OpenAI, Claude, Gemini, or OpenRouter. Includes site learning, knowledge base, web search, and <strong>automatic multilingual replies in 13 languages<\/strong> \u2014 visitors get answered in their browser language without you maintaining a separate translation.<\/p>\n\n<p>This is especially useful for tourism, hospitality, and retail sites that get inquiries in languages they don't have native staff for: a Japanese inn answering visitors in English \/ Chinese \/ Korean \/ Spanish \/ etc., a tour operator handling questions in the visitor's own language, or a multilingual storefront whose actual support team is one person.<\/p>\n\n<p>\ud83d\udc49 <strong>Documentation &amp; Developer's Guide:<\/strong> <a href=\"https:\/\/raplsworks.com\/plugins\/rapls-ai-chatbot\/\">Why I built this plugin and how RAG works<\/a><\/p>\n\n<h4>Key Features<\/h4>\n\n<ul>\n<li><strong>Multiple AI Providers<\/strong> \u2014 OpenAI, Anthropic Claude, Google Gemini, and OpenRouter (100+ models via single API key)<\/li>\n<li><strong>Web Search<\/strong> \u2014 AI automatically searches the web when the knowledge base lacks a sufficient answer, using each provider's built-in capability (OpenAI web_search_preview, Claude web_search, Gemini google_search)<\/li>\n<li><strong>Site Learning<\/strong> \u2014 Crawl and index your website content (posts, pages, custom post types, WooCommerce products) for context-aware responses<\/li>\n<li><strong>Vector Embedding RAG<\/strong> \u2014 Hybrid search combining keyword matching (40%) and vector similarity (60%) for accurate retrieval<\/li>\n<li><strong>Custom Knowledge Base<\/strong> \u2014 Add Q&amp;A pairs, free-form content, PDF\/DOCX uploads with priority levels and draft\/published workflow<\/li>\n<li><strong>MCP Server<\/strong> \u2014 7 built-in tools via JSON-RPC 2.0 for AI agent integration (Claude Desktop, Cursor, VS Code)<\/li>\n<li><strong>WordPress Abilities API<\/strong> \u2014 Auto-register MCP tools as WordPress Abilities for discovery by MCP Adapters<\/li>\n<li><strong>Gutenberg Block<\/strong> \u2014 Insert AI Chatbot block in the block editor with height, theme, and bot-id settings; SSR support<\/li>\n<li><strong>Response Language Auto-detect<\/strong> \u2014 Automatically detect browser language for welcome message and AI responses<\/li>\n<li><strong>Cross-site Embed<\/strong> \u2014 Embed the chatbot on external sites via iframe or script loader<\/li>\n<li><strong>Conversation History<\/strong> \u2014 Save and review all chat conversations with configurable retention<\/li>\n<li><strong>Usage Statistics<\/strong> \u2014 Track token usage and estimated API costs with visual charts and provider breakdown<\/li>\n<li><strong>Feedback &amp; Regeneration<\/strong> \u2014 Users can rate responses (thumbs up\/down) and request regeneration<\/li>\n<li><strong>6 Built-in Themes<\/strong> \u2014 Default, Simple, Classic, Light, Minimal, Flat<\/li>\n<li><strong>Security<\/strong> \u2014 reCAPTCHA v3, rate limiting, consent mode, Cloudflare support, security diagnostics<\/li>\n<li><strong>Settings Import\/Export<\/strong> \u2014 Backup and restore all settings as JSON<\/li>\n<li><strong>Automatic Multilingual Replies (13 languages)<\/strong> \u2014 Auto-detects the visitor's browser language and replies in it. English, Japanese, Chinese, Korean, Spanish, French, German, Portuguese, Italian, Russian, Arabic, Thai, Vietnamese. Welcome messages are also configurable per language. Practical use case: a tourism \/ hospitality \/ retail site that doesn't have multilingual staff can still answer foreign visitors in their own language<\/li>\n<\/ul>\n\n<h4>Supported AI Models<\/h4>\n\n<p><strong>OpenAI:<\/strong>\n* GPT-5.2, GPT-5.1, GPT-5 series (Latest generation)\n* GPT-4.1 series (Long context, 1M tokens)\n* GPT-4o, GPT-4o-mini (Multimodal)\n* o1, o3, o4-mini (Reasoning models)<\/p>\n\n<p><strong>Anthropic Claude:<\/strong>\n* Claude Opus 4.6 (Most powerful)\n* Claude Sonnet 4.5 (Recommended \u2014 fast and powerful)\n* Claude Haiku 4.5 (Recommended \u2014 fastest)\n* Claude Opus 4.5, Opus 4.1, Sonnet 4, 3.7 Sonnet<\/p>\n\n<p><strong>Google Gemini:<\/strong>\n* Gemini 3 Pro\/Flash (Preview, latest)\n* Gemini 2.5 Pro\/Flash (Recommended)\n* Gemini 2.0 Flash (Stable)\n* Gemini 1.5 Pro\/Flash (Legacy)<\/p>\n\n<p><strong>OpenRouter:<\/strong>\n* Access 100+ models from multiple providers through a single API key<\/p>\n\n<h4>Dashboard<\/h4>\n\n<p>The dashboard provides an at-a-glance overview of your chatbot's activity:<\/p>\n\n<ul>\n<li>Statistics cards: total conversations, today's messages, indexed pages, knowledge entries, monthly AI responses with usage limit<\/li>\n<li>Status indicators: AI provider, site learning, conversation history<\/li>\n<li>API usage statistics (past 30 days): total tokens, input\/output tokens, estimated cost, daily usage chart, provider breakdown<\/li>\n<\/ul>\n\n<h4>Settings (5 Tabs)<\/h4>\n\n<p><strong>AI Settings<\/strong> \u2014 Configure your AI provider, model, and API key. Enable vector search (RAG) with embedding provider. Set up MCP server with API key generation and Claude Desktop configuration example.<\/p>\n\n<p><strong>Chat Settings<\/strong> \u2014 Customize bot name, avatar (emoji or image), welcome messages (13 languages: English, Japanese, Chinese, Korean, Spanish, French, German, Portuguese, Italian, Russian, Arabic, Thai, Vietnamese), system prompt, response language, message history count, feedback buttons, and API quota error message. Advanced: context prompts for knowledge matching, Q&amp;A format, and site learning; feature prompts for regeneration instructions, good\/bad example learning, and conversation summary.<\/p>\n\n<p><strong>Display Settings<\/strong> \u2014 Choose from 6 free themes (Default, Simple, Classic, Light, Minimal, Flat). Configure badge position (4-corner grid), margins, primary\/secondary colors, mobile display, Markdown rendering, typing indicator, maximum input length, page exclusion, footer text, and cross-site embed options (script or iframe).<\/p>\n\n<p><strong>Security Settings<\/strong> \u2014 Enable reCAPTCHA v3 with site key, secret key, and score threshold. Configure access control: consent strict mode, rate limiting, Cloudflare integration, reverse proxy trust, reCAPTCHA failure mode. View security diagnostics (read-only): allowed origins, trusted proxies, IP detection, API key status, WP Consent API, rate limiting, reCAPTCHA, SSL\/TLS, CSRF.<\/p>\n\n<p><strong>Data Management<\/strong> \u2014 Enable\/disable conversation history with configurable retention period. Import\/export settings (optionally including knowledge base). Reset all settings to defaults.<\/p>\n\n<h4>Knowledge Base<\/h4>\n\n<ul>\n<li>Add entries as text: title, content, category, priority level<\/li>\n<li>File import: .txt, .csv, .md, .pdf, .docx (server-side parsing)<\/li>\n<li>Statistics: total entries, active, inactive, categories<\/li>\n<li>Filter by status: all, published, draft<\/li>\n<li>Sortable table: ID, title, category, type, priority, updated date<\/li>\n<li>Unlimited entries<\/li>\n<\/ul>\n\n<h4>Site Learning<\/h4>\n\n<p>The plugin crawls and indexes your published content for context-aware AI responses:<\/p>\n\n<ul>\n<li>Posts and Pages<\/li>\n<li>Custom Post Types<\/li>\n<li>WooCommerce Products<\/li>\n<li>Any public content<\/li>\n<\/ul>\n\n<p>With vector embedding enabled, hybrid search combines keyword matching (40%) and vector similarity (60%) for better retrieval accuracy.<\/p>\n\n<h4>Free vs Pro<\/h4>\n\n<p>The free version is fully functional with no artificial limits \u2014 you pay only your own AI API costs. An optional Pro add-on is available for business-oriented features.<\/p>\n\n<ul>\n<li><strong>Free<\/strong> \u2014 Full AI chat, unlimited responses, unlimited knowledge base, 6 themes, MCP server, Gutenberg block<\/li>\n<li><strong>Pro<\/strong> \u2014 Adds analytics, lead capture, scenarios, operator mode, WooCommerce, LINE, and more<\/li>\n<\/ul>\n\n<p><strong>What Free includes:<\/strong><\/p>\n\n<ul>\n<li>All 4 AI providers (OpenAI, Claude, Gemini, OpenRouter)<\/li>\n<li>Unlimited AI responses and knowledge base entries<\/li>\n<li>Web search, site learning with vector RAG<\/li>\n<li>MCP server, Gutenberg block, cross-site embed<\/li>\n<li>6 themes, feedback, regeneration, reCAPTCHA, security diagnostics<\/li>\n<\/ul>\n\n<p><strong>What Pro adds:<\/strong><\/p>\n\n<ul>\n<li>Analytics dashboard with satisfaction scores, FAQ ranking, and PDF export<\/li>\n<li>Lead capture forms, CSV\/JSON export, webhooks, Google Sheets<\/li>\n<li>Conversation scenarios, business hours, human handoff, operator mode<\/li>\n<li>WooCommerce product cards, LINE Messaging API, Slack notifications<\/li>\n<li>10 additional themes, dark mode, voice input\/TTS, multimodal<\/li>\n<li>Response caching, encryption, audit logs, and more<\/li>\n<\/ul>\n\n<p>Learn more about Pro features at <a href=\"https:\/\/raplsworks.com\/plugins\/rapls-ai-chatbot-pro\/\">raplsworks.com<\/a>, or read the <a href=\"https:\/\/raplsworks.com\/plugins\/rapls-ai-chatbot\/\">developer's overview<\/a> for the full context.<\/p>\n\n<h3>External Services<\/h3>\n\n<p>This plugin connects to the following external third-party services. <strong>No data is sent to any service until you configure an API key and enable the feature in the plugin settings.<\/strong> Each service requires the site administrator to create an account and obtain API credentials. By using these services, you agree to their respective terms and privacy policies listed below.<\/p>\n\n<h4>1. OpenAI (GPT models) \u2014 AI Provider<\/h4>\n\n<p>Used when you select OpenAI as your AI provider. User messages and optionally site content are sent to generate AI responses.<\/p>\n\n<ul>\n<li>Service URL: <a href=\"https:\/\/api.openai.com\/\">https:\/\/api.openai.com\/<\/a><\/li>\n<li>Terms of Use: <a href=\"https:\/\/openai.com\/terms\/\">https:\/\/openai.com\/terms\/<\/a><\/li>\n<li>Privacy Policy: <a href=\"https:\/\/openai.com\/privacy\/\">https:\/\/openai.com\/privacy\/<\/a><\/li>\n<\/ul>\n\n<h4>2. Anthropic (Claude models) \u2014 AI Provider<\/h4>\n\n<p>Used when you select Anthropic Claude as your AI provider. User messages and optionally site content are sent to generate AI responses.<\/p>\n\n<ul>\n<li>Service URL: <a href=\"https:\/\/api.anthropic.com\/\">https:\/\/api.anthropic.com\/<\/a><\/li>\n<li>Terms of Use: <a href=\"https:\/\/www.anthropic.com\/terms\">https:\/\/www.anthropic.com\/terms<\/a><\/li>\n<li>Privacy Policy: <a href=\"https:\/\/www.anthropic.com\/privacy\">https:\/\/www.anthropic.com\/privacy<\/a><\/li>\n<\/ul>\n\n<h4>3. Google (Gemini models) \u2014 AI Provider<\/h4>\n\n<p>Used when you select Google Gemini as your AI provider. User messages and optionally site content are sent to generate AI responses.<\/p>\n\n<ul>\n<li>Service URL: <a href=\"https:\/\/generativelanguage.googleapis.com\/\">https:\/\/generativelanguage.googleapis.com\/<\/a><\/li>\n<li>Terms of Use: <a href=\"https:\/\/policies.google.com\/terms\">https:\/\/policies.google.com\/terms<\/a><\/li>\n<li>Privacy Policy: <a href=\"https:\/\/policies.google.com\/privacy\">https:\/\/policies.google.com\/privacy<\/a><\/li>\n<\/ul>\n\n<h4>4. OpenRouter \u2014 AI Provider<\/h4>\n\n<p>Used when you select OpenRouter as your AI provider. OpenRouter is a unified API gateway that routes requests to various AI models.<\/p>\n\n<ul>\n<li>Service URL: <a href=\"https:\/\/openrouter.ai\/api\/\">https:\/\/openrouter.ai\/api\/<\/a><\/li>\n<li>Terms of Use: <a href=\"https:\/\/openrouter.ai\/terms\">https:\/\/openrouter.ai\/terms<\/a><\/li>\n<li>Privacy Policy: <a href=\"https:\/\/openrouter.ai\/privacy\">https:\/\/openrouter.ai\/privacy<\/a><\/li>\n<\/ul>\n\n<h4>5. Google reCAPTCHA v3 (Optional)<\/h4>\n\n<p>Used only if you enable reCAPTCHA in the plugin settings for spam protection. The visitor's IP address and interaction data are sent to Google for verification.<\/p>\n\n<ul>\n<li>Service URL: <a href=\"https:\/\/www.google.com\/recaptcha\/\">https:\/\/www.google.com\/recaptcha\/<\/a><\/li>\n<li>Terms of Use: <a href=\"https:\/\/policies.google.com\/terms\">https:\/\/policies.google.com\/terms<\/a><\/li>\n<li>Privacy Policy: <a href=\"https:\/\/policies.google.com\/privacy\">https:\/\/policies.google.com\/privacy<\/a><\/li>\n<\/ul>\n\n<h4>6. LINE Messaging API (Pro Add-on, Optional)<\/h4>\n\n<p>Used only if you enable the LINE integration via the Pro add-on. Connects to the LINE Messaging API for chatbot-to-LINE messaging.<\/p>\n\n<ul>\n<li>Service URL: <a href=\"https:\/\/api.line.me\/\">https:\/\/api.line.me\/<\/a><\/li>\n<li>Terms of Use: <a href=\"https:\/\/terms.line.me\/\">https:\/\/terms.line.me\/<\/a><\/li>\n<li>Privacy Policy: <a href=\"https:\/\/line.me\/en\/terms\/policy\/\">https:\/\/line.me\/en\/terms\/policy\/<\/a><\/li>\n<\/ul>\n\n<h4>Cross-Site Embed<\/h4>\n\n<p>The plugin includes an optional embed loader script (<code>embed-loader.js<\/code>) for embedding the chatbot on external websites via an iframe. This script does not load any external CDN resources or third-party scripts \u2014 it creates an iframe pointing back to your own WordPress site. All data processing occurs on your server.<\/p>\n\n<h4>Data Transmitted to External Services<\/h4>\n\n<ul>\n<li><strong>User messages<\/strong>: Chat messages entered by visitors (sent to the configured AI provider only)<\/li>\n<li><strong>Site content<\/strong> (if Site Learning is enabled): Excerpts from your published posts\/pages (sent to the configured AI provider)<\/li>\n<li><strong>Knowledge base<\/strong> (if configured): Custom Q&amp;A entries you create (sent to the configured AI provider)<\/li>\n<li><strong>IP address<\/strong> (reCAPTCHA only): Sent to Google for spam verification<\/li>\n<\/ul>\n\n<h4>Data Storage<\/h4>\n\n<ul>\n<li><strong>Conversation history<\/strong>: Stored locally in your WordPress database (can be disabled)<\/li>\n<li><strong>Visitor IP<\/strong>: Stored as SHA-256 hash (not plain text) for rate limiting<\/li>\n<li><strong>Retention<\/strong>: Configurable auto-deletion period (default 90 days)<\/li>\n<\/ul>\n\n<h4>User Controls<\/h4>\n\n<p>You can disable these features in the plugin settings:\n* Conversation history saving\n* Site content crawling\/learning\n* Google reCAPTCHA verification\n* Web search<\/p>\n\n<h3>Privacy<\/h3>\n\n<h4>Data Collected<\/h4>\n\n<p>When conversation history is enabled, the plugin stores:\n* Chat messages (user and AI responses)\n* Session identifiers\n* Page URLs where chats occurred\n* Hashed IP addresses (SHA-256, not reversible)\n* Timestamps<\/p>\n\n<h4>Data Retention<\/h4>\n\n<p>Conversation data is automatically deleted after the configured retention period (default: 90 days). Administrators can manually delete conversations at any time.<\/p>\n\n<h4>User Rights<\/h4>\n\n<p>Site administrators can:\n* View all conversation history\n* Delete individual or all conversations\n* Export settings (does not include conversation data)\n* Disable history saving entirely= Developer Information =<\/p>\n\n<p>The plugin provides hooks and filters for customization:<\/p>\n\n<h4>Available Filters<\/h4>\n\n<ul>\n<li><code>raplsaich_system_prompt<\/code> \u2014 Modify the system prompt sent to AI<\/li>\n<li><code>raplsaich_context<\/code> \u2014 Modify the context from site learning<\/li>\n<li><code>raplsaich_ai_response<\/code> \u2014 Filter the AI response before display<\/li>\n<li><code>raplsaich_chatbot_enabled<\/code> \u2014 Control chatbot visibility programmatically<\/li>\n<li><code>raplsaich_allowed_origins<\/code> \u2014 Add allowed origin hosts for same-origin check<\/li>\n<li><code>raplsaich_chat_response_data<\/code> \u2014 Filter chat response data before returning to client<\/li>\n<li><code>raplsaich_gpt5_token_multiplier<\/code> \u2014 GPT-5 reasoning token multiplier (default: 4, range: 1-8)<\/li>\n<\/ul>\n\n<h4>Example: Custom System Prompt<\/h4>\n\n<pre><code>add_filter( 'raplsaich_system_prompt', function( $prompt, $settings ) {\n    return $prompt . \"\\n\\nAlways end responses with a friendly emoji.\";\n}, 10, 2 );\n<\/code><\/pre>\n\n<h4>Example: Conditionally Hide Chatbot<\/h4>\n\n<pre><code>add_filter( 'raplsaich_chatbot_enabled', function( $enabled ) {\n    \/\/ Hide on checkout page\n    if ( is_page( 'checkout' ) ) {\n        return false;\n    }\n    return $enabled;\n} );\n<\/code><\/pre>\n\n<h4>REST API Endpoints<\/h4>\n\n<p>The plugin registers REST API endpoints under the <code>rapls-ai-chatbot\/v1<\/code> namespace:<\/p>\n\n<p><strong>Session authentication:<\/strong> Pass the session ID via the <code>X-RAPLSAICH-Session<\/code> HTTP header (recommended). When the header is present, any session_id in the request body is ignored (prevents APM\/WAF body-logging leakage). Query string parameters (<code>?session_id=...<\/code>) are <strong>not<\/strong> accepted for GET requests to prevent session leakage in server access logs.<\/p>\n\n<p><strong>Free:<\/strong><\/p>\n\n<ul>\n<li><code>GET \/rapls-ai-chatbot\/v1\/session<\/code> \u2014 Get or create a chat session<\/li>\n<li><code>POST \/rapls-ai-chatbot\/v1\/chat<\/code> \u2014 Send a message and receive AI response<\/li>\n<li><code>GET \/rapls-ai-chatbot\/v1\/history\/{session_id}<\/code> \u2014 Get conversation history<\/li>\n<li><code>POST \/rapls-ai-chatbot\/v1\/feedback<\/code> \u2014 Rate a response (thumbs up\/down)<\/li>\n<li><code>POST \/rapls-ai-chatbot\/v1\/regenerate<\/code> \u2014 Regenerate AI response<\/li>\n<li><code>GET \/rapls-ai-chatbot\/v1\/message-limit<\/code> \u2014 Check message limits<\/li>\n<li><code>POST \/rapls-ai-chatbot\/v1\/lead<\/code> \u2014 Submit lead form<\/li>\n<li><code>GET \/rapls-ai-chatbot\/v1\/lead-config<\/code> \u2014 Lead form configuration<\/li>\n<\/ul>\n\n<p>The Pro add-on registers additional endpoints for analytics, scenarios, LINE, and more. See the Pro documentation for details.<\/p>\n\n<h4>Settings Architecture<\/h4>\n\n<p>Extension settings are stored under the <code>extensions<\/code> key in <code>raplsaich_settings<\/code>. For backward compatibility, the legacy <code>pro_features<\/code> key is read as a fallback but all new settings are written to <code>extensions<\/code>.<\/p>\n\n<h4>Database Tables<\/h4>\n\n<p>The plugin creates the following database tables:<\/p>\n\n<ul>\n<li><code>{prefix}_aichat_conversations<\/code> \u2014 Chat sessions<\/li>\n<li><code>{prefix}_aichat_messages<\/code> \u2014 Individual messages with token tracking<\/li>\n<li><code>{prefix}_aichat_index<\/code> \u2014 Site learning content index<\/li>\n<li><code>{prefix}_aichat_knowledge<\/code> \u2014 Custom knowledge base entries<\/li>\n<li><code>{prefix}_aichat_leads<\/code> \u2014 Lead capture data<\/li>\n<\/ul>\n\n<h4>Uninstallation<\/h4>\n\n<p>When uninstalled with \"Delete data on uninstall\" enabled, the plugin removes all database tables, options, and transients. Without this setting, data is preserved for re-installation.<\/p>\n\n<h3>Development<\/h3>\n\n<p>Release ZIPs are CI-verified for packaging correctness. Report any issues via the support forum.<\/p>\n\n<h4>Credits<\/h4>\n\n<ul>\n<li><a href=\"https:\/\/www.chartjs.org\/\">Chart.js<\/a> (MIT License) \u2014 Usage statistics charts<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>rapls-ai-chatbot<\/code> folder to the <code>\/wp-content\/plugins\/<\/code> directory<\/li>\n<li>Activate the plugin via the 'Plugins' menu in WordPress<\/li>\n<li>Go to AI Chatbot &gt; Settings to configure your AI provider and API key<\/li>\n<li>Customize the chatbot appearance and behavior as needed<\/li>\n<li>The chatbot will automatically appear on your site<\/li>\n<\/ol>\n\n<h4>API Key Setup<\/h4>\n\n<p>You'll need an API key from at least one AI provider:<\/p>\n\n<ul>\n<li><strong>OpenAI:<\/strong> Get your key at <a href=\"https:\/\/platform.openai.com\/\">platform.openai.com<\/a><\/li>\n<li><strong>Anthropic Claude:<\/strong> Get your key at <a href=\"https:\/\/console.anthropic.com\/\">console.anthropic.com<\/a><\/li>\n<li><strong>Google Gemini:<\/strong> Get your key at <a href=\"https:\/\/aistudio.google.com\/\">aistudio.google.com<\/a><\/li>\n<li><strong>OpenRouter:<\/strong> Get your key at <a href=\"https:\/\/openrouter.ai\/\">openrouter.ai<\/a><\/li>\n<\/ul>\n\n<h4>MCP Server Setup<\/h4>\n\n<ol>\n<li>Go to AI Chatbot &gt; Settings &gt; AI Settings<\/li>\n<li>Enable MCP and click \"Generate API Key\"<\/li>\n<li>Copy the endpoint URL and API key<\/li>\n<li>Add the configuration to your AI agent (Claude Desktop, Cursor, or VS Code)<\/li>\n<\/ol>\n\n<p>The plugin provides 7 MCP tools: get_site_info, search_content, get_knowledge, manage_knowledge, get_conversations, get_settings, search_products (Pro).<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"where%20can%20i%20find%20detailed%20documentation%3F\"><h3>Where can I find detailed documentation?<\/h3><\/dt>\n<dd><p>A comprehensive developer's guide explains why this plugin was built, how the RAG hybrid search works, setup walkthroughs, and common troubleshooting:<\/p>\n\n<ul>\n<li><a href=\"https:\/\/raplsworks.com\/plugins\/rapls-ai-chatbot\/\">Rapls AI Chatbot \u2014 Developer's Guide<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/rapls\/rapls-ai-chatbot\">Source code on GitHub<\/a><\/li>\n<li><a href=\"https:\/\/raplsworks.com\/\">Developer's blog \u2014 Rapls Works<\/a><\/li>\n<\/ul><\/dd>\n<dt id=\"which%20ai%20provider%20should%20i%20choose%3F\"><h3>Which AI provider should I choose?<\/h3><\/dt>\n<dd><p>Each provider has different strengths:\n* <strong>OpenAI GPT-4o-mini<\/strong> \u2014 Best balance of cost and performance for most use cases\n* <strong>Claude Sonnet 4.5<\/strong> \u2014 Excellent for nuanced, helpful responses\n* <strong>Gemini 2.5 Flash<\/strong> \u2014 Fast and cost-effective, good for high-volume sites\n* <strong>OpenRouter<\/strong> \u2014 Access to 100+ models from multiple providers with a single API key<\/p><\/dd>\n<dt id=\"how%20much%20does%20it%20cost%20to%20use%3F\"><h3>How much does it cost to use?<\/h3><\/dt>\n<dd><p>The plugin itself is free. You pay for AI API usage directly to your chosen provider. Typical costs:\n* GPT-4o-mini: ~$0.15\/1M input tokens, ~$0.60\/1M output tokens\n* Claude Haiku 4.5: ~$0.80\/1M input tokens, ~$4.00\/1M output tokens\n* Gemini 2.5 Flash: ~$0.15\/1M input tokens, ~$0.60\/1M output tokens<\/p><\/dd>\n<dt id=\"can%20i%20use%20multiple%20ai%20providers%3F\"><h3>Can I use multiple AI providers?<\/h3><\/dt>\n<dd><p>You can configure multiple API keys, but only one provider is active at a time. You can switch between providers in the settings.<\/p><\/dd>\n<dt id=\"how%20does%20site%20learning%20work%3F\"><h3>How does Site Learning work?<\/h3><\/dt>\n<dd><p>The plugin crawls your published content and creates a searchable index. When users ask questions, relevant content is included in the AI context for accurate, site-specific responses. With vector embedding enabled, hybrid search combines keyword matching (40%) and vector similarity (60%) for better retrieval.<\/p><\/dd>\n<dt id=\"how%20does%20web%20search%20work%3F\"><h3>How does Web Search work?<\/h3><\/dt>\n<dd><p>When the knowledge base and site content don't have a sufficient answer, the AI automatically searches the web using each provider's built-in capability (OpenAI web_search_preview, Claude web_search, Gemini google_search). Web sources are shown with a globe icon.<\/p><\/dd>\n<dt id=\"what%20is%20the%20mcp%20server%3F\"><h3>What is the MCP Server?<\/h3><\/dt>\n<dd><p>MCP (Model Context Protocol) allows external AI agents like Claude Desktop, Cursor, and VS Code to interact with your chatbot's data. The plugin provides 7 built-in tools for searching content, managing knowledge, and viewing conversations. Tools are also registered as WordPress Abilities for auto-discovery.<\/p><\/dd>\n<dt id=\"can%20i%20embed%20the%20chatbot%20on%20external%20sites%3F\"><h3>Can I embed the chatbot on external sites?<\/h3><\/dt>\n<dd><p>Yes. The plugin provides a cross-site embed page (<code>?raplsaich_embed=1<\/code>) and a loader script (<code>assets\/js\/embed-loader.js<\/code>) for easy integration on any external website via iframe.<\/p><\/dd>\n<dt id=\"can%20i%20use%20the%20gutenberg%20block%3F\"><h3>Can I use the Gutenberg block?<\/h3><\/dt>\n<dd><p>Yes. Search for \"AI Chatbot\" in the block editor to insert the chatbot block. Configure height, theme, and bot-id settings. Server-side rendering (SSR) is supported.<\/p><\/dd>\n<dt id=\"can%20i%20customize%20the%20chatbot%20appearance%3F\"><h3>Can I customize the chatbot appearance?<\/h3><\/dt>\n<dd><p>Yes. You can customize:\n* Bot name and avatar (emoji or image)\n* Primary and secondary colors\n* Theme (6 built-in themes)\n* Welcome message (13 languages)\n* Badge position, margins, and icon\n* Mobile visibility\n* Excluded pages\n* Typing indicator and Markdown rendering<\/p><\/dd>\n<dt id=\"is%20conversation%20history%20saved%3F\"><h3>Is conversation history saved?<\/h3><\/dt>\n<dd><p>Yes, by default. You can disable this in Settings &gt; Data Management. Saved conversations are auto-deleted after the configured retention period (default: 90 days).<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20page%20builders%3F\"><h3>Does it work with page builders?<\/h3><\/dt>\n<dd><p>Yes, the chatbot widget works with any theme and page builder including Elementor, Divi, Beaver Builder, and Gutenberg.<\/p><\/dd>\n<dt id=\"can%20i%20use%20custom%20system%20prompts%3F\"><h3>Can I use custom system prompts?<\/h3><\/dt>\n<dd><p>Yes. Configure your own system prompt to define the AI's personality, behavior, and response style. The <code>raplsaich_system_prompt<\/code> filter is also available for programmatic customization. Advanced feature prompts (regeneration, feedback learning, summary) are also customizable.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20i%20exceed%20my%20api%20quota%3F\"><h3>What happens if I exceed my API quota?<\/h3><\/dt>\n<dd><p>The plugin displays a customizable error message when your AI provider's quota limits are reached. There is no artificial response limit in the plugin itself.<\/p><\/dd>\n<dt id=\"what%20is%20the%20pro%20add-on%3F\"><h3>What is the Pro add-on?<\/h3><\/dt>\n<dd><p>The Pro add-on is a separate plugin that adds business-oriented features such as analytics, lead capture, conversation scenarios, operator mode, WooCommerce integration, and LINE integration. The free version is fully functional on its own with no artificial limits.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20my%20data%20when%20i%20uninstall%3F\"><h3>What happens to my data when I uninstall?<\/h3><\/dt>\n<dd><p>By default, the plugin keeps your settings and conversation data so you can re-install without losing anything. To delete all data on uninstall, enable \"Delete data on uninstall\" in Settings &gt; Data Management. Temporary cache and diagnostic counters are always removed regardless of this setting. On multisite, each site has its own setting.<\/p><\/dd>\n<dt id=\"how%20can%20i%20adjust%20multisite%20uninstall%20performance%3F\"><h3>How can I adjust multisite uninstall performance?<\/h3><\/dt>\n<dd><p>On large multisite networks, uninstall batch size is adjustable via filters. Add to your <code>functions.php<\/code> or an MU-plugin:<\/p>\n\n<pre><code>add_filter( 'raplsaich_uninstall_batch_size', function() { return 50; } );\n\nadd_filter( 'raplsaich_uninstall_snapshot_threshold', function() { return 1000; } );\n<\/code><\/pre>\n\n<p>Guide: low-memory\/slow-DB \u2192 batch size 20-50, standard \u2192 100, fast\/large-scale \u2192 200-500.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.7.6<\/h4>\n\n<ul>\n<li>Fixed: Conversation list message search returned no hits when AES-256-GCM encryption was on. The search ran a SQL <code>LIKE<\/code> against <code>messages.content<\/code>, but with encryption enabled the column holds <code>encg:...<\/code> ciphertext that can never match a plaintext keyword. The list now also scans the most recent N encrypted messages in PHP after decryption (default 2000, filterable via <code>raplsaich_search_decrypt_limit<\/code>). Plaintext sites keep using the cheaper SQL path.<\/li>\n<li>Added: <code>?conversation_id=N<\/code> direct filter on the conversations admin page. Used by Pro analytics' \"View Conversation\" button so the link always resolves to the target row, regardless of encryption state. An info notice appears at the top showing which conversation is filtered, with a \"Show all\" link to return to the unfiltered list.<\/li>\n<li>Changed: Hierarchical preset group chips (Pro 1.6.0+) now use the same neutral grey palette as their child chips, instead of the site primary colour. Avoids visual confusion with the visitor's own messages (which use the primary). The \"\u25b8\" marker baked into the label still signals \"tap to reveal more\".<\/li>\n<\/ul>\n\n<h4>1.7.5<\/h4>\n\n<ul>\n<li>Security: Session tokens issued to the chat widget now carry an expiry and a session-version stamp. Previous v1 tokens were a deterministic HMAC of the session id alone, with no TTL or revocation channel \u2014 once leaked, they remained valid until the underlying session row was deleted. The new v2 format is <code>version.iat.exp.hmac<\/code>, signed over <code>version.iat.exp.session_id<\/code>. Default TTL is 7 days (filterable via <code>raplsaich_session_token_ttl<\/code>, capped at 30 days). Bumping <code>raplsaich_session_version<\/code> (the existing \"Reset all user sessions\" admin button) now also revokes every outstanding token. Old v1 tokens are rejected at verification time; clients automatically receive a v2 token on the next <code>\/session<\/code> call, so the visitor experience is unchanged<\/li>\n<li>Security: Offline-message endpoint's permission callback now verifies the request comes from one of the allowed site hosts (Origin\/Referer match), not just that any Origin\/Referer header is present. The internal <code>guard_public_post()<\/code> same-origin check is kept as defense-in-depth, but non-browser clients with spoofed headers can no longer reach the callback at all<\/li>\n<\/ul>\n\n<h4>1.7.4<\/h4>\n\n<ul>\n<li>Fixed: New \"Start a new conversation\" header button (1.7.3) was hard-to-read white-on-white in the Simple and Light themes. The Simple\/Light theme overrides now apply to both header buttons (close + new-conversation) instead of only close.<\/li>\n<\/ul>\n\n<h4>1.7.3<\/h4>\n\n<ul>\n<li>Added: New \"Link Open Behavior\" setting under Display Settings \u2014 choose between opening reply links in a new window\/tab (existing behavior) or in the same window. Applies to all link types in chat replies (knowledge base sources, web sources, content cards, action buttons, product cards, markdown links, raw URLs).<\/li>\n<li>Added: \"Start a new conversation\" button in the chat header (circular-arrow icon, next to Close). Tapping it confirms once, then drops the visitor's local session and re-renders the welcome message. Useful for visitors who want to test a fresh question without prior context, and for admins testing the bot. Server-side conversation history is kept intact for admin review.<\/li>\n<li>Added: Drag-and-drop reordering on the preset question button rows in Chat Settings. A grip handle appears on the left of each row; drag a row up or down to reorder. Save the form to persist the new order.<\/li>\n<\/ul>\n\n<h4>1.7.2<\/h4>\n\n<ul>\n<li>Changed: Preset chips now use a neutral grey colour scheme distinct from user-message bubbles, so visitors no longer mistake a preset chip for one of their own past messages<\/li>\n<li>Changed: Welcome-message preset chips stay visible after a click instead of being removed \u2014 visitors can scroll back and tap a different preset later. Tapped chips are visually marked as \"visited\" (semi-transparent). The persistent \"show under every reply\" mode is unchanged: those re-render naturally on each bot reply<\/li>\n<li>Changed: Hierarchical preset groups containing only one child are now rendered as flat chips so visitors don't need two taps to send a single question<\/li>\n<\/ul>\n\n<h4>1.7.1<\/h4>\n\n<ul>\n<li>Added: chatbot.js support for hierarchical preset chips \u2014 when a preset item carries a <code>children<\/code> array, the chip renders as a group with a \"\u25b8\" suffix; tapping it reveals the child chips with a \"\u2190 back\" chip to return. Free's flat presets are unchanged<\/li>\n<li>Added: REST <code>\/preset-canned<\/code> validation now also accepts canned-reply clicks coming from Pro 1.6.0+ hierarchical preset groups<\/li>\n<li>Changed: CSS for preset chips gains group\/back variants (filled chip for groups, dashed-border chip for back)<\/li>\n<\/ul>\n\n<h4>1.7.0<\/h4>\n\n<ul>\n<li>Added: Glossary (proper-noun protection list) \u2014 register up to 50 terms (product names, service names, brand names, words that take on a different meaning when translated) so the AI keeps them verbatim across all reply languages. Optional per-row Notes field for free-form per-language instructions (e.g. \"Always render as Staff Perks in English, \u5458\u5de5\u798f\u5229 in Chinese\"). Toggleable on\/off in Chat Settings<\/li>\n<li>Added: New <code>raplsaich_inject_glossary<\/code> filter callback (priority 98) on the existing <code>raplsaich_system_prompt<\/code> chain \u2014 applies to all surfaces that use the filter (REST <code>\/chat<\/code>, Pro regenerate \/ suggestions \/ LINE \/ MCP tools), so the glossary is enforced consistently regardless of how the conversation is triggered<\/li>\n<\/ul>\n\n<h4>1.6.6<\/h4>\n\n<ul>\n<li>Added: Optional \"Fixed reply\" field on each preset question row. When set, tapping the chip renders the configured reply instantly with no AI call (zero token cost, no AI provider latency, fully controllable wording). Empty field keeps the existing behavior (forwards the question to the AI). Mix per row \u2014 common FAQs can be canned, edge cases can stay AI-driven<\/li>\n<li>Added: New REST endpoint <code>POST \/preset-canned<\/code> that persists the canned exchange to the conversation history (when save_history is on) and tags the user message with <code>metadata.preset_index<\/code> + <code>metadata.preset_canned = true<\/code>, so Pro analytics still counts the click and the conversation shows up in the admin Conversations list<\/li>\n<\/ul>\n\n<h4>1.6.5<\/h4>\n\n<ul>\n<li>Fixed: WordPress.org Plugin Check rejected 1.6.4 with \"Description: A maximum of 150 characters is supported.\" \u2014 the short description had grown to 152 characters when the 13-language auto-reply pitch was added in 1.6.1. Trimmed to 130 characters by dropping filler words (\"for WordPress\", \"and\") without losing keyword coverage<\/li>\n<\/ul>\n\n<h4>1.6.4<\/h4>\n\n<ul>\n<li>Added: New \"Also show preset buttons under every bot reply\" toggle in Chat Settings. When on, the same preset chips re-appear after every AI response \u2014 handy for navigation-style bots where visitors hop between common topics. When off (default), behavior is unchanged: chips appear once after the welcome message and disappear after the first user message<\/li>\n<li>Added: Stale preset chip cleanup when the visitor sends a message \u2014 prevents chips from stacking up across turns in persistent mode<\/li>\n<\/ul>\n\n<h4>1.6.3<\/h4>\n\n<ul>\n<li>Changed: The \"Question sent to the bot\" field on each preset question row is now a 2-row textarea (vertically resizable) instead of a single-line input. Long questions like \"\u6b21\u56de\u306e\u30a4\u30d9\u30f3\u30c8\u958b\u50ac\u65e5\u3092\u6559\u3048\u3066\u304f\u3060\u3055\u3044\" no longer overflow the visible area in the editor<\/li>\n<\/ul>\n\n<h4>1.6.2<\/h4>\n\n<ul>\n<li>Added: Preset question buttons \u2014 chips shown under the welcome message (configurable on\/off in Chat Settings, up to 10 entries). Tapping a chip submits the configured question text. Chips disappear once the user sends their first message. Useful for nudging visitors toward common topics (\"Pricing\", \"Hours\", \"Staff perks\", etc.) without making them type.<\/li>\n<li>Added: <code>preset_index<\/code> request param on <code>\/chat<\/code> and <code>metadata.preset_index<\/code> on the user message row, so Pro analytics (1.5.0+) can attribute clicks back to a specific preset.<\/li>\n<li>Added: Public helper <code>RAPLSAICH_Admin::sanitize_preset_questions()<\/code> so Pro per-bot sanitizers can reuse the validation rules (max 10 rows, label \u2264 40 chars, question \u2264 200 chars, both required).<\/li>\n<\/ul>\n\n<h4>1.6.1<\/h4>\n\n<ul>\n<li>Changed: Description and feature copy in readme + LP files now lead with the 13-language auto-reply use case (tourism, hospitality, retail sites that get multilingual inquiries without multilingual staff). The feature itself is unchanged<\/li>\n<\/ul>\n\n<h4>1.6.0<\/h4>\n\n<ul>\n<li>Milestone release consolidating eight patch updates (1.5.15\u20131.5.22):\n\n<ul>\n<li>Current-date injection so the AI can answer \"today \/ yesterday \/ this week\" questions without manually adding the date to the knowledge base<\/li>\n<li>Robust against weak models (e.g. Gemini Flash Lite) that previously dismissed injected dates as fabrication<\/li>\n<li><code>channel<\/code> column on conversations + Channel column in the admin Conversations list (Web \/ LINE)<\/li>\n<li>Conversations admin decluttered from 12 columns to 8, with overlap fixes and CSS for the channel badge<\/li>\n<li>Japanese label for \"Conversations\" simplified to \u4f1a\u8a71<\/li>\n<li><code>raplsaich_get_max_context_chars()<\/code> exposed as a helper so external surfaces (Pro's LINE channel) feed the same volume of knowledge to the model<\/li>\n<li>Plugin home and Pro upgrade links migrated to the new \/plugins\/ URL structure on raplsworks.com<\/li>\n<\/ul><\/li>\n<\/ul>\n\n<h4>1.5.22<\/h4>\n\n<ul>\n<li>Changed: Plugin home and Pro upgrade links updated to the new <code>\/plugins\/...<\/code> URL structure on raplsworks.com (the standalone <code>rapls-ai-chatbot-guide\/<\/code> and <code>rapls-ai-chatbot-pro<\/code> pages have moved). Affects the plugin header URI, the dashboard upsell, the Settings banner, and the readme<\/li>\n<\/ul>\n\n<h4>1.5.21<\/h4>\n\n<ul>\n<li>Changed: The \"max RAG context characters\" calculation that scales with the configured AI model is now exposed as a public helper (<code>raplsaich_get_max_context_chars()<\/code>) so non-REST surfaces \u2014 Pro's LINE channel in particular \u2014 can feed the same volume of knowledge to the model. The REST controller's <code>get_max_context_chars()<\/code> method is preserved as a thin wrapper for back-compat<\/li>\n<\/ul>\n\n<h4>1.5.20<\/h4>\n\n<ul>\n<li>Fixed: Conversations admin \u2014 Msgs and Lead cells visually overlapped on narrow viewports because the new layout left those columns at default width with no overflow handling. Lead now has an explicit 200px width, Msgs is widened to 70px, and cell content is constrained with overflow\/word-break rules. Channel badge in the Session cell also gets its own styles so Web vs LINE is distinct<\/li>\n<li>Changed: Japanese label for \"Conversations\" simplified from \"\u4f1a\u8a71\u5c65\u6b74\" to \"\u4f1a\u8a71\" so the admin menu reads naturally as just \"\u4f1a\u8a71\"<\/li>\n<\/ul>\n\n<h4>1.5.19<\/h4>\n\n<ul>\n<li>Changed: Conversations admin page now shows 8 columns instead of 12. The ID column is gone (still in the row's data-id and shown in the Session tooltip), Channel is folded into the Session column as a small badge, the separate Handoff column is folded into Status as a sub-badge, and Started has been merged into Last Active (start time is now in the cell tooltip). All sort options remain available<\/li>\n<\/ul>\n\n<h4>1.5.18<\/h4>\n\n<ul>\n<li>Added: New <code>channel<\/code> column on the conversations table (web \/ line \/ etc.) plus a \"Channel\" column in the Conversations admin list, so multi-channel installations can tell at a glance which platform a conversation came from. Existing rows default to \"web\". Migration runs automatically on plugin update<\/li>\n<\/ul>\n\n<h4>1.5.17<\/h4>\n\n<ul>\n<li>Fixed: Smaller AI models (e.g. Gemini 2.5 Flash Lite) still refused to answer \"today's date\" questions in 1.5.16 because the user's own system prompt typically forbids \"inventing dates\" and the model treated the injected date as a forbidden invention. The injected date block now (a) opens with a clear \"OVERRIDE \u2014 TAKES ABSOLUTE PRECEDENCE\" marker, (b) explicitly states that no-fabrication rules do NOT apply to the system-provided date, and (c) includes a few-shot example showing the expected answer format in both Japanese and English<\/li>\n<\/ul>\n\n<h4>1.5.16<\/h4>\n\n<ul>\n<li>Fixed: Current date injection in 1.5.15 was only applied to the main send-message endpoint and was sometimes ignored by weaker AI models that interpreted the system prompt's \"do not invent dates\" rule too literally. Now hooked on the <code>raplsaich_system_prompt<\/code> filter at priority 99 so all endpoints (regenerate, suggestions, MCP tool, etc.) receive it, and the prompt explicitly states the date is authoritative system context \u2014 not fabrication<\/li>\n<\/ul>\n\n<h4>1.5.15<\/h4>\n\n<ul>\n<li>Added: System prompt now injects the current date (in the site's WordPress timezone) so the AI can correctly resolve relative time references like \"today\", \"yesterday\", or \"this week\" without needing them in the knowledge base<\/li>\n<\/ul>\n\n<h4>1.5.14<\/h4>\n\n<ul>\n<li>Fixed: Root cause of the iPhone Safari \"close button off-screen\" issue \u2014 chat input textarea now uses font-size: 16px so iOS Safari no longer auto-zooms the viewport on focus. The iOS keyboard fix from 1.5.13 is kept as a secondary safeguard<\/li>\n<li>Fixed: Reference link cards now survive a page reload \u2014 message display metadata (sources, cards, web sources) is persisted on the message row and returned by the history endpoint<\/li>\n<li>Fixed: Link card titles and excerpts no longer show literal HTML entities like <code>&amp;amp;<\/code><\/li>\n<li>Fixed: Link card excerpts strip common Markdown syntax (<code>**<\/code>, backticks, <code>#<\/code>, <code>[text](url)<\/code>, etc.) so previews read as plain prose<\/li>\n<li>Fixed: Link card rows on mobile no longer overflow past the chat bubble \u2014 added <code>min-width: 0<\/code> to the message content flex child so the inner horizontal scroll container takes effect<\/li>\n<\/ul>\n\n<h4>1.5.13<\/h4>\n\n<ul>\n<li>Added: Optional iOS Safari keyboard fix (opt-in) \u2014 when enabled, uses the VisualViewport API to keep the chatbot header (including the close button) on-screen while the on-screen keyboard is visible. Disable this setting if it conflicts with your theme's scroll behavior. Default: off<\/li>\n<\/ul>\n\n<h4>1.5.12<\/h4>\n\n<ul>\n<li>Fixed: Vector embedding search checkbox could not be turned off after being enabled \u2014 unchecked state was ignored because HTML forms omit unchecked checkboxes from POST<\/li>\n<li>Fixed: Badge position margin setting was not applied on mobile screens (&lt;=480px) due to a hardcoded media-query override<\/li>\n<li>Fixed: Primary color was not applied to the badge icon on the Simple \/ Classic \/ Light \/ Minimal \/ Flat themes (background color was hardcoded)<\/li>\n<li>Fixed: On iPhone Safari, focusing the chat input pushed the close button off-screen \u2014 switched to <code>100dvh<\/code> dynamic viewport height<\/li>\n<li>Added: Separate margin settings for desktop and mobile screens<\/li>\n<li>Added: Badge icon size setting (30\u2013120px), separate values for desktop and mobile<\/li>\n<\/ul>\n\n<h4>1.5.11<\/h4>\n\n<ul>\n<li>Fixed: Fatal error on Settings page in 1.5.10 \u2014 template include helper broke local variable scope causing <code>$openai_provider<\/code> to be null. Templates are now included inline with a file_exists() guard so render-method locals stay accessible<\/li>\n<\/ul>\n\n<h4>1.5.10<\/h4>\n\n<ul>\n<li>Fixed: Re-deploy all template files (<code>templates\/admin\/*.php<\/code>) \u2014 the 1.5.9 release was missing these due to an SVN upload issue, causing admin screens to render blank<\/li>\n<li>Added: Admin templates now render a visible error notice instead of a blank page if any template file is missing, so future deploy issues are immediately diagnosable<\/li>\n<\/ul>\n\n<h4>1.5.9<\/h4>\n\n<ul>\n<li>Removed: Discontinued OpenAI models from the dropdown \u2014 <code>gpt-4<\/code>, <code>gpt-4-turbo<\/code>, <code>gpt-3.5-turbo<\/code>, <code>o1<\/code>, <code>o1-pro<\/code> (all retired by OpenAI)<\/li>\n<li>Removed: Discontinued Claude model <code>claude-3-7-sonnet-20250219<\/code> from the dropdown (retired by Anthropic)<\/li>\n<\/ul>\n\n<h4>1.5.8<\/h4>\n\n<ul>\n<li>Fixed: Gemini API key validation now uses the models list endpoint (no more false \"Invalid API key\" errors for valid keys)<\/li>\n<li>Fixed: API key is saved automatically on successful connection test (previously required a separate save step)<\/li>\n<li>Fixed: Gemini embedding model updated from deprecated <code>text-embedding-004<\/code> to <code>gemini-embedding-001<\/code> (with 768-dim output for backward compatibility)<\/li>\n<li>Removed: Discontinued Gemini 1.5 series models (Pro \/ Flash \/ Flash 8B) from the model dropdown \u2014 Google retired these models<\/li>\n<li>Added: <code>gemini-2.0-flash-lite<\/code> to the model dropdown<\/li>\n<\/ul>\n\n<h4>1.5.7<\/h4>\n\n<ul>\n<li>Updated: Japanese translations \u2014 full-width parentheses replaced with half-width per WordPress Style Guide<\/li>\n<li>Updated: Dashboard Docs links and review request banner<\/li>\n<\/ul>\n\n<h4>1.5.6<\/h4>\n\n<ul>\n<li>Fixed: Response Language setting now works when set to \"Site language\" \u2014 was silently ignored<\/li>\n<li>Fixed: AI responses in wrong language when RAG context is in a different language (triple enforcement)<\/li>\n<li>Fixed: Chatbot placeholder language now respects site locale over browser language<\/li>\n<li>Fixed: Response cache now includes language in hash key to prevent stale translations<\/li>\n<li>Fixed: Reset confirm dialog newlines not rendering in prompt()<\/li>\n<li>Improved: Response language instruction placed at beginning, end of system prompt, and in user message<\/li>\n<\/ul>\n\n<h4>1.5.5<\/h4>\n\n<ul>\n<li>Improved: Complete Free\/Pro code separation \u2014 all Pro UI code moved to separate Pro plugin<\/li>\n<li>Improved: Frontend chatbot.js reduced by 50% (4,300 \u2192 2,175 lines) for faster page loads<\/li>\n<li>Improved: Consolidated admin menu into single \"Pro Features\" overview page<\/li>\n<li>Improved: Hook-based extension architecture for Pro features<\/li>\n<li>Security: Removed arbitrary custom CSS injection \u2014 use WordPress Customizer instead<\/li>\n<li>Security: All CSS variable values escaped with esc_attr(), position margins with absint()<\/li>\n<li>Security: Block render output sanitized with wp_kses() and widget-aware allow-list<\/li>\n<li>Security: Added <code>rel=\"noopener noreferrer\"<\/code> to all external links<\/li>\n<li>Security: Inline JS\/CSS now uses wp_add_inline_script() and wp_add_inline_style() instead of raw output<\/li>\n<li>Fixed: Lead form display and submission when Pro is active<\/li>\n<li>Changed: Settings key renamed from <code>pro_features<\/code> to <code>extensions<\/code> with automatic migration<\/li>\n<li>Changed: Unique prefix <code>raplsaich_<\/code> applied to all functions, options, hooks, and REST namespace<\/li>\n<li>Updated: External Services section with per-service documentation and embed-loader.js clarification<\/li>\n<li>Updated: Chart.js to v4.5.1, html2canvas bundled locally<\/li>\n<\/ul>\n\n<h4>1.5.2<\/h4>\n\n<ul>\n<li>Fixed: WordPress Plugin Check compliance (WP_Filesystem annotations, prepared SQL annotations)<\/li>\n<li>Removed: Artificial free-tier limits \u2014 all core features are fully available<\/li>\n<li>Removed: Default \"Powered by\" footer from chatbot widget<\/li>\n<li>Updated: Neutral error messages replacing promotional upsell text<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>Added: Gutenberg block \u2014 Insert AI Chatbot block in the block editor with height, theme, and bot-id settings; SSR (server-side rendering) support; i18n (JA\/EN translation JSON)<\/li>\n<li>Added: WordPress Abilities API Bridge \u2014 Register all 7 MCP tools as WordPress Abilities for auto-discovery by MCP Adapters (Claude Desktop, Cursor, VS Code)<\/li>\n<li>Added: Response language auto-detect \u2014 Automatically detect browser language for welcome message and AI responses; choose from \"Site language\", \"Auto-detect\", or manual<\/li>\n<li>Added: OpenRouter provider support (100+ models via single API key)<\/li>\n<li>Added: Pro add-on compatibility layer for extended features<\/li>\n<li>Fixed: MCP tool registration timing for reliable integration<\/li>\n<li>Fixed: Abilities API category registration and naming compliance<\/li>\n<li>Updated: Japanese translation \u2014 all strings translated including Abilities API, Gutenberg block, and response language settings<\/li>\n<li>Updated: WordPress Plugin Check compliance fixes<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Added: Web search integration \u2014 AI automatically searches the web when knowledge base lacks a sufficient answer (OpenAI web_search_preview, Claude web_search, Gemini google_search grounding)<\/li>\n<li>Added: Web search toggle in AI Settings tab with per-provider cost notice<\/li>\n<li>Added: Web source citations displayed with globe icon, separate from knowledge base sources<\/li>\n<li>Added: Cross-site embed page \u2014 embed chatbot on external sites via iframe (?raplsaich_embed=1 endpoint)<\/li>\n<li>Added: Embed loader script (assets\/js\/embed-loader.js) for easy cross-site integration<\/li>\n<li>Added: PDF and DOCX file upload support in knowledge base (server-side parsing)<\/li>\n<li>Added: Vector embedding RAG with hybrid search (keyword 40% + vector 60%)<\/li>\n<li>Updated: AI model lists \u2014 OpenAI GPT-5.2\/5.1\/5\/4.1 series, Claude Opus 4.6\/Sonnet 4.5\/Haiku 4.5, Gemini 3\/2.5 series<\/li>\n<li>Updated: Japanese translation<\/li>\n<\/ul>\n\n<h4>1.3.2<\/h4>\n\n<ul>\n<li>Security: Session ID now transmitted via <code>X-RAPLSAICH-Session<\/code> header instead of query strings (prevents access log leakage)<\/li>\n<li>Security: GET requests no longer accept <code>?session_id=<\/code> query parameter<\/li>\n<li>Security: POST requests ignore body <code>session_id<\/code> when header is present (prevents APM\/WAF body-logging leakage)<\/li>\n<li>Security: Removed client-side <code>raplsaich_user_id<\/code> remnant from JavaScript<\/li>\n<li>Security: Context key derivation simplified to session-only HMAC (removed IP binding for stability)<\/li>\n<li>Security: DOM-based URL linking and offline form rendering (XSS hardening)<\/li>\n<li>Security: Dompdf post-init safety assertion (<code>isPhpEnabled<\/code> \/ <code>isRemoteEnabled<\/code> check)<\/li>\n<li>Added: Rate-limited error logging (<code>raplsaich_rate_limited_log()<\/code>) with filterable interval via <code>raplsaich_rate_limited_log_interval<\/code><\/li>\n<li>Added: Server-side offline message dedup (30-second window, session-preferred key)<\/li>\n<li>Added: Client-side offline form dedup via sessionStorage<\/li>\n<li>Improved: Offline message endpoint allows unauthenticated submissions (<code>allow_no_headers<\/code>)<\/li>\n<li>Improved: Rate limit fallback keys hashed to prevent <code>wp_options<\/code> bloat<\/li>\n<li>Improved: Standardized REST error responses with <code>error_code<\/code> field<\/li>\n<li>Improved: Dompdf errors return JSON response instead of <code>wp_die()<\/code> for better admin UX<\/li>\n<li>Improved: REST API session authentication documented in readme<\/li>\n<\/ul>\n\n<h4>1.3.1<\/h4>\n\n<ul>\n<li>Added: Pro add-on compatibility for enhanced rate limiting and PDF export<\/li>\n<li>Improved: Rate limit error messages are now customizable<\/li>\n<li>Improved: Diagnostic options renamed to <code>raplsaich_diag_*<\/code> namespace<\/li>\n<li>Improved: Frontend debug minimum capability is now filterable via <code>raplsaich_frontend_debug_min_cap<\/code><\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Added: Pro add-on compatibility for response caching, audit logs, conversion tracking, offline messages, and answer templates<\/li>\n<li>Improved: Knowledge base supports 'qa' and 'template' entry types<\/li>\n<li>Improved: Database schema updates for caching and conversion tracking<\/li>\n<\/ul>\n\n<h4>1.2.23<\/h4>\n\n<ul>\n<li>Added: Sortable column headers in admin tables \u2014 Dashboard model stats, Conversations, Knowledge, and Crawler pages now support click-to-sort with ascending\/descending toggle<\/li>\n<li>Added: Knowledge base draft status \u2014 entries can be \"published\" or \"draft\", with filter tabs and draft count badge<\/li>\n<li>Added: Enhanced content extraction (Pro) \u2014 DOMDocument-based HTML parsing preserves document structure as Markdown-style text for better AI context<\/li>\n<li>Added: Session reset feature \u2014 administrators can invalidate all existing chat sessions at once<\/li>\n<li>Improved: Session cookie set as httpOnly with SameSite=Lax for better security<\/li>\n<li>Improved: Knowledge base model supports status filtering and sorting with SQL whitelist validation<\/li>\n<li>Improved: Content index model supports orderby\/order parameters for sorted admin views<\/li>\n<li>Updated: Japanese translation<\/li>\n<\/ul>\n\n<h4>1.2.22<\/h4>\n\n<ul>\n<li>Improved: Default system prompt now enforces accuracy, honesty, and no-fabrication rules for better AI response quality<\/li>\n<li>Improved: Site learning context prompt explicitly instructs AI not to guess or fabricate when information is missing<\/li>\n<li>Added: <code>raplsaich_system_prompt<\/code> filter \u2014 developers can now modify the system prompt programmatically<\/li>\n<li>Added: Customizable feature prompts \u2014 regenerate instruction, feedback learning headers, and summary prompt are now editable in Settings<\/li>\n<li>Added: Advanced prompt sections gated behind checkboxes (disabled by default) for safe editing<\/li>\n<li>Added: Placeholder documentation for regeneration prompt ({variation_number}, {forbidden_start}, {style})<\/li>\n<li>Updated: Debugging guide with new prompt customization section<\/li>\n<\/ul>\n\n<h4>1.2.21<\/h4>\n\n<ul>\n<li>Added: Knowledge base export support (CSV\/JSON) \u2014 available with Pro add-on<\/li>\n<li>Added: Budget limit check integration in REST API (blocks AI calls when Pro budget limit exceeded)<\/li>\n<li>Added: Budget alert hook after AI responses (triggers Pro email notifications)<\/li>\n<li>Added: Pro features stub methods for budget management (check_budget_limit, get_budget_block_message, maybe_send_budget_alert)<\/li>\n<li>Improved: Default settings include budget and monthly report configuration keys<\/li>\n<li>Added: Detailed debugging guide documentation (docs\/debugging-guide.md)<\/li>\n<\/ul>\n\n<h4>1.2.20<\/h4>\n\n<ul>\n<li>Added: Knowledge page prefill support (prefill_question parameter for quick FAQ creation from analytics)<\/li>\n<\/ul>\n\n<h4>1.2.19<\/h4>\n\n<ul>\n<li>Security: API key encryption now covers Google Gemini keys (AIza...) in addition to OpenAI and Claude<\/li>\n<li>Security: Added OpenSSL availability check with graceful fallback for encryption\/decryption<\/li>\n<li>Security: Conversation history endpoint (\/history) now verifies session ownership via cookie and IP<\/li>\n<li>Security: Chart.js bundled locally instead of loading from external CDN (WordPress.org compliance)<\/li>\n<li>Added: Session cookie (raplsaich_session_id) set on session creation for reliable history access across IP changes<\/li>\n<\/ul>\n\n<h4>1.2.18<\/h4>\n\n<ul>\n<li>Security: Sanitized API error messages to prevent information leakage<\/li>\n<li>Security: Proxy-aware client IP detection for rate limiting (Cloudflare, X-Forwarded-For)<\/li>\n<li>Security: Consistent SHA-256 hashing for IP-based rate limiting<\/li>\n<li>Fixed: User message duplication in AI context (improved response accuracy)<\/li>\n<li>Fixed: Uninstall now removes all tables including leads and user_context<\/li>\n<li>Fixed: Transient cleanup uses prepared statements<\/li>\n<li>Improved: Database schema checks cached per request (performance)<\/li>\n<li>Improved: Consolidated database upgrade logic in Activator class<\/li>\n<li>Improved: Pro-only REST routes only registered when Pro is active<\/li>\n<li>Added detailed Japanese descriptions for all AI models<\/li>\n<li>Translation improvements<\/li>\n<\/ul>\n\n<h4>1.2.5<\/h4>\n\n<ul>\n<li>Security improvements and code quality enhancements<\/li>\n<li>WordPress Plugin Check compliance updates<\/li>\n<li>Updated AI model pricing information<\/li>\n<li>Bug fixes and performance improvements<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>Multiple AI provider support (OpenAI, Claude, Gemini)<\/li>\n<li>Site learning with automatic content crawling<\/li>\n<li>Custom knowledge base with Q&amp;A format support<\/li>\n<li>Priority levels for knowledge entries<\/li>\n<li>Conversation history with search<\/li>\n<li>Usage statistics with cost estimation<\/li>\n<li>Daily token usage charts<\/li>\n<li>Model-by-model cost breakdown<\/li>\n<li>Customizable chatbot appearance<\/li>\n<li>Rate limiting support<\/li>\n<li>Quota error handling with custom messages<\/li>\n<li>Settings import\/export\/reset<\/li>\n<li>Japanese translation included<\/li>\n<li>Mobile-responsive chat widget<\/li>\n<li>Page exclusion settings<\/li>\n<\/ul>","raw_excerpt":"AI chatbot with OpenAI, Claude, Gemini, OpenRouter. Site learning, knowledge base, web search, MCP server, 13-language auto-reply.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/am.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/292250","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/am.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/am.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/am.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=292250"}],"author":[{"embeddable":true,"href":"https:\/\/am.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/rapls"}],"wp:attachment":[{"href":"https:\/\/am.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=292250"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/am.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=292250"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/am.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=292250"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/am.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=292250"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/am.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=292250"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/am.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=292250"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}