PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 0.2.7
AI Engine – The Chatbot, AI Framework & MCP for WordPress v0.2.7
3.5.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 / modules / chatbot.php
ai-engine / classes / modules Last commit date
chatbot-chatgpt.css 3 years ago chatbot-chatgpt.scss 3 years ago chatbot.php 3 years ago imagesbot.php 3 years ago statistics.php 3 years ago
chatbot.php
340 lines
1 <?php
2
3 add_filter( 'mwai_chatbot_params', function ( $params ) {
4 if ( isset( $params['discuss_mode'] ) ) {
5 return $params;
6 }
7 $post = get_post();
8 if ( !empty( $post ) ) {
9 // Before adding the content in the context, we should absolutely remove the HTML tags,
10 // the shortcodes, and the empty lines. Then lines should be replaced by a textual "\n".
11 $content = strip_tags( $post->post_content );
12 $content = preg_replace( '/\[[^\]]+\]/', '', $content );
13 $content = preg_replace( '/^\h*\v+/m', '', $content );
14 $content = preg_replace( '/\v+/', "\\n", $content );
15 $params['context'] = "Article:\\n\\n{***}\\n{$content}\\n{***}.\\n\\nDebate:\\n\\n";
16 $params['start_sentence'] = "What did you think of this article?";
17 }
18 return $params;
19 });
20
21 class Meow_MWAI_Modules_Chatbot {
22 private $core = null;
23 private $namespace = 'ai-engine/v1';
24
25 public function __construct() {
26 if ( is_admin() ) {
27 return;
28 }
29
30 global $mwai_core;
31 $this->core = $mwai_core;
32 add_shortcode( 'mwai_chat', array( $this, 'chat' ) );
33 add_shortcode( 'mwai_chatbot', array( $this, 'chat' ) );
34 add_action( 'rest_api_init', array( $this, 'rest_api_init' ) );
35
36 if ( $this->core->get_option( 'shortcode_chat_inject' ) ) {
37 add_action( 'wp_footer', array( $this, 'inject_chat' ) );
38 }
39 // Only for test now, but later we should probably import the JS/CSS
40 if ( $this->core->get_option( 'shortcode_chat_syntax_highlighting' ) ) {
41 wp_enqueue_script( 'mwai_chatbot',
42 '//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/highlight.min.js', [], null, false );
43 wp_enqueue_style( 'mwai_chatbot',
44 '//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/styles/stackoverflow-dark.min.css' );
45 }
46 }
47
48 function rest_api_init() {
49 try {
50 register_rest_route( $this->namespace, '/chat', array(
51 'methods' => 'POST',
52 'callback' => array( $this, 'rest_chat' ),
53 'permission_callback' => '__return_true'
54 ) );
55 }
56 catch ( Exception $e ) {
57 var_dump( $e );
58 }
59 }
60
61 function chatgpt_style( $id ) {
62 $css = file_get_contents( MWAI_PATH . '/classes/modules/chatbot-chatgpt.css' );
63 $css = str_replace( '#mwai-chat-id', "#mwai-chat-{$id}", $css );
64 return "<style>" . $css . "</style>";
65 }
66
67 function rest_chat( $request ) {
68 try {
69 $params = $request->get_json_params();
70 $prompt = $params['prompt'];
71 $model = $params['model'];
72 $temperature = $params['temperature'];
73 $maxTokens = intval( $params['maxTokens'] );
74 $apiKey = $params['apiKey'];
75 $stop = $params['stop'];
76 $query = new Meow_MWAI_QueryText( $prompt, 1024 );
77 if ( $model ) {
78 $query->setModel( $model );
79 }
80 if ( $temperature ) {
81 $query->setTemperature( $temperature );
82 }
83 if ( $maxTokens ) {
84 $query->setMaxTokens( $maxTokens );
85 }
86 if ( $stop ) {
87 $query->setStop( $stop );
88 }
89 if ( $apiKey ) {
90 $query->setApiKey( $apiKey );
91 }
92 $answer = $this->core->ai->run( $query );
93 $rawText = $answer->result;
94 $html = apply_filters( 'mwai_chatbot_answer', $rawText );
95 $html = $this->core->markdown_to_html( $rawText );
96 return new WP_REST_Response([ 'success' => true, 'answer' => $rawText, 'html' => $html, 'usage' => $answer->usage ], 200 );
97 }
98 catch ( Exception $e ) {
99 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
100 }
101 }
102
103 function inject_chat() {
104 $params = $this->core->get_option( 'shortcode_chat_params' );
105 echo $this->chat( $params );
106 }
107
108 function chat( $atts ) {
109 $override = $this->core->get_option( 'shortcode_chat_params_override' );
110 $defaults_params = $override ? $this->core->get_option( 'shortcode_chat_params' ) :
111 $this->core->get_option( 'shortcode_chat_default_params' );
112 $defaults_params['id'] = uniqid();
113 $defaults = apply_filters( 'mwai_chatbot_params_defaults', $defaults_params );
114 $atts = shortcode_atts( $defaults, $atts );
115 $atts = apply_filters( 'mwai_chatbot_params', $atts );
116 $apiUrl = get_rest_url( null, 'ai-engine/v1/chat' );
117 $id = $atts['id'];
118
119 // Functions
120 $onSentClickFn = "mwai_{$id}_onSendClick";
121 $addReplyFn = "mwai_{$id}_addReply";
122 $initChatBotFn = "mwai_{$id}_initChatBot";
123
124 // UI Parameters
125 $aiName = addslashes( trim($atts['ai_name']) );
126 $userName = addslashes( trim($atts['user_name']) );
127 $sysName = addslashes( trim($atts['sys_name']) );
128 $context = addslashes( $atts['context'] );
129 $textSend = addslashes( trim( $atts['text_send'] ) );
130 $textInputPlaceholder = addslashes( trim( $atts['text_input_placeholder'] ) );
131 $startSentence = addslashes( trim( $atts['start_sentence'] ) );
132 $window = ( !!$atts['window'] || $atts['window'] === 'true' ) ? 'true' : 'false';
133 $style = $atts['style'];
134
135 // Chatbot System Parameters
136 $casuallyFineTuned = $atts['casually_fined_tuned'] === "true";
137 $promptEnding = addslashes( trim( $atts['prompt_ending'] ) );
138 $completionEnding = addslashes( trim( $atts['completion_ending'] ) );
139 if ( $casuallyFineTuned ) {
140 $promptEnding = "\\n\\n===\\n\\n";
141 $completionEnding = "\\n\\n";
142 }
143
144 // OpenAI Parameters
145 $model = $atts['model'];
146 $temperature = $atts['temperature'];
147 $maxTokens = $atts['max_tokens'];
148 $apiKey = $atts['api_key'];
149
150 // Variables
151 $onGoingPrompt = "mwai_{$id}_onGoingPrompt";
152 $baseClasses = "mwai-chat" . ( $window === 'true' ? " mwai-window" : "" );
153
154 // Output CSS, HTML and JS
155 ob_start();
156 $style_content = "";
157 if ( $style === 'chatgpt' ) {
158 $style_content = $this->chatgpt_style( $id, $style );
159 }
160 echo apply_filters( 'mwai_chatbot_style', $style_content, $id );
161 ?>
162 <div id="mwai-chat-<?= $id ?>" class="<?= $baseClasses ?>">
163 <?php if ( $window === 'true' ) { ?>
164 <div class="mwai-close-button"></div>
165 <div class="mwai-open-button">
166 <img width="64" height="64" src="<?= plugins_url( '../../images/chat-green.svg', __FILE__ ) ?>" />
167 </div>
168 <?php } ?>
169 <div class="mwai-content">
170 <div class="mwai-conversation">
171 </div>
172 <div class="mwai-input">
173 <textarea rows="1" placeholder="<?= $textInputPlaceholder ?>"></textarea>
174 <button><span><?= $textSend ?></span></button>
175 </div>
176 </div>
177 </div>
178
179 <script>
180 var <?= $onGoingPrompt ?> = '<?= $context ?>' + '\n\n';
181
182 // Push the reply in the conversation
183 function <?= $addReplyFn ?>(text, type = 'user') {
184 var conversation = document.querySelector('#mwai-chat-<?= $id ?> .mwai-conversation');
185 var mwaiClasses = 'mwai-reply';
186 if (type === 'ai') {
187 mwaiClasses += ' mwai-ai';
188 }
189 else if (type === 'system') {
190 mwaiClasses += ' mwai-system';
191 }
192 else {
193 mwaiClasses += ' mwai-user';
194 }
195 var html = '<div class="' + mwaiClasses + '">';
196 if (type === 'ai') {
197 html += '<span class="mwai-name"><?= $aiName ?></span>';
198 }
199 else if (type === 'system') {
200 html += '<span class="mwai-name"><?= $sysName ?></span>';
201 }
202 else {
203 html += '<span class="mwai-name"><?= $userName ?></span>';
204 }
205 html += '<span class="mwai-text">' + text + '</span>';
206 html += '</div>';
207 conversation.innerHTML += html;
208 conversation.scrollTop = conversation.scrollHeight;
209
210 // Syntax coloring
211 if (typeof hljs !== 'undefined') {
212 document.querySelectorAll('pre code').forEach((el) => {
213 hljs.highlightElement(el);
214 });
215 }
216 }
217
218 // Function to request the completion
219 function <?= $onSentClickFn ?>() {
220 let input = document.querySelector('#mwai-chat-<?= $id ?> .mwai-input textarea');
221 let inputText = input.value.trim();
222
223 if (inputText === '') {
224 return;
225 }
226
227 // Disable the button
228 var button = document.querySelector('#mwai-chat-<?= $id ?> .mwai-input button');
229 button.disabled = true;
230
231 // Add the user reply
232 <?= $addReplyFn ?>(inputText, 'user');
233 <?= $onGoingPrompt ?> += '<?= $userName ?>' + inputText + '\n';
234 input.value = '';
235 input.setAttribute('rows', 1);
236 input.disabled = true;
237
238 // Let's build the prompt depending on the "system"
239 <?= $onGoingPrompt ?> += '<?= $aiName ?>';
240 let prompt = <?= $onGoingPrompt ?>;
241 if (<?= $casuallyFineTuned ? '1' : '0' ?>) {
242 prompt = inputText + '<?= $promptEnding ?>';
243 }
244
245 // Request the completion
246 const data = {
247 prompt: prompt,
248 userName: '<?= $userName ?>',
249 aiName: '<?= $aiName ?>',
250 model: '<?= $model ?>',
251 temperature: '<?= $temperature ?>',
252 maxTokens: '<?= $maxTokens ?>',
253 stop: '<?= $completionEnding ?>',
254 apiKey: '<?= $apiKey ?>',
255 };
256 console.log('[BOT] Sent: ', data);
257 fetch('<?= $apiUrl ?>', { method: 'POST', headers: { 'Content-Type': 'application/json' },
258 body: JSON.stringify(data)
259 })
260 .then(response => response.json())
261 .then(data => {
262 console.log('[BOT] Recv: ', data);
263 if (!data.success) {
264 <?= $addReplyFn ?>(data.message, 'system');
265 }
266 else {
267 <?= $addReplyFn ?>(data.html, 'ai');
268 <?= $onGoingPrompt ?> += data.answer + '\n';
269 }
270 button.disabled = false;
271 input.disabled = false;
272 input.focus();
273 })
274 .catch(error => {
275 console.error(error);
276 button.disabled = false;
277 input.disabled = false;
278 });
279 }
280
281 function mwaiSetTextAreaHeight(textarea, lines) {
282 var rows = textarea.getAttribute('rows');
283 if (lines !== rows) {
284 textarea.setAttribute('rows', lines > 5 ? 5 : lines);
285 }
286 }
287
288 function <?= $initChatBotFn ?>() {
289 var input = document.querySelector('#mwai-chat-<?= $id ?> .mwai-input textarea');
290 input.addEventListener('keypress', (event) => {
291 if (event.keyCode === 13 && !event.shiftKey) {
292 <?= $onSentClickFn ?>();
293 }
294 });
295 input.addEventListener('keydown', (event) => {
296 var rows = input.getAttribute('rows');
297 if (event.keyCode === 13 && event.shiftKey) {
298 var lines = input.value.split('\n').length + 1;
299 mwaiSetTextAreaHeight(input, lines);
300 }
301 });
302 input.addEventListener('keyup', (event) => {
303 var rows = input.getAttribute('rows');
304 var lines = input.value.split('\n').length ;
305 mwaiSetTextAreaHeight(input, lines);
306 });
307 var button = document.querySelector('#mwai-chat-<?= $id ?> .mwai-input button');
308 button.addEventListener('click', (event) => {
309 <?= $onSentClickFn ?>();
310 });
311
312 // If window, add event listener to mwai-open-button and mwai-close-button
313 if ( <?= $window ?> ) {
314 var openButton = document.querySelector('#mwai-chat-<?= $id ?> .mwai-open-button');
315 openButton.addEventListener('click', (event) => {
316 var chat = document.querySelector('#mwai-chat-<?= $id ?>');
317 chat.classList.add('mwai-open');
318 input.focus();
319 });
320 var closeButton = document.querySelector('#mwai-chat-<?= $id ?> .mwai-close-button');
321 closeButton.addEventListener('click', (event) => {
322 var chat = document.querySelector('#mwai-chat-<?= $id ?>');
323 chat.classList.remove('mwai-open');
324 });
325 }
326
327 <?= $addReplyFn ?>('<?= $startSentence ?>', 'ai');
328 }
329
330 <?= $initChatBotFn ?>();
331
332 </script>
333
334 <?php
335 $output = ob_get_contents();
336 ob_end_clean();
337 $output = apply_filters( 'mwai_chatbot', $output, $atts );
338 return $output;
339 }
340 }