{"id":332521,"date":"2026-07-15T09:53:16","date_gmt":"2026-07-15T09:53:16","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/neccospeak\/"},"modified":"2026-07-15T09:52:45","modified_gmt":"2026-07-15T09:52:45","slug":"neccospeak","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/neccospeak\/","author":23521353,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.1.0","stable_tag":"0.1.0","tested":"7.0.1","requires":"6.4","requires_php":"8.0","requires_plugins":null,"header_name":"NeccoSpeak","header_author":"neccos","header_description":"Lightweight, self-contained AI chat & voice widget powered by your own OpenAI API key \u2014 no external SaaS server required.","assets_banners_color":"021025","last_updated":"2026-07-15 09:52:45","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/neccos.jp","rating":0,"author_block_rating":0,"active_installs":0,"downloads":29,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.1.0":{"tag":"0.1.0","author":"neccos","date":"2026-07-15 09:52:45"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3608592,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3608592,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3608592,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3608592,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.1.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3608592,"resolution":"1","location":"assets","locale":"","width":2442,"height":1757},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3608592,"resolution":"2","location":"assets","locale":"","width":1024,"height":754},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3608592,"resolution":"3","location":"assets","locale":"","width":2126,"height":1796}},"screenshots":{"1":"The chat widget open on a page \u2014 text chat with the optional voice button.","2":"Settings screen \u2014 the API key is stored encrypted and masked, with one-click \"fetch available models\".","3":"Display rules and appearance settings: choose where the widget appears and match your brand color."}},"plugin_section":[],"plugin_tags":[2353,5707,2364,194533,4013],"plugin_category":[41],"plugin_contributors":[271624],"plugin_business_model":[],"class_list":["post-332521","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-chat","plugin_tags-chatbot","plugin_tags-openai","plugin_tags-voice","plugin_category-communication","plugin_contributors-neccos","plugin_committers-neccos"],"banners":{"banner":"https:\/\/ps.w.org\/neccospeak\/assets\/banner-772x250.png?rev=3608592","banner_2x":"https:\/\/ps.w.org\/neccospeak\/assets\/banner-1544x500.png?rev=3608592","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/neccospeak\/assets\/icon-128x128.png?rev=3608592","icon_2x":"https:\/\/ps.w.org\/neccospeak\/assets\/icon-256x256.png?rev=3608592","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/neccospeak\/assets\/screenshot-1.png?rev=3608592","caption":"The chat widget open on a page \u2014 text chat with the optional voice button."},{"src":"https:\/\/ps.w.org\/neccospeak\/assets\/screenshot-2.png?rev=3608592","caption":"Settings screen \u2014 the API key is stored encrypted and masked, with one-click \"fetch available models\"."},{"src":"https:\/\/ps.w.org\/neccospeak\/assets\/screenshot-3.png?rev=3608592","caption":"Display rules and appearance settings: choose where the widget appears and match your brand color."}],"raw_content":"<!--section=description-->\n<p>NeccoSpeak adds an AI chatbot with optional voice conversation to your WordPress site, powered by your own OpenAI API key. Answer visitor questions 24\/7 by text, or let them speak to your site and hear it answer.<\/p>\n\n<p>No SaaS, no extra account, no monthly fee, and no server run by us. NeccoSpeak is fully self-contained: it needs nothing but WordPress and your own OpenAI API key. You pay OpenAI directly and stay in control of your costs and your data.<\/p>\n\n<h4>Let visitors talk to your website<\/h4>\n\n<p>Voice conversation sets NeccoSpeak apart (optional, off by default). Visitors ask questions hands-free and hear the answer spoken back \u2014 a natural fit for accessibility, mobile users, and anyone who would rather speak than type. Under the hood, the visitor's browser connects directly to the OpenAI Realtime API over WebRTC using a short-lived token issued by your server; your real API key never reaches the browser. Voice requires HTTPS and browser microphone permission.<\/p>\n\n<h4>What can you use it for?<\/h4>\n\n<ul>\n<li><strong>24\/7 FAQ and support<\/strong> \u2013 answer common questions (opening hours, pricing, services) around the clock.<\/li>\n<li><strong>Pre-sales questions<\/strong> \u2013 catch the visitor who would rather bounce than write an email.<\/li>\n<li><strong>Online stores<\/strong> \u2013 let shoppers ask about shipping, returns, and store policies on the spot, instead of hunting through pages.<\/li>\n<li><strong>Multilingual visitors<\/strong> \u2013 OpenAI models typically reply in the language the visitor writes in, with no extra configuration.<\/li>\n<li><strong>Blogs and content sites<\/strong> \u2013 give readers a way to ask questions instead of leaving.<\/li>\n<li><strong>Client sites<\/strong> \u2013 agencies and freelancers can deploy it without managing yet another SaaS account; each client brings their own key and owns their own billing and data.<\/li>\n<\/ul>\n\n<p>You decide who the chatbot is: describe your business, opening hours, policies, and tone in the system prompt, and it answers accordingly.<\/p>\n\n<h4>Why NeccoSpeak?<\/h4>\n\n<ul>\n<li><strong>Self-contained<\/strong> \u2013 no third-party SaaS involved; data flows only between your server, the visitor's browser, and OpenAI.<\/li>\n<li><strong>Secure by design<\/strong> \u2013 your API key is stored encrypted with AES-256-CBC, never sent to the browser, and masked in the admin screen.<\/li>\n<li><strong>Zero footprint until configured<\/strong> \u2013 while disabled or without a key, the widget is not loaded and visitors trigger no external communication at all.<\/li>\n<li><strong>Budget protection<\/strong> \u2013 per-IP rate limits plus site-wide caps (hourly and daily for chat, daily for voice) keep bots and abusive visitors from running up your OpenAI bill.<\/li>\n<li><strong>No update needed for new models<\/strong> \u2013 type any model name, or fetch the list of models available to your key with one click. New OpenAI models that support the Chat Completions API work as soon as they are released.<\/li>\n<\/ul>\n\n<h4>Features<\/h4>\n\n<ul>\n<li>Text chat widget, plus optional voice conversation (off by default)<\/li>\n<li>Display rules: all pages, only specific URLs, or exclude specific URLs<\/li>\n<li>Customizable title, welcome message, and brand color<\/li>\n<li>Free-form model selection with one-click \"fetch available models\"<\/li>\n<li>Custom system prompt<\/li>\n<li>Per-IP and site-wide rate limits with adjustable caps<\/li>\n<\/ul>\n\n<h4>Cost control<\/h4>\n\n<p>Visitors' chat usage is billed to your own OpenAI account, so NeccoSpeak ships with brakes built in: a per-IP, per-minute limit plus site-wide caps (hourly and daily for text chat, daily for voice sessions). When a cap is hit, further requests are declined with a temporary error until the limit window resets \u2014 so your bill stops growing. Tune the limits to match your budget on the settings screen.<\/p>\n\n<h4>Terms and disclaimer<\/h4>\n\n<ul>\n<li>This plugin is provided free of charge as open source software (GPLv2 or later) on an \"as-is\" basis, without warranty of any kind, express or implied. Because it is distributed free of charge, the developer (neccos) assumes no obligation for support, SLA, or continued availability.<\/li>\n<li>This plugin operates without any server of ours, and no service operated by the developer is involved. It runs with your own OpenAI API key, use of the AI is subject to OpenAI's terms and policies, and usage fees are billed directly to your OpenAI account. The developer is not involved in any contract, billing, or service matters with OpenAI.<\/li>\n<li>Data flow: chat text and audio are sent to OpenAI with your key and processed under OpenAI's terms. <strong>This plugin does not store conversation content anywhere, and the developer (neccos) never receives this data<\/strong> (no developer-operated server exists). The only thing the plugin stores within WordPress is the settings entered by the administrator (the API key is encrypted), plus short-lived technical data: rate-limit counters and a cached model list, all removed on uninstall. See \"External Services\" for details.<\/li>\n<li>Your responsibilities: as the site owner, you are responsible for (1) complying with OpenAI's terms, (2) disclosing to your site visitors (end users) that their input is sent to OpenAI and obtaining any consent required by applicable law (e.g., data protection \/ privacy laws such as GDPR), and (3) maintaining your own privacy policy and related documents. Please advise users not to enter sensitive information in chat or voice.<\/li>\n<li>The accuracy, legality, and usefulness of AI-generated responses are not guaranteed. Use of this plugin and of AI responses is at the sole risk of the site owner and end users.<\/li>\n<\/ul>\n\n<h3>External Services<\/h3>\n\n<p>This plugin communicates with the external service <strong>OpenAI API<\/strong> (api.openai.com) to generate AI responses. This is a core feature of the plugin, and communication occurs when the AI chat \/ voice features are used. Voice conversation is a direct connection (WebRTC) to the OpenAI Realtime API, and this plugin does not use a STUN\/TURN server by default (no additional communication to third-party servers occurs).<\/p>\n\n<h4>OpenAI API<\/h4>\n\n<ul>\n<li>Destination endpoints:\n\n<ul>\n<li>https:\/\/api.openai.com\/v1\/chat\/completions (generating text chat responses; via the PHP proxy)<\/li>\n<li>https:\/\/api.openai.com\/v1\/realtime\/client_secrets (issuing a short-lived token for voice conversation; PHP \u2192 OpenAI)<\/li>\n<li>https:\/\/api.openai.com\/v1\/realtime\/calls (establishing the WebRTC session for voice conversation; sent directly from the browser to OpenAI)<\/li>\n<li>https:\/\/api.openai.com\/v1\/models (retrieving the list of available models; only when an administrator uses \"Fetch available models\" on the settings screen; PHP \u2192 OpenAI)<\/li>\n<\/ul><\/li>\n<li>Data sent (text chat): the message text entered by the visitor in the chat box, the conversation history, the configured system prompt, and the model name in use. These are sent to OpenAI via the PHP proxy at the moment the visitor sends a message.<\/li>\n<li>Data sent (model list retrieval): only when an administrator (manage_options capability) uses model list retrieval on the settings screen, a request is made from the server side (PHP) to OpenAI using the API key for authentication. Only the authentication credential is sent; no chat text or visitor data is sent. The response (a list of model IDs) is cached temporarily on the server side. This retrieves model metadata and incurs no OpenAI token billing. The API key is never handed to the browser.<\/li>\n<li>Data sent (when voice conversation is enabled): in addition to the short-lived token issuance request (PHP \u2192 OpenAI), the visitor's microphone audio is sent directly from the browser to OpenAI over WebRTC. Sending occurs at the moment the visitor starts a voice conversation.<\/li>\n<li>Timing of sending: communication only occurs when a visitor sends a message or starts a voice conversation. When the plugin is not configured (disabled or no key set), no communication occurs at all.<\/li>\n<li>Purpose: to generate and return an AI response (text or voice) to the input.<\/li>\n<\/ul>\n\n<p>Data sent to OpenAI is subject to OpenAI's terms and policies. Please be sure to review them before use.<\/p>\n\n<ul>\n<li>Terms of use: https:\/\/openai.com\/policies\/terms-of-use\/<\/li>\n<li>Privacy policy: https:\/\/openai.com\/policies\/privacy-policy\/<\/li>\n<li>API data usage policies: https:\/\/openai.com\/policies\/api-data-usage-policies\/<\/li>\n<\/ul>\n\n<h3>\u65e5\u672c\u8a9e (Japanese)<\/h3>\n\n<p>NeccoSpeak \u306f\u3001\u3054\u81ea\u8eab\u306e OpenAI API \u30ad\u30fc\u3060\u3051\u3067\u52d5\u304f AI \u30c1\u30e3\u30c3\u30c8\u30dc\u30c3\u30c8\uff08\u97f3\u58f0\u4f1a\u8a71\u5bfe\u5fdc\uff09\u3092 WordPress \u30b5\u30a4\u30c8\u306b\u8ffd\u52a0\u3057\u307e\u3059\u3002\u30c6\u30ad\u30b9\u30c8\u30c1\u30e3\u30c3\u30c8\u3067\u8a2a\u554f\u8005\u306e\u8cea\u554f\u306b24\u6642\u9593365\u65e5\u81ea\u52d5\u5fdc\u7b54\u3057\u307e\u3059\u3002\u30aa\u30d7\u30b7\u30e7\u30f3\u306e\u97f3\u58f0\u4f1a\u8a71\uff08\u65e2\u5b9a\u3067\u306f\u7121\u52b9\uff09\u3092\u6709\u52b9\u306b\u3059\u308b\u3068\u3001\u8a2a\u554f\u8005\u306f\u30b5\u30a4\u30c8\u3068\u76f4\u63a5\u300c\u8a71\u3059\u300d\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n<ul>\n<li>SaaS \u3084\u8ffd\u52a0\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u767b\u9332\u3001\u6708\u984d\u8cbb\u7528\u306f\u4e0d\u8981\u3067\u3001\u958b\u767a\u8005\u304c\u904b\u55b6\u3059\u308b\u30b5\u30fc\u30d0\u30fc\u3082\u4e00\u5207\u4ecb\u3057\u307e\u305b\u3093\u3002WordPress \u3068\u3054\u81ea\u8eab\u306e OpenAI API \u30ad\u30fc\u3060\u3051\u3067\u5b8c\u7d50\u3057\u3001\u5229\u7528\u6599\u91d1\u306f OpenAI \u304b\u3089\u3054\u81ea\u8eab\u306b\u76f4\u63a5\u8acb\u6c42\u3055\u308c\u307e\u3059\u3002<\/li>\n<li>API \u30ad\u30fc\u306f AES-256-CBC \u3067\u6697\u53f7\u5316\u4fdd\u5b58\u3055\u308c\u3001\u30d6\u30e9\u30a6\u30b6\u306b\u306f\u4e00\u5207\u9001\u4fe1\u3055\u308c\u307e\u305b\u3093\uff08\u7ba1\u7406\u753b\u9762\u3067\u3082\u30de\u30b9\u30af\u8868\u793a\uff09\u3002<\/li>\n<li>\u30d7\u30e9\u30b0\u30a4\u30f3\u304c\u7121\u52b9\u3001\u307e\u305f\u306f API \u30ad\u30fc\u304c\u672a\u8a2d\u5b9a\u306e\u9593\u306f\u3001\u30a6\u30a3\u30b8\u30a7\u30c3\u30c8\u3092\u4e00\u5207\u8aad\u307f\u8fbc\u307e\u305a\u3001\u8a2a\u554f\u8005\u306b\u3088\u308b\u5916\u90e8\u901a\u4fe1\u3082\u4e00\u5207\u767a\u751f\u3057\u307e\u305b\u3093\u3002<\/li>\n<li>IP \u5358\u4f4d\u306e\u30ec\u30fc\u30c8\u5236\u9650\u306b\u52a0\u3048\u3001\u30b5\u30a4\u30c8\u5168\u4f53\u306e\u4e0a\u9650\uff08\u30c6\u30ad\u30b9\u30c8\u30c1\u30e3\u30c3\u30c8\u306f\u6bce\u6642\u30fb\u6bce\u65e5\u3001\u97f3\u58f0\u306f\u6bce\u65e5\uff09\u3067\u3001OpenAI \u5229\u7528\u6599\u91d1\u306e\u60f3\u5b9a\u5916\u306e\u5897\u52a0\u3092\u6291\u3048\u307e\u3059\u3002<\/li>\n<li>\u8868\u793a\u30eb\u30fc\u30eb\uff08\u5168\u30da\u30fc\u30b8\uff0f\u6307\u5b9a URL \u306e\u307f\uff0f\u6307\u5b9a URL \u9664\u5916\uff09\u3001\u30bf\u30a4\u30c8\u30eb\u30fb\u30a6\u30a7\u30eb\u30ab\u30e0\u30e1\u30c3\u30bb\u30fc\u30b8\u30fb\u30d6\u30e9\u30f3\u30c9\u30ab\u30e9\u30fc\u3092\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3067\u304d\u307e\u3059\u3002<\/li>\n<li>\u30e2\u30c7\u30eb\u540d\u306f\u81ea\u7531\u5165\u529b\u3002\u30ef\u30f3\u30af\u30ea\u30c3\u30af\u3067\u5229\u7528\u53ef\u80fd\u306a\u30e2\u30c7\u30eb\u4e00\u89a7\u3092\u53d6\u5f97\u3067\u304d\u3001\u65b0\u3057\u3044\u30e2\u30c7\u30eb\uff08Chat Completions API \u5bfe\u5fdc\u306e\u3082\u306e\uff09\u306b\u3082\u30d7\u30e9\u30b0\u30a4\u30f3\u66f4\u65b0\u306a\u3057\u3067\u5bfe\u5fdc\u3067\u304d\u307e\u3059\u3002\u30b7\u30b9\u30c6\u30e0\u30d7\u30ed\u30f3\u30d7\u30c8\u3067\u30c1\u30e3\u30c3\u30c8\u30dc\u30c3\u30c8\u306e\u5f79\u5272\u3084\u7b54\u3048\u65b9\u3092\u81ea\u7531\u306b\u8a2d\u5b9a\u3067\u304d\u307e\u3059\u3002<\/li>\n<li>\u97f3\u58f0\u4f1a\u8a71\u306e\u5229\u7528\u306b\u306f HTTPS\uff08SSL\uff09\u3068\u30d6\u30e9\u30a6\u30b6\u306e\u30de\u30a4\u30af\u6a29\u9650\u304c\u5fc5\u8981\u3067\u3059\u3002<\/li>\n<\/ul>\n\n<p><strong>\u3054\u5229\u7528\u306b\u3042\u305f\u3063\u3066\uff1a<\/strong> \u672c\u30d7\u30e9\u30b0\u30a4\u30f3\u306f\u3001\u73fe\u72b6\u306e\u307e\u307e\uff08as-is\uff09\u30fb\u7121\u4fdd\u8a3c\u3067\u63d0\u4f9b\u3055\u308c\u308b\u3001\u7121\u6599\u306e\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\uff08GPLv2 or later\uff09\u3067\u3059\u3002\u30c1\u30e3\u30c3\u30c8\u672c\u6587\u304a\u3088\u3073\u97f3\u58f0\u306f\u3054\u81ea\u8eab\u306e API \u30ad\u30fc\u3067 OpenAI \u3078\u9001\u4fe1\u3055\u308c\u3066 OpenAI \u306e\u898f\u7d04\u30fb\u30dd\u30ea\u30b7\u30fc\u306e\u9069\u7528\u3092\u53d7\u3051\u3001\u5229\u7528\u6599\u91d1\u306f OpenAI \u304b\u3089\u3054\u81ea\u8eab\u306b\u76f4\u63a5\u8acb\u6c42\u3055\u308c\u307e\u3059\u3002\u672c\u30d7\u30e9\u30b0\u30a4\u30f3\u306f\u4f1a\u8a71\u5185\u5bb9\u3092\u3069\u3053\u306b\u3082\u4fdd\u5b58\u305b\u305a\u3001\u958b\u767a\u8005\uff08neccos\uff09\u304c\u3053\u308c\u3089\u306e\u30c7\u30fc\u30bf\u3092\u53d7\u3051\u53d6\u308b\u3053\u3068\u306f\u3042\u308a\u307e\u305b\u3093\u3002AI \u5fdc\u7b54\u306e\u6b63\u78ba\u6027\u306f\u4fdd\u8a3c\u3055\u308c\u306a\u3044\u305f\u3081\u3001\u6a5f\u5fae\u306a\u60c5\u5831\u3092\u5165\u529b\u3057\u306a\u3044\u3088\u3046\u8a2a\u554f\u8005\u306b\u3054\u6848\u5185\u304f\u3060\u3055\u3044\u3002\u8a2a\u554f\u8005\u3078\u306e\u958b\u793a\u30fb\u540c\u610f\u53d6\u5f97\u3084\u30d7\u30e9\u30a4\u30d0\u30b7\u30fc\u30dd\u30ea\u30b7\u30fc\u306e\u6574\u5099\u306f\u3001\u30b5\u30a4\u30c8\u904b\u55b6\u8005\u306e\u8cac\u4efb\u3067\u884c\u3063\u3066\u304f\u3060\u3055\u3044\u3002\u6b63\u5f0f\u306a\u8a18\u8f09\u306f\u82f1\u8a9e\u7248\u306e\u300cTerms and disclaimer\u300d\u304a\u3088\u3073\u300cExternal Services\u300d\u3067\u3042\u308a\u3001\u8a73\u7d30\u306f\u305d\u3061\u3089\u3092\u3054\u53c2\u7167\u304f\u3060\u3055\u3044\u3002<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install the plugin from \"Add New\" in the admin Plugins screen (or upload it), then activate it.<\/li>\n<li>Open \"Settings\" \u2192 \"NeccoSpeak\" and paste your own <strong>OpenAI API key<\/strong>. It is stored encrypted and masked thereafter.<\/li>\n<li>Optionally set the model, system prompt, welcome message, brand color, display rules, and rate limits.<\/li>\n<li>That's it \u2014 once enabled with a key set, the chat widget is live on the pages your display rules match. Voice conversation is an optional toggle (requires HTTPS; HTTPS is strongly recommended for text chat as well).<\/li>\n<\/ol>\n\n<p>While the configuration is incomplete, neither the widget nor any external communication is loaded or triggered.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20an%20account%20with%20you%2C%20or%20your%20server%3F\"><h3>Do I need an account with you, or your server?<\/h3><\/dt>\n<dd><p>No. NeccoSpeak is self-contained: it needs only WordPress and your own OpenAI API key.<\/p><\/dd>\n<dt id=\"is%20it%20really%20free%3F\"><h3>Is it really free?<\/h3><\/dt>\n<dd><p>The plugin: yes \u2014 free and open source (GPL). The AI usage: billed by OpenAI to your own account (your own key), at OpenAI's rates. Check OpenAI's official pricing for details.<\/p><\/dd>\n<dt id=\"does%20the%20chatbot%20know%20my%20site%20content%3F\"><h3>Does the chatbot know my site content?<\/h3><\/dt>\n<dd><p>It does not crawl or index your site. It answers from the AI model plus the system prompt you write \u2014 put your key business facts (hours, prices, policies) in the system prompt and it will use them.<\/p><\/dd>\n<dt id=\"is%20the%20api%20key%20handled%20securely%3F\"><h3>Is the API key handled securely?<\/h3><\/dt>\n<dd><p>The key is stored encrypted in the database with AES-256-CBC. It is never output to the front end (browser) and is masked in the admin screen.<\/p><\/dd>\n<dt id=\"can%20visitors%20run%20up%20my%20openai%20bill%3F\"><h3>Can visitors run up my OpenAI bill?<\/h3><\/dt>\n<dd><p>The chat endpoint has per-IP, per-minute rate limiting plus site-wide hourly and daily caps; voice token issuance has per-IP and site-wide daily caps. When a cap is exceeded, responses are temporarily limited (503). Cap values are adjustable on the settings screen, and display rules can narrow where the widget appears. A same-origin check adds defense in depth, but is not authentication.<\/p><\/dd>\n<dt id=\"what%20do%20i%20need%20for%20voice%20conversation%3F\"><h3>What do I need for voice conversation?<\/h3><\/dt>\n<dd><p>Turn on voice conversation in the settings and serve your site over <strong>HTTPS (SSL)<\/strong>. Browser microphone permission is requested when it is used. Audio goes from the browser directly to OpenAI over WebRTC using a short-lived token \u2014 your API key is never handed to the browser.<\/p><\/dd>\n<dt id=\"will%20it%20slow%20down%20my%20site%3F\"><h3>Will it slow down my site?<\/h3><\/dt>\n<dd><p>While the plugin is unconfigured (disabled or no key), nothing is loaded on the front end at all. Once active, it loads a small widget only on the pages your display rules match.<\/p><\/dd>\n<dt id=\"do%20i%20need%20to%20update%20the%20plugin%20when%20a%20new%20model%20is%20released%3F\"><h3>Do I need to update the plugin when a new model is released?<\/h3><\/dt>\n<dd><p>No. The model name is free-form, and \"Fetch available models\" retrieves the list of models currently available to your API key so you can pick one (metadata only \u2014 no token billing).<\/p><\/dd>\n<dt id=\"are%20responses%20displayed%20as%20a%20stream%3F\"><h3>Are responses displayed as a stream?<\/h3><\/dt>\n<dd><p>v1 (0.1.0) does not support streaming; responses are returned in full at once.<\/p><\/dd>\n<dt id=\"why%20does%20voice%20not%20connect%20on%20my%20network%3F\"><h3>Why does voice not connect on my network?<\/h3><\/dt>\n<dd><p>Voice connects the browser directly to OpenAI (WebRTC). Because OpenAI's Realtime API does not require STUN\/TURN, this plugin does not use a STUN\/TURN server by default. On a few highly restrictive networks (UDP blocked, symmetric NAT, etc.), voice may fail to connect; please use text chat there. Advanced users can set their own STUN\/TURN servers via window.NECCOSPEAK_RTC_ICE_SERVERS (in that case, that destination becomes something you must disclose).<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Self-contained, BYO-key lightweight AI chat widget.<\/li>\n<li>Text chat (relayed to OpenAI via a thin PHP proxy, full response returned).<\/li>\n<li>Optional voice conversation (off by default; short-lived token + WebRTC connecting the browser directly to OpenAI; HTTPS required).<\/li>\n<li>API key stored encrypted with AES-256-CBC, never sent to the front end, masked in the admin screen.<\/li>\n<li>Per-IP rate limiting, display rules (all pages \/ specific URLs only \/ exclude), appearance customization.<\/li>\n<li>Zero loading and zero external communication when not configured.<\/li>\n<\/ul>","raw_excerpt":"AI chatbot with voice chat for WordPress, powered by your own OpenAI key. Visitors can talk to your site \u2014 no SaaS, no extra account, no monthly fee.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/332521","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=332521"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/neccos"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=332521"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=332521"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=332521"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=332521"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=332521"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=332521"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}