PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 2.1.7
AI Engine – The Chatbot, AI Framework & MCP for WordPress v2.1.7
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 / api.php
ai-engine / classes Last commit date
engines 2 years ago modules 2 years ago queries 2 years ago admin.php 2 years ago api.php 2 years ago core.php 2 years ago init.php 3 years ago reply.php 2 years ago rest.php 2 years ago
api.php
382 lines
1 <?php
2
3 class Meow_MWAI_API {
4 public $core;
5 private $chatbot_module;
6 private $discussions_module;
7
8 public function __construct( $chatbot_module, $discussions_module ) {
9 global $mwai_core;
10 $this->core = $mwai_core;
11 $this->chatbot_module = $chatbot_module;
12 $this->discussions_module = $discussions_module;
13 add_action( 'rest_api_init', array( $this, 'rest_api_init' ) );
14 }
15
16 #region REST API
17 function rest_api_init() {
18 $public_api = $this->core->get_option( 'public_api' );
19 if ( !$public_api ) {
20 return;
21 }
22
23 register_rest_route( 'mwai/v1', '/simpleAuthCheck', array(
24 'methods' => 'GET',
25 'callback' => array( $this, 'rest_simpleAuthCheck' ),
26 'permission_callback' => function( $request ) {
27 return $this->core->can_access_public_api( 'simpleAuthCheck', $request );
28 },
29 ) );
30 register_rest_route( 'mwai/v1', '/simpleTextQuery', array(
31 'methods' => 'POST',
32 'callback' => array( $this, 'rest_simpleTextQuery' ),
33 'permission_callback' => function( $request ) {
34 return $this->core->can_access_public_api( 'simpleTextQuery', $request );
35 },
36 ) );
37 register_rest_route( 'mwai/v1', '/simpleImageQuery', array(
38 'methods' => 'POST',
39 'callback' => array( $this, 'rest_simpleImageQuery' ),
40 'permission_callback' => function( $request ) {
41 return $this->core->can_access_public_api( 'simpleImageQuery', $request );
42 },
43 ) );
44 register_rest_route( 'mwai/v1', '/simpleVisionQuery', array(
45 'methods' => 'POST',
46 'callback' => array( $this, 'rest_simpleVisionQuery' ),
47 'permission_callback' => function( $request ) {
48 return $this->core->can_access_public_api( 'simpleVisionQuery', $request );
49 },
50 ) );
51 register_rest_route( 'mwai/v1', '/simpleJsonQuery', array(
52 'methods' => 'POST',
53 'callback' => array( $this, 'rest_simpleJsonQuery' ),
54 'permission_callback' => function( $request ) {
55 return $this->core->can_access_public_api( 'simpleJsonQuery', $request );
56 },
57 ) );
58 register_rest_route( 'mwai/v1', '/moderationCheck', array(
59 'methods' => 'POST',
60 'callback' => array( $this, 'rest_moderationCheck' ),
61 'permission_callback' => function( $request ) {
62 return $this->core->can_access_public_api( 'moderationCheck', $request );
63 },
64 ) );
65
66 if ( $this->chatbot_module ) {
67 register_rest_route( 'mwai/v1', '/simpleChatbotQuery', array(
68 'methods' => 'POST',
69 'callback' => array( $this, 'rest_simpleChatbotQuery' ),
70 'permission_callback' => function( $request ) {
71 return $this->core->can_access_public_api( 'simpleChatbotQuery', $request );
72 },
73 ) );
74 }
75 }
76
77 public function rest_simpleAuthCheck( $request ) {
78 try {
79 $params = $request->get_params();
80 $current_user = wp_get_current_user();
81 $current_email = $current_user->user_email;
82 return new WP_REST_Response([ 'success' => true, 'data' => [
83 'type' => 'email',
84 'value' => $current_email
85 ] ], 200 );
86 }
87 catch (Exception $e) {
88 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
89 }
90 }
91
92 public function rest_simpleChatbotQuery( $request ) {
93 try {
94 $params = $request->get_params();
95 $botId = isset( $params['botId'] ) ? $params['botId'] : '';
96 $message = isset( $params['message'] ) ? $params['message'] : '';
97 if ( empty( $message ) ) {
98 $message = isset( $params['prompt'] ) ? $params['prompt'] : '';
99 }
100 $chatId = isset( $params['chatId'] ) ? $params['chatId'] : null;
101 $params = null;
102 if ( !empty( $chatId ) ) {
103 $params = array( 'chatId' => $chatId );
104 }
105 if ( empty( $botId ) || empty( $message ) ) {
106 throw new Exception( 'The botId and message are required.' );
107 }
108 $reply = $this->simpleChatbotQuery( $botId, $message, $params );
109 return new WP_REST_Response([ 'success' => true, 'data' => $reply ], 200 );
110 }
111 catch (Exception $e) {
112 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
113 }
114 }
115
116
117 public function rest_simpleTextQuery( $request ) {
118 try {
119 $params = $request->get_params();
120 $message = isset( $params['message'] ) ? $params['message'] : '';
121 if ( empty( $message ) ) {
122 $message = isset( $params['prompt'] ) ? $params['prompt'] : '';
123 }
124 $options = isset( $params['options'] ) ? $params['options'] : [];
125 $scope = isset( $params['scope'] ) ? $params['scope'] : 'public-api';
126 if ( !empty( $scope ) ) {
127 $options['scope'] = $scope;
128 }
129 if ( empty( $message ) ) {
130 throw new Exception( 'The message is required.' );
131 }
132 $reply = $this->simpleTextQuery( $message, $options );
133 return new WP_REST_Response([ 'success' => true, 'data' => $reply ], 200 );
134 }
135 catch (Exception $e) {
136 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
137 }
138 }
139
140 public function rest_simpleImageQuery( $request ) {
141 try {
142 $params = $request->get_params();
143 $message = isset( $params['message'] ) ? $params['message'] : '';
144 if ( empty( $message ) ) {
145 $message = isset( $params['prompt'] ) ? $params['prompt'] : '';
146 }
147 $options = isset( $params['options'] ) ? $params['options'] : [];
148 $resolution = isset( $params['resolution'] ) ? $params['resolution'] : '';
149 $scope = isset( $params['scope'] ) ? $params['scope'] : 'public-api';
150 if ( !empty( $scope ) ) {
151 $options['scope'] = $scope;
152 }
153 if ( empty( $message ) ) {
154 throw new Exception( 'The message is required.' );
155 }
156 if ( !empty( $resolution ) ) {
157 $options['resolution'] = $resolution;
158 }
159 $reply = $this->simpleImageQuery( $message, $options );
160 return new WP_REST_Response([ 'success' => true, 'data' => $reply ], 200 );
161 }
162 catch (Exception $e) {
163 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
164 }
165 }
166
167 public function rest_simpleVisionQuery( $request ) {
168 try {
169 $params = $request->get_params();
170 $message = isset( $params['message'] ) ? $params['message'] : '';
171 if ( empty( $message ) ) {
172 $message = isset( $params['prompt'] ) ? $params['prompt'] : '';
173 }
174 $url = isset( $params['url'] ) ? $params['url'] : '';
175 $path = isset( $params['path'] ) ? $params['path'] : '';
176 $options = isset( $params['options'] ) ? $params['options'] : [];
177 $scope = isset( $params['scope'] ) ? $params['scope'] : 'public-api';
178 if ( !empty( $scope ) ) {
179 $options['scope'] = $scope;
180 }
181 if ( empty( $message ) ) {
182 throw new Exception( 'The message is required.' );
183 }
184 if ( empty( $url ) && empty( $path ) ) {
185 throw new Exception( 'The url or path is required.' );
186 }
187 $reply = $this->simpleVisionQuery( $message, $url, $path, $options );
188 return new WP_REST_Response([ 'success' => true, 'data' => $reply ], 200 );
189 }
190 catch (Exception $e) {
191 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
192 }
193 }
194
195 public function rest_simpleJsonQuery( $request ) {
196 try {
197 $params = $request->get_params();
198 $message = isset( $params['message'] ) ? $params['message'] : '';
199 if ( empty( $message ) ) {
200 $message = isset( $params['prompt'] ) ? $params['prompt'] : '';
201 }
202 $options = isset( $params['options'] ) ? $params['options'] : [];
203 $scope = isset( $params['scope'] ) ? $params['scope'] : 'public-api';
204 if ( !empty( $scope ) ) {
205 $options['scope'] = $scope;
206 }
207 if ( empty( $message ) ) {
208 throw new Exception( 'The message is required.' );
209 }
210 $reply = $this->simpleJsonQuery( $message, $options );
211 return new WP_REST_Response([ 'success' => true, 'data' => $reply ], 200 );
212 }
213 catch (Exception $e) {
214 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
215 }
216 }
217
218 public function rest_moderationCheck( $request ) {
219 try {
220 $params = $request->get_params();
221 $text = $params['text'];
222 $reply = $this->moderationCheck( $text );
223 return new WP_REST_Response([ 'success' => true, 'data' => $reply ], 200 );
224 }
225 catch (Exception $e) {
226 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
227 }
228 }
229 #endregion
230
231 #region Simple API
232 /**
233 * Executes a vision query.`
234 *
235 * @param string $message The prompt for the AI.
236 * @param string $url The URL of the image to analyze.
237 * @param string|null $path The path to the image file. If provided, the image data will be read from this file.
238 * @param array $params Additional parameters for the AI query.
239 *
240 * @return string The result of the AI query.
241 */
242 public function simpleVisionQuery( $message, $url, $path = null, $params = [] ) {
243 global $mwai_core;
244 $ai_vision_default_env = $this->core->get_option( 'ai_vision_default_env' );
245 $ai_vision_default_model = $this->core->get_option( 'ai_vision_default_model' );
246 if ( empty( $ai_vision_default_model ) ) {
247 $ai_vision_default_model = MWAI_FALLBACK_MODEL_VISION;
248 }
249 $query = new Meow_MWAI_Query_Text( $message );
250 if ( !empty( $ai_vision_default_env ) ) {
251 $query->set_env_id( $ai_vision_default_env );
252 }
253 if ( !empty( $ai_vision_default_model ) ) {
254 $query->set_model( $ai_vision_default_model );
255 }
256 $query->inject_params( $params );
257 $remote_upload = $this->core->get_option( 'image_remote_upload' );
258 $preferURL = $remote_upload === 'url';
259
260 if ( $preferURL && $url ) {
261 $query->set_file( $url, 'url', 'vision' );
262 }
263 else if ( !$preferURL && !empty( $path ) ) {
264 $binary = file_get_contents( $path );
265 // Check if there is an error and what
266 if ( $binary === false ) {
267 throw new Exception( 'The file could not be read.' );
268 }
269 $data = base64_encode( $binary );
270 $query->set_file( $data, 'data', 'vision' );
271 }
272 else if ( $url ) {
273 $query->set_file( $url, 'url', 'vision' );
274 }
275 else if ( !empty($path ) ) {
276 $data = base64_encode( file_get_contents( $path ) );
277 $query->set_file( $data, 'data', 'vision' );
278 }
279
280 $reply = $mwai_core->run_query( $query );
281 return $reply->result;
282 }
283
284 /**
285 * Executes a chatbot query.
286 * It will use the discussion if chatId is provided in the parameters.
287 *
288 * @param string $botId The ID of the chatbot.
289 * @param string $message The prompt for the AI.
290 * @param array $params Additional parameters for the AI query.
291 *
292 * @return string The result of the AI query.
293 */
294 public function simpleChatbotQuery( $botId, $message, $params = [] ) {
295 if ( !isset( $params['messages'] ) && isset( $params['chatId'] ) ) {
296 $discussion = $this->discussions_module->get_discussion( $botId, $params['chatId'] );
297 if ( !empty( $discussion ) ) {
298 $params['messages'] = $discussion->messages;
299 }
300 }
301 $data = $this->chatbot_module->chat_submit( $botId, $message, $params );
302 return $data['reply'];
303 }
304
305 /**
306 * Executes a text query.
307 *
308 * @param string $message The prompt for the AI.
309 * @param array $params Additional parameters for the AI query.
310 *
311 * @return string The result of the AI query.
312 */
313 public function simpleTextQuery( $message, $params = [] ) {
314 global $mwai_core;
315 $query = new Meow_MWAI_Query_Text( $message );
316 $query->inject_params( $params );
317 $reply = $mwai_core->run_query( $query );
318 return $reply->result;
319 }
320
321 public function simpleImageQuery( $message, $params = [] ) {
322 global $mwai_core;
323 $query = new Meow_MWAI_Query_Image( $message );
324 $query->inject_params( $params );
325 $reply = $mwai_core->run_query( $query );
326 return $reply->result;
327 }
328
329 /**
330 * Executes a query that will have to return a JSON result.
331 *
332 * @param string $message The prompt for the AI.
333 * @param array $params Additional parameters for the AI query.
334 *
335 * @return array The result of the AI query.
336 */
337 public function simpleJsonQuery( $message, $url = null, $path = null, $params = [] ) {
338 if ( !empty( $url ) || !empty( $path ) ) {
339 throw new Exception( 'The url and path are not supported yet by the simpleJsonQuery.' );
340 }
341 global $mwai_core;
342 $query = new Meow_MWAI_Query_Text( $message . "\nYour reply must be a formatted JSON." );
343 $query->inject_params( $params );
344 $query->set_response_format( 'json' );
345 $ai_json_default_env = $mwai_core->get_option( 'ai_json_default_env' );
346 $ai_json_default_model = $mwai_core->get_option( 'ai_json_default_model' );
347 if ( !empty( $ai_json_default_env ) ) {
348 $query->set_env_id( $ai_json_default_env );
349 }
350 if ( !empty( $ai_json_default_model ) ) {
351 $query->set_model( $ai_json_default_model );
352 }
353 else {
354 $query->set_model( MWAI_FALLBACK_MODEL_JSON );
355 }
356 $reply = $mwai_core->run_query( $query );
357 try {
358 $json = json_decode( $reply->result, true );
359 return $json;
360 }
361 catch ( Exception $e ) {
362 throw new Exception( 'The result is not a valid JSON.' );
363 }
364 }
365
366 /**
367 * Checks if a text is safe or not.
368 *
369 * @param string $text The text to check.
370 *
371 * @return bool True if the text is safe, false otherwise.
372 */
373 public function moderationCheck( $text ) {
374 global $mwai_core;
375 $openai = Meow_MWAI_Engines_Factory::get_openai( $mwai_core );
376 $res = $openai->moderate( $text );
377 if ( !empty( $res ) && !empty( $res['results'] ) ) {
378 return (bool)$res['results'][0]['flagged'];
379 }
380 }
381 #endregion
382 }