PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 1.1.8
AI Engine – The Chatbot, AI Framework & MCP for WordPress v1.1.8
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 / core.php
ai-engine / classes Last commit date
modules 3 years ago admin.php 3 years ago ai.php 3 years ago answer.php 3 years ago core.php 3 years ago init.php 3 years ago openai.php 3 years ago query.php 3 years ago queryimage.php 3 years ago querytext.php 3 years ago rest.php 3 years ago ui.php 3 years ago
core.php
399 lines
1 <?php
2
3 require_once( MWAI_PATH . '/vendor/autoload.php' );
4
5 #region Constants
6
7 // Price as of March 2023: https://openai.com/api/pricing/
8 define( 'MWAI_OPENAI_MODELS', [
9 // Base models:
10 [
11 "model" => "gpt-3.5-turbo",
12 "family" => "turbo",
13 "price" => 0.002,
14 "type" => "token",
15 "unit" => 1 / 1000,
16 "maxTokens" => 4096,
17 "mode" => "chat",
18 "finetune" => false,
19 ],
20 [
21 "model" => "text-davinci-003",
22 "family" => "davinci",
23 "price" => 0.02,
24 "type" => "token",
25 "unit" => 1 / 1000,
26 "maxTokens" => 2048,
27 "mode" => "completion",
28 "finetune" => [
29 "price" => 0.12
30 ]
31 ],
32 [
33 "model" => "text-curie-001",
34 "family" => "curie",
35 "price" => 0.002,
36 "type" => "token",
37 "unit" => 1 / 1000,
38 "maxTokens" => 2048,
39 "mode" => "completion",
40 "finetune" => [
41 "price" => 0.012
42 ]
43 ],
44 [
45 "model" => "text-babbage-001",
46 "family" => "babbage",
47 "price" => 0.0005,
48 "type" => "token",
49 "unit" => 1 / 1000,
50 "maxTokens" => 2048,
51 "mode" => "completion",
52 "finetune" => [
53 "price" => 0.0024
54 ]
55 ],
56 [
57 "model" => "text-ada-001",
58 "family" => "ada",
59 "price" => 0.0004,
60 "type" => "token",
61 "unit" => 1 / 1000,
62 "maxTokens" => 2048,
63 "mode" => "completion",
64 "finetune" => [
65 "price" => 0.0016
66 ]
67 ],
68 // Image models:
69 [
70 "model" => "dall-e",
71 "family" => "dall-e",
72 "type" => "image",
73 "unit" => 1,
74 "options" => [
75 [
76 "option" => "1024x1024",
77 "price" => 0.02
78 ],
79 [
80 "option" => "512x512",
81 "price" => 0.018
82 ],
83 [
84 "option" => "256x256",
85 "price" => 0.016
86 ]
87 ],
88 "finetune" => false,
89 ]
90 ]);
91
92 define( 'MWAI_CHATBOT_PARAMS', [
93 // UI Parameters
94 'id' => '',
95 'env' => 'chatbot',
96 'mode' => 'chat',
97 'context' => "Converse as if you were an AI assistant. Be friendly, creative.",
98 'ai_name' => "AI: ",
99 'user_name' => "User: ",
100 'guest_name' => "Guest: ",
101 'sys_name' => "System: ",
102 'start_sentence' => "Hi! How can I help you?",
103 'text_send' => 'Send',
104 'text_clear' => 'Clear',
105 'text_input_placeholder' => 'Type your message...',
106 'text_compliance' => '',
107 'max_sentences' => 15,
108 'style' => 'chatgpt',
109 'window' => false,
110 'icon_text' => '',
111 'icon_position' => 'bottom-right',
112 'fullscreen' => false,
113 // Chatbot System Parameters
114 'casually_fine_tuned' => false,
115 'content_aware' => false,
116 'prompt_ending' => null,
117 'completion_ending' => null,
118 // AI Parameters
119 'model' => 'gpt-3.5-turbo',
120 'temperature' => 0.8,
121 'max_tokens' => 1024,
122 'max_results' => 3,
123 'api_key' => null
124 ] );
125
126 define( 'MWAI_LANGUAGES', [
127 'en' => 'English',
128 'de' => 'German',
129 'fr' => 'French',
130 'es' => 'Spanish',
131 'it' => 'Italian',
132 'zh' => 'Chinese',
133 'ja' => 'Japanese',
134 'pt' => 'Portuguese',
135 //'ru' => 'Russian',
136 ] );
137
138 define ( 'MWAI_LIMITS', [
139 'enabled' => true,
140 'guests' => [
141 'credits' => 3,
142 'creditType' => 'queries',
143 'timeFrame' => 'day',
144 'isAbsolute' => false,
145 'overLimitMessage' => "You have reached the limit.",
146 ],
147 'users' => [
148 'credits' => 10,
149 'creditType' => 'price',
150 'timeFrame' => 'month',
151 'isAbsolute' => false,
152 'overLimitMessage' => "You have reached the limit.",
153 'ignoredUsers' => "administrator,editor",
154 ],
155 ] );
156
157 define( 'MWAI_OPTIONS', [
158 'module_titles' => true,
159 'module_excerpts' => true,
160 'module_woocommerce' => true,
161 'module_forms' => false,
162 'module_blocks' => false,
163 'module_playground' => true,
164 'module_generator_content' => true,
165 'module_generator_images' => true,
166 'module_moderation' => false,
167 'module_statistics' => false,
168 'module_embeddings' => false,
169 'shortcode_chat' => true,
170 'shortcode_chat_params' => MWAI_CHATBOT_PARAMS,
171 'shortcode_chat_params_override' => false,
172 'shortcode_chat_html' => true,
173 'shortcode_chat_formatting' => true,
174 'shortcode_chat_typewriter' => false,
175 'shortcode_chat_syntax_highlighting' => false,
176 'shortcode_chat_logs' => '', // 'file', 'db', 'file,db'
177 'shortcode_chat_inject' => false,
178 'shortcode_chat_styles' => [],
179 'limits' => MWAI_LIMITS,
180 'openai_apikey' => false,
181 'openai_usage' => [],
182 'openai_models' => MWAI_OPENAI_MODELS,
183 'openai_finetunes' => [],
184 'openai_finetunes_deleted' => [],
185 'pinecone' => [
186 'apikey' => false,
187 'server' => 'us-east1-gcp',
188 'indexes' => [],
189 'index' => null
190 ],
191 'extra_models' => "",
192 'debug_mode' => true,
193 'resolve_shortcodes' => false,
194 'languages' => MWAI_LANGUAGES
195 ]);
196 #endregion
197
198 class Meow_MWAI_Core
199 {
200 public $admin = null;
201 public $is_rest = false;
202 public $is_cli = false;
203 public $site_url = null;
204 public $ai = null;
205 private $option_name = 'mwai_options';
206 public $defaultChatbotParams = MWAI_CHATBOT_PARAMS;
207
208 public function __construct() {
209 $this->site_url = get_site_url();
210 $this->is_rest = MeowCommon_Helpers::is_rest();
211 $this->is_cli = defined( 'WP_CLI' ) && WP_CLI;
212 $this->ai = new Meow_MWAI_AI( $this );
213 add_action( 'plugins_loaded', array( $this, 'init' ) );
214 }
215
216 function init() {
217 if ( $this->is_rest ) {
218 new Meow_MWAI_Rest( $this );
219 }
220 if ( is_admin() ) {
221 new Meow_MWAI_Admin( $this );
222 new Meow_MWAI_Modules_Assistants( $this );
223 }
224 else {
225 //new Meow_MWAI_UI( $this );
226 if ( $this->get_option( 'shortcode_chat' ) ) {
227 new Meow_MWAI_Modules_Chatbot();
228 }
229 }
230
231 // Advanced core
232 if ( class_exists( 'MeowPro_MWAI_Core' ) ) {
233 new MeowPro_MWAI_Core( $this );
234 }
235 }
236
237 #region Helpers
238 function can_access_settings() {
239 return apply_filters( 'mwai_allow_setup', current_user_can( 'manage_options' ) );
240 }
241
242 function can_access_features() {
243 $editor_or_admin = current_user_can( 'editor' ) || current_user_can( 'administrator' );
244 return apply_filters( 'mwai_allow_usage', $editor_or_admin );
245 }
246
247 function isUrl( $url ) {
248 return strpos( $url, 'http' ) === 0 ? true : false;
249 }
250
251 // Clean the text perfectly, resolve shortcodes, etc, etc.
252 function clean_text( $rawText = "" ) {
253 $text = strip_tags( $rawText );
254 $text = strip_shortcodes( $text );
255 $text = html_entity_decode( $text );
256 $text = str_replace( array( "\r", "\n" ), "", $text );
257 $sentences = preg_split( '/(?<=[.?!])(?=[a-zA-Z ])/', $text );
258 foreach ( $sentences as $key => $sentence ) {
259 $sentences[$key] = trim( $sentence );
260 }
261 $text = implode( " ", $sentences );
262 $text = preg_replace( '/^[\pZ\pC]+|[\pZ\pC]+$/u', '', $text );
263 return $text . " ";
264 }
265
266 // Make sure there are no duplicate sentences, and keep the length under a maximum length.
267 function clean_sentences( $text, $maxLength = 1024 ) {
268 $sentences = preg_split( '/(?<=[.?!])(?=[a-zA-Z ])/', $text );
269 $hashes = array();
270 $uniqueSentences = array();
271 $length = 0;
272 foreach ( $sentences as $sentence ) {
273 $sentence = preg_replace( '/^[\pZ\pC]+|[\pZ\pC]+$/u', '', $sentence );
274 $hash = md5( $sentence );
275 if ( !in_array( $hash, $hashes ) ) {
276 if ( $length + strlen( $sentence ) > $maxLength ) {
277 continue;
278 }
279 $hashes[] = $hash;
280 $uniqueSentences[] = $sentence;
281 $length += strlen( $sentence );
282 }
283 }
284 $text = implode( " ", $uniqueSentences );
285 $text = preg_replace( '/^[\pZ\pC]+|[\pZ\pC]+$/u', '', $text );
286 return $text;
287 }
288
289 function get_text_from_postId( $postId ) {
290 $post = get_post( $postId );
291 if ( !$post ) {
292 return false;
293 }
294 $post->post_content = apply_filters( 'the_content', $post->post_content );
295 $text = $this->clean_text( $post->post_content );
296 $text = $this->clean_sentences( $text );
297 return $text;
298 }
299
300 function get_session_id() {
301 if ( isset( $_COOKIE['mwai_session_id'] ) ) {
302 return $_COOKIE['mwai_session_id'];
303 }
304 return "N/A";
305 }
306
307 // Get the UserID from the data, or from the current user
308 function get_user_id( $data = null ) {
309 if ( isset( $data ) && isset( $data['userId'] ) ) {
310 return (int)$data['userId'];
311 }
312 if ( is_user_logged_in() ) {
313 $current_user = wp_get_current_user();
314 if ( $current_user->ID > 0 ) {
315 return $current_user->ID;
316 }
317 }
318 return null;
319 }
320
321 function get_ip_address( $data = null ) {
322 if ( isset( $data ) && isset( $data['ip'] ) ) {
323 $data['ip'] = (string)$data['ip'];
324 }
325 else {
326 if ( isset( $_SERVER['REMOTE_ADDR'] ) ) {
327 $data['ip'] = $_SERVER['REMOTE_ADDR'];
328 }
329 else if ( isset( $_SERVER['HTTP_CLIENT_IP'] ) ) {
330 $data['ip'] = $_SERVER['HTTP_CLIENT_IP'];
331 }
332 else if ( isset( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
333 $data['ip'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
334 }
335 }
336 return $data['ip'];
337 }
338
339 function markdown_to_html( $content ) {
340 $Parsedown = new Parsedown();
341 $content = $Parsedown->text( $content );
342 return $content;
343 }
344 #endregion
345
346 #region Options
347 function get_all_options() {
348 $options = get_option( $this->option_name, null );
349 foreach ( MWAI_OPTIONS as $key => $value ) {
350 if ( !isset( $options[$key] ) ) {
351 $options[$key] = $value;
352 }
353 if ( $key === 'languages' ) {
354 // TODO: If we decide to make a set of options for languages, we can keep it in the settings
355 $options[$key] = MWAI_LANGUAGES;
356 $options[$key] = apply_filters( 'mwai_languages', $options[$key] );
357 }
358 }
359 $options['shortcode_chat_default_params'] = MWAI_CHATBOT_PARAMS;
360 $options['default_limits'] = MWAI_LIMITS;
361 return $options;
362 }
363
364 // Validate and keep the options clean and logical.
365 function sanitize_options() {
366 $options = $this->get_all_options();
367 $needs_update = false;
368
369 // We can sanitize our future options here, let's always remember it.
370 // Now, it is empty...
371
372 if ( $needs_update ) {
373 update_option( $this->option_name, $options, false );
374 }
375 return $options;
376 }
377
378 function update_options( $options ) {
379 if ( !update_option( $this->option_name, $options, false ) ) {
380 return false;
381 }
382 $options = $this->sanitize_options();
383 return $options;
384 }
385
386 function update_option( $option, $value ) {
387 $options = $this->get_all_options();
388 $options[$option] = $value;
389 return $this->update_options( $options );
390 }
391
392 function get_option( $option, $default = null ) {
393 $options = $this->get_all_options();
394 return $options[$option] ?? $default;
395 }
396 #endregion
397 }
398
399 ?>