PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 0.9.96
AI Engine – The Chatbot, AI Framework & MCP for WordPress v0.9.96
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
321 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_text' => '',
45 'icon_position' => 'bottom-right',
46 'fullscreen' => false,
47 // Chatbot System Parameters
48 'casually_fine_tuned' => false,
49 'content_aware' => false,
50 'prompt_ending' => null,
51 'completion_ending' => null,
52 // AI Parameters
53 'model' => 'text-davinci-003',
54 'temperature' => 0.8,
55 'max_tokens' => 1024,
56 'max_results' => 3,
57 'api_key' => null
58 ] );
59
60 define( 'MWAI_LANGUAGES', [
61 'en' => 'English',
62 'de' => 'German',
63 'fr' => 'French',
64 'es' => 'Spanish',
65 'it' => 'Italian',
66 'zh' => 'Chinese',
67 'ja' => 'Japanese',
68 'pt' => 'Portuguese',
69 //'ru' => 'Russian',
70 ] );
71
72 define ( 'MWAI_LIMITS', [
73 'enabled' => true,
74 'guests' => [
75 'credits' => 3,
76 'creditType' => 'queries',
77 'timeFrame' => 'day',
78 'isAbsolute' => false,
79 'overLimitMessage' => "You have reached the limit.",
80 ],
81 'users' => [
82 'credits' => 10,
83 'creditType' => 'price',
84 'timeFrame' => 'month',
85 'isAbsolute' => false,
86 'overLimitMessage' => "You have reached the limit.",
87 'ignoredUsers' => "administrator,editor",
88 ],
89 ] );
90
91 define( 'MWAI_OPTIONS', [
92 'module_titles' => true,
93 'module_excerpts' => true,
94 'module_woocommerce' => true,
95 'module_forms' => false,
96 'module_blocks' => false,
97 'module_playground' => true,
98 'module_generator_content' => true,
99 'module_generator_images' => true,
100 'shortcode_chat' => true,
101 'shortcode_chat_params' => MWAI_CHATBOT_PARAMS,
102 'shortcode_chat_params_override' => false,
103 'shortcode_chat_html' => true,
104 'shortcode_chat_formatting' => true,
105 'shortcode_chat_syntax_highlighting' => false,
106 'shortcode_chat_logs' => '', // 'file', 'db', 'file,db'
107 'shortcode_chat_inject' => false,
108 'shortcode_chat_styles' => [],
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( $_COOKIE['mwai_session_id'] ) ) {
224 return $_COOKIE['mwai_session_id'];
225 }
226 return "N/A";
227 }
228
229 // Get the UserID from the data, or from the current user
230 function get_user_id( $data = null ) {
231 if ( isset( $data ) && isset( $data['userId'] ) ) {
232 return (int)$data['userId'];
233 }
234 if ( is_user_logged_in() ) {
235 $current_user = wp_get_current_user();
236 if ( $current_user->ID > 0 ) {
237 return $current_user->ID;
238 }
239 }
240 return null;
241 }
242
243 function get_ip_address( $data = null ) {
244 if ( isset( $data ) && isset( $data['ip'] ) ) {
245 $data['ip'] = (string)$data['ip'];
246 }
247 else {
248 if ( isset( $_SERVER['REMOTE_ADDR'] ) ) {
249 $data['ip'] = $_SERVER['REMOTE_ADDR'];
250 }
251 else if ( isset( $_SERVER['HTTP_CLIENT_IP'] ) ) {
252 $data['ip'] = $_SERVER['HTTP_CLIENT_IP'];
253 }
254 else if ( isset( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
255 $data['ip'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
256 }
257 }
258 return $data['ip'];
259 }
260
261 function markdown_to_html( $content ) {
262 $Parsedown = new Parsedown();
263 $content = $Parsedown->text( $content );
264 return $content;
265 }
266 #endregion
267
268 #region Options
269 function get_all_options() {
270 $options = get_option( $this->option_name, null );
271 foreach ( MWAI_OPTIONS as $key => $value ) {
272 if ( !isset( $options[$key] ) ) {
273 $options[$key] = $value;
274 }
275 if ( $key === 'languages' ) {
276 // TODO: If we decide to make a set of options for languages, we can keep it in the settings
277 $options[$key] = MWAI_LANGUAGES;
278 $options[$key] = apply_filters( 'mwai_languages', $options[$key] );
279 }
280 }
281 $options['shortcode_chat_default_params'] = MWAI_CHATBOT_PARAMS;
282 $options['default_limits'] = MWAI_LIMITS;
283 return $options;
284 }
285
286 // Validate and keep the options clean and logical.
287 function sanitize_options() {
288 $options = $this->get_all_options();
289 $needs_update = false;
290
291 // We can sanitize our future options here, let's always remember it.
292 // Now, it is empty...
293
294 if ( $needs_update ) {
295 update_option( $this->option_name, $options, false );
296 }
297 return $options;
298 }
299
300 function update_options( $options ) {
301 if ( !update_option( $this->option_name, $options, false ) ) {
302 return false;
303 }
304 $options = $this->sanitize_options();
305 return $options;
306 }
307
308 function update_option( $option, $value ) {
309 $options = $this->get_all_options();
310 $options[$option] = $value;
311 return $this->update_options( $options );
312 }
313
314 function get_option( $option, $default = null ) {
315 $options = $this->get_all_options();
316 return $options[$option] ?? $default;
317 }
318 #endregion
319 }
320
321 ?>