PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 2.2.90
AI Engine – The Chatbot, AI Framework & MCP for WordPress v2.2.90
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
915 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_models_get() {
480 // try {
481 // $openai = new Meow_MWAI_Engines_OpenAI( $this->core );
482 // $finetunes = $openai->listModels();
483 // return new WP_REST_Response([ 'success' => true, 'finetunes' => $finetunes ], 200 );
484 // }
485 // catch ( Exception $e ) {
486 // $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
487 // return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
488 // }
489 // }
490
491 function rest_openai_deleted_finetunes_get() {
492 try {
493 $envId = isset( $_GET['envId'] ) ? $_GET['envId'] : null;
494 $legacy = isset( $_GET['legacy'] ) ? $_GET['legacy'] === 'true' : false;
495 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
496 $finetunes = $openai->list_deleted_finetunes( $legacy );
497 return new WP_REST_Response([ 'success' => true, 'finetunes' => $finetunes ], 200 );
498 }
499 catch ( Exception $e ) {
500 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
501 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
502 }
503 }
504
505 function rest_openai_finetunes_get() {
506 try {
507 $envId = isset( $_GET['envId'] ) ? $_GET['envId'] : null;
508 $legacy = isset( $_GET['legacy'] ) ? $_GET['legacy'] === 'true' : false;
509 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
510 $finetunes = $openai->list_finetunes( $legacy );
511 return new WP_REST_Response([ 'success' => true, 'finetunes' => $finetunes ], 200 );
512 }
513 catch ( Exception $e ) {
514 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
515 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
516 }
517 }
518
519 function rest_openai_files_upload( $request ) {
520 try {
521 $params = $request->get_json_params();
522 $envId = $params['envId'];;
523 $filename = sanitize_text_field( $params['filename'] );
524 $data = $params['data'];
525 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
526 $file = $openai->upload_file( $filename, $data );
527 return new WP_REST_Response([ 'success' => true, 'file' => $file ], 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_delete( $request ) {
536 try {
537 $params = $request->get_json_params();
538 $envId = $params['envId'];;
539 $fileId = $params['fileId'];
540 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
541 $openai->delete_file( $fileId );
542 return new WP_REST_Response([ 'success' => true ], 200 );
543 }
544 catch ( Exception $e ) {
545 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
546 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
547 }
548 }
549
550 function rest_openai_finetunes_cancel( $request ) {
551 try {
552 $params = $request->get_json_params();
553 $envId = $params['envId'];;
554 $finetuneId = $params['finetuneId'];
555 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
556 $openai->cancel_finetune( $finetuneId );
557 return new WP_REST_Response([ 'success' => true ], 200 );
558 }
559 catch ( Exception $e ) {
560 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
561 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
562 }
563 }
564
565 function rest_openai_finetunes_delete( $request ) {
566 try {
567 $params = $request->get_json_params();
568 $envId = $params['envId'];;
569 $modelId = $params['modelId'];
570 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
571 $openai->delete_finetune( $modelId );
572 return new WP_REST_Response([ 'success' => true ], 200 );
573 }
574 catch ( Exception $e ) {
575 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
576 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
577 }
578 }
579
580 function rest_openai_files_download( $request ) {
581 try {
582 $params = $request->get_json_params();
583 $envId = $params['envId'];;
584 $fileId = $params['fileId'];
585 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
586 $data = $openai->download_file( $fileId );
587 return new WP_REST_Response([ 'success' => true, 'data' => $data ], 200 );
588 }
589 catch ( Exception $e ) {
590 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
591 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
592 }
593 }
594
595 function rest_openai_files_finetune( $request ) {
596 try {
597 $params = $request->get_json_params();
598 $envId = $params['envId'];;
599 $fileId = $params['fileId'];
600 $model = $params['model'];
601 $suffix = $params['suffix'];
602 $hyperparams = [
603 "nEpochs" => isset( $params['nEpochs'] ) ? $params['nEpochs'] : null,
604 "batchSize" => isset( $params['batchSize'] ) ? $params['batchSize'] : null,
605 ];
606 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
607 $finetune = $openai->run_finetune( $fileId, $model, $suffix, $hyperparams );
608 return new WP_REST_Response([ 'success' => true, 'finetune' => $finetune ], 200 );
609 }
610 catch ( Exception $e ) {
611 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
612 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
613 }
614 }
615
616 function rest_openai_incidents() {
617 try {
618 $transient = get_transient( 'mwai_openai_incidents' );
619 if ( $transient ) {
620 return new WP_REST_Response([ 'success' => true, 'incidents' => $transient ], 200 );
621 }
622 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core );
623 $incidents = $openai->get_incidents();
624 set_transient( 'mwai_openai_incidents', $incidents, 60 * 10 );
625 return new WP_REST_Response([ 'success' => true, 'incidents' => $incidents ], 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_helpers_count_posts( $request ) {
634 try {
635 $params = $request->get_query_params();
636 $postType = $params['postType'];
637 $postStatus = $params['postStatus'];
638 $postStatus = !empty( $params['postStatus'] ) ? explode( ',', $postStatus ) : [ 'publish' ];
639 $count = wp_count_posts( $postType );
640 $count = array_sum( array_intersect_key( (array)$count, array_flip( $postStatus ) ) );
641 return new WP_REST_Response([ 'success' => true, 'count' => $count ], 200 );
642 }
643 catch ( Exception $e ) {
644 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
645 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
646 }
647 }
648
649 function rest_helpers_posts_ids( $request ) {
650 try {
651 $params = $request->get_query_params();
652 $postType = $params['postType'];
653 $postStatus = $params['postStatus'];
654 $postStatus = !empty( $params['postStatus'] ) ? explode( ',', $postStatus ) : [ 'publish' ];
655 $posts = get_posts( [
656 'posts_per_page' => -1,
657 'post_type' => $postType,
658 'post_status' => $postStatus,
659 'fields' => 'ids'
660 ] );
661 return new WP_REST_Response([ 'success' => true, 'postIds' => $posts ], 200 );
662 }
663 catch ( Exception $e ) {
664 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
665 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
666 }
667 }
668
669 function rest_helpers_post_content( $request ) {
670 try {
671 $params = $request->get_query_params();
672 $offset = (int)$params['offset'];
673 $postType = $params['postType'];
674 $postStatus = $params['postStatus'];
675 $postStatus = !empty( $params['postStatus'] ) ? explode( ',', $postStatus ) : [ 'publish' ];
676 $postId = (int)$params['postId'];
677
678 $post = null;
679 if ( !empty( $postId ) ) {
680 $post = get_post( $postId );
681 if ( $post->post_status !== 'publish' && $post->post_status !== 'future'
682 && $post->post_status !== 'draft' && $post->post_status !== 'private' ) {
683 $post = null;
684 }
685 }
686 else {
687 $posts = get_posts( [
688 'posts_per_page' => 1,
689 'post_type' => $postType,
690 'offset' => $offset,
691 'post_status' => $postStatus,
692 ] );
693 $post = count( $posts ) === 0 ? null : $posts[0];
694 }
695 if ( !$post ) {
696 return new WP_REST_Response([ 'success' => false, 'message' => 'Post not found' ], 404 );
697 }
698 $cleanPost = $this->core->get_post( $post );
699 return new WP_REST_Response([ 'success' => true, 'content' => $cleanPost['content'],
700 'checksum' => $cleanPost['checksum'], 'language' => $cleanPost['language'], 'excerpt' => $cleanPost['excerpt'],
701 'postId' => $cleanPost['postId'], 'title' => $cleanPost['title'], 'url' => $cleanPost['url'] ], 200 );
702 }
703 catch ( Exception $e ) {
704 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
705 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
706 }
707 }
708
709 function rest_system_templates_get( $request ) {
710 try {
711 $params = $request->get_query_params();
712 $category = $params['category'];
713 $templates = [];
714 $templates_option = get_option( 'mwai_templates', [] );
715 if ( !is_array( $templates_option ) ) {
716 update_option( 'mwai_templates', [] );
717 }
718 $categories = array_column( $templates_option, 'category' );
719 $index = array_search( $category, $categories );
720 $templates = [];
721 if ( $index !== false ) {
722 $templates = $templates_option[$index]['templates'];
723 }
724 return new WP_REST_Response([ 'success' => true, 'templates' => $templates ], 200 );
725 }
726 catch ( Exception $e ) {
727 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
728 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
729 }
730 }
731
732 function rest_system_templates_save( $request ) {
733 try {
734 $params = $request->get_json_params();
735 $category = $params['category'];
736 $templates = $params['templates'];
737 $templates_option = get_option( 'mwai_templates', [] );
738 $categories = array_column( $templates_option, 'category' );
739 $index = array_search( $category, $categories );
740 if ( $index !== false && $index >= 0 ) {
741 $templates_option[$index]['templates'] = $templates;
742 }
743 else {
744 $group = [ 'category' => $category, 'templates' => $templates ];
745 $templates_option[] = $group;
746 }
747
748 update_option( 'mwai_templates', $templates_option );
749 return new WP_REST_Response([ 'success' => true ], 200 );
750 }
751 catch ( Exception $e ) {
752 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
753 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
754 }
755 }
756
757 function rest_system_logs_list( $request ) {
758 try {
759 $params = $request->get_json_params();
760 $offset = $params['offset'];
761 $limit = $params['limit'];
762 $filters = $params['filters'];
763 $sort = $params['sort'];
764 $logs = apply_filters( 'mwai_stats_logs', [], $offset, $limit, $filters, $sort );
765 return new WP_REST_Response([ 'success' => true, 'total' => $logs['total'], 'logs' => $logs['rows'] ], 200 );
766 }
767 catch ( Exception $e ) {
768 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
769 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
770 }
771 }
772
773 function rest_system_logs_delete( $request ) {
774 try {
775 $params = $request->get_json_params();
776 $logIds = $params['logIds'];
777 $success = apply_filters( 'mwai_stats_logs_delete', true, $logIds );
778 return new WP_REST_Response([ 'success' => $success ], 200 );
779 }
780 catch ( Exception $e ) {
781 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
782 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
783 }
784 }
785
786 function rest_system_logs_meta_get( $request ) {
787 try {
788 $params = $request->get_json_params();
789 $logId = $params['logId'];
790 $metaKeys = $params['metaKeys'];
791 $data = apply_filters( 'mwai_stats_logs_meta', [], $logId, $metaKeys );
792 return new WP_REST_Response([ 'success' => true, 'data' => $data ], 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_ai_moderate( $request ) {
801 try {
802 $params = $request->get_json_params();
803 $envId = $params['envId'];
804 $text = $params['text'];
805 if ( !$text ) {
806 return new WP_REST_Response([ 'success' => false, 'message' => 'Text not found.' ], 404 );
807 }
808 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
809 $results = $openai->moderate( $text );
810 return new WP_REST_Response([ 'success' => true, 'results' => $results ], 200 );
811 }
812 catch ( Exception $e ) {
813 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
814 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
815 }
816 }
817
818 function rest_ai_transcribe_audio( $request ) {
819 try {
820 $params = $request->get_json_params();
821 $query = new Meow_MWAI_Query_Transcribe();
822 $query->inject_params( $params );
823 $query->set_scope('admin-tools');
824 $reply = $this->core->run_query( $query );
825 return new WP_REST_Response([ 'success' => true, 'data' => $reply->result ], 200 );
826 }
827 catch ( Exception $e ) {
828 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
829 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
830 }
831 }
832
833 function rest_ai_transcribe_image( $request ) {
834 try {
835 global $mwai;
836 $params = $request->get_json_params();
837 $message = !empty( $params['prompt'] ) ? $params['prompt'] : null;
838 $url = !empty( $params['url'] ) ? $params['url'] : null;
839 $path = !empty( $params['path'] ) ? $params['path'] : null;
840 $result = $mwai->simpleVisionQuery( $message, $url, $path );
841 return new WP_REST_Response([ 'success' => true, 'data' => $result ], 200 );
842 }
843 catch ( Exception $e ) {
844 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
845 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
846 }
847 }
848
849 function rest_ai_json( $request ) {
850 try {
851 global $mwai;
852 $params = $request->get_json_params();
853 $message = !empty( $params['prompt'] ) ? $params['prompt'] : null;
854 $result = $mwai->simpleJsonQuery( $message );
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_helpers_post_types() {
864 try {
865 $postTypes = $this->core->get_post_types();
866 return new WP_REST_Response([ 'success' => true, 'postTypes' => $postTypes ], 200 );
867 }
868 catch ( Exception $e ) {
869 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
870 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
871 }
872 }
873
874 function rest_settings_themes( $request ) {
875 try {
876 $method = $request->get_method();
877 if ( $method === 'GET' ) {
878 $themes = $this->core->get_themes();
879 return new WP_REST_Response([ 'success' => true, 'themes' => $themes ], 200 );
880 }
881 else if ( $method === 'POST' ) {
882 $params = $request->get_json_params();
883 $themes = $params['themes'];
884 $themes = $this->core->update_themes( $themes );
885 return new WP_REST_Response([ 'success' => true, 'themes' => $themes ], 200 );
886 }
887 }
888 catch ( Exception $e ) {
889 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
890 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
891 }
892 }
893
894 function rest_settings_chatbots( $request ) {
895 try {
896 $method = $request->get_method();
897 if ( $method === 'GET' ) {
898 $chatbots = $this->core->get_chatbots();
899 return new WP_REST_Response([ 'success' => true, 'chatbots' => $chatbots ], 200 );
900 }
901 else if ( $method === 'POST' ) {
902 $params = $request->get_json_params();
903 $chatbots = $params['chatbots'];
904 $chatbots = $this->core->update_chatbots( $chatbots );
905 return new WP_REST_Response([ 'success' => true, 'chatbots' => $chatbots ], 200 );
906 }
907 return new WP_REST_Response([ 'success' => false, 'message' => 'Method not allowed' ], 405 );
908 }
909 catch ( Exception $e ) {
910 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
911 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
912 }
913 }
914 }
915