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