PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 0.9.8
AI Engine – The Chatbot, AI Framework & MCP for WordPress v0.9.8
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
294 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 ],
11 [ "model" => "curie", "price" => 0.002, "type" => "token", "unit" => 1 / 1000 ],
12 [ "model" => "babbage", "price" => 0.0005, "type" => "token", "unit" => 1 / 1000 ],
13 [ "model" => "ada", "price" => 0.0004, "type" => "token", "unit" => 1 / 1000 ],
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 ],
23 [ "model" => "fn-curie", "price" => 0.012, "type" => "token", "unit" => 1 / 1000 ],
24 [ "model" => "fn-babbage", "price" => 0.0024, "type" => "token", "unit" => 1 / 1000 ],
25 [ "model" => "fn-ada", "price" => 0.0016, "type" => "token", "unit" => 1 / 1000 ],
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 'es' => 'Spanish',
64 'fr' => 'French',
65 'de' => 'German',
66 'it' => 'Italian',
67 'pt' => 'Portuguese',
68 'ru' => 'Russian',
69 'ja' => 'Japanese',
70 'zh' => 'Chinese',
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_inject' => false,
108 'limits' => MWAI_LIMITS,
109 'openai_apikey' => false,
110 'openai_usage' => [],
111 'openai_finetunes' => [],
112 'openai_finetunes_deleted' => [],
113 'extra_models' => "",
114 'debug_mode' => true,
115 'languages' => MWAI_LANGUAGES
116 ]);
117 #endregion
118
119 class Meow_MWAI_Core
120 {
121 public $admin = null;
122 public $is_rest = false;
123 public $is_cli = false;
124 public $site_url = null;
125 public $ai = null;
126 private $option_name = 'mwai_options';
127 public $defaultChatbotParams = MWAI_CHATBOT_PARAMS;
128
129 public function __construct() {
130 $this->site_url = get_site_url();
131 $this->is_rest = MeowCommon_Helpers::is_rest();
132 $this->is_cli = defined( 'WP_CLI' ) && WP_CLI;
133 $this->ai = new Meow_MWAI_AI( $this );
134 add_action( 'plugins_loaded', array( $this, 'init' ) );
135 }
136
137 function init() {
138 if ( $this->is_rest ) {
139 new Meow_MWAI_Rest( $this );
140 }
141 if ( is_admin() ) {
142 new Meow_MWAI_Admin( $this );
143 new Meow_MWAI_Modules_Assistants( $this );
144 }
145 else {
146 //new Meow_MWAI_UI( $this );
147 if ( $this->get_option( 'shortcode_chat' ) ) {
148 new Meow_MWAI_Modules_Chatbot();
149 }
150 }
151
152 // Advanced core
153 if ( class_exists( 'MeowPro_MWAI_Core' ) ) {
154 new MeowPro_MWAI_Core( $this );
155 }
156 }
157
158 #region Helpers
159 function can_access_settings() {
160 return apply_filters( 'mwai_allow_setup', current_user_can( 'manage_options' ) );
161 }
162
163 function can_access_features() {
164 $editor_or_admin = current_user_can( 'editor' ) || current_user_can( 'administrator' );
165 return apply_filters( 'mwai_allow_usage', $editor_or_admin );
166 }
167
168 function isUrl( $url ) {
169 return strpos( $url, 'http' ) === 0 ? true : false;
170 }
171
172 // Clean the text perfectly, resolve shortcodes, etc, etc.
173 function clean_text( $rawText = "" ) {
174 $text = strip_tags( $rawText );
175 $text = strip_shortcodes( $text );
176 $text = html_entity_decode( $text );
177 $text = str_replace( array( "\r", "\n" ), "", $text );
178 $sentences = preg_split( '/(?<=[.?!])(?=[a-zA-Z ])/', $text );
179 foreach ( $sentences as $key => $sentence ) {
180 $sentences[$key] = trim( $sentence );
181 }
182 $text = implode( " ", $sentences );
183 $text = preg_replace( '/^[\pZ\pC]+|[\pZ\pC]+$/u', '', $text );
184 return $text . " ";
185 }
186
187 // Make sure there are no duplicate sentences, and keep the length under a maximum length.
188 function clean_sentences( $text, $maxLength = 1024 ) {
189 $sentences = preg_split( '/(?<=[.?!])(?=[a-zA-Z ])/', $text );
190 $hashes = array();
191 $uniqueSentences = array();
192 $length = 0;
193 foreach ( $sentences as $sentence ) {
194 $sentence = preg_replace( '/^[\pZ\pC]+|[\pZ\pC]+$/u', '', $sentence );
195 $hash = md5( $sentence );
196 if ( !in_array( $hash, $hashes ) ) {
197 if ( $length + strlen( $sentence ) > $maxLength ) {
198 continue;
199 }
200 $hashes[] = $hash;
201 $uniqueSentences[] = $sentence;
202 $length += strlen( $sentence );
203 }
204 }
205 $text = implode( " ", $uniqueSentences );
206 $text = preg_replace( '/^[\pZ\pC]+|[\pZ\pC]+$/u', '', $text );
207 return $text;
208 }
209
210 function get_text_from_postId( $postId ) {
211 $post = get_post( $postId );
212 if ( !$post ) {
213 return false;
214 }
215 $post->post_content = apply_filters( 'the_content', $post->post_content );
216 $text = $this->clean_text( $post->post_content );
217 $text = $this->clean_sentences( $text );
218 return $text;
219 }
220
221 function get_session_id() {
222 if ( !isset( $_SESSION ) ) {
223 error_log("AI Engine: There is no session.");
224 return uniqid();
225 }
226 if ( isset( $_SESSION['mwai_session_id'] ) ) {
227 return $_SESSION['mwai_session_id'];
228 }
229 else {
230 $session_id = uniqid();
231 $_SESSION['mwai_session_id'] = $session_id;
232 return $session_id;
233 }
234 }
235
236 function markdown_to_html( $content ) {
237 $Parsedown = new Parsedown();
238 $content = $Parsedown->text( $content );
239 return $content;
240 }
241 #endregion
242
243 #region Options
244 function get_all_options() {
245 $options = get_option( $this->option_name, null );
246 foreach ( MWAI_OPTIONS as $key => $value ) {
247 if ( !isset( $options[$key] ) ) {
248 $options[$key] = $value;
249 }
250 if ( $key === 'languages' ) {
251 $options[$key] = apply_filters( 'mwai_languages', $options[$key] );
252 }
253 }
254 $options['shortcode_chat_default_params'] = MWAI_CHATBOT_PARAMS;
255 $options['default_limits'] = MWAI_LIMITS;
256 return $options;
257 }
258
259 // Validate and keep the options clean and logical.
260 function sanitize_options() {
261 $options = $this->get_all_options();
262 $needs_update = false;
263
264 // We can sanitize our future options here, let's always remember it.
265 // Now, it is empty...
266
267 if ( $needs_update ) {
268 update_option( $this->option_name, $options, false );
269 }
270 return $options;
271 }
272
273 function update_options( $options ) {
274 if ( !update_option( $this->option_name, $options, false ) ) {
275 return false;
276 }
277 $options = $this->sanitize_options();
278 return $options;
279 }
280
281 function update_option( $option, $value ) {
282 $options = $this->get_all_options();
283 $options[$option] = $value;
284 return $this->update_options( $options );
285 }
286
287 function get_option( $option, $default = null ) {
288 $options = $this->get_all_options();
289 return $options[$option] ?? $default;
290 }
291 #endregion
292 }
293
294 ?>