PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 16.3-a.1
Jetpack – WP Security, Backup, Speed, & Growth v16.3-a.1
16.3 16.3-beta 16.3-a.5 16.3-a.7 16.3-a.3 16.3-a.1 16.2 16.2-beta 12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 All 508 releases
← All changes | _inc/lib/class-jetpack-ai-helper.php +87 -14 13.9.2 → 16.3-a.1 View file →
@@ -11,8 +11,13 @@
11 11 use Automattic\Jetpack\Search\Plan as Search_Plan;
12 12 use Automattic\Jetpack\Status;
13 13 use Automattic\Jetpack\Status\Visitor;
14 14
15 +// Required directly rather than relying on the plugin bootstrap: on
16 +// WordPress.com Simple this helper is loaded outside load-jetpack.php
17 +// (see the GUIDELINES_BANNER_DISMISSED_META_KEY note below).
18 +require_once __DIR__ . '/class-jetpack-ai-settings.php';
19 +
15 20 /**
16 21 * Class Jetpack_AI_Helper
17 22 *
18 23 * @since 11.8
@@ -18,8 +23,23 @@
18 23 * @since 11.8
19 24 */
20 25 class Jetpack_AI_Helper {
21 26 /**
27 + * User meta key storing whether the user dismissed the Content Guidelines
28 + * AI empty-state banner. Written by the guidelines-banner-dismissed REST
29 + * endpoint and read by the Content Guidelines admin-page preload.
30 + *
31 + * Lives here rather than on the endpoint class because on WordPress.com
32 + * Simple the wpcom-endpoints classes are only loaded in REST requests,
33 + * while the preload needs the key during admin page loads.
34 + *
35 + * @since 16.1
36 + *
37 + * @var string
38 + */
39 + const GUIDELINES_BANNER_DISMISSED_META_KEY = 'jetpack_content_guidelines_ai_banner_dismissed';
40 +
41 + /**
22 42 * Allow new completion every X seconds. Will return cached result otherwise.
23 43 *
24 44 * @var int
25 45 */
@@ -32,15 +52,22 @@
32 52 */
33 53 public static $image_generation_cache_timeout = MONTH_IN_SECONDS;
34 54
35 55 /**
36 - * Cache AI-assistant feature for ten seconds.
56 + * Cache AI-assistant feature for 60 seconds.
37 57 *
38 58 * @var int
39 59 */
40 - public static $ai_assistant_feature_cache_timeout = 10;
60 + public static $ai_assistant_feature_cache_timeout = 60;
41 61
42 62 /**
63 + * Cache AI-assistant errors for ten seconds.
64 + *
65 + * @var int
66 + */
67 + public static $ai_assistant_feature_error_cache_timeout = 10;
68 +
69 + /**
43 70 * Stores the number of JetpackAI calls in case we want to mark AI-assisted posts some way.
44 71 *
45 72 * @var int
46 73 */
@@ -90,19 +117,55 @@
90 117 } elseif ( ( new Automattic\Jetpack\Status\Host() )->is_woa_site() ) {
91 118 $default = true;
92 119 }
93 120
94 - /**
95 - * Filter whether the AI features are enabled in the Jetpack plugin.
96 - *
97 - * @since 11.8
98 - *
99 - * @param bool $default Are AI features enabled? Defaults to false.
100 - */
101 - return apply_filters( 'jetpack_ai_enabled', $default );
121 + // The jetpack_ai_enabled filter runs inside the helper; the host and
122 + // master gates apply after the chain and cannot be filtered back on.
123 + return Jetpack_AI_Settings::is_ai_enabled( $default );
102 124 }
103 125
104 126 /**
127 + * Return true if the Content Guidelines AI surfaces should be active on the
128 + * current site.
129 + *
130 + * Same platforms as is_enabled() (WPCOM Simple and Atomic), plus WordPress
131 + * VIP sites. Kept separate from is_enabled() so widening Content Guidelines
132 + * to VIP does not also open the general AI proxy endpoint there.
133 + *
134 + * @since 16.2
135 + *
136 + * @return bool
137 + */
138 + public static function is_enabled_for_content_guidelines() {
139 + $default = false;
140 +
141 + if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
142 + $default = true;
143 + } else {
144 + $host = new Automattic\Jetpack\Status\Host();
145 + if ( $host->is_woa_site() || $host->is_vip_site() ) {
146 + $default = true;
147 + }
148 + }
149 +
150 + // The jetpack_ai_enabled filter runs inside the helper; the host and
151 + // master gates apply after the chain and cannot be filtered back on.
152 + return Jetpack_AI_Settings::is_ai_enabled( $default );
153 + }
154 +
155 + /**
156 + * Whether the current user has dismissed the Content Guidelines AI
157 + * empty-state banner.
158 + *
159 + * @since 16.1
160 + *
161 + * @return bool
162 + */
163 + public static function is_guidelines_banner_dismissed() {
164 + return (bool) get_user_meta( get_current_user_id(), self::GUIDELINES_BANNER_DISMISSED_META_KEY, true );
165 + }
166 +
167 + /**
105 168 * Return true if the AI chat feature should be active on the current site.
106 169 *
107 170 * @todo IS_WPCOM (the endpoints need to be updated too).
108 171 *
@@ -256,9 +319,10 @@
256 319 ),
257 320 wp_json_encode(
258 321 array(
259 322 'content' => $content,
260 - )
323 + ),
324 + JSON_UNESCAPED_SLASHES
261 325 ),
262 326 'wpcom'
263 327 );
264 328
@@ -330,9 +394,10 @@
330 394 ),
331 395 wp_json_encode(
332 396 array(
333 397 'prompt' => $prompt,
334 - )
398 + ),
399 + JSON_UNESCAPED_SLASHES
335 400 ),
336 401 'wpcom'
337 402 );
338 403
@@ -428,8 +493,9 @@
428 493 'method' => 'GET',
429 494 'headers' => array(
430 495 'X-Forwarded-For' => ( new Visitor() )->get_ip( true ),
431 496 ),
497 + 'timeout' => 30,
432 498 ),
433 499 null,
434 500 'wpcom'
435 501 );
@@ -442,13 +508,20 @@
442 508 set_transient( $transient_name, $ai_assistant_feature_data, self::$ai_assistant_feature_cache_timeout );
443 509
444 510 return $ai_assistant_feature_data;
445 511 } else {
446 - $error = new WP_Error(
512 + $error = new WP_Error(
447 513 'failed_to_fetch_data',
448 514 esc_html__( 'Unable to fetch the requested data.', 'jetpack' ),
449 - array( 'status' => $response_code )
515 + array(
516 + 'status' => $response_code,
517 + 'ts' => time(),
518 + )
450 519 );
520 +
521 + // Cache the AI Assistant feature error, for Jetpack sites, avoid API hammering.
522 + set_transient( $transient_name, $error, self::$ai_assistant_feature_error_cache_timeout );
523 +
451 524 static::$ai_assistant_failed_request = $error;
452 525
453 526 return $error;
454 527 }