PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 1.1.0
AI Engine – The Chatbot, AI Framework & MCP for WordPress v1.1.0
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
modules 3 years ago admin.php 3 years ago ai.php 3 years ago answer.php 3 years ago core.php 3 years ago init.php 3 years ago openai.php 3 years ago query.php 3 years ago queryimage.php 3 years ago querytext.php 3 years ago rest.php 3 years ago ui.php 3 years ago
rest.php
561 lines
1 <?php
2
3 class Meow_MWAI_Rest
4 {
5 private $core = null;
6 private $namespace = 'ai-engine/v1';
7
8 public function __construct( $core ) {
9 if ( !current_user_can( 'administrator' ) ) {
10 return;
11 }
12 $this->core = $core;
13 add_action( 'rest_api_init', array( $this, 'rest_api_init' ) );
14 }
15
16 function rest_api_init() {
17 try {
18 register_rest_route( $this->namespace, '/update_option', array(
19 'methods' => 'POST',
20 'permission_callback' => array( $this->core, 'can_access_settings' ),
21 'callback' => array( $this, 'rest_update_option' )
22 ) );
23 register_rest_route( $this->namespace, '/all_settings', array(
24 'methods' => 'GET',
25 'permission_callback' => array( $this->core, 'can_access_settings' ),
26 'callback' => array( $this, 'rest_all_settings' ),
27 ) );
28 register_rest_route( $this->namespace, '/make_completions', array(
29 'methods' => 'POST',
30 'permission_callback' => array( $this->core, 'can_access_features' ),
31 'callback' => array( $this, 'make_completions' ),
32 ) );
33 register_rest_route( $this->namespace, '/make_images', array(
34 'methods' => 'POST',
35 'permission_callback' => array( $this->core, 'can_access_features' ),
36 'callback' => array( $this, 'make_images' ),
37 ) );
38 register_rest_route( $this->namespace, '/make_titles', array(
39 'methods' => 'POST',
40 'permission_callback' => array( $this->core, 'can_access_features' ),
41 'callback' => array( $this, 'make_titles' ),
42 ) );
43 register_rest_route( $this->namespace, '/make_excerpts', array(
44 'methods' => 'POST',
45 'permission_callback' => array( $this->core, 'can_access_features' ),
46 'callback' => array( $this, 'make_excerpts' ),
47 ) );
48 register_rest_route( $this->namespace, '/update_post_title', array(
49 'methods' => 'POST',
50 'permission_callback' => array( $this->core, 'can_access_features' ),
51 'callback' => array( $this, 'update_post_title' ),
52 ) );
53 register_rest_route( $this->namespace, '/update_post_excerpt', array(
54 'methods' => 'POST',
55 'permission_callback' => array( $this->core, 'can_access_features' ),
56 'callback' => array( $this, 'update_post_excerpt' ),
57 ) );
58 register_rest_route( $this->namespace, '/create_post', array(
59 'methods' => 'POST',
60 'permission_callback' => array( $this->core, 'can_access_features' ),
61 'callback' => array( $this, 'create_post' ),
62 ) );
63 register_rest_route( $this->namespace, '/create_image', array(
64 'methods' => 'POST',
65 'permission_callback' => array( $this->core, 'can_access_features' ),
66 'callback' => array( $this, 'create_image' ),
67 ) );
68 register_rest_route( $this->namespace, '/openai_files', array(
69 'methods' => 'GET',
70 'permission_callback' => array( $this->core, 'can_access_settings' ),
71 'callback' => array( $this, 'openai_files_get' ),
72 ) );
73 register_rest_route( $this->namespace, '/openai_files', array(
74 'methods' => 'DELETE',
75 'permission_callback' => array( $this->core, 'can_access_settings' ),
76 'callback' => array( $this, 'openai_files_delete' ),
77 ) );
78 register_rest_route( $this->namespace, '/openai_files', array(
79 'methods' => 'POST',
80 'permission_callback' => array( $this->core, 'can_access_settings' ),
81 'callback' => array( $this, 'openai_files_upload' ),
82 ) );
83 register_rest_route( $this->namespace, '/openai_files_download', array(
84 'methods' => 'POST',
85 'permission_callback' => array( $this->core, 'can_access_settings' ),
86 'callback' => array( $this, 'openai_files_download' ),
87 ) );
88 register_rest_route( $this->namespace, '/openai_files_finetune', array(
89 'methods' => 'POST',
90 'permission_callback' => array( $this->core, 'can_access_settings' ),
91 'callback' => array( $this, 'openai_files_finetune' ),
92 ) );
93 register_rest_route( $this->namespace, '/openai_finetunes', array(
94 'methods' => 'GET',
95 'permission_callback' => array( $this->core, 'can_access_settings' ),
96 'callback' => array( $this, 'openai_finetunes_get' ),
97 ) );
98 register_rest_route( $this->namespace, '/openai_finetunes', array(
99 'methods' => 'DELETE',
100 'permission_callback' => array( $this->core, 'can_access_settings' ),
101 'callback' => array( $this, 'openai_finetunes_delete' ),
102 ) );
103 register_rest_route( $this->namespace, '/openai_incidents', array(
104 'methods' => 'GET',
105 'permission_callback' => array( $this->core, 'can_access_settings' ),
106 'callback' => array( $this, 'openai_incidents' ),
107 ) );
108 register_rest_route( $this->namespace, '/count_posts', array(
109 'methods' => 'GET',
110 'permission_callback' => array( $this->core, 'can_access_features' ),
111 'callback' => array( $this, 'count_posts' ),
112 ) );
113 register_rest_route( $this->namespace, '/post_content', array(
114 'methods' => 'GET',
115 'permission_callback' => array( $this->core, 'can_access_features' ),
116 'callback' => array( $this, 'post_content' ),
117 ) );
118 register_rest_route( $this->namespace, '/templates', array(
119 'methods' => 'GET',
120 'permission_callback' => array( $this->core, 'can_access_features' ),
121 'callback' => array( $this, 'templates_get' ),
122 ) );
123 register_rest_route( $this->namespace, '/templates', array(
124 'methods' => 'POST',
125 'permission_callback' => array( $this->core, 'can_access_features' ),
126 'callback' => array( $this, 'templates_save' ),
127 ) );
128 register_rest_route( $this->namespace, '/logs', array(
129 'methods' => 'POST',
130 'permission_callback' => array( $this->core, 'can_access_settings' ),
131 'callback' => array( $this, 'get_logs' ),
132 ) );
133 }
134 catch ( Exception $e ) {
135 var_dump( $e );
136 }
137 }
138
139 function rest_all_settings() {
140 return new WP_REST_Response( [
141 'success' => true,
142 'data' => $this->core->get_all_options()
143 ], 200 );
144 }
145
146 function rest_update_option( $request ) {
147 try {
148 $params = $request->get_json_params();
149 $value = $params['options'];
150 $options = $this->core->update_options( $value );
151 $success = !!$options;
152 $message = __( $success ? 'OK' : "Could not update options.", 'ai-engine' );
153 return new WP_REST_Response([ 'success' => $success, 'message' => $message, 'options' => $options ], 200 );
154 }
155 catch ( Exception $e ) {
156 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
157 }
158 }
159
160 function createValidationResult( $result = true, $message = null) {
161 $message = $message ? $message : __( 'OK', 'ai-engine' );
162 return [ 'result' => $result, 'message' => $message ];
163 }
164
165 function validate_updated_option( $option_name ) {
166 $option_checkbox = get_option( 'mwai_option_checkbox', false );
167 $option_text = get_option( 'mwai_option_text', 'Default' );
168 if ( $option_checkbox === '' )
169 update_option( 'mwai_option_checkbox', false );
170 if ( $option_text === '' )
171 update_option( 'mwai_option_text', 'Default' );
172 return $this->createValidationResult();
173 }
174
175 function make_completions( $request ) {
176 try {
177 $params = $request->get_json_params();
178 $prompt = $params['prompt'];
179 $query = new Meow_MWAI_QueryText( $prompt );
180 $query->injectParams( $params );
181 $answer = $this->core->ai->run( $query );
182 return new WP_REST_Response([ 'success' => true, 'data' => $answer->result, 'usage' => $answer->usage ], 200 );
183 }
184 catch ( Exception $e ) {
185 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
186 }
187 }
188
189 function make_images( $request ) {
190 try {
191 $params = $request->get_json_params();
192 $prompt = $params['prompt'];
193 $query = new Meow_MWAI_QueryImage( $prompt );
194 $query->injectParams( $params );
195 $answer = $this->core->ai->run( $query );
196 return new WP_REST_Response([ 'success' => true, 'data' => $answer->results, 'usage' => $answer->usage ], 200 );
197 }
198 catch ( Exception $e ) {
199 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
200 }
201 }
202
203 function make_titles( $request ) {
204 try {
205 $params = $request->get_json_params();
206 $postId = intval( $params['postId'] );
207 $text = $this->core->get_text_from_postId( $postId );
208 $prompt = "Create short SEO-friendly title for this text: " . $text;
209 $query = new Meow_MWAI_QueryText( $prompt, 128 );
210 $query->setMaxResults( 5 );
211 $query->setEnv( 'admin-tools' );
212 $answer = $this->core->ai->run( $query );
213 return new WP_REST_Response([ 'success' => true, 'data' => $answer->results ], 200 );
214 }
215 catch ( Exception $e ) {
216 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
217 }
218 }
219
220 function make_excerpts( $request ) {
221 try {
222 $params = $request->get_json_params();
223 $postId = intval( $params['postId'] );
224 $text = $this->core->get_text_from_postId( $postId );
225 $prompt = "Create SEO-friendly introduction to this text, 120 to 170 characters max, no URLs: " . $text;
226 $query = new Meow_MWAI_QueryText( $prompt, 512 );
227 $query->setMaxResults( 5 );
228 $query->setEnv( 'admin-tools' );
229 $answer = $this->core->ai->run( $query );
230 return new WP_REST_Response([ 'success' => true, 'data' => $answer->results ], 200 );
231 }
232 catch ( Exception $e ) {
233 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
234 }
235 }
236
237 function update_post_title( $request ) {
238 try {
239 $params = $request->get_json_params();
240 $title = sanitize_text_field( $params['title'] );
241 $postId = intval( $params['postId'] );
242 $post = get_post( $postId );
243 if ( !$post ) {
244 throw new Exception( 'There is no post with this ID.' );
245 }
246 $post->post_title = $title;
247 //$post->post_name = sanitize_title( $title );
248 wp_update_post( $post );
249 return new WP_REST_Response([ 'success' => true, 'message' => "Title updated." ], 200 );
250 }
251 catch ( Exception $e ) {
252 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
253 }
254 }
255
256 function update_post_excerpt( $request ) {
257 try {
258 $params = $request->get_json_params();
259 $excerpt = sanitize_text_field( $params['excerpt'] );
260 $postId = intval( $params['postId'] );
261 $post = get_post( $postId );
262 if ( !$post ) {
263 throw new Exception( 'There is no post with this ID.' );
264 }
265 $post->post_excerpt = $excerpt;
266 wp_update_post( $post );
267 return new WP_REST_Response([ 'success' => true, 'message' => "Excerpt updated." ], 200 );
268 }
269 catch ( Exception $e ) {
270 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
271 }
272 }
273
274 function create_post( $request ) {
275 try {
276 $params = $request->get_json_params();
277 $title = sanitize_text_field( $params['title'] );
278 // Sanitize content that contains line returns and HTML tags
279 $content = sanitize_textarea_field( $params['content'] );
280 $excerpt = sanitize_text_field( $params['excerpt'] );
281 //$postType = sanitize_text_field( $params['postType'] );
282 $post = new stdClass();
283 $post->post_title = $title;
284 $post->post_excerpt = $excerpt;
285 $post->post_content = $content;
286 $post->post_status = 'draft';
287 $post->post_type = 'post';
288 $post->post_content = $this->core->markdown_to_html( $post->post_content );
289 $postId = wp_insert_post( $post );
290 return new WP_REST_Response([ 'success' => true, 'postId' => $postId ], 200 );
291 }
292 catch ( Exception $e ) {
293 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
294 }
295 }
296
297 function curl_download( $Url ) {
298 if ( !function_exists( 'curl_init' ) ) {
299 die( 'CURL is not installed!' );
300 }
301 $ch = curl_init();
302 curl_setopt( $ch, CURLOPT_URL, $Url );
303 curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
304 $output = curl_exec( $ch );
305 curl_close( $ch );
306 return $output;
307 }
308
309 function create_image( $request ) {
310 try {
311 $params = $request->get_json_params();
312 $title = sanitize_text_field( $params['title'] );
313 $caption = sanitize_text_field( $params['caption'] );
314 $alt = sanitize_text_field( $params['alt'] );
315 $description = sanitize_text_field( $params['description'] );
316 $url = $params['url'];
317 $filename = sanitize_text_field( $params['filename'] );
318 $image_data = $this->curl_download( $url );
319 if ( !$image_data ) {
320 throw new Exception( 'Could not download the image.' );
321 }
322 $upload_dir = wp_upload_dir();
323 if ( empty( $filename ) ) {
324 $filename = basename( $url );
325 }
326 $wp_filetype = wp_check_filetype( $filename );
327 if ( wp_mkdir_p( $upload_dir['path'] ) ) {
328 $file = $upload_dir['path'] . '/' . $filename;
329 }
330 else {
331 $file = $upload_dir['basedir'] . '/' . $filename;
332 }
333
334 // Make sure the file is unique, if not, add a number to the end of the file before the extension
335 $i = 1;
336 $parts = pathinfo( $file );
337 while ( file_exists( $file ) ) {
338 $file = $parts['dirname'] . '/' . $parts['filename'] . '-' . $i . '.' . $parts['extension'];
339 $i++;
340 }
341
342 // Write the file
343 file_put_contents( $file, $image_data );
344 $attachment = [
345 'post_mime_type' => $wp_filetype['type'],
346 'post_title' => $title,
347 'post_content' => $description,
348 'post_excerpt' => $caption,
349 'post_status' => 'inherit'
350 ];
351 // Register the file as a Media Library attachment
352 $attachmentId = wp_insert_attachment( $attachment, $file );
353 require_once( ABSPATH . 'wp-admin/includes/image.php' );
354 $attachment_data = wp_generate_attachment_metadata( $attachmentId, $file );
355 wp_update_attachment_metadata( $attachmentId, $attachment_data );
356 update_post_meta( $attachmentId, '_wp_attachment_image_alt', $alt );
357 return new WP_REST_Response([ 'success' => true, 'attachmentId' => $attachmentId ], 200 );
358 }
359 catch ( Exception $e ) {
360 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
361 }
362 }
363
364 function openai_files_get( $request ) {
365 try {
366 //$params = $request->get_json_params();
367 $openai = new Meow_MWAI_OpenAI( $this->core );
368 $files = $openai->listFiles();
369 return new WP_REST_Response([ 'success' => true, 'files' => $files ], 200 );
370 }
371 catch ( Exception $e ) {
372 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
373 }
374 }
375
376 function openai_finetunes_get( $request ) {
377 try {
378 $params = $request->get_query_params();
379 $clean = isset( $params['clean'] ) ? true : false;
380 $openai = new Meow_MWAI_OpenAI( $this->core );
381 $finetunes = $openai->listFineTunes( $clean );
382 return new WP_REST_Response([ 'success' => true, 'finetunes' => $finetunes ], 200 );
383 }
384 catch ( Exception $e ) {
385 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
386 }
387 }
388
389 function openai_files_upload( $request ) {
390 try {
391 $params = $request->get_json_params();
392 $filename = sanitize_text_field( $params['filename'] );
393 $data = $params['data'];
394 $openai = new Meow_MWAI_OpenAI( $this->core );
395 $file = $openai->uploadFile( $filename, $data );
396 return new WP_REST_Response([ 'success' => true, 'file' => $file ], 200 );
397 }
398 catch ( Exception $e ) {
399 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
400 }
401 }
402
403 function openai_files_delete( $request ) {
404 try {
405 $params = $request->get_json_params();
406 $fileId = $params['fileId'];
407 $openai = new Meow_MWAI_OpenAI( $this->core );
408 $openai->deleteFile( $fileId );
409 return new WP_REST_Response([ 'success' => true ], 200 );
410 }
411 catch ( Exception $e ) {
412 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
413 }
414 }
415
416 function openai_finetunes_delete( $request ) {
417 try {
418 $params = $request->get_json_params();
419 $modelId = $params['modelId'];
420 $openai = new Meow_MWAI_OpenAI( $this->core );
421 $openai->deleteFineTune( $modelId );
422 return new WP_REST_Response([ 'success' => true ], 200 );
423 }
424 catch ( Exception $e ) {
425 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
426 }
427 }
428
429 function openai_files_download( $request ) {
430 try {
431 $params = $request->get_json_params();
432 $fileId = $params['fileId'];
433 $openai = new Meow_MWAI_OpenAI( $this->core );
434 $data = $openai->downloadFile( $fileId );
435 return new WP_REST_Response([ 'success' => true, 'data' => $data ], 200 );
436 }
437 catch ( Exception $e ) {
438 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
439 }
440 }
441
442 function openai_files_finetune( $request ) {
443 try {
444 $params = $request->get_json_params();
445 $fileId = $params['fileId'];
446 $model = $params['model'];
447 $suffix = $params['suffix'];
448 $hyperparams = [
449 "nEpochs" => $params['nEpochs'],
450 "batchSize" => $params['batchSize']
451 ];
452 $openai = new Meow_MWAI_OpenAI( $this->core );
453 $finetune = $openai->fineTuneFile( $fileId, $model, $suffix, $hyperparams );
454 return new WP_REST_Response([ 'success' => true, 'finetune' => $finetune ], 200 );
455 }
456 catch ( Exception $e ) {
457 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
458 }
459 }
460
461 function openai_incidents() {
462 try {
463 $transient = get_transient( 'mwai_openai_incidents' );
464 if ( $transient ) {
465 return new WP_REST_Response([ 'success' => true, 'incidents' => $transient ], 200 );
466 }
467 $openai = new Meow_MWAI_OpenAI( $this->core );
468 $incidents = $openai->getIncidents();
469 set_transient( 'mwai_openai_incidents', $incidents, 60 * 10 );
470 return new WP_REST_Response([ 'success' => true, 'incidents' => $incidents ], 200 );
471 }
472 catch ( Exception $e ) {
473 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
474 }
475 }
476
477 function count_posts( $request ) {
478 $params = $request->get_query_params();
479 $postType = $params['postType'];
480 $count = wp_count_posts( $postType );
481 return new WP_REST_Response([ 'success' => true, 'count' => $count ], 200 );
482 }
483
484 function post_content( $request ) {
485 $params = $request->get_query_params();
486 $offset = $params['offset'];
487 $postType = $params['postType'];
488 $postId = $params['postId'];
489 $post = null;
490 if ( !empty( $postId ) ) {
491 $post = get_post( $postId );
492 }
493 else {
494 $posts = get_posts( [
495 'posts_per_page' => 1,
496 'post_type' => $postType,
497 'offset' => $offset,
498 'post_status' => 'publish'
499 ] );
500 $post = count( $posts ) === 0 ? null : $posts[0];
501 }
502 if ( !$post ) {
503 return new WP_REST_Response([ 'success' => false, 'message' => 'Post not found' ], 404 );
504 }
505 $content = apply_filters( 'the_content', $post->post_content );
506 $content = wp_strip_all_tags( $content );
507 $content = preg_replace( '/[\r\n]+/', "\n", $content );
508 $title = $post->post_title;
509 $excerpt = $post->post_excerpt;
510 $url = get_permalink( $post->ID );
511 return new WP_REST_Response([ 'success' => true, 'content' => $content,
512 'title' => $title, 'url' => $url, 'excerpt' => $excerpt ], 200 );
513 }
514
515 function templates_get( $request ) {
516 $params = $request->get_query_params();
517 $category = $params['category'];
518 $templates = [];
519 $templates_option = get_option( 'mwai_templates', [] );
520 if ( !is_array( $templates_option ) ) {
521 update_option( 'mwai_templates', [] );
522 }
523 $categories = array_column( $templates_option, 'category' );
524 $index = array_search( $category, $categories );
525 $templates = [];
526 if ( $index !== false ) {
527 $templates = $templates_option[$index]['templates'];
528 }
529 return new WP_REST_Response([ 'success' => true, 'templates' => $templates ], 200 );
530 }
531
532 function templates_save( $request ) {
533 $params = $request->get_json_params();
534 $category = $params['category'];
535 $templates = $params['templates'];
536 $templates_option = get_option( 'mwai_templates', [] );
537 $categories = array_column( $templates_option, 'category' );
538 $index = array_search( $category, $categories );
539 if ( $index !== false && $index >= 0 ) {
540 $templates_option[$index]['templates'] = $templates;
541 }
542 else {
543 $group = [ 'category' => $category, 'templates' => $templates ];
544 $templates_option[] = $group;
545 }
546
547 update_option( 'mwai_templates', $templates_option );
548 return new WP_REST_Response([ 'success' => true ], 200 );
549 }
550
551 function get_logs( $request ) {
552 $params = $request->get_json_params();
553 $offset = $params['offset'];
554 $limit = $params['limit'];
555 $filters = $params['filters'];
556 $sort = $params['sort'];
557 $logs = apply_filters( 'mwai_stats_logs', [], $offset, $limit, $filters, $sort );
558 return new WP_REST_Response([ 'success' => true, 'total' => $logs['total'], 'logs' => $logs['rows'] ], 200 );
559 }
560 }
561