PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 2.8.2
AI Engine – The Chatbot, AI Framework & MCP for WordPress v2.8.2
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 1 year ago modules 1 year ago queries 1 year ago admin.php 1 year ago api.php 1 year ago core.php 1 year ago discussion.php 1 year ago init.php 1 year ago logging.php 1 year ago reply.php 1 year ago rest.php 1 year ago
rest.php
1083 lines
1 <?php
2
3 class Meow_MWAI_Rest
4 {
5 private $core = null;
6 private $namespace = 'mwai/v1';
7
8 public function __construct( $core ) {
9 $this->core = $core;
10 add_action( 'rest_api_init', array( $this, 'rest_init' ) );
11 }
12
13 /**
14 * Retrieve the message from the parameters and optionally sanitize it.
15 *
16 * @param array &$params The parameters array, passed by reference.
17 * @param bool $sanitize Whether to sanitize the message using sanitize_text_field.
18 * @return string The retrieved (and optionally sanitized) message.
19 */
20 function retrieve_message( &$params, $sanitize = false ) : string {
21 if ( isset( $params['message'] ) ) {
22 $message = $params['message'];
23 }
24 elseif ( isset( $params['prompt'] ) ) {
25 $message = $params['prompt'];
26 unset( $params['prompt'] );
27 $params['message'] = $message;
28 Meow_MWAI_Logging::deprecated( '"prompt" is deprecated, please use "message" instead.' );
29 }
30 else {
31 $message = "";
32 }
33
34 if ( $sanitize ) {
35 $message = sanitize_text_field( $message );
36 }
37
38 return $message;
39 }
40
41 function rest_init() {
42 try {
43 // Session Endpoint
44 register_rest_route( $this->namespace, '/start_session', array(
45 'methods' => 'POST',
46 'permission_callback' => [ $this->core, 'can_start_session' ],
47 'callback' => [ $this, 'rest_start_session' ],
48 ) );
49
50 // Settings Endpoints
51 register_rest_route( $this->namespace, '/settings/update', array(
52 'methods' => 'POST',
53 'permission_callback' => [ $this->core, 'can_access_settings' ],
54 'callback' => [ $this, 'rest_settings_update' ],
55 ) );
56 register_rest_route( $this->namespace, '/settings/options', array(
57 'methods' => 'GET',
58 'permission_callback' => [ $this->core, 'can_access_settings' ],
59 'callback' => [ $this, 'rest_settings_list' ],
60 ) );
61 register_rest_route( $this->namespace, '/settings/reset', array(
62 'methods' => 'POST',
63 'permission_callback' => [ $this->core, 'can_access_settings' ],
64 'callback' => [ $this, 'rest_settings_reset' ],
65 ) );
66 register_rest_route( $this->namespace, '/settings/chatbots', array(
67 'methods' => ['GET', 'POST'],
68 'permission_callback' => [ $this->core, 'can_access_settings' ],
69 'callback' => [ $this, 'rest_settings_chatbots' ],
70 ) );
71 register_rest_route( $this->namespace, '/settings/themes', array(
72 'methods' => ['GET', 'POST'],
73 'permission_callback' => [ $this->core, 'can_access_settings' ],
74 'callback' => [ $this, 'rest_settings_themes' ],
75 ) );
76
77 // System Endpoints
78 register_rest_route( $this->namespace, '/system/logs/list', array(
79 'methods' => 'POST',
80 'permission_callback' => [ $this->core, 'can_access_settings' ],
81 'callback' => [ $this, 'rest_system_logs_list' ],
82 ) );
83 register_rest_route( $this->namespace, '/system/logs/delete', array(
84 'methods' => 'POST',
85 'permission_callback' => [ $this->core, 'can_access_settings' ],
86 'callback' => [ $this, 'rest_system_logs_delete' ],
87 ) );
88 register_rest_route( $this->namespace, '/system/logs/meta', array(
89 'methods' => 'POST',
90 'permission_callback' => [ $this->core, 'can_access_settings' ],
91 'callback' => [ $this, 'rest_system_logs_meta_get' ],
92 ) );
93 register_rest_route( $this->namespace, '/system/logs/activity', array(
94 'methods' => 'POST',
95 'permission_callback' => [ $this->core, 'can_access_settings' ],
96 'callback' => [ $this, 'rest_system_logs_activity' ],
97 ) );
98 register_rest_route( $this->namespace, '/system/logs/activity_daily', array(
99 'methods' => 'POST',
100 'permission_callback' => [ $this->core, 'can_access_settings' ],
101 'callback' => [ $this, 'rest_system_logs_activity_daily' ],
102 ) );
103 register_rest_route( $this->namespace, '/system/templates', array(
104 'methods' => 'POST',
105 'permission_callback' => [ $this->core, 'can_access_features' ],
106 'callback' => [ $this, 'rest_system_templates_save' ],
107 ) );
108 register_rest_route( $this->namespace, '/system/templates', array(
109 'methods' => 'GET',
110 'permission_callback' => [ $this->core, 'can_access_features' ],
111 'callback' => [ $this, 'rest_system_templates_get' ],
112 ) );
113
114 // AI Endpoints
115 register_rest_route( $this->namespace, '/ai/models', array(
116 'methods' => 'POST',
117 'permission_callback' => [ $this->core, 'can_access_features' ],
118 'callback' => [ $this, 'rest_ai_models' ],
119 ) );
120 register_rest_route( $this->namespace, '/ai/completions', array(
121 'methods' => 'POST',
122 'permission_callback' => [ $this->core, 'can_access_features' ],
123 'callback' => [ $this, 'rest_ai_completions' ],
124 ) );
125 register_rest_route( $this->namespace, '/ai/images', array(
126 'methods' => 'POST',
127 'permission_callback' => [ $this->core, 'can_access_features' ],
128 'callback' => [ $this, 'rest_ai_images' ],
129 ) );
130 register_rest_route( $this->namespace, '/ai/image_edit', array(
131 'methods' => 'POST',
132 'permission_callback' => [ $this->core, 'can_access_features' ],
133 'callback' => [ $this, 'rest_ai_image_edit' ],
134 ) );
135 register_rest_route( $this->namespace, '/ai/copilot', array(
136 'methods' => 'POST',
137 'permission_callback' => [ $this->core, 'can_access_features' ],
138 'callback' => [ $this, 'rest_ai_copilot' ],
139 ) );
140
141 register_rest_route( $this->namespace, '/ai/magic_wand', array(
142 'methods' => 'POST',
143 'callback' => [ $this, 'rest_ai_magic_wand' ],
144 'permission_callback' => [ $this->core, 'can_access_features' ],
145 ) );
146 register_rest_route( $this->namespace, '/ai/moderate', array(
147 'methods' => 'POST',
148 'permission_callback' => [ $this->core, 'can_access_settings' ],
149 'callback' => [ $this, 'rest_ai_moderate' ],
150 ) );
151 register_rest_route( $this->namespace, '/ai/transcribe_audio', array(
152 'methods' => 'POST',
153 'permission_callback' => [ $this->core, 'can_access_settings' ],
154 'callback' => [ $this, 'rest_ai_transcribe_audio' ],
155 ) );
156 register_rest_route( $this->namespace, '/ai/transcribe_image', array(
157 'methods' => 'POST',
158 'permission_callback' => [ $this->core, 'can_access_settings' ],
159 'callback' => [ $this, 'rest_ai_transcribe_image' ],
160 ) );
161 register_rest_route( $this->namespace, '/ai/json', array(
162 'methods' => 'POST',
163 'permission_callback' => [ $this->core, 'can_access_settings' ],
164 'callback' => [ $this, 'rest_ai_json' ],
165 ) );
166
167 // Helpers Endpoints
168 register_rest_route( $this->namespace, '/helpers/update_post_title', array(
169 'methods' => 'POST',
170 'permission_callback' => [ $this->core, 'can_access_features' ],
171 'callback' => [ $this, 'rest_helpers_update_title' ],
172 ) );
173 register_rest_route( $this->namespace, '/helpers/update_post_excerpt', array(
174 'methods' => 'POST',
175 'permission_callback' => [ $this->core, 'can_access_features' ],
176 'callback' => [ $this, 'rest_helpers_update_excerpt' ],
177 ) );
178 register_rest_route( $this->namespace, '/helpers/create_post', array(
179 'methods' => 'POST',
180 'permission_callback' => [ $this->core, 'can_access_features' ],
181 'callback' => [ $this, 'rest_helpers_create_post' ],
182 ) );
183 register_rest_route( $this->namespace, '/helpers/create_image', array(
184 'methods' => 'POST',
185 'permission_callback' => [ $this->core, 'can_access_features' ],
186 'callback' => [ $this, 'rest_helpers_create_images' ],
187 ) );
188 register_rest_route( $this->namespace, '/helpers/generate_image_meta', array(
189 'methods' => 'POST',
190 'permission_callback' => [ $this->core, 'can_access_features' ],
191 'callback' => [ $this, 'rest_helpers_generate_image_meta' ],
192 ) );
193 register_rest_route( $this->namespace, '/helpers/count_posts', array(
194 'methods' => 'GET',
195 'permission_callback' => [ $this->core, 'can_access_features' ],
196 'callback' => [ $this, 'rest_helpers_count_posts' ],
197 ) );
198 register_rest_route( $this->namespace, '/helpers/posts_ids', array(
199 'methods' => 'GET',
200 'permission_callback' => [ $this->core, 'can_access_features' ],
201 'callback' => [ $this, 'rest_helpers_posts_ids' ],
202 ) );
203 register_rest_route( $this->namespace, '/helpers/post_types', array(
204 'methods' => 'GET',
205 'permission_callback' => [ $this->core, 'can_access_features' ],
206 'callback' => [ $this, 'rest_helpers_post_types' ],
207 ) );
208 register_rest_route( $this->namespace, '/helpers/post_content', array(
209 'methods' => 'GET',
210 'permission_callback' => [ $this->core, 'can_access_features' ],
211 'callback' => [ $this, 'rest_helpers_post_content' ],
212 ) );
213 register_rest_route( $this->namespace, '/helpers/run_tasks', array(
214 'methods' => 'POST',
215 'permission_callback' => [ $this->core, 'can_access_features' ],
216 'callback' => [ $this, 'rest_helpers_run_tasks' ],
217 ) );
218
219 // OpenAI Endpoints
220 register_rest_route( $this->namespace, '/openai/files/list', array(
221 'methods' => 'GET',
222 'permission_callback' => [ $this->core, 'can_access_settings' ],
223 'callback' => [ $this, 'rest_openai_files_get' ],
224 ) );
225 register_rest_route( $this->namespace, '/openai/files/upload', array(
226 'methods' => 'POST',
227 'permission_callback' => [ $this->core, 'can_access_settings' ],
228 'callback' => [ $this, 'rest_openai_files_upload' ],
229 ) );
230 register_rest_route( $this->namespace, '/openai/files/delete', array(
231 'methods' => 'POST',
232 'permission_callback' => [ $this->core, 'can_access_settings' ],
233 'callback' => [ $this, 'rest_openai_files_delete' ],
234 ) );
235 register_rest_route( $this->namespace, '/openai/files/download', array(
236 'methods' => 'POST',
237 'permission_callback' => [ $this->core, 'can_access_settings' ],
238 'callback' => [ $this, 'rest_openai_files_download' ],
239 ) );
240 register_rest_route( $this->namespace, '/openai/files/finetune', array(
241 'methods' => 'POST',
242 'permission_callback' => [ $this->core, 'can_access_settings' ],
243 'callback' => [ $this, 'rest_openai_files_finetune' ],
244 ) );
245 register_rest_route( $this->namespace, '/openai/finetunes/list_deleted', array(
246 'methods' => 'GET',
247 'permission_callback' => [ $this->core, 'can_access_settings' ],
248 'callback' => [ $this, 'rest_openai_deleted_finetunes_get' ],
249 ) );
250
251 // register_rest_route( $this->namespace, '/openai/models', array(
252 // 'methods' => 'GET',
253 // 'permission_callback' => [ $this->core, 'can_access_settings' ],
254 // 'callback' => [ $this, 'rest_openai_models_get' ],
255 // ) );
256
257 register_rest_route( $this->namespace, '/openai/finetunes/list', array(
258 'methods' => 'GET',
259 'permission_callback' => [ $this->core, 'can_access_settings' ],
260 'callback' => [ $this, 'rest_openai_finetunes_get' ],
261 ) );
262 register_rest_route( $this->namespace, '/openai/finetunes/delete', array(
263 'methods' => 'POST',
264 'permission_callback' => [ $this->core, 'can_access_settings' ],
265 'callback' => [ $this, 'rest_openai_finetunes_delete' ],
266 ) );
267 register_rest_route( $this->namespace, '/openai/finetunes/cancel', array(
268 'methods' => 'POST',
269 'permission_callback' => [ $this->core, 'can_access_settings' ],
270 'callback' => [ $this, 'rest_openai_finetunes_cancel' ],
271 ) );
272
273 // Logging Endpoints
274 register_rest_route( $this->namespace, '/get_logs', array(
275 'methods' => 'GET',
276 'permission_callback' => array( $this->core, 'can_access_features' ),
277 'callback' => array( $this, 'rest_get_logs' )
278 ) );
279 register_rest_route( $this->namespace, '/clear_logs', array(
280 'methods' => 'GET',
281 'permission_callback' => array( $this->core, 'can_access_features' ),
282 'callback' => array( $this, 'rest_clear_logs' )
283 ) );
284 }
285 catch ( Exception $e ) {
286 var_dump( $e );
287 }
288 }
289
290 function rest_start_session() {
291 try {
292 $sessionId = $this->core->get_session_id();
293 $restNonce = $this->core->get_nonce( true );
294 return new WP_REST_Response( [
295 'success' => true,
296 'sessionId' => $sessionId,
297 'restNonce' => $restNonce
298 ], 200 );
299 }
300 catch ( Exception $e ) {
301 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
302 return new WP_REST_Response( [ 'success' => false, 'message' => $message ], 500 );
303 }
304 }
305
306 function rest_settings_list() {
307 return new WP_REST_Response( [
308 'success' => true,
309 'options' => $this->core->get_all_options()
310 ], 200 );
311 }
312
313 function rest_settings_update( $request ) {
314 try {
315 $params = $request->get_json_params();
316 $value = $params['options'];
317 $options = $this->core->update_options( $value );
318 $success = !!$options;
319 $message = __( $success ? 'OK' : "Could not update options.", 'ai-engine' );
320 return new WP_REST_Response([ 'success' => $success, 'message' => $message, 'options' => $options ], 200 );
321 }
322 catch ( Exception $e ) {
323 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
324 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
325 }
326 }
327
328 function rest_settings_reset() {
329 try {
330 $options = $this->core->reset_options();
331 $success = !!$options;
332 $message = __( $success ? 'OK' : "Could not reset options.", 'ai-engine' );
333 return new WP_REST_Response([ 'success' => $success, 'message' => $message, 'options' => $options ], 200 );
334 }
335 catch ( Exception $e ) {
336 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
337 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
338 }
339 }
340
341 function rest_ai_models( $request ) {
342 try {
343 $params = $request->get_json_params();
344 $envId = $params['envId'];
345 $engine = Meow_MWAI_Engines_Factory::get( $this->core, $envId );
346 $models = $engine->retrieve_models();
347 return new WP_REST_Response([ 'success' => true, 'models' => $models ], 200 );
348 }
349 catch ( Exception $e ) {
350 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
351 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
352 }
353 }
354
355 function rest_ai_completions( $request ) {
356 try {
357 $params = $request->get_json_params();
358 $message = $this->retrieve_message( $params );
359 $query = new Meow_MWAI_Query_Text( $message );
360 $query->inject_params( $params );
361
362 // Handle streaming
363 $stream = $params['stream'] ?? false;
364 $streamCallback = null;
365 if ( $stream ) {
366 $streamCallback = function( $reply ) use ( $query ) {
367 //$raw = _wp_specialchars( $reply, ENT_NOQUOTES, 'UTF-8', true );
368 $raw = $reply;
369 $this->core->stream_push( [ 'type' => 'live', 'data' => $raw ], $query );
370 if ( ob_get_level() > 0 ) {
371 ob_flush();
372 }
373 flush();
374 };
375 header( 'Cache-Control: no-cache' );
376 header( 'Content-Type: text/event-stream' );
377 header( 'X-Accel-Buffering: no' ); // This is useful to disable buffering in nginx through headers.
378 ob_implicit_flush( true );
379 ob_end_flush();
380 }
381
382 // Process Reply
383 $reply = $this->core->run_query( $query, $streamCallback );
384 $restRes = [
385 'success' => true,
386 'data' => $reply->result,
387 'usage' => $reply->usage
388 ];
389 if ( $stream ) {
390 $this->core->stream_push( [ 'type' => 'end', 'data' => json_encode( $restRes ) ], $query );
391 die();
392 }
393 return new WP_REST_Response( $restRes, 200 );
394 }
395 catch ( Exception $e ) {
396 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
397 if ( $stream ) {
398 $this->core->stream_push( [ 'type' => 'error', 'data' => $message ], $query );
399 }
400 else {
401 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
402 }
403 }
404 }
405
406 function rest_ai_images( $request ) {
407 try {
408 $params = $request->get_json_params();
409 $message = $this->retrieve_message( $params );
410 $query = new Meow_MWAI_Query_Image( $message );
411 $query->inject_params( $params );
412 $reply = $this->core->run_query( $query );
413 return new WP_REST_Response([ 'success' => true, 'data' => $reply->results, 'usage' => $reply->usage ], 200 );
414 }
415 catch ( Exception $e ) {
416 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
417 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
418 }
419 }
420
421 function rest_ai_image_edit( $request ) {
422 try {
423 $params = $request->get_json_params();
424 $message = $this->retrieve_message( $params );
425 $mediaId = isset( $params['mediaId'] ) ? intval( $params['mediaId'] ) : 0;
426 $query = new Meow_MWAI_Query_EditImage( $message );
427 $query->inject_params( $params );
428 if ( $mediaId ) {
429 $path = get_attached_file( $mediaId );
430 if ( $path ) {
431 $query->set_file( Meow_MWAI_Query_DroppedFile::from_path( $path, 'vision' ) );
432 }
433 }
434 $reply = $this->core->run_query( $query );
435 return new WP_REST_Response([ 'success' => true, 'data' => $reply->results, 'usage' => $reply->usage ], 200 );
436 }
437 catch ( Exception $e ) {
438 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
439 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
440 }
441 }
442
443 function rest_ai_magic_wand( $request ) {
444 try {
445 $params = $request->get_json_params();
446 $action = isset( $params['action'] ) ? $params['action'] : null;
447 $data = isset( $params['data'] ) ? $params['data'] : null;
448 if ( empty( $data ) || empty( $action ) ) {
449 return new WP_REST_Response([ 'success' => false, 'message' => "An action and some data are required." ], 500 );
450 }
451 $data = apply_filters( 'mwai_magic_wand_' . $action, "", $data );
452 return new WP_REST_Response([ 'success' => true, 'data' => $data ], 200 );
453 }
454 catch ( Exception $e ) {
455 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
456 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
457 }
458 }
459
460 function rest_ai_copilot( $request ) {
461 try {
462 $params = $request->get_json_params();
463 $action = sanitize_text_field( $params['action'] );
464 $message = $this->retrieve_message( $params, true );
465 $context = sanitize_text_field( $params['context'] );
466 $postId = !empty( $params['postId'] ) ? intval( $params['postId'] ) : null;
467 if ( empty( $action ) || empty( $message ) ) {
468 return new WP_REST_Response([ 'success' => false, 'message' => "Copilot needs an action and a prompt." ], 500 );
469 }
470
471 global $mwai;
472 $result = null;
473 $params = [ 'scope' => 'copilot' ];
474
475 if ( $action === 'text' ) {
476 $prompt = "Here is the current article: \n\n===\n\n" . $context . "\n\n===\n\nIn this article, instead of the [== CURRENT BLOCK ==] placeholder, the author needs additional content. This new content should use the same tone, style, context, it should naturally flow in the article. The author shared additional information for this request:\n\n===\n\n" . $message . "\n\n===\n\nPlease provide the additional content. Only output the additional content, not the entire article, no need for extra information, and no need for the placeholders. Only output the content that should be added.";
477 if ( !empty( $model ) ) {
478 $params['model'] = $model;
479 }
480 $result = $mwai->simpleTextQuery( $prompt, $params );
481 }
482 else if ( $action === 'image' ) {
483 $prompt = "Here is the current article: \n\n===\n\n" . $context . "\n\n===\n\nIn this article, instead of the [== CURRENT BLOCK ==] placeholder, the author needs an image. Please write a detailed description (prompt) for that image that would fit this context. The image should be relevant to the article. The author shared additional information for this request:\n\n===\n\n" . $message . "\n\n===\n\nPlease only output the description for the image, not the entire article, no need for extra information, and no need for the placeholders. Only output the description.";
484
485 // Create the image
486 $simplifiedPrompt = $mwai->simpleTextQuery( $prompt, $params );
487 $media = $mwai->imageQueryForMediaLibrary( $simplifiedPrompt, $params, $postId );
488 $result = [ 'media' => $media ];
489 }
490 return new WP_REST_Response([ 'success' => true, 'data' => $result ], 200 );
491 }
492 catch ( Exception $e ) {
493 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
494 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
495 }
496 }
497
498 function rest_helpers_update_title( $request ) {
499 try {
500 $params = $request->get_json_params();
501 $title = sanitize_text_field( $params['title'] );
502 $postId = intval( $params['postId'] );
503 $post = get_post( $postId );
504 if ( !$post ) {
505 throw new Exception( 'There is no post with this ID.' );
506 }
507 $post->post_title = $title;
508 //$post->post_name = sanitize_title( $title );
509 wp_update_post( $post );
510 return new WP_REST_Response([ 'success' => true, 'message' => "Title updated." ], 200 );
511 }
512 catch ( Exception $e ) {
513 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
514 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
515 }
516 }
517
518 function rest_helpers_update_excerpt( $request ) {
519 try {
520 $params = $request->get_json_params();
521 $excerpt = sanitize_text_field( $params['excerpt'] );
522 $postId = intval( $params['postId'] );
523 $post = get_post( $postId );
524 if ( !$post ) {
525 throw new Exception( 'There is no post with this ID.' );
526 }
527 $post->post_excerpt = $excerpt;
528 wp_update_post( $post );
529 return new WP_REST_Response([ 'success' => true, 'message' => "Excerpt updated." ], 200 );
530 }
531 catch ( Exception $e ) {
532 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
533 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
534 }
535 }
536
537 function rest_helpers_create_post( $request ) {
538 try {
539 $params = $request->get_json_params();
540 $title = sanitize_text_field( $params['title'] );
541 $content = sanitize_textarea_field( $params['content'] );
542 $excerpt = sanitize_text_field( $params['excerpt'] );
543 $postType = sanitize_text_field( $params['postType'] );
544 $post = new stdClass();
545 $post->post_title = $title;
546 $post->post_excerpt = $excerpt;
547 $post->post_content = $content;
548 $post->post_status = 'draft';
549 $post->post_type = isset( $postType ) ? $postType : 'post';
550 // TODO: Let's try to avoid using Markdown to create the Post
551 // Instead, we should create Gutenberg Blocks, or simple HTML.
552 // Then, we can get rid of the library for Markdown.
553 $post->post_content = $this->core->markdown_to_html( $post->post_content );
554 $postId = wp_insert_post( $post );
555 return new WP_REST_Response([ 'success' => true, 'postId' => $postId ], 200 );
556 }
557 catch ( Exception $e ) {
558 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
559 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
560 }
561 }
562
563 function rest_helpers_create_images( $request ) {
564 try {
565 $params = $request->get_json_params();
566 $title = sanitize_text_field( $params['title'] );
567 $caption = sanitize_text_field( $params['caption'] );
568 $alt = sanitize_text_field( $params['alt'] );
569 $description = sanitize_text_field( $params['description'] );
570 $url = $params['url'];
571 $filename = sanitize_text_field( $params['filename'] );
572 $attachmentId = $this->core->add_image_from_url( $url, $filename, $title, $description, $caption, $alt );
573 return new WP_REST_Response([ 'success' => true, 'attachmentId' => $attachmentId ], 200 );
574 }
575 catch ( Exception $e ) {
576 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
577 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
578 }
579 }
580
581 function rest_helpers_generate_image_meta( $request ) {
582 try {
583 global $mwai;
584 $params = $request->get_json_params();
585 $url = isset( $params['url'] ) ? esc_url_raw( $params['url'] ) : null;
586 if ( empty( $url ) ) {
587 throw new Exception( 'The url is required.' );
588 }
589 $prompt = 'Describe this image and suggest a short title, description and SEO-friendly (ASCII and lowercase) filename. '
590 . 'Return a JSON with the keys title, description, alt, caption, filename.';
591 $result = $mwai->simpleVisionQuery( $prompt, $url, null, [ 'image_remote_upload' => 'url', 'scope' => 'admin-tools' ] );
592 $result = preg_replace( '/^```json\s*/', '', $result );
593 $result = preg_replace( '/\s*```$/', '', $result );
594 if ( is_string( $result ) ) {
595 $data = json_decode( $result, true );
596 }
597 else {
598 $data = $result;
599 }
600 if ( !is_array( $data ) ) {
601 $data = [];
602 }
603 $data = array_merge( [ 'title' => '', 'description' => '', 'caption' => '', 'alt' => '', 'filename' => '' ], $data );
604 return new WP_REST_Response([ 'success' => true, 'data' => $data ], 200 );
605 }
606 catch ( Exception $e ) {
607 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
608 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
609 }
610 }
611
612 function rest_openai_files_get() {
613 try {
614 $envId = isset( $_GET['envId'] ) ? $_GET['envId'] : null;
615 $purposeFilter = isset( $_GET['purpose'] ) ? $_GET['purpose'] : null;
616 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
617 $files = $openai->list_files( $purposeFilter );
618 return new WP_REST_Response([ 'success' => true, 'files' => $files ], 200 );
619 }
620 catch ( Exception $e ) {
621 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
622 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
623 }
624 }
625
626 function rest_openai_deleted_finetunes_get() {
627 try {
628 $envId = isset( $_GET['envId'] ) ? $_GET['envId'] : null;
629 $legacy = isset( $_GET['legacy'] ) ? $_GET['legacy'] === 'true' : false;
630 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
631 $finetunes = $openai->list_deleted_finetunes( $legacy );
632 return new WP_REST_Response([ 'success' => true, 'finetunes' => $finetunes ], 200 );
633 }
634 catch ( Exception $e ) {
635 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
636 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
637 }
638 }
639
640 function rest_openai_finetunes_get() {
641 try {
642 $envId = isset( $_GET['envId'] ) ? $_GET['envId'] : null;
643 $legacy = isset( $_GET['legacy'] ) ? $_GET['legacy'] === 'true' : false;
644 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
645 $finetunes = $openai->list_finetunes( $legacy );
646 return new WP_REST_Response([ 'success' => true, 'finetunes' => $finetunes ], 200 );
647 }
648 catch ( Exception $e ) {
649 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
650 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
651 }
652 }
653
654 function rest_openai_files_upload( $request ) {
655 try {
656 $params = $request->get_json_params();
657 $envId = $params['envId'];;
658 $filename = sanitize_text_field( $params['filename'] );
659 $data = $params['data'];
660 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
661 $file = $openai->upload_file( $filename, $data );
662 return new WP_REST_Response([ 'success' => true, 'file' => $file ], 200 );
663 }
664 catch ( Exception $e ) {
665 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
666 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
667 }
668 }
669
670 function rest_openai_files_delete( $request ) {
671 try {
672 $params = $request->get_json_params();
673 $envId = $params['envId'];;
674 $fileId = $params['fileId'];
675 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
676 $openai->delete_file( $fileId );
677 return new WP_REST_Response([ 'success' => true ], 200 );
678 }
679 catch ( Exception $e ) {
680 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
681 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
682 }
683 }
684
685 function rest_openai_finetunes_cancel( $request ) {
686 try {
687 $params = $request->get_json_params();
688 $envId = $params['envId'];;
689 $finetuneId = $params['finetuneId'];
690 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
691 $openai->cancel_finetune( $finetuneId );
692 return new WP_REST_Response([ 'success' => true ], 200 );
693 }
694 catch ( Exception $e ) {
695 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
696 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
697 }
698 }
699
700 function rest_openai_finetunes_delete( $request ) {
701 try {
702 $params = $request->get_json_params();
703 $envId = $params['envId'];;
704 $modelId = $params['modelId'];
705 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
706 $openai->delete_finetune( $modelId );
707 return new WP_REST_Response([ 'success' => true ], 200 );
708 }
709 catch ( Exception $e ) {
710 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
711 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
712 }
713 }
714
715 function rest_openai_files_download( $request ) {
716 try {
717 $params = $request->get_json_params();
718 $envId = $params['envId'];;
719 $fileId = $params['fileId'];
720 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
721 $filename = $openai->download_file( $fileId );
722 $data = file_get_contents( $filename );
723 return new WP_REST_Response([ 'success' => true, 'data' => $data ], 200 );
724 }
725 catch ( Exception $e ) {
726 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
727 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
728 }
729 }
730
731 function rest_openai_files_finetune( $request ) {
732 try {
733 $params = $request->get_json_params();
734 $envId = $params['envId'];;
735 $fileId = $params['fileId'];
736 $model = $params['model'];
737 $suffix = $params['suffix'];
738 $hyperparams = [
739 "nEpochs" => isset( $params['nEpochs'] ) ? $params['nEpochs'] : null,
740 "batchSize" => isset( $params['batchSize'] ) ? $params['batchSize'] : null,
741 ];
742 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
743 $finetune = $openai->run_finetune( $fileId, $model, $suffix, $hyperparams );
744 return new WP_REST_Response([ 'success' => true, 'finetune' => $finetune ], 200 );
745 }
746 catch ( Exception $e ) {
747 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
748 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
749 }
750 }
751
752 function rest_helpers_count_posts( $request ) {
753 try {
754 $params = $request->get_query_params();
755 $postType = $params['postType'];
756 $postStatus = !empty( $params['postStatus'] ) ? explode( ',', $params['postStatus'] ) : [ 'publish' ];
757 $count = wp_count_posts( $postType );
758 $count = array_sum( array_intersect_key( (array)$count, array_flip( $postStatus ) ) );
759 return new WP_REST_Response([ 'success' => true, 'count' => $count ], 200 );
760 }
761 catch ( Exception $e ) {
762 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
763 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
764 }
765 }
766
767 function rest_helpers_posts_ids( $request ) {
768 try {
769 $params = $request->get_query_params();
770 $postType = $params['postType'];
771 $postStatus = !empty( $params['postStatus'] ) ? explode( ',', $params['postStatus'] ) : [ 'publish' ];
772 $posts = get_posts( [
773 'posts_per_page' => -1,
774 'post_type' => $postType,
775 'post_status' => $postStatus,
776 'fields' => 'ids'
777 ] );
778 return new WP_REST_Response([ 'success' => true, 'postIds' => $posts ], 200 );
779 }
780 catch ( Exception $e ) {
781 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
782 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
783 }
784 }
785
786 function rest_helpers_post_content( $request ) {
787 try {
788 $params = $request->get_query_params();
789 $offset = (int)$params['offset'];
790 $postType = $params['postType'];
791 $postStatus = isset( $params['postStatus'] ) ? explode( ',', $params['postStatus'] ) : [ 'publish' ];
792 $postId = (int)$params['postId'];
793
794 $post = null;
795 if ( !empty( $postId ) ) {
796 $post = get_post( $postId );
797 if ( $post->post_status !== 'publish' && $post->post_status !== 'future'
798 && $post->post_status !== 'draft' && $post->post_status !== 'private' ) {
799 $post = null;
800 }
801 }
802 else {
803 $posts = get_posts( [
804 'posts_per_page' => 1,
805 'post_type' => $postType,
806 'offset' => $offset,
807 'post_status' => $postStatus,
808 ] );
809 $post = count( $posts ) === 0 ? null : $posts[0];
810 }
811 if ( !$post ) {
812 return new WP_REST_Response([ 'success' => false, 'message' => 'Post not found' ], 404 );
813 }
814 $cleanPost = $this->core->get_post( $post );
815 return new WP_REST_Response([ 'success' => true, 'content' => $cleanPost['content'],
816 'checksum' => $cleanPost['checksum'], 'language' => $cleanPost['language'], 'excerpt' => $cleanPost['excerpt'],
817 'postId' => $cleanPost['postId'], 'title' => $cleanPost['title'], 'url' => $cleanPost['url'] ], 200 );
818 }
819 catch ( Exception $e ) {
820 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
821 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
822 }
823 }
824
825 function rest_helpers_run_tasks( $request ) {
826 try {
827 do_action( 'mwai_tasks_run' );
828 return new WP_REST_Response([ 'success' => true ], 200 );
829 }
830 catch ( Exception $e ) {
831 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
832 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
833 }
834 }
835
836 function rest_system_templates_get( $request ) {
837 try {
838 $params = $request->get_query_params();
839 $category = $params['category'];
840 $templates = [];
841 $templates_option = get_option( 'mwai_templates', [] );
842 if ( !is_array( $templates_option ) ) {
843 update_option( 'mwai_templates', [] );
844 }
845 $categories = array_column( $templates_option, 'category' );
846 $index = array_search( $category, $categories );
847 $templates = [];
848 if ( $index !== false ) {
849 $templates = $templates_option[$index]['templates'];
850 }
851 return new WP_REST_Response([ 'success' => true, 'templates' => $templates ], 200 );
852 }
853 catch ( Exception $e ) {
854 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
855 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
856 }
857 }
858
859 function rest_system_templates_save( $request ) {
860 try {
861 $params = $request->get_json_params();
862 $category = $params['category'];
863 $templates = $params['templates'];
864 $templates_option = get_option( 'mwai_templates', [] );
865 $categories = array_column( $templates_option, 'category' );
866 $index = array_search( $category, $categories );
867 if ( $index !== false && $index >= 0 ) {
868 $templates_option[$index]['templates'] = $templates;
869 }
870 else {
871 $group = [ 'category' => $category, 'templates' => $templates ];
872 $templates_option[] = $group;
873 }
874
875 update_option( 'mwai_templates', $templates_option );
876 return new WP_REST_Response([ 'success' => true ], 200 );
877 }
878 catch ( Exception $e ) {
879 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
880 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
881 }
882 }
883
884 function rest_system_logs_list( $request ) {
885 try {
886 $params = $request->get_json_params();
887 $offset = $params['offset'];
888 $limit = $params['limit'];
889 $filters = $params['filters'];
890 $sort = $params['sort'];
891 $logs = apply_filters( 'mwai_stats_logs_list', [], $offset, $limit, $filters, $sort );
892 return new WP_REST_Response([ 'success' => true, 'total' => $logs['total'], 'logs' => $logs['rows'] ], 200 );
893 }
894 catch ( Exception $e ) {
895 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
896 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
897 }
898 }
899
900 function rest_system_logs_delete( $request ) {
901 try {
902 $params = $request->get_json_params();
903 $logIds = $params['logIds'];
904 $success = apply_filters( 'mwai_stats_logs_delete', true, $logIds );
905 return new WP_REST_Response([ 'success' => $success ], 200 );
906 }
907 catch ( Exception $e ) {
908 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
909 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
910 }
911 }
912
913 function rest_system_logs_meta_get( $request ) {
914 try {
915 $params = $request->get_json_params();
916 $logId = $params['logId'];
917 $metaKeys = $params['metaKeys'];
918 $data = apply_filters( 'mwai_stats_logs_meta', [], $logId, $metaKeys );
919 return new WP_REST_Response([ 'success' => true, 'data' => $data ], 200 );
920 }
921 catch ( Exception $e ) {
922 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
923 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
924 }
925 }
926
927 function rest_system_logs_activity( $request ) {
928 try {
929 $params = $request->get_json_params();
930 $hours = isset( $params['hours'] ) ? intval( $params['hours'] ) : 24;
931 $data = apply_filters( 'mwai_stats_logs_activity', [], $hours );
932 return new WP_REST_Response([ 'success' => true, 'data' => $data ], 200 );
933 }
934 catch ( Exception $e ) {
935 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
936 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
937 }
938 }
939
940 function rest_system_logs_activity_daily( $request ) {
941 try {
942 $params = $request->get_json_params();
943 $days = isset( $params['days'] ) ? intval( $params['days'] ) : 31;
944 $data = apply_filters( 'mwai_stats_logs_activity_daily', [], $days );
945 return new WP_REST_Response([ 'success' => true, 'data' => $data ], 200 );
946 }
947 catch ( Exception $e ) {
948 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
949 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
950 }
951 }
952
953 function rest_ai_moderate( $request ) {
954 try {
955 $params = $request->get_json_params();
956 $envId = $params['envId'];
957 $text = $params['text'];
958 if ( !$text ) {
959 return new WP_REST_Response([ 'success' => false, 'message' => 'Text not found.' ], 404 );
960 }
961 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
962 $results = $openai->moderate( $text );
963 return new WP_REST_Response([ 'success' => true, 'results' => $results ], 200 );
964 }
965 catch ( Exception $e ) {
966 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
967 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
968 }
969 }
970
971 function rest_ai_transcribe_audio( $request ) {
972 try {
973 $params = $request->get_json_params();
974 $query = new Meow_MWAI_Query_Transcribe();
975 $query->inject_params( $params );
976 $query->set_scope('admin-tools');
977 $reply = $this->core->run_query( $query );
978 return new WP_REST_Response([ 'success' => true, 'data' => $reply->result ], 200 );
979 }
980 catch ( Exception $e ) {
981 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
982 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
983 }
984 }
985
986 function rest_ai_transcribe_image( $request ) {
987 try {
988 global $mwai;
989 $params = $request->get_json_params();
990 $message = $this->retrieve_message( $params );
991 $url = !empty( $params['url'] ) ? $params['url'] : null;
992 // This could lead to a security issue, so let's avoid using path directly.
993 //$path = !empty( $params['path'] ) ? $params['path'] : null;
994 $result = $mwai->simpleVisionQuery( $message, $url );
995 return new WP_REST_Response([ 'success' => true, 'data' => $result ], 200 );
996 }
997 catch ( Exception $e ) {
998 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
999 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
1000 }
1001 }
1002
1003 function rest_ai_json( $request ) {
1004 try {
1005 global $mwai;
1006 $params = $request->get_json_params();
1007 $message = $this->retrieve_message( $params );
1008 $result = $mwai->simpleJsonQuery( $message );
1009 return new WP_REST_Response([ 'success' => true, 'data' => $result ], 200 );
1010 }
1011 catch ( Exception $e ) {
1012 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
1013 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
1014 }
1015 }
1016
1017 function rest_helpers_post_types() {
1018 try {
1019 $postTypes = $this->core->get_post_types();
1020 return new WP_REST_Response([ 'success' => true, 'postTypes' => $postTypes ], 200 );
1021 }
1022 catch ( Exception $e ) {
1023 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
1024 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
1025 }
1026 }
1027
1028 function rest_settings_themes( $request ) {
1029 try {
1030 $method = $request->get_method();
1031 if ( $method === 'GET' ) {
1032 $themes = $this->core->get_themes();
1033 return new WP_REST_Response([ 'success' => true, 'themes' => $themes ], 200 );
1034 }
1035 else if ( $method === 'POST' ) {
1036 $params = $request->get_json_params();
1037 $themes = $params['themes'];
1038 $themes = $this->core->update_themes( $themes );
1039 return new WP_REST_Response([ 'success' => true, 'themes' => $themes ], 200 );
1040 }
1041 }
1042 catch ( Exception $e ) {
1043 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
1044 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
1045 }
1046 }
1047
1048 function rest_settings_chatbots( $request ) {
1049 try {
1050 $method = $request->get_method();
1051 if ( $method === 'GET' ) {
1052 $chatbots = $this->core->get_chatbots();
1053 return new WP_REST_Response([ 'success' => true, 'chatbots' => $chatbots ], 200 );
1054 }
1055 else if ( $method === 'POST' ) {
1056 $params = $request->get_json_params();
1057 $chatbots = $params['chatbots'];
1058 $chatbots = $this->core->update_chatbots( $chatbots );
1059 return new WP_REST_Response([ 'success' => true, 'chatbots' => $chatbots ], 200 );
1060 }
1061 return new WP_REST_Response([ 'success' => false, 'message' => 'Method not allowed' ], 405 );
1062 }
1063 catch ( Exception $e ) {
1064 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
1065 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
1066 }
1067 }
1068
1069 #region Logs
1070
1071 function rest_get_logs() {
1072 $logs = Meow_MWAI_Logging::get();
1073 return new WP_REST_Response( [ 'success' => true, 'data' => $logs ], 200 );
1074 }
1075
1076 function rest_clear_logs() {
1077 Meow_MWAI_Logging::clear();
1078 return new WP_REST_Response( [ 'success' => true ], 200 );
1079 }
1080
1081 #endregion
1082 }
1083