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