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