PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 1.3.94
AI Engine – The Chatbot, AI Framework & MCP for WordPress v1.3.94
3.5.7 3.5.6 3.5.5 3.5.4 3.5.3 3.5.2 3.5.1 3.5.0 3.4.9 3.4.8 3.4.7 0.2.1 1.6.91 0.2.2 1.6.92 0.2.3 1.6.93 0.2.4 1.6.94 0.2.5 1.6.95 0.2.6 1.6.96 0.2.7 1.6.97 0.2.8 1.6.98 0.2.9 1.6.99 0.3.0 1.7.0 0.3.1 1.7.1 0.3.2 1.7.2 0.3.3 1.7.3 0.3.4 1.7.4 0.3.5 1.7.5 0.3.6 1.7.6 0.4.0 1.7.7 0.4.1 1.7.8 0.4.2 1.7.9 0.4.3 1.8.0 0.4.4 1.8.1 0.4.5 1.8.2 0.4.6 1.8.3 0.4.7 1.8.4 0.4.8 1.8.5 0.4.9 1.8.6 0.5.0 1.8.7 0.5.1 1.8.8 0.5.2 1.8.9 0.5.3 1.9.0 0.5.4 1.9.1 0.5.5 1.9.2 0.5.6 1.9.3 0.5.7 1.9.4 0.5.8 1.9.5 0.5.9 1.9.6 0.6.0 1.9.7 0.6.1 1.9.8 0.6.2 1.9.81 0.6.3 1.9.82 0.6.4 1.9.83 0.6.5 1.9.84 0.6.6 1.9.85 0.6.7 1.9.86 0.6.8 1.9.87 0.6.9 1.9.88 0.7.0 1.9.89 0.7.1 1.9.90 0.7.2 1.9.91 0.7.3 1.9.92 0.7.4 1.9.93 0.7.5 1.9.94 0.7.6 1.9.95 0.7.7 1.9.96 0.7.8 1.9.97 0.7.9 1.9.98 0.8.0 1.9.99 0.8.1 2.0.0 0.8.2 2.0.1 0.8.3 2.0.2 0.8.4 2.0.3 0.8.5 2.0.4 0.8.6 2.0.5 0.8.7 2.0.6 0.8.8 2.0.7 0.8.9 2.0.8 0.9.0 2.0.9 0.9.2 2.1.0 0.9.3 2.1.1 0.9.4 2.1.2 0.9.5 2.1.3 0.9.6 2.1.4 0.9.7 2.1.5 0.9.8 2.1.6 0.9.81 2.1.7 0.9.82 2.1.8 0.9.83 2.1.9 0.9.84 2.2.0 0.9.85 2.2.1 0.9.86 2.2.2 0.9.87 2.2.3 0.9.88 2.2.4 0.9.89 2.2.5 0.9.9 2.2.51 0.9.91 2.2.52 0.9.92 2.2.53 0.9.93 2.2.54 0.9.94 2.2.56 0.9.95 2.2.57 0.9.96 2.2.6 0.9.97 2.2.60 0.9.98 2.2.61 0.9.99 2.2.62 1.0.0 2.2.63 1.0.01 2.2.70 1.0.1 2.2.80 1.0.2 2.2.81 1.0.3 2.2.90 1.0.4 2.2.91 1.0.5 2.2.92 1.0.6 2.2.93 1.0.7 2.2.94 1.0.8 2.2.95 1.0.9 2.3.0 1.1.0 2.3.1 1.1.1 2.3.2 1.1.2 2.3.3 1.1.3 2.3.4 1.1.4 2.3.5 1.1.5 2.3.6 1.1.6 2.3.7 1.1.7 2.3.8 1.1.8 2.3.9 1.1.9 2.4.0 1.2.0 2.4.1 1.2.1 2.4.2 1.2.2 2.4.3 1.2.21 2.4.4 1.2.3 2.4.5 1.2.30 2.4.6 1.3.0 2.4.7 1.3.1 2.4.8 1.3.2 2.4.9 1.3.3 2.5.0 1.3.31 2.5.1 1.3.32 2.5.2 1.3.33 2.5.3 1.3.34 2.5.4 1.3.35 2.5.5 1.3.36 2.5.6 1.3.37 2.5.7 1.3.38 2.5.8 1.3.39 2.5.9 1.3.40 2.6.0 1.3.41 2.6.1 1.3.42 2.6.2 1.3.43 2.6.3 1.3.44 2.6.5 1.3.45 2.6.6 1.3.46 2.6.7 1.3.47 2.6.8 1.3.48 2.6.9 1.3.49 2.7.0 1.3.50 2.7.1 1.3.51 2.7.2 1.3.52 2.7.3 1.3.53 2.7.4 1.3.54 2.7.5 1.3.56 2.7.6 1.3.57 2.7.7 1.3.58 2.7.8 1.3.59 2.7.9 1.3.60 2.8.0 1.3.61 2.8.1 1.3.62 2.8.2 1.3.63 2.8.3 1.3.64 2.8.4 1.3.65 2.8.5 1.3.66 2.8.6 1.3.67 2.8.7 1.3.68 2.8.8 1.3.69 2.8.9 1.3.70 2.9.0 1.3.71 2.9.1 1.3.72 2.9.2 1.3.73 2.9.3 1.3.74 2.9.4 1.3.75 2.9.5 1.3.76 2.9.6 1.3.77 2.9.7 1.3.78 2.9.8 1.3.79 2.9.9 1.3.80 3.0.0 1.3.81 3.0.1 1.3.82 3.0.2 1.3.83 3.0.3 1.3.84 3.0.4 1.3.85 3.0.5 1.3.86 3.0.6 1.3.87 3.0.7 1.3.88 3.0.8 1.3.89 3.0.9 1.3.90 3.1.0 1.3.91 3.1.1 1.3.92 3.1.2 1.3.93 3.1.3 1.3.94 3.1.4 1.3.95 3.1.5 1.3.96 3.1.6 1.3.97 3.1.7 1.3.98 3.1.8 1.3.99 3.1.9 1.4.0 3.2.0 1.4.1 3.2.1 1.4.2 3.2.2 1.4.3 3.2.3 1.4.4 3.2.4 1.4.5 3.2.5 1.4.6 3.2.6 1.4.7 3.2.7 1.4.8 3.2.8 1.4.9 3.2.9 1.5.0 3.3.0 1.5.1 3.3.1 1.5.2 3.3.2 1.5.3 3.3.3 1.5.4 3.3.4 1.5.5 3.3.5 1.5.6 3.3.6 1.5.7 3.3.7 1.5.8 3.3.8 1.5.9 3.3.9 1.6.0 3.4.0 1.6.1 3.4.1 1.6.2 3.4.2 1.6.3 3.4.3 1.6.5 3.4.4 1.6.51 3.4.5 1.6.52 3.4.6 1.6.53 1.6.54 1.6.55 1.6.56 1.6.57 1.6.58 1.6.59 1.6.60 1.6.61 1.6.62 1.6.63 1.6.64 1.6.65 1.6.66 1.6.67 1.6.68 trunk 1.6.69 0.0.1 1.6.70 0.0.2 1.6.71 0.0.3 1.6.72 0.0.4 1.6.73 0.0.5 1.6.74 0.0.6 1.6.75 0.0.7 1.6.76 0.0.8 1.6.77 0.0.9 1.6.78 0.1.0 1.6.79 0.1.1 1.6.81 0.1.2 1.6.82 0.1.3 1.6.83 0.1.4 1.6.84 0.1.5 1.6.85 0.1.6 1.6.86 0.1.7 1.6.87 0.1.8 1.6.88 0.1.9 1.6.89 0.2.0 1.6.90
ai-engine / classes / rest.php
ai-engine / classes Last commit date
modules 3 years ago admin.php 3 years ago ai.php 3 years ago answer.php 3 years ago api.php 3 years ago core.php 3 years ago init.php 3 years ago openai.php 3 years ago query.php 3 years ago queryembed.php 3 years ago queryimage.php 3 years ago querytext.php 3 years ago querytranscribe.php 3 years ago rest.php 3 years ago ui.php 3 years ago
rest.php
810 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, '/count_posts', array(
116 'methods' => 'GET',
117 'permission_callback' => array( $this->core, 'can_access_features' ),
118 'callback' => array( $this, 'count_posts' ),
119 ) );
120 register_rest_route( $this->namespace, '/post_types', array(
121 'methods' => 'GET',
122 'permission_callback' => array( $this->core, 'can_access_features' ),
123 'callback' => array( $this, 'post_types' ),
124 ) );
125 register_rest_route( $this->namespace, '/post_content', array(
126 'methods' => 'GET',
127 'permission_callback' => array( $this->core, 'can_access_features' ),
128 'callback' => array( $this, 'post_content' ),
129 ) );
130 register_rest_route( $this->namespace, '/templates', array(
131 'methods' => 'GET',
132 'permission_callback' => array( $this->core, 'can_access_features' ),
133 'callback' => array( $this, 'templates_get' ),
134 ) );
135 register_rest_route( $this->namespace, '/templates', array(
136 'methods' => 'POST',
137 'permission_callback' => array( $this->core, 'can_access_features' ),
138 'callback' => array( $this, 'templates_save' ),
139 ) );
140 register_rest_route( $this->namespace, '/magic_wand', array(
141 'methods' => 'POST',
142 'callback' => array( $this, 'magic_wand' ),
143 'permission_callback' => array( $this->core, 'can_access_features' ),
144 ) );
145 register_rest_route( $this->namespace, '/logs', array(
146 'methods' => 'POST',
147 'permission_callback' => array( $this->core, 'can_access_settings' ),
148 'callback' => array( $this, 'get_logs' ),
149 ) );
150 register_rest_route( $this->namespace, '/moderate', array(
151 'methods' => 'POST',
152 'permission_callback' => array( $this->core, 'can_access_settings' ),
153 'callback' => array( $this, 'moderate' ),
154 ) );
155 register_rest_route( $this->namespace, '/vectors', array(
156 'methods' => 'POST',
157 'permission_callback' => array( $this->core, 'can_access_settings' ),
158 'callback' => array( $this, 'get_vectors' ),
159 ) );
160 register_rest_route( $this->namespace, '/vector', array(
161 'methods' => 'POST',
162 'permission_callback' => array( $this->core, 'can_access_settings' ),
163 'callback' => array( $this, 'add_vector' ),
164 ) );
165 register_rest_route( $this->namespace, '/vectors_ref', array(
166 'methods' => 'POST',
167 'permission_callback' => array( $this->core, 'can_access_settings' ),
168 'callback' => array( $this, 'get_vectors_ref' ),
169 ) );
170 register_rest_route( $this->namespace, '/vector', array(
171 'methods' => 'PUT',
172 'permission_callback' => array( $this->core, 'can_access_settings' ),
173 'callback' => array( $this, 'modify_vector' ),
174 ) );
175 register_rest_route( $this->namespace, '/vectors', array(
176 'methods' => 'DELETE',
177 'permission_callback' => array( $this->core, 'can_access_settings' ),
178 'callback' => array( $this, 'delete_vectors' ),
179 ) );
180 register_rest_route( $this->namespace, '/transcribe', array(
181 'methods' => 'POST',
182 'permission_callback' => array( $this->core, 'can_access_settings' ),
183 'callback' => array( $this, 'transcribe' ),
184 ) );
185 }
186 catch ( Exception $e ) {
187 var_dump( $e );
188 }
189 }
190
191 function rest_all_settings() {
192 return new WP_REST_Response( [
193 'success' => true,
194 'data' => $this->core->get_all_options()
195 ], 200 );
196 }
197
198 function rest_update_option( $request ) {
199 try {
200 $params = $request->get_json_params();
201 $value = $params['options'];
202 $options = $this->core->update_options( $value );
203 $success = !!$options;
204 $message = __( $success ? 'OK' : "Could not update options.", 'ai-engine' );
205 return new WP_REST_Response([ 'success' => $success, 'message' => $message, 'options' => $options ], 200 );
206 }
207 catch ( Exception $e ) {
208 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
209 }
210 }
211
212 function createValidationResult( $result = true, $message = null) {
213 $message = $message ? $message : __( 'OK', 'ai-engine' );
214 return [ 'result' => $result, 'message' => $message ];
215 }
216
217 function validate_updated_option( $option_name ) {
218 $option_checkbox = get_option( 'mwai_option_checkbox', false );
219 $option_text = get_option( 'mwai_option_text', 'Default' );
220 if ( $option_checkbox === '' )
221 update_option( 'mwai_option_checkbox', false );
222 if ( $option_text === '' )
223 update_option( 'mwai_option_text', 'Default' );
224 return $this->createValidationResult();
225 }
226
227 function make_completions( $request ) {
228 try {
229 $params = $request->get_json_params();
230 $prompt = $params['prompt'];
231 $query = new Meow_MWAI_QueryText( $prompt );
232 $query->injectParams( $params );
233 $answer = $this->core->ai->run( $query );
234 return new WP_REST_Response([ 'success' => true, 'data' => $answer->result, 'usage' => $answer->usage ], 200 );
235 }
236 catch ( Exception $e ) {
237 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
238 }
239 }
240
241 function make_images( $request ) {
242 try {
243 $params = $request->get_json_params();
244 $prompt = $params['prompt'];
245 $query = new Meow_MWAI_QueryImage( $prompt );
246 $query->injectParams( $params );
247 $answer = $this->core->ai->run( $query );
248 return new WP_REST_Response([ 'success' => true, 'data' => $answer->results, 'usage' => $answer->usage ], 200 );
249 }
250 catch ( Exception $e ) {
251 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
252 }
253 }
254
255 function magic_wand( $request ) {
256 try {
257 $params = $request->get_json_params();
258 $action = isset( $params['action'] ) ? $params['action'] : null;
259 $data = isset( $params['data'] ) ? $params['data'] : null;
260 if ( empty( $data ) || empty( $action ) ) {
261 return new WP_REST_Response([ 'success' => false, 'message' => "An action and some data are required." ], 500 );
262 }
263 $postId = isset( $data['postId'] ) ? $data['postId'] : null;
264 $text = isset( $data['text'] ) ? $data['text'] : null;
265 $selectedText = isset( $data['selectedText'] ) ? $data['selectedText'] : null;
266
267 // TODO: As soon as we have a wide range of usages and possibilities,
268 // let's refactor this into a nice and extensible UI/API.
269 $query = new Meow_MWAI_QueryText( "", 1024 );
270 $query->setEnv( 'admin-tools' );
271 $mode = 'replace';
272 if ( $action === 'correctText' ) {
273 $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 );
274 }
275 else if ( $action === 'enhanceText' ) {
276 $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 );
277 }
278 else if ( $action === 'suggestSynonyms' ) {
279 $mode = 'suggest';
280 $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 );
281 $query->setTemperature( 1 );
282 $query->setMaxResults( 5 );
283 }
284 else if ( $action === 'translateText' ) {
285 $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 );
286 $language = $this->core->get_post_language( $postId );
287 $query->replace( '{LANGUAGE}', $language );
288 }
289 $answer = $this->core->ai->run( $query );
290 return new WP_REST_Response([ 'success' => true, 'data' => [
291 'mode' => $mode,
292 'result' => $answer->result,
293 'results' => $answer->results
294 ] ], 200 );
295 }
296 catch ( Exception $e ) {
297 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
298 }
299 }
300
301 function make_titles( $request ) {
302 try {
303 $params = $request->get_json_params();
304 $postId = intval( $params['postId'] );
305 $text = $this->core->getCleanPostContent( $postId );
306 if ( empty( $text ) ) {
307 return new WP_REST_Response([ 'success' => false, 'message' => "No text found for this post." ], 500 );
308 }
309 $language = $this->core->get_post_language( $postId );
310 $prompt = "Using the same original language ($language), create a short but SEO-friendly title for this text: " . $text;
311 $query = new Meow_MWAI_QueryText( $prompt, 128 );
312 $query->setMaxResults( 5 );
313 $query->setEnv( 'admin-tools' );
314 $answer = $this->core->ai->run( $query );
315 return new WP_REST_Response([ 'success' => true, 'data' => $answer->results ], 200 );
316 }
317 catch ( Exception $e ) {
318 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
319 }
320 }
321
322 function make_excerpts( $request ) {
323 try {
324 $params = $request->get_json_params();
325 $postId = intval( $params['postId'] );
326 $text = $this->core->getCleanPostContent( $postId );
327 if ( empty( $text ) ) {
328 return new WP_REST_Response([ 'success' => false, 'message' => "No text found for this post." ], 500 );
329 }
330 $language = $this->core->get_post_language( $postId );
331 $prompt = "Using the same original language ($language), create a SEO-friendly introduction to this text, 120 to 170 characters max, no URLs: " . $text;
332 $query = new Meow_MWAI_QueryText( $prompt, 512 );
333 $query->setMaxResults( 5 );
334 $query->setEnv( 'admin-tools' );
335 $answer = $this->core->ai->run( $query );
336 return new WP_REST_Response([ 'success' => true, 'data' => $answer->results ], 200 );
337 }
338 catch ( Exception $e ) {
339 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
340 }
341 }
342
343 function update_post_title( $request ) {
344 try {
345 $params = $request->get_json_params();
346 $title = sanitize_text_field( $params['title'] );
347 $postId = intval( $params['postId'] );
348 $post = get_post( $postId );
349 if ( !$post ) {
350 throw new Exception( 'There is no post with this ID.' );
351 }
352 $post->post_title = $title;
353 //$post->post_name = sanitize_title( $title );
354 wp_update_post( $post );
355 return new WP_REST_Response([ 'success' => true, 'message' => "Title updated." ], 200 );
356 }
357 catch ( Exception $e ) {
358 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
359 }
360 }
361
362 function update_post_excerpt( $request ) {
363 try {
364 $params = $request->get_json_params();
365 $excerpt = sanitize_text_field( $params['excerpt'] );
366 $postId = intval( $params['postId'] );
367 $post = get_post( $postId );
368 if ( !$post ) {
369 throw new Exception( 'There is no post with this ID.' );
370 }
371 $post->post_excerpt = $excerpt;
372 wp_update_post( $post );
373 return new WP_REST_Response([ 'success' => true, 'message' => "Excerpt updated." ], 200 );
374 }
375 catch ( Exception $e ) {
376 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
377 }
378 }
379
380 function create_post( $request ) {
381 try {
382 $params = $request->get_json_params();
383 $title = sanitize_text_field( $params['title'] );
384 $content = sanitize_textarea_field( $params['content'] );
385 $excerpt = sanitize_text_field( $params['excerpt'] );
386 $postType = sanitize_text_field( $params['postType'] );
387 $post = new stdClass();
388 $post->post_title = $title;
389 $post->post_excerpt = $excerpt;
390 $post->post_content = $content;
391 $post->post_status = 'draft';
392 $post->post_type = isset( $postType ) ? $postType : 'post';
393 $post->post_content = $this->core->markdown_to_html( $post->post_content );
394 $postId = wp_insert_post( $post );
395 return new WP_REST_Response([ 'success' => true, 'postId' => $postId ], 200 );
396 }
397 catch ( Exception $e ) {
398 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
399 }
400 }
401
402 function image_download( $url ) {
403 $response = wp_remote_get( $url );
404 $output = wp_remote_retrieve_body( $response );
405 return $output;
406 }
407
408 function create_image( $request ) {
409 try {
410 $params = $request->get_json_params();
411 $title = sanitize_text_field( $params['title'] );
412 $caption = sanitize_text_field( $params['caption'] );
413 $alt = sanitize_text_field( $params['alt'] );
414 $description = sanitize_text_field( $params['description'] );
415 $url = $params['url'];
416 $filename = sanitize_text_field( $params['filename'] );
417 $image_data = $this->image_download( $url );
418 if ( !$image_data ) {
419 throw new Exception( 'Could not download the image.' );
420 }
421 $upload_dir = wp_upload_dir();
422 if ( empty( $filename ) ) {
423 $filename = basename( $url );
424 }
425 $wp_filetype = wp_check_filetype( $filename );
426 if ( wp_mkdir_p( $upload_dir['path'] ) ) {
427 $file = $upload_dir['path'] . '/' . $filename;
428 }
429 else {
430 $file = $upload_dir['basedir'] . '/' . $filename;
431 }
432
433 // Make sure the file is unique, if not, add a number to the end of the file before the extension
434 $i = 1;
435 $parts = pathinfo( $file );
436 while ( file_exists( $file ) ) {
437 $file = $parts['dirname'] . '/' . $parts['filename'] . '-' . $i . '.' . $parts['extension'];
438 $i++;
439 }
440
441 // Write the file
442 file_put_contents( $file, $image_data );
443 $attachment = [
444 'post_mime_type' => $wp_filetype['type'],
445 'post_title' => $title,
446 'post_content' => $description,
447 'post_excerpt' => $caption,
448 'post_status' => 'inherit'
449 ];
450 // Register the file as a Media Library attachment
451 $attachmentId = wp_insert_attachment( $attachment, $file );
452 require_once( ABSPATH . 'wp-admin/includes/image.php' );
453 $attachment_data = wp_generate_attachment_metadata( $attachmentId, $file );
454 wp_update_attachment_metadata( $attachmentId, $attachment_data );
455 update_post_meta( $attachmentId, '_wp_attachment_image_alt', $alt );
456 return new WP_REST_Response([ 'success' => true, 'attachmentId' => $attachmentId ], 200 );
457 }
458 catch ( Exception $e ) {
459 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
460 }
461 }
462
463 function openai_files_get() {
464 try {
465 //$params = $request->get_json_params();
466 $openai = new Meow_MWAI_OpenAI( $this->core );
467 $files = $openai->listFiles();
468 return new WP_REST_Response([ 'success' => true, 'files' => $files ], 200 );
469 }
470 catch ( Exception $e ) {
471 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
472 }
473 }
474
475 function openai_deleted_finetunes_get() {
476 try {
477 $openai = new Meow_MWAI_OpenAI( $this->core );
478 $finetunes = $openai->listDeletedFineTunes();
479 return new WP_REST_Response([ 'success' => true, 'finetunes' => $finetunes ], 200 );
480 }
481 catch ( Exception $e ) {
482 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
483 }
484 }
485
486 function openai_finetunes_get() {
487 try {
488 $openai = new Meow_MWAI_OpenAI( $this->core );
489 $finetunes = $openai->listFineTunes();
490 return new WP_REST_Response([ 'success' => true, 'finetunes' => $finetunes ], 200 );
491 }
492 catch ( Exception $e ) {
493 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
494 }
495 }
496
497 function openai_files_upload( $request ) {
498 try {
499 $params = $request->get_json_params();
500 $filename = sanitize_text_field( $params['filename'] );
501 $data = $params['data'];
502 $openai = new Meow_MWAI_OpenAI( $this->core );
503 $file = $openai->uploadFile( $filename, $data );
504 return new WP_REST_Response([ 'success' => true, 'file' => $file ], 200 );
505 }
506 catch ( Exception $e ) {
507 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
508 }
509 }
510
511 function openai_files_delete( $request ) {
512 try {
513 $params = $request->get_json_params();
514 $fileId = $params['fileId'];
515 $openai = new Meow_MWAI_OpenAI( $this->core );
516 $openai->deleteFile( $fileId );
517 return new WP_REST_Response([ 'success' => true ], 200 );
518 }
519 catch ( Exception $e ) {
520 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
521 }
522 }
523
524 function openai_finetunes_cancel( $request ) {
525 try {
526 $params = $request->get_json_params();
527 $finetuneId = $params['finetuneId'];
528 $openai = new Meow_MWAI_OpenAI( $this->core );
529 $openai->cancelFineTune( $finetuneId );
530 return new WP_REST_Response([ 'success' => true ], 200 );
531 }
532 catch ( Exception $e ) {
533 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
534 }
535 }
536
537 function openai_finetunes_delete( $request ) {
538 try {
539 $params = $request->get_json_params();
540 $modelId = $params['modelId'];
541 $openai = new Meow_MWAI_OpenAI( $this->core );
542 $openai->deleteFineTune( $modelId );
543 return new WP_REST_Response([ 'success' => true ], 200 );
544 }
545 catch ( Exception $e ) {
546 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
547 }
548 }
549
550 function openai_files_download( $request ) {
551 try {
552 $params = $request->get_json_params();
553 $fileId = $params['fileId'];
554 $openai = new Meow_MWAI_OpenAI( $this->core );
555 $data = $openai->downloadFile( $fileId );
556 return new WP_REST_Response([ 'success' => true, 'data' => $data ], 200 );
557 }
558 catch ( Exception $e ) {
559 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
560 }
561 }
562
563 function openai_files_finetune( $request ) {
564 try {
565 $params = $request->get_json_params();
566 $fileId = $params['fileId'];
567 $model = $params['model'];
568 $suffix = $params['suffix'];
569 $hyperparams = [
570 "nEpochs" => $params['nEpochs'],
571 "batchSize" => $params['batchSize']
572 ];
573 $openai = new Meow_MWAI_OpenAI( $this->core );
574 $finetune = $openai->fineTuneFile( $fileId, $model, $suffix, $hyperparams );
575 return new WP_REST_Response([ 'success' => true, 'finetune' => $finetune ], 200 );
576 }
577 catch ( Exception $e ) {
578 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
579 }
580 }
581
582 function openai_incidents() {
583 try {
584 $transient = get_transient( 'mwai_openai_incidents' );
585 if ( $transient ) {
586 return new WP_REST_Response([ 'success' => true, 'incidents' => $transient ], 200 );
587 }
588 $openai = new Meow_MWAI_OpenAI( $this->core );
589 $incidents = $openai->getIncidents();
590 set_transient( 'mwai_openai_incidents', $incidents, 60 * 10 );
591 return new WP_REST_Response([ 'success' => true, 'incidents' => $incidents ], 200 );
592 }
593 catch ( Exception $e ) {
594 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
595 }
596 }
597
598 function count_posts( $request ) {
599 try {
600 $params = $request->get_query_params();
601 $postType = $params['postType'];
602 $count = wp_count_posts( $postType );
603 return new WP_REST_Response([ 'success' => true, 'count' => $count ], 200 );
604 }
605 catch ( Exception $e ) {
606 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
607 }
608 }
609
610 function post_content( $request ) {
611 try {
612 $params = $request->get_query_params();
613 $offset = (int)$params['offset'];
614 $postType = $params['postType'];
615 $postId = (int)$params['postId'];
616 $post = null;
617 if ( !empty( $postId ) ) {
618 $post = get_post( $postId );
619 if ( $post->post_status !== 'publish' && $post->post_status !== 'future' && $post->post_status !== 'draft' ) {
620 $post = null;
621 }
622 }
623 else {
624 $posts = get_posts( [
625 'posts_per_page' => 1,
626 'post_type' => $postType,
627 'offset' => $offset,
628 'post_status' => 'publish'
629 ] );
630 $post = count( $posts ) === 0 ? null : $posts[0];
631 }
632 if ( !$post ) {
633 return new WP_REST_Response([ 'success' => false, 'message' => 'Post not found' ], 404 );
634 }
635 $cleanPost = $this->core->getCleanPost( $post );
636 return new WP_REST_Response([ 'success' => true, 'content' => $cleanPost['content'],
637 'checksum' => $cleanPost['checksum'], 'language' => $cleanPost['language'], 'excerpt' => $cleanPost['excerpt'],
638 'postId' => $cleanPost['postId'], 'title' => $cleanPost['title'], 'url' => $cleanPost['url'] ], 200 );
639 }
640 catch ( Exception $e ) {
641 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
642 }
643 }
644
645 function templates_get( $request ) {
646 try {
647 $params = $request->get_query_params();
648 $category = $params['category'];
649 $templates = [];
650 $templates_option = get_option( 'mwai_templates', [] );
651 if ( !is_array( $templates_option ) ) {
652 update_option( 'mwai_templates', [] );
653 }
654 $categories = array_column( $templates_option, 'category' );
655 $index = array_search( $category, $categories );
656 $templates = [];
657 if ( $index !== false ) {
658 $templates = $templates_option[$index]['templates'];
659 }
660 return new WP_REST_Response([ 'success' => true, 'templates' => $templates ], 200 );
661 }
662 catch ( Exception $e ) {
663 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
664 }
665 }
666
667 function templates_save( $request ) {
668 try {
669 $params = $request->get_json_params();
670 $category = $params['category'];
671 $templates = $params['templates'];
672 $templates_option = get_option( 'mwai_templates', [] );
673 $categories = array_column( $templates_option, 'category' );
674 $index = array_search( $category, $categories );
675 if ( $index !== false && $index >= 0 ) {
676 $templates_option[$index]['templates'] = $templates;
677 }
678 else {
679 $group = [ 'category' => $category, 'templates' => $templates ];
680 $templates_option[] = $group;
681 }
682
683 update_option( 'mwai_templates', $templates_option );
684 return new WP_REST_Response([ 'success' => true ], 200 );
685 }
686 catch ( Exception $e ) {
687 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
688 }
689 }
690
691 function get_logs( $request ) {
692 try {
693 $params = $request->get_json_params();
694 $offset = $params['offset'];
695 $limit = $params['limit'];
696 $filters = $params['filters'];
697 $sort = $params['sort'];
698 $logs = apply_filters( 'mwai_stats_logs', [], $offset, $limit, $filters, $sort );
699 return new WP_REST_Response([ 'success' => true, 'total' => $logs['total'], 'logs' => $logs['rows'] ], 200 );
700 }
701 catch ( Exception $e ) {
702 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
703 }
704 }
705
706 function moderate( $request ) {
707 try {
708 $params = $request->get_json_params();
709 $text = $params['text'];
710 if ( !$text ) {
711 return new WP_REST_Response([ 'success' => false, 'message' => 'Text not found.' ], 404 );
712 }
713 $openai = new Meow_MWAI_OpenAI( $this->core );
714 $results = $openai->moderate( $text );
715 return new WP_REST_Response([ 'success' => true, 'results' => $results ], 200 );
716 }
717 catch ( Exception $e ) {
718 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
719 }
720
721 }
722
723 function get_vectors( $request ) {
724 try {
725 $params = $request->get_json_params();
726 $offset = $params['offset'];
727 $limit = $params['limit'];
728 $filters = $params['filters'];
729 $sort = $params['sort'];
730 $vectors = apply_filters( 'mwai_embeddings_vectors', [], $offset, $limit, $filters, $sort );
731 return new WP_REST_Response([ 'success' => true, 'total' => $vectors['total'], 'vectors' => $vectors['rows'] ], 200 );
732 }
733 catch ( Exception $e ) {
734 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
735 }
736 }
737
738 function add_vector( $request ) {
739 try {
740 $params = $request->get_json_params();
741 $vector = $params['vector'];
742 $success = apply_filters( 'mwai_embeddings_vectors_add', false, $vector );
743 return new WP_REST_Response([ 'success' => $success, 'vector' => $vector ], 200 );
744 }
745 catch ( Exception $e ) {
746 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
747 }
748 }
749
750 function get_vectors_ref( $request ) {
751 try {
752 $params = $request->get_json_params();
753 $refId = $params['refId'];
754 $vectors = apply_filters( 'mwai_embeddings_vectors_ref', false, $refId );
755 return new WP_REST_Response([ 'success' => true, 'vectors' => $vectors ], 200 );
756 }
757 catch ( Exception $e ) {
758 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
759 }
760 }
761
762 function modify_vector( $request ) {
763 try {
764 $params = $request->get_json_params();
765 $vector = $params['vector'];
766 $success = apply_filters( 'mwai_embeddings_vectors_update', false, $vector );
767 return new WP_REST_Response([ 'success' => $success, 'vector' => $vector ], 200 );
768 }
769 catch ( Exception $e ) {
770 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
771 }
772 }
773
774 function delete_vectors( $request ) {
775 try {
776 $params = $request->get_json_params();
777 $ids = $params['ids'];
778 $success = apply_filters( 'mwai_embeddings_vectors_delete', false, $ids );
779 return new WP_REST_Response([ 'success' => $success ], 200 );
780 }
781 catch ( Exception $e ) {
782 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
783 }
784 }
785
786 function transcribe( $request ) {
787 try {
788 $params = $request->get_json_params();
789 $query = new Meow_MWAI_QueryTranscribe();
790 $query->injectParams( $params );
791 $query->setEnv('admin-tools');
792 $answer = $this->core->ai->run( $query );
793 return new WP_REST_Response([ 'success' => true, 'data' => $answer->result ], 200 );
794 }
795 catch ( Exception $e ) {
796 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
797 }
798 }
799
800 function post_types() {
801 try {
802 $postTypes = $this->core->getPostTypes();
803 return new WP_REST_Response([ 'success' => true, 'postTypes' => $postTypes ], 200 );
804 }
805 catch ( Exception $e ) {
806 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
807 }
808 }
809 }
810