PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 14.3.1
Jetpack – WP Security, Backup, Speed, & Growth v14.3.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 4 years ago class-wpcom-rest-api-v2-endpoint-admin-color.php 2 years ago class-wpcom-rest-api-v2-endpoint-admin-menu.php 1 year ago class-wpcom-rest-api-v2-endpoint-ai.php 2 years ago class-wpcom-rest-api-v2-endpoint-app-media.php 2 years ago class-wpcom-rest-api-v2-endpoint-blog-stats.php 2 years 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 2 years ago class-wpcom-rest-api-v2-endpoint-goodreads.php 2 years ago class-wpcom-rest-api-v2-endpoint-google-docs.php 4 years ago class-wpcom-rest-api-v2-endpoint-instagram-gallery.php 3 years ago class-wpcom-rest-api-v2-endpoint-mailchimp.php 2 years 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 2 years ago class-wpcom-rest-api-v2-endpoint-profile.php 2 years ago class-wpcom-rest-api-v2-endpoint-publicize-share-post.php 1 year ago class-wpcom-rest-api-v2-endpoint-publicize-share-status.php 1 year ago class-wpcom-rest-api-v2-endpoint-related-posts.php 2 years ago class-wpcom-rest-api-v2-endpoint-resolve-redirect.php 2 years ago class-wpcom-rest-api-v2-endpoint-search.php 4 years ago class-wpcom-rest-api-v2-endpoint-send-email-preview.php 1 year ago class-wpcom-rest-api-v2-endpoint-template-loader.php 3 years ago class-wpcom-rest-api-v2-endpoint-top-posts.php 2 years ago class-wpcom-rest-api-v2-endpoint-transient.php 5 years ago class-wpcom-rest-api-v3-endpoint-blogging-prompts.php 1 year ago gutenberg-available-extensions.php 2 years ago hello.php 4 years ago memberships.php 1 year ago publicize-connection-test-results.php 3 years ago publicize-connections.php 1 year ago publicize-services.php 3 years ago service-api-keys.php 2 years ago sites-posts-featured-media-url.php 2 years ago subscribers.php 1 year ago
class-wpcom-rest-api-v2-endpoint-ai.php
306 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 /**
12 * Class WPCOM_REST_API_V2_Endpoint_AI
13 */
14 class WPCOM_REST_API_V2_Endpoint_AI extends WP_REST_Controller {
15 /**
16 * Namespace prefix.
17 *
18 * @var string
19 */
20 public $namespace = 'wpcom/v2';
21
22 /**
23 * Endpoint base route.
24 *
25 * @var string
26 */
27 public $rest_base = 'jetpack-ai';
28
29 /**
30 * WPCOM_REST_API_V2_Endpoint_AI constructor.
31 */
32 public function __construct() {
33 $this->is_wpcom = true;
34 $this->wpcom_is_wpcom_only_endpoint = true;
35
36 if ( ! class_exists( 'Jetpack_AI_Helper' ) ) {
37 require_once JETPACK__PLUGIN_DIR . '_inc/lib/class-jetpack-ai-helper.php';
38 }
39
40 // Register routes that don't require Jetpack AI to be enabled.
41 add_action( 'rest_api_init', array( $this, 'register_basic_routes' ) );
42
43 if ( Jetpack_AI_Helper::is_ai_chat_enabled() ) {
44 add_action( 'rest_api_init', array( $this, 'register_ai_chat_routes' ) );
45 }
46
47 if ( ! \Jetpack_AI_Helper::is_enabled() ) {
48 return;
49 }
50
51 // Register routes that require Jetpack AI to be enabled.
52 add_action( 'rest_api_init', array( $this, 'register_routes' ) );
53 }
54
55 /**
56 * Register routes.
57 */
58 public function register_routes() {
59 register_rest_route(
60 $this->namespace,
61 $this->rest_base . '/completions',
62 array(
63 array(
64 'methods' => WP_REST_Server::CREATABLE,
65 'callback' => array( $this, 'request_gpt_completion' ),
66 'permission_callback' => array( 'Jetpack_AI_Helper', 'get_status_permission_check' ),
67 ),
68 'args' => array(
69 'content' => array(
70 'type' => 'string',
71 'required' => true,
72 'sanitize_callback' => 'sanitize_textarea_field',
73 ),
74 'post_id' => array(
75 'required' => false,
76 'type' => 'integer',
77 ),
78 'skip_cache' => array(
79 'required' => false,
80 'type' => 'boolean',
81 'description' => 'Whether to skip the cache and make a new request',
82 ),
83 ),
84 )
85 );
86
87 register_rest_route(
88 $this->namespace,
89 $this->rest_base . '/images/generations',
90 array(
91 array(
92 'methods' => WP_REST_Server::CREATABLE,
93 'callback' => array( $this, 'request_dalle_generation' ),
94 'permission_callback' => array( 'Jetpack_AI_Helper', 'get_status_permission_check' ),
95 ),
96 'args' => array(
97 'prompt' => array(
98 'type' => 'string',
99 'required' => true,
100 'sanitize_callback' => 'sanitize_textarea_field',
101 ),
102 'post_id' => array(
103 'required' => false,
104 'type' => 'integer',
105 ),
106 ),
107 )
108 );
109 }
110
111 /**
112 * Register routes for the AI Chat block.
113 * Relies on a site connection and Jetpack Search.
114 */
115 public function register_ai_chat_routes() {
116 register_rest_route(
117 $this->namespace,
118 '/jetpack-search/ai/search',
119 array(
120 array(
121 'methods' => WP_REST_Server::READABLE,
122 'callback' => array( $this, 'request_chat_with_site' ),
123 'permission_callback' => '__return_true',
124 ),
125 'args' => array(
126 'query' => array(
127 'description' => 'Your question to the site',
128 'required' => true,
129 'sanitize_callback' => 'sanitize_text_field',
130 ),
131 'answer_prompt' => array(
132 'description' => 'Answer prompt override',
133 'required' => false,
134 'sanitize_callback' => 'sanitize_text_field',
135 ),
136 ),
137 )
138 );
139
140 register_rest_route(
141 $this->namespace,
142 '/jetpack-search/ai/rank',
143 array(
144 array(
145 'methods' => WP_REST_Server::CREATABLE,
146 'callback' => array( $this, 'rank_response' ),
147 'permission_callback' => '__return_true',
148 ),
149 'args' => array(
150 'cache_key' => array(
151 'description' => 'Cache key of your response',
152 'required' => true,
153 'sanitize_callback' => 'sanitize_text_field',
154 ),
155 'comment' => array(
156 'description' => 'Optional feedback',
157 'required' => false,
158 'sanitize_callback' => 'sanitize_text_field',
159 ),
160 'rank' => array(
161 'description' => 'How do you rank this response',
162 'required' => false,
163 'sanitize_callback' => 'sanitize_text_field',
164 ),
165 ),
166 )
167 );
168 }
169
170 /**
171 * Register routes that don't require Jetpack AI to be enabled.
172 */
173 public function register_basic_routes() {
174 register_rest_route(
175 $this->namespace,
176 $this->rest_base . '/ai-assistant-feature',
177 array(
178 array(
179 'methods' => WP_REST_Server::READABLE,
180 'callback' => array( $this, 'request_get_ai_assistance_feature' ),
181 'permission_callback' => array( 'Jetpack_AI_Helper', 'get_status_permission_check' ),
182 ),
183 )
184 );
185 }
186
187 /**
188 * Get a response from chatting with the site.
189 * Uses Jetpack Search.
190 *
191 * @param WP_REST_Request $request The request.
192 * @return mixed
193 */
194 public function request_chat_with_site( $request ) {
195 $question = $request->get_param( 'query' );
196 $blog_id = \Jetpack_Options::get_option( 'id' );
197 $response = Client::wpcom_json_api_request_as_blog(
198 sprintf( '/sites/%d/jetpack-search/ai/search', $blog_id ) . '?force=wpcom',
199 2,
200 array(
201 'method' => 'GET',
202 'headers' => array( 'content-type' => 'application/json' ),
203 'timeout' => MINUTE_IN_SECONDS,
204 ),
205 array(
206 'query' => $question,
207 /**
208 * Filter for an answer prompt override.
209 * Example: "Talk like a cowboy."
210 *
211 * @param string $prompt_override The prompt override string.
212 *
213 * @since 12.6
214 */
215 'answer_prompt' => apply_filters( 'jetpack_ai_chat_answer_prompt', false ),
216 ),
217 'wpcom'
218 );
219
220 if ( is_wp_error( $response ) ) {
221 return $response;
222 }
223
224 $data = json_decode( wp_remote_retrieve_body( $response ) );
225
226 if ( empty( $data->cache_key ) ) {
227 return new WP_Error( 'invalid_ask_response', __( 'Invalid response from the server.', 'jetpack' ), 400 );
228 }
229
230 return $data;
231 }
232
233 /**
234 * Rank a response from chatting with the site.
235 *
236 * @param WP_REST_Request $request The request.
237 * @return mixed
238 */
239 public function rank_response( $request ) {
240 $rank = $request->get_param( 'rank' );
241 $comment = $request->get_param( 'comment' );
242 $cache_key = $request->get_param( 'cache_key' );
243
244 if ( strpos( $cache_key, 'jp-search-ai-' ) !== 0 ) {
245 return new WP_Error( 'invalid_cache_key', __( 'Invalid cached context for the answer feedback.', 'jetpack' ), 400 );
246 }
247
248 $blog_id = \Jetpack_Options::get_option( 'id' );
249 $response = Client::wpcom_json_api_request_as_blog(
250 sprintf( '/sites/%d/jetpack-search/ai/rank', $blog_id ) . '?force=wpcom',
251 2,
252 array(
253 'method' => 'GET',
254 'headers' => array( 'content-type' => 'application/json' ),
255 'timeout' => 30,
256 ),
257 array(
258 'rank' => $rank,
259 'comment' => $comment,
260 'cache_key' => $cache_key,
261 ),
262 'wpcom'
263 );
264
265 if ( is_wp_error( $response ) ) {
266 return $response;
267 }
268
269 $data = json_decode( wp_remote_retrieve_body( $response ) );
270
271 if ( 'ok' !== $data ) {
272 return new WP_Error( 'invalid_feedback_response', __( 'Invalid response from the server.', 'jetpack' ), 400 );
273 }
274
275 return $data;
276 }
277
278 /**
279 * Get completions for a given text.
280 *
281 * @param WP_REST_Request $request The request.
282 */
283 public function request_gpt_completion( $request ) {
284 return Jetpack_AI_Helper::get_gpt_completion( $request['content'], $request['post_id'], $request['skip_cache'] );
285 }
286
287 /**
288 * Get image generations for a given prompt.
289 *
290 * @param WP_REST_Request $request The request.
291 */
292 public function request_dalle_generation( $request ) {
293 return Jetpack_AI_Helper::get_dalle_generation( $request['prompt'], $request['post_id'] );
294 }
295
296 /**
297 * Collect and provide relevat data about the AI feature,
298 * such as the number of requests made.
299 */
300 public function request_get_ai_assistance_feature() {
301 return Jetpack_AI_Helper::get_ai_assistance_feature();
302 }
303 }
304
305 wpcom_rest_api_v2_load_plugin( 'WPCOM_REST_API_V2_Endpoint_AI' );
306