PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 1.3.33
AI Engine – The Chatbot, AI Framework & MCP for WordPress v1.3.33
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 queryembed.php 3 years ago queryimage.php 3 years ago querytext.php 3 years ago querytranscribe.php 3 years ago rest.php 3 years ago ui.php 3 years ago
core.php
285 lines
1 <?php
2
3 require_once( MWAI_PATH . '/vendor/autoload.php' );
4 require_once( MWAI_PATH . '/constants/init.php' );
5
6 class Meow_MWAI_Core
7 {
8 public $admin = null;
9 public $is_rest = false;
10 public $is_cli = false;
11 public $site_url = null;
12 public $ai = null;
13 private $option_name = 'mwai_options';
14 public $defaultChatbotParams = MWAI_CHATBOT_PARAMS;
15
16 public function __construct() {
17 $this->site_url = get_site_url();
18 $this->is_rest = MeowCommon_Helpers::is_rest();
19 $this->is_cli = defined( 'WP_CLI' ) && WP_CLI;
20 $this->ai = new Meow_MWAI_AI( $this );
21 add_action( 'plugins_loaded', array( $this, 'init' ) );
22 }
23
24 function init() {
25 if ( $this->is_rest ) {
26 new Meow_MWAI_Rest( $this );
27 }
28 if ( is_admin() ) {
29 new Meow_MWAI_Admin( $this );
30 new Meow_MWAI_Modules_Assistants( $this );
31 }
32 else {
33 //new Meow_MWAI_UI( $this );
34 if ( $this->get_option( 'shortcode_chat' ) ) {
35 new Meow_MWAI_Modules_Chatbot();
36 }
37 }
38
39 // Advanced core
40 if ( class_exists( 'MeowPro_MWAI_Core' ) ) {
41 new MeowPro_MWAI_Core( $this );
42 }
43 }
44
45 #region Roles & Capabilities
46
47 function can_access_settings() {
48 return apply_filters( 'mwai_allow_setup', current_user_can( 'manage_options' ) );
49 }
50
51 function can_access_features() {
52 $editor_or_admin = current_user_can( 'editor' ) || current_user_can( 'administrator' );
53 return apply_filters( 'mwai_allow_usage', $editor_or_admin );
54 }
55
56 #endregion
57
58 #region Text-Related Helpers
59
60 // Clean the text perfectly, resolve shortcodes, etc, etc.
61 function clean_text( $rawText = "" ) {
62 $text = strip_tags( $rawText );
63 $text = strip_shortcodes( $text );
64 $text = html_entity_decode( $text );
65 $text = str_replace( array( "\r", "\n" ), "", $text );
66 $sentences = preg_split( '/(?<=[.?!])(?=[a-zA-Z ])/', $text );
67 foreach ( $sentences as $key => $sentence ) {
68 $sentences[$key] = trim( $sentence );
69 }
70 $text = implode( " ", $sentences );
71 $text = preg_replace( '/^[\pZ\pC]+|[\pZ\pC]+$/u', '', $text );
72 return $text . " ";
73 }
74
75 // Make sure there are no duplicate sentences, and keep the length under a maximum length.
76 function clean_sentences( $text, $maxLength = 1024 ) {
77 $sentences = preg_split( '/(?<=[.?!])(?=[a-zA-Z ])/', $text );
78 $hashes = array();
79 $uniqueSentences = array();
80 $length = 0;
81 foreach ( $sentences as $sentence ) {
82 $sentence = preg_replace( '/^[\pZ\pC]+|[\pZ\pC]+$/u', '', $sentence );
83 $hash = md5( $sentence );
84 if ( !in_array( $hash, $hashes ) ) {
85 if ( $length + strlen( $sentence ) > $maxLength ) {
86 continue;
87 }
88 $hashes[] = $hash;
89 $uniqueSentences[] = $sentence;
90 $length += strlen( $sentence );
91 }
92 }
93 $text = implode( " ", $uniqueSentences );
94 $text = preg_replace( '/^[\pZ\pC]+|[\pZ\pC]+$/u', '', $text );
95 return $text;
96 }
97
98 function get_text_from_postId( $postId ) {
99 $post = get_post( $postId );
100 if ( !$post ) {
101 return false;
102 }
103 $post->post_content = apply_filters( 'the_content', $post->post_content );
104 $text = $this->clean_text( $post->post_content );
105 $text = $this->clean_sentences( $text );
106 return $text;
107 }
108
109 function markdown_to_html( $content ) {
110 $Parsedown = new Parsedown();
111 $content = $Parsedown->text( $content );
112 return $content;
113 }
114 #endregion
115
116 #region Users/Sessions Helpers
117
118 function get_session_id() {
119 if ( isset( $_COOKIE['mwai_session_id'] ) ) {
120 return $_COOKIE['mwai_session_id'];
121 }
122 return "N/A";
123 }
124
125 // Get the UserID from the data, or from the current user
126 function get_user_id( $data = null ) {
127 if ( isset( $data ) && isset( $data['userId'] ) ) {
128 return (int)$data['userId'];
129 }
130 if ( is_user_logged_in() ) {
131 $current_user = wp_get_current_user();
132 if ( $current_user->ID > 0 ) {
133 return $current_user->ID;
134 }
135 }
136 return null;
137 }
138
139 function get_ip_address( $data = null ) {
140 if ( isset( $data ) && isset( $data['ip'] ) ) {
141 $data['ip'] = (string)$data['ip'];
142 }
143 else {
144 if ( isset( $_SERVER['REMOTE_ADDR'] ) ) {
145 $data['ip'] = sanitize_text_field( $_SERVER['REMOTE_ADDR'] );
146 }
147 else if ( isset( $_SERVER['HTTP_CLIENT_IP'] ) ) {
148 $data['ip'] = sanitize_text_field( $_SERVER['HTTP_CLIENT_IP'] );
149 }
150 else if ( isset( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
151 $data['ip'] = sanitize_text_field( $_SERVER['HTTP_X_FORWARDED_FOR'] );
152 }
153 }
154 return $data['ip'];
155 }
156
157 #endregion
158
159 #region Other Helpers
160
161 function isUrl( $url ) {
162 return strpos( $url, 'http' ) === 0 ? true : false;
163 }
164
165 #endregion
166
167 #region Usage & Costs
168
169 public function record_tokens_usage( $model, $prompt_tokens, $completion_tokens = 0 ) {
170 if ( !is_numeric( $prompt_tokens ) ) {
171 throw new Exception( 'Record usage: prompt_tokens is not a number.' );
172 }
173 if ( !is_numeric( $completion_tokens ) ) {
174 $completion_tokens = 0;
175 }
176 if ( !$model ) {
177 throw new Exception( 'Record usage: model is missing.' );
178 }
179 $usage = $this->get_option( 'openai_usage' );
180 $month = date( 'Y-m' );
181 if ( !isset( $usage[$month] ) ) {
182 $usage[$month] = array();
183 }
184 if ( !isset( $usage[$month][$model] ) ) {
185 $usage[$month][$model] = array(
186 'prompt_tokens' => 0,
187 'completion_tokens' => 0,
188 'total_tokens' => 0
189 );
190 }
191 $usage[$month][$model]['prompt_tokens'] += $prompt_tokens;
192 $usage[$month][$model]['completion_tokens'] += $completion_tokens;
193 $usage[$month][$model]['total_tokens'] += $prompt_tokens + $completion_tokens;
194 $this->update_option( 'openai_usage', $usage );
195 return [
196 'prompt_tokens' => $prompt_tokens,
197 'completion_tokens' => $completion_tokens,
198 'total_tokens' => $prompt_tokens + $completion_tokens
199 ];
200 }
201
202 public function record_images_usage( $model, $resolution, $images ) {
203 if ( !$model || !$resolution || !$images ) {
204 throw new Exception( 'Missing parameters for record_image_usage.' );
205 }
206 $usage = $this->get_option( 'openai_usage' );
207 $month = date( 'Y-m' );
208 if ( !isset( $usage[$month] ) ) {
209 $usage[$month] = array();
210 }
211 if ( !isset( $usage[$month][$model] ) ) {
212 $usage[$month][$model] = array(
213 'resolution' => array(),
214 'images' => 0
215 );
216 }
217 if ( !isset( $usage[$month][$model]['resolution'][$resolution] ) ) {
218 $usage[$month][$model]['resolution'][$resolution] = 0;
219 }
220 $usage[$month][$model]['resolution'][$resolution] += $images;
221 $usage[$month][$model]['images'] += $images;
222 $this->update_option( 'openai_usage', $usage );
223 return [
224 'resolution' => $resolution,
225 'images' => $images
226 ];
227 }
228
229 #endregion
230
231 #region Options
232 function get_all_options() {
233 $options = get_option( $this->option_name, null );
234 foreach ( MWAI_OPTIONS as $key => $value ) {
235 if ( !isset( $options[$key] ) ) {
236 $options[$key] = $value;
237 }
238 if ( $key === 'languages' ) {
239 // TODO: If we decide to make a set of options for languages, we can keep it in the settings
240 $options[$key] = MWAI_LANGUAGES;
241 $options[$key] = apply_filters( 'mwai_languages', $options[$key] );
242 }
243 }
244 $options['shortcode_chat_default_params'] = MWAI_CHATBOT_PARAMS;
245 $options['default_limits'] = MWAI_LIMITS;
246 $options['openai_models'] = MWAI_OPENAI_MODELS;
247 return $options;
248 }
249
250 // Validate and keep the options clean and logical.
251 function sanitize_options() {
252 $options = $this->get_all_options();
253 $needs_update = false;
254
255 // We can sanitize our future options here, let's always remember it.
256 // Now, it is empty...
257
258 if ( $needs_update ) {
259 update_option( $this->option_name, $options, false );
260 }
261 return $options;
262 }
263
264 function update_options( $options ) {
265 if ( !update_option( $this->option_name, $options, false ) ) {
266 return false;
267 }
268 $options = $this->sanitize_options();
269 return $options;
270 }
271
272 function update_option( $option, $value ) {
273 $options = $this->get_all_options();
274 $options[$option] = $value;
275 return $this->update_options( $options );
276 }
277
278 function get_option( $option, $default = null ) {
279 $options = $this->get_all_options();
280 return $options[$option] ?? $default;
281 }
282 #endregion
283 }
284
285 ?>