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