PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 1.9.97
AI Engine – The Chatbot, AI Framework & MCP for WordPress v1.9.97
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
987 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 function rest_init() {
14 try {
15 // Settings Endpoints
16 register_rest_route( $this->namespace, '/settings/update', array(
17 'methods' => 'POST',
18 'permission_callback' => [ $this->core, 'can_access_settings' ],
19 'callback' => [ $this, 'rest_settings_update' ],
20 ) );
21 register_rest_route( $this->namespace, '/settings/list', array(
22 'methods' => 'GET',
23 'permission_callback' => [ $this->core, 'can_access_settings' ],
24 'callback' => [ $this, 'rest_settings_list' ],
25 ) );
26 register_rest_route( $this->namespace, '/settings/reset', array(
27 'methods' => 'POST',
28 'permission_callback' => [ $this->core, 'can_access_settings' ],
29 'callback' => [ $this, 'rest_settings_reset' ],
30 ) );
31 register_rest_route( $this->namespace, '/settings/chatbots', array(
32 'methods' => ['GET', 'POST'],
33 'permission_callback' => [ $this->core, 'can_access_settings' ],
34 'callback' => [ $this, 'rest_settings_chatbots' ],
35 ) );
36 register_rest_route( $this->namespace, '/settings/themes', array(
37 'methods' => ['GET', 'POST'],
38 'permission_callback' => [ $this->core, 'can_access_settings' ],
39 'callback' => [ $this, 'rest_settings_themes' ],
40 ) );
41
42 // System Endpoints
43 register_rest_route( $this->namespace, '/system/logs/list', array(
44 'methods' => 'POST',
45 'permission_callback' => [ $this->core, 'can_access_settings' ],
46 'callback' => [ $this, 'rest_system_logs_list' ],
47 ) );
48 register_rest_route( $this->namespace, '/system/logs/delete', array(
49 'methods' => 'POST',
50 'permission_callback' => [ $this->core, 'can_access_settings' ],
51 'callback' => [ $this, 'rest_system_logs_delete' ],
52 ) );
53 register_rest_route( $this->namespace, '/system/logs/meta', array(
54 'methods' => 'POST',
55 'permission_callback' => [ $this->core, 'can_access_settings' ],
56 'callback' => [ $this, 'rest_system_logs_meta_get' ],
57 ) );
58 register_rest_route( $this->namespace, '/system/templates', array(
59 'methods' => 'POST',
60 'permission_callback' => [ $this->core, 'can_access_features' ],
61 'callback' => [ $this, 'rest_system_templates_save' ],
62 ) );
63 register_rest_route( $this->namespace, '/system/templates', array(
64 'methods' => 'GET',
65 'permission_callback' => [ $this->core, 'can_access_features' ],
66 'callback' => [ $this, 'rest_system_templates_get' ],
67 ) );
68
69 // AI Endpoints
70 register_rest_route( $this->namespace, '/ai/completions', array(
71 'methods' => 'POST',
72 'permission_callback' => [ $this->core, 'can_access_features' ],
73 'callback' => [ $this, 'rest_ai_completions' ],
74 ) );
75 register_rest_route( $this->namespace, '/ai/images', array(
76 'methods' => 'POST',
77 'permission_callback' => [ $this->core, 'can_access_features' ],
78 'callback' => [ $this, 'rest_ai_images' ],
79 ) );
80 register_rest_route( $this->namespace, '/ai/copilot', array(
81 'methods' => 'POST',
82 'permission_callback' => [ $this->core, 'can_access_features' ],
83 'callback' => [ $this, 'rest_ai_copilot' ],
84 ) );
85
86 register_rest_route( $this->namespace, '/ai/magic_wand', array(
87 'methods' => 'POST',
88 'callback' => [ $this, 'rest_ai_magic_wand' ],
89 'permission_callback' => [ $this->core, 'can_access_features' ],
90 ) );
91 register_rest_route( $this->namespace, '/ai/moderate', array(
92 'methods' => 'POST',
93 'permission_callback' => [ $this->core, 'can_access_settings' ],
94 'callback' => [ $this, 'rest_ai_moderate' ],
95 ) );
96 register_rest_route( $this->namespace, '/ai/transcribe_audio', array(
97 'methods' => 'POST',
98 'permission_callback' => [ $this->core, 'can_access_settings' ],
99 'callback' => [ $this, 'rest_ai_transcribe_audio' ],
100 ) );
101 register_rest_route( $this->namespace, '/ai/transcribe_image', array(
102 'methods' => 'POST',
103 'permission_callback' => [ $this->core, 'can_access_settings' ],
104 'callback' => [ $this, 'rest_ai_transcribe_image' ],
105 ) );
106 register_rest_route( $this->namespace, '/ai/json', array(
107 'methods' => 'POST',
108 'permission_callback' => [ $this->core, 'can_access_settings' ],
109 'callback' => [ $this, 'rest_ai_json' ],
110 ) );
111
112 // Helpers Endpoints
113 register_rest_route( $this->namespace, '/helpers/update_post_title', array(
114 'methods' => 'POST',
115 'permission_callback' => [ $this->core, 'can_access_features' ],
116 'callback' => [ $this, 'rest_helpers_update_title' ],
117 ) );
118 register_rest_route( $this->namespace, '/helpers/update_post_excerpt', array(
119 'methods' => 'POST',
120 'permission_callback' => [ $this->core, 'can_access_features' ],
121 'callback' => [ $this, 'rest_helpers_update_excerpt' ],
122 ) );
123 register_rest_route( $this->namespace, '/helpers/create_post', array(
124 'methods' => 'POST',
125 'permission_callback' => [ $this->core, 'can_access_features' ],
126 'callback' => [ $this, 'rest_helpers_create_post' ],
127 ) );
128 register_rest_route( $this->namespace, '/helpers/create_image', array(
129 'methods' => 'POST',
130 'permission_callback' => [ $this->core, 'can_access_features' ],
131 'callback' => [ $this, 'rest_helpers_create_images' ],
132 ) );
133 register_rest_route( $this->namespace, '/helpers/count_posts', array(
134 'methods' => 'GET',
135 'permission_callback' => [ $this->core, 'can_access_features' ],
136 'callback' => [ $this, 'rest_helpers_count_posts' ],
137 ) );
138 register_rest_route( $this->namespace, '/helpers/post_types', array(
139 'methods' => 'GET',
140 'permission_callback' => [ $this->core, 'can_access_features' ],
141 'callback' => [ $this, 'rest_helpers_post_types' ],
142 ) );
143 register_rest_route( $this->namespace, '/helpers/post_content', array(
144 'methods' => 'GET',
145 'permission_callback' => [ $this->core, 'can_access_features' ],
146 'callback' => [ $this, 'rest_helpers_post_content' ],
147 ) );
148
149 // OpenAI Endpoints
150 register_rest_route( $this->namespace, '/openai/files/list', array(
151 'methods' => 'GET',
152 'permission_callback' => [ $this->core, 'can_access_settings' ],
153 'callback' => [ $this, 'rest_openai_files_get' ],
154 ) );
155 register_rest_route( $this->namespace, '/openai/files/upload', array(
156 'methods' => 'POST',
157 'permission_callback' => [ $this->core, 'can_access_settings' ],
158 'callback' => [ $this, 'rest_openai_files_upload' ],
159 ) );
160 register_rest_route( $this->namespace, '/openai/files/delete', array(
161 'methods' => 'POST',
162 'permission_callback' => [ $this->core, 'can_access_settings' ],
163 'callback' => [ $this, 'rest_openai_files_delete' ],
164 ) );
165 register_rest_route( $this->namespace, '/openai/files/download', array(
166 'methods' => 'POST',
167 'permission_callback' => [ $this->core, 'can_access_settings' ],
168 'callback' => [ $this, 'rest_openai_files_download' ],
169 ) );
170 register_rest_route( $this->namespace, '/openai/files/finetune', array(
171 'methods' => 'POST',
172 'permission_callback' => [ $this->core, 'can_access_settings' ],
173 'callback' => [ $this, 'rest_openai_files_finetune' ],
174 ) );
175 register_rest_route( $this->namespace, '/openai/finetunes/list_deleted', array(
176 'methods' => 'GET',
177 'permission_callback' => [ $this->core, 'can_access_settings' ],
178 'callback' => [ $this, 'rest_openai_deleted_finetunes_get' ],
179 ) );
180
181 // register_rest_route( $this->namespace, '/openai/models', array(
182 // 'methods' => 'GET',
183 // 'permission_callback' => [ $this->core, 'can_access_settings' ],
184 // 'callback' => [ $this, 'rest_openai_models_get' ],
185 // ) );
186
187 register_rest_route( $this->namespace, '/openai/finetunes/list', array(
188 'methods' => 'GET',
189 'permission_callback' => [ $this->core, 'can_access_settings' ],
190 'callback' => [ $this, 'rest_openai_finetunes_get' ],
191 ) );
192 register_rest_route( $this->namespace, '/openai/finetunes/delete', array(
193 'methods' => 'POST',
194 'permission_callback' => [ $this->core, 'can_access_settings' ],
195 'callback' => [ $this, 'rest_openai_finetunes_delete' ],
196 ) );
197 register_rest_route( $this->namespace, '/openai/finetunes/cancel', array(
198 'methods' => 'POST',
199 'permission_callback' => [ $this->core, 'can_access_settings' ],
200 'callback' => [ $this, 'rest_openai_finetunes_cancel' ],
201 ) );
202 register_rest_route( $this->namespace, '/openai/incidents', array(
203 'methods' => 'GET',
204 'permission_callback' => [ $this->core, 'can_access_settings' ],
205 'callback' => [ $this, 'rest_openai_incidents' ],
206 ) );
207 }
208 catch ( Exception $e ) {
209 var_dump( $e );
210 }
211 }
212
213 function rest_settings_list() {
214 return new WP_REST_Response( [
215 'success' => true,
216 'options' => $this->core->get_all_options()
217 ], 200 );
218 }
219
220 function rest_settings_update( $request ) {
221 try {
222 $params = $request->get_json_params();
223 $value = $params['options'];
224 $options = $this->core->update_options( $value );
225 $success = !!$options;
226 $message = __( $success ? 'OK' : "Could not update options.", 'ai-engine' );
227 return new WP_REST_Response([ 'success' => $success, 'message' => $message, 'options' => $options ], 200 );
228 }
229 catch ( Exception $e ) {
230 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
231 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
232 }
233 }
234
235 function rest_settings_reset() {
236 try {
237 $options = $this->core->reset_options();
238 $success = !!$options;
239 $message = __( $success ? 'OK' : "Could not reset options.", 'ai-engine' );
240 return new WP_REST_Response([ 'success' => $success, 'message' => $message, 'options' => $options ], 200 );
241 }
242 catch ( Exception $e ) {
243 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
244 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
245 }
246 }
247
248 function createValidationResult( $result = true, $message = null) {
249 $message = $message ? $message : __( 'OK', 'ai-engine' );
250 return [ 'result' => $result, 'message' => $message ];
251 }
252
253 function validate_updated_option( $option_name ) {
254 $option_checkbox = get_option( 'mwai_option_checkbox', false );
255 $option_text = get_option( 'mwai_option_text', 'Default' );
256 if ( $option_checkbox === '' )
257 update_option( 'mwai_option_checkbox', false );
258 if ( $option_text === '' )
259 update_option( 'mwai_option_text', 'Default' );
260 return $this->createValidationResult();
261 }
262
263 function rest_ai_completions( $request ) {
264 try {
265 $params = $request->get_json_params();
266 $prompt = $params['prompt'];
267 $query = new Meow_MWAI_Query_Text( $prompt );
268 $query->injectParams( $params );
269
270 // Handle streaming
271 $stream = $params['stream'] ?? false;
272 $streamCallback = null;
273 if ( $stream ) {
274 $streamCallback = function( $reply ) {
275 //$raw = _wp_specialchars( $reply, ENT_NOQUOTES, 'UTF-8', true );
276 $raw = $reply;
277 $this->core->stream_push( [ 'type' => 'live', 'data' => $raw ] );
278 if ( ob_get_level() > 0 ) {
279 ob_flush();
280 }
281 flush();
282 };
283 header( 'Cache-Control: no-cache' );
284 header( 'Content-Type: text/event-stream' );
285 header( 'X-Accel-Buffering: no' ); // This is useful to disable buffering in nginx through headers.
286 ob_implicit_flush( true );
287 ob_end_flush();
288 }
289
290 // Process Reply
291 $reply = $this->core->ai->run( $query, $streamCallback );
292 $restRes = [
293 'success' => true,
294 'data' => $reply->result,
295 'usage' => $reply->usage
296 ];
297 if ( $stream ) {
298 $this->core->stream_push( [ 'type' => 'end', 'data' => json_encode( $restRes ) ] );
299 die();
300 }
301 return new WP_REST_Response( $restRes, 200 );
302 }
303 catch ( Exception $e ) {
304 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
305 if ( $stream ) {
306 $this->core->stream_push( [ 'type' => 'error', 'data' => $message ] );
307 }
308 else {
309 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
310 }
311 }
312 }
313
314 function rest_ai_images( $request ) {
315 try {
316 $params = $request->get_json_params();
317 $prompt = $params['prompt'];
318 $query = new Meow_MWAI_Query_Image( $prompt );
319 $query->injectParams( $params );
320 $reply = $this->core->ai->run( $query );
321 return new WP_REST_Response([ 'success' => true, 'data' => $reply->results, 'usage' => $reply->usage ], 200 );
322 }
323 catch ( Exception $e ) {
324 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
325 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
326 }
327 }
328
329 function rest_ai_magic_wand( $request ) {
330 try {
331 $params = $request->get_json_params();
332 $action = isset( $params['action'] ) ? $params['action'] : null;
333 $data = isset( $params['data'] ) ? $params['data'] : null;
334 if ( empty( $data ) || empty( $action ) ) {
335 return new WP_REST_Response([ 'success' => false, 'message' => "An action and some data are required." ], 500 );
336 }
337 $postId = isset( $data['postId'] ) ? $data['postId'] : null;
338 $text = isset( $data['text'] ) ? $data['text'] : null;
339 $selectedText = isset( $data['selectedText'] ) ? $data['selectedText'] : null;
340
341 // NOTE: As soon as we have a wide range of usages and possibilities,
342 // let's refactor this into a nice and extensible UI/API.
343 $query = new Meow_MWAI_Query_Text( "", 1024 );
344 $query->setEnv( 'admin-tools' );
345 // TODO: We should also use the envId (as the model belongs to it)
346 $model = $this->core->get_option( 'ai_default_model' );
347 if ( !empty( $model ) ) {
348 $query->setModel( $model );
349 }
350 $mode = 'replace';
351
352 $language = "";
353 $keepLanguage = "";
354 if ( !empty( $postId ) ) {
355 $language = $this->core->get_post_language( $postId );
356 $keepLanguage = " Ensure the reply is in the same language as the original text ({$language}).";
357 }
358
359 if ( $action === 'correctText' ) {
360 $query->setPrompt( "Correct the typos and grammar mistakes in this text without altering its content. Return only the corrected text, without explanations or additional content.{$keepLanguage}\n\n" . $text );
361 }
362 else if ( $action === 'enhanceText' ) {
363 $query->setPrompt( "Enhance this text by eliminating redundancies, utilizing a more suitable vocabulary, and refining its structure. Provide only the revised text, without explanations or any additional content.{$keepLanguage}\n\n" . $text );
364 }
365 else if ( $action === 'longerText' ) {
366 $query->setPrompt( "Expand the subsequent text to a minimum of three times its original length, integrating relevant and accurate information to enrich its content. If the text is a story, amplify its charm by elaborating on essential aspects, enhancing readability, and creating a sense of engagement for the reader. Maintain consistency in tone and vocabulary throughout the expansion process.{$keepLanguage}\n\n" . $text );
367 }
368 else if ( $action === 'shorterText' ) {
369 $query->setPrompt( "Condense the following text by reducing its length to half, while retaining the core elements of the original narrative. Focus on maintaining the essence of the story and its key details.{$keepLanguage}\n\n" . $text );
370 }
371 else if ( $action === 'suggestSynonyms' ) {
372 $mode = 'suggest';
373 $query->setPrompt( "Provide a synonym or rephrase the given word or sentence while retaining the original meaning and preserving the initial and final punctuation. Offer only the resulting word or expression, without additional context. If a suitable synonym or alternative cannot be identified, ensure that a creative response is still provided.{$keepLanguage}\n\n" . $selectedText );
374 $query->setTemperature( 1 );
375 $query->setMaxResults( 5 );
376 }
377 else if ( $action === 'translateText' ) {
378 $query->setPrompt( "Translate the text into {$language}, preserving the tone, mood, and nuance, while staying as true as possible to the original meaning. Provide only the translated text, without any additional content.\n\n" . $text );
379 }
380 else if ( $action === 'suggestExcerpts' ) {
381 $text = $this->core->getCleanPostContent( $postId );
382 $query->setPrompt( "Craft a clear, SEO-optimized introduction for the following text, using 120 to 170 characters. Ensure the introduction is concise and relevant, without including any URLs.{$keepLanguage}\n\n" . $text );
383 $query->setMaxResults( 5 );
384 }
385 else if ( $action === 'suggestTitles' ) {
386 $text = $this->core->getCleanPostContent( $postId );
387 $query->setPrompt( "Generate a concise, SEO-optimized title for the following text, without using quotes or any other formatting. Focus on clarity and relevance to the content.{$keepLanguage}\n\n" . $text );
388 $query->setMaxResults( 5 );
389 }
390 $reply = $this->core->ai->run( $query );
391 return new WP_REST_Response([ 'success' => true, 'data' => [
392 'mode' => $mode,
393 'result' => $reply->result,
394 'results' => $reply->results
395 ] ], 200 );
396 }
397 catch ( Exception $e ) {
398 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
399 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
400 }
401 }
402
403 function rest_ai_copilot( $request ) {
404 try {
405 $params = $request->get_json_params();
406 $action = sanitize_text_field( $params['action'] );
407 $prompt = sanitize_text_field( $params['prompt'] );
408 if ( empty( $action ) || empty( $prompt ) ) {
409 return new WP_REST_Response([ 'success' => false, 'message' => "Copilot needs an action and a prompt." ], 500 );
410 }
411 $query = new Meow_MWAI_Query_Text( $prompt, 2048 );
412 $query->setEnv( 'admin-tools' );
413 // TODO: We should also use the envId (as the model belongs to it)
414 $model = $this->core->get_option( 'ai_default_model' );
415 if ( !empty( $model ) ) {
416 $query->setModel( $model );
417 }
418 $reply = $this->core->ai->run( $query );
419 return new WP_REST_Response([ 'success' => true, 'data' => $reply->result ], 200 );
420 }
421 catch ( Exception $e ) {
422 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
423 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
424 }
425 }
426
427 function rest_helpers_update_title( $request ) {
428 try {
429 $params = $request->get_json_params();
430 $title = sanitize_text_field( $params['title'] );
431 $postId = intval( $params['postId'] );
432 $post = get_post( $postId );
433 if ( !$post ) {
434 throw new Exception( 'There is no post with this ID.' );
435 }
436 $post->post_title = $title;
437 //$post->post_name = sanitize_title( $title );
438 wp_update_post( $post );
439 return new WP_REST_Response([ 'success' => true, 'message' => "Title updated." ], 200 );
440 }
441 catch ( Exception $e ) {
442 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
443 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
444 }
445 }
446
447 function rest_helpers_update_excerpt( $request ) {
448 try {
449 $params = $request->get_json_params();
450 $excerpt = sanitize_text_field( $params['excerpt'] );
451 $postId = intval( $params['postId'] );
452 $post = get_post( $postId );
453 if ( !$post ) {
454 throw new Exception( 'There is no post with this ID.' );
455 }
456 $post->post_excerpt = $excerpt;
457 wp_update_post( $post );
458 return new WP_REST_Response([ 'success' => true, 'message' => "Excerpt updated." ], 200 );
459 }
460 catch ( Exception $e ) {
461 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
462 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
463 }
464 }
465
466 function rest_helpers_create_post( $request ) {
467 try {
468 $params = $request->get_json_params();
469 $title = sanitize_text_field( $params['title'] );
470 $content = sanitize_textarea_field( $params['content'] );
471 $excerpt = sanitize_text_field( $params['excerpt'] );
472 $postType = sanitize_text_field( $params['postType'] );
473 $post = new stdClass();
474 $post->post_title = $title;
475 $post->post_excerpt = $excerpt;
476 $post->post_content = $content;
477 $post->post_status = 'draft';
478 $post->post_type = isset( $postType ) ? $postType : 'post';
479 $post->post_content = $this->core->markdown_to_html( $post->post_content );
480 $postId = wp_insert_post( $post );
481 return new WP_REST_Response([ 'success' => true, 'postId' => $postId ], 200 );
482 }
483 catch ( Exception $e ) {
484 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
485 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
486 }
487 }
488
489 function image_download( $url ) {
490 $args = array( 'timeout' => 60, );
491 $response = wp_remote_get( $url, $args );
492 if ( is_wp_error( $response ) ) {
493 throw new Exception( $response->get_error_message() );
494 }
495 $output = wp_remote_retrieve_body( $response );
496 if ( is_wp_error( $output ) ) {
497 throw new Exception( $output->get_error_message() );
498 }
499 return $output;
500 }
501
502 function rest_helpers_create_images( $request ) {
503 try {
504 $params = $request->get_json_params();
505 $title = sanitize_text_field( $params['title'] );
506 $caption = sanitize_text_field( $params['caption'] );
507 $alt = sanitize_text_field( $params['alt'] );
508 $description = sanitize_text_field( $params['description'] );
509 $url = $params['url'];
510 $filename = sanitize_text_field( $params['filename'] );
511 $image_data = $this->image_download( $url );
512 if ( !$image_data ) {
513 throw new Exception( 'Could not download the image.' );
514 }
515 $upload_dir = wp_upload_dir();
516 if ( empty( $filename ) ) {
517 $filename = basename( $url );
518 }
519 $wp_filetype = wp_check_filetype( $filename );
520 if ( wp_mkdir_p( $upload_dir['path'] ) ) {
521 $file = $upload_dir['path'] . '/' . $filename;
522 }
523 else {
524 $file = $upload_dir['basedir'] . '/' . $filename;
525 }
526
527 // Make sure the file is unique, if not, add a number to the end of the file before the extension
528 $i = 1;
529 $parts = pathinfo( $file );
530 while ( file_exists( $file ) ) {
531 $file = $parts['dirname'] . '/' . $parts['filename'] . '-' . $i . '.' . $parts['extension'];
532 $i++;
533 }
534
535 // Write the file
536 file_put_contents( $file, $image_data );
537 $attachment = [
538 'post_mime_type' => $wp_filetype['type'],
539 'post_title' => $title,
540 'post_content' => $description,
541 'post_excerpt' => $caption,
542 'post_status' => 'inherit'
543 ];
544 // Register the file as a Media Library attachment
545 $attachmentId = wp_insert_attachment( $attachment, $file );
546 require_once( ABSPATH . 'wp-admin/includes/image.php' );
547 $attachment_data = wp_generate_attachment_metadata( $attachmentId, $file );
548 wp_update_attachment_metadata( $attachmentId, $attachment_data );
549 update_post_meta( $attachmentId, '_wp_attachment_image_alt', $alt );
550 return new WP_REST_Response([ 'success' => true, 'attachmentId' => $attachmentId ], 200 );
551 }
552 catch ( Exception $e ) {
553 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
554 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
555 }
556 }
557
558 function rest_openai_files_get() {
559 try {
560 $envId = isset( $_GET['envId'] ) ? $_GET['envId'] : null;
561 $openai = new Meow_MWAI_Engines_OpenAI( $this->core, $envId );
562 $files = $openai->list_files();
563 return new WP_REST_Response([ 'success' => true, 'files' => $files ], 200 );
564 }
565 catch ( Exception $e ) {
566 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
567 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
568 }
569 }
570
571 // function rest_openai_models_get() {
572 // try {
573 // $openai = new Meow_MWAI_Engines_OpenAI( $this->core );
574 // $finetunes = $openai->listModels();
575 // return new WP_REST_Response([ 'success' => true, 'finetunes' => $finetunes ], 200 );
576 // }
577 // catch ( Exception $e ) {
578 // $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
579 // return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
580 // }
581 // }
582
583 function rest_openai_deleted_finetunes_get() {
584 try {
585 $envId = isset( $_GET['envId'] ) ? $_GET['envId'] : null;
586 $legacy = isset( $_GET['legacy'] ) ? $_GET['legacy'] === 'true' : false;
587 $openai = new Meow_MWAI_Engines_OpenAI( $this->core, $envId );
588 $finetunes = $openai->list_deleted_finetunes( $legacy );
589 return new WP_REST_Response([ 'success' => true, 'finetunes' => $finetunes ], 200 );
590 }
591 catch ( Exception $e ) {
592 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
593 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
594 }
595 }
596
597 function rest_openai_finetunes_get() {
598 try {
599 $envId = isset( $_GET['envId'] ) ? $_GET['envId'] : null;
600 $legacy = isset( $_GET['legacy'] ) ? $_GET['legacy'] === 'true' : false;
601 $openai = new Meow_MWAI_Engines_OpenAI( $this->core, $envId );
602 $finetunes = $openai->list_finetunes( $legacy );
603 return new WP_REST_Response([ 'success' => true, 'finetunes' => $finetunes ], 200 );
604 }
605 catch ( Exception $e ) {
606 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
607 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
608 }
609 }
610
611 function rest_openai_files_upload( $request ) {
612 try {
613 $params = $request->get_json_params();
614 $envId = $params['envId'];;
615 $filename = sanitize_text_field( $params['filename'] );
616 $data = $params['data'];
617 $openai = new Meow_MWAI_Engines_OpenAI( $this->core, $envId );
618 $file = $openai->upload_file( $filename, $data );
619 return new WP_REST_Response([ 'success' => true, 'file' => $file ], 200 );
620 }
621 catch ( Exception $e ) {
622 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
623 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
624 }
625 }
626
627 function rest_openai_files_delete( $request ) {
628 try {
629 $params = $request->get_json_params();
630 $envId = $params['envId'];;
631 $fileId = $params['fileId'];
632 $openai = new Meow_MWAI_Engines_OpenAI( $this->core, $envId );
633 $openai->delete_file( $fileId );
634 return new WP_REST_Response([ 'success' => true ], 200 );
635 }
636 catch ( Exception $e ) {
637 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
638 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
639 }
640 }
641
642 function rest_openai_finetunes_cancel( $request ) {
643 try {
644 $params = $request->get_json_params();
645 $envId = $params['envId'];;
646 $finetuneId = $params['finetuneId'];
647 $openai = new Meow_MWAI_Engines_OpenAI( $this->core, $envId );
648 $openai->cancel_finetune( $finetuneId );
649 return new WP_REST_Response([ 'success' => true ], 200 );
650 }
651 catch ( Exception $e ) {
652 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
653 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
654 }
655 }
656
657 function rest_openai_finetunes_delete( $request ) {
658 try {
659 $params = $request->get_json_params();
660 $envId = $params['envId'];;
661 $modelId = $params['modelId'];
662 $openai = new Meow_MWAI_Engines_OpenAI( $this->core, $envId );
663 $openai->delete_finetune( $modelId );
664 return new WP_REST_Response([ 'success' => true ], 200 );
665 }
666 catch ( Exception $e ) {
667 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
668 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
669 }
670 }
671
672 function rest_openai_files_download( $request ) {
673 try {
674 $params = $request->get_json_params();
675 $envId = $params['envId'];;
676 $fileId = $params['fileId'];
677 $openai = new Meow_MWAI_Engines_OpenAI( $this->core, $envId );
678 $data = $openai->download_file( $fileId );
679 return new WP_REST_Response([ 'success' => true, 'data' => $data ], 200 );
680 }
681 catch ( Exception $e ) {
682 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
683 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
684 }
685 }
686
687 function rest_openai_files_finetune( $request ) {
688 try {
689 $params = $request->get_json_params();
690 $envId = $params['envId'];;
691 $fileId = $params['fileId'];
692 $model = $params['model'];
693 $suffix = $params['suffix'];
694 $hyperparams = [
695 "nEpochs" => $params['nEpochs'],
696 "batchSize" => $params['batchSize']
697 ];
698 $openai = new Meow_MWAI_Engines_OpenAI( $this->core, $envId );
699 $finetune = $openai->run_finetune( $fileId, $model, $suffix, $hyperparams );
700 return new WP_REST_Response([ 'success' => true, 'finetune' => $finetune ], 200 );
701 }
702 catch ( Exception $e ) {
703 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
704 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
705 }
706 }
707
708 function rest_openai_incidents() {
709 try {
710 $transient = get_transient( 'mwai_openai_incidents' );
711 if ( $transient ) {
712 return new WP_REST_Response([ 'success' => true, 'incidents' => $transient ], 200 );
713 }
714 $openai = new Meow_MWAI_Engines_OpenAI( $this->core );
715 $incidents = $openai->get_incidents();
716 set_transient( 'mwai_openai_incidents', $incidents, 60 * 10 );
717 return new WP_REST_Response([ 'success' => true, 'incidents' => $incidents ], 200 );
718 }
719 catch ( Exception $e ) {
720 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
721 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
722 }
723 }
724
725 function rest_helpers_count_posts( $request ) {
726 try {
727 $params = $request->get_query_params();
728 $postType = $params['postType'];
729 $postStatus = $params['postStatus'];
730 $postStatus = !empty( $params['postStatus'] ) ? explode( ',', $postStatus ) : [ 'publish' ];
731 $count = wp_count_posts( $postType );
732 $count = array_sum( array_intersect_key( (array)$count, array_flip( $postStatus ) ) );
733 return new WP_REST_Response([ 'success' => true, 'count' => $count ], 200 );
734 }
735 catch ( Exception $e ) {
736 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
737 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
738 }
739 }
740
741 function rest_helpers_post_content( $request ) {
742 try {
743 $params = $request->get_query_params();
744 $offset = (int)$params['offset'];
745 $postType = $params['postType'];
746 $postStatus = $params['postStatus'];
747 $postStatus = !empty( $params['postStatus'] ) ? explode( ',', $postStatus ) : [ 'publish' ];
748 $postId = (int)$params['postId'];
749
750 $post = null;
751 if ( !empty( $postId ) ) {
752 $post = get_post( $postId );
753 if ( $post->post_status !== 'publish' && $post->post_status !== 'future'
754 && $post->post_status !== 'draft' && $post->post_status !== 'private' ) {
755 $post = null;
756 }
757 }
758 else {
759 $posts = get_posts( [
760 'posts_per_page' => 1,
761 'post_type' => $postType,
762 'offset' => $offset,
763 'post_status' => $postStatus,
764 ] );
765 $post = count( $posts ) === 0 ? null : $posts[0];
766 }
767 if ( !$post ) {
768 return new WP_REST_Response([ 'success' => false, 'message' => 'Post not found' ], 404 );
769 }
770 $cleanPost = $this->core->getCleanPost( $post );
771 return new WP_REST_Response([ 'success' => true, 'content' => $cleanPost['content'],
772 'checksum' => $cleanPost['checksum'], 'language' => $cleanPost['language'], 'excerpt' => $cleanPost['excerpt'],
773 'postId' => $cleanPost['postId'], 'title' => $cleanPost['title'], 'url' => $cleanPost['url'] ], 200 );
774 }
775 catch ( Exception $e ) {
776 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
777 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
778 }
779 }
780
781 function rest_system_templates_get( $request ) {
782 try {
783 $params = $request->get_query_params();
784 $category = $params['category'];
785 $templates = [];
786 $templates_option = get_option( 'mwai_templates', [] );
787 if ( !is_array( $templates_option ) ) {
788 update_option( 'mwai_templates', [] );
789 }
790 $categories = array_column( $templates_option, 'category' );
791 $index = array_search( $category, $categories );
792 $templates = [];
793 if ( $index !== false ) {
794 $templates = $templates_option[$index]['templates'];
795 }
796 return new WP_REST_Response([ 'success' => true, 'templates' => $templates ], 200 );
797 }
798 catch ( Exception $e ) {
799 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
800 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
801 }
802 }
803
804 function rest_system_templates_save( $request ) {
805 try {
806 $params = $request->get_json_params();
807 $category = $params['category'];
808 $templates = $params['templates'];
809 $templates_option = get_option( 'mwai_templates', [] );
810 $categories = array_column( $templates_option, 'category' );
811 $index = array_search( $category, $categories );
812 if ( $index !== false && $index >= 0 ) {
813 $templates_option[$index]['templates'] = $templates;
814 }
815 else {
816 $group = [ 'category' => $category, 'templates' => $templates ];
817 $templates_option[] = $group;
818 }
819
820 update_option( 'mwai_templates', $templates_option );
821 return new WP_REST_Response([ 'success' => true ], 200 );
822 }
823 catch ( Exception $e ) {
824 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
825 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
826 }
827 }
828
829 function rest_system_logs_list( $request ) {
830 try {
831 $params = $request->get_json_params();
832 $offset = $params['offset'];
833 $limit = $params['limit'];
834 $filters = $params['filters'];
835 $sort = $params['sort'];
836 $logs = apply_filters( 'mwai_stats_logs', [], $offset, $limit, $filters, $sort );
837 return new WP_REST_Response([ 'success' => true, 'total' => $logs['total'], 'logs' => $logs['rows'] ], 200 );
838 }
839 catch ( Exception $e ) {
840 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
841 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
842 }
843 }
844
845 function rest_system_logs_delete( $request ) {
846 try {
847 $params = $request->get_json_params();
848 $logIds = $params['logIds'];
849 $success = apply_filters( 'mwai_stats_logs_delete', true, $logIds );
850 return new WP_REST_Response([ 'success' => $success ], 200 );
851 }
852 catch ( Exception $e ) {
853 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
854 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
855 }
856 }
857
858 function rest_system_logs_meta_get( $request ) {
859 try {
860 $params = $request->get_json_params();
861 $logId = $params['logId'];
862 $metaKeys = $params['metaKeys'];
863 $data = apply_filters( 'mwai_stats_logs_meta', [], $logId, $metaKeys );
864 return new WP_REST_Response([ 'success' => true, 'data' => $data ], 200 );
865 }
866 catch ( Exception $e ) {
867 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
868 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
869 }
870 }
871
872 function rest_ai_moderate( $request ) {
873 try {
874 $params = $request->get_json_params();
875 $envId = $params['envId'];
876 $text = $params['text'];
877 if ( !$text ) {
878 return new WP_REST_Response([ 'success' => false, 'message' => 'Text not found.' ], 404 );
879 }
880 $openai = new Meow_MWAI_Engines_OpenAI( $this->core, $envId );
881 $results = $openai->moderate( $text );
882 return new WP_REST_Response([ 'success' => true, 'results' => $results ], 200 );
883 }
884 catch ( Exception $e ) {
885 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
886 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
887 }
888 }
889
890 function rest_ai_transcribe_audio( $request ) {
891 try {
892 $params = $request->get_json_params();
893 $query = new Meow_MWAI_Query_Transcribe();
894 $query->injectParams( $params );
895 $query->setEnv('admin-tools');
896 $reply = $this->core->ai->run( $query );
897 return new WP_REST_Response([ 'success' => true, 'data' => $reply->result ], 200 );
898 }
899 catch ( Exception $e ) {
900 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
901 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
902 }
903 }
904
905 function rest_ai_transcribe_image( $request ) {
906 try {
907 global $mwai;
908 $params = $request->get_json_params();
909 $prompt = !empty( $params['prompt'] ) ? $params['prompt'] : null;
910 $url = !empty( $params['url'] ) ? $params['url'] : null;
911 $path = !empty( $params['path'] ) ? $params['path'] : null;
912 $result = $mwai->simpleVisionQuery( $prompt, $url, $path );
913 return new WP_REST_Response([ 'success' => true, 'data' => $result ], 200 );
914 }
915 catch ( Exception $e ) {
916 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
917 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
918 }
919 }
920
921 function rest_ai_json( $request ) {
922 try {
923 global $mwai;
924 $params = $request->get_json_params();
925 $prompt = !empty( $params['prompt'] ) ? $params['prompt'] : null;
926 $result = $mwai->simpleJsonQuery( $prompt );
927 return new WP_REST_Response([ 'success' => true, 'data' => $result ], 200 );
928 }
929 catch ( Exception $e ) {
930 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
931 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
932 }
933 }
934
935 function rest_helpers_post_types() {
936 try {
937 $postTypes = $this->core->getPostTypes();
938 return new WP_REST_Response([ 'success' => true, 'postTypes' => $postTypes ], 200 );
939 }
940 catch ( Exception $e ) {
941 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
942 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
943 }
944 }
945
946 function rest_settings_themes( $request ) {
947 try {
948 $method = $request->get_method();
949 if ( $method === 'GET' ) {
950 $themes = $this->core->getThemes();
951 return new WP_REST_Response([ 'success' => true, 'themes' => $themes ], 200 );
952 }
953 else if ( $method === 'POST' ) {
954 $params = $request->get_json_params();
955 $themes = $params['themes'];
956 $themes = $this->core->updateThemes( $themes );
957 return new WP_REST_Response([ 'success' => true, 'themes' => $themes ], 200 );
958 }
959 }
960 catch ( Exception $e ) {
961 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
962 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
963 }
964 }
965
966 function rest_settings_chatbots( $request ) {
967 try {
968 $method = $request->get_method();
969 if ( $method === 'GET' ) {
970 $chatbots = $this->core->getChatbots();
971 return new WP_REST_Response([ 'success' => true, 'chatbots' => $chatbots ], 200 );
972 }
973 else if ( $method === 'POST' ) {
974 $params = $request->get_json_params();
975 $chatbots = $params['chatbots'];
976 $chatbots = $this->core->updateChatbots( $chatbots );
977 return new WP_REST_Response([ 'success' => true, 'chatbots' => $chatbots ], 200 );
978 }
979 return new WP_REST_Response([ 'success' => false, 'message' => 'Method not allowed' ], 405 );
980 }
981 catch ( Exception $e ) {
982 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
983 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
984 }
985 }
986 }
987