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