PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 15.2.1
Jetpack – WP Security, Backup, Speed, & Growth v15.2.1
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 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 14.4.2 14.5.1 14.6.1 14.7.1 14.8.1 14.9.2 15.0.3 15.1.2 15.2.1 15.3.2 15.4.1 15.5.1 15.6.1 15.7.2 15.8.1 15.9.2 16.0.2 16.1.3 16.2-a.5 16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / _inc / lib / core-api / wpcom-endpoints / class-wpcom-rest-api-v2-endpoint-ai.php
jetpack / _inc / lib / core-api / wpcom-endpoints Last commit date
business-hours.php 1 year ago class-wpcom-rest-api-v2-endpoint-admin-color.php 1 year ago class-wpcom-rest-api-v2-endpoint-admin-menu.php 10 months ago class-wpcom-rest-api-v2-endpoint-ai.php 1 year ago class-wpcom-rest-api-v2-endpoint-app-media.php 1 year ago class-wpcom-rest-api-v2-endpoint-block-editor-assets.php 10 months ago class-wpcom-rest-api-v2-endpoint-blog-stats.php 1 year ago class-wpcom-rest-api-v2-endpoint-email-preview.php 1 year ago class-wpcom-rest-api-v2-endpoint-external-media.php 1 year ago class-wpcom-rest-api-v2-endpoint-following.php 1 year ago class-wpcom-rest-api-v2-endpoint-goodreads.php 1 year ago class-wpcom-rest-api-v2-endpoint-google-docs.php 1 year ago class-wpcom-rest-api-v2-endpoint-instagram-gallery.php 1 year ago class-wpcom-rest-api-v2-endpoint-mailchimp.php 11 months ago class-wpcom-rest-api-v2-endpoint-newsletter-categories-list.php 1 year ago class-wpcom-rest-api-v2-endpoint-newsletter-categories-subscriptions-count.php 1 year ago class-wpcom-rest-api-v2-endpoint-podcast-player.php 1 year ago class-wpcom-rest-api-v2-endpoint-profile.php 1 year ago class-wpcom-rest-api-v2-endpoint-related-posts.php 1 year ago class-wpcom-rest-api-v2-endpoint-resolve-redirect.php 1 year ago class-wpcom-rest-api-v2-endpoint-search.php 1 year ago class-wpcom-rest-api-v2-endpoint-send-email-preview.php 1 year ago class-wpcom-rest-api-v2-endpoint-template-loader.php 1 year ago class-wpcom-rest-api-v2-endpoint-top-posts.php 1 year ago class-wpcom-rest-api-v2-endpoint-transient.php 1 year ago class-wpcom-rest-api-v3-endpoint-blogging-prompts.php 11 months ago class-wpcom-rest-api-v3-endpoint-jitm.php 1 year ago gutenberg-available-extensions.php 1 year ago hello.php 1 year ago memberships.php 1 year ago publicize-connection-test-results.php 1 year ago service-api-keys.php 1 year ago sites-posts-featured-media-url.php 1 year ago subscribers.php 1 year ago
class-wpcom-rest-api-v2-endpoint-ai.php
310 lines
1 <?php
2 /**
3 * REST API endpoint for the Jetpack AI blocks.
4 *
5 * @package automattic/jetpack
6 * @since 11.8
7 */
8
9 use Automattic\Jetpack\Connection\Client;
10
11 if ( ! defined( 'ABSPATH' ) ) {
12 exit( 0 );
13 }
14
15 /**
16 * Class WPCOM_REST_API_V2_Endpoint_AI
17 */
18 class WPCOM_REST_API_V2_Endpoint_AI extends WP_REST_Controller {
19 /**
20 * Namespace prefix.
21 *
22 * @var string
23 */
24 public $namespace = 'wpcom/v2';
25
26 /**
27 * Endpoint base route.
28 *
29 * @var string
30 */
31 public $rest_base = 'jetpack-ai';
32
33 /**
34 * WPCOM_REST_API_V2_Endpoint_AI constructor.
35 */
36 public function __construct() {
37 $this->is_wpcom = true;
38 $this->wpcom_is_wpcom_only_endpoint = true;
39
40 if ( ! class_exists( 'Jetpack_AI_Helper' ) ) {
41 require_once JETPACK__PLUGIN_DIR . '_inc/lib/class-jetpack-ai-helper.php';
42 }
43
44 // Register routes that don't require Jetpack AI to be enabled.
45 add_action( 'rest_api_init', array( $this, 'register_basic_routes' ) );
46
47 if ( Jetpack_AI_Helper::is_ai_chat_enabled() ) {
48 add_action( 'rest_api_init', array( $this, 'register_ai_chat_routes' ) );
49 }
50
51 if ( ! \Jetpack_AI_Helper::is_enabled() ) {
52 return;
53 }
54
55 // Register routes that require Jetpack AI to be enabled.
56 add_action( 'rest_api_init', array( $this, 'register_routes' ) );
57 }
58
59 /**
60 * Register routes.
61 */
62 public function register_routes() {
63 register_rest_route(
64 $this->namespace,
65 $this->rest_base . '/completions',
66 array(
67 array(
68 'methods' => WP_REST_Server::CREATABLE,
69 'callback' => array( $this, 'request_gpt_completion' ),
70 'permission_callback' => array( 'Jetpack_AI_Helper', 'get_status_permission_check' ),
71 ),
72 'args' => array(
73 'content' => array(
74 'type' => 'string',
75 'required' => true,
76 'sanitize_callback' => 'sanitize_textarea_field',
77 ),
78 'post_id' => array(
79 'required' => false,
80 'type' => 'integer',
81 ),
82 'skip_cache' => array(
83 'required' => false,
84 'type' => 'boolean',
85 'description' => 'Whether to skip the cache and make a new request',
86 ),
87 ),
88 )
89 );
90
91 register_rest_route(
92 $this->namespace,
93 $this->rest_base . '/images/generations',
94 array(
95 array(
96 'methods' => WP_REST_Server::CREATABLE,
97 'callback' => array( $this, 'request_dalle_generation' ),
98 'permission_callback' => array( 'Jetpack_AI_Helper', 'get_status_permission_check' ),
99 ),
100 'args' => array(
101 'prompt' => array(
102 'type' => 'string',
103 'required' => true,
104 'sanitize_callback' => 'sanitize_textarea_field',
105 ),
106 'post_id' => array(
107 'required' => false,
108 'type' => 'integer',
109 ),
110 ),
111 )
112 );
113 }
114
115 /**
116 * Register routes for the AI Chat block.
117 * Relies on a site connection and Jetpack Search.
118 */
119 public function register_ai_chat_routes() {
120 register_rest_route(
121 $this->namespace,
122 '/jetpack-search/ai/search',
123 array(
124 array(
125 'methods' => WP_REST_Server::READABLE,
126 'callback' => array( $this, 'request_chat_with_site' ),
127 'permission_callback' => '__return_true',
128 ),
129 'args' => array(
130 'query' => array(
131 'description' => 'Your question to the site',
132 'required' => true,
133 'sanitize_callback' => 'sanitize_text_field',
134 ),
135 'answer_prompt' => array(
136 'description' => 'Answer prompt override',
137 'required' => false,
138 'sanitize_callback' => 'sanitize_text_field',
139 ),
140 ),
141 )
142 );
143
144 register_rest_route(
145 $this->namespace,
146 '/jetpack-search/ai/rank',
147 array(
148 array(
149 'methods' => WP_REST_Server::CREATABLE,
150 'callback' => array( $this, 'rank_response' ),
151 'permission_callback' => '__return_true',
152 ),
153 'args' => array(
154 'cache_key' => array(
155 'description' => 'Cache key of your response',
156 'required' => true,
157 'sanitize_callback' => 'sanitize_text_field',
158 ),
159 'comment' => array(
160 'description' => 'Optional feedback',
161 'required' => false,
162 'sanitize_callback' => 'sanitize_text_field',
163 ),
164 'rank' => array(
165 'description' => 'How do you rank this response',
166 'required' => false,
167 'sanitize_callback' => 'sanitize_text_field',
168 ),
169 ),
170 )
171 );
172 }
173
174 /**
175 * Register routes that don't require Jetpack AI to be enabled.
176 */
177 public function register_basic_routes() {
178 register_rest_route(
179 $this->namespace,
180 $this->rest_base . '/ai-assistant-feature',
181 array(
182 array(
183 'methods' => WP_REST_Server::READABLE,
184 'callback' => array( $this, 'request_get_ai_assistance_feature' ),
185 'permission_callback' => array( 'Jetpack_AI_Helper', 'get_status_permission_check' ),
186 ),
187 )
188 );
189 }
190
191 /**
192 * Get a response from chatting with the site.
193 * Uses Jetpack Search.
194 *
195 * @param WP_REST_Request $request The request.
196 * @return mixed
197 */
198 public function request_chat_with_site( $request ) {
199 $question = $request->get_param( 'query' );
200 $blog_id = \Jetpack_Options::get_option( 'id' );
201 $response = Client::wpcom_json_api_request_as_blog(
202 sprintf( '/sites/%d/jetpack-search/ai/search', $blog_id ) . '?force=wpcom',
203 2,
204 array(
205 'method' => 'GET',
206 'headers' => array( 'content-type' => 'application/json' ),
207 'timeout' => MINUTE_IN_SECONDS,
208 ),
209 array(
210 'query' => $question,
211 /**
212 * Filter for an answer prompt override.
213 * Example: "Talk like a cowboy."
214 *
215 * @param string $prompt_override The prompt override string.
216 *
217 * @since 12.6
218 */
219 'answer_prompt' => apply_filters( 'jetpack_ai_chat_answer_prompt', false ),
220 ),
221 'wpcom'
222 );
223
224 if ( is_wp_error( $response ) ) {
225 return $response;
226 }
227
228 $data = json_decode( wp_remote_retrieve_body( $response ) );
229
230 if ( empty( $data->cache_key ) ) {
231 return new WP_Error( 'invalid_ask_response', __( 'Invalid response from the server.', 'jetpack' ), 400 );
232 }
233
234 return $data;
235 }
236
237 /**
238 * Rank a response from chatting with the site.
239 *
240 * @param WP_REST_Request $request The request.
241 * @return mixed
242 */
243 public function rank_response( $request ) {
244 $rank = $request->get_param( 'rank' );
245 $comment = $request->get_param( 'comment' );
246 $cache_key = $request->get_param( 'cache_key' );
247
248 if ( strpos( $cache_key, 'jp-search-ai-' ) !== 0 ) {
249 return new WP_Error( 'invalid_cache_key', __( 'Invalid cached context for the answer feedback.', 'jetpack' ), 400 );
250 }
251
252 $blog_id = \Jetpack_Options::get_option( 'id' );
253 $response = Client::wpcom_json_api_request_as_blog(
254 sprintf( '/sites/%d/jetpack-search/ai/rank', $blog_id ) . '?force=wpcom',
255 2,
256 array(
257 'method' => 'GET',
258 'headers' => array( 'content-type' => 'application/json' ),
259 'timeout' => 30,
260 ),
261 array(
262 'rank' => $rank,
263 'comment' => $comment,
264 'cache_key' => $cache_key,
265 ),
266 'wpcom'
267 );
268
269 if ( is_wp_error( $response ) ) {
270 return $response;
271 }
272
273 $data = json_decode( wp_remote_retrieve_body( $response ) );
274
275 if ( 'ok' !== $data ) {
276 return new WP_Error( 'invalid_feedback_response', __( 'Invalid response from the server.', 'jetpack' ), 400 );
277 }
278
279 return $data;
280 }
281
282 /**
283 * Get completions for a given text.
284 *
285 * @param WP_REST_Request $request The request.
286 */
287 public function request_gpt_completion( $request ) {
288 return Jetpack_AI_Helper::get_gpt_completion( $request['content'], $request['post_id'], $request['skip_cache'] );
289 }
290
291 /**
292 * Get image generations for a given prompt.
293 *
294 * @param WP_REST_Request $request The request.
295 */
296 public function request_dalle_generation( $request ) {
297 return Jetpack_AI_Helper::get_dalle_generation( $request['prompt'], $request['post_id'] );
298 }
299
300 /**
301 * Collect and provide relevat data about the AI feature,
302 * such as the number of requests made.
303 */
304 public function request_get_ai_assistance_feature() {
305 return Jetpack_AI_Helper::get_ai_assistance_feature();
306 }
307 }
308
309 wpcom_rest_api_v2_load_plugin( 'WPCOM_REST_API_V2_Endpoint_AI' );
310