PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 1.6.61
AI Engine – The Chatbot, AI Framework & MCP for WordPress v1.6.61
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
engines 3 years ago modules 3 years ago admin.php 3 years ago api.php 3 years ago core.php 3 years ago init.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 reply.php 3 years ago rest.php 3 years ago
rest.php
892 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, '/update_post_title', array(
36 'methods' => 'POST',
37 'permission_callback' => array( $this->core, 'can_access_features' ),
38 'callback' => array( $this, 'update_post_title' ),
39 ) );
40 register_rest_route( $this->namespace, '/update_post_excerpt', array(
41 'methods' => 'POST',
42 'permission_callback' => array( $this->core, 'can_access_features' ),
43 'callback' => array( $this, 'update_post_excerpt' ),
44 ) );
45 register_rest_route( $this->namespace, '/copilot', array(
46 'methods' => 'POST',
47 'permission_callback' => array( $this->core, 'can_access_features' ),
48 'callback' => array( $this, 'copilot' ),
49 ) );
50 register_rest_route( $this->namespace, '/create_post', array(
51 'methods' => 'POST',
52 'permission_callback' => array( $this->core, 'can_access_features' ),
53 'callback' => array( $this, 'create_post' ),
54 ) );
55 register_rest_route( $this->namespace, '/create_image', array(
56 'methods' => 'POST',
57 'permission_callback' => array( $this->core, 'can_access_features' ),
58 'callback' => array( $this, 'create_image' ),
59 ) );
60 register_rest_route( $this->namespace, '/openai_files', array(
61 'methods' => 'GET',
62 'permission_callback' => array( $this->core, 'can_access_settings' ),
63 'callback' => array( $this, 'openai_files_get' ),
64 ) );
65 register_rest_route( $this->namespace, '/openai_files', array(
66 'methods' => 'DELETE',
67 'permission_callback' => array( $this->core, 'can_access_settings' ),
68 'callback' => array( $this, 'openai_files_delete' ),
69 ) );
70 register_rest_route( $this->namespace, '/openai_files', array(
71 'methods' => 'POST',
72 'permission_callback' => array( $this->core, 'can_access_settings' ),
73 'callback' => array( $this, 'openai_files_upload' ),
74 ) );
75 register_rest_route( $this->namespace, '/openai_files_download', array(
76 'methods' => 'POST',
77 'permission_callback' => array( $this->core, 'can_access_settings' ),
78 'callback' => array( $this, 'openai_files_download' ),
79 ) );
80 register_rest_route( $this->namespace, '/openai_files_finetune', array(
81 'methods' => 'POST',
82 'permission_callback' => array( $this->core, 'can_access_settings' ),
83 'callback' => array( $this, 'openai_files_finetune' ),
84 ) );
85 register_rest_route( $this->namespace, '/openai_deleted_finetunes', array(
86 'methods' => 'GET',
87 'permission_callback' => array( $this->core, 'can_access_settings' ),
88 'callback' => array( $this, 'openai_deleted_finetunes_get' ),
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_finetunes_cancel', array(
101 'methods' => 'POST',
102 'permission_callback' => array( $this->core, 'can_access_settings' ),
103 'callback' => array( $this, 'openai_finetunes_cancel' ),
104 ) );
105 register_rest_route( $this->namespace, '/openai_incidents', array(
106 'methods' => 'GET',
107 'permission_callback' => array( $this->core, 'can_access_settings' ),
108 'callback' => array( $this, 'openai_incidents' ),
109 ) );
110 register_rest_route( $this->namespace, '/chatbots', array(
111 'methods' => ['GET', 'POST'],
112 'permission_callback' => array( $this->core, 'can_access_settings' ),
113 'callback' => array( $this, 'rest_chatbots' ),
114 ) );
115 register_rest_route( $this->namespace, '/themes', array(
116 'methods' => ['GET', 'POST'],
117 'permission_callback' => array( $this->core, 'can_access_settings' ),
118 'callback' => array( $this, 'rest_themes' ),
119 ) );
120 register_rest_route( $this->namespace, '/count_posts', array(
121 'methods' => 'GET',
122 'permission_callback' => array( $this->core, 'can_access_features' ),
123 'callback' => array( $this, 'count_posts' ),
124 ) );
125 register_rest_route( $this->namespace, '/post_types', array(
126 'methods' => 'GET',
127 'permission_callback' => array( $this->core, 'can_access_features' ),
128 'callback' => array( $this, 'post_types' ),
129 ) );
130 register_rest_route( $this->namespace, '/post_content', array(
131 'methods' => 'GET',
132 'permission_callback' => array( $this->core, 'can_access_features' ),
133 'callback' => array( $this, 'rest_post_content' ),
134 ) );
135 register_rest_route( $this->namespace, '/templates', array(
136 'methods' => 'GET',
137 'permission_callback' => array( $this->core, 'can_access_features' ),
138 'callback' => array( $this, 'templates_get' ),
139 ) );
140 register_rest_route( $this->namespace, '/templates', array(
141 'methods' => 'POST',
142 'permission_callback' => array( $this->core, 'can_access_features' ),
143 'callback' => array( $this, 'templates_save' ),
144 ) );
145 register_rest_route( $this->namespace, '/magic_wand', array(
146 'methods' => 'POST',
147 'callback' => array( $this, 'magic_wand' ),
148 'permission_callback' => array( $this->core, 'can_access_features' ),
149 ) );
150 register_rest_route( $this->namespace, '/logs', array(
151 'methods' => 'POST',
152 'permission_callback' => array( $this->core, 'can_access_settings' ),
153 'callback' => array( $this, 'get_logs' ),
154 ) );
155 register_rest_route( $this->namespace, '/logs_meta', array(
156 'methods' => 'POST',
157 'permission_callback' => array( $this->core, 'can_access_settings' ),
158 'callback' => array( $this, 'get_logs_meta' ),
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_add', 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_update', array(
181 'methods' => 'POST',
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 $reply = $this->core->ai->run( $query );
244 return new WP_REST_Response([ 'success' => true, 'data' => $reply->result, 'usage' => $reply->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 $reply = $this->core->ai->run( $query );
258 return new WP_REST_Response([ 'success' => true, 'data' => $reply->results, 'usage' => $reply->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 // NOTE: 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 $model = $this->core->get_option( 'assistants_model' );
282 if ( !empty( $model ) ) {
283 $query->setModel( $model );
284 }
285 $mode = 'replace';
286
287 $language = "";
288 $keepLanguage = "";
289 if ( !empty( $postId ) ) {
290 $language = $this->core->get_post_language( $postId );
291 $keepLanguage = " Ensure the reply is in the same language as the original text ({$language}).";
292 }
293
294 if ( $action === 'correctText' ) {
295 $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.{$keepLanguage}\n\n" . $text );
296 }
297 else if ( $action === 'enhanceText' ) {
298 $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.{$keepLanguage}\n\n" . $text );
299 }
300 else if ( $action === 'longerText' ) {
301 $query->setPrompt( "Expand the subsequent text to a minimum of three times its original length, integrating relevant and accurate information to enrich its content. If the text is a story, amplify its charm by elaborating on essential aspects, enhancing readability, and creating a sense of engagement for the reader. Maintain consistency in tone and vocabulary throughout the expansion process.{$keepLanguage}\n\n" . $text );
302 }
303 else if ( $action === 'shorterText' ) {
304 $query->setPrompt( "Condense the following text by reducing its length to half, while retaining the core elements of the original narrative. Focus on maintaining the essence of the story and its key details.{$keepLanguage}\n\n" . $text );
305 }
306 else if ( $action === 'suggestSynonyms' ) {
307 $mode = 'suggest';
308 $query->setPrompt( "Provide a synonym or rephrase the given word or sentence while retaining the original meaning and preserving the initial and final punctuation. Offer only the resulting word or expression, without additional context. If a suitable synonym or alternative cannot be identified, ensure that a creative response is still provided.{$keepLanguage}\n\n" . $selectedText );
309 $query->setTemperature( 1 );
310 $query->setMaxResults( 5 );
311 }
312 else if ( $action === 'translateText' ) {
313 $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 );
314 }
315 else if ( $action === 'suggestExcerpts' ) {
316 $text = $this->core->getCleanPostContent( $postId );
317 $query->setPrompt( "Craft a clear, SEO-optimized introduction for the following text, using 120 to 170 characters. Ensure the introduction is concise and relevant, without including any URLs.{$keepLanguage}\n\n" . $text );
318 $query->setMaxResults( 5 );
319 }
320 else if ( $action === 'suggestTitles' ) {
321 $text = $this->core->getCleanPostContent( $postId );
322 $query->setPrompt( "Generate a concise, SEO-optimized title for the following text, without using quotes or any other formatting. Focus on clarity and relevance to the content.{$keepLanguage}\n\n" . $text );
323 $query->setMaxResults( 5 );
324 }
325 $reply = $this->core->ai->run( $query );
326 return new WP_REST_Response([ 'success' => true, 'data' => [
327 'mode' => $mode,
328 'result' => $reply->result,
329 'results' => $reply->results
330 ] ], 200 );
331 }
332 catch ( Exception $e ) {
333 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
334 }
335 }
336
337 function copilot( $request ) {
338 try {
339 $params = $request->get_json_params();
340 $action = sanitize_text_field( $params['action'] );
341 $prompt = sanitize_text_field( $params['prompt'] );
342 if ( empty( $action ) || empty( $prompt ) ) {
343 return new WP_REST_Response([ 'success' => false, 'message' => "Copilot needs an action and a prompt." ], 500 );
344 }
345 $query = new Meow_MWAI_QueryText( $prompt, 2048 );
346 $query->setEnv( 'admin-tools' );
347 $model = $this->core->get_option( 'assistants_model' );
348 if ( !empty( $model ) ) {
349 $query->setModel( $model );
350 }
351 $reply = $this->core->ai->run( $query );
352 return new WP_REST_Response([ 'success' => true, 'data' => $reply->result ], 200 );
353 }
354 catch ( Exception $e ) {
355 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
356 }
357 }
358
359 function update_post_title( $request ) {
360 try {
361 $params = $request->get_json_params();
362 $title = sanitize_text_field( $params['title'] );
363 $postId = intval( $params['postId'] );
364 $post = get_post( $postId );
365 if ( !$post ) {
366 throw new Exception( 'There is no post with this ID.' );
367 }
368 $post->post_title = $title;
369 //$post->post_name = sanitize_title( $title );
370 wp_update_post( $post );
371 return new WP_REST_Response([ 'success' => true, 'message' => "Title updated." ], 200 );
372 }
373 catch ( Exception $e ) {
374 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
375 }
376 }
377
378 function update_post_excerpt( $request ) {
379 try {
380 $params = $request->get_json_params();
381 $excerpt = sanitize_text_field( $params['excerpt'] );
382 $postId = intval( $params['postId'] );
383 $post = get_post( $postId );
384 if ( !$post ) {
385 throw new Exception( 'There is no post with this ID.' );
386 }
387 $post->post_excerpt = $excerpt;
388 wp_update_post( $post );
389 return new WP_REST_Response([ 'success' => true, 'message' => "Excerpt updated." ], 200 );
390 }
391 catch ( Exception $e ) {
392 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
393 }
394 }
395
396 function create_post( $request ) {
397 try {
398 $params = $request->get_json_params();
399 $title = sanitize_text_field( $params['title'] );
400 $content = sanitize_textarea_field( $params['content'] );
401 $excerpt = sanitize_text_field( $params['excerpt'] );
402 $postType = sanitize_text_field( $params['postType'] );
403 $post = new stdClass();
404 $post->post_title = $title;
405 $post->post_excerpt = $excerpt;
406 $post->post_content = $content;
407 $post->post_status = 'draft';
408 $post->post_type = isset( $postType ) ? $postType : 'post';
409 $post->post_content = $this->core->markdown_to_html( $post->post_content );
410 $postId = wp_insert_post( $post );
411 return new WP_REST_Response([ 'success' => true, 'postId' => $postId ], 200 );
412 }
413 catch ( Exception $e ) {
414 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
415 }
416 }
417
418 function image_download( $url ) {
419 $args = array( 'timeout' => 60, );
420 $response = wp_remote_get( $url, $args );
421 if ( is_wp_error( $response ) ) {
422 throw new Exception( $response->get_error_message() );
423 }
424 $output = wp_remote_retrieve_body( $response );
425 if ( is_wp_error( $output ) ) {
426 throw new Exception( $output->get_error_message() );
427 }
428 return $output;
429 }
430
431 function create_image( $request ) {
432 try {
433 $params = $request->get_json_params();
434 $title = sanitize_text_field( $params['title'] );
435 $caption = sanitize_text_field( $params['caption'] );
436 $alt = sanitize_text_field( $params['alt'] );
437 $description = sanitize_text_field( $params['description'] );
438 $url = $params['url'];
439 $filename = sanitize_text_field( $params['filename'] );
440 $image_data = $this->image_download( $url );
441 if ( !$image_data ) {
442 throw new Exception( 'Could not download the image.' );
443 }
444 $upload_dir = wp_upload_dir();
445 if ( empty( $filename ) ) {
446 $filename = basename( $url );
447 }
448 $wp_filetype = wp_check_filetype( $filename );
449 if ( wp_mkdir_p( $upload_dir['path'] ) ) {
450 $file = $upload_dir['path'] . '/' . $filename;
451 }
452 else {
453 $file = $upload_dir['basedir'] . '/' . $filename;
454 }
455
456 // Make sure the file is unique, if not, add a number to the end of the file before the extension
457 $i = 1;
458 $parts = pathinfo( $file );
459 while ( file_exists( $file ) ) {
460 $file = $parts['dirname'] . '/' . $parts['filename'] . '-' . $i . '.' . $parts['extension'];
461 $i++;
462 }
463
464 // Write the file
465 file_put_contents( $file, $image_data );
466 $attachment = [
467 'post_mime_type' => $wp_filetype['type'],
468 'post_title' => $title,
469 'post_content' => $description,
470 'post_excerpt' => $caption,
471 'post_status' => 'inherit'
472 ];
473 // Register the file as a Media Library attachment
474 $attachmentId = wp_insert_attachment( $attachment, $file );
475 require_once( ABSPATH . 'wp-admin/includes/image.php' );
476 $attachment_data = wp_generate_attachment_metadata( $attachmentId, $file );
477 wp_update_attachment_metadata( $attachmentId, $attachment_data );
478 update_post_meta( $attachmentId, '_wp_attachment_image_alt', $alt );
479 return new WP_REST_Response([ 'success' => true, 'attachmentId' => $attachmentId ], 200 );
480 }
481 catch ( Exception $e ) {
482 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
483 }
484 }
485
486 function openai_files_get() {
487 try {
488 //$params = $request->get_json_params();
489 $openai = new Meow_MWAI_Engines_OpenAI( $this->core );
490 $files = $openai->listFiles();
491 return new WP_REST_Response([ 'success' => true, 'files' => $files ], 200 );
492 }
493 catch ( Exception $e ) {
494 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
495 }
496 }
497
498 function openai_deleted_finetunes_get() {
499 try {
500 $openai = new Meow_MWAI_Engines_OpenAI( $this->core );
501 $finetunes = $openai->listDeletedFineTunes();
502 return new WP_REST_Response([ 'success' => true, 'finetunes' => $finetunes ], 200 );
503 }
504 catch ( Exception $e ) {
505 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
506 }
507 }
508
509 function openai_finetunes_get() {
510 try {
511 $openai = new Meow_MWAI_Engines_OpenAI( $this->core );
512 $finetunes = $openai->listFineTunes();
513 return new WP_REST_Response([ 'success' => true, 'finetunes' => $finetunes ], 200 );
514 }
515 catch ( Exception $e ) {
516 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
517 }
518 }
519
520 function openai_files_upload( $request ) {
521 try {
522 $params = $request->get_json_params();
523 $filename = sanitize_text_field( $params['filename'] );
524 $data = $params['data'];
525 $openai = new Meow_MWAI_Engines_OpenAI( $this->core );
526 $file = $openai->uploadFile( $filename, $data );
527 return new WP_REST_Response([ 'success' => true, 'file' => $file ], 200 );
528 }
529 catch ( Exception $e ) {
530 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
531 }
532 }
533
534 function openai_files_delete( $request ) {
535 try {
536 $params = $request->get_json_params();
537 $fileId = $params['fileId'];
538 $openai = new Meow_MWAI_Engines_OpenAI( $this->core );
539 $openai->deleteFile( $fileId );
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_cancel( $request ) {
548 try {
549 $params = $request->get_json_params();
550 $finetuneId = $params['finetuneId'];
551 $openai = new Meow_MWAI_Engines_OpenAI( $this->core );
552 $openai->cancelFineTune( $finetuneId );
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_finetunes_delete( $request ) {
561 try {
562 $params = $request->get_json_params();
563 $modelId = $params['modelId'];
564 $openai = new Meow_MWAI_Engines_OpenAI( $this->core );
565 $openai->deleteFineTune( $modelId );
566 return new WP_REST_Response([ 'success' => true ], 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_download( $request ) {
574 try {
575 $params = $request->get_json_params();
576 $fileId = $params['fileId'];
577 $openai = new Meow_MWAI_Engines_OpenAI( $this->core );
578 $data = $openai->downloadFile( $fileId );
579 return new WP_REST_Response([ 'success' => true, 'data' => $data ], 200 );
580 }
581 catch ( Exception $e ) {
582 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
583 }
584 }
585
586 function openai_files_finetune( $request ) {
587 try {
588 $params = $request->get_json_params();
589 $fileId = $params['fileId'];
590 $model = $params['model'];
591 $suffix = $params['suffix'];
592 $hyperparams = [
593 "nEpochs" => $params['nEpochs'],
594 "batchSize" => $params['batchSize']
595 ];
596 $openai = new Meow_MWAI_Engines_OpenAI( $this->core );
597 $finetune = $openai->fineTuneFile( $fileId, $model, $suffix, $hyperparams );
598 return new WP_REST_Response([ 'success' => true, 'finetune' => $finetune ], 200 );
599 }
600 catch ( Exception $e ) {
601 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
602 }
603 }
604
605 function openai_incidents() {
606 try {
607 $transient = get_transient( 'mwai_openai_incidents' );
608 if ( $transient ) {
609 return new WP_REST_Response([ 'success' => true, 'incidents' => $transient ], 200 );
610 }
611 $openai = new Meow_MWAI_Engines_OpenAI( $this->core );
612 $incidents = $openai->getIncidents();
613 set_transient( 'mwai_openai_incidents', $incidents, 60 * 10 );
614 return new WP_REST_Response([ 'success' => true, 'incidents' => $incidents ], 200 );
615 }
616 catch ( Exception $e ) {
617 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
618 }
619 }
620
621 function count_posts( $request ) {
622 try {
623 $params = $request->get_query_params();
624 $postType = $params['postType'];
625 $postStatus = $params['postStatus'];
626 $postStatus = !empty( $params['postStatus'] ) ? explode( ',', $postStatus ) : [ 'publish' ];
627 $count = wp_count_posts( $postType );
628 $count = array_sum( array_intersect_key( (array)$count, array_flip( $postStatus ) ) );
629 return new WP_REST_Response([ 'success' => true, 'count' => $count ], 200 );
630 }
631 catch ( Exception $e ) {
632 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
633 }
634 }
635
636 function rest_post_content( $request ) {
637 try {
638 $params = $request->get_query_params();
639 $offset = (int)$params['offset'];
640 $postType = $params['postType'];
641 $postStatus = $params['postStatus'];
642 $postStatus = !empty( $params['postStatus'] ) ? explode( ',', $postStatus ) : [ 'publish' ];
643 $postId = (int)$params['postId'];
644
645 $post = null;
646 if ( !empty( $postId ) ) {
647 $post = get_post( $postId );
648 if ( $post->post_status !== 'publish' && $post->post_status !== 'future'
649 && $post->post_status !== 'draft' && $post->post_status !== 'private' ) {
650 $post = null;
651 }
652 }
653 else {
654 $posts = get_posts( [
655 'posts_per_page' => 1,
656 'post_type' => $postType,
657 'offset' => $offset,
658 'post_status' => $postStatus,
659 ] );
660 $post = count( $posts ) === 0 ? null : $posts[0];
661 }
662 if ( !$post ) {
663 return new WP_REST_Response([ 'success' => false, 'message' => 'Post not found' ], 404 );
664 }
665 $cleanPost = $this->core->getCleanPost( $post );
666 return new WP_REST_Response([ 'success' => true, 'content' => $cleanPost['content'],
667 'checksum' => $cleanPost['checksum'], 'language' => $cleanPost['language'], 'excerpt' => $cleanPost['excerpt'],
668 'postId' => $cleanPost['postId'], 'title' => $cleanPost['title'], 'url' => $cleanPost['url'] ], 200 );
669 }
670 catch ( Exception $e ) {
671 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
672 }
673 }
674
675 function templates_get( $request ) {
676 try {
677 $params = $request->get_query_params();
678 $category = $params['category'];
679 $templates = [];
680 $templates_option = get_option( 'mwai_templates', [] );
681 if ( !is_array( $templates_option ) ) {
682 update_option( 'mwai_templates', [] );
683 }
684 $categories = array_column( $templates_option, 'category' );
685 $index = array_search( $category, $categories );
686 $templates = [];
687 if ( $index !== false ) {
688 $templates = $templates_option[$index]['templates'];
689 }
690 return new WP_REST_Response([ 'success' => true, 'templates' => $templates ], 200 );
691 }
692 catch ( Exception $e ) {
693 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
694 }
695 }
696
697 function templates_save( $request ) {
698 try {
699 $params = $request->get_json_params();
700 $category = $params['category'];
701 $templates = $params['templates'];
702 $templates_option = get_option( 'mwai_templates', [] );
703 $categories = array_column( $templates_option, 'category' );
704 $index = array_search( $category, $categories );
705 if ( $index !== false && $index >= 0 ) {
706 $templates_option[$index]['templates'] = $templates;
707 }
708 else {
709 $group = [ 'category' => $category, 'templates' => $templates ];
710 $templates_option[] = $group;
711 }
712
713 update_option( 'mwai_templates', $templates_option );
714 return new WP_REST_Response([ 'success' => true ], 200 );
715 }
716 catch ( Exception $e ) {
717 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
718 }
719 }
720
721 function get_logs( $request ) {
722 try {
723 $params = $request->get_json_params();
724 $offset = $params['offset'];
725 $limit = $params['limit'];
726 $filters = $params['filters'];
727 $sort = $params['sort'];
728 $logs = apply_filters( 'mwai_stats_logs', [], $offset, $limit, $filters, $sort );
729 return new WP_REST_Response([ 'success' => true, 'total' => $logs['total'], 'logs' => $logs['rows'] ], 200 );
730 }
731 catch ( Exception $e ) {
732 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
733 }
734 }
735
736 function get_logs_meta( $request ) {
737 try {
738 $params = $request->get_json_params();
739 $logId = $params['logId'];
740 $metaKeys = $params['metaKeys'];
741 $data = apply_filters( 'mwai_stats_logs_meta', [], $logId, $metaKeys );
742 return new WP_REST_Response([ 'success' => true, 'data' => $data ], 200 );
743 }
744 catch ( Exception $e ) {
745 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
746 }
747 }
748
749 function moderate( $request ) {
750 try {
751 $params = $request->get_json_params();
752 $text = $params['text'];
753 if ( !$text ) {
754 return new WP_REST_Response([ 'success' => false, 'message' => 'Text not found.' ], 404 );
755 }
756 $openai = new Meow_MWAI_Engines_OpenAI( $this->core );
757 $results = $openai->moderate( $text );
758 return new WP_REST_Response([ 'success' => true, 'results' => $results ], 200 );
759 }
760 catch ( Exception $e ) {
761 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
762 }
763
764 }
765
766 function get_vectors( $request ) {
767 try {
768 $params = $request->get_json_params();
769 $offset = $params['offset'];
770 $limit = $params['limit'];
771 $filters = $params['filters'];
772 $sort = $params['sort'];
773 $vectors = apply_filters( 'mwai_embeddings_vectors', [], $offset, $limit, $filters, $sort );
774 return new WP_REST_Response([ 'success' => true, 'total' => $vectors['total'], 'vectors' => $vectors['rows'] ], 200 );
775 }
776 catch ( Exception $e ) {
777 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
778 }
779 }
780
781 function add_vector( $request ) {
782 try {
783 $params = $request->get_json_params();
784 $vector = $params['vector'];
785 $success = apply_filters( 'mwai_embeddings_vectors_add', false, $vector );
786 return new WP_REST_Response([ 'success' => $success, 'vector' => $vector ], 200 );
787 }
788 catch ( Exception $e ) {
789 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
790 }
791 }
792
793 function get_vectors_ref( $request ) {
794 try {
795 $params = $request->get_json_params();
796 $refId = $params['refId'];
797 $vectors = apply_filters( 'mwai_embeddings_vectors_ref', false, $refId );
798 return new WP_REST_Response([ 'success' => true, 'vectors' => $vectors ], 200 );
799 }
800 catch ( Exception $e ) {
801 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
802 }
803 }
804
805 function modify_vector( $request ) {
806 try {
807 $params = $request->get_json_params();
808 $vector = $params['vector'];
809 $success = apply_filters( 'mwai_embeddings_vectors_update', false, $vector );
810 return new WP_REST_Response([ 'success' => $success, 'vector' => $vector ], 200 );
811 }
812 catch ( Exception $e ) {
813 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
814 }
815 }
816
817 function delete_vectors( $request ) {
818 try {
819 $params = $request->get_json_params();
820 $ids = $params['ids'];
821 $success = apply_filters( 'mwai_embeddings_vectors_delete', false, $ids );
822 return new WP_REST_Response([ 'success' => $success ], 200 );
823 }
824 catch ( Exception $e ) {
825 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
826 }
827 }
828
829 function transcribe( $request ) {
830 try {
831 $params = $request->get_json_params();
832 $query = new Meow_MWAI_QueryTranscribe();
833 $query->injectParams( $params );
834 $query->setEnv('admin-tools');
835 $reply = $this->core->ai->run( $query );
836 return new WP_REST_Response([ 'success' => true, 'data' => $reply->result ], 200 );
837 }
838 catch ( Exception $e ) {
839 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
840 }
841 }
842
843 function post_types() {
844 try {
845 $postTypes = $this->core->getPostTypes();
846 return new WP_REST_Response([ 'success' => true, 'postTypes' => $postTypes ], 200 );
847 }
848 catch ( Exception $e ) {
849 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
850 }
851 }
852
853 function rest_themes( $request ) {
854 try {
855 $method = $request->get_method();
856 if ( $method === 'GET' ) {
857 $themes = $this->core->getThemes();
858 return new WP_REST_Response([ 'success' => true, 'themes' => $themes ], 200 );
859 }
860 else if ( $method === 'POST' ) {
861 $params = $request->get_json_params();
862 $themes = $params['themes'];
863 $themes = $this->core->updateThemes( $themes );
864 return new WP_REST_Response([ 'success' => true, 'themes' => $themes ], 200 );
865 }
866 }
867 catch ( Exception $e ) {
868 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
869 }
870 }
871
872 function rest_chatbots( $request ) {
873 try {
874 $method = $request->get_method();
875 if ( $method === 'GET' ) {
876 $chatbots = $this->core->getChatbots();
877 return new WP_REST_Response([ 'success' => true, 'chatbots' => $chatbots ], 200 );
878 }
879 else if ( $method === 'POST' ) {
880 $params = $request->get_json_params();
881 $chatbots = $params['chatbots'];
882 $chatbots = $this->core->updateChatbots( $chatbots );
883 return new WP_REST_Response([ 'success' => true, 'chatbots' => $chatbots ], 200 );
884 }
885 return new WP_REST_Response([ 'success' => false, 'message' => 'Method not allowed' ], 405 );
886 }
887 catch ( Exception $e ) {
888 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
889 }
890 }
891 }
892