{"id":293943,"date":"2026-04-08T00:44:00","date_gmt":"2026-04-08T00:44:00","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/ai-usage-monitor\/"},"modified":"2026-04-08T00:43:28","modified_gmt":"2026-04-08T00:43:28","slug":"grumpy-ai-gate","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/grumpy-ai-gate\/","author":29684,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.1","stable_tag":"1.0.1","tested":"7.0","requires":"7.0","requires_php":"7.4","requires_plugins":null,"header_name":"Grumpy AI Gate","header_author":"Grumpy AI Gate Contributors","header_description":"Intercept and log AI-related outbound HTTP from other plugins and themes; optional WordPress AI Client blocking. All data stays on your server.","assets_banners_color":"e8c8c0","last_updated":"2026-04-08 00:43:28","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/grumpy-ai-gate\/","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":53,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.1":{"tag":"1.0.1","author":"lkoudal","date":"2026-04-08 00:43:28"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3501217,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3501217,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3501217,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.1"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Dashboard with summary cards, top plugins, usage-by-plugin table, providers, and recent activity.","2":"Request log for browsing individual AI-related requests.","3":"Settings: enable AI Client and HTTP monitoring, retention, provider list, and per-plugin blocking."},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[83,2353,5603,396,600],"plugin_category":[54],"plugin_contributors":[154775,79429],"plugin_business_model":[],"class_list":["post-293943","plugin","type-plugin","status-publish","hentry","plugin_tags-admin","plugin_tags-ai","plugin_tags-monitoring","plugin_tags-privacy","plugin_tags-security","plugin_category-security-and-spam-protection","plugin_contributors-cleverplugins","plugin_contributors-lkoudal","plugin_committers-lkoudal"],"banners":{"banner":"https:\/\/ps.w.org\/grumpy-ai-gate\/assets\/banner-772x250.jpg?rev=3501217","banner_2x":"https:\/\/ps.w.org\/grumpy-ai-gate\/assets\/banner-1544x500.png?rev=3501217","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/grumpy-ai-gate\/assets\/icon-256x256.png?rev=3501217","icon_2x":"https:\/\/ps.w.org\/grumpy-ai-gate\/assets\/icon-256x256.png?rev=3501217","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>Grumpy AI Gate<\/strong> helps you stay in control as AI features spread across WordPress. It <strong>observes and intercepts<\/strong> outbound HTTP <strong>that other code on your site already initiates<\/strong> (plugins, themes, or core)\u2014so you can see <strong>which plugin<\/strong> was involved, <strong>how much<\/strong> activity you are seeing (including helpful estimates), and <strong>optionally stop<\/strong> unwanted <strong>WordPress AI Client<\/strong> traffic for specific plugins. <strong>This plugin does not<\/strong> call external AI APIs for its own dashboard, analytics, or licensing. Nothing is sent to us or to a third-party analytics service.<\/p>\n\n<p><strong>Why use it<\/strong><\/p>\n\n<ul>\n<li><strong>Visibility<\/strong> \u2014 Dashboard summaries, a per-plugin usage table, and a request log so surprises become visible early.<\/li>\n<li><strong>Spend awareness<\/strong> \u2014 When other software calls paid APIs, usage adds up. Logging helps you notice patterns before invoices or quotas become a problem.<\/li>\n<li><strong>Safer sharing<\/strong> \u2014 Knowing what leaves your server makes it easier to decide what belongs in prompts and what does not.<\/li>\n<li><strong>Optional blocking<\/strong> \u2014 For paths that use WordPress\u2019s AI Client, you can block generations from selected plugins under <strong>Grumpy AI Gate \u2192 Settings<\/strong> (save to apply).<\/li>\n<\/ul>\n\n<p><strong>How it works<\/strong><\/p>\n\n<ul>\n<li>When the <strong>WordPress AI Client<\/strong> is available, the plugin records those requests from core lifecycle hooks (other code still drives the actual generation).<\/li>\n<li>For <strong>HTTP fallback<\/strong>, Grumpy AI Gate <strong>hooks WordPress\u2019s HTTP API<\/strong> (for example <code>pre_http_request<\/code>) to <strong>inspect requests that are already in flight<\/strong>. If a URL matches <strong>built-in recognition rules<\/strong> for major AI providers, a log row can be stored. <strong>Grumpy AI Gate does not open those connections for its own purposes<\/strong>\u2014it only filters and classifies traffic <strong>initiated elsewhere<\/strong> on the site.<\/li>\n<li><strong>HTTP fallback does not block<\/strong> outbound API calls in the current release\u2014it is there so you still get visibility when plugins talk to providers <strong>directly over HTTP<\/strong> instead of (or in addition to) AI Client flows.<\/li>\n<\/ul>\n\n<p><strong>Compatibility<\/strong><\/p>\n\n<p>The plugin requires <strong>WordPress 7.0+<\/strong> (matches <strong>Requires at least<\/strong> in the plugin header). On WordPress <strong>7.x<\/strong>, it works with <strong>core AI Client<\/strong> functionality where available. Release testing included <strong>WordPress 7.0 Beta 5<\/strong>. <strong>HTTP fallback<\/strong> remains important on every supported version\u2014it records calls to <strong>recognized provider endpoints<\/strong> that <strong>other plugins<\/strong> make <strong>directly over HTTP<\/strong>, which is still common alongside (or instead of) AI Client\u2013based flows.<\/p>\n\n<p><strong>Privacy<\/strong><\/p>\n\n<p>Everything is stored <strong>locally in your WordPress database<\/strong>. There is no cloud account, no telemetry, and no third-party analytics from this plugin.<\/p>\n\n<p>For technical details on logging, double-counting avoidance, and blocking limits, see the <strong>FAQ<\/strong> below.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin <strong>does not<\/strong> rely on third-party AI APIs, remote analytics, or any external service <strong>for its own features<\/strong>. All logging and settings stay on your site.<\/p>\n\n<p><strong>Provider names and URL patterns<\/strong> included with the plugin are <strong>local matching rules<\/strong> only. They let Grumpy AI Gate <strong>filter and classify<\/strong> outbound HTTP requests that <strong>plugins, themes, or WordPress core<\/strong> may already be sending. They are <strong>not<\/strong> a list of servers this plugin calls to power the admin UI or to \u201cphone home.\u201d<\/p>\n\n<p>Your site may still contact third-party AI providers when <strong>you or other software<\/strong> use AI features\u2014that traffic is separate from this plugin\u2019s own network use (which does not include calling those providers for monitoring).<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code> or install it from the <strong>Plugins \u2192 Add New<\/strong> screen in your admin.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> menu.<\/li>\n<li>Open <strong>Grumpy AI Gate<\/strong> in the admin menu. Review the <strong>Dashboard<\/strong> and <strong>Request log<\/strong>, then visit <strong>Settings<\/strong> to turn monitoring options on or off and configure optional per-plugin blocking.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"why%20monitor%20ai%20usage%20on%20my%20site%3F\"><h3>Why monitor AI usage on my site?<\/h3><\/dt>\n<dd><p>Plugins can trigger AI calls in the background\u2014for content, assistants, SEO tools, and more. Logging gives you a clear picture of <strong>which plugin<\/strong> is active, <strong>how often<\/strong> requests run, and <strong>where<\/strong> traffic is going, so you can manage budgets and content thoughtfully.<\/p><\/dd>\n<dt id=\"will%20this%20help%20me%20control%20api%20costs%3F\"><h3>Will this help me control API costs?<\/h3><\/dt>\n<dd><p>It helps you <strong>see<\/strong> usage and trends. <strong>Optional blocking<\/strong> reduces some <strong>WordPress AI Client<\/strong> traffic for plugins you choose. Outbound <strong>HTTP<\/strong> calls to provider APIs that <strong>other code<\/strong> makes are <strong>logged for visibility<\/strong> in the current release but are <strong>not blocked<\/strong> here\u2014use provider dashboards, API keys, and quotas for hard spend limits.<\/p><\/dd>\n<dt id=\"is%20my%20data%20sent%20to%20you%20or%20a%20third-party%20analytics%20service%3F\"><h3>Is my data sent to you or a third-party analytics service?<\/h3><\/dt>\n<dd><p>No. Logs and settings stay <strong>on your server<\/strong> in the WordPress database. This plugin does not add off-site tracking or analytics.<\/p><\/dd>\n<dt id=\"what%20does%20blocking%20actually%20stop%3F\"><h3>What does blocking actually stop?<\/h3><\/dt>\n<dd><p>Blocking applies to <strong>WordPress AI Client<\/strong> flows that respect the <strong><code>wp_ai_client_prevent_prompt<\/code><\/strong> filter. You choose plugins under <strong>Grumpy AI Gate \u2192 Settings<\/strong> and save. It is <strong>not<\/strong> a full firewall for every outbound request.<\/p><\/dd>\n<dt id=\"does%20this%20block%20all%20ai%20traffic%3F\"><h3>Does this block all AI traffic?<\/h3><\/dt>\n<dd><p>No. Only <strong>AI Client<\/strong> traffic for plugins you select under <strong>Grumpy AI Gate \u2192 Settings<\/strong> is blocked (after you save). <strong>HTTP<\/strong> calls to provider APIs that <strong>other plugins or themes<\/strong> initiate are <strong>observed and logged<\/strong> in the current release but <strong>not blocked<\/strong>.<\/p><\/dd>\n<dt id=\"will%20it%20work%20if%20the%20wordpress%20ai%20client%20is%20not%20available%3F\"><h3>Will it work if the WordPress AI Client is not available?<\/h3><\/dt>\n<dd><p>Yes. The plugin loads safely. Without the AI Client stack, <strong>HTTP fallback<\/strong> can still record calls to <strong>recognized provider<\/strong> endpoints when that option is enabled in <strong>Settings<\/strong>, as long as <strong>other code<\/strong> on the site is making those outbound requests.<\/p><\/dd>\n<dt id=\"how%20are%20ai%20client%20requests%20and%20outbound%20http%20logged%3F\"><h3>How are AI Client requests and outbound HTTP logged?<\/h3><\/dt>\n<dd><p>When the WordPress AI Client stack is available, a full generation is one log row from its lifecycle hooks; the matching raw provider HTTP for that same call is skipped so usage is not double-counted. Calls that do not fire those hooks (for example listing models) are still logged and may appear with capability <code>provider_http<\/code>. When <strong>another plugin<\/strong> talks to a known AI API without going through core AiClient, or when AI Client monitoring is off in settings, those requests are recorded via HTTP fallback instead.<\/p><\/dd>\n<dt id=\"which%20urls%20does%20http%20fallback%20recognize%3F\"><h3>Which URLs does HTTP fallback recognize?<\/h3><\/dt>\n<dd><p>Only built-in provider host\/path rules (OpenAI, Anthropic, Google AI \/ Gemini, xAI, DeepSeek, Mistral, OpenRouter, and local Ollama). See <strong>Grumpy AI Gate \u2192 Settings<\/strong> for the current hostname list. Those patterns exist <strong>only to filter and classify<\/strong> outbound traffic <strong>initiated by other code<\/strong>\u2014they are <strong>not<\/strong> endpoints this plugin contacts for its own operation.<\/p><\/dd>\n<dt id=\"does%20blocking%20stop%20all%20ai%20traffic%20from%20a%20plugin%3F\"><h3>Does blocking stop all AI traffic from a plugin?<\/h3><\/dt>\n<dd><p>Blocking uses WordPress\u2019s <strong><code>wp_ai_client_prevent_prompt<\/code><\/strong> filter: it stops prompt builder flows (support checks and generations) that go through that path. Separate calls such as <strong>listing models<\/strong> (<code>\/v1\/models<\/code>) may still run as <strong>provider HTTP<\/strong> on the AI Client channel and appear as a successful row\u2014that traffic does not go through the same prevent hook.<\/p><\/dd>\n<dt id=\"can%20i%20clear%20old%20log%20data%3F\"><h3>Can I clear old log data?<\/h3><\/dt>\n<dd><p>Yes. Under <strong>Grumpy AI Gate \u2192 Settings<\/strong>, use the options to clear the request log only, or clear the log and aggregated statistics, as needed.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Bumped <strong>Stable tag<\/strong> and internal version to <strong>1.0.1<\/strong>. Aligned <strong>Requires at least<\/strong> with the plugin header (<strong>WordPress 7.0<\/strong>). No functional changes from 1.0.0.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Renamed to <strong>Grumpy AI Gate<\/strong> (slug <strong>grumpy-ai-gate<\/strong>); internal prefix <strong>gaig<\/strong> \/ <strong>GAIG<\/strong>. Readme and admin copy clarify interception of outbound HTTP <strong>initiated by other code<\/strong> (not the plugin acting as an AI client). Added <strong>External services<\/strong> section for WordPress.org reviewers. Local-only logging of AI Client and matching HTTP traffic, dashboard and request log, optional per-plugin blocking for WordPress AI Client flows, retention and clear-data tools. See the FAQ for privacy, blocking scope, and provider matching details.<\/li>\n<\/ul>","raw_excerpt":"Intercept and log AI-related HTTP from plugins\/themes; optional AI Client blocking. All data stays on your server.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/293943","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=293943"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/lkoudal"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=293943"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=293943"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=293943"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=293943"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=293943"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=293943"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}