PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 1.4.3
AI Engine – The Chatbot, AI Framework & MCP for WordPress v1.4.3
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 security.php 3 years ago
rest.php
859 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_deleted_finetunes', array(
91 'methods' => 'GET',
92 'permission_callback' => array( $this->core, 'can_access_settings' ),
93 'callback' => array( $this, 'openai_deleted_finetunes_get' ),
94 ) );
95 register_rest_route( $this->namespace, '/openai_finetunes', array(
96 'methods' => 'GET',
97 'permission_callback' => array( $this->core, 'can_access_settings' ),
98 'callback' => array( $this, 'openai_finetunes_get' ),
99 ) );
100 register_rest_route( $this->namespace, '/openai_finetunes', array(
101 'methods' => 'DELETE',
102 'permission_callback' => array( $this->core, 'can_access_settings' ),
103 'callback' => array( $this, 'openai_finetunes_delete' ),
104 ) );
105 register_rest_route( $this->namespace, '/openai_finetunes_cancel', array(
106 'methods' => 'POST',
107 'permission_callback' => array( $this->core, 'can_access_settings' ),
108 'callback' => array( $this, 'openai_finetunes_cancel' ),
109 ) );
110 register_rest_route( $this->namespace, '/openai_incidents', array(
111 'methods' => 'GET',
112 'permission_callback' => array( $this->core, 'can_access_settings' ),
113 'callback' => array( $this, 'openai_incidents' ),
114 ) );
115 register_rest_route( $this->namespace, '/chatbots', array(
116 'methods' => ['GET', 'PUT'],
117 'permission_callback' => array( $this->core, 'can_access_settings' ),
118 'callback' => array( $this, 'rest_chatbots' ),
119 ) );
120 register_rest_route( $this->namespace, '/themes', array(
121 'methods' => ['GET', 'PUT'],
122 'permission_callback' => array( $this->core, 'can_access_settings' ),
123 'callback' => array( $this, 'rest_themes' ),
124 ) );
125 register_rest_route( $this->namespace, '/count_posts', array(
126 'methods' => 'GET',
127 'permission_callback' => array( $this->core, 'can_access_features' ),
128 'callback' => array( $this, 'count_posts' ),
129 ) );
130 register_rest_route( $this->namespace, '/post_types', array(
131 'methods' => 'GET',
132 'permission_callback' => array( $this->core, 'can_access_features' ),
133 'callback' => array( $this, 'post_types' ),
134 ) );
135 register_rest_route( $this->namespace, '/post_content', array(
136 'methods' => 'GET',
137 'permission_callback' => array( $this->core, 'can_access_features' ),
138 'callback' => array( $this, 'post_content' ),
139 ) );
140 register_rest_route( $this->namespace, '/templates', array(
141 'methods' => 'GET',
142 'permission_callback' => array( $this->core, 'can_access_features' ),
143 'callback' => array( $this, 'templates_get' ),
144 ) );
145 register_rest_route( $this->namespace, '/templates', array(
146 'methods' => 'POST',
147 'permission_callback' => array( $this->core, 'can_access_features' ),
148 'callback' => array( $this, 'templates_save' ),
149 ) );
150 register_rest_route( $this->namespace, '/magic_wand', array(
151 'methods' => 'POST',
152 'callback' => array( $this, 'magic_wand' ),
153 'permission_callback' => array( $this->core, 'can_access_features' ),
154 ) );
155 register_rest_route( $this->namespace, '/logs', array(
156 'methods' => 'POST',
157 'permission_callback' => array( $this->core, 'can_access_settings' ),
158 'callback' => array( $this, 'get_logs' ),
159 ) );
160 register_rest_route( $this->namespace, '/moderate', array(
161 'methods' => 'POST',
162 'permission_callback' => array( $this->core, 'can_access_settings' ),
163 'callback' => array( $this, 'moderate' ),
164 ) );
165 register_rest_route( $this->namespace, '/vectors', array(
166 'methods' => 'POST',
167 'permission_callback' => array( $this->core, 'can_access_settings' ),
168 'callback' => array( $this, 'get_vectors' ),
169 ) );
170 register_rest_route( $this->namespace, '/vector', array(
171 'methods' => 'POST',
172 'permission_callback' => array( $this->core, 'can_access_settings' ),
173 'callback' => array( $this, 'add_vector' ),
174 ) );
175 register_rest_route( $this->namespace, '/vectors_ref', array(
176 'methods' => 'POST',
177 'permission_callback' => array( $this->core, 'can_access_settings' ),
178 'callback' => array( $this, 'get_vectors_ref' ),
179 ) );
180 register_rest_route( $this->namespace, '/vector', array(
181 'methods' => 'PUT',
182 'permission_callback' => array( $this->core, 'can_access_settings' ),
183 'callback' => array( $this, 'modify_vector' ),
184 ) );
185 register_rest_route( $this->namespace, '/vectors', array(
186 'methods' => 'DELETE',
187 'permission_callback' => array( $this->core, 'can_access_settings' ),
188 'callback' => array( $this, 'delete_vectors' ),
189 ) );
190 register_rest_route( $this->namespace, '/transcribe', array(
191 'methods' => 'POST',
192 'permission_callback' => array( $this->core, 'can_access_settings' ),
193 'callback' => array( $this, 'transcribe' ),
194 ) );
195 }
196 catch ( Exception $e ) {
197 var_dump( $e );
198 }
199 }
200
201 function rest_all_settings() {
202 return new WP_REST_Response( [
203 'success' => true,
204 'data' => $this->core->get_all_options()
205 ], 200 );
206 }
207
208 function rest_update_option( $request ) {
209 try {
210 $params = $request->get_json_params();
211 $value = $params['options'];
212 $options = $this->core->update_options( $value );
213 $success = !!$options;
214 $message = __( $success ? 'OK' : "Could not update options.", 'ai-engine' );
215 return new WP_REST_Response([ 'success' => $success, 'message' => $message, 'options' => $options ], 200 );
216 }
217 catch ( Exception $e ) {
218 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
219 }
220 }
221
222 function createValidationResult( $result = true, $message = null) {
223 $message = $message ? $message : __( 'OK', 'ai-engine' );
224 return [ 'result' => $result, 'message' => $message ];
225 }
226
227 function validate_updated_option( $option_name ) {
228 $option_checkbox = get_option( 'mwai_option_checkbox', false );
229 $option_text = get_option( 'mwai_option_text', 'Default' );
230 if ( $option_checkbox === '' )
231 update_option( 'mwai_option_checkbox', false );
232 if ( $option_text === '' )
233 update_option( 'mwai_option_text', 'Default' );
234 return $this->createValidationResult();
235 }
236
237 function make_completions( $request ) {
238 try {
239 $params = $request->get_json_params();
240 $prompt = $params['prompt'];
241 $query = new Meow_MWAI_QueryText( $prompt );
242 $query->injectParams( $params );
243 $answer = $this->core->ai->run( $query );
244 return new WP_REST_Response([ 'success' => true, 'data' => $answer->result, 'usage' => $answer->usage ], 200 );
245 }
246 catch ( Exception $e ) {
247 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
248 }
249 }
250
251 function make_images( $request ) {
252 try {
253 $params = $request->get_json_params();
254 $prompt = $params['prompt'];
255 $query = new Meow_MWAI_QueryImage( $prompt );
256 $query->injectParams( $params );
257 $answer = $this->core->ai->run( $query );
258 return new WP_REST_Response([ 'success' => true, 'data' => $answer->results, 'usage' => $answer->usage ], 200 );
259 }
260 catch ( Exception $e ) {
261 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
262 }
263 }
264
265 function magic_wand( $request ) {
266 try {
267 $params = $request->get_json_params();
268 $action = isset( $params['action'] ) ? $params['action'] : null;
269 $data = isset( $params['data'] ) ? $params['data'] : null;
270 if ( empty( $data ) || empty( $action ) ) {
271 return new WP_REST_Response([ 'success' => false, 'message' => "An action and some data are required." ], 500 );
272 }
273 $postId = isset( $data['postId'] ) ? $data['postId'] : null;
274 $text = isset( $data['text'] ) ? $data['text'] : null;
275 $selectedText = isset( $data['selectedText'] ) ? $data['selectedText'] : null;
276
277 // TODO: As soon as we have a wide range of usages and possibilities,
278 // let's refactor this into a nice and extensible UI/API.
279 $query = new Meow_MWAI_QueryText( "", 1024 );
280 $query->setEnv( 'admin-tools' );
281 $mode = 'replace';
282 if ( $action === 'correctText' ) {
283 $query->setPrompt( "Correct the typos and grammar mistakes in this text without altering its content. Return only the corrected text, without explanations or additional content.\n\n" . $text );
284 }
285 else if ( $action === 'enhanceText' ) {
286 $query->setPrompt( "Enhance this text by eliminating redundancies, utilizing a more suitable vocabulary, and refining its structure. Provide only the revised text, without explanations or any additional content.\n\n" . $text );
287 }
288 else if ( $action === 'suggestSynonyms' ) {
289 $mode = 'suggest';
290 $query->setPrompt( "Suggest a synonym or an alternative wording for the given word or sentence, maintaining the original language and preserving the initial and final punctuation. Provide only the resulting word or expression, without any extra information.\n\n" . $selectedText );
291 $query->setTemperature( 1 );
292 $query->setMaxResults( 5 );
293 }
294 else if ( $action === 'translateText' ) {
295 $query->setPrompt( "Translate the text into {LANGUAGE}, preserving the tone, mood, and nuance, while staying as true as possible to the original meaning. Provide only the translated text, without any additional content.\n\n" . $text );
296 $language = $this->core->get_post_language( $postId );
297 $query->replace( '{LANGUAGE}', $language );
298 }
299 $answer = $this->core->ai->run( $query );
300 return new WP_REST_Response([ 'success' => true, 'data' => [
301 'mode' => $mode,
302 'result' => $answer->result,
303 'results' => $answer->results
304 ] ], 200 );
305 }
306 catch ( Exception $e ) {
307 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
308 }
309 }
310
311 function make_titles( $request ) {
312 try {
313 $params = $request->get_json_params();
314 $postId = intval( $params['postId'] );
315 $text = $this->core->getCleanPostContent( $postId );
316 if ( empty( $text ) ) {
317 return new WP_REST_Response([ 'success' => false, 'message' => "No text found for this post." ], 500 );
318 }
319 $language = $this->core->get_post_language( $postId );
320 $prompt = "Using the same original language ($language), create a short but SEO-friendly title for this text: " . $text;
321 $query = new Meow_MWAI_QueryText( $prompt, 128 );
322 $query->setMaxResults( 5 );
323 $query->setEnv( 'admin-tools' );
324 $answer = $this->core->ai->run( $query );
325 return new WP_REST_Response([ 'success' => true, 'data' => $answer->results ], 200 );
326 }
327 catch ( Exception $e ) {
328 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
329 }
330 }
331
332 function make_excerpts( $request ) {
333 try {
334 $params = $request->get_json_params();
335 $postId = intval( $params['postId'] );
336 $text = $this->core->getCleanPostContent( $postId );
337 if ( empty( $text ) ) {
338 return new WP_REST_Response([ 'success' => false, 'message' => "No text found for this post." ], 500 );
339 }
340 $language = $this->core->get_post_language( $postId );
341 $prompt = "Using the same original language ($language), create a SEO-friendly introduction to this text, 120 to 170 characters max, no URLs: " . $text;
342 $query = new Meow_MWAI_QueryText( $prompt, 512 );
343 $query->setMaxResults( 5 );
344 $query->setEnv( 'admin-tools' );
345 $answer = $this->core->ai->run( $query );
346 return new WP_REST_Response([ 'success' => true, 'data' => $answer->results ], 200 );
347 }
348 catch ( Exception $e ) {
349 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
350 }
351 }
352
353 function update_post_title( $request ) {
354 try {
355 $params = $request->get_json_params();
356 $title = sanitize_text_field( $params['title'] );
357 $postId = intval( $params['postId'] );
358 $post = get_post( $postId );
359 if ( !$post ) {
360 throw new Exception( 'There is no post with this ID.' );
361 }
362 $post->post_title = $title;
363 //$post->post_name = sanitize_title( $title );
364 wp_update_post( $post );
365 return new WP_REST_Response([ 'success' => true, 'message' => "Title updated." ], 200 );
366 }
367 catch ( Exception $e ) {
368 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
369 }
370 }
371
372 function update_post_excerpt( $request ) {
373 try {
374 $params = $request->get_json_params();
375 $excerpt = sanitize_text_field( $params['excerpt'] );
376 $postId = intval( $params['postId'] );
377 $post = get_post( $postId );
378 if ( !$post ) {
379 throw new Exception( 'There is no post with this ID.' );
380 }
381 $post->post_excerpt = $excerpt;
382 wp_update_post( $post );
383 return new WP_REST_Response([ 'success' => true, 'message' => "Excerpt updated." ], 200 );
384 }
385 catch ( Exception $e ) {
386 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
387 }
388 }
389
390 function create_post( $request ) {
391 try {
392 $params = $request->get_json_params();
393 $title = sanitize_text_field( $params['title'] );
394 $content = sanitize_textarea_field( $params['content'] );
395 $excerpt = sanitize_text_field( $params['excerpt'] );
396 $postType = sanitize_text_field( $params['postType'] );
397 $post = new stdClass();
398 $post->post_title = $title;
399 $post->post_excerpt = $excerpt;
400 $post->post_content = $content;
401 $post->post_status = 'draft';
402 $post->post_type = isset( $postType ) ? $postType : 'post';
403 $post->post_content = $this->core->markdown_to_html( $post->post_content );
404 $postId = wp_insert_post( $post );
405 return new WP_REST_Response([ 'success' => true, 'postId' => $postId ], 200 );
406 }
407 catch ( Exception $e ) {
408 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
409 }
410 }
411
412 function image_download( $url ) {
413 $response = wp_remote_get( $url );
414 $output = wp_remote_retrieve_body( $response );
415 return $output;
416 }
417
418 function create_image( $request ) {
419 try {
420 $params = $request->get_json_params();
421 $title = sanitize_text_field( $params['title'] );
422 $caption = sanitize_text_field( $params['caption'] );
423 $alt = sanitize_text_field( $params['alt'] );
424 $description = sanitize_text_field( $params['description'] );
425 $url = $params['url'];
426 $filename = sanitize_text_field( $params['filename'] );
427 $image_data = $this->image_download( $url );
428 if ( !$image_data ) {
429 throw new Exception( 'Could not download the image.' );
430 }
431 $upload_dir = wp_upload_dir();
432 if ( empty( $filename ) ) {
433 $filename = basename( $url );
434 }
435 $wp_filetype = wp_check_filetype( $filename );
436 if ( wp_mkdir_p( $upload_dir['path'] ) ) {
437 $file = $upload_dir['path'] . '/' . $filename;
438 }
439 else {
440 $file = $upload_dir['basedir'] . '/' . $filename;
441 }
442
443 // Make sure the file is unique, if not, add a number to the end of the file before the extension
444 $i = 1;
445 $parts = pathinfo( $file );
446 while ( file_exists( $file ) ) {
447 $file = $parts['dirname'] . '/' . $parts['filename'] . '-' . $i . '.' . $parts['extension'];
448 $i++;
449 }
450
451 // Write the file
452 file_put_contents( $file, $image_data );
453 $attachment = [
454 'post_mime_type' => $wp_filetype['type'],
455 'post_title' => $title,
456 'post_content' => $description,
457 'post_excerpt' => $caption,
458 'post_status' => 'inherit'
459 ];
460 // Register the file as a Media Library attachment
461 $attachmentId = wp_insert_attachment( $attachment, $file );
462 require_once( ABSPATH . 'wp-admin/includes/image.php' );
463 $attachment_data = wp_generate_attachment_metadata( $attachmentId, $file );
464 wp_update_attachment_metadata( $attachmentId, $attachment_data );
465 update_post_meta( $attachmentId, '_wp_attachment_image_alt', $alt );
466 return new WP_REST_Response([ 'success' => true, 'attachmentId' => $attachmentId ], 200 );
467 }
468 catch ( Exception $e ) {
469 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
470 }
471 }
472
473 function openai_files_get() {
474 try {
475 //$params = $request->get_json_params();
476 $openai = new Meow_MWAI_OpenAI( $this->core );
477 $files = $openai->listFiles();
478 return new WP_REST_Response([ 'success' => true, 'files' => $files ], 200 );
479 }
480 catch ( Exception $e ) {
481 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
482 }
483 }
484
485 function openai_deleted_finetunes_get() {
486 try {
487 $openai = new Meow_MWAI_OpenAI( $this->core );
488 $finetunes = $openai->listDeletedFineTunes();
489 return new WP_REST_Response([ 'success' => true, 'finetunes' => $finetunes ], 200 );
490 }
491 catch ( Exception $e ) {
492 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
493 }
494 }
495
496 function openai_finetunes_get() {
497 try {
498 $openai = new Meow_MWAI_OpenAI( $this->core );
499 $finetunes = $openai->listFineTunes();
500 return new WP_REST_Response([ 'success' => true, 'finetunes' => $finetunes ], 200 );
501 }
502 catch ( Exception $e ) {
503 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
504 }
505 }
506
507 function openai_files_upload( $request ) {
508 try {
509 $params = $request->get_json_params();
510 $filename = sanitize_text_field( $params['filename'] );
511 $data = $params['data'];
512 $openai = new Meow_MWAI_OpenAI( $this->core );
513 $file = $openai->uploadFile( $filename, $data );
514 return new WP_REST_Response([ 'success' => true, 'file' => $file ], 200 );
515 }
516 catch ( Exception $e ) {
517 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
518 }
519 }
520
521 function openai_files_delete( $request ) {
522 try {
523 $params = $request->get_json_params();
524 $fileId = $params['fileId'];
525 $openai = new Meow_MWAI_OpenAI( $this->core );
526 $openai->deleteFile( $fileId );
527 return new WP_REST_Response([ 'success' => true ], 200 );
528 }
529 catch ( Exception $e ) {
530 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
531 }
532 }
533
534 function openai_finetunes_cancel( $request ) {
535 try {
536 $params = $request->get_json_params();
537 $finetuneId = $params['finetuneId'];
538 $openai = new Meow_MWAI_OpenAI( $this->core );
539 $openai->cancelFineTune( $finetuneId );
540 return new WP_REST_Response([ 'success' => true ], 200 );
541 }
542 catch ( Exception $e ) {
543 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
544 }
545 }
546
547 function openai_finetunes_delete( $request ) {
548 try {
549 $params = $request->get_json_params();
550 $modelId = $params['modelId'];
551 $openai = new Meow_MWAI_OpenAI( $this->core );
552 $openai->deleteFineTune( $modelId );
553 return new WP_REST_Response([ 'success' => true ], 200 );
554 }
555 catch ( Exception $e ) {
556 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
557 }
558 }
559
560 function openai_files_download( $request ) {
561 try {
562 $params = $request->get_json_params();
563 $fileId = $params['fileId'];
564 $openai = new Meow_MWAI_OpenAI( $this->core );
565 $data = $openai->downloadFile( $fileId );
566 return new WP_REST_Response([ 'success' => true, 'data' => $data ], 200 );
567 }
568 catch ( Exception $e ) {
569 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
570 }
571 }
572
573 function openai_files_finetune( $request ) {
574 try {
575 $params = $request->get_json_params();
576 $fileId = $params['fileId'];
577 $model = $params['model'];
578 $suffix = $params['suffix'];
579 $hyperparams = [
580 "nEpochs" => $params['nEpochs'],
581 "batchSize" => $params['batchSize']
582 ];
583 $openai = new Meow_MWAI_OpenAI( $this->core );
584 $finetune = $openai->fineTuneFile( $fileId, $model, $suffix, $hyperparams );
585 return new WP_REST_Response([ 'success' => true, 'finetune' => $finetune ], 200 );
586 }
587 catch ( Exception $e ) {
588 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
589 }
590 }
591
592 function openai_incidents() {
593 try {
594 $transient = get_transient( 'mwai_openai_incidents' );
595 if ( $transient ) {
596 return new WP_REST_Response([ 'success' => true, 'incidents' => $transient ], 200 );
597 }
598 $openai = new Meow_MWAI_OpenAI( $this->core );
599 $incidents = $openai->getIncidents();
600 set_transient( 'mwai_openai_incidents', $incidents, 60 * 10 );
601 return new WP_REST_Response([ 'success' => true, 'incidents' => $incidents ], 200 );
602 }
603 catch ( Exception $e ) {
604 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
605 }
606 }
607
608 function count_posts( $request ) {
609 try {
610 $params = $request->get_query_params();
611 $postType = $params['postType'];
612 $count = wp_count_posts( $postType );
613 return new WP_REST_Response([ 'success' => true, 'count' => $count ], 200 );
614 }
615 catch ( Exception $e ) {
616 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
617 }
618 }
619
620 function post_content( $request ) {
621 try {
622 $params = $request->get_query_params();
623 $offset = (int)$params['offset'];
624 $postType = $params['postType'];
625 $postId = (int)$params['postId'];
626 $post = null;
627 if ( !empty( $postId ) ) {
628 $post = get_post( $postId );
629 if ( $post->post_status !== 'publish' && $post->post_status !== 'future' && $post->post_status !== 'draft' ) {
630 $post = null;
631 }
632 }
633 else {
634 $posts = get_posts( [
635 'posts_per_page' => 1,
636 'post_type' => $postType,
637 'offset' => $offset,
638 'post_status' => 'publish'
639 ] );
640 $post = count( $posts ) === 0 ? null : $posts[0];
641 }
642 if ( !$post ) {
643 return new WP_REST_Response([ 'success' => false, 'message' => 'Post not found' ], 404 );
644 }
645 $cleanPost = $this->core->getCleanPost( $post );
646 return new WP_REST_Response([ 'success' => true, 'content' => $cleanPost['content'],
647 'checksum' => $cleanPost['checksum'], 'language' => $cleanPost['language'], 'excerpt' => $cleanPost['excerpt'],
648 'postId' => $cleanPost['postId'], 'title' => $cleanPost['title'], 'url' => $cleanPost['url'] ], 200 );
649 }
650 catch ( Exception $e ) {
651 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
652 }
653 }
654
655 function templates_get( $request ) {
656 try {
657 $params = $request->get_query_params();
658 $category = $params['category'];
659 $templates = [];
660 $templates_option = get_option( 'mwai_templates', [] );
661 if ( !is_array( $templates_option ) ) {
662 update_option( 'mwai_templates', [] );
663 }
664 $categories = array_column( $templates_option, 'category' );
665 $index = array_search( $category, $categories );
666 $templates = [];
667 if ( $index !== false ) {
668 $templates = $templates_option[$index]['templates'];
669 }
670 return new WP_REST_Response([ 'success' => true, 'templates' => $templates ], 200 );
671 }
672 catch ( Exception $e ) {
673 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
674 }
675 }
676
677 function templates_save( $request ) {
678 try {
679 $params = $request->get_json_params();
680 $category = $params['category'];
681 $templates = $params['templates'];
682 $templates_option = get_option( 'mwai_templates', [] );
683 $categories = array_column( $templates_option, 'category' );
684 $index = array_search( $category, $categories );
685 if ( $index !== false && $index >= 0 ) {
686 $templates_option[$index]['templates'] = $templates;
687 }
688 else {
689 $group = [ 'category' => $category, 'templates' => $templates ];
690 $templates_option[] = $group;
691 }
692
693 update_option( 'mwai_templates', $templates_option );
694 return new WP_REST_Response([ 'success' => true ], 200 );
695 }
696 catch ( Exception $e ) {
697 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
698 }
699 }
700
701 function get_logs( $request ) {
702 try {
703 $params = $request->get_json_params();
704 $offset = $params['offset'];
705 $limit = $params['limit'];
706 $filters = $params['filters'];
707 $sort = $params['sort'];
708 $logs = apply_filters( 'mwai_stats_logs', [], $offset, $limit, $filters, $sort );
709 return new WP_REST_Response([ 'success' => true, 'total' => $logs['total'], 'logs' => $logs['rows'] ], 200 );
710 }
711 catch ( Exception $e ) {
712 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
713 }
714 }
715
716 function moderate( $request ) {
717 try {
718 $params = $request->get_json_params();
719 $text = $params['text'];
720 if ( !$text ) {
721 return new WP_REST_Response([ 'success' => false, 'message' => 'Text not found.' ], 404 );
722 }
723 $openai = new Meow_MWAI_OpenAI( $this->core );
724 $results = $openai->moderate( $text );
725 return new WP_REST_Response([ 'success' => true, 'results' => $results ], 200 );
726 }
727 catch ( Exception $e ) {
728 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
729 }
730
731 }
732
733 function get_vectors( $request ) {
734 try {
735 $params = $request->get_json_params();
736 $offset = $params['offset'];
737 $limit = $params['limit'];
738 $filters = $params['filters'];
739 $sort = $params['sort'];
740 $vectors = apply_filters( 'mwai_embeddings_vectors', [], $offset, $limit, $filters, $sort );
741 return new WP_REST_Response([ 'success' => true, 'total' => $vectors['total'], 'vectors' => $vectors['rows'] ], 200 );
742 }
743 catch ( Exception $e ) {
744 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
745 }
746 }
747
748 function add_vector( $request ) {
749 try {
750 $params = $request->get_json_params();
751 $vector = $params['vector'];
752 $success = apply_filters( 'mwai_embeddings_vectors_add', false, $vector );
753 return new WP_REST_Response([ 'success' => $success, 'vector' => $vector ], 200 );
754 }
755 catch ( Exception $e ) {
756 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
757 }
758 }
759
760 function get_vectors_ref( $request ) {
761 try {
762 $params = $request->get_json_params();
763 $refId = $params['refId'];
764 $vectors = apply_filters( 'mwai_embeddings_vectors_ref', false, $refId );
765 return new WP_REST_Response([ 'success' => true, 'vectors' => $vectors ], 200 );
766 }
767 catch ( Exception $e ) {
768 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
769 }
770 }
771
772 function modify_vector( $request ) {
773 try {
774 $params = $request->get_json_params();
775 $vector = $params['vector'];
776 $success = apply_filters( 'mwai_embeddings_vectors_update', false, $vector );
777 return new WP_REST_Response([ 'success' => $success, 'vector' => $vector ], 200 );
778 }
779 catch ( Exception $e ) {
780 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
781 }
782 }
783
784 function delete_vectors( $request ) {
785 try {
786 $params = $request->get_json_params();
787 $ids = $params['ids'];
788 $success = apply_filters( 'mwai_embeddings_vectors_delete', false, $ids );
789 return new WP_REST_Response([ 'success' => $success ], 200 );
790 }
791 catch ( Exception $e ) {
792 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
793 }
794 }
795
796 function transcribe( $request ) {
797 try {
798 $params = $request->get_json_params();
799 $query = new Meow_MWAI_QueryTranscribe();
800 $query->injectParams( $params );
801 $query->setEnv('admin-tools');
802 $answer = $this->core->ai->run( $query );
803 return new WP_REST_Response([ 'success' => true, 'data' => $answer->result ], 200 );
804 }
805 catch ( Exception $e ) {
806 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
807 }
808 }
809
810 function post_types() {
811 try {
812 $postTypes = $this->core->getPostTypes();
813 return new WP_REST_Response([ 'success' => true, 'postTypes' => $postTypes ], 200 );
814 }
815 catch ( Exception $e ) {
816 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
817 }
818 }
819
820 function rest_themes( $request ) {
821 try {
822 $method = $request->get_method();
823 if ( $method === 'GET' ) {
824 $themes = $this->core->getThemes();
825 return new WP_REST_Response([ 'success' => true, 'themes' => $themes ], 200 );
826 }
827 else if ( $method === 'PUT' ) {
828 $params = $request->get_json_params();
829 $themes = $params['themes'];
830 $themes = $this->core->updateThemes( $themes );
831 return new WP_REST_Response([ 'success' => true, 'themes' => $themes ], 200 );
832 }
833 }
834 catch ( Exception $e ) {
835 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
836 }
837 }
838
839 function rest_chatbots( $request ) {
840 try {
841 $method = $request->get_method();
842 if ( $method === 'GET' ) {
843 $chatbots = $this->core->getChatbots();
844 return new WP_REST_Response([ 'success' => true, 'chatbots' => $chatbots ], 200 );
845 }
846 else if ( $method === 'PUT' ) {
847 $params = $request->get_json_params();
848 $chatbots = $params['chatbots'];
849 $chatbots = $this->core->updateChatbots( $chatbots );
850 return new WP_REST_Response([ 'success' => true, 'chatbots' => $chatbots ], 200 );
851 }
852 return new WP_REST_Response([ 'success' => false, 'message' => 'Method not allowed' ], 405 );
853 }
854 catch ( Exception $e ) {
855 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
856 }
857 }
858 }
859