PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 2.1.5
AI Engine – The Chatbot, AI Framework & MCP for WordPress v2.1.5
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
304 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 register_rest_route( 'mwai/v1', '/simpleTextQuery', array(
23 'methods' => 'POST',
24 'callback' => array( $this, 'rest_simpleTextQuery' ),
25 'permission_callback' => function( $request ) {
26 return $this->core->can_access_public_api( 'simpleTextQuery', $request );
27 },
28 ) );
29 register_rest_route( 'mwai/v1', '/simpleVisionQuery', array(
30 'methods' => 'POST',
31 'callback' => array( $this, 'rest_simpleVisionQuery' ),
32 'permission_callback' => function( $request ) {
33 return $this->core->can_access_public_api( 'simpleVisionQuery', $request );
34 },
35 ) );
36 register_rest_route( 'mwai/v1', '/simpleJsonQuery', array(
37 'methods' => 'POST',
38 'callback' => array( $this, 'rest_simpleJsonQuery' ),
39 'permission_callback' => function( $request ) {
40 return $this->core->can_access_public_api( 'simpleJsonQuery', $request );
41 },
42 ) );
43 register_rest_route( 'mwai/v1', '/moderationCheck', array(
44 'methods' => 'POST',
45 'callback' => array( $this, 'rest_moderationCheck' ),
46 'permission_callback' => function( $request ) {
47 return $this->core->can_access_public_api( 'moderationCheck', $request );
48 },
49 ) );
50
51 if ( $this->chatbot_module ) {
52 register_rest_route( 'mwai/v1', '/simpleChatbotQuery', array(
53 'methods' => 'POST',
54 'callback' => array( $this, 'rest_simpleChatbotQuery' ),
55 'permission_callback' => function( $request ) {
56 return $this->core->can_access_public_api( 'simpleChatbotQuery', $request );
57 },
58 ) );
59 }
60 }
61
62 public function rest_simpleChatbotQuery( $request ) {
63 try {
64 $params = $request->get_params();
65 $botId = isset( $params['botId'] ) ? $params['botId'] : '';
66 $message = isset( $params['prompt'] ) ? $params['prompt'] : '';
67 $chatId = isset( $params['chatId'] ) ? $params['chatId'] : null;
68 $params = null;
69 if ( !empty( $chatId ) ) {
70 $params = array( 'chatId' => $chatId );
71 }
72 if ( empty( $botId ) || empty( $message ) ) {
73 throw new Exception( 'The botId and prompt are required.' );
74 }
75 $reply = $this->simpleChatbotQuery( $botId, $message, $params );
76 return new WP_REST_Response([ 'success' => true, 'data' => $reply ], 200 );
77 }
78 catch (Exception $e) {
79 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
80 }
81 }
82
83 public function rest_simpleTextQuery( $request ) {
84 try {
85 $params = $request->get_params();
86 $message = isset( $params['prompt'] ) ? $params['prompt'] : '';
87 $options = isset( $params['options'] ) ? $params['options'] : [];
88 $scope = isset( $params['scope'] ) ? $params['scope'] : 'public-api';
89 if ( !empty( $scope ) ) {
90 $options['scope'] = $scope;
91 }
92 if ( empty( $message ) ) {
93 throw new Exception( 'The prompt is required.' );
94 }
95 $reply = $this->simpleTextQuery( $message, $options );
96 return new WP_REST_Response([ 'success' => true, 'data' => $reply ], 200 );
97 }
98 catch (Exception $e) {
99 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
100 }
101 }
102
103 public function rest_simpleVisionQuery( $request ) {
104 try {
105 $params = $request->get_params();
106 $message = isset( $params['prompt'] ) ? $params['prompt'] : '';
107 $url = isset( $params['url'] ) ? $params['url'] : '';
108 $path = isset( $params['path'] ) ? $params['path'] : '';
109 $options = isset( $params['options'] ) ? $params['options'] : [];
110 $scope = isset( $params['scope'] ) ? $params['scope'] : 'public-api';
111 if ( !empty( $scope ) ) {
112 $options['scope'] = $scope;
113 }
114 if ( empty( $message ) ) {
115 throw new Exception( 'The prompt is required.' );
116 }
117 if ( empty( $url ) && empty( $path ) ) {
118 throw new Exception( 'The url or path is required.' );
119 }
120 $reply = $this->simpleVisionQuery( $message, $url, $path, $options );
121 return new WP_REST_Response([ 'success' => true, 'data' => $reply ], 200 );
122 }
123 catch (Exception $e) {
124 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
125 }
126 }
127
128 public function rest_simpleJsonQuery( $request ) {
129 try {
130 $params = $request->get_params();
131 $message = isset( $params['prompt'] ) ? $params['prompt'] : '';
132 $options = isset( $params['options'] ) ? $params['options'] : [];
133 $scope = isset( $params['scope'] ) ? $params['scope'] : 'public-api';
134 if ( !empty( $scope ) ) {
135 $options['scope'] = $scope;
136 }
137 if ( empty( $message ) ) {
138 throw new Exception( 'The prompt is required.' );
139 }
140 $reply = $this->simpleJsonQuery( $message, $options );
141 return new WP_REST_Response([ 'success' => true, 'data' => $reply ], 200 );
142 }
143 catch (Exception $e) {
144 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
145 }
146 }
147
148 public function rest_moderationCheck( $request ) {
149 try {
150 $params = $request->get_params();
151 $text = $params['text'];
152 $reply = $this->moderationCheck( $text );
153 return new WP_REST_Response([ 'success' => true, 'data' => $reply ], 200 );
154 }
155 catch (Exception $e) {
156 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
157 }
158 }
159 #endregion
160
161 #region Simple API
162 /**
163 * Executes a vision query.`
164 *
165 * @param string $message The prompt for the AI.
166 * @param string $url The URL of the image to analyze.
167 * @param string|null $path The path to the image file. If provided, the image data will be read from this file.
168 * @param array $params Additional parameters for the AI query.
169 *
170 * @return string The result of the AI query.
171 */
172 public function simpleVisionQuery( $message, $url, $path = null, $params = [] ) {
173 global $mwai_core;
174 $ai_vision_default_env = $this->core->get_option( 'ai_vision_default_env' );
175 $ai_vision_default_model = $this->core->get_option( 'ai_vision_default_model' );
176 if ( empty( $ai_vision_default_model ) ) {
177 $ai_vision_default_model = MWAI_FALLBACK_MODEL_VISION;
178 }
179 $query = new Meow_MWAI_Query_Text( $message );
180 if ( !empty( $ai_vision_default_env ) ) {
181 $query->set_env_id( $ai_vision_default_env );
182 }
183 if ( !empty( $ai_vision_default_model ) ) {
184 $query->set_model( $ai_vision_default_model );
185 }
186 $query->inject_params( $params );
187 $remote_upload = $this->core->get_option( 'image_remote_upload' );
188 $preferURL = $remote_upload === 'url';
189
190 if ( $preferURL && $url ) {
191 $query->set_file( $url, 'url', 'vision' );
192 }
193 else if ( !$preferURL && !empty( $path ) ) {
194 $binary = file_get_contents( $path );
195 // Check if there is an error and what
196 if ( $binary === false ) {
197 throw new Exception( 'The file could not be read.' );
198 }
199 $data = base64_encode( $binary );
200 $query->set_file( $data, 'data', 'vision' );
201 }
202 else if ( $url ) {
203 $query->set_file( $url, 'url', 'vision' );
204 }
205 else if ( !empty($path ) ) {
206 $data = base64_encode( file_get_contents( $path ) );
207 $query->set_file( $data, 'data', 'vision' );
208 }
209
210 $reply = $mwai_core->run_query( $query );
211 return $reply->result;
212 }
213
214 /**
215 * Executes a chatbot query.
216 * It will use the discussion if chatId is provided in the parameters.
217 *
218 * @param string $botId The ID of the chatbot.
219 * @param string $message The prompt for the AI.
220 * @param array $params Additional parameters for the AI query.
221 *
222 * @return string The result of the AI query.
223 */
224 public function simpleChatbotQuery( $botId, $message, $params = [] ) {
225 if ( !isset( $params['messages'] ) && isset( $params['chatId'] ) ) {
226 $discussion = $this->discussions_module->get_discussion( $botId, $params['chatId'] );
227 if ( !empty( $discussion ) ) {
228 $params['messages'] = $discussion->messages;
229 }
230 }
231 $data = $this->chatbot_module->chat_submit( $botId, $message, $params );
232 return $data['reply'];
233 }
234
235 /**
236 * Executes a text query.
237 *
238 * @param string $message The prompt for the AI.
239 * @param array $params Additional parameters for the AI query.
240 *
241 * @return string The result of the AI query.
242 */
243 public function simpleTextQuery( $message, $params = [] ) {
244 global $mwai_core;
245 $query = new Meow_MWAI_Query_Text( $message );
246 $query->inject_params( $params );
247 $reply = $mwai_core->run_query( $query );
248 return $reply->result;
249 }
250
251 /**
252 * Executes a query that will have to return a JSON result.
253 *
254 * @param string $message The prompt for the AI.
255 * @param array $params Additional parameters for the AI query.
256 *
257 * @return array The result of the AI query.
258 */
259 public function simpleJsonQuery( $message, $url = null, $path = null, $params = [] ) {
260 if ( !empty( $url ) || !empty( $path ) ) {
261 throw new Exception( 'The url and path are not supported yet by the simpleJsonQuery.' );
262 }
263 global $mwai_core;
264 $query = new Meow_MWAI_Query_Text( $message . "\nYour reply must be a formatted JSON." );
265 $query->inject_params( $params );
266 $query->set_response_format( 'json' );
267 $ai_json_default_env = $mwai_core->get_option( 'ai_json_default_env' );
268 $ai_json_default_model = $mwai_core->get_option( 'ai_json_default_model' );
269 if ( !empty( $ai_json_default_env ) ) {
270 $query->set_env_id( $ai_json_default_env );
271 }
272 if ( !empty( $ai_json_default_model ) ) {
273 $query->set_model( $ai_json_default_model );
274 }
275 else {
276 $query->set_model( MWAI_FALLBACK_MODEL_JSON );
277 }
278 $reply = $mwai_core->run_query( $query );
279 try {
280 $json = json_decode( $reply->result, true );
281 return $json;
282 }
283 catch ( Exception $e ) {
284 throw new Exception( 'The result is not a valid JSON.' );
285 }
286 }
287
288 /**
289 * Checks if a text is safe or not.
290 *
291 * @param string $text The text to check.
292 *
293 * @return bool True if the text is safe, false otherwise.
294 */
295 public function moderationCheck( $text ) {
296 global $mwai_core;
297 $openai = Meow_MWAI_Engines_Factory::get_openai( $mwai_core );
298 $res = $openai->moderate( $text );
299 if ( !empty( $res ) && !empty( $res['results'] ) ) {
300 return (bool)$res['results'][0]['flagged'];
301 }
302 }
303 #endregion
304 }