PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 1.6.69
AI Engine – The Chatbot, AI Framework & MCP for WordPress v1.6.69
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
804 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, '/transcribe', array(
166 'methods' => 'POST',
167 'permission_callback' => array( $this->core, 'can_access_settings' ),
168 'callback' => array( $this, 'transcribe' ),
169 ) );
170 }
171 catch ( Exception $e ) {
172 var_dump( $e );
173 }
174 }
175
176 function rest_all_settings() {
177 return new WP_REST_Response( [
178 'success' => true,
179 'data' => $this->core->get_all_options()
180 ], 200 );
181 }
182
183 function rest_update_option( $request ) {
184 try {
185 $params = $request->get_json_params();
186 $value = $params['options'];
187 $options = $this->core->update_options( $value );
188 $success = !!$options;
189 $message = __( $success ? 'OK' : "Could not update options.", 'ai-engine' );
190 return new WP_REST_Response([ 'success' => $success, 'message' => $message, 'options' => $options ], 200 );
191 }
192 catch ( Exception $e ) {
193 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
194 }
195 }
196
197 function createValidationResult( $result = true, $message = null) {
198 $message = $message ? $message : __( 'OK', 'ai-engine' );
199 return [ 'result' => $result, 'message' => $message ];
200 }
201
202 function validate_updated_option( $option_name ) {
203 $option_checkbox = get_option( 'mwai_option_checkbox', false );
204 $option_text = get_option( 'mwai_option_text', 'Default' );
205 if ( $option_checkbox === '' )
206 update_option( 'mwai_option_checkbox', false );
207 if ( $option_text === '' )
208 update_option( 'mwai_option_text', 'Default' );
209 return $this->createValidationResult();
210 }
211
212 function make_completions( $request ) {
213 try {
214 $params = $request->get_json_params();
215 $prompt = $params['prompt'];
216 $query = new Meow_MWAI_QueryText( $prompt );
217 $query->injectParams( $params );
218 $reply = $this->core->ai->run( $query );
219 return new WP_REST_Response([ 'success' => true, 'data' => $reply->result, 'usage' => $reply->usage ], 200 );
220 }
221 catch ( Exception $e ) {
222 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
223 }
224 }
225
226 function make_images( $request ) {
227 try {
228 $params = $request->get_json_params();
229 $prompt = $params['prompt'];
230 $query = new Meow_MWAI_QueryImage( $prompt );
231 $query->injectParams( $params );
232 $reply = $this->core->ai->run( $query );
233 return new WP_REST_Response([ 'success' => true, 'data' => $reply->results, 'usage' => $reply->usage ], 200 );
234 }
235 catch ( Exception $e ) {
236 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
237 }
238 }
239
240 function magic_wand( $request ) {
241 try {
242 $params = $request->get_json_params();
243 $action = isset( $params['action'] ) ? $params['action'] : null;
244 $data = isset( $params['data'] ) ? $params['data'] : null;
245 if ( empty( $data ) || empty( $action ) ) {
246 return new WP_REST_Response([ 'success' => false, 'message' => "An action and some data are required." ], 500 );
247 }
248 $postId = isset( $data['postId'] ) ? $data['postId'] : null;
249 $text = isset( $data['text'] ) ? $data['text'] : null;
250 $selectedText = isset( $data['selectedText'] ) ? $data['selectedText'] : null;
251
252 // NOTE: As soon as we have a wide range of usages and possibilities,
253 // let's refactor this into a nice and extensible UI/API.
254 $query = new Meow_MWAI_QueryText( "", 1024 );
255 $query->setEnv( 'admin-tools' );
256 $model = $this->core->get_option( 'assistants_model' );
257 if ( !empty( $model ) ) {
258 $query->setModel( $model );
259 }
260 $mode = 'replace';
261
262 $language = "";
263 $keepLanguage = "";
264 if ( !empty( $postId ) ) {
265 $language = $this->core->get_post_language( $postId );
266 $keepLanguage = " Ensure the reply is in the same language as the original text ({$language}).";
267 }
268
269 if ( $action === 'correctText' ) {
270 $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 );
271 }
272 else if ( $action === 'enhanceText' ) {
273 $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 );
274 }
275 else if ( $action === 'longerText' ) {
276 $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 );
277 }
278 else if ( $action === 'shorterText' ) {
279 $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 );
280 }
281 else if ( $action === 'suggestSynonyms' ) {
282 $mode = 'suggest';
283 $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 );
284 $query->setTemperature( 1 );
285 $query->setMaxResults( 5 );
286 }
287 else if ( $action === 'translateText' ) {
288 $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 );
289 }
290 else if ( $action === 'suggestExcerpts' ) {
291 $text = $this->core->getCleanPostContent( $postId );
292 $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 );
293 $query->setMaxResults( 5 );
294 }
295 else if ( $action === 'suggestTitles' ) {
296 $text = $this->core->getCleanPostContent( $postId );
297 $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 );
298 $query->setMaxResults( 5 );
299 }
300 $reply = $this->core->ai->run( $query );
301 return new WP_REST_Response([ 'success' => true, 'data' => [
302 'mode' => $mode,
303 'result' => $reply->result,
304 'results' => $reply->results
305 ] ], 200 );
306 }
307 catch ( Exception $e ) {
308 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
309 }
310 }
311
312 function copilot( $request ) {
313 try {
314 $params = $request->get_json_params();
315 $action = sanitize_text_field( $params['action'] );
316 $prompt = sanitize_text_field( $params['prompt'] );
317 if ( empty( $action ) || empty( $prompt ) ) {
318 return new WP_REST_Response([ 'success' => false, 'message' => "Copilot needs an action and a prompt." ], 500 );
319 }
320 $query = new Meow_MWAI_QueryText( $prompt, 2048 );
321 $query->setEnv( 'admin-tools' );
322 $model = $this->core->get_option( 'assistants_model' );
323 if ( !empty( $model ) ) {
324 $query->setModel( $model );
325 }
326 $reply = $this->core->ai->run( $query );
327 return new WP_REST_Response([ 'success' => true, 'data' => $reply->result ], 200 );
328 }
329 catch ( Exception $e ) {
330 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
331 }
332 }
333
334 function update_post_title( $request ) {
335 try {
336 $params = $request->get_json_params();
337 $title = sanitize_text_field( $params['title'] );
338 $postId = intval( $params['postId'] );
339 $post = get_post( $postId );
340 if ( !$post ) {
341 throw new Exception( 'There is no post with this ID.' );
342 }
343 $post->post_title = $title;
344 //$post->post_name = sanitize_title( $title );
345 wp_update_post( $post );
346 return new WP_REST_Response([ 'success' => true, 'message' => "Title updated." ], 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_excerpt( $request ) {
354 try {
355 $params = $request->get_json_params();
356 $excerpt = sanitize_text_field( $params['excerpt'] );
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_excerpt = $excerpt;
363 wp_update_post( $post );
364 return new WP_REST_Response([ 'success' => true, 'message' => "Excerpt updated." ], 200 );
365 }
366 catch ( Exception $e ) {
367 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
368 }
369 }
370
371 function create_post( $request ) {
372 try {
373 $params = $request->get_json_params();
374 $title = sanitize_text_field( $params['title'] );
375 $content = sanitize_textarea_field( $params['content'] );
376 $excerpt = sanitize_text_field( $params['excerpt'] );
377 $postType = sanitize_text_field( $params['postType'] );
378 $post = new stdClass();
379 $post->post_title = $title;
380 $post->post_excerpt = $excerpt;
381 $post->post_content = $content;
382 $post->post_status = 'draft';
383 $post->post_type = isset( $postType ) ? $postType : 'post';
384 $post->post_content = $this->core->markdown_to_html( $post->post_content );
385 $postId = wp_insert_post( $post );
386 return new WP_REST_Response([ 'success' => true, 'postId' => $postId ], 200 );
387 }
388 catch ( Exception $e ) {
389 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
390 }
391 }
392
393 function image_download( $url ) {
394 $args = array( 'timeout' => 60, );
395 $response = wp_remote_get( $url, $args );
396 if ( is_wp_error( $response ) ) {
397 throw new Exception( $response->get_error_message() );
398 }
399 $output = wp_remote_retrieve_body( $response );
400 if ( is_wp_error( $output ) ) {
401 throw new Exception( $output->get_error_message() );
402 }
403 return $output;
404 }
405
406 function create_image( $request ) {
407 try {
408 $params = $request->get_json_params();
409 $title = sanitize_text_field( $params['title'] );
410 $caption = sanitize_text_field( $params['caption'] );
411 $alt = sanitize_text_field( $params['alt'] );
412 $description = sanitize_text_field( $params['description'] );
413 $url = $params['url'];
414 $filename = sanitize_text_field( $params['filename'] );
415 $image_data = $this->image_download( $url );
416 if ( !$image_data ) {
417 throw new Exception( 'Could not download the image.' );
418 }
419 $upload_dir = wp_upload_dir();
420 if ( empty( $filename ) ) {
421 $filename = basename( $url );
422 }
423 $wp_filetype = wp_check_filetype( $filename );
424 if ( wp_mkdir_p( $upload_dir['path'] ) ) {
425 $file = $upload_dir['path'] . '/' . $filename;
426 }
427 else {
428 $file = $upload_dir['basedir'] . '/' . $filename;
429 }
430
431 // Make sure the file is unique, if not, add a number to the end of the file before the extension
432 $i = 1;
433 $parts = pathinfo( $file );
434 while ( file_exists( $file ) ) {
435 $file = $parts['dirname'] . '/' . $parts['filename'] . '-' . $i . '.' . $parts['extension'];
436 $i++;
437 }
438
439 // Write the file
440 file_put_contents( $file, $image_data );
441 $attachment = [
442 'post_mime_type' => $wp_filetype['type'],
443 'post_title' => $title,
444 'post_content' => $description,
445 'post_excerpt' => $caption,
446 'post_status' => 'inherit'
447 ];
448 // Register the file as a Media Library attachment
449 $attachmentId = wp_insert_attachment( $attachment, $file );
450 require_once( ABSPATH . 'wp-admin/includes/image.php' );
451 $attachment_data = wp_generate_attachment_metadata( $attachmentId, $file );
452 wp_update_attachment_metadata( $attachmentId, $attachment_data );
453 update_post_meta( $attachmentId, '_wp_attachment_image_alt', $alt );
454 return new WP_REST_Response([ 'success' => true, 'attachmentId' => $attachmentId ], 200 );
455 }
456 catch ( Exception $e ) {
457 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
458 }
459 }
460
461 function openai_files_get() {
462 try {
463 //$params = $request->get_json_params();
464 $openai = new Meow_MWAI_Engines_OpenAI( $this->core );
465 $files = $openai->listFiles();
466 return new WP_REST_Response([ 'success' => true, 'files' => $files ], 200 );
467 }
468 catch ( Exception $e ) {
469 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
470 }
471 }
472
473 function openai_deleted_finetunes_get() {
474 try {
475 $openai = new Meow_MWAI_Engines_OpenAI( $this->core );
476 $finetunes = $openai->listDeletedFineTunes();
477 return new WP_REST_Response([ 'success' => true, 'finetunes' => $finetunes ], 200 );
478 }
479 catch ( Exception $e ) {
480 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
481 }
482 }
483
484 function openai_finetunes_get() {
485 try {
486 $openai = new Meow_MWAI_Engines_OpenAI( $this->core );
487 $finetunes = $openai->listFineTunes();
488 return new WP_REST_Response([ 'success' => true, 'finetunes' => $finetunes ], 200 );
489 }
490 catch ( Exception $e ) {
491 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
492 }
493 }
494
495 function openai_files_upload( $request ) {
496 try {
497 $params = $request->get_json_params();
498 $filename = sanitize_text_field( $params['filename'] );
499 $data = $params['data'];
500 $openai = new Meow_MWAI_Engines_OpenAI( $this->core );
501 $file = $openai->uploadFile( $filename, $data );
502 return new WP_REST_Response([ 'success' => true, 'file' => $file ], 200 );
503 }
504 catch ( Exception $e ) {
505 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
506 }
507 }
508
509 function openai_files_delete( $request ) {
510 try {
511 $params = $request->get_json_params();
512 $fileId = $params['fileId'];
513 $openai = new Meow_MWAI_Engines_OpenAI( $this->core );
514 $openai->deleteFile( $fileId );
515 return new WP_REST_Response([ 'success' => true ], 200 );
516 }
517 catch ( Exception $e ) {
518 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
519 }
520 }
521
522 function openai_finetunes_cancel( $request ) {
523 try {
524 $params = $request->get_json_params();
525 $finetuneId = $params['finetuneId'];
526 $openai = new Meow_MWAI_Engines_OpenAI( $this->core );
527 $openai->cancelFineTune( $finetuneId );
528 return new WP_REST_Response([ 'success' => true ], 200 );
529 }
530 catch ( Exception $e ) {
531 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
532 }
533 }
534
535 function openai_finetunes_delete( $request ) {
536 try {
537 $params = $request->get_json_params();
538 $modelId = $params['modelId'];
539 $openai = new Meow_MWAI_Engines_OpenAI( $this->core );
540 $openai->deleteFineTune( $modelId );
541 return new WP_REST_Response([ 'success' => true ], 200 );
542 }
543 catch ( Exception $e ) {
544 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
545 }
546 }
547
548 function openai_files_download( $request ) {
549 try {
550 $params = $request->get_json_params();
551 $fileId = $params['fileId'];
552 $openai = new Meow_MWAI_Engines_OpenAI( $this->core );
553 $data = $openai->downloadFile( $fileId );
554 return new WP_REST_Response([ 'success' => true, 'data' => $data ], 200 );
555 }
556 catch ( Exception $e ) {
557 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
558 }
559 }
560
561 function openai_files_finetune( $request ) {
562 try {
563 $params = $request->get_json_params();
564 $fileId = $params['fileId'];
565 $model = $params['model'];
566 $suffix = $params['suffix'];
567 $hyperparams = [
568 "nEpochs" => $params['nEpochs'],
569 "batchSize" => $params['batchSize']
570 ];
571 $openai = new Meow_MWAI_Engines_OpenAI( $this->core );
572 $finetune = $openai->fineTuneFile( $fileId, $model, $suffix, $hyperparams );
573 return new WP_REST_Response([ 'success' => true, 'finetune' => $finetune ], 200 );
574 }
575 catch ( Exception $e ) {
576 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
577 }
578 }
579
580 function openai_incidents() {
581 try {
582 $transient = get_transient( 'mwai_openai_incidents' );
583 if ( $transient ) {
584 return new WP_REST_Response([ 'success' => true, 'incidents' => $transient ], 200 );
585 }
586 $openai = new Meow_MWAI_Engines_OpenAI( $this->core );
587 $incidents = $openai->getIncidents();
588 set_transient( 'mwai_openai_incidents', $incidents, 60 * 10 );
589 return new WP_REST_Response([ 'success' => true, 'incidents' => $incidents ], 200 );
590 }
591 catch ( Exception $e ) {
592 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
593 }
594 }
595
596 function count_posts( $request ) {
597 try {
598 $params = $request->get_query_params();
599 $postType = $params['postType'];
600 $postStatus = $params['postStatus'];
601 $postStatus = !empty( $params['postStatus'] ) ? explode( ',', $postStatus ) : [ 'publish' ];
602 $count = wp_count_posts( $postType );
603 $count = array_sum( array_intersect_key( (array)$count, array_flip( $postStatus ) ) );
604 return new WP_REST_Response([ 'success' => true, 'count' => $count ], 200 );
605 }
606 catch ( Exception $e ) {
607 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
608 }
609 }
610
611 function rest_post_content( $request ) {
612 try {
613 $params = $request->get_query_params();
614 $offset = (int)$params['offset'];
615 $postType = $params['postType'];
616 $postStatus = $params['postStatus'];
617 $postStatus = !empty( $params['postStatus'] ) ? explode( ',', $postStatus ) : [ 'publish' ];
618 $postId = (int)$params['postId'];
619
620 $post = null;
621 if ( !empty( $postId ) ) {
622 $post = get_post( $postId );
623 if ( $post->post_status !== 'publish' && $post->post_status !== 'future'
624 && $post->post_status !== 'draft' && $post->post_status !== 'private' ) {
625 $post = null;
626 }
627 }
628 else {
629 $posts = get_posts( [
630 'posts_per_page' => 1,
631 'post_type' => $postType,
632 'offset' => $offset,
633 'post_status' => $postStatus,
634 ] );
635 $post = count( $posts ) === 0 ? null : $posts[0];
636 }
637 if ( !$post ) {
638 return new WP_REST_Response([ 'success' => false, 'message' => 'Post not found' ], 404 );
639 }
640 $cleanPost = $this->core->getCleanPost( $post );
641 return new WP_REST_Response([ 'success' => true, 'content' => $cleanPost['content'],
642 'checksum' => $cleanPost['checksum'], 'language' => $cleanPost['language'], 'excerpt' => $cleanPost['excerpt'],
643 'postId' => $cleanPost['postId'], 'title' => $cleanPost['title'], 'url' => $cleanPost['url'] ], 200 );
644 }
645 catch ( Exception $e ) {
646 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
647 }
648 }
649
650 function templates_get( $request ) {
651 try {
652 $params = $request->get_query_params();
653 $category = $params['category'];
654 $templates = [];
655 $templates_option = get_option( 'mwai_templates', [] );
656 if ( !is_array( $templates_option ) ) {
657 update_option( 'mwai_templates', [] );
658 }
659 $categories = array_column( $templates_option, 'category' );
660 $index = array_search( $category, $categories );
661 $templates = [];
662 if ( $index !== false ) {
663 $templates = $templates_option[$index]['templates'];
664 }
665 return new WP_REST_Response([ 'success' => true, 'templates' => $templates ], 200 );
666 }
667 catch ( Exception $e ) {
668 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
669 }
670 }
671
672 function templates_save( $request ) {
673 try {
674 $params = $request->get_json_params();
675 $category = $params['category'];
676 $templates = $params['templates'];
677 $templates_option = get_option( 'mwai_templates', [] );
678 $categories = array_column( $templates_option, 'category' );
679 $index = array_search( $category, $categories );
680 if ( $index !== false && $index >= 0 ) {
681 $templates_option[$index]['templates'] = $templates;
682 }
683 else {
684 $group = [ 'category' => $category, 'templates' => $templates ];
685 $templates_option[] = $group;
686 }
687
688 update_option( 'mwai_templates', $templates_option );
689 return new WP_REST_Response([ 'success' => true ], 200 );
690 }
691 catch ( Exception $e ) {
692 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
693 }
694 }
695
696 function get_logs( $request ) {
697 try {
698 $params = $request->get_json_params();
699 $offset = $params['offset'];
700 $limit = $params['limit'];
701 $filters = $params['filters'];
702 $sort = $params['sort'];
703 $logs = apply_filters( 'mwai_stats_logs', [], $offset, $limit, $filters, $sort );
704 return new WP_REST_Response([ 'success' => true, 'total' => $logs['total'], 'logs' => $logs['rows'] ], 200 );
705 }
706 catch ( Exception $e ) {
707 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
708 }
709 }
710
711 function get_logs_meta( $request ) {
712 try {
713 $params = $request->get_json_params();
714 $logId = $params['logId'];
715 $metaKeys = $params['metaKeys'];
716 $data = apply_filters( 'mwai_stats_logs_meta', [], $logId, $metaKeys );
717 return new WP_REST_Response([ 'success' => true, 'data' => $data ], 200 );
718 }
719 catch ( Exception $e ) {
720 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
721 }
722 }
723
724 function moderate( $request ) {
725 try {
726 $params = $request->get_json_params();
727 $text = $params['text'];
728 if ( !$text ) {
729 return new WP_REST_Response([ 'success' => false, 'message' => 'Text not found.' ], 404 );
730 }
731 $openai = new Meow_MWAI_Engines_OpenAI( $this->core );
732 $results = $openai->moderate( $text );
733 return new WP_REST_Response([ 'success' => true, 'results' => $results ], 200 );
734 }
735 catch ( Exception $e ) {
736 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
737 }
738
739 }
740
741 function transcribe( $request ) {
742 try {
743 $params = $request->get_json_params();
744 $query = new Meow_MWAI_QueryTranscribe();
745 $query->injectParams( $params );
746 $query->setEnv('admin-tools');
747 $reply = $this->core->ai->run( $query );
748 return new WP_REST_Response([ 'success' => true, 'data' => $reply->result ], 200 );
749 }
750 catch ( Exception $e ) {
751 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
752 }
753 }
754
755 function post_types() {
756 try {
757 $postTypes = $this->core->getPostTypes();
758 return new WP_REST_Response([ 'success' => true, 'postTypes' => $postTypes ], 200 );
759 }
760 catch ( Exception $e ) {
761 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
762 }
763 }
764
765 function rest_themes( $request ) {
766 try {
767 $method = $request->get_method();
768 if ( $method === 'GET' ) {
769 $themes = $this->core->getThemes();
770 return new WP_REST_Response([ 'success' => true, 'themes' => $themes ], 200 );
771 }
772 else if ( $method === 'POST' ) {
773 $params = $request->get_json_params();
774 $themes = $params['themes'];
775 $themes = $this->core->updateThemes( $themes );
776 return new WP_REST_Response([ 'success' => true, 'themes' => $themes ], 200 );
777 }
778 }
779 catch ( Exception $e ) {
780 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
781 }
782 }
783
784 function rest_chatbots( $request ) {
785 try {
786 $method = $request->get_method();
787 if ( $method === 'GET' ) {
788 $chatbots = $this->core->getChatbots();
789 return new WP_REST_Response([ 'success' => true, 'chatbots' => $chatbots ], 200 );
790 }
791 else if ( $method === 'POST' ) {
792 $params = $request->get_json_params();
793 $chatbots = $params['chatbots'];
794 $chatbots = $this->core->updateChatbots( $chatbots );
795 return new WP_REST_Response([ 'success' => true, 'chatbots' => $chatbots ], 200 );
796 }
797 return new WP_REST_Response([ 'success' => false, 'message' => 'Method not allowed' ], 405 );
798 }
799 catch ( Exception $e ) {
800 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
801 }
802 }
803 }
804