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