PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 2.8.3
AI Engine – The Chatbot, AI Framework & MCP for WordPress v2.8.3
3.5.7 3.5.6 3.5.5 3.5.4 3.5.3 3.5.2 3.5.1 3.5.0 3.4.9 3.4.8 3.4.7 0.2.1 1.6.91 0.2.2 1.6.92 0.2.3 1.6.93 0.2.4 1.6.94 0.2.5 1.6.95 0.2.6 1.6.96 0.2.7 1.6.97 0.2.8 1.6.98 0.2.9 1.6.99 0.3.0 1.7.0 0.3.1 1.7.1 0.3.2 1.7.2 0.3.3 1.7.3 0.3.4 1.7.4 0.3.5 1.7.5 0.3.6 1.7.6 0.4.0 1.7.7 0.4.1 1.7.8 0.4.2 1.7.9 0.4.3 1.8.0 0.4.4 1.8.1 0.4.5 1.8.2 0.4.6 1.8.3 0.4.7 1.8.4 0.4.8 1.8.5 0.4.9 1.8.6 0.5.0 1.8.7 0.5.1 1.8.8 0.5.2 1.8.9 0.5.3 1.9.0 0.5.4 1.9.1 0.5.5 1.9.2 0.5.6 1.9.3 0.5.7 1.9.4 0.5.8 1.9.5 0.5.9 1.9.6 0.6.0 1.9.7 0.6.1 1.9.8 0.6.2 1.9.81 0.6.3 1.9.82 0.6.4 1.9.83 0.6.5 1.9.84 0.6.6 1.9.85 0.6.7 1.9.86 0.6.8 1.9.87 0.6.9 1.9.88 0.7.0 1.9.89 0.7.1 1.9.90 0.7.2 1.9.91 0.7.3 1.9.92 0.7.4 1.9.93 0.7.5 1.9.94 0.7.6 1.9.95 0.7.7 1.9.96 0.7.8 1.9.97 0.7.9 1.9.98 0.8.0 1.9.99 0.8.1 2.0.0 0.8.2 2.0.1 0.8.3 2.0.2 0.8.4 2.0.3 0.8.5 2.0.4 0.8.6 2.0.5 0.8.7 2.0.6 0.8.8 2.0.7 0.8.9 2.0.8 0.9.0 2.0.9 0.9.2 2.1.0 0.9.3 2.1.1 0.9.4 2.1.2 0.9.5 2.1.3 0.9.6 2.1.4 0.9.7 2.1.5 0.9.8 2.1.6 0.9.81 2.1.7 0.9.82 2.1.8 0.9.83 2.1.9 0.9.84 2.2.0 0.9.85 2.2.1 0.9.86 2.2.2 0.9.87 2.2.3 0.9.88 2.2.4 0.9.89 2.2.5 0.9.9 2.2.51 0.9.91 2.2.52 0.9.92 2.2.53 0.9.93 2.2.54 0.9.94 2.2.56 0.9.95 2.2.57 0.9.96 2.2.6 0.9.97 2.2.60 0.9.98 2.2.61 0.9.99 2.2.62 1.0.0 2.2.63 1.0.01 2.2.70 1.0.1 2.2.80 1.0.2 2.2.81 1.0.3 2.2.90 1.0.4 2.2.91 1.0.5 2.2.92 1.0.6 2.2.93 1.0.7 2.2.94 1.0.8 2.2.95 1.0.9 2.3.0 1.1.0 2.3.1 1.1.1 2.3.2 1.1.2 2.3.3 1.1.3 2.3.4 1.1.4 2.3.5 1.1.5 2.3.6 1.1.6 2.3.7 1.1.7 2.3.8 1.1.8 2.3.9 1.1.9 2.4.0 1.2.0 2.4.1 1.2.1 2.4.2 1.2.2 2.4.3 1.2.21 2.4.4 1.2.3 2.4.5 1.2.30 2.4.6 1.3.0 2.4.7 1.3.1 2.4.8 1.3.2 2.4.9 1.3.3 2.5.0 1.3.31 2.5.1 1.3.32 2.5.2 1.3.33 2.5.3 1.3.34 2.5.4 1.3.35 2.5.5 1.3.36 2.5.6 1.3.37 2.5.7 1.3.38 2.5.8 1.3.39 2.5.9 1.3.40 2.6.0 1.3.41 2.6.1 1.3.42 2.6.2 1.3.43 2.6.3 1.3.44 2.6.5 1.3.45 2.6.6 1.3.46 2.6.7 1.3.47 2.6.8 1.3.48 2.6.9 1.3.49 2.7.0 1.3.50 2.7.1 1.3.51 2.7.2 1.3.52 2.7.3 1.3.53 2.7.4 1.3.54 2.7.5 1.3.56 2.7.6 1.3.57 2.7.7 1.3.58 2.7.8 1.3.59 2.7.9 1.3.60 2.8.0 1.3.61 2.8.1 1.3.62 2.8.2 1.3.63 2.8.3 1.3.64 2.8.4 1.3.65 2.8.5 1.3.66 2.8.6 1.3.67 2.8.7 1.3.68 2.8.8 1.3.69 2.8.9 1.3.70 2.9.0 1.3.71 2.9.1 1.3.72 2.9.2 1.3.73 2.9.3 1.3.74 2.9.4 1.3.75 2.9.5 1.3.76 2.9.6 1.3.77 2.9.7 1.3.78 2.9.8 1.3.79 2.9.9 1.3.80 3.0.0 1.3.81 3.0.1 1.3.82 3.0.2 1.3.83 3.0.3 1.3.84 3.0.4 1.3.85 3.0.5 1.3.86 3.0.6 1.3.87 3.0.7 1.3.88 3.0.8 1.3.89 3.0.9 1.3.90 3.1.0 1.3.91 3.1.1 1.3.92 3.1.2 1.3.93 3.1.3 1.3.94 3.1.4 1.3.95 3.1.5 1.3.96 3.1.6 1.3.97 3.1.7 1.3.98 3.1.8 1.3.99 3.1.9 1.4.0 3.2.0 1.4.1 3.2.1 1.4.2 3.2.2 1.4.3 3.2.3 1.4.4 3.2.4 1.4.5 3.2.5 1.4.6 3.2.6 1.4.7 3.2.7 1.4.8 3.2.8 1.4.9 3.2.9 1.5.0 3.3.0 1.5.1 3.3.1 1.5.2 3.3.2 1.5.3 3.3.3 1.5.4 3.3.4 1.5.5 3.3.5 1.5.6 3.3.6 1.5.7 3.3.7 1.5.8 3.3.8 1.5.9 3.3.9 1.6.0 3.4.0 1.6.1 3.4.1 1.6.2 3.4.2 1.6.3 3.4.3 1.6.5 3.4.4 1.6.51 3.4.5 1.6.52 3.4.6 1.6.53 1.6.54 1.6.55 1.6.56 1.6.57 1.6.58 1.6.59 1.6.60 1.6.61 1.6.62 1.6.63 1.6.64 1.6.65 1.6.66 1.6.67 1.6.68 trunk 1.6.69 0.0.1 1.6.70 0.0.2 1.6.71 0.0.3 1.6.72 0.0.4 1.6.73 0.0.5 1.6.74 0.0.6 1.6.75 0.0.7 1.6.76 0.0.8 1.6.77 0.0.9 1.6.78 0.1.0 1.6.79 0.1.1 1.6.81 0.1.2 1.6.82 0.1.3 1.6.83 0.1.4 1.6.84 0.1.5 1.6.85 0.1.6 1.6.86 0.1.7 1.6.87 0.1.8 1.6.88 0.1.9 1.6.89 0.2.0 1.6.90
ai-engine / classes / rest.php
ai-engine / classes Last commit date
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 event.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
1110 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 // MCP Endpoints
168 register_rest_route( $this->namespace, '/mcp/functions', array(
169 'methods' => 'GET',
170 'permission_callback' => [ $this->core, 'can_access_settings' ],
171 'callback' => [ $this, 'rest_mcp_functions' ],
172 ) );
173
174 // Helpers Endpoints
175 register_rest_route( $this->namespace, '/helpers/update_post_title', array(
176 'methods' => 'POST',
177 'permission_callback' => [ $this->core, 'can_access_features' ],
178 'callback' => [ $this, 'rest_helpers_update_title' ],
179 ) );
180 register_rest_route( $this->namespace, '/helpers/update_post_excerpt', array(
181 'methods' => 'POST',
182 'permission_callback' => [ $this->core, 'can_access_features' ],
183 'callback' => [ $this, 'rest_helpers_update_excerpt' ],
184 ) );
185 register_rest_route( $this->namespace, '/helpers/create_post', array(
186 'methods' => 'POST',
187 'permission_callback' => [ $this->core, 'can_access_features' ],
188 'callback' => [ $this, 'rest_helpers_create_post' ],
189 ) );
190 register_rest_route( $this->namespace, '/helpers/create_image', array(
191 'methods' => 'POST',
192 'permission_callback' => [ $this->core, 'can_access_features' ],
193 'callback' => [ $this, 'rest_helpers_create_images' ],
194 ) );
195 register_rest_route( $this->namespace, '/helpers/generate_image_meta', array(
196 'methods' => 'POST',
197 'permission_callback' => [ $this->core, 'can_access_features' ],
198 'callback' => [ $this, 'rest_helpers_generate_image_meta' ],
199 ) );
200 register_rest_route( $this->namespace, '/helpers/count_posts', array(
201 'methods' => 'GET',
202 'permission_callback' => [ $this->core, 'can_access_features' ],
203 'callback' => [ $this, 'rest_helpers_count_posts' ],
204 ) );
205 register_rest_route( $this->namespace, '/helpers/posts_ids', array(
206 'methods' => 'GET',
207 'permission_callback' => [ $this->core, 'can_access_features' ],
208 'callback' => [ $this, 'rest_helpers_posts_ids' ],
209 ) );
210 register_rest_route( $this->namespace, '/helpers/post_types', array(
211 'methods' => 'GET',
212 'permission_callback' => [ $this->core, 'can_access_features' ],
213 'callback' => [ $this, 'rest_helpers_post_types' ],
214 ) );
215 register_rest_route( $this->namespace, '/helpers/post_content', array(
216 'methods' => 'GET',
217 'permission_callback' => [ $this->core, 'can_access_features' ],
218 'callback' => [ $this, 'rest_helpers_post_content' ],
219 ) );
220 register_rest_route( $this->namespace, '/helpers/run_tasks', array(
221 'methods' => 'POST',
222 'permission_callback' => [ $this->core, 'can_access_features' ],
223 'callback' => [ $this, 'rest_helpers_run_tasks' ],
224 ) );
225
226 // OpenAI Endpoints
227 register_rest_route( $this->namespace, '/openai/files/list', array(
228 'methods' => 'GET',
229 'permission_callback' => [ $this->core, 'can_access_settings' ],
230 'callback' => [ $this, 'rest_openai_files_get' ],
231 ) );
232 register_rest_route( $this->namespace, '/openai/files/upload', array(
233 'methods' => 'POST',
234 'permission_callback' => [ $this->core, 'can_access_settings' ],
235 'callback' => [ $this, 'rest_openai_files_upload' ],
236 ) );
237 register_rest_route( $this->namespace, '/openai/files/delete', array(
238 'methods' => 'POST',
239 'permission_callback' => [ $this->core, 'can_access_settings' ],
240 'callback' => [ $this, 'rest_openai_files_delete' ],
241 ) );
242 register_rest_route( $this->namespace, '/openai/files/download', array(
243 'methods' => 'POST',
244 'permission_callback' => [ $this->core, 'can_access_settings' ],
245 'callback' => [ $this, 'rest_openai_files_download' ],
246 ) );
247 register_rest_route( $this->namespace, '/openai/files/finetune', array(
248 'methods' => 'POST',
249 'permission_callback' => [ $this->core, 'can_access_settings' ],
250 'callback' => [ $this, 'rest_openai_files_finetune' ],
251 ) );
252 register_rest_route( $this->namespace, '/openai/finetunes/list_deleted', array(
253 'methods' => 'GET',
254 'permission_callback' => [ $this->core, 'can_access_settings' ],
255 'callback' => [ $this, 'rest_openai_deleted_finetunes_get' ],
256 ) );
257
258 // register_rest_route( $this->namespace, '/openai/models', array(
259 // 'methods' => 'GET',
260 // 'permission_callback' => [ $this->core, 'can_access_settings' ],
261 // 'callback' => [ $this, 'rest_openai_models_get' ],
262 // ) );
263
264 register_rest_route( $this->namespace, '/openai/finetunes/list', array(
265 'methods' => 'GET',
266 'permission_callback' => [ $this->core, 'can_access_settings' ],
267 'callback' => [ $this, 'rest_openai_finetunes_get' ],
268 ) );
269 register_rest_route( $this->namespace, '/openai/finetunes/delete', array(
270 'methods' => 'POST',
271 'permission_callback' => [ $this->core, 'can_access_settings' ],
272 'callback' => [ $this, 'rest_openai_finetunes_delete' ],
273 ) );
274 register_rest_route( $this->namespace, '/openai/finetunes/cancel', array(
275 'methods' => 'POST',
276 'permission_callback' => [ $this->core, 'can_access_settings' ],
277 'callback' => [ $this, 'rest_openai_finetunes_cancel' ],
278 ) );
279
280 // Logging Endpoints
281 register_rest_route( $this->namespace, '/get_logs', array(
282 'methods' => 'GET',
283 'permission_callback' => array( $this->core, 'can_access_features' ),
284 'callback' => array( $this, 'rest_get_logs' )
285 ) );
286 register_rest_route( $this->namespace, '/clear_logs', array(
287 'methods' => 'GET',
288 'permission_callback' => array( $this->core, 'can_access_features' ),
289 'callback' => array( $this, 'rest_clear_logs' )
290 ) );
291 }
292 catch ( Exception $e ) {
293 var_dump( $e );
294 }
295 }
296
297 function rest_start_session() {
298 try {
299 $sessionId = $this->core->get_session_id();
300 $restNonce = $this->core->get_nonce( true );
301 return new WP_REST_Response( [
302 'success' => true,
303 'sessionId' => $sessionId,
304 'restNonce' => $restNonce
305 ], 200 );
306 }
307 catch ( Exception $e ) {
308 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
309 return new WP_REST_Response( [ 'success' => false, 'message' => $message ], 500 );
310 }
311 }
312
313 function rest_settings_list() {
314 return new WP_REST_Response( [
315 'success' => true,
316 'options' => $this->core->get_all_options()
317 ], 200 );
318 }
319
320 function rest_settings_update( $request ) {
321 try {
322 $params = $request->get_json_params();
323 $value = $params['options'];
324 $options = $this->core->update_options( $value );
325 $success = !!$options;
326 $message = __( $success ? 'OK' : "Could not update options.", 'ai-engine' );
327 return new WP_REST_Response([ 'success' => $success, 'message' => $message, 'options' => $options ], 200 );
328 }
329 catch ( Exception $e ) {
330 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
331 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
332 }
333 }
334
335 function rest_settings_reset() {
336 try {
337 $options = $this->core->reset_options();
338 $success = !!$options;
339 $message = __( $success ? 'OK' : "Could not reset options.", 'ai-engine' );
340 return new WP_REST_Response([ 'success' => $success, 'message' => $message, 'options' => $options ], 200 );
341 }
342 catch ( Exception $e ) {
343 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
344 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
345 }
346 }
347
348 function rest_ai_models( $request ) {
349 try {
350 $params = $request->get_json_params();
351 $envId = $params['envId'];
352 $engine = Meow_MWAI_Engines_Factory::get( $this->core, $envId );
353 $models = $engine->retrieve_models();
354 return new WP_REST_Response([ 'success' => true, 'models' => $models ], 200 );
355 }
356 catch ( Exception $e ) {
357 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
358 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
359 }
360 }
361
362 function rest_ai_completions( $request ) {
363 try {
364 $params = $request->get_json_params();
365 $message = $this->retrieve_message( $params );
366 $query = new Meow_MWAI_Query_Text( $message );
367 $query->inject_params( $params );
368
369 // Handle streaming
370 $stream = $params['stream'] ?? false;
371 $streamCallback = null;
372 if ( $stream ) {
373 $streamCallback = function( $reply ) use ( $query ) {
374 //$raw = _wp_specialchars( $reply, ENT_NOQUOTES, 'UTF-8', true );
375 $raw = $reply;
376 $this->core->stream_push( [ 'type' => 'live', 'data' => $raw ], $query );
377 if ( ob_get_level() > 0 ) {
378 ob_flush();
379 }
380 flush();
381 };
382 header( 'Cache-Control: no-cache' );
383 header( 'Content-Type: text/event-stream' );
384 header( 'X-Accel-Buffering: no' ); // This is useful to disable buffering in nginx through headers.
385 ob_implicit_flush( true );
386 ob_end_flush();
387 }
388
389 // Process Reply
390 $reply = $this->core->run_query( $query, $streamCallback );
391 $restRes = [
392 'success' => true,
393 'data' => $reply->result,
394 'usage' => $reply->usage
395 ];
396 if ( $stream ) {
397 $this->core->stream_push( [ 'type' => 'end', 'data' => json_encode( $restRes ) ], $query );
398 die();
399 }
400 return new WP_REST_Response( $restRes, 200 );
401 }
402 catch ( Exception $e ) {
403 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
404 if ( $stream ) {
405 $this->core->stream_push( [ 'type' => 'error', 'data' => $message ], $query );
406 }
407 else {
408 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
409 }
410 }
411 }
412
413 function rest_ai_images( $request ) {
414 try {
415 $params = $request->get_json_params();
416 $message = $this->retrieve_message( $params );
417 $query = new Meow_MWAI_Query_Image( $message );
418 $query->inject_params( $params );
419 $reply = $this->core->run_query( $query );
420 return new WP_REST_Response([ 'success' => true, 'data' => $reply->results, 'usage' => $reply->usage ], 200 );
421 }
422 catch ( Exception $e ) {
423 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
424 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
425 }
426 }
427
428 function rest_ai_image_edit( $request ) {
429 try {
430 $params = $request->get_json_params();
431 $message = $this->retrieve_message( $params );
432 $mediaId = isset( $params['mediaId'] ) ? intval( $params['mediaId'] ) : 0;
433 $query = new Meow_MWAI_Query_EditImage( $message );
434 $query->inject_params( $params );
435 if ( $mediaId ) {
436 $path = get_attached_file( $mediaId );
437 if ( $path ) {
438 $query->set_file( Meow_MWAI_Query_DroppedFile::from_path( $path, 'vision' ) );
439 }
440 }
441 $reply = $this->core->run_query( $query );
442 return new WP_REST_Response([ 'success' => true, 'data' => $reply->results, 'usage' => $reply->usage ], 200 );
443 }
444 catch ( Exception $e ) {
445 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
446 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
447 }
448 }
449
450 function rest_ai_magic_wand( $request ) {
451 try {
452 $params = $request->get_json_params();
453 $action = isset( $params['action'] ) ? $params['action'] : null;
454 $data = isset( $params['data'] ) ? $params['data'] : null;
455 if ( empty( $data ) || empty( $action ) ) {
456 return new WP_REST_Response([ 'success' => false, 'message' => "An action and some data are required." ], 500 );
457 }
458 $data = apply_filters( 'mwai_magic_wand_' . $action, "", $data );
459 return new WP_REST_Response([ 'success' => true, 'data' => $data ], 200 );
460 }
461 catch ( Exception $e ) {
462 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
463 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
464 }
465 }
466
467 function rest_ai_copilot( $request ) {
468 try {
469 $params = $request->get_json_params();
470 $action = sanitize_text_field( $params['action'] );
471 $message = $this->retrieve_message( $params, true );
472 $context = sanitize_text_field( $params['context'] );
473 $postId = !empty( $params['postId'] ) ? intval( $params['postId'] ) : null;
474 if ( empty( $action ) || empty( $message ) ) {
475 return new WP_REST_Response([ 'success' => false, 'message' => "Copilot needs an action and a prompt." ], 500 );
476 }
477
478 global $mwai;
479 $result = null;
480 $params = [ 'scope' => 'copilot' ];
481
482 if ( $action === 'text' ) {
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 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.";
484 if ( !empty( $model ) ) {
485 $params['model'] = $model;
486 }
487 $result = $mwai->simpleTextQuery( $prompt, $params );
488 }
489 else if ( $action === 'image' ) {
490 $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.";
491
492 // Create the image
493 $simplifiedPrompt = $mwai->simpleTextQuery( $prompt, $params );
494 $media = $mwai->imageQueryForMediaLibrary( $simplifiedPrompt, $params, $postId );
495 $result = [ 'media' => $media ];
496 }
497 return new WP_REST_Response([ 'success' => true, 'data' => $result ], 200 );
498 }
499 catch ( Exception $e ) {
500 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
501 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
502 }
503 }
504
505 function rest_helpers_update_title( $request ) {
506 try {
507 $params = $request->get_json_params();
508 $title = sanitize_text_field( $params['title'] );
509 $postId = intval( $params['postId'] );
510 $post = get_post( $postId );
511 if ( !$post ) {
512 throw new Exception( 'There is no post with this ID.' );
513 }
514 $post->post_title = $title;
515 //$post->post_name = sanitize_title( $title );
516 wp_update_post( $post );
517 return new WP_REST_Response([ 'success' => true, 'message' => "Title updated." ], 200 );
518 }
519 catch ( Exception $e ) {
520 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
521 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
522 }
523 }
524
525 function rest_helpers_update_excerpt( $request ) {
526 try {
527 $params = $request->get_json_params();
528 $excerpt = sanitize_text_field( $params['excerpt'] );
529 $postId = intval( $params['postId'] );
530 $post = get_post( $postId );
531 if ( !$post ) {
532 throw new Exception( 'There is no post with this ID.' );
533 }
534 $post->post_excerpt = $excerpt;
535 wp_update_post( $post );
536 return new WP_REST_Response([ 'success' => true, 'message' => "Excerpt updated." ], 200 );
537 }
538 catch ( Exception $e ) {
539 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
540 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
541 }
542 }
543
544 function rest_helpers_create_post( $request ) {
545 try {
546 $params = $request->get_json_params();
547 $title = sanitize_text_field( $params['title'] );
548 $content = sanitize_textarea_field( $params['content'] );
549 $excerpt = sanitize_text_field( $params['excerpt'] );
550 $postType = sanitize_text_field( $params['postType'] );
551 $post = new stdClass();
552 $post->post_title = $title;
553 $post->post_excerpt = $excerpt;
554 $post->post_content = $content;
555 $post->post_status = 'draft';
556 $post->post_type = isset( $postType ) ? $postType : 'post';
557 // TODO: Let's try to avoid using Markdown to create the Post
558 // Instead, we should create Gutenberg Blocks, or simple HTML.
559 // Then, we can get rid of the library for Markdown.
560 $post->post_content = $this->core->markdown_to_html( $post->post_content );
561 $postId = wp_insert_post( $post );
562 return new WP_REST_Response([ 'success' => true, 'postId' => $postId ], 200 );
563 }
564 catch ( Exception $e ) {
565 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
566 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
567 }
568 }
569
570 function rest_helpers_create_images( $request ) {
571 try {
572 $params = $request->get_json_params();
573 $title = sanitize_text_field( $params['title'] );
574 $caption = sanitize_text_field( $params['caption'] );
575 $alt = sanitize_text_field( $params['alt'] );
576 $description = sanitize_text_field( $params['description'] );
577 $url = $params['url'];
578 $filename = sanitize_text_field( $params['filename'] );
579 $attachmentId = $this->core->add_image_from_url( $url, $filename, $title, $description, $caption, $alt );
580 return new WP_REST_Response([ 'success' => true, 'attachmentId' => $attachmentId ], 200 );
581 }
582 catch ( Exception $e ) {
583 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
584 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
585 }
586 }
587
588 function rest_helpers_generate_image_meta( $request ) {
589 try {
590 global $mwai;
591 $params = $request->get_json_params();
592 $url = isset( $params['url'] ) ? esc_url_raw( $params['url'] ) : null;
593 if ( empty( $url ) ) {
594 throw new Exception( 'The url is required.' );
595 }
596 $prompt = 'Describe this image and suggest a short title, description and SEO-friendly (ASCII and lowercase) filename. '
597 . 'Return a JSON with the keys title, description, alt, caption, filename.';
598 $result = $mwai->simpleVisionQuery( $prompt, $url, null, [ 'image_remote_upload' => 'url', 'scope' => 'admin-tools' ] );
599 $result = preg_replace( '/^```json\s*/', '', $result );
600 $result = preg_replace( '/\s*```$/', '', $result );
601 if ( is_string( $result ) ) {
602 $data = json_decode( $result, true );
603 }
604 else {
605 $data = $result;
606 }
607 if ( !is_array( $data ) ) {
608 $data = [];
609 }
610 $data = array_merge( [ 'title' => '', 'description' => '', 'caption' => '', 'alt' => '', 'filename' => '' ], $data );
611 return new WP_REST_Response([ 'success' => true, 'data' => $data ], 200 );
612 }
613 catch ( Exception $e ) {
614 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
615 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
616 }
617 }
618
619 function rest_openai_files_get() {
620 try {
621 $envId = isset( $_GET['envId'] ) ? $_GET['envId'] : null;
622 $purposeFilter = isset( $_GET['purpose'] ) ? $_GET['purpose'] : null;
623 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
624 $files = $openai->list_files( $purposeFilter );
625 return new WP_REST_Response([ 'success' => true, 'files' => $files ], 200 );
626 }
627 catch ( Exception $e ) {
628 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
629 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
630 }
631 }
632
633 function rest_openai_deleted_finetunes_get() {
634 try {
635 $envId = isset( $_GET['envId'] ) ? $_GET['envId'] : null;
636 $legacy = isset( $_GET['legacy'] ) ? $_GET['legacy'] === 'true' : false;
637 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
638 $finetunes = $openai->list_deleted_finetunes( $legacy );
639 return new WP_REST_Response([ 'success' => true, 'finetunes' => $finetunes ], 200 );
640 }
641 catch ( Exception $e ) {
642 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
643 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
644 }
645 }
646
647 function rest_openai_finetunes_get() {
648 try {
649 $envId = isset( $_GET['envId'] ) ? $_GET['envId'] : null;
650 $legacy = isset( $_GET['legacy'] ) ? $_GET['legacy'] === 'true' : false;
651 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
652 $finetunes = $openai->list_finetunes( $legacy );
653 return new WP_REST_Response([ 'success' => true, 'finetunes' => $finetunes ], 200 );
654 }
655 catch ( Exception $e ) {
656 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
657 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
658 }
659 }
660
661 function rest_openai_files_upload( $request ) {
662 try {
663 $params = $request->get_json_params();
664 $envId = $params['envId'];;
665 $filename = sanitize_text_field( $params['filename'] );
666 $data = $params['data'];
667 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
668 $file = $openai->upload_file( $filename, $data );
669 return new WP_REST_Response([ 'success' => true, 'file' => $file ], 200 );
670 }
671 catch ( Exception $e ) {
672 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
673 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
674 }
675 }
676
677 function rest_openai_files_delete( $request ) {
678 try {
679 $params = $request->get_json_params();
680 $envId = $params['envId'];;
681 $fileId = $params['fileId'];
682 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
683 $openai->delete_file( $fileId );
684 return new WP_REST_Response([ 'success' => true ], 200 );
685 }
686 catch ( Exception $e ) {
687 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
688 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
689 }
690 }
691
692 function rest_openai_finetunes_cancel( $request ) {
693 try {
694 $params = $request->get_json_params();
695 $envId = $params['envId'];;
696 $finetuneId = $params['finetuneId'];
697 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
698 $openai->cancel_finetune( $finetuneId );
699 return new WP_REST_Response([ 'success' => true ], 200 );
700 }
701 catch ( Exception $e ) {
702 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
703 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
704 }
705 }
706
707 function rest_openai_finetunes_delete( $request ) {
708 try {
709 $params = $request->get_json_params();
710 $envId = $params['envId'];;
711 $modelId = $params['modelId'];
712 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
713 $openai->delete_finetune( $modelId );
714 return new WP_REST_Response([ 'success' => true ], 200 );
715 }
716 catch ( Exception $e ) {
717 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
718 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
719 }
720 }
721
722 function rest_openai_files_download( $request ) {
723 try {
724 $params = $request->get_json_params();
725 $envId = $params['envId'];;
726 $fileId = $params['fileId'];
727 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
728 $filename = $openai->download_file( $fileId );
729 $data = file_get_contents( $filename );
730 return new WP_REST_Response([ 'success' => true, 'data' => $data ], 200 );
731 }
732 catch ( Exception $e ) {
733 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
734 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
735 }
736 }
737
738 function rest_openai_files_finetune( $request ) {
739 try {
740 $params = $request->get_json_params();
741 $envId = $params['envId'];;
742 $fileId = $params['fileId'];
743 $model = $params['model'];
744 $suffix = $params['suffix'];
745 $hyperparams = [
746 "nEpochs" => isset( $params['nEpochs'] ) ? $params['nEpochs'] : null,
747 "batchSize" => isset( $params['batchSize'] ) ? $params['batchSize'] : null,
748 ];
749 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
750 $finetune = $openai->run_finetune( $fileId, $model, $suffix, $hyperparams );
751 return new WP_REST_Response([ 'success' => true, 'finetune' => $finetune ], 200 );
752 }
753 catch ( Exception $e ) {
754 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
755 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
756 }
757 }
758
759 function rest_helpers_count_posts( $request ) {
760 try {
761 $params = $request->get_query_params();
762 $postType = $params['postType'];
763 $postStatus = !empty( $params['postStatus'] ) ? explode( ',', $params['postStatus'] ) : [ 'publish' ];
764 $count = wp_count_posts( $postType );
765 $count = array_sum( array_intersect_key( (array)$count, array_flip( $postStatus ) ) );
766 return new WP_REST_Response([ 'success' => true, 'count' => $count ], 200 );
767 }
768 catch ( Exception $e ) {
769 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
770 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
771 }
772 }
773
774 function rest_helpers_posts_ids( $request ) {
775 try {
776 $params = $request->get_query_params();
777 $postType = $params['postType'];
778 $postStatus = !empty( $params['postStatus'] ) ? explode( ',', $params['postStatus'] ) : [ 'publish' ];
779 $posts = get_posts( [
780 'posts_per_page' => -1,
781 'post_type' => $postType,
782 'post_status' => $postStatus,
783 'fields' => 'ids'
784 ] );
785 return new WP_REST_Response([ 'success' => true, 'postIds' => $posts ], 200 );
786 }
787 catch ( Exception $e ) {
788 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
789 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
790 }
791 }
792
793 function rest_helpers_post_content( $request ) {
794 try {
795 $params = $request->get_query_params();
796 $offset = (int)$params['offset'];
797 $postType = $params['postType'];
798 $postStatus = isset( $params['postStatus'] ) ? explode( ',', $params['postStatus'] ) : [ 'publish' ];
799 $postId = (int)$params['postId'];
800
801 $post = null;
802 if ( !empty( $postId ) ) {
803 $post = get_post( $postId );
804 if ( $post->post_status !== 'publish' && $post->post_status !== 'future'
805 && $post->post_status !== 'draft' && $post->post_status !== 'private' ) {
806 $post = null;
807 }
808 }
809 else {
810 $posts = get_posts( [
811 'posts_per_page' => 1,
812 'post_type' => $postType,
813 'offset' => $offset,
814 'post_status' => $postStatus,
815 ] );
816 $post = count( $posts ) === 0 ? null : $posts[0];
817 }
818 if ( !$post ) {
819 return new WP_REST_Response([ 'success' => false, 'message' => 'Post not found' ], 404 );
820 }
821 $cleanPost = $this->core->get_post( $post );
822 return new WP_REST_Response([ 'success' => true, 'content' => $cleanPost['content'],
823 'checksum' => $cleanPost['checksum'], 'language' => $cleanPost['language'], 'excerpt' => $cleanPost['excerpt'],
824 'postId' => $cleanPost['postId'], 'title' => $cleanPost['title'], 'url' => $cleanPost['url'] ], 200 );
825 }
826 catch ( Exception $e ) {
827 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
828 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
829 }
830 }
831
832 function rest_helpers_run_tasks( $request ) {
833 try {
834 do_action( 'mwai_tasks_run' );
835 return new WP_REST_Response([ 'success' => true ], 200 );
836 }
837 catch ( Exception $e ) {
838 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
839 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
840 }
841 }
842
843 function rest_system_templates_get( $request ) {
844 try {
845 $params = $request->get_query_params();
846 $category = $params['category'];
847 $templates = [];
848 $templates_option = get_option( 'mwai_templates', [] );
849 if ( !is_array( $templates_option ) ) {
850 update_option( 'mwai_templates', [] );
851 }
852 $categories = array_column( $templates_option, 'category' );
853 $index = array_search( $category, $categories );
854 $templates = [];
855 if ( $index !== false ) {
856 $templates = $templates_option[$index]['templates'];
857 }
858 return new WP_REST_Response([ 'success' => true, 'templates' => $templates ], 200 );
859 }
860 catch ( Exception $e ) {
861 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
862 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
863 }
864 }
865
866 function rest_system_templates_save( $request ) {
867 try {
868 $params = $request->get_json_params();
869 $category = $params['category'];
870 $templates = $params['templates'];
871 $templates_option = get_option( 'mwai_templates', [] );
872 $categories = array_column( $templates_option, 'category' );
873 $index = array_search( $category, $categories );
874 if ( $index !== false && $index >= 0 ) {
875 $templates_option[$index]['templates'] = $templates;
876 }
877 else {
878 $group = [ 'category' => $category, 'templates' => $templates ];
879 $templates_option[] = $group;
880 }
881
882 update_option( 'mwai_templates', $templates_option );
883 return new WP_REST_Response([ 'success' => true ], 200 );
884 }
885 catch ( Exception $e ) {
886 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
887 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
888 }
889 }
890
891 function rest_system_logs_list( $request ) {
892 try {
893 $params = $request->get_json_params();
894 $offset = $params['offset'];
895 $limit = $params['limit'];
896 $filters = $params['filters'];
897 $sort = $params['sort'];
898 $logs = apply_filters( 'mwai_stats_logs_list', [], $offset, $limit, $filters, $sort );
899 return new WP_REST_Response([ 'success' => true, 'total' => $logs['total'], 'logs' => $logs['rows'] ], 200 );
900 }
901 catch ( Exception $e ) {
902 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
903 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
904 }
905 }
906
907 function rest_system_logs_delete( $request ) {
908 try {
909 $params = $request->get_json_params();
910 $logIds = $params['logIds'];
911 $success = apply_filters( 'mwai_stats_logs_delete', true, $logIds );
912 return new WP_REST_Response([ 'success' => $success ], 200 );
913 }
914 catch ( Exception $e ) {
915 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
916 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
917 }
918 }
919
920 function rest_system_logs_meta_get( $request ) {
921 try {
922 $params = $request->get_json_params();
923 $logId = $params['logId'];
924 $metaKeys = $params['metaKeys'];
925 $data = apply_filters( 'mwai_stats_logs_meta', [], $logId, $metaKeys );
926 return new WP_REST_Response([ 'success' => true, 'data' => $data ], 200 );
927 }
928 catch ( Exception $e ) {
929 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
930 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
931 }
932 }
933
934 function rest_system_logs_activity( $request ) {
935 try {
936 $params = $request->get_json_params();
937 $hours = isset( $params['hours'] ) ? intval( $params['hours'] ) : 24;
938 $data = apply_filters( 'mwai_stats_logs_activity', [], $hours );
939 return new WP_REST_Response([ 'success' => true, 'data' => $data ], 200 );
940 }
941 catch ( Exception $e ) {
942 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
943 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
944 }
945 }
946
947 function rest_system_logs_activity_daily( $request ) {
948 try {
949 $params = $request->get_json_params();
950 $days = isset( $params['days'] ) ? intval( $params['days'] ) : 31;
951 $data = apply_filters( 'mwai_stats_logs_activity_daily', [], $days );
952 return new WP_REST_Response([ 'success' => true, 'data' => $data ], 200 );
953 }
954 catch ( Exception $e ) {
955 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
956 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
957 }
958 }
959
960 function rest_ai_moderate( $request ) {
961 try {
962 $params = $request->get_json_params();
963 $envId = $params['envId'];
964 $text = $params['text'];
965 if ( !$text ) {
966 return new WP_REST_Response([ 'success' => false, 'message' => 'Text not found.' ], 404 );
967 }
968 $openai = Meow_MWAI_Engines_Factory::get_openai( $this->core, $envId );
969 $results = $openai->moderate( $text );
970 return new WP_REST_Response([ 'success' => true, 'results' => $results ], 200 );
971 }
972 catch ( Exception $e ) {
973 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
974 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
975 }
976 }
977
978 function rest_ai_transcribe_audio( $request ) {
979 try {
980 $params = $request->get_json_params();
981 $query = new Meow_MWAI_Query_Transcribe();
982 $query->inject_params( $params );
983 $query->set_scope('admin-tools');
984 $reply = $this->core->run_query( $query );
985 return new WP_REST_Response([ 'success' => true, 'data' => $reply->result ], 200 );
986 }
987 catch ( Exception $e ) {
988 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
989 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
990 }
991 }
992
993 function rest_ai_transcribe_image( $request ) {
994 try {
995 global $mwai;
996 $params = $request->get_json_params();
997 $message = $this->retrieve_message( $params );
998 $url = !empty( $params['url'] ) ? $params['url'] : null;
999 // This could lead to a security issue, so let's avoid using path directly.
1000 //$path = !empty( $params['path'] ) ? $params['path'] : null;
1001 $result = $mwai->simpleVisionQuery( $message, $url );
1002 return new WP_REST_Response([ 'success' => true, 'data' => $result ], 200 );
1003 }
1004 catch ( Exception $e ) {
1005 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
1006 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
1007 }
1008 }
1009
1010 function rest_ai_json( $request ) {
1011 try {
1012 global $mwai;
1013 $params = $request->get_json_params();
1014 $message = $this->retrieve_message( $params );
1015 $result = $mwai->simpleJsonQuery( $message );
1016 return new WP_REST_Response([ 'success' => true, 'data' => $result ], 200 );
1017 }
1018 catch ( Exception $e ) {
1019 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
1020 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
1021 }
1022 }
1023
1024 function rest_mcp_functions( $request ) {
1025 try {
1026 // Get all registered MCP tools
1027 $tools = apply_filters( 'mwai_mcp_tools', [] );
1028
1029 // Format the response
1030 $response = [
1031 'success' => true,
1032 'count' => count( $tools ),
1033 'functions' => $tools
1034 ];
1035
1036 return new WP_REST_Response( $response, 200 );
1037 }
1038 catch ( Exception $e ) {
1039 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
1040 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
1041 }
1042 }
1043
1044 function rest_helpers_post_types() {
1045 try {
1046 $postTypes = $this->core->get_post_types();
1047 return new WP_REST_Response([ 'success' => true, 'postTypes' => $postTypes ], 200 );
1048 }
1049 catch ( Exception $e ) {
1050 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
1051 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
1052 }
1053 }
1054
1055 function rest_settings_themes( $request ) {
1056 try {
1057 $method = $request->get_method();
1058 if ( $method === 'GET' ) {
1059 $themes = $this->core->get_themes();
1060 return new WP_REST_Response([ 'success' => true, 'themes' => $themes ], 200 );
1061 }
1062 else if ( $method === 'POST' ) {
1063 $params = $request->get_json_params();
1064 $themes = $params['themes'];
1065 $themes = $this->core->update_themes( $themes );
1066 return new WP_REST_Response([ 'success' => true, 'themes' => $themes ], 200 );
1067 }
1068 }
1069 catch ( Exception $e ) {
1070 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
1071 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
1072 }
1073 }
1074
1075 function rest_settings_chatbots( $request ) {
1076 try {
1077 $method = $request->get_method();
1078 if ( $method === 'GET' ) {
1079 $chatbots = $this->core->get_chatbots();
1080 return new WP_REST_Response([ 'success' => true, 'chatbots' => $chatbots ], 200 );
1081 }
1082 else if ( $method === 'POST' ) {
1083 $params = $request->get_json_params();
1084 $chatbots = $params['chatbots'];
1085 $chatbots = $this->core->update_chatbots( $chatbots );
1086 return new WP_REST_Response([ 'success' => true, 'chatbots' => $chatbots ], 200 );
1087 }
1088 return new WP_REST_Response([ 'success' => false, 'message' => 'Method not allowed' ], 405 );
1089 }
1090 catch ( Exception $e ) {
1091 $message = apply_filters( 'mwai_ai_exception', $e->getMessage() );
1092 return new WP_REST_Response([ 'success' => false, 'message' => $message ], 500 );
1093 }
1094 }
1095
1096 #region Logs
1097
1098 function rest_get_logs() {
1099 $logs = Meow_MWAI_Logging::get();
1100 return new WP_REST_Response( [ 'success' => true, 'data' => $logs ], 200 );
1101 }
1102
1103 function rest_clear_logs() {
1104 Meow_MWAI_Logging::clear();
1105 return new WP_REST_Response( [ 'success' => true ], 200 );
1106 }
1107
1108 #endregion
1109 }
1110