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