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