PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 1.1.7
AI Engine – The Chatbot, AI Framework & MCP for WordPress v1.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 / 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
396 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 ],
188 'extra_models' => "",
189 'debug_mode' => true,
190 'resolve_shortcodes' => false,
191 'languages' => MWAI_LANGUAGES
192 ]);
193 #endregion
194
195 class Meow_MWAI_Core
196 {
197 public $admin = null;
198 public $is_rest = false;
199 public $is_cli = false;
200 public $site_url = null;
201 public $ai = null;
202 private $option_name = 'mwai_options';
203 public $defaultChatbotParams = MWAI_CHATBOT_PARAMS;
204
205 public function __construct() {
206 $this->site_url = get_site_url();
207 $this->is_rest = MeowCommon_Helpers::is_rest();
208 $this->is_cli = defined( 'WP_CLI' ) && WP_CLI;
209 $this->ai = new Meow_MWAI_AI( $this );
210 add_action( 'plugins_loaded', array( $this, 'init' ) );
211 }
212
213 function init() {
214 if ( $this->is_rest ) {
215 new Meow_MWAI_Rest( $this );
216 }
217 if ( is_admin() ) {
218 new Meow_MWAI_Admin( $this );
219 new Meow_MWAI_Modules_Assistants( $this );
220 }
221 else {
222 //new Meow_MWAI_UI( $this );
223 if ( $this->get_option( 'shortcode_chat' ) ) {
224 new Meow_MWAI_Modules_Chatbot();
225 }
226 }
227
228 // Advanced core
229 if ( class_exists( 'MeowPro_MWAI_Core' ) ) {
230 new MeowPro_MWAI_Core( $this );
231 }
232 }
233
234 #region Helpers
235 function can_access_settings() {
236 return apply_filters( 'mwai_allow_setup', current_user_can( 'manage_options' ) );
237 }
238
239 function can_access_features() {
240 $editor_or_admin = current_user_can( 'editor' ) || current_user_can( 'administrator' );
241 return apply_filters( 'mwai_allow_usage', $editor_or_admin );
242 }
243
244 function isUrl( $url ) {
245 return strpos( $url, 'http' ) === 0 ? true : false;
246 }
247
248 // Clean the text perfectly, resolve shortcodes, etc, etc.
249 function clean_text( $rawText = "" ) {
250 $text = strip_tags( $rawText );
251 $text = strip_shortcodes( $text );
252 $text = html_entity_decode( $text );
253 $text = str_replace( array( "\r", "\n" ), "", $text );
254 $sentences = preg_split( '/(?<=[.?!])(?=[a-zA-Z ])/', $text );
255 foreach ( $sentences as $key => $sentence ) {
256 $sentences[$key] = trim( $sentence );
257 }
258 $text = implode( " ", $sentences );
259 $text = preg_replace( '/^[\pZ\pC]+|[\pZ\pC]+$/u', '', $text );
260 return $text . " ";
261 }
262
263 // Make sure there are no duplicate sentences, and keep the length under a maximum length.
264 function clean_sentences( $text, $maxLength = 1024 ) {
265 $sentences = preg_split( '/(?<=[.?!])(?=[a-zA-Z ])/', $text );
266 $hashes = array();
267 $uniqueSentences = array();
268 $length = 0;
269 foreach ( $sentences as $sentence ) {
270 $sentence = preg_replace( '/^[\pZ\pC]+|[\pZ\pC]+$/u', '', $sentence );
271 $hash = md5( $sentence );
272 if ( !in_array( $hash, $hashes ) ) {
273 if ( $length + strlen( $sentence ) > $maxLength ) {
274 continue;
275 }
276 $hashes[] = $hash;
277 $uniqueSentences[] = $sentence;
278 $length += strlen( $sentence );
279 }
280 }
281 $text = implode( " ", $uniqueSentences );
282 $text = preg_replace( '/^[\pZ\pC]+|[\pZ\pC]+$/u', '', $text );
283 return $text;
284 }
285
286 function get_text_from_postId( $postId ) {
287 $post = get_post( $postId );
288 if ( !$post ) {
289 return false;
290 }
291 $post->post_content = apply_filters( 'the_content', $post->post_content );
292 $text = $this->clean_text( $post->post_content );
293 $text = $this->clean_sentences( $text );
294 return $text;
295 }
296
297 function get_session_id() {
298 if ( isset( $_COOKIE['mwai_session_id'] ) ) {
299 return $_COOKIE['mwai_session_id'];
300 }
301 return "N/A";
302 }
303
304 // Get the UserID from the data, or from the current user
305 function get_user_id( $data = null ) {
306 if ( isset( $data ) && isset( $data['userId'] ) ) {
307 return (int)$data['userId'];
308 }
309 if ( is_user_logged_in() ) {
310 $current_user = wp_get_current_user();
311 if ( $current_user->ID > 0 ) {
312 return $current_user->ID;
313 }
314 }
315 return null;
316 }
317
318 function get_ip_address( $data = null ) {
319 if ( isset( $data ) && isset( $data['ip'] ) ) {
320 $data['ip'] = (string)$data['ip'];
321 }
322 else {
323 if ( isset( $_SERVER['REMOTE_ADDR'] ) ) {
324 $data['ip'] = $_SERVER['REMOTE_ADDR'];
325 }
326 else if ( isset( $_SERVER['HTTP_CLIENT_IP'] ) ) {
327 $data['ip'] = $_SERVER['HTTP_CLIENT_IP'];
328 }
329 else if ( isset( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
330 $data['ip'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
331 }
332 }
333 return $data['ip'];
334 }
335
336 function markdown_to_html( $content ) {
337 $Parsedown = new Parsedown();
338 $content = $Parsedown->text( $content );
339 return $content;
340 }
341 #endregion
342
343 #region Options
344 function get_all_options() {
345 $options = get_option( $this->option_name, null );
346 foreach ( MWAI_OPTIONS as $key => $value ) {
347 if ( !isset( $options[$key] ) ) {
348 $options[$key] = $value;
349 }
350 if ( $key === 'languages' ) {
351 // TODO: If we decide to make a set of options for languages, we can keep it in the settings
352 $options[$key] = MWAI_LANGUAGES;
353 $options[$key] = apply_filters( 'mwai_languages', $options[$key] );
354 }
355 }
356 $options['shortcode_chat_default_params'] = MWAI_CHATBOT_PARAMS;
357 $options['default_limits'] = MWAI_LIMITS;
358 return $options;
359 }
360
361 // Validate and keep the options clean and logical.
362 function sanitize_options() {
363 $options = $this->get_all_options();
364 $needs_update = false;
365
366 // We can sanitize our future options here, let's always remember it.
367 // Now, it is empty...
368
369 if ( $needs_update ) {
370 update_option( $this->option_name, $options, false );
371 }
372 return $options;
373 }
374
375 function update_options( $options ) {
376 if ( !update_option( $this->option_name, $options, false ) ) {
377 return false;
378 }
379 $options = $this->sanitize_options();
380 return $options;
381 }
382
383 function update_option( $option, $value ) {
384 $options = $this->get_all_options();
385 $options[$option] = $value;
386 return $this->update_options( $options );
387 }
388
389 function get_option( $option, $default = null ) {
390 $options = $this->get_all_options();
391 return $options[$option] ?? $default;
392 }
393 #endregion
394 }
395
396 ?>