PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 0.9.87
AI Engine – The Chatbot, AI Framework & MCP for WordPress v0.9.87
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
330 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 '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 '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 '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 return "N/A";
227 }
228 if ( isset( $_SESSION['mwai_session_id'] ) ) {
229 return $_SESSION['mwai_session_id'];
230 }
231 else {
232 $session_id = uniqid();
233 $_SESSION['mwai_session_id'] = $session_id;
234 return $session_id;
235 }
236 }
237
238 // Get the UserID from the data, or from the current user
239 function get_user_id( $data = null ) {
240 if ( isset( $data ) && isset( $data['userId'] ) ) {
241 return (int)$data['userId'];
242 }
243 if ( is_user_logged_in() ) {
244 $current_user = wp_get_current_user();
245 if ( $current_user->ID > 0 ) {
246 return $current_user->ID;
247 }
248 }
249 return null;
250 }
251
252 function get_ip_address( $data = null ) {
253 if ( isset( $data ) && isset( $data['ip'] ) ) {
254 $data['ip'] = (string)$data['ip'];
255 }
256 else {
257 if ( isset( $_SERVER['REMOTE_ADDR'] ) ) {
258 $data['ip'] = $_SERVER['REMOTE_ADDR'];
259 }
260 else if ( isset( $_SERVER['HTTP_CLIENT_IP'] ) ) {
261 $data['ip'] = $_SERVER['HTTP_CLIENT_IP'];
262 }
263 else if ( isset( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
264 $data['ip'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
265 }
266 }
267 return $data['ip'];
268 }
269
270 function markdown_to_html( $content ) {
271 $Parsedown = new Parsedown();
272 $content = $Parsedown->text( $content );
273 return $content;
274 }
275 #endregion
276
277 #region Options
278 function get_all_options() {
279 $options = get_option( $this->option_name, null );
280 foreach ( MWAI_OPTIONS as $key => $value ) {
281 if ( !isset( $options[$key] ) ) {
282 $options[$key] = $value;
283 }
284 if ( $key === 'languages' ) {
285 // TODO: If we decide to make a set of options for languages, we can keep it in the settings
286 $options[$key] = MWAI_LANGUAGES;
287 $options[$key] = apply_filters( 'mwai_languages', $options[$key] );
288 }
289 }
290 $options['shortcode_chat_default_params'] = MWAI_CHATBOT_PARAMS;
291 $options['default_limits'] = MWAI_LIMITS;
292 return $options;
293 }
294
295 // Validate and keep the options clean and logical.
296 function sanitize_options() {
297 $options = $this->get_all_options();
298 $needs_update = false;
299
300 // We can sanitize our future options here, let's always remember it.
301 // Now, it is empty...
302
303 if ( $needs_update ) {
304 update_option( $this->option_name, $options, false );
305 }
306 return $options;
307 }
308
309 function update_options( $options ) {
310 if ( !update_option( $this->option_name, $options, false ) ) {
311 return false;
312 }
313 $options = $this->sanitize_options();
314 return $options;
315 }
316
317 function update_option( $option, $value ) {
318 $options = $this->get_all_options();
319 $options[$option] = $value;
320 return $this->update_options( $options );
321 }
322
323 function get_option( $option, $default = null ) {
324 $options = $this->get_all_options();
325 return $options[$option] ?? $default;
326 }
327 #endregion
328 }
329
330 ?>