PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 1.1.7
AI Engine – The Chatbot, AI Framework & MCP for WordPress v1.1.7
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
592 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 register_rest_route( $this->namespace, '/vectors', array(
134 'methods' => 'POST',
135 'permission_callback' => array( $this->core, 'can_access_settings' ),
136 'callback' => array( $this, 'get_vectors' ),
137 ) );
138 register_rest_route( $this->namespace, '/moderate', array(
139 'methods' => 'POST',
140 'permission_callback' => array( $this->core, 'can_access_settings' ),
141 'callback' => array( $this, 'moderate' ),
142 ) );
143 }
144 catch ( Exception $e ) {
145 var_dump( $e );
146 }
147 }
148
149 function rest_all_settings() {
150 return new WP_REST_Response( [
151 'success' => true,
152 'data' => $this->core->get_all_options()
153 ], 200 );
154 }
155
156 function rest_update_option( $request ) {
157 try {
158 $params = $request->get_json_params();
159 $value = $params['options'];
160 $options = $this->core->update_options( $value );
161 $success = !!$options;
162 $message = __( $success ? 'OK' : "Could not update options.", 'ai-engine' );
163 return new WP_REST_Response([ 'success' => $success, 'message' => $message, 'options' => $options ], 200 );
164 }
165 catch ( Exception $e ) {
166 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
167 }
168 }
169
170 function createValidationResult( $result = true, $message = null) {
171 $message = $message ? $message : __( 'OK', 'ai-engine' );
172 return [ 'result' => $result, 'message' => $message ];
173 }
174
175 function validate_updated_option( $option_name ) {
176 $option_checkbox = get_option( 'mwai_option_checkbox', false );
177 $option_text = get_option( 'mwai_option_text', 'Default' );
178 if ( $option_checkbox === '' )
179 update_option( 'mwai_option_checkbox', false );
180 if ( $option_text === '' )
181 update_option( 'mwai_option_text', 'Default' );
182 return $this->createValidationResult();
183 }
184
185 function make_completions( $request ) {
186 try {
187 $params = $request->get_json_params();
188 $prompt = $params['prompt'];
189 $query = new Meow_MWAI_QueryText( $prompt );
190 $query->injectParams( $params );
191 $answer = $this->core->ai->run( $query );
192 return new WP_REST_Response([ 'success' => true, 'data' => $answer->result, 'usage' => $answer->usage ], 200 );
193 }
194 catch ( Exception $e ) {
195 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
196 }
197 }
198
199 function make_images( $request ) {
200 try {
201 $params = $request->get_json_params();
202 $prompt = $params['prompt'];
203 $query = new Meow_MWAI_QueryImage( $prompt );
204 $query->injectParams( $params );
205 $answer = $this->core->ai->run( $query );
206 return new WP_REST_Response([ 'success' => true, 'data' => $answer->results, 'usage' => $answer->usage ], 200 );
207 }
208 catch ( Exception $e ) {
209 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
210 }
211 }
212
213 function make_titles( $request ) {
214 try {
215 $params = $request->get_json_params();
216 $postId = intval( $params['postId'] );
217 $text = $this->core->get_text_from_postId( $postId );
218 $prompt = "Create a short SEO-friendly title for this article: " . $text;
219 $query = new Meow_MWAI_QueryText( $prompt, 128 );
220 $query->setMaxResults( 5 );
221 $query->setEnv( 'admin-tools' );
222 $answer = $this->core->ai->run( $query );
223 return new WP_REST_Response([ 'success' => true, 'data' => $answer->results ], 200 );
224 }
225 catch ( Exception $e ) {
226 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
227 }
228 }
229
230 function make_excerpts( $request ) {
231 try {
232 $params = $request->get_json_params();
233 $postId = intval( $params['postId'] );
234 $text = $this->core->get_text_from_postId( $postId );
235 $prompt = "Create a SEO-friendly introduction to this article, 120 to 170 characters max, no URLs: " . $text;
236 $query = new Meow_MWAI_QueryText( $prompt, 512 );
237 $query->setMaxResults( 5 );
238 $query->setEnv( 'admin-tools' );
239 $answer = $this->core->ai->run( $query );
240 return new WP_REST_Response([ 'success' => true, 'data' => $answer->results ], 200 );
241 }
242 catch ( Exception $e ) {
243 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
244 }
245 }
246
247 function update_post_title( $request ) {
248 try {
249 $params = $request->get_json_params();
250 $title = sanitize_text_field( $params['title'] );
251 $postId = intval( $params['postId'] );
252 $post = get_post( $postId );
253 if ( !$post ) {
254 throw new Exception( 'There is no post with this ID.' );
255 }
256 $post->post_title = $title;
257 //$post->post_name = sanitize_title( $title );
258 wp_update_post( $post );
259 return new WP_REST_Response([ 'success' => true, 'message' => "Title updated." ], 200 );
260 }
261 catch ( Exception $e ) {
262 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
263 }
264 }
265
266 function update_post_excerpt( $request ) {
267 try {
268 $params = $request->get_json_params();
269 $excerpt = sanitize_text_field( $params['excerpt'] );
270 $postId = intval( $params['postId'] );
271 $post = get_post( $postId );
272 if ( !$post ) {
273 throw new Exception( 'There is no post with this ID.' );
274 }
275 $post->post_excerpt = $excerpt;
276 wp_update_post( $post );
277 return new WP_REST_Response([ 'success' => true, 'message' => "Excerpt updated." ], 200 );
278 }
279 catch ( Exception $e ) {
280 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
281 }
282 }
283
284 function create_post( $request ) {
285 try {
286 $params = $request->get_json_params();
287 $title = sanitize_text_field( $params['title'] );
288 // Sanitize content that contains line returns and HTML tags
289 $content = sanitize_textarea_field( $params['content'] );
290 $excerpt = sanitize_text_field( $params['excerpt'] );
291 //$postType = sanitize_text_field( $params['postType'] );
292 $post = new stdClass();
293 $post->post_title = $title;
294 $post->post_excerpt = $excerpt;
295 $post->post_content = $content;
296 $post->post_status = 'draft';
297 $post->post_type = 'post';
298 $post->post_content = $this->core->markdown_to_html( $post->post_content );
299 $postId = wp_insert_post( $post );
300 return new WP_REST_Response([ 'success' => true, 'postId' => $postId ], 200 );
301 }
302 catch ( Exception $e ) {
303 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
304 }
305 }
306
307 function curl_download( $Url ) {
308 if ( !function_exists( 'curl_init' ) ) {
309 die( 'CURL is not installed!' );
310 }
311 $ch = curl_init();
312 curl_setopt( $ch, CURLOPT_URL, $Url );
313 curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
314 $output = curl_exec( $ch );
315 curl_close( $ch );
316 return $output;
317 }
318
319 function create_image( $request ) {
320 try {
321 $params = $request->get_json_params();
322 $title = sanitize_text_field( $params['title'] );
323 $caption = sanitize_text_field( $params['caption'] );
324 $alt = sanitize_text_field( $params['alt'] );
325 $description = sanitize_text_field( $params['description'] );
326 $url = $params['url'];
327 $filename = sanitize_text_field( $params['filename'] );
328 $image_data = $this->curl_download( $url );
329 if ( !$image_data ) {
330 throw new Exception( 'Could not download the image.' );
331 }
332 $upload_dir = wp_upload_dir();
333 if ( empty( $filename ) ) {
334 $filename = basename( $url );
335 }
336 $wp_filetype = wp_check_filetype( $filename );
337 if ( wp_mkdir_p( $upload_dir['path'] ) ) {
338 $file = $upload_dir['path'] . '/' . $filename;
339 }
340 else {
341 $file = $upload_dir['basedir'] . '/' . $filename;
342 }
343
344 // Make sure the file is unique, if not, add a number to the end of the file before the extension
345 $i = 1;
346 $parts = pathinfo( $file );
347 while ( file_exists( $file ) ) {
348 $file = $parts['dirname'] . '/' . $parts['filename'] . '-' . $i . '.' . $parts['extension'];
349 $i++;
350 }
351
352 // Write the file
353 file_put_contents( $file, $image_data );
354 $attachment = [
355 'post_mime_type' => $wp_filetype['type'],
356 'post_title' => $title,
357 'post_content' => $description,
358 'post_excerpt' => $caption,
359 'post_status' => 'inherit'
360 ];
361 // Register the file as a Media Library attachment
362 $attachmentId = wp_insert_attachment( $attachment, $file );
363 require_once( ABSPATH . 'wp-admin/includes/image.php' );
364 $attachment_data = wp_generate_attachment_metadata( $attachmentId, $file );
365 wp_update_attachment_metadata( $attachmentId, $attachment_data );
366 update_post_meta( $attachmentId, '_wp_attachment_image_alt', $alt );
367 return new WP_REST_Response([ 'success' => true, 'attachmentId' => $attachmentId ], 200 );
368 }
369 catch ( Exception $e ) {
370 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
371 }
372 }
373
374 function openai_files_get( $request ) {
375 try {
376 //$params = $request->get_json_params();
377 $openai = new Meow_MWAI_OpenAI( $this->core );
378 $files = $openai->listFiles();
379 return new WP_REST_Response([ 'success' => true, 'files' => $files ], 200 );
380 }
381 catch ( Exception $e ) {
382 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
383 }
384 }
385
386 function openai_finetunes_get( $request ) {
387 try {
388 $params = $request->get_query_params();
389 $clean = isset( $params['clean'] ) ? true : false;
390 $openai = new Meow_MWAI_OpenAI( $this->core );
391 $finetunes = $openai->listFineTunes( $clean );
392 return new WP_REST_Response([ 'success' => true, 'finetunes' => $finetunes ], 200 );
393 }
394 catch ( Exception $e ) {
395 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
396 }
397 }
398
399 function openai_files_upload( $request ) {
400 try {
401 $params = $request->get_json_params();
402 $filename = sanitize_text_field( $params['filename'] );
403 $data = $params['data'];
404 $openai = new Meow_MWAI_OpenAI( $this->core );
405 $file = $openai->uploadFile( $filename, $data );
406 return new WP_REST_Response([ 'success' => true, 'file' => $file ], 200 );
407 }
408 catch ( Exception $e ) {
409 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
410 }
411 }
412
413 function openai_files_delete( $request ) {
414 try {
415 $params = $request->get_json_params();
416 $fileId = $params['fileId'];
417 $openai = new Meow_MWAI_OpenAI( $this->core );
418 $openai->deleteFile( $fileId );
419 return new WP_REST_Response([ 'success' => true ], 200 );
420 }
421 catch ( Exception $e ) {
422 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
423 }
424 }
425
426 function openai_finetunes_delete( $request ) {
427 try {
428 $params = $request->get_json_params();
429 $modelId = $params['modelId'];
430 $openai = new Meow_MWAI_OpenAI( $this->core );
431 $openai->deleteFineTune( $modelId );
432 return new WP_REST_Response([ 'success' => true ], 200 );
433 }
434 catch ( Exception $e ) {
435 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
436 }
437 }
438
439 function openai_files_download( $request ) {
440 try {
441 $params = $request->get_json_params();
442 $fileId = $params['fileId'];
443 $openai = new Meow_MWAI_OpenAI( $this->core );
444 $data = $openai->downloadFile( $fileId );
445 return new WP_REST_Response([ 'success' => true, 'data' => $data ], 200 );
446 }
447 catch ( Exception $e ) {
448 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
449 }
450 }
451
452 function openai_files_finetune( $request ) {
453 try {
454 $params = $request->get_json_params();
455 $fileId = $params['fileId'];
456 $model = $params['model'];
457 $suffix = $params['suffix'];
458 $hyperparams = [
459 "nEpochs" => $params['nEpochs'],
460 "batchSize" => $params['batchSize']
461 ];
462 $openai = new Meow_MWAI_OpenAI( $this->core );
463 $finetune = $openai->fineTuneFile( $fileId, $model, $suffix, $hyperparams );
464 return new WP_REST_Response([ 'success' => true, 'finetune' => $finetune ], 200 );
465 }
466 catch ( Exception $e ) {
467 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
468 }
469 }
470
471 function openai_incidents() {
472 try {
473 $transient = get_transient( 'mwai_openai_incidents' );
474 if ( $transient ) {
475 return new WP_REST_Response([ 'success' => true, 'incidents' => $transient ], 200 );
476 }
477 $openai = new Meow_MWAI_OpenAI( $this->core );
478 $incidents = $openai->getIncidents();
479 set_transient( 'mwai_openai_incidents', $incidents, 60 * 10 );
480 return new WP_REST_Response([ 'success' => true, 'incidents' => $incidents ], 200 );
481 }
482 catch ( Exception $e ) {
483 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
484 }
485 }
486
487 function count_posts( $request ) {
488 $params = $request->get_query_params();
489 $postType = $params['postType'];
490 $count = wp_count_posts( $postType );
491 return new WP_REST_Response([ 'success' => true, 'count' => $count ], 200 );
492 }
493
494 function post_content( $request ) {
495 $params = $request->get_query_params();
496 $offset = $params['offset'];
497 $postType = $params['postType'];
498 $postId = $params['postId'];
499 $post = null;
500 if ( !empty( $postId ) ) {
501 $post = get_post( $postId );
502 }
503 else {
504 $posts = get_posts( [
505 'posts_per_page' => 1,
506 'post_type' => $postType,
507 'offset' => $offset,
508 'post_status' => 'publish'
509 ] );
510 $post = count( $posts ) === 0 ? null : $posts[0];
511 }
512 if ( !$post ) {
513 return new WP_REST_Response([ 'success' => false, 'message' => 'Post not found' ], 404 );
514 }
515 $content = apply_filters( 'the_content', $post->post_content );
516 $content = wp_strip_all_tags( $content );
517 $content = preg_replace( '/[\r\n]+/', "\n", $content );
518 $title = $post->post_title;
519 $excerpt = $post->post_excerpt;
520 $url = get_permalink( $post->ID );
521 return new WP_REST_Response([ 'success' => true, 'content' => $content,
522 'title' => $title, 'url' => $url, 'excerpt' => $excerpt ], 200 );
523 }
524
525 function templates_get( $request ) {
526 $params = $request->get_query_params();
527 $category = $params['category'];
528 $templates = [];
529 $templates_option = get_option( 'mwai_templates', [] );
530 if ( !is_array( $templates_option ) ) {
531 update_option( 'mwai_templates', [] );
532 }
533 $categories = array_column( $templates_option, 'category' );
534 $index = array_search( $category, $categories );
535 $templates = [];
536 if ( $index !== false ) {
537 $templates = $templates_option[$index]['templates'];
538 }
539 return new WP_REST_Response([ 'success' => true, 'templates' => $templates ], 200 );
540 }
541
542 function templates_save( $request ) {
543 $params = $request->get_json_params();
544 $category = $params['category'];
545 $templates = $params['templates'];
546 $templates_option = get_option( 'mwai_templates', [] );
547 $categories = array_column( $templates_option, 'category' );
548 $index = array_search( $category, $categories );
549 if ( $index !== false && $index >= 0 ) {
550 $templates_option[$index]['templates'] = $templates;
551 }
552 else {
553 $group = [ 'category' => $category, 'templates' => $templates ];
554 $templates_option[] = $group;
555 }
556
557 update_option( 'mwai_templates', $templates_option );
558 return new WP_REST_Response([ 'success' => true ], 200 );
559 }
560
561 function get_logs( $request ) {
562 $params = $request->get_json_params();
563 $offset = $params['offset'];
564 $limit = $params['limit'];
565 $filters = $params['filters'];
566 $sort = $params['sort'];
567 $logs = apply_filters( 'mwai_stats_logs', [], $offset, $limit, $filters, $sort );
568 return new WP_REST_Response([ 'success' => true, 'total' => $logs['total'], 'logs' => $logs['rows'] ], 200 );
569 }
570
571 function get_vectors( $request ) {
572 $params = $request->get_json_params();
573 $offset = $params['offset'];
574 $limit = $params['limit'];
575 $filters = $params['filters'];
576 $sort = $params['sort'];
577 $vectors = apply_filters( 'mwai_embeddings_vectors', [], $offset, $limit, $filters, $sort );
578 return new WP_REST_Response([ 'success' => true, 'total' => $vectors['total'], 'vectors' => $vectors['rows'] ], 200 );
579 }
580
581 function moderate( $request ) {
582 $params = $request->get_json_params();
583 $text = $params['text'];
584 if ( !$text ) {
585 return new WP_REST_Response([ 'success' => false, 'message' => 'Text not found.' ], 404 );
586 }
587 $openai = new Meow_MWAI_OpenAI( $this->core );
588 $results = $openai->moderate( $text );
589 return new WP_REST_Response([ 'success' => true, 'results' => $results ], 200 );
590 }
591 }
592