PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 0.4.5
AI Engine – The Chatbot, AI Framework & MCP for WordPress v0.4.5
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
chatbot.php
455 lines
1 <?php
2
3 class Meow_MWAI_Modules_Chatbot {
4 private $core = null;
5 private $namespace = 'ai-engine/v1';
6
7 public function __construct() {
8 global $mwai_core;
9 $this->core = $mwai_core;
10 if ( is_admin() ) { return; }
11 add_shortcode( 'mwai_chat', array( $this, 'chat' ) );
12 add_shortcode( 'mwai_chatbot', array( $this, 'chat' ) );
13 add_shortcode( 'mwai_imagesbot', array( $this, 'imageschat' ) );
14 add_action( 'rest_api_init', array( $this, 'rest_api_init' ) );
15 if ( $this->core->get_option( 'shortcode_chat_inject' ) ) {
16 add_action( 'wp_body_open', array( $this, 'inject_chat' ) );
17 }
18
19 // Only for test now, but later we should probably import the JS/CSS
20 if ( $this->core->get_option( 'shortcode_chat_syntax_highlighting' ) ) {
21 wp_enqueue_script( 'mwai_chatbot',
22 '//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/highlight.min.js', [], null, false );
23 wp_enqueue_style( 'mwai_chatbot',
24 '//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/styles/stackoverflow-dark.min.css' );
25 }
26
27 if ( $this->core->get_option( 'shortcode_chat_styles' ) ) {
28 add_filter( 'mwai_chatbot_style', [ $this, 'apply_chat_styles' ], 10, 2 );
29 }
30
31 }
32
33 function rest_api_init() {
34 try {
35 register_rest_route( $this->namespace, '/chat', array(
36 'methods' => 'POST',
37 'callback' => array( $this, 'rest_chat' ),
38 'permission_callback' => '__return_true'
39 ) );
40 register_rest_route( $this->namespace, '/imagesbot', array(
41 'methods' => 'POST',
42 'callback' => array( $this, 'rest_imagesbot' ),
43 'permission_callback' => '__return_true'
44 ) );
45 }
46 catch ( Exception $e ) {
47 var_dump( $e );
48 }
49 }
50
51 function chatgpt_style( $id ) {
52 $css = file_get_contents( MWAI_PATH . '/classes/modules/chatbot-chatgpt.css' );
53 $css = str_replace( '#mwai-chat-id', "#mwai-chat-{$id}", $css );
54 return "<style>" . $css . "</style>";
55 }
56
57 function rest_chat( $request ) {
58 try {
59 $params = $request->get_json_params();
60 $session = $params['session'];
61 $env = $params['env'];
62 $prompt = $params['prompt'];
63 $model = $params['model'];
64 $temperature = $params['temperature'];
65 $maxTokens = intval( $params['maxTokens'] );
66 $apiKey = $params['apiKey'];
67 $stop = $params['stop'];
68 $query = new Meow_MWAI_QueryText( $prompt, 1024 );
69 if ( $model ) {
70 $query->setModel( $model );
71 }
72 if ( $temperature ) {
73 $query->setTemperature( $temperature );
74 }
75 if ( $maxTokens ) {
76 $query->setMaxTokens( $maxTokens );
77 }
78 if ( $stop ) {
79 $query->setStop( $stop );
80 }
81 if ( $apiKey ) {
82 $query->setApiKey( $apiKey );
83 }
84 if ( $env ) {
85 $query->setEnv( $env );
86 }
87 if ( $session ) {
88 $query->setSession( $session );
89 }
90 $answer = $this->core->ai->run( $query );
91 $rawText = $answer->result;
92 $html = apply_filters( 'mwai_chatbot_answer', $rawText );
93 $html = $this->core->markdown_to_html( $rawText );
94 return new WP_REST_Response([ 'success' => true, 'answer' => $rawText,
95 'html' => $html, 'usage' => $answer->usage ], 200 );
96 }
97 catch ( Exception $e ) {
98 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
99 }
100 }
101
102 function rest_imagesbot( $request ) {
103 try {
104 $params = $request->get_json_params();
105 $session = $params['session'];
106 $env = $params['env'];
107 $prompt = $params['prompt'];
108 $maxResults = $params['maxResults'];
109 $apiKey = $params['apiKey'];
110 $query = new Meow_MWAI_QueryImage( $prompt );
111 if ( $maxResults ) {
112 $query->setMaxResults( $maxResults );
113 }
114 if ( $apiKey ) {
115 $query->setApiKey( $apiKey );
116 }
117 if ( $env ) {
118 $query->setEnv( $env );
119 }
120 if ( $session ) {
121 $query->setSession( $session );
122 }
123 $answer = $this->core->ai->run( $query );
124 return new WP_REST_Response([ 'success' => true, 'images' => $answer->results, 'usage' => $answer->usage ], 200 );
125 }
126 catch ( Exception $e ) {
127 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
128 }
129 }
130
131 function apply_chat_styles( $css, $chatbotId ) {
132 $chatStyles = $this->core->get_option( 'shortcode_chat_styles' );
133 return preg_replace_callback( '/--mwai-(\w+):\s*([^;]+);/', function ( $matches ) use ($chatStyles ) {
134 if( isset( $chatStyles[$matches[1]] ) ) {
135 return "--mwai-" . $matches[1] . ": " . $chatStyles[$matches[1]] . ";";
136 }
137 return $matches[0];
138 }, $css );
139 }
140
141 function inject_chat() {
142 $params = $this->core->get_option( 'shortcode_chat_params' );
143 echo $this->chat( $params );
144 }
145
146 function imageschat( $atts ) {
147 $atts['mode'] = 'images';
148 return $this->chat( $atts );
149 }
150
151 function chat( $atts ) {
152 // Use the core default parameters, or the user default parameters
153 $override = $this->core->get_option( 'shortcode_chat_params_override' );
154 $defaults_params = $override ? $this->core->get_option( 'shortcode_chat_params' ) :
155 $this->core->get_option( 'shortcode_chat_default_params' );
156 $defaults_params['id'] = uniqid();
157
158 // Give a chance to modify the default parameters one last time
159 $defaults = apply_filters( 'mwai_chatbot_params_defaults', $defaults_params );
160
161 // Make sure all the mandatory params are set
162 foreach ( $this->core->defaultChatbotParams as $key => $value ) {
163 if ( !isset( $defaults[$key] ) ) {
164 $defaults[$key] = $value;
165 }
166 }
167
168 // Override with the shortcode, and before/after filters
169 $atts = apply_filters( 'mwai_chatbot_params_before', $atts );
170 $atts = shortcode_atts( $defaults, $atts );
171 $atts = apply_filters( 'mwai_chatbot_params', $atts );
172
173 // UI Parameters
174 $aiName = addslashes( trim($atts['ai_name']) );
175 $userName = addslashes( trim($atts['user_name']) );
176 $sysName = addslashes( trim($atts['sys_name']) );
177 $context = addslashes( $atts['context'] );
178 $context = preg_replace( '/\v+/', "\\n", $context );
179 $textSend = addslashes( trim( $atts['text_send'] ) );
180 $textInputPlaceholder = addslashes( trim( $atts['text_input_placeholder'] ) );
181 $startSentence = addslashes( trim( $atts['start_sentence'] ) );
182 $window = filter_var( $atts['window'], FILTER_VALIDATE_BOOLEAN );
183 $fullscreen = filter_var( $atts['fullscreen'], FILTER_VALIDATE_BOOLEAN );
184 $style = $atts['style'];
185
186 // Chatbot System Parameters
187 $id = $atts['id'];
188 $env = $atts['env'];
189 $mode = $atts['mode'];
190 $maxResults = $atts['max_results'];
191 $sessionId = $this->core->get_session_id();
192 $rest_nonce = wp_create_nonce( 'wp_rest' );
193 $casuallyFineTuned = boolval( $atts['casually_fined_tuned'] );
194 $promptEnding = addslashes( trim( $atts['prompt_ending'] ) );
195 $completionEnding = addslashes( trim( $atts['completion_ending'] ) );
196 if ( $casuallyFineTuned ) {
197 $promptEnding = "\\n\\n===\\n\\n";
198 $completionEnding = "\\n\\n";
199 }
200
201 // OpenAI Parameters
202 $model = $atts['model'];
203 $temperature = $atts['temperature'];
204 $maxTokens = $atts['max_tokens'];
205 $apiKey = $atts['api_key'];
206
207 // Named functions
208 $onSentClickFn = "mwai_{$id}_onSendClick";
209 $addReplyFn = "mwai_{$id}_addReply";
210 $initChatBotFn = "mwai_{$id}_initChatBot";
211
212 // Variables
213 $apiUrl = get_rest_url( null, $mode === 'images' ? 'ai-engine/v1/imagesbot' : 'ai-engine/v1/chat' );
214 $onGoingPrompt = "mwai_{$id}_onGoingPrompt";
215 $baseClasses = "mwai-chat";
216 $baseClasses .= ( $window ? " mwai-window" : "" );
217 $baseClasses .= ( !$window && $fullscreen ? " mwai-fullscreen" : "" );
218
219 // Output CSS
220 ob_start();
221 $style_content = "";
222 if ( $style === 'chatgpt' ) {
223 $style_content = $this->chatgpt_style( $id, $style );
224 }
225 echo apply_filters( 'mwai_chatbot_style', $style_content, $id );
226
227 // Output HTML & CSS
228 ?>
229 <div id="mwai-chat-<?= $id ?>" class="<?= $baseClasses ?>">
230 <?php if ( $window ) { ?>
231 <div class="mwai-open-button">
232 <img width="64" height="64" src="<?= plugins_url( '../../images/chat-green.svg', __FILE__ ) ?>" />
233 </div>
234 <div class="mwai-header">
235 <?php if ( $window ) { ?>
236 <div class="mwai-resize-button"></div>
237 <?php } ?>
238 <div class="mwai-close-button"></div>
239 </div>
240 <?php } ?>
241 <div class="mwai-content">
242 <div class="mwai-conversation">
243 </div>
244 <div class="mwai-input">
245 <textarea rows="1" placeholder="<?= $textInputPlaceholder ?>"></textarea>
246 <button><span><?= $textSend ?></span></button>
247 </div>
248 </div>
249 </div>
250
251 <script>
252 {
253 let <?= $onGoingPrompt ?> = '<?= $context ?>' + '\n\n';
254 let isMobile = window.matchMedia("only screen and (max-width: 760px)").matches;
255 let isWindow = <?= $window ? 'true' : 'false' ?>;
256 let mode = '<?= $mode ?>';
257
258 // Push the reply in the conversation
259 function <?= $addReplyFn ?>(text, type = 'user') {
260 var conversation = document.querySelector('#mwai-chat-<?= $id ?> .mwai-conversation');
261
262 // If text is array, then it's image URLs. Let's create a simple gallery in HTML in $text.
263 if (Array.isArray(text)) {
264 var newText = '<div class="mwai-gallery">';
265 for (var i = 0; i < text.length; i++) {
266 newText += '<a href="' + text[i] + '" target="_blank"><img src="' + text[i] + '" />';
267 }
268 text = newText + '</div>';
269 }
270
271 var mwaiClasses = 'mwai-reply';
272 if (type === 'ai') {
273 mwaiClasses += ' mwai-ai';
274 }
275 else if (type === 'system') {
276 mwaiClasses += ' mwai-system';
277 }
278 else {
279 mwaiClasses += ' mwai-user';
280 }
281 var html = '<div class="' + mwaiClasses + '">';
282 if (type === 'ai') {
283 html += '<span class="mwai-name"><?= $aiName ?></span>';
284 }
285 else if (type === 'system') {
286 html += '<span class="mwai-name"><?= $sysName ?></span>';
287 }
288 else {
289 html += '<span class="mwai-name"><?= $userName ?></span>';
290 }
291 html += '<span class="mwai-text">' + text + '</span>';
292 html += '</div>';
293 conversation.innerHTML += html;
294 conversation.scrollTop = conversation.scrollHeight;
295
296 // Syntax coloring
297 if (typeof hljs !== 'undefined') {
298 document.querySelectorAll('pre code').forEach((el) => {
299 hljs.highlightElement(el);
300 });
301 }
302 }
303
304 // Function to request the completion
305 function <?= $onSentClickFn ?>() {
306 let input = document.querySelector('#mwai-chat-<?= $id ?> .mwai-input textarea');
307 let inputText = input.value.trim();
308
309 if (inputText === '') {
310 return;
311 }
312
313 // Disable the button
314 var button = document.querySelector('#mwai-chat-<?= $id ?> .mwai-input button');
315 button.disabled = true;
316
317 // Add the user reply
318 <?= $addReplyFn ?>(inputText, 'user');
319 <?= $onGoingPrompt ?> += '<?= $userName ?>' + inputText + '\n';
320 input.value = '';
321 input.setAttribute('rows', 1);
322 input.disabled = true;
323
324 // Let's build the prompt depending on the "system"
325 <?= $onGoingPrompt ?> += '<?= $aiName ?>';
326 let prompt = <?= $onGoingPrompt ?>;
327 if (<?= $casuallyFineTuned ? 1 : 0 ?>) {
328 prompt = inputText + '<?= $promptEnding ?>';
329 }
330
331 // Prompt for the images
332 const data = mode === 'images' ? {
333 env: '<?= $env ?>',
334 session: '<?= $sessionId ?>',
335 prompt: inputText,
336 maxResults: <?= $maxResults ?>,
337 model: '<?= $atts['model'] ?>',
338 apiKey: '<?= $atts['api_key'] ?>',
339 // Prompt for the chat
340 } : {
341 env: '<?= $env ?>',
342 session: '<?= $sessionId ?>',
343 prompt: prompt,
344 userName: '<?= $userName ?>',
345 aiName: '<?= $aiName ?>',
346 model: '<?= $model ?>',
347 temperature: '<?= $temperature ?>',
348 maxTokens: '<?= $maxTokens ?>',
349 stop: '<?= $completionEnding ?>',
350 maxResults: '<?= $maxResults ?>',
351 apiKey: '<?= $apiKey ?>',
352 };
353 console.log('[BOT] Sent: ', data);
354 fetch('<?= $apiUrl ?>', { method: 'POST', headers: {
355 'Content-Type': 'application/json',
356 'X-WP-Nonce': '<?= $rest_nonce ?>'
357 },
358 body: JSON.stringify(data)
359 })
360 .then(response => response.json())
361 .then(data => {
362 console.log('[BOT] Recv: ', data);
363 if (!data.success) {
364 <?= $addReplyFn ?>(data.message, 'system');
365 }
366 else {
367 <?= $addReplyFn ?>(data.images ? data.images : data.html, 'ai');
368 <?= $onGoingPrompt ?> += data.answer + '\n';
369 }
370 button.disabled = false;
371 input.disabled = false;
372
373 // Only focus only on desktop (to avoid the mobile keyboard to kick-in)
374 if (!isMobile) {
375 input.focus();
376 }
377 })
378 .catch(error => {
379 console.error(error);
380 button.disabled = false;
381 input.disabled = false;
382 });
383 }
384
385 // Keep the textarea height in sync with the content
386 function mwaiSetTextAreaHeight(textarea, lines) {
387 var rows = textarea.getAttribute('rows');
388 if (lines !== rows) {
389 textarea.setAttribute('rows', lines > 5 ? 5 : lines);
390 }
391 }
392
393 // Init the chatbot
394 function <?= $initChatBotFn ?>() {
395 var input = document.querySelector('#mwai-chat-<?= $id ?> .mwai-input textarea');
396 input.addEventListener('keypress', (event) => {
397 if (event.keyCode === 13 && !event.shiftKey) {
398 <?= $onSentClickFn ?>();
399 }
400 });
401 input.addEventListener('keydown', (event) => {
402 var rows = input.getAttribute('rows');
403 if (event.keyCode === 13 && event.shiftKey) {
404 var lines = input.value.split('\n').length + 1;
405 mwaiSetTextAreaHeight(input, lines);
406 }
407 });
408 input.addEventListener('keyup', (event) => {
409 var rows = input.getAttribute('rows');
410 var lines = input.value.split('\n').length ;
411 mwaiSetTextAreaHeight(input, lines);
412 });
413 var button = document.querySelector('#mwai-chat-<?= $id ?> .mwai-input button');
414 button.addEventListener('click', (event) => {
415 <?= $onSentClickFn ?>();
416 });
417
418 // If window, add event listener to mwai-open-button and mwai-close-button
419 if ( isWindow ) {
420 var openButton = document.querySelector('#mwai-chat-<?= $id ?> .mwai-open-button');
421 openButton.addEventListener('click', (event) => {
422 var chat = document.querySelector('#mwai-chat-<?= $id ?>');
423 chat.classList.add('mwai-open');
424 // Only focus only on desktop (to avoid the mobile keyboard to kick-in)
425 if (!isMobile) {
426 input.focus();
427 }
428 });
429 var closeButton = document.querySelector('#mwai-chat-<?= $id ?> .mwai-close-button');
430 closeButton.addEventListener('click', (event) => {
431 var chat = document.querySelector('#mwai-chat-<?= $id ?>');
432 chat.classList.remove('mwai-open');
433 });
434 var resizeButton = document.querySelector('#mwai-chat-<?= $id ?> .mwai-resize-button');
435 resizeButton.addEventListener('click', (event) => {
436 var chat = document.querySelector('#mwai-chat-<?= $id ?>');
437 chat.classList.toggle('mwai-fullscreen');
438 });
439 }
440
441 <?= $addReplyFn ?>('<?= $startSentence ?>', 'ai');
442 }
443
444 // Let's go totally meoooow on this!
445 <?= $initChatBotFn ?>();
446 }
447 </script>
448
449 <?php
450 $output = ob_get_contents();
451 ob_end_clean();
452 $output = apply_filters( 'mwai_chatbot', $output, $atts );
453 return $output;
454 }
455 }