PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 1.1.1
AI Engine – The Chatbot, AI Framework & MCP for WordPress v1.1.1
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
325 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_syntax_highlighting' => false,
109 'shortcode_chat_logs' => '', // 'file', 'db', 'file,db'
110 'shortcode_chat_inject' => false,
111 'shortcode_chat_styles' => [],
112 'limits' => MWAI_LIMITS,
113 'openai_apikey' => false,
114 'openai_usage' => [],
115 'openai_finetunes' => [],
116 'openai_finetunes_deleted' => [],
117 'extra_models' => "",
118 'debug_mode' => true,
119 'resolve_shortcodes' => false,
120 'languages' => MWAI_LANGUAGES
121 ]);
122 #endregion
123
124 class Meow_MWAI_Core
125 {
126 public $admin = null;
127 public $is_rest = false;
128 public $is_cli = false;
129 public $site_url = null;
130 public $ai = null;
131 private $option_name = 'mwai_options';
132 public $defaultChatbotParams = MWAI_CHATBOT_PARAMS;
133
134 public function __construct() {
135 $this->site_url = get_site_url();
136 $this->is_rest = MeowCommon_Helpers::is_rest();
137 $this->is_cli = defined( 'WP_CLI' ) && WP_CLI;
138 $this->ai = new Meow_MWAI_AI( $this );
139 add_action( 'plugins_loaded', array( $this, 'init' ) );
140 }
141
142 function init() {
143 if ( $this->is_rest ) {
144 new Meow_MWAI_Rest( $this );
145 }
146 if ( is_admin() ) {
147 new Meow_MWAI_Admin( $this );
148 new Meow_MWAI_Modules_Assistants( $this );
149 }
150 else {
151 //new Meow_MWAI_UI( $this );
152 if ( $this->get_option( 'shortcode_chat' ) ) {
153 new Meow_MWAI_Modules_Chatbot();
154 }
155 }
156
157 // Advanced core
158 if ( class_exists( 'MeowPro_MWAI_Core' ) ) {
159 new MeowPro_MWAI_Core( $this );
160 }
161 }
162
163 #region Helpers
164 function can_access_settings() {
165 return apply_filters( 'mwai_allow_setup', current_user_can( 'manage_options' ) );
166 }
167
168 function can_access_features() {
169 $editor_or_admin = current_user_can( 'editor' ) || current_user_can( 'administrator' );
170 return apply_filters( 'mwai_allow_usage', $editor_or_admin );
171 }
172
173 function isUrl( $url ) {
174 return strpos( $url, 'http' ) === 0 ? true : false;
175 }
176
177 // Clean the text perfectly, resolve shortcodes, etc, etc.
178 function clean_text( $rawText = "" ) {
179 $text = strip_tags( $rawText );
180 $text = strip_shortcodes( $text );
181 $text = html_entity_decode( $text );
182 $text = str_replace( array( "\r", "\n" ), "", $text );
183 $sentences = preg_split( '/(?<=[.?!])(?=[a-zA-Z ])/', $text );
184 foreach ( $sentences as $key => $sentence ) {
185 $sentences[$key] = trim( $sentence );
186 }
187 $text = implode( " ", $sentences );
188 $text = preg_replace( '/^[\pZ\pC]+|[\pZ\pC]+$/u', '', $text );
189 return $text . " ";
190 }
191
192 // Make sure there are no duplicate sentences, and keep the length under a maximum length.
193 function clean_sentences( $text, $maxLength = 1024 ) {
194 $sentences = preg_split( '/(?<=[.?!])(?=[a-zA-Z ])/', $text );
195 $hashes = array();
196 $uniqueSentences = array();
197 $length = 0;
198 foreach ( $sentences as $sentence ) {
199 $sentence = preg_replace( '/^[\pZ\pC]+|[\pZ\pC]+$/u', '', $sentence );
200 $hash = md5( $sentence );
201 if ( !in_array( $hash, $hashes ) ) {
202 if ( $length + strlen( $sentence ) > $maxLength ) {
203 continue;
204 }
205 $hashes[] = $hash;
206 $uniqueSentences[] = $sentence;
207 $length += strlen( $sentence );
208 }
209 }
210 $text = implode( " ", $uniqueSentences );
211 $text = preg_replace( '/^[\pZ\pC]+|[\pZ\pC]+$/u', '', $text );
212 return $text;
213 }
214
215 function get_text_from_postId( $postId ) {
216 $post = get_post( $postId );
217 if ( !$post ) {
218 return false;
219 }
220 $post->post_content = apply_filters( 'the_content', $post->post_content );
221 $text = $this->clean_text( $post->post_content );
222 $text = $this->clean_sentences( $text );
223 return $text;
224 }
225
226 function get_session_id() {
227 if ( isset( $_COOKIE['mwai_session_id'] ) ) {
228 return $_COOKIE['mwai_session_id'];
229 }
230 return "N/A";
231 }
232
233 // Get the UserID from the data, or from the current user
234 function get_user_id( $data = null ) {
235 if ( isset( $data ) && isset( $data['userId'] ) ) {
236 return (int)$data['userId'];
237 }
238 if ( is_user_logged_in() ) {
239 $current_user = wp_get_current_user();
240 if ( $current_user->ID > 0 ) {
241 return $current_user->ID;
242 }
243 }
244 return null;
245 }
246
247 function get_ip_address( $data = null ) {
248 if ( isset( $data ) && isset( $data['ip'] ) ) {
249 $data['ip'] = (string)$data['ip'];
250 }
251 else {
252 if ( isset( $_SERVER['REMOTE_ADDR'] ) ) {
253 $data['ip'] = $_SERVER['REMOTE_ADDR'];
254 }
255 else if ( isset( $_SERVER['HTTP_CLIENT_IP'] ) ) {
256 $data['ip'] = $_SERVER['HTTP_CLIENT_IP'];
257 }
258 else if ( isset( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
259 $data['ip'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
260 }
261 }
262 return $data['ip'];
263 }
264
265 function markdown_to_html( $content ) {
266 $Parsedown = new Parsedown();
267 $content = $Parsedown->text( $content );
268 return $content;
269 }
270 #endregion
271
272 #region Options
273 function get_all_options() {
274 $options = get_option( $this->option_name, null );
275 foreach ( MWAI_OPTIONS as $key => $value ) {
276 if ( !isset( $options[$key] ) ) {
277 $options[$key] = $value;
278 }
279 if ( $key === 'languages' ) {
280 // TODO: If we decide to make a set of options for languages, we can keep it in the settings
281 $options[$key] = MWAI_LANGUAGES;
282 $options[$key] = apply_filters( 'mwai_languages', $options[$key] );
283 }
284 }
285 $options['shortcode_chat_default_params'] = MWAI_CHATBOT_PARAMS;
286 $options['default_limits'] = MWAI_LIMITS;
287 return $options;
288 }
289
290 // Validate and keep the options clean and logical.
291 function sanitize_options() {
292 $options = $this->get_all_options();
293 $needs_update = false;
294
295 // We can sanitize our future options here, let's always remember it.
296 // Now, it is empty...
297
298 if ( $needs_update ) {
299 update_option( $this->option_name, $options, false );
300 }
301 return $options;
302 }
303
304 function update_options( $options ) {
305 if ( !update_option( $this->option_name, $options, false ) ) {
306 return false;
307 }
308 $options = $this->sanitize_options();
309 return $options;
310 }
311
312 function update_option( $option, $value ) {
313 $options = $this->get_all_options();
314 $options[$option] = $value;
315 return $this->update_options( $options );
316 }
317
318 function get_option( $option, $default = null ) {
319 $options = $this->get_all_options();
320 return $options[$option] ?? $default;
321 }
322 #endregion
323 }
324
325 ?>