PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 2.3.1
AI Engine – The Chatbot, AI Framework & MCP for WordPress v2.3.1
3.5.7 3.5.6 3.5.5 3.5.4 3.5.3 3.5.2 3.5.1 3.5.0 3.4.9 3.4.8 3.4.7 0.2.1 1.6.91 0.2.2 1.6.92 0.2.3 1.6.93 0.2.4 1.6.94 0.2.5 1.6.95 0.2.6 1.6.96 0.2.7 1.6.97 0.2.8 1.6.98 0.2.9 1.6.99 0.3.0 1.7.0 0.3.1 1.7.1 0.3.2 1.7.2 0.3.3 1.7.3 0.3.4 1.7.4 0.3.5 1.7.5 0.3.6 1.7.6 0.4.0 1.7.7 0.4.1 1.7.8 0.4.2 1.7.9 0.4.3 1.8.0 0.4.4 1.8.1 0.4.5 1.8.2 0.4.6 1.8.3 0.4.7 1.8.4 0.4.8 1.8.5 0.4.9 1.8.6 0.5.0 1.8.7 0.5.1 1.8.8 0.5.2 1.8.9 0.5.3 1.9.0 0.5.4 1.9.1 0.5.5 1.9.2 0.5.6 1.9.3 0.5.7 1.9.4 0.5.8 1.9.5 0.5.9 1.9.6 0.6.0 1.9.7 0.6.1 1.9.8 0.6.2 1.9.81 0.6.3 1.9.82 0.6.4 1.9.83 0.6.5 1.9.84 0.6.6 1.9.85 0.6.7 1.9.86 0.6.8 1.9.87 0.6.9 1.9.88 0.7.0 1.9.89 0.7.1 1.9.90 0.7.2 1.9.91 0.7.3 1.9.92 0.7.4 1.9.93 0.7.5 1.9.94 0.7.6 1.9.95 0.7.7 1.9.96 0.7.8 1.9.97 0.7.9 1.9.98 0.8.0 1.9.99 0.8.1 2.0.0 0.8.2 2.0.1 0.8.3 2.0.2 0.8.4 2.0.3 0.8.5 2.0.4 0.8.6 2.0.5 0.8.7 2.0.6 0.8.8 2.0.7 0.8.9 2.0.8 0.9.0 2.0.9 0.9.2 2.1.0 0.9.3 2.1.1 0.9.4 2.1.2 0.9.5 2.1.3 0.9.6 2.1.4 0.9.7 2.1.5 0.9.8 2.1.6 0.9.81 2.1.7 0.9.82 2.1.8 0.9.83 2.1.9 0.9.84 2.2.0 0.9.85 2.2.1 0.9.86 2.2.2 0.9.87 2.2.3 0.9.88 2.2.4 0.9.89 2.2.5 0.9.9 2.2.51 0.9.91 2.2.52 0.9.92 2.2.53 0.9.93 2.2.54 0.9.94 2.2.56 0.9.95 2.2.57 0.9.96 2.2.6 0.9.97 2.2.60 0.9.98 2.2.61 0.9.99 2.2.62 1.0.0 2.2.63 1.0.01 2.2.70 1.0.1 2.2.80 1.0.2 2.2.81 1.0.3 2.2.90 1.0.4 2.2.91 1.0.5 2.2.92 1.0.6 2.2.93 1.0.7 2.2.94 1.0.8 2.2.95 1.0.9 2.3.0 1.1.0 2.3.1 1.1.1 2.3.2 1.1.2 2.3.3 1.1.3 2.3.4 1.1.4 2.3.5 1.1.5 2.3.6 1.1.6 2.3.7 1.1.7 2.3.8 1.1.8 2.3.9 1.1.9 2.4.0 1.2.0 2.4.1 1.2.1 2.4.2 1.2.2 2.4.3 1.2.21 2.4.4 1.2.3 2.4.5 1.2.30 2.4.6 1.3.0 2.4.7 1.3.1 2.4.8 1.3.2 2.4.9 1.3.3 2.5.0 1.3.31 2.5.1 1.3.32 2.5.2 1.3.33 2.5.3 1.3.34 2.5.4 1.3.35 2.5.5 1.3.36 2.5.6 1.3.37 2.5.7 1.3.38 2.5.8 1.3.39 2.5.9 1.3.40 2.6.0 1.3.41 2.6.1 1.3.42 2.6.2 1.3.43 2.6.3 1.3.44 2.6.5 1.3.45 2.6.6 1.3.46 2.6.7 1.3.47 2.6.8 1.3.48 2.6.9 1.3.49 2.7.0 1.3.50 2.7.1 1.3.51 2.7.2 1.3.52 2.7.3 1.3.53 2.7.4 1.3.54 2.7.5 1.3.56 2.7.6 1.3.57 2.7.7 1.3.58 2.7.8 1.3.59 2.7.9 1.3.60 2.8.0 1.3.61 2.8.1 1.3.62 2.8.2 1.3.63 2.8.3 1.3.64 2.8.4 1.3.65 2.8.5 1.3.66 2.8.6 1.3.67 2.8.7 1.3.68 2.8.8 1.3.69 2.8.9 1.3.70 2.9.0 1.3.71 2.9.1 1.3.72 2.9.2 1.3.73 2.9.3 1.3.74 2.9.4 1.3.75 2.9.5 1.3.76 2.9.6 1.3.77 2.9.7 1.3.78 2.9.8 1.3.79 2.9.9 1.3.80 3.0.0 1.3.81 3.0.1 1.3.82 3.0.2 1.3.83 3.0.3 1.3.84 3.0.4 1.3.85 3.0.5 1.3.86 3.0.6 1.3.87 3.0.7 1.3.88 3.0.8 1.3.89 3.0.9 1.3.90 3.1.0 1.3.91 3.1.1 1.3.92 3.1.2 1.3.93 3.1.3 1.3.94 3.1.4 1.3.95 3.1.5 1.3.96 3.1.6 1.3.97 3.1.7 1.3.98 3.1.8 1.3.99 3.1.9 1.4.0 3.2.0 1.4.1 3.2.1 1.4.2 3.2.2 1.4.3 3.2.3 1.4.4 3.2.4 1.4.5 3.2.5 1.4.6 3.2.6 1.4.7 3.2.7 1.4.8 3.2.8 1.4.9 3.2.9 1.5.0 3.3.0 1.5.1 3.3.1 1.5.2 3.3.2 1.5.3 3.3.3 1.5.4 3.3.4 1.5.5 3.3.5 1.5.6 3.3.6 1.5.7 3.3.7 1.5.8 3.3.8 1.5.9 3.3.9 1.6.0 3.4.0 1.6.1 3.4.1 1.6.2 3.4.2 1.6.3 3.4.3 1.6.5 3.4.4 1.6.51 3.4.5 1.6.52 3.4.6 1.6.53 1.6.54 1.6.55 1.6.56 1.6.57 1.6.58 1.6.59 1.6.60 1.6.61 1.6.62 1.6.63 1.6.64 1.6.65 1.6.66 1.6.67 1.6.68 trunk 1.6.69 0.0.1 1.6.70 0.0.2 1.6.71 0.0.3 1.6.72 0.0.4 1.6.73 0.0.5 1.6.74 0.0.6 1.6.75 0.0.7 1.6.76 0.0.8 1.6.77 0.0.9 1.6.78 0.1.0 1.6.79 0.1.1 1.6.81 0.1.2 1.6.82 0.1.3 1.6.83 0.1.4 1.6.84 0.1.5 1.6.85 0.1.6 1.6.86 0.1.7 1.6.87 0.1.8 1.6.88 0.1.9 1.6.89 0.2.0 1.6.90
ai-engine / classes / rest.php
ai-engine / classes Last commit date
engines 2 years ago modules 2 years ago queries 2 years ago admin.php 2 years ago api.php 2 years ago core.php 2 years ago init.php 3 years ago reply.php 2 years ago rest.php 2 years ago
rest.php
929 lines
1 <?php
2
3 class Meow_MWAI_Rest
4 {
5 private $core = null;
6 private $namespace = 'mwai/v1';
7
8 public function __construct( $core ) {
9 $this->core = $core;
10 add_action( 'rest_api_init', array( $this, 'rest_init' ) );
11 }
12
13 /**
14 * Retrieve the message from the parameters and optionally sanitize it.
15 *
16 * @param array &$params The parameters array, passed by reference.
17 * @param bool $sanitize Whether to sanitize the message using sanitize_text_field.
18 * @return string The retrieved (and optionally sanitized) message.
19 */
20 function retrieve_message( &$params, $sanitize = false ) : string {
21 if ( isset( $params['message'] ) ) {
22 $message = $params['message'];
23 }
24 elseif ( isset( $params['prompt'] ) ) {
25 $message = $params['prompt'];
26 unset( $params['prompt'] );
27 $params['message'] = $message;
28 error_log( 'AI Engine: "prompt" is deprecated, please use "message" instead.' );
29 }
30 else {
31 $message = "";
32 }
33
34 if ( $sanitize ) {
35 $message = sanitize_text_field( $message );
36 }
37
38 return $message;
39 }
40
41 function rest_init() {
42 try {
43 // Settings Endpoints
44 register_rest_route( $this->namespace, '/settings/update', array(
45 'methods' => 'POST',
46 'permission_callback' => [ $this->core, 'can_access_settings' ],
47 'callback' => [ $this, 'rest_settings_update' ],
48 ) );
49 register_rest_route( $this->namespace, '/settings/options', array(
50 'methods' => 'GET',
51 'permission_callback' => [ $this->core, 'can_access_settings' ],
52 'callback' => [ $this, 'rest_settings_list' ],
53 ) );
54 register_rest_route( $this->namespace, '/settings/reset', array(
55 'methods' => 'POST',
56 'permission_callback' => [ $this->core, 'can_access_settings' ],
57 'callback' => [ $this, 'rest_settings_reset' ],
58 ) );
59 register_rest_route( $this->namespace, '/settings/chatbots', array(
60 'methods' => ['GET', 'POST'],
61 'permission_callback' => [ $this->core, 'can_access_settings' ],
62 'callback' => [ $this, 'rest_settings_chatbots' ],
63 ) );
64 register_rest_route( $this->namespace, '/settings/themes', array(
65 'methods' => ['GET', 'POST'],
66 'permission_callback' => [ $this->core, 'can_access_settings' ],
67 'callback' => [ $this, 'rest_settings_themes' ],
68 ) );
69
70 // System Endpoints
71 register_rest_route( $this->namespace, '/system/logs/list', array(
72 'methods' => 'POST',
73 'permission_callback' => [ $this->core, 'can_access_settings' ],
74 'callback' => [ $this, 'rest_system_logs_list' ],
75 ) );
76 register_rest_route( $this->namespace, '/system/logs/delete', array(
77 'methods' => 'POST',
78 'permission_callback' => [ $this->core, 'can_access_settings' ],
79 'callback' => [ $this, 'rest_system_logs_delete' ],
80 ) );
81 register_rest_route( $this->namespace, '/system/logs/meta', array(
82 'methods' => 'POST',
83 'permission_callback' => [ $this->core, 'can_access_settings' ],
84 'callback' => [ $this, 'rest_system_logs_meta_get' ],
85 ) );
86 register_rest_route( $this->namespace, '/system/templates', array(
87 'methods' => 'POST',
88 'permission_callback' => [ $this->core, 'can_access_features' ],
89 'callback' => [ $this, 'rest_system_templates_save' ],
90 ) );
91 register_rest_route( $this->namespace, '/system/templates', array(
92 'methods' => 'GET',
93 'permission_callback' => [ $this->core, 'can_access_features' ],
94 'callback' => [ $this, 'rest_system_templates_get' ],
95 ) );
96
97 // AI Endpoints
98 register_rest_route( $this->namespace, '/ai/models', array(
99 'methods' => 'POST',
100 'permission_callback' => [ $this->core, 'can_access_features' ],
101 'callback' => [ $this, 'rest_ai_models' ],
102 ) );
103 register_rest_route( $this->namespace, '/ai/completions', array(
104 'methods' => 'POST',
105 'permission_callback' => [ $this->core, 'can_access_features' ],
106 'callback' => [ $this, 'rest_ai_completions' ],
107 ) );
108 register_rest_route( $this->namespace, '/ai/images', array(
109 'methods' => 'POST',
110 'permission_callback' => [ $this->core, 'can_access_features' ],
111 'callback' => [ $this, 'rest_ai_images' ],
112 ) );
113 register_rest_route( $this->namespace, '/ai/copilot', array(
114 'methods' => 'POST',
115 'permission_callback' => [ $this->core, 'can_access_features' ],
116 'callback' => [ $this, 'rest_ai_copilot' ],
117 ) );
118
119 register_rest_route( $this->namespace, '/ai/magic_wand', array(
120 'methods' => 'POST',
121 'callback' => [ $this, 'rest_ai_magic_wand' ],
122 'permission_callback' => [ $this->core, 'can_access_features' ],
123 ) );
124 register_rest_route( $this->namespace, '/ai/moderate', array(
125 'methods' => 'POST',
126 'permission_callback' => [ $this->core, 'can_access_settings' ],
127 'callback' => [ $this, 'rest_ai_moderate' ],
128 ) );
129 register_rest_route( $this->namespace, '/ai/transcribe_audio', array(
130 'methods' => 'POST',
131 'permission_callback' => [ $this->core, 'can_access_settings' ],
132 'callback' => [ $this, 'rest_ai_transcribe_audio' ],
133 ) );
134 register_rest_route( $this->namespace, '/ai/transcribe_image', array(
135 'methods' => 'POST',
136 'permission_callback' => [ $this->core, 'can_access_settings' ],
137 'callback' => [ $this, 'rest_ai_transcribe_image' ],
138 ) );
139 register_rest_route( $this->namespace, '/ai/json', array(
140 'methods' => 'POST',
141 'permission_callback' => [ $this->core, 'can_access_settings' ],
142 'callback' => [ $this, 'rest_ai_json' ],
143 ) );
144
145 // Helpers Endpoints
146 register_rest_route( $this->namespace, '/helpers/update_post_title', array(
147 'methods' => 'POST',
148 'permission_callback' => [ $this->core, 'can_access_features' ],
149 'callback' => [ $this, 'rest_helpers_update_title' ],
150 ) );
151 register_rest_route( $this->namespace, '/helpers/update_post_excerpt', array(
152 'methods' => 'POST',
153 'permission_callback' => [ $this->core, 'can_access_features' ],
154 'callback' => [ $this, 'rest_helpers_update_excerpt' ],
155 ) );
156 register_rest_route( $this->namespace, '/helpers/create_post', array(
157 'methods' => 'POST',
158 'permission_callback' => [ $this->core, 'can_access_features' ],
159 'callback' => [ $this, 'rest_helpers_create_post' ],
160 ) );
161 register_rest_route( $this->namespace, '/helpers/create_image', array(
162 'methods' => 'POST',
163 'permission_callback' => [ $this->core, 'can_access_features' ],
164 'callback' => [ $this, 'rest_helpers_create_images' ],
165 ) );
166 register_rest_route( $this->namespace, '/helpers/count_posts', array(
167 'methods' => 'GET',
168 'permission_callback' => [ $this->core, 'can_access_features' ],
169 'callback' => [ $this, 'rest_helpers_count_posts' ],
170 ) );
171 register_rest_route( $this->namespace, '/helpers/posts_ids', array(
172 'methods' => 'GET',
173 'permission_callback' => [ $this->core, 'can_access_features' ],
174 'callback' => [ $this, 'rest_helpers_posts_ids' ],
175 ) );
176 register_rest_route( $this->namespace, '/helpers/post_types', array(
177 'methods' => 'GET',
178 'permission_callback' => [ $this->core, 'can_access_features' ],
179 'callback' => [ $this, 'rest_helpers_post_types' ],
180 ) );
181 register_rest_route( $this->namespace, '/helpers/post_content', array(
182 'methods' => 'GET',
183 'permission_callback' => [ $this->core, 'can_access_features' ],
184 'callback' => [ $this, 'rest_helpers_post_content' ],
185 ) );
186
187 // OpenAI Endpoints
188 register_rest_route( $this->namespace, '/openai/files/list', array(
189 'methods' => 'GET',
190 'permission_callback' => [ $this->core, 'can_access_settings' ],
191 'callback' => [ $this, 'rest_openai_files_get' ],
192 ) );
193 register_rest_route( $this->namespace, '/openai/files/upload', array(
194 'methods' => 'POST',
195 'permission_callback' => [ $this->core, 'can_access_settings' ],
196 'callback' => [ $this, 'rest_openai_files_upload' ],
197 ) );
198 register_rest_route( $this->namespace, '/openai/files/delete', array(
199 'methods' => 'POST',
200 'permission_callback' => [ $this->core, 'can_access_settings' ],
201 'callback' => [ $this, 'rest_openai_files_delete' ],
202 ) );
203 register_rest_route( $this->namespace, '/openai/files/download', array(
204 'methods' => 'POST',
205 'permission_callback' => [ $this->core, 'can_access_settings' ],
206 'callback' => [ $this, 'rest_openai_files_download' ],
207 ) );
208 register_rest_route( $this->namespace, '/openai/files/finetune', array(
209 'methods' => 'POST',
210 'permission_callback' => [ $this->core, 'can_access_settings' ],
211 'callback' => [ $this, 'rest_openai_files_finetune' ],
212 ) );
213 register_rest_route( $this->namespace, '/openai/finetunes/list_deleted', array(
214 'methods' => 'GET',
215 'permission_callback' => [ $this->core, 'can_access_settings' ],
216 'callback' => [ $this, 'rest_openai_deleted_finetunes_get' ],
217 ) );
218
219 // register_rest_route( $this->namespace, '/openai/models', array(
220 // 'methods' => 'GET',
221 // 'permission_callback' => [ $this->core, 'can_access_settings' ],
222 // 'callback' => [ $this, 'rest_openai_models_get' ],
223 // ) );
224
225 register_rest_route( $this->namespace, '/openai/finetunes/list', array(
226 'methods' => 'GET',
227 'permission_callback' => [ $this->core, 'can_access_settings' ],
228 'callback' => [ $this, 'rest_openai_finetunes_get' ],
229 ) );
230 register_rest_route( $this->namespace, '/openai/finetunes/delete', array(
231 'methods' => 'POST',
232 'permission_callback' => [ $this->core, 'can_access_settings' ],
233 'callback' => [ $this, 'rest_openai_finetunes_delete' ],
234 ) );
235 register_rest_route( $this->namespace, '/openai/finetunes/cancel', array(
236 'methods' => 'POST',
237 'permission_callback' => [ $this->core, 'can_access_settings' ],
238 'callback' => [ $this, 'rest_openai_finetunes_cancel' ],
239 ) );
240 register_rest_route( $this->namespace, '/openai/incidents', array(
241 'methods' => 'GET',
242 'permission_callback' => [ $this->core, 'can_access_settings' ],
243 'callback' => [ $this, 'rest_openai_incidents' ],
244 ) );
245 }
246 catch ( Exception $e ) {
247 var_dump( $e );
248 }
249 }
250
251 function rest_settings_list() {
252 return new WP_REST_Response( [
253 'success' => true,
254 'options' => $this->core->get_all_options()
255 ], 200 );
256 }
257
258 function rest_settings_update( $request ) {
259 try {
260 $params = $request->get_json_params();
261 $value = $params['options'];
262 $options = $this->core->update_options( $value );
263 $success = !!$options;
264 $message = __( $success ? 'OK' : "Could not update options.", 'ai-engine' );
265 return new WP_REST_Response([ 'success' => $success, 'message' => $message, 'options' => $options ], 200 );
266 }
267 catch ( Exception $e ) {
268 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
269 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
270 }
271 }
272
273 function rest_settings_reset() {
274 try {
275 $options = $this->core->reset_options();
276 $success = !!$options;
277 $message = __( $success ? 'OK' : "Could not reset options.", 'ai-engine' );
278 return new WP_REST_Response([ 'success' => $success, 'message' => $message, 'options' => $options ], 200 );
279 }
280 catch ( Exception $e ) {
281 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
282 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
283 }
284 }
285
286 function rest_ai_models( $request ) {
287 try {
288 $params = $request->get_json_params();
289 $envId = $params['envId'];
290 $engine = Meow_MWAI_Engines_Factory::get( $this->core, $envId );
291 $models = $engine->retrieve_models();
292 return new WP_REST_Response([ 'success' => true, 'models' => $models ], 200 );
293 }
294 catch ( Exception $e ) {
295 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
296 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
297 }
298 }
299
300 function rest_ai_completions( $request ) {
301 try {
302 $params = $request->get_json_params();
303 $message = $this->retrieve_message( $params );
304 $query = new Meow_MWAI_Query_Text( $message );
305 $query->inject_params( $params );
306
307 // Handle streaming
308 $stream = $params['stream'] ?? false;
309 $streamCallback = null;
310 if ( $stream ) {
311 $streamCallback = function( $reply ) {
312 //$raw = _wp_specialchars( $reply, ENT_NOQUOTES, 'UTF-8', true );
313 $raw = $reply;
314 $this->core->stream_push( [ 'type' => 'live', 'data' => $raw ] );
315 if ( ob_get_level() > 0 ) {
316 ob_flush();
317 }
318 flush();
319 };
320 header( 'Cache-Control: no-cache' );
321 header( 'Content-Type: text/event-stream' );
322 header( 'X-Accel-Buffering: no' ); // This is useful to disable buffering in nginx through headers.
323 ob_implicit_flush( true );
324 ob_end_flush();
325 }
326
327 // Process Reply
328 $reply = $this->core->run_query( $query, $streamCallback );
329 $restRes = [
330 'success' => true,
331 'data' => $reply->result,
332 'usage' => $reply->usage
333 ];
334 if ( $stream ) {
335 $this->core->stream_push( [ 'type' => 'end', 'data' => json_encode( $restRes ) ] );
336 die();
337 }
338 return new WP_REST_Response( $restRes, 200 );
339 }
340 catch ( Exception $e ) {
341 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
342 if ( $stream ) {
343 $this->core->stream_push( [ 'type' => 'error', 'data' => $message ] );
344 }
345 else {
346 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
347 }
348 }
349 }
350
351 function rest_ai_images( $request ) {
352 try {
353 $params = $request->get_json_params();
354 $message = $this->retrieve_message( $params );
355 $query = new Meow_MWAI_Query_Image( $message );
356 $query->inject_params( $params );
357 $reply = $this->core->run_query( $query );
358 return new WP_REST_Response([ 'success' => true, 'data' => $reply->results, 'usage' => $reply->usage ], 200 );
359 }
360 catch ( Exception $e ) {
361 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
362 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
363 }
364 }
365
366 function rest_ai_magic_wand( $request ) {
367 try {
368 $params = $request->get_json_params();
369 $action = isset( $params['action'] ) ? $params['action'] : null;
370 $data = isset( $params['data'] ) ? $params['data'] : null;
371 if ( empty( $data ) || empty( $action ) ) {
372 return new WP_REST_Response([ 'success' => false, 'message' => "An action and some data are required." ], 500 );
373 }
374 $data = apply_filters( 'mwai_magic_wand_' . $action, "", $data );
375 return new WP_REST_Response([ 'success' => true, 'data' => $data ], 200 );
376 }
377 catch ( Exception $e ) {
378 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
379 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
380 }
381 }
382
383 function rest_ai_copilot( $request ) {
384 try {
385 $params = $request->get_json_params();
386 $action = sanitize_text_field( $params['action'] );
387 $message = $this->retrieve_message( $params, true );
388 if ( empty( $action ) || empty( $message ) ) {
389 return new WP_REST_Response([ 'success' => false, 'message' => "Copilot needs an action and a prompt." ], 500 );
390 }
391 $query = new Meow_MWAI_Query_Text( $message, 2048 );
392 $query->set_scope( 'admin-tools' );
393 $model = $this->core->get_option( 'ai_default_model' );
394 $env = $this->core->get_option( 'ai_default_env' );
395 if ( !empty( $model ) ) {
396 $query->set_model( $model );
397 }
398 if ( !empty( $env ) ) {
399 $query->set_env_id( $env );
400 }
401 $reply = $this->core->run_query( $query );
402 return new WP_REST_Response([ 'success' => true, 'data' => $reply->result ], 200 );
403 }
404 catch ( Exception $e ) {
405 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
406 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
407 }
408 }
409
410 function rest_helpers_update_title( $request ) {
411 try {
412 $params = $request->get_json_params();
413 $title = sanitize_text_field( $params['title'] );
414 $postId = intval( $params['postId'] );
415 $post = get_post( $postId );
416 if ( !$post ) {
417 throw new Exception( 'There is no post with this ID.' );
418 }
419 $post->post_title = $title;
420 //$post->post_name = sanitize_title( $title );
421 wp_update_post( $post );
422 return new WP_REST_Response([ 'success' => true, 'message' => "Title updated." ], 200 );
423 }
424 catch ( Exception $e ) {
425 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
426 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
427 }
428 }
429
430 function rest_helpers_update_excerpt( $request ) {
431 try {
432 $params = $request->get_json_params();
433 $excerpt = sanitize_text_field( $params['excerpt'] );
434 $postId = intval( $params['postId'] );
435 $post = get_post( $postId );
436 if ( !$post ) {
437 throw new Exception( 'There is no post with this ID.' );
438 }
439 $post->post_excerpt = $excerpt;
440 wp_update_post( $post );
441 return new WP_REST_Response([ 'success' => true, 'message' => "Excerpt updated." ], 200 );
442 }
443 catch ( Exception $e ) {
444 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
445 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
446 }
447 }
448
449 function rest_helpers_create_post( $request ) {
450 try {
451 $params = $request->get_json_params();
452 $title = sanitize_text_field( $params['title'] );
453 $content = sanitize_textarea_field( $params['content'] );
454 $excerpt = sanitize_text_field( $params['excerpt'] );
455 $postType = sanitize_text_field( $params['postType'] );
456 $post = new stdClass();
457 $post->post_title = $title;
458 $post->post_excerpt = $excerpt;
459 $post->post_content = $content;
460 $post->post_status = 'draft';
461 $post->post_type = isset( $postType ) ? $postType : 'post';
462 // TODO: Let's try to avoid using Markdown to create the Post
463 // Instead, we should create Gutenberg Blocks, or simple HTML.
464 // Then, we can get rid of the library for Markdown.
465 $post->post_content = $this->core->markdown_to_html( $post->post_content );
466 $postId = wp_insert_post( $post );
467 return new WP_REST_Response([ 'success' => true, 'postId' => $postId ], 200 );
468 }
469 catch ( Exception $e ) {
470 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
471 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
472 }
473 }
474
475 function rest_helpers_create_images( $request ) {
476 try {
477 $params = $request->get_json_params();
478 $title = sanitize_text_field( $params['title'] );
479 $caption = sanitize_text_field( $params['caption'] );
480 $alt = sanitize_text_field( $params['alt'] );
481 $description = sanitize_text_field( $params['description'] );
482 $url = $params['url'];
483 $filename = sanitize_text_field( $params['filename'] );
484 $attachmentId = $this->core->add_image_from_url( $url, $filename, $title, $description, $caption, $alt );
485 return new WP_REST_Response([ 'success' => true, 'attachmentId' => $attachmentId ], 200 );
486 }
487 catch ( Exception $e ) {
488 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
489 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
490 }
491 }
492
493 function rest_openai_files_get() {
494 try {
495 $envId = isset( $_GET['envId'] ) ? $_GET['envId'] : null;
496 $purposeFilter = isset( $_GET['purpose'] ) ? $_GET['purpose'] : null;
497 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
498 $files = $openai->list_files( $purposeFilter );
499 return new WP_REST_Response([ 'success' => true, 'files' => $files ], 200 );
500 }
501 catch ( Exception $e ) {
502 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
503 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
504 }
505 }
506
507 function rest_openai_deleted_finetunes_get() {
508 try {
509 $envId = isset( $_GET['envId'] ) ? $_GET['envId'] : null;
510 $legacy = isset( $_GET['legacy'] ) ? $_GET['legacy'] === 'true' : false;
511 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
512 $finetunes = $openai->list_deleted_finetunes( $legacy );
513 return new WP_REST_Response([ 'success' => true, 'finetunes' => $finetunes ], 200 );
514 }
515 catch ( Exception $e ) {
516 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
517 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
518 }
519 }
520
521 function rest_openai_finetunes_get() {
522 try {
523 $envId = isset( $_GET['envId'] ) ? $_GET['envId'] : null;
524 $legacy = isset( $_GET['legacy'] ) ? $_GET['legacy'] === 'true' : false;
525 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
526 $finetunes = $openai->list_finetunes( $legacy );
527 return new WP_REST_Response([ 'success' => true, 'finetunes' => $finetunes ], 200 );
528 }
529 catch ( Exception $e ) {
530 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
531 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
532 }
533 }
534
535 function rest_openai_files_upload( $request ) {
536 try {
537 $params = $request->get_json_params();
538 $envId = $params['envId'];;
539 $filename = sanitize_text_field( $params['filename'] );
540 $data = $params['data'];
541 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
542 $file = $openai->upload_file( $filename, $data );
543 return new WP_REST_Response([ 'success' => true, 'file' => $file ], 200 );
544 }
545 catch ( Exception $e ) {
546 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
547 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
548 }
549 }
550
551 function rest_openai_files_delete( $request ) {
552 try {
553 $params = $request->get_json_params();
554 $envId = $params['envId'];;
555 $fileId = $params['fileId'];
556 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
557 $openai->delete_file( $fileId );
558 return new WP_REST_Response([ 'success' => true ], 200 );
559 }
560 catch ( Exception $e ) {
561 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
562 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
563 }
564 }
565
566 function rest_openai_finetunes_cancel( $request ) {
567 try {
568 $params = $request->get_json_params();
569 $envId = $params['envId'];;
570 $finetuneId = $params['finetuneId'];
571 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
572 $openai->cancel_finetune( $finetuneId );
573 return new WP_REST_Response([ 'success' => true ], 200 );
574 }
575 catch ( Exception $e ) {
576 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
577 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
578 }
579 }
580
581 function rest_openai_finetunes_delete( $request ) {
582 try {
583 $params = $request->get_json_params();
584 $envId = $params['envId'];;
585 $modelId = $params['modelId'];
586 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
587 $openai->delete_finetune( $modelId );
588 return new WP_REST_Response([ 'success' => true ], 200 );
589 }
590 catch ( Exception $e ) {
591 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
592 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
593 }
594 }
595
596 function rest_openai_files_download( $request ) {
597 try {
598 $params = $request->get_json_params();
599 $envId = $params['envId'];;
600 $fileId = $params['fileId'];
601 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
602 $filename = $openai->download_file( $fileId );
603 $data = file_get_contents( $filename );
604 return new WP_REST_Response([ 'success' => true, 'data' => $data ], 200 );
605 }
606 catch ( Exception $e ) {
607 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
608 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
609 }
610 }
611
612 function rest_openai_files_finetune( $request ) {
613 try {
614 $params = $request->get_json_params();
615 $envId = $params['envId'];;
616 $fileId = $params['fileId'];
617 $model = $params['model'];
618 $suffix = $params['suffix'];
619 $hyperparams = [
620 "nEpochs" => isset( $params['nEpochs'] ) ? $params['nEpochs'] : null,
621 "batchSize" => isset( $params['batchSize'] ) ? $params['batchSize'] : null,
622 ];
623 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
624 $finetune = $openai->run_finetune( $fileId, $model, $suffix, $hyperparams );
625 return new WP_REST_Response([ 'success' => true, 'finetune' => $finetune ], 200 );
626 }
627 catch ( Exception $e ) {
628 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
629 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
630 }
631 }
632
633 function rest_openai_incidents() {
634 try {
635 $transient = get_transient( 'mwai_openai_incidents' );
636 if ( $transient ) {
637 return new WP_REST_Response([ 'success' => true, 'incidents' => $transient ], 200 );
638 }
639 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core );
640 $incidents = $openai->get_incidents();
641 set_transient( 'mwai_openai_incidents', $incidents, 60 * 10 );
642 return new WP_REST_Response([ 'success' => true, 'incidents' => $incidents ], 200 );
643 }
644 catch ( Exception $e ) {
645 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
646 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
647 }
648 }
649
650 function rest_helpers_count_posts( $request ) {
651 try {
652 $params = $request->get_query_params();
653 $postType = $params['postType'];
654 $postStatus = !empty( $params['postStatus'] ) ? explode( ',', $params['postStatus'] ) : [ 'publish' ];
655 $count = wp_count_posts( $postType );
656 $count = array_sum( array_intersect_key( (array)$count, array_flip( $postStatus ) ) );
657 return new WP_REST_Response([ 'success' => true, 'count' => $count ], 200 );
658 }
659 catch ( Exception $e ) {
660 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
661 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
662 }
663 }
664
665 function rest_helpers_posts_ids( $request ) {
666 try {
667 $params = $request->get_query_params();
668 $postType = $params['postType'];
669 $postStatus = !empty( $params['postStatus'] ) ? explode( ',', $params['postStatus'] ) : [ 'publish' ];
670 $posts = get_posts( [
671 'posts_per_page' => -1,
672 'post_type' => $postType,
673 'post_status' => $postStatus,
674 'fields' => 'ids'
675 ] );
676 return new WP_REST_Response([ 'success' => true, 'postIds' => $posts ], 200 );
677 }
678 catch ( Exception $e ) {
679 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
680 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
681 }
682 }
683
684 function rest_helpers_post_content( $request ) {
685 try {
686 $params = $request->get_query_params();
687 $offset = (int)$params['offset'];
688 $postType = $params['postType'];
689 $postStatus = isset( $params['postStatus'] ) ? explode( ',', $params['postStatus'] ) : [ 'publish' ];
690 $postId = (int)$params['postId'];
691
692 $post = null;
693 if ( !empty( $postId ) ) {
694 $post = get_post( $postId );
695 if ( $post->post_status !== 'publish' && $post->post_status !== 'future'
696 && $post->post_status !== 'draft' && $post->post_status !== 'private' ) {
697 $post = null;
698 }
699 }
700 else {
701 $posts = get_posts( [
702 'posts_per_page' => 1,
703 'post_type' => $postType,
704 'offset' => $offset,
705 'post_status' => $postStatus,
706 ] );
707 $post = count( $posts ) === 0 ? null : $posts[0];
708 }
709 if ( !$post ) {
710 return new WP_REST_Response([ 'success' => false, 'message' => 'Post not found' ], 404 );
711 }
712 $cleanPost = $this->core->get_post( $post );
713 return new WP_REST_Response([ 'success' => true, 'content' => $cleanPost['content'],
714 'checksum' => $cleanPost['checksum'], 'language' => $cleanPost['language'], 'excerpt' => $cleanPost['excerpt'],
715 'postId' => $cleanPost['postId'], 'title' => $cleanPost['title'], 'url' => $cleanPost['url'] ], 200 );
716 }
717 catch ( Exception $e ) {
718 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
719 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
720 }
721 }
722
723 function rest_system_templates_get( $request ) {
724 try {
725 $params = $request->get_query_params();
726 $category = $params['category'];
727 $templates = [];
728 $templates_option = get_option( 'mwai_templates', [] );
729 if ( !is_array( $templates_option ) ) {
730 update_option( 'mwai_templates', [] );
731 }
732 $categories = array_column( $templates_option, 'category' );
733 $index = array_search( $category, $categories );
734 $templates = [];
735 if ( $index !== false ) {
736 $templates = $templates_option[$index]['templates'];
737 }
738 return new WP_REST_Response([ 'success' => true, 'templates' => $templates ], 200 );
739 }
740 catch ( Exception $e ) {
741 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
742 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
743 }
744 }
745
746 function rest_system_templates_save( $request ) {
747 try {
748 $params = $request->get_json_params();
749 $category = $params['category'];
750 $templates = $params['templates'];
751 $templates_option = get_option( 'mwai_templates', [] );
752 $categories = array_column( $templates_option, 'category' );
753 $index = array_search( $category, $categories );
754 if ( $index !== false && $index >= 0 ) {
755 $templates_option[$index]['templates'] = $templates;
756 }
757 else {
758 $group = [ 'category' => $category, 'templates' => $templates ];
759 $templates_option[] = $group;
760 }
761
762 update_option( 'mwai_templates', $templates_option );
763 return new WP_REST_Response([ 'success' => true ], 200 );
764 }
765 catch ( Exception $e ) {
766 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
767 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
768 }
769 }
770
771 function rest_system_logs_list( $request ) {
772 try {
773 $params = $request->get_json_params();
774 $offset = $params['offset'];
775 $limit = $params['limit'];
776 $filters = $params['filters'];
777 $sort = $params['sort'];
778 $logs = apply_filters( 'mwai_stats_logs', [], $offset, $limit, $filters, $sort );
779 return new WP_REST_Response([ 'success' => true, 'total' => $logs['total'], 'logs' => $logs['rows'] ], 200 );
780 }
781 catch ( Exception $e ) {
782 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
783 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
784 }
785 }
786
787 function rest_system_logs_delete( $request ) {
788 try {
789 $params = $request->get_json_params();
790 $logIds = $params['logIds'];
791 $success = apply_filters( 'mwai_stats_logs_delete', true, $logIds );
792 return new WP_REST_Response([ 'success' => $success ], 200 );
793 }
794 catch ( Exception $e ) {
795 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
796 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
797 }
798 }
799
800 function rest_system_logs_meta_get( $request ) {
801 try {
802 $params = $request->get_json_params();
803 $logId = $params['logId'];
804 $metaKeys = $params['metaKeys'];
805 $data = apply_filters( 'mwai_stats_logs_meta', [], $logId, $metaKeys );
806 return new WP_REST_Response([ 'success' => true, 'data' => $data ], 200 );
807 }
808 catch ( Exception $e ) {
809 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
810 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
811 }
812 }
813
814 function rest_ai_moderate( $request ) {
815 try {
816 $params = $request->get_json_params();
817 $envId = $params['envId'];
818 $text = $params['text'];
819 if ( !$text ) {
820 return new WP_REST_Response([ 'success' => false, 'message' => 'Text not found.' ], 404 );
821 }
822 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
823 $results = $openai->moderate( $text );
824 return new WP_REST_Response([ 'success' => true, 'results' => $results ], 200 );
825 }
826 catch ( Exception $e ) {
827 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
828 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
829 }
830 }
831
832 function rest_ai_transcribe_audio( $request ) {
833 try {
834 $params = $request->get_json_params();
835 $query = new Meow_MWAI_Query_Transcribe();
836 $query->inject_params( $params );
837 $query->set_scope('admin-tools');
838 $reply = $this->core->run_query( $query );
839 return new WP_REST_Response([ 'success' => true, 'data' => $reply->result ], 200 );
840 }
841 catch ( Exception $e ) {
842 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
843 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
844 }
845 }
846
847 function rest_ai_transcribe_image( $request ) {
848 try {
849 global $mwai;
850 $params = $request->get_json_params();
851 $message = $this->retrieve_message( $params );
852 $url = !empty( $params['url'] ) ? $params['url'] : null;
853 $path = !empty( $params['path'] ) ? $params['path'] : null;
854 $result = $mwai->simpleVisionQuery( $message, $url, $path );
855 return new WP_REST_Response([ 'success' => true, 'data' => $result ], 200 );
856 }
857 catch ( Exception $e ) {
858 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
859 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
860 }
861 }
862
863 function rest_ai_json( $request ) {
864 try {
865 global $mwai;
866 $params = $request->get_json_params();
867 $message = $this->retrieve_message( $params );
868 $result = $mwai->simpleJsonQuery( $message );
869 return new WP_REST_Response([ 'success' => true, 'data' => $result ], 200 );
870 }
871 catch ( Exception $e ) {
872 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
873 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
874 }
875 }
876
877 function rest_helpers_post_types() {
878 try {
879 $postTypes = $this->core->get_post_types();
880 return new WP_REST_Response([ 'success' => true, 'postTypes' => $postTypes ], 200 );
881 }
882 catch ( Exception $e ) {
883 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
884 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
885 }
886 }
887
888 function rest_settings_themes( $request ) {
889 try {
890 $method = $request->get_method();
891 if ( $method === 'GET' ) {
892 $themes = $this->core->get_themes();
893 return new WP_REST_Response([ 'success' => true, 'themes' => $themes ], 200 );
894 }
895 else if ( $method === 'POST' ) {
896 $params = $request->get_json_params();
897 $themes = $params['themes'];
898 $themes = $this->core->update_themes( $themes );
899 return new WP_REST_Response([ 'success' => true, 'themes' => $themes ], 200 );
900 }
901 }
902 catch ( Exception $e ) {
903 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
904 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
905 }
906 }
907
908 function rest_settings_chatbots( $request ) {
909 try {
910 $method = $request->get_method();
911 if ( $method === 'GET' ) {
912 $chatbots = $this->core->get_chatbots();
913 return new WP_REST_Response([ 'success' => true, 'chatbots' => $chatbots ], 200 );
914 }
915 else if ( $method === 'POST' ) {
916 $params = $request->get_json_params();
917 $chatbots = $params['chatbots'];
918 $chatbots = $this->core->update_chatbots( $chatbots );
919 return new WP_REST_Response([ 'success' => true, 'chatbots' => $chatbots ], 200 );
920 }
921 return new WP_REST_Response([ 'success' => false, 'message' => 'Method not allowed' ], 405 );
922 }
923 catch ( Exception $e ) {
924 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
925 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
926 }
927 }
928 }
929