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 / api.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
api.php
556 lines
1 <?php
2
3 class Meow_MWAI_API {
4 public $core;
5 private $chatbot_module;
6 private $discussions_module;
7 private $bearer_token;
8 private $debug = false;
9
10 public function __construct( $chatbot_module, $discussions_module ) {
11 global $mwai_core;
12 $this->core = $mwai_core;
13 $this->chatbot_module = $chatbot_module;
14 $this->discussions_module = $discussions_module;
15 add_action( 'rest_api_init', [ $this, 'rest_api_init' ] );
16 $this->debug = $this->core->get_option( 'server_debug_mode' );
17 }
18
19 #region REST API
20 function rest_api_init() {
21 $public_api = $this->core->get_option( 'public_api' );
22 if ( !$public_api ) { return; }
23 $this->bearer_token = $this->core->get_option( 'public_api_bearer_token' );
24 if ( !empty( $this->bearer_token ) ) {
25 add_filter( 'mwai_allow_public_api', [ $this, 'auth_via_bearer_token' ], 10, 3 );
26 }
27
28 register_rest_route( 'mwai/v1', '/simpleAuthCheck', array(
29 'methods' => 'GET',
30 'callback' => array( $this, 'rest_simpleAuthCheck' ),
31 'permission_callback' => function( $request ) {
32 return $this->core->can_access_public_api( 'simpleAuthCheck', $request );
33 },
34 ) );
35 register_rest_route( 'mwai/v1', '/simpleTextQuery', array(
36 'methods' => 'POST',
37 'callback' => array( $this, 'rest_simpleTextQuery' ),
38 'permission_callback' => function( $request ) {
39 return $this->core->can_access_public_api( 'simpleTextQuery', $request );
40 },
41 ) );
42 register_rest_route( 'mwai/v1', '/simpleImageQuery', array(
43 'methods' => 'POST',
44 'callback' => array( $this, 'rest_simpleImageQuery' ),
45 'permission_callback' => function( $request ) {
46 return $this->core->can_access_public_api( 'simpleImageQuery', $request );
47 },
48 ) );
49 register_rest_route( 'mwai/v1', '/simpleImageEditQuery', array(
50 'methods' => 'POST',
51 'callback' => array( $this, 'rest_simpleImageEditQuery' ),
52 'permission_callback' => function( $request ) {
53 return $this->core->can_access_public_api( 'simpleImageEditQuery', $request );
54 },
55 ) );
56 register_rest_route( 'mwai/v1', '/simpleVisionQuery', array(
57 'methods' => 'POST',
58 'callback' => array( $this, 'rest_simpleVisionQuery' ),
59 'permission_callback' => function( $request ) {
60 return $this->core->can_access_public_api( 'simpleVisionQuery', $request );
61 },
62 ) );
63 register_rest_route( 'mwai/v1', '/simpleJsonQuery', array(
64 'methods' => 'POST',
65 'callback' => array( $this, 'rest_simpleJsonQuery' ),
66 'permission_callback' => function( $request ) {
67 return $this->core->can_access_public_api( 'simpleJsonQuery', $request );
68 },
69 ) );
70 register_rest_route( 'mwai/v1', '/moderationCheck', array(
71 'methods' => 'POST',
72 'callback' => array( $this, 'rest_moderationCheck' ),
73 'permission_callback' => function( $request ) {
74 return $this->core->can_access_public_api( 'moderationCheck', $request );
75 },
76 ) );
77
78 if ( $this->chatbot_module ) {
79 register_rest_route( 'mwai/v1', '/simpleChatbotQuery', array(
80 'methods' => 'POST',
81 'callback' => array( $this, 'rest_simpleChatbotQuery' ),
82 'permission_callback' => function( $request ) {
83 return $this->core->can_access_public_api( 'simpleChatbotQuery', $request );
84 },
85 ) );
86 }
87 }
88
89 public function rest_simpleAuthCheck( $request ) {
90 try {
91 $params = $request->get_params();
92 $current_user = wp_get_current_user();
93 $current_email = $current_user->user_email;
94 return new WP_REST_Response([ 'success' => true, 'data' => [
95 'type' => 'email',
96 'value' => $current_email
97 ] ], 200 );
98 }
99 catch (Exception $e) {
100 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
101 }
102 }
103
104 public function auth_via_bearer_token( $allow, $feature, $extra ) {
105 if ( !empty( $extra ) && !empty( $extra->get_header( 'Authorization' ) ) ) {
106 $token = $extra->get_header( 'Authorization' );
107 $token = str_replace( 'Bearer ', '', $token );
108 if ( $token === $this->bearer_token ) {
109 // We set the current user to the first admin.
110 $admin = $this->core->get_admin_user();
111 wp_set_current_user( $admin->ID, $admin->user_login );
112 return true;
113 }
114 }
115 return $allow;
116 }
117
118 public function rest_simpleChatbotQuery( $request ) {
119 try {
120 $params = $request->get_params();
121 $botId = isset( $params['botId'] ) ? $params['botId'] : '';
122 $message = isset( $params['message'] ) ? $params['message'] : '';
123 if ( empty( $message ) ) {
124 $message = isset( $params['prompt'] ) ? $params['prompt'] : '';
125 }
126 $chatId = isset( $params['chatId'] ) ? $params['chatId'] : null;
127 $params = null;
128 if ( !empty( $chatId ) ) {
129 $params = array( 'chatId' => $chatId );
130 }
131 if ( empty( $botId ) || empty( $message ) ) {
132 throw new Exception( 'The botId and message are required.' );
133 }
134
135 if ( $this->debug ) {
136 $shortMessage = Meow_MWAI_Logging::shorten( $message, 64 );
137 $debug = sprintf( 'REST [SimpleChatbotQuery]: %s, %s', $shortMessage, json_encode( $params ) );
138 Meow_MWAI_Logging::log( $debug );
139 }
140
141 $reply = $this->simpleChatbotQuery( $botId, $message, $params, false );
142 return new WP_REST_Response([
143 'success' => true,
144 'data' => $reply['reply'],
145 'extra' => [
146 'actions' => $reply['actions'],
147 'chatId' => $reply['chatId']
148 ]
149 ], 200 );
150 }
151 catch (Exception $e) {
152 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
153 }
154 }
155
156
157 public function rest_simpleTextQuery( $request ) {
158 try {
159 $params = $request->get_params();
160 $message = isset( $params['message'] ) ? $params['message'] : '';
161 if ( empty( $message ) ) {
162 $message = isset( $params['prompt'] ) ? $params['prompt'] : '';
163 }
164 $options = isset( $params['options'] ) ? $params['options'] : [];
165 $scope = isset( $params['scope'] ) ? $params['scope'] : 'public-api';
166 if ( !empty( $scope ) ) {
167 $options['scope'] = $scope;
168 }
169 if ( empty( $message ) ) {
170 throw new Exception( 'The message is required.' );
171 }
172
173 if ( $this->debug ) {
174 $shortMessage = Meow_MWAI_Logging::shorten( $message, 64 );
175 $debug = sprintf( 'REST [SimpleTextQuery]: %s, %s', $shortMessage, json_encode( $options ) );
176 Meow_MWAI_Logging::log( $debug );
177 }
178
179 $reply = $this->simpleTextQuery( $message, $options );
180 return new WP_REST_Response([ 'success' => true, 'data' => $reply ], 200 );
181 }
182 catch (Exception $e) {
183 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
184 }
185 }
186
187 public function rest_simpleImageQuery( $request ) {
188 try {
189 $params = $request->get_params();
190 $message = isset( $params['message'] ) ? $params['message'] : '';
191 if ( empty( $message ) ) {
192 $message = isset( $params['prompt'] ) ? $params['prompt'] : '';
193 }
194 $options = isset( $params['options'] ) ? $params['options'] : [];
195 $resolution = isset( $params['resolution'] ) ? $params['resolution'] : '';
196 $scope = isset( $params['scope'] ) ? $params['scope'] : 'public-api';
197 if ( !empty( $scope ) ) {
198 $options['scope'] = $scope;
199 }
200 if ( empty( $message ) ) {
201 throw new Exception( 'The message is required.' );
202 }
203 if ( !empty( $resolution ) ) {
204 $options['resolution'] = $resolution;
205 }
206
207 if ( $this->debug ) {
208 $shortMessage = Meow_MWAI_Logging::shorten( $message, 64 );
209 $debug = sprintf( 'REST [SimpleImageQuery]: %s, %s', $shortMessage, json_encode( $options ) );
210 Meow_MWAI_Logging::log( $debug );
211 }
212
213 $reply = $this->simpleImageQuery( $message, $options );
214 return new WP_REST_Response([ 'success' => true, 'data' => $reply ], 200 );
215 }
216 catch (Exception $e) {
217 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
218 }
219 }
220
221 public function rest_simpleImageEditQuery( $request ) {
222 try {
223 $params = $request->get_params();
224 $message = isset( $params['message'] ) ? $params['message'] : '';
225 if ( empty( $message ) ) {
226 $message = isset( $params['prompt'] ) ? $params['prompt'] : '';
227 }
228 $mediaId = isset( $params['mediaId'] ) ? intval( $params['mediaId'] ) : 0;
229 $options = isset( $params['options'] ) ? $params['options'] : [];
230 $resolution = isset( $params['resolution'] ) ? $params['resolution'] : '';
231 $scope = isset( $params['scope'] ) ? $params['scope'] : 'public-api';
232 if ( !empty( $scope ) ) {
233 $options['scope'] = $scope;
234 }
235 if ( empty( $message ) ) {
236 throw new Exception( 'The message is required.' );
237 }
238 if ( empty( $mediaId ) ) {
239 throw new Exception( 'The mediaId is required.' );
240 }
241 if ( !empty( $resolution ) ) {
242 $options['resolution'] = $resolution;
243 }
244
245 if ( $this->debug ) {
246 $shortMessage = Meow_MWAI_Logging::shorten( $message, 64 );
247 $debug = sprintf( 'REST [SimpleImageEditQuery]: %s, %s', $shortMessage, json_encode( $options ) );
248 Meow_MWAI_Logging::log( $debug );
249 }
250
251 $reply = $this->simpleImageEditQuery( $message, $mediaId, $options );
252 return new WP_REST_Response([ 'success' => true, 'data' => $reply ], 200 );
253 }
254 catch (Exception $e) {
255 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
256 }
257 }
258
259 public function rest_simpleVisionQuery( $request ) {
260 try {
261 $params = $request->get_params();
262 $message = isset( $params['message'] ) ? $params['message'] : '';
263 if ( empty( $message ) ) {
264 $message = isset( $params['prompt'] ) ? $params['prompt'] : '';
265 }
266 $url = isset( $params['url'] ) ? $params['url'] : '';
267 $options = isset( $params['options'] ) ? $params['options'] : [];
268 $scope = isset( $params['scope'] ) ? $params['scope'] : 'public-api';
269 if ( !empty( $scope ) ) {
270 $options['scope'] = $scope;
271 }
272 if ( empty( $message ) ) {
273 throw new Exception( 'The message is required.' );
274 }
275 if ( empty( $url ) ) {
276 throw new Exception( 'The url is required.' );
277 }
278
279 if ( $this->debug ) {
280 $shortMessage = Meow_MWAI_Logging::shorten( $message, 64 );
281 $debug = sprintf( 'REST [SimpleVisionQuery]: %s, %s', $shortMessage, json_encode( $options ) );
282 Meow_MWAI_Logging::log( $debug );
283 }
284
285 $reply = $this->simpleVisionQuery( $message, $url, null, $options );
286 return new WP_REST_Response([ 'success' => true, 'data' => $reply ], 200 );
287 }
288 catch (Exception $e) {
289 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
290 }
291 }
292
293 public function rest_simpleJsonQuery( $request ) {
294 try {
295 $params = $request->get_params();
296 $message = isset( $params['message'] ) ? $params['message'] : '';
297 if ( empty( $message ) ) {
298 $message = isset( $params['prompt'] ) ? $params['prompt'] : '';
299 }
300 $options = isset( $params['options'] ) ? $params['options'] : [];
301 $scope = isset( $params['scope'] ) ? $params['scope'] : 'public-api';
302 if ( !empty( $scope ) ) {
303 $options['scope'] = $scope;
304 }
305 if ( empty( $message ) ) {
306 throw new Exception( 'The message is required.' );
307 }
308
309 if ( $this->debug ) {
310 $shortMessage = Meow_MWAI_Logging::shorten( $message, 64 );
311 $debug = sprintf( 'REST [SimpleJsonQuery]: %s, %s', $shortMessage, json_encode( $options ) );
312 Meow_MWAI_Logging::log( $debug );
313 }
314
315 $reply = $this->simpleJsonQuery( $message, $options );
316 return new WP_REST_Response([ 'success' => true, 'data' => $reply ], 200 );
317 }
318 catch (Exception $e) {
319 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
320 }
321 }
322
323 public function rest_moderationCheck( $request ) {
324 try {
325 $params = $request->get_params();
326 $text = $params['text'];
327 if ( empty( $text ) ) {
328 throw new Exception( 'The text is required.' );
329 }
330
331 if ( $this->debug ) {
332 $shortText = Meow_MWAI_Logging::shorten( $text, 64 );
333 $debug = sprintf( 'REST [ModerationCheck]: %s', $shortText );
334 Meow_MWAI_Logging::log( $debug );
335 }
336
337 $reply = $this->moderationCheck( $text );
338 return new WP_REST_Response([ 'success' => true, 'data' => $reply ], 200 );
339 }
340 catch (Exception $e) {
341 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
342 }
343 }
344 #endregion
345
346 #region Simple API
347 /**
348 * Executes a vision query.`
349 *
350 * @param string $message The prompt for the AI.
351 * @param string $url The URL of the image to analyze.
352 * @param string|null $path The path to the image file. If provided, the image data will be read from this file.
353 * @param array $params Additional parameters for the AI query.
354 *
355 * @return string The result of the AI query.
356 */
357 public function simpleVisionQuery( $message, $url, $path = null, $params = [] ) {
358 global $mwai_core;
359 $ai_vision_default_env = $this->core->get_option( 'ai_vision_default_env' );
360 $ai_vision_default_model = $this->core->get_option( 'ai_vision_default_model' );
361 if ( empty( $ai_vision_default_model ) ) {
362 $ai_vision_default_model = MWAI_FALLBACK_MODEL_VISION;
363 }
364 $query = new Meow_MWAI_Query_Text( $message );
365 if ( !empty( $ai_vision_default_env ) ) {
366 $query->set_env_id( $ai_vision_default_env );
367 }
368 if ( !empty( $ai_vision_default_model ) ) {
369 $query->set_model( $ai_vision_default_model );
370 }
371 $query->inject_params( $params );
372 if ( isset( $params['image_remote_upload'] ) ) {
373 $query->image_remote_upload = $params['image_remote_upload'];
374 }
375 if ( !empty( $url ) ) {
376 $query->set_file( Meow_MWAI_Query_DroppedFile::from_url( $url, 'vision' ) );
377 }
378 else if ( !empty( $path ) ) {
379 $query->set_file( Meow_MWAI_Query_DroppedFile::from_path( $path, 'vision' ) );
380 }
381 $reply = $mwai_core->run_query( $query );
382 return $reply->result;
383 }
384
385 /**
386 * Executes a chatbot query.
387 * It will use the discussion if chatId is provided in the parameters.
388 *
389 * @param string $botId The ID of the chatbot.
390 * @param string $message The prompt for the AI.
391 * @param array $params Additional parameters for the AI query.
392 *
393 * @return string The result of the AI query.
394 */
395 public function simpleChatbotQuery( $botId, $message, $params = [], $onlyReply = true ) {
396 if ( !isset( $params['messages'] ) && isset( $params['chatId'] ) ) {
397 if ( $this->core->get_option( 'chatbot_discussions' ) ) {
398 $discussion = $this->discussions_module->get_discussion( $botId, $params['chatId'] );
399 if ( !empty( $discussion ) ) {
400 $params['messages'] = $discussion['messages'];
401 }
402 }
403 else {
404 $this->core->log( 'The chatId was provided; but the discussions are not enabled.' );
405 }
406 }
407 $data = $this->chatbot_module->chat_submit( $botId, $message, null, $params );
408 return $onlyReply ? $data['reply'] : $data;
409 }
410
411 /**
412 * Executes a text query.
413 *
414 * @param string $message The prompt for the AI.
415 * @param array $params Additional parameters for the AI query.
416 *
417 * @return string The result of the AI query.
418 */
419 public function simpleTextQuery( $message, $params = [] ) {
420 global $mwai_core;
421 $query = new Meow_MWAI_Query_Text( $message );
422 $query->inject_params( $params );
423 $reply = $mwai_core->run_query( $query );
424 return $reply->result;
425 }
426
427 public function simpleImageQuery( $message, $params = [] ) {
428 global $mwai_core;
429 $query = new Meow_MWAI_Query_Image( $message );
430 $query->inject_params( $params );
431 $reply = $mwai_core->run_query( $query );
432 return $reply->result;
433 }
434
435 public function simpleImageEditQuery( $message, $mediaId, $params = [] ) {
436 global $mwai_core;
437 $query = new Meow_MWAI_Query_EditImage( $message );
438 $query->inject_params( $params );
439 $path = get_attached_file( $mediaId );
440 if ( empty( $path ) ) {
441 throw new Exception( 'The media cannot be found.' );
442 }
443 // TODO: Maybe 'vision' should be 'edit'.
444 $query->set_file( Meow_MWAI_Query_DroppedFile::from_path( $path, 'vision' ) );
445 $reply = $mwai_core->run_query( $query );
446 return $reply->result;
447 }
448
449 /**
450 * Generates an image relevant to the text.
451 */
452 public function imageQueryForMediaLibrary( $message, $params = [], $postId = null ) {
453 $query = new Meow_MWAI_Query_Image( $message );
454 $query->inject_params( $params );
455 $query->set_local_download( null );
456 $reply = $this->core->run_query( $query );
457 preg_match( '/\!\[Image\]\((.*?)\)/', $reply->result, $matches );
458 $url = $matches[1] ?? $reply->result;
459 $attachmentId = $this->core->add_image_from_url( $url, null, null, null, null, null, $postId );
460 if ( empty( $attachmentId ) ) {
461 throw new Exception( 'Could not add the image to the Media Library.' );
462 }
463 // TODO: We should create a nice title, caption, and alt.
464 $media = [
465 'id' => $attachmentId,
466 'url' => wp_get_attachment_url( $attachmentId ),
467 'title' => get_the_title( $attachmentId ),
468 'caption' => wp_get_attachment_caption( $attachmentId ),
469 'alt' => get_post_meta( $attachmentId, '_wp_attachment_image_alt', true )
470 ];
471 return $media;
472 }
473
474 /**
475 * Executes a query that will have to return a JSON result.
476 *
477 * @param string $message The prompt for the AI.
478 * @param array $params Additional parameters for the AI query.
479 *
480 * @return array The result of the AI query.
481 */
482 public function simpleJsonQuery( $message, $url = null, $path = null, $params = [] ) {
483 if ( !empty( $url ) || !empty( $path ) ) {
484 throw new Exception( 'The url and path are not supported yet by the simpleJsonQuery.' );
485 }
486 global $mwai_core;
487 $query = new Meow_MWAI_Query_Text( $message . "\nYour reply must be a formatted JSON." );
488 $query->inject_params( $params );
489 $query->set_response_format( 'json' );
490 $ai_json_default_env = $mwai_core->get_option( 'ai_json_default_env' );
491 $ai_json_default_model = $mwai_core->get_option( 'ai_json_default_model' );
492 if ( !empty( $ai_json_default_env ) ) {
493 $query->set_env_id( $ai_json_default_env );
494 }
495 if ( !empty( $ai_json_default_model ) ) {
496 $query->set_model( $ai_json_default_model );
497 }
498 else {
499 $query->set_model( MWAI_FALLBACK_MODEL_JSON );
500 }
501 $reply = $mwai_core->run_query( $query );
502 try {
503 $json = json_decode( $reply->result, true );
504 return $json;
505 }
506 catch ( Exception $e ) {
507 throw new Exception( 'The result is not a valid JSON.' );
508 }
509 }
510 #endregion
511
512 #region Standard API
513 /**
514 * Checks if a text is safe or not.
515 *
516 * @param string $text The text to check.
517 *
518 * @return bool True if the text is safe, false otherwise.
519 */
520 public function moderationCheck( $text ) {
521 global $mwai_core;
522 $openai = Meow_MWAI_Engines_Factory::get_openai( $mwai_core );
523 $res = $openai->moderate( $text );
524 if ( !empty( $res ) && !empty( $res['results'] ) ) {
525 return (bool)$res['results'][0]['flagged'];
526 }
527 }
528 #endregion
529
530 #region Standard API (No REST API)
531
532 /**
533 * Checks the status of the AI environments.
534 *
535 * @return array The types of environments that are available.
536 */
537 public function checkStatus() {
538 $env_types = [];
539 $ai_envs = $this->core->get_option( 'ai_envs' );
540 if ( empty( $ai_envs ) ) {
541 throw new Exception( 'There are no AI environments yet.' );
542 }
543 foreach ( $ai_envs as $env ) {
544 if ( !empty( $env['apikey'] ) ) {
545 if ( !in_array( $env['type'], $env_types ) ) {
546 $env_types[] = $env['type'];
547 }
548 }
549 }
550 if ( empty( $env_types ) ) {
551 throw new Exception( 'There are no AI environments with an API key yet.' );
552 }
553 return $env_types;
554 }
555 #endregion
556 }