PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 0.2.6
AI Engine – The Chatbot, AI Framework & MCP for WordPress v0.2.6
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.php 3 years ago imagesbot.php 3 years ago statistics.php 3 years ago
chatbot.php
460 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 add_shortcode( 'mwai_chat', array( $this, 'chat' ) );
11 add_action( 'rest_api_init', array( $this, 'rest_api_init' ) );
12
13 // If we apply ChatGPT styles
14 if ( $this->core->get_option( 'shortcode_chat_style' ) ) {
15 add_filter( 'mwai_chat_html', array( $this, 'chatgpt_style' ), 10, 2 );
16 add_filter( 'mwai_chat_html', array( $this, 'spinner_style' ), 10, 2 );
17 }
18 }
19
20 function rest_api_init() {
21 try {
22 register_rest_route( $this->namespace, '/chat', array(
23 'methods' => 'POST',
24 'callback' => array( $this, 'rest_chat' ),
25 'permission_callback' => '__return_true'
26 ) );
27 }
28 catch ( Exception $e ) {
29 var_dump( $e );
30 }
31 }
32
33 function spinner_style( $html, $atts ) {
34 // If needed, we can use the $id to apply styles
35 $id = $atts['id']; // This could be replace by the ID of a specific chatbot
36 return "
37 <style>
38 #mwai-chat-$id button {
39 position: relative;
40 }
41
42 #mwai-chat-$id button[disabled] span {
43 display: none;
44 }
45
46 #mwai-chat-$id button[disabled]::after {
47 content: '';
48 position: absolute;
49 width: 18px;
50 height: 18px;
51 top: 0;
52 left: 0;
53 right: 0;
54 bottom: 0;
55 margin: auto;
56 border: 3px solid transparent;
57 border-top-color: #ffffff;
58 border-radius: 50%;
59 animation: mwai-button-spinner 1s ease infinite;
60 }
61
62 @keyframes mwai-button-spinner {
63 from {
64 transform: rotate(0turn);
65 }
66
67 to {
68 transform: rotate(1turn);
69 }
70 }
71 </style>
72 " . $html;
73 }
74
75 function chatgpt_style( $html, $atts ) {
76 // If needed, we can use the $id to apply styles
77 $id = $atts['id']; // This could be replace by the ID of a specific chatbot
78 return "
79 <style>
80 #mwai-chat-$id {
81 background: #343541;
82 color: white;
83 font-size: 15px;
84 border-radius: 10px;
85 overflow: hidden;
86 }
87
88 #mwai-chat-$id * {
89 box-sizing: border-box;
90 }
91
92 #mwai-chat-$id a {
93 color: #2196f3;
94 }
95
96 #mwai-chat-$id h2 {
97 font-size: 24px;
98 }
99
100 #mwai-chat-$id h3 {
101 font-size: 18px;
102 }
103
104 #mwai-chat-$id h4 {
105 font-size: 16px;
106 }
107
108 #mwai-chat-$id pre {
109 background: black;
110 color: white;
111 border-radius: 10px;
112 padding: 10px 15px;
113 break-after: auto;
114 font-size: 14px;
115 }
116
117 #mwai-chat-$id ol {
118 padding: 0;
119 margin: 0 0 0 20px;
120 }
121
122 #mwai-chat-$id .mwai-reply {
123 display: flex;
124 padding: 20px;
125 }
126
127 #mwai-chat-$id .mwai-ai {
128 background: #454654;
129 }
130
131 #mwai-chat-$id .mwai-name {
132 color: #a0a0a0;
133 margin-right: 20px;
134 }
135
136 #mwai-chat-$id .mwai-text {
137 flex: auto;
138 }
139
140 #mwai-chat-$id .mwai-text > *:first-child {
141 margin-top: 0;
142 }
143
144 #mwai-chat-$id .mwai-text > *:last-child {
145 margin-bottom: 0;
146 }
147
148 #mwai-chat-$id .mwai-input {
149 display: flex;
150 padding: 15px;
151 border-top: 1px solid #454654;
152 }
153
154 #mwai-chat-$id .mwai-input textarea {
155 background: #40414f;
156 color: white;
157 flex: auto;
158 padding: 10px 15px;
159 border: none;
160 border-radius: 5px;
161 font-size: 15px;
162 resize: none;
163 font-family: inherit;
164 line-height: 30px;
165 }
166
167 #mwai-chat-$id .mwai-input textarea:focus {
168 outline: none;
169 }
170
171 #mwai-chat-$id .mwai-input button {
172 background: none;
173 color: white;
174 border: 1px solid #40414f;
175 margin-left: 15px;
176 width: 80px;
177 border-radius: 5px;
178 cursor: pointer;
179 }
180
181 #mwai-chat-$id .mwai-input button:hover {
182 background: #353640;
183 }
184
185 @media (max-width: 600px) {
186 #mwai-chat-$id .mwai-reply {
187 flex-direction: column;
188 }
189
190 #mwai-chat-$id .mwai-input {
191 flex-direction: column;
192 }
193
194 #mwai-chat-$id .mwai-input button {
195 margin: 15px 0 0 0;
196 height: 40px;
197 width: inherit;
198 }
199
200 #mwai-chat-$id .mwai-name {
201 margin-right: 0;
202 }
203 }
204 </style>
205 " . $html;
206 }
207
208 function rest_chat( $request ) {
209 try {
210 $params = $request->get_json_params();
211 $prompt = $params['prompt'];
212 $model = $params['model'];
213 //$userName = $params['userName'];
214 //$aiName = $params['aiName'];
215 $temperature = $params['temperature'];
216 $maxTokens = intval( $params['maxTokens'] );
217 $apiKey = $params['apiKey'];
218 $stop = $params['stop'];
219 $query = new Meow_MWAI_QueryText( $prompt, 1024 );
220 if ( $model ) {
221 $query->setModel( $model );
222 }
223 if ( $temperature ) {
224 $query->setTemperature( $temperature );
225 }
226 if ( $maxTokens ) {
227 $query->setMaxTokens( $maxTokens );
228 }
229 if ( $stop ) {
230 $query->setStop( $stop );
231 }
232 if ( $apiKey ) {
233 $query->setApiKey( $apiKey );
234 }
235 $answer = $this->core->ai->run( $query );
236 $rawText = $answer->result;
237
238 $html = $this->core->markdown_to_html( $answer->result );
239 return new WP_REST_Response([ 'success' => true, 'answer' => $rawText, 'html' => $html, 'usage' => $answer->usage ], 200 );
240 }
241 catch ( Exception $e ) {
242 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
243 }
244 }
245
246 function chat( $atts ) {
247 $defaults = apply_filters( 'mwai_chat_atts', [
248 // UI Parameters
249 'id' => uniqid(),
250 'context' => "Converse as if you were an AI assistant. Be friendly, creative.",
251 'ai_name' => "AI: ",
252 'user_name' => "User: ",
253 'sys_name' => "System: ",
254 'start_sentence' => "Hi! How can I help you?",
255 'text_send' => 'Send',
256 'text_input_placeholder' => 'Type your message...',
257 // Chatbot System Parameters
258 'casually_fined_tuned' => 'false',
259 'prompt_ending' => '',
260 'completion_ending' => '',
261 // AI Parameters
262 'model' => 'text-davinci-003',
263 'temperature' => 0.8,
264 'max_tokens' => 1024,
265 'api_key' => ''
266 ] );
267 $atts = shortcode_atts( $defaults, $atts, 'mwai_chat_atts' );
268 $id = $atts['id'];
269 $apiUrl = get_rest_url( null, 'ai-engine/v1/chat' );
270
271 // Functions
272 $onSentClickFn = "mwai_{$id}_onSendClick";
273 $addReplyFn = "mwai_{$id}_addReply";
274 $initChatBotFn = "mwai_{$id}_initChatBot";
275 $convertToHtmlFn = "mwai_{$id}_convertToHtml";
276
277 // UI Parameters
278 $aiName = addslashes( trim($atts['ai_name']) );
279 $userName = addslashes( trim($atts['user_name']) );
280 $sysName = addslashes( trim($atts['sys_name']) );
281 $context = addslashes( trim( $atts['context'] ) );
282 $textSend = addslashes( trim( $atts['text_send'] ) );
283 $textInputPlaceholder = addslashes( trim( $atts['text_input_placeholder'] ) );
284
285 // Chatbot System Parameters
286 $casuallyFineTuned = $atts['casually_fined_tuned'];
287 $promptEnding = addslashes( trim( $atts['prompt_ending'] ) );
288 $completionEnding = addslashes( trim( $atts['completion_ending'] ) );
289 if ( $casuallyFineTuned ) {
290 $promptEnding = "\\n\\n===\\n\\n";
291 $completionEnding = "\\n\\n";
292 }
293
294 // OpenAI Parameters
295 $model = $atts['model'];
296 $temperature = $atts['temperature'];
297 $maxTokens = $atts['max_tokens'];
298 $apiKey = $atts['api_key'];
299
300 $onGoingPrompt = "mwai_{$id}_onGoingPrompt";
301 ob_start();
302 ?>
303
304 <div id="mwai-chat-<?= $id ?>" class="mwai-chat">
305 <div class="mwai-conversation">
306 </div>
307 <div class="mwai-input">
308 <textarea rows="1" placeholder="<?= $textInputPlaceholder ?>"></textarea>
309 <button><span><?= $textSend ?></span></button>
310 </div>
311 </div>
312
313 <script>
314 var <?= $onGoingPrompt ?> = '<?= $context ?>' + '\n\n';
315
316 function <?= $convertToHtmlFn ?>(text) {
317 return text;
318 }
319
320 // Function to add a reply in the conversation
321 function <?= $addReplyFn ?>(text, type = 'user') {
322 var conversation = document.querySelector('#mwai-chat-<?= $id ?> .mwai-conversation');
323 text = <?= $convertToHtmlFn ?>(text);
324 var mwaiClasses = 'mwai-reply';
325 if (type === 'ai') {
326 mwaiClasses += ' mwai-ai';
327 }
328 else if (type === 'system') {
329 mwaiClasses += ' mwai-system';
330 }
331 else {
332 mwaiClasses += ' mwai-user';
333 }
334 var html = '<div class="' + mwaiClasses + '">';
335 if (type === 'ai') {
336 html += '<span class="mwai-name"><?= $aiName ?></span>';
337 }
338 else if (type === 'system') {
339 html += '<span class="mwai-name"><?= $sysName ?></span>';
340 }
341 else {
342 html += '<span class="mwai-name"><?= $userName ?></span>';
343 }
344 html += '<span class="mwai-text">' + text + '</span>';
345 html += '</div>';
346
347 conversation.innerHTML += html;
348 }
349
350 // Function to request the completion
351 function <?= $onSentClickFn ?>() {
352 let input = document.querySelector('#mwai-chat-<?= $id ?> .mwai-input textarea');
353 let inputText = input.value.trim();
354
355 if (inputText === '') {
356 return;
357 }
358
359 // Disable the button
360 var button = document.querySelector('#mwai-chat-<?= $id ?> .mwai-input button');
361 button.disabled = true;
362
363 // Add the user reply
364 <?= $addReplyFn ?>(inputText, 'user');
365 <?= $onGoingPrompt ?> += '<?= $userName ?>' + inputText + '\n';
366 input.value = '';
367 input.setAttribute('rows', 1);
368 input.disabled = true;
369
370 // Request the completion
371 <?= $onGoingPrompt ?> += '<?= $aiName ?>';
372
373 // Let's build the prompt depending on the system
374 // If it's fine tuned casually, we simply use the inputText with the promptEnding
375 // If it's not, we simply use the $onGoingPrompt
376 let prompt = <?= $onGoingPrompt ?>;
377 if (<?= $casuallyFineTuned ?>) {
378 prompt = inputText + '<?= $promptEnding ?>';
379 }
380
381 const data = {
382 prompt: prompt,
383 userName: '<?= $userName ?>',
384 aiName: '<?= $aiName ?>',
385 model: '<?= $model ?>',
386 temperature: '<?= $temperature ?>',
387 maxTokens: '<?= $maxTokens ?>',
388 stop: '<?= $completionEnding ?>',
389 apiKey: '<?= $apiKey ?>',
390 };
391 console.log('[BOT] Sent: ', data);
392 fetch('<?= $apiUrl ?>', { method: 'POST', headers: { 'Content-Type': 'application/json' },
393 body: JSON.stringify(data)
394 })
395 .then(response => response.json())
396 .then(data => {
397 console.log('[BOT] Recv: ', data);
398 if (!data.success) {
399 <?= $addReplyFn ?>(data.message, 'system');
400 }
401 else {
402 <?= $addReplyFn ?>(data.html, 'ai');
403 <?= $onGoingPrompt ?> += data.answer + '\n';
404 }
405 button.disabled = false;
406 input.disabled = false;
407 input.focus();
408 })
409 .catch(error => {
410 console.error(error);
411 button.disabled = false;
412 input.disabled = false;
413 });
414 }
415
416 function mwaiSetTextAreaHeight(textarea, lines) {
417 var rows = textarea.getAttribute('rows');
418 if (lines !== rows) {
419 textarea.setAttribute('rows', lines > 5 ? 5 : lines);
420 }
421 }
422
423 function <?= $initChatBotFn ?>() {
424 var input = document.querySelector('#mwai-chat-<?= $id ?> .mwai-input textarea');
425 input.addEventListener('keypress', (event) => {
426 if (event.keyCode === 13 && !event.shiftKey) {
427 <?= $onSentClickFn ?>();
428 }
429 });
430 input.addEventListener('keydown', (event) => {
431 var rows = input.getAttribute('rows');
432 if (event.keyCode === 13 && event.shiftKey) {
433 var lines = input.value.split('\n').length + 1;
434 mwaiSetTextAreaHeight(input, lines);
435 }
436 });
437 input.addEventListener('keyup', (event) => {
438 var rows = input.getAttribute('rows');
439 var lines = input.value.split('\n').length ;
440 mwaiSetTextAreaHeight(input, lines);
441 });
442 var button = document.querySelector('#mwai-chat-<?= $id ?> .mwai-input button');
443 button.addEventListener('click', (event) => {
444 <?= $onSentClickFn ?>();
445 });
446
447 <?= $addReplyFn ?>('<?= $atts['start_sentence'] ?>', 'ai');
448 }
449
450 <?= $initChatBotFn ?>();
451
452 </script>
453
454 <?php
455 $output = ob_get_contents();
456 ob_end_clean();
457 $output = apply_filters( 'mwai_chat_html', $output, $atts );
458 return $output;
459 }
460 }