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