PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 2.2.95
AI Engine – The Chatbot, AI Framework & MCP for WordPress v2.2.95
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
903 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/options', 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/models', array(
71 'methods' => 'POST',
72 'permission_callback' => [ $this->core, 'can_access_features' ],
73 'callback' => [ $this, 'rest_ai_models' ],
74 ) );
75 register_rest_route( $this->namespace, '/ai/completions', array(
76 'methods' => 'POST',
77 'permission_callback' => [ $this->core, 'can_access_features' ],
78 'callback' => [ $this, 'rest_ai_completions' ],
79 ) );
80 register_rest_route( $this->namespace, '/ai/images', array(
81 'methods' => 'POST',
82 'permission_callback' => [ $this->core, 'can_access_features' ],
83 'callback' => [ $this, 'rest_ai_images' ],
84 ) );
85 register_rest_route( $this->namespace, '/ai/copilot', array(
86 'methods' => 'POST',
87 'permission_callback' => [ $this->core, 'can_access_features' ],
88 'callback' => [ $this, 'rest_ai_copilot' ],
89 ) );
90
91 register_rest_route( $this->namespace, '/ai/magic_wand', array(
92 'methods' => 'POST',
93 'callback' => [ $this, 'rest_ai_magic_wand' ],
94 'permission_callback' => [ $this->core, 'can_access_features' ],
95 ) );
96 register_rest_route( $this->namespace, '/ai/moderate', array(
97 'methods' => 'POST',
98 'permission_callback' => [ $this->core, 'can_access_settings' ],
99 'callback' => [ $this, 'rest_ai_moderate' ],
100 ) );
101 register_rest_route( $this->namespace, '/ai/transcribe_audio', array(
102 'methods' => 'POST',
103 'permission_callback' => [ $this->core, 'can_access_settings' ],
104 'callback' => [ $this, 'rest_ai_transcribe_audio' ],
105 ) );
106 register_rest_route( $this->namespace, '/ai/transcribe_image', array(
107 'methods' => 'POST',
108 'permission_callback' => [ $this->core, 'can_access_settings' ],
109 'callback' => [ $this, 'rest_ai_transcribe_image' ],
110 ) );
111 register_rest_route( $this->namespace, '/ai/json', array(
112 'methods' => 'POST',
113 'permission_callback' => [ $this->core, 'can_access_settings' ],
114 'callback' => [ $this, 'rest_ai_json' ],
115 ) );
116
117 // Helpers Endpoints
118 register_rest_route( $this->namespace, '/helpers/update_post_title', array(
119 'methods' => 'POST',
120 'permission_callback' => [ $this->core, 'can_access_features' ],
121 'callback' => [ $this, 'rest_helpers_update_title' ],
122 ) );
123 register_rest_route( $this->namespace, '/helpers/update_post_excerpt', array(
124 'methods' => 'POST',
125 'permission_callback' => [ $this->core, 'can_access_features' ],
126 'callback' => [ $this, 'rest_helpers_update_excerpt' ],
127 ) );
128 register_rest_route( $this->namespace, '/helpers/create_post', array(
129 'methods' => 'POST',
130 'permission_callback' => [ $this->core, 'can_access_features' ],
131 'callback' => [ $this, 'rest_helpers_create_post' ],
132 ) );
133 register_rest_route( $this->namespace, '/helpers/create_image', array(
134 'methods' => 'POST',
135 'permission_callback' => [ $this->core, 'can_access_features' ],
136 'callback' => [ $this, 'rest_helpers_create_images' ],
137 ) );
138 register_rest_route( $this->namespace, '/helpers/count_posts', array(
139 'methods' => 'GET',
140 'permission_callback' => [ $this->core, 'can_access_features' ],
141 'callback' => [ $this, 'rest_helpers_count_posts' ],
142 ) );
143 register_rest_route( $this->namespace, '/helpers/posts_ids', array(
144 'methods' => 'GET',
145 'permission_callback' => [ $this->core, 'can_access_features' ],
146 'callback' => [ $this, 'rest_helpers_posts_ids' ],
147 ) );
148 register_rest_route( $this->namespace, '/helpers/post_types', array(
149 'methods' => 'GET',
150 'permission_callback' => [ $this->core, 'can_access_features' ],
151 'callback' => [ $this, 'rest_helpers_post_types' ],
152 ) );
153 register_rest_route( $this->namespace, '/helpers/post_content', array(
154 'methods' => 'GET',
155 'permission_callback' => [ $this->core, 'can_access_features' ],
156 'callback' => [ $this, 'rest_helpers_post_content' ],
157 ) );
158
159 // OpenAI Endpoints
160 register_rest_route( $this->namespace, '/openai/files/list', array(
161 'methods' => 'GET',
162 'permission_callback' => [ $this->core, 'can_access_settings' ],
163 'callback' => [ $this, 'rest_openai_files_get' ],
164 ) );
165 register_rest_route( $this->namespace, '/openai/files/upload', array(
166 'methods' => 'POST',
167 'permission_callback' => [ $this->core, 'can_access_settings' ],
168 'callback' => [ $this, 'rest_openai_files_upload' ],
169 ) );
170 register_rest_route( $this->namespace, '/openai/files/delete', array(
171 'methods' => 'POST',
172 'permission_callback' => [ $this->core, 'can_access_settings' ],
173 'callback' => [ $this, 'rest_openai_files_delete' ],
174 ) );
175 register_rest_route( $this->namespace, '/openai/files/download', array(
176 'methods' => 'POST',
177 'permission_callback' => [ $this->core, 'can_access_settings' ],
178 'callback' => [ $this, 'rest_openai_files_download' ],
179 ) );
180 register_rest_route( $this->namespace, '/openai/files/finetune', array(
181 'methods' => 'POST',
182 'permission_callback' => [ $this->core, 'can_access_settings' ],
183 'callback' => [ $this, 'rest_openai_files_finetune' ],
184 ) );
185 register_rest_route( $this->namespace, '/openai/finetunes/list_deleted', array(
186 'methods' => 'GET',
187 'permission_callback' => [ $this->core, 'can_access_settings' ],
188 'callback' => [ $this, 'rest_openai_deleted_finetunes_get' ],
189 ) );
190
191 // register_rest_route( $this->namespace, '/openai/models', array(
192 // 'methods' => 'GET',
193 // 'permission_callback' => [ $this->core, 'can_access_settings' ],
194 // 'callback' => [ $this, 'rest_openai_models_get' ],
195 // ) );
196
197 register_rest_route( $this->namespace, '/openai/finetunes/list', array(
198 'methods' => 'GET',
199 'permission_callback' => [ $this->core, 'can_access_settings' ],
200 'callback' => [ $this, 'rest_openai_finetunes_get' ],
201 ) );
202 register_rest_route( $this->namespace, '/openai/finetunes/delete', array(
203 'methods' => 'POST',
204 'permission_callback' => [ $this->core, 'can_access_settings' ],
205 'callback' => [ $this, 'rest_openai_finetunes_delete' ],
206 ) );
207 register_rest_route( $this->namespace, '/openai/finetunes/cancel', array(
208 'methods' => 'POST',
209 'permission_callback' => [ $this->core, 'can_access_settings' ],
210 'callback' => [ $this, 'rest_openai_finetunes_cancel' ],
211 ) );
212 register_rest_route( $this->namespace, '/openai/incidents', array(
213 'methods' => 'GET',
214 'permission_callback' => [ $this->core, 'can_access_settings' ],
215 'callback' => [ $this, 'rest_openai_incidents' ],
216 ) );
217 }
218 catch ( Exception $e ) {
219 var_dump( $e );
220 }
221 }
222
223 function rest_settings_list() {
224 return new WP_REST_Response( [
225 'success' => true,
226 'options' => $this->core->get_all_options()
227 ], 200 );
228 }
229
230 function rest_settings_update( $request ) {
231 try {
232 $params = $request->get_json_params();
233 $value = $params['options'];
234 $options = $this->core->update_options( $value );
235 $success = !!$options;
236 $message = __( $success ? 'OK' : "Could not update options.", 'ai-engine' );
237 return new WP_REST_Response([ 'success' => $success, 'message' => $message, 'options' => $options ], 200 );
238 }
239 catch ( Exception $e ) {
240 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
241 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
242 }
243 }
244
245 function rest_settings_reset() {
246 try {
247 $options = $this->core->reset_options();
248 $success = !!$options;
249 $message = __( $success ? 'OK' : "Could not reset options.", 'ai-engine' );
250 return new WP_REST_Response([ 'success' => $success, 'message' => $message, 'options' => $options ], 200 );
251 }
252 catch ( Exception $e ) {
253 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
254 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
255 }
256 }
257
258 function rest_ai_models( $request ) {
259 try {
260 $params = $request->get_json_params();
261 $envId = $params['envId'];
262 $engine = Meow_MWAI_Engines_Factory::get( $this->core, $envId );
263 $models = $engine->retrieve_models();
264 return new WP_REST_Response([ 'success' => true, 'models' => $models ], 200 );
265 }
266 catch ( Exception $e ) {
267 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
268 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
269 }
270 }
271
272 function rest_ai_completions( $request ) {
273 try {
274 $params = $request->get_json_params();
275 // TODO: This should not be prompt, but message, we should have a look
276 $message = $params['prompt'];
277 $query = new Meow_MWAI_Query_Text( $message );
278 $query->inject_params( $params );
279
280 // Handle streaming
281 $stream = $params['stream'] ?? false;
282 $streamCallback = null;
283 if ( $stream ) {
284 $streamCallback = function( $reply ) {
285 //$raw = _wp_specialchars( $reply, ENT_NOQUOTES, 'UTF-8', true );
286 $raw = $reply;
287 $this->core->stream_push( [ 'type' => 'live', 'data' => $raw ] );
288 if ( ob_get_level() > 0 ) {
289 ob_flush();
290 }
291 flush();
292 };
293 header( 'Cache-Control: no-cache' );
294 header( 'Content-Type: text/event-stream' );
295 header( 'X-Accel-Buffering: no' ); // This is useful to disable buffering in nginx through headers.
296 ob_implicit_flush( true );
297 ob_end_flush();
298 }
299
300 // Process Reply
301 $reply = $this->core->run_query( $query, $streamCallback );
302 $restRes = [
303 'success' => true,
304 'data' => $reply->result,
305 'usage' => $reply->usage
306 ];
307 if ( $stream ) {
308 $this->core->stream_push( [ 'type' => 'end', 'data' => json_encode( $restRes ) ] );
309 die();
310 }
311 return new WP_REST_Response( $restRes, 200 );
312 }
313 catch ( Exception $e ) {
314 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
315 if ( $stream ) {
316 $this->core->stream_push( [ 'type' => 'error', 'data' => $message ] );
317 }
318 else {
319 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
320 }
321 }
322 }
323
324 function rest_ai_images( $request ) {
325 try {
326 $params = $request->get_json_params();
327 $message = $params['prompt'];
328 $query = new Meow_MWAI_Query_Image( $message );
329 $query->inject_params( $params );
330 $reply = $this->core->run_query( $query );
331 return new WP_REST_Response([ 'success' => true, 'data' => $reply->results, 'usage' => $reply->usage ], 200 );
332 }
333 catch ( Exception $e ) {
334 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
335 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
336 }
337 }
338
339 function rest_ai_magic_wand( $request ) {
340 try {
341 $params = $request->get_json_params();
342 $action = isset( $params['action'] ) ? $params['action'] : null;
343 $data = isset( $params['data'] ) ? $params['data'] : null;
344 if ( empty( $data ) || empty( $action ) ) {
345 return new WP_REST_Response([ 'success' => false, 'message' => "An action and some data are required." ], 500 );
346 }
347 $data = apply_filters( 'mwai_magic_wand_' . $action, "", $data );
348 return new WP_REST_Response([ 'success' => true, 'data' => $data ], 200 );
349 }
350 catch ( Exception $e ) {
351 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
352 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
353 }
354 }
355
356 function rest_ai_copilot( $request ) {
357 try {
358 $params = $request->get_json_params();
359 $action = sanitize_text_field( $params['action'] );
360 $message = sanitize_text_field( $params['prompt'] );
361 if ( empty( $action ) || empty( $message ) ) {
362 return new WP_REST_Response([ 'success' => false, 'message' => "Copilot needs an action and a prompt." ], 500 );
363 }
364 $query = new Meow_MWAI_Query_Text( $message, 2048 );
365 $query->set_scope( 'admin-tools' );
366 $model = $this->core->get_option( 'ai_default_model' );
367 $env = $this->core->get_option( 'ai_default_env' );
368 if ( !empty( $model ) ) {
369 $query->set_model( $model );
370 }
371 if ( !empty( $env ) ) {
372 $query->set_env_id( $env );
373 }
374 $reply = $this->core->run_query( $query );
375 return new WP_REST_Response([ 'success' => true, 'data' => $reply->result ], 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_helpers_update_title( $request ) {
384 try {
385 $params = $request->get_json_params();
386 $title = sanitize_text_field( $params['title'] );
387 $postId = intval( $params['postId'] );
388 $post = get_post( $postId );
389 if ( !$post ) {
390 throw new Exception( 'There is no post with this ID.' );
391 }
392 $post->post_title = $title;
393 //$post->post_name = sanitize_title( $title );
394 wp_update_post( $post );
395 return new WP_REST_Response([ 'success' => true, 'message' => "Title updated." ], 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_helpers_update_excerpt( $request ) {
404 try {
405 $params = $request->get_json_params();
406 $excerpt = sanitize_text_field( $params['excerpt'] );
407 $postId = intval( $params['postId'] );
408 $post = get_post( $postId );
409 if ( !$post ) {
410 throw new Exception( 'There is no post with this ID.' );
411 }
412 $post->post_excerpt = $excerpt;
413 wp_update_post( $post );
414 return new WP_REST_Response([ 'success' => true, 'message' => "Excerpt updated." ], 200 );
415 }
416 catch ( Exception $e ) {
417 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
418 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
419 }
420 }
421
422 function rest_helpers_create_post( $request ) {
423 try {
424 $params = $request->get_json_params();
425 $title = sanitize_text_field( $params['title'] );
426 $content = sanitize_textarea_field( $params['content'] );
427 $excerpt = sanitize_text_field( $params['excerpt'] );
428 $postType = sanitize_text_field( $params['postType'] );
429 $post = new stdClass();
430 $post->post_title = $title;
431 $post->post_excerpt = $excerpt;
432 $post->post_content = $content;
433 $post->post_status = 'draft';
434 $post->post_type = isset( $postType ) ? $postType : 'post';
435 // TODO: Let's try to avoid using Markdown to create the Post
436 // Instead, we should create Gutenberg Blocks, or simple HTML.
437 // Then, we can get rid of the library for Markdown.
438 $post->post_content = $this->core->markdown_to_html( $post->post_content );
439 $postId = wp_insert_post( $post );
440 return new WP_REST_Response([ 'success' => true, 'postId' => $postId ], 200 );
441 }
442 catch ( Exception $e ) {
443 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
444 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
445 }
446 }
447
448 function rest_helpers_create_images( $request ) {
449 try {
450 $params = $request->get_json_params();
451 $title = sanitize_text_field( $params['title'] );
452 $caption = sanitize_text_field( $params['caption'] );
453 $alt = sanitize_text_field( $params['alt'] );
454 $description = sanitize_text_field( $params['description'] );
455 $url = $params['url'];
456 $filename = sanitize_text_field( $params['filename'] );
457 $attachmentId = $this->core->add_image_from_url( $url, $filename, $title, $description, $caption, $alt );
458 return new WP_REST_Response([ 'success' => true, 'attachmentId' => $attachmentId ], 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_openai_files_get() {
467 try {
468 $envId = isset( $_GET['envId'] ) ? $_GET['envId'] : null;
469 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
470 $files = $openai->list_files();
471 return new WP_REST_Response([ 'success' => true, 'files' => $files ], 200 );
472 }
473 catch ( Exception $e ) {
474 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
475 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
476 }
477 }
478
479 function rest_openai_deleted_finetunes_get() {
480 try {
481 $envId = isset( $_GET['envId'] ) ? $_GET['envId'] : null;
482 $legacy = isset( $_GET['legacy'] ) ? $_GET['legacy'] === 'true' : false;
483 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
484 $finetunes = $openai->list_deleted_finetunes( $legacy );
485 return new WP_REST_Response([ 'success' => true, 'finetunes' => $finetunes ], 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_finetunes_get() {
494 try {
495 $envId = isset( $_GET['envId'] ) ? $_GET['envId'] : null;
496 $legacy = isset( $_GET['legacy'] ) ? $_GET['legacy'] === 'true' : false;
497 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
498 $finetunes = $openai->list_finetunes( $legacy );
499 return new WP_REST_Response([ 'success' => true, 'finetunes' => $finetunes ], 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_files_upload( $request ) {
508 try {
509 $params = $request->get_json_params();
510 $envId = $params['envId'];;
511 $filename = sanitize_text_field( $params['filename'] );
512 $data = $params['data'];
513 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
514 $file = $openai->upload_file( $filename, $data );
515 return new WP_REST_Response([ 'success' => true, 'file' => $file ], 200 );
516 }
517 catch ( Exception $e ) {
518 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
519 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
520 }
521 }
522
523 function rest_openai_files_delete( $request ) {
524 try {
525 $params = $request->get_json_params();
526 $envId = $params['envId'];;
527 $fileId = $params['fileId'];
528 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
529 $openai->delete_file( $fileId );
530 return new WP_REST_Response([ 'success' => true ], 200 );
531 }
532 catch ( Exception $e ) {
533 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
534 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
535 }
536 }
537
538 function rest_openai_finetunes_cancel( $request ) {
539 try {
540 $params = $request->get_json_params();
541 $envId = $params['envId'];;
542 $finetuneId = $params['finetuneId'];
543 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
544 $openai->cancel_finetune( $finetuneId );
545 return new WP_REST_Response([ 'success' => true ], 200 );
546 }
547 catch ( Exception $e ) {
548 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
549 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
550 }
551 }
552
553 function rest_openai_finetunes_delete( $request ) {
554 try {
555 $params = $request->get_json_params();
556 $envId = $params['envId'];;
557 $modelId = $params['modelId'];
558 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
559 $openai->delete_finetune( $modelId );
560 return new WP_REST_Response([ 'success' => true ], 200 );
561 }
562 catch ( Exception $e ) {
563 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
564 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
565 }
566 }
567
568 function rest_openai_files_download( $request ) {
569 try {
570 $params = $request->get_json_params();
571 $envId = $params['envId'];;
572 $fileId = $params['fileId'];
573 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
574 $data = $openai->download_file( $fileId );
575 return new WP_REST_Response([ 'success' => true, 'data' => $data ], 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_files_finetune( $request ) {
584 try {
585 $params = $request->get_json_params();
586 $envId = $params['envId'];;
587 $fileId = $params['fileId'];
588 $model = $params['model'];
589 $suffix = $params['suffix'];
590 $hyperparams = [
591 "nEpochs" => isset( $params['nEpochs'] ) ? $params['nEpochs'] : null,
592 "batchSize" => isset( $params['batchSize'] ) ? $params['batchSize'] : null,
593 ];
594 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
595 $finetune = $openai->run_finetune( $fileId, $model, $suffix, $hyperparams );
596 return new WP_REST_Response([ 'success' => true, 'finetune' => $finetune ], 200 );
597 }
598 catch ( Exception $e ) {
599 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
600 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
601 }
602 }
603
604 function rest_openai_incidents() {
605 try {
606 $transient = get_transient( 'mwai_openai_incidents' );
607 if ( $transient ) {
608 return new WP_REST_Response([ 'success' => true, 'incidents' => $transient ], 200 );
609 }
610 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core );
611 $incidents = $openai->get_incidents();
612 set_transient( 'mwai_openai_incidents', $incidents, 60 * 10 );
613 return new WP_REST_Response([ 'success' => true, 'incidents' => $incidents ], 200 );
614 }
615 catch ( Exception $e ) {
616 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
617 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
618 }
619 }
620
621 function rest_helpers_count_posts( $request ) {
622 try {
623 $params = $request->get_query_params();
624 $postType = $params['postType'];
625 $postStatus = $params['postStatus'];
626 $postStatus = !empty( $params['postStatus'] ) ? explode( ',', $postStatus ) : [ 'publish' ];
627 $count = wp_count_posts( $postType );
628 $count = array_sum( array_intersect_key( (array)$count, array_flip( $postStatus ) ) );
629 return new WP_REST_Response([ 'success' => true, 'count' => $count ], 200 );
630 }
631 catch ( Exception $e ) {
632 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
633 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
634 }
635 }
636
637 function rest_helpers_posts_ids( $request ) {
638 try {
639 $params = $request->get_query_params();
640 $postType = $params['postType'];
641 $postStatus = $params['postStatus'];
642 $postStatus = !empty( $params['postStatus'] ) ? explode( ',', $postStatus ) : [ 'publish' ];
643 $posts = get_posts( [
644 'posts_per_page' => -1,
645 'post_type' => $postType,
646 'post_status' => $postStatus,
647 'fields' => 'ids'
648 ] );
649 return new WP_REST_Response([ 'success' => true, 'postIds' => $posts ], 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_helpers_post_content( $request ) {
658 try {
659 $params = $request->get_query_params();
660 $offset = (int)$params['offset'];
661 $postType = $params['postType'];
662 $postStatus = $params['postStatus'];
663 $postStatus = !empty( $params['postStatus'] ) ? explode( ',', $postStatus ) : [ 'publish' ];
664 $postId = (int)$params['postId'];
665
666 $post = null;
667 if ( !empty( $postId ) ) {
668 $post = get_post( $postId );
669 if ( $post->post_status !== 'publish' && $post->post_status !== 'future'
670 && $post->post_status !== 'draft' && $post->post_status !== 'private' ) {
671 $post = null;
672 }
673 }
674 else {
675 $posts = get_posts( [
676 'posts_per_page' => 1,
677 'post_type' => $postType,
678 'offset' => $offset,
679 'post_status' => $postStatus,
680 ] );
681 $post = count( $posts ) === 0 ? null : $posts[0];
682 }
683 if ( !$post ) {
684 return new WP_REST_Response([ 'success' => false, 'message' => 'Post not found' ], 404 );
685 }
686 $cleanPost = $this->core->get_post( $post );
687 return new WP_REST_Response([ 'success' => true, 'content' => $cleanPost['content'],
688 'checksum' => $cleanPost['checksum'], 'language' => $cleanPost['language'], 'excerpt' => $cleanPost['excerpt'],
689 'postId' => $cleanPost['postId'], 'title' => $cleanPost['title'], 'url' => $cleanPost['url'] ], 200 );
690 }
691 catch ( Exception $e ) {
692 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
693 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
694 }
695 }
696
697 function rest_system_templates_get( $request ) {
698 try {
699 $params = $request->get_query_params();
700 $category = $params['category'];
701 $templates = [];
702 $templates_option = get_option( 'mwai_templates', [] );
703 if ( !is_array( $templates_option ) ) {
704 update_option( 'mwai_templates', [] );
705 }
706 $categories = array_column( $templates_option, 'category' );
707 $index = array_search( $category, $categories );
708 $templates = [];
709 if ( $index !== false ) {
710 $templates = $templates_option[$index]['templates'];
711 }
712 return new WP_REST_Response([ 'success' => true, 'templates' => $templates ], 200 );
713 }
714 catch ( Exception $e ) {
715 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
716 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
717 }
718 }
719
720 function rest_system_templates_save( $request ) {
721 try {
722 $params = $request->get_json_params();
723 $category = $params['category'];
724 $templates = $params['templates'];
725 $templates_option = get_option( 'mwai_templates', [] );
726 $categories = array_column( $templates_option, 'category' );
727 $index = array_search( $category, $categories );
728 if ( $index !== false && $index >= 0 ) {
729 $templates_option[$index]['templates'] = $templates;
730 }
731 else {
732 $group = [ 'category' => $category, 'templates' => $templates ];
733 $templates_option[] = $group;
734 }
735
736 update_option( 'mwai_templates', $templates_option );
737 return new WP_REST_Response([ 'success' => true ], 200 );
738 }
739 catch ( Exception $e ) {
740 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
741 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
742 }
743 }
744
745 function rest_system_logs_list( $request ) {
746 try {
747 $params = $request->get_json_params();
748 $offset = $params['offset'];
749 $limit = $params['limit'];
750 $filters = $params['filters'];
751 $sort = $params['sort'];
752 $logs = apply_filters( 'mwai_stats_logs', [], $offset, $limit, $filters, $sort );
753 return new WP_REST_Response([ 'success' => true, 'total' => $logs['total'], 'logs' => $logs['rows'] ], 200 );
754 }
755 catch ( Exception $e ) {
756 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
757 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
758 }
759 }
760
761 function rest_system_logs_delete( $request ) {
762 try {
763 $params = $request->get_json_params();
764 $logIds = $params['logIds'];
765 $success = apply_filters( 'mwai_stats_logs_delete', true, $logIds );
766 return new WP_REST_Response([ 'success' => $success ], 200 );
767 }
768 catch ( Exception $e ) {
769 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
770 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
771 }
772 }
773
774 function rest_system_logs_meta_get( $request ) {
775 try {
776 $params = $request->get_json_params();
777 $logId = $params['logId'];
778 $metaKeys = $params['metaKeys'];
779 $data = apply_filters( 'mwai_stats_logs_meta', [], $logId, $metaKeys );
780 return new WP_REST_Response([ 'success' => true, 'data' => $data ], 200 );
781 }
782 catch ( Exception $e ) {
783 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
784 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
785 }
786 }
787
788 function rest_ai_moderate( $request ) {
789 try {
790 $params = $request->get_json_params();
791 $envId = $params['envId'];
792 $text = $params['text'];
793 if ( !$text ) {
794 return new WP_REST_Response([ 'success' => false, 'message' => 'Text not found.' ], 404 );
795 }
796 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
797 $results = $openai->moderate( $text );
798 return new WP_REST_Response([ 'success' => true, 'results' => $results ], 200 );
799 }
800 catch ( Exception $e ) {
801 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
802 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
803 }
804 }
805
806 function rest_ai_transcribe_audio( $request ) {
807 try {
808 $params = $request->get_json_params();
809 $query = new Meow_MWAI_Query_Transcribe();
810 $query->inject_params( $params );
811 $query->set_scope('admin-tools');
812 $reply = $this->core->run_query( $query );
813 return new WP_REST_Response([ 'success' => true, 'data' => $reply->result ], 200 );
814 }
815 catch ( Exception $e ) {
816 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
817 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
818 }
819 }
820
821 function rest_ai_transcribe_image( $request ) {
822 try {
823 global $mwai;
824 $params = $request->get_json_params();
825 $message = !empty( $params['prompt'] ) ? $params['prompt'] : null;
826 $url = !empty( $params['url'] ) ? $params['url'] : null;
827 $path = !empty( $params['path'] ) ? $params['path'] : null;
828 $result = $mwai->simpleVisionQuery( $message, $url, $path );
829 return new WP_REST_Response([ 'success' => true, 'data' => $result ], 200 );
830 }
831 catch ( Exception $e ) {
832 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
833 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
834 }
835 }
836
837 function rest_ai_json( $request ) {
838 try {
839 global $mwai;
840 $params = $request->get_json_params();
841 $message = !empty( $params['prompt'] ) ? $params['prompt'] : null;
842 $result = $mwai->simpleJsonQuery( $message );
843 return new WP_REST_Response([ 'success' => true, 'data' => $result ], 200 );
844 }
845 catch ( Exception $e ) {
846 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
847 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
848 }
849 }
850
851 function rest_helpers_post_types() {
852 try {
853 $postTypes = $this->core->get_post_types();
854 return new WP_REST_Response([ 'success' => true, 'postTypes' => $postTypes ], 200 );
855 }
856 catch ( Exception $e ) {
857 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
858 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
859 }
860 }
861
862 function rest_settings_themes( $request ) {
863 try {
864 $method = $request->get_method();
865 if ( $method === 'GET' ) {
866 $themes = $this->core->get_themes();
867 return new WP_REST_Response([ 'success' => true, 'themes' => $themes ], 200 );
868 }
869 else if ( $method === 'POST' ) {
870 $params = $request->get_json_params();
871 $themes = $params['themes'];
872 $themes = $this->core->update_themes( $themes );
873 return new WP_REST_Response([ 'success' => true, 'themes' => $themes ], 200 );
874 }
875 }
876 catch ( Exception $e ) {
877 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
878 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
879 }
880 }
881
882 function rest_settings_chatbots( $request ) {
883 try {
884 $method = $request->get_method();
885 if ( $method === 'GET' ) {
886 $chatbots = $this->core->get_chatbots();
887 return new WP_REST_Response([ 'success' => true, 'chatbots' => $chatbots ], 200 );
888 }
889 else if ( $method === 'POST' ) {
890 $params = $request->get_json_params();
891 $chatbots = $params['chatbots'];
892 $chatbots = $this->core->update_chatbots( $chatbots );
893 return new WP_REST_Response([ 'success' => true, 'chatbots' => $chatbots ], 200 );
894 }
895 return new WP_REST_Response([ 'success' => false, 'message' => 'Method not allowed' ], 405 );
896 }
897 catch ( Exception $e ) {
898 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
899 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
900 }
901 }
902 }
903