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