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