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