PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 0.2.5
AI Engine – The Chatbot, AI Framework & MCP for WordPress v0.2.5
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.php 3 years ago imagesbot.php 3 years ago statistics.php 3 years ago
chatbot.php
438 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 $query = new Meow_MWAI_QueryText( $prompt, 1024 );
219 if ( $model ) {
220 $query->setModel( $model );
221 }
222 if ( $temperature ) {
223 $query->setTemperature( $temperature );
224 }
225 if ( $maxTokens ) {
226 $query->setMaxTokens( $maxTokens );
227 }
228 if ( $apiKey ) {
229 $query->setApiKey( $apiKey );
230 }
231 $answer = $this->core->ai->run( $query );
232 $rawText = $answer->result;
233
234 $html = $this->core->markdown_to_html( $answer->result );
235 return new WP_REST_Response([ 'success' => true, 'answer' => $rawText, 'html' => $html, 'usage' => $answer->usage ], 200 );
236 }
237 catch ( Exception $e ) {
238 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
239 }
240 }
241
242 function chat( $atts ) {
243 $defaults = apply_filters( 'mwai_chat_atts', [
244 // UI Parameters
245 'id' => uniqid(),
246 'context' => "Converse as if you were an AI assistant. Be friendly, creative.",
247 'ai_name' => "AI: ",
248 'user_name' => "User: ",
249 'sys_name' => "System: ",
250 'start_sentence' => "Hi! How can I help you?",
251 'text_send' => 'Send',
252 'text_input_placeholder' => 'Type your message...',
253 // Chatbot System Parameters
254 'fineTuned' => 'false',
255 // AI Parameters
256 'model' => 'text-davinci-003',
257 'temperature' => 0.8,
258 'max_tokens' => 1024,
259 'api_key' => ''
260 ] );
261 $atts = shortcode_atts( $defaults, $atts, 'mwai_chat_atts' );
262 $id = $atts['id'];
263 $apiUrl = get_rest_url( null, 'ai-engine/v1/chat' );
264
265 // Functions
266 $onSentClickFn = "mwai_{$id}_onSendClick";
267 $addReplyFn = "mwai_{$id}_addReply";
268 $initChatBotFn = "mwai_{$id}_initChatBot";
269 $convertToHtmlFn = "mwai_{$id}_convertToHtml";
270
271 // UI Parameters
272 $aiName = addslashes( trim($atts['ai_name']) );
273 $userName = addslashes( trim($atts['user_name']) );
274 $sysName = addslashes( trim($atts['sys_name']) );
275 $context = addslashes( trim( $atts['context'] ) );
276 $textSend = addslashes( trim( $atts['text_send'] ) );
277 $textInputPlaceholder = addslashes( trim( $atts['text_input_placeholder'] ) );
278
279 // Chatbot System Parameters
280 $fineTuned = $atts['fineTuned'];
281
282 // OpenAI Parameters
283 $model = $atts['model'];
284 $temperature = $atts['temperature'];
285 $maxTokens = $atts['max_tokens'];
286 $apiKey = $atts['api_key'];
287
288 $onGoingPrompt = "mwai_{$id}_onGoingPrompt";
289 ob_start();
290 ?>
291
292 <div id="mwai-chat-<?= $id ?>" class="mwai-chat">
293 <div class="mwai-conversation">
294 </div>
295 <div class="mwai-input">
296 <textarea rows="1" placeholder="<?= $textInputPlaceholder ?>"></textarea>
297 <button><span><?= $textSend ?></span></button>
298 </div>
299 </div>
300
301 <script>
302 var <?= $onGoingPrompt ?> = '<?= $context ?>' + '\n\n';
303
304 function <?= $convertToHtmlFn ?>(text) {
305 return text;
306 }
307
308 // Function to add a reply in the conversation
309 function <?= $addReplyFn ?>(text, type = 'user') {
310 var conversation = document.querySelector('#mwai-chat-<?= $id ?> .mwai-conversation');
311 text = <?= $convertToHtmlFn ?>(text);
312 var mwaiClasses = 'mwai-reply';
313 if (type === 'ai') {
314 mwaiClasses += ' mwai-ai';
315 }
316 else if (type === 'system') {
317 mwaiClasses += ' mwai-system';
318 }
319 else {
320 mwaiClasses += ' mwai-user';
321 }
322 var html = '<div class="' + mwaiClasses + '">';
323 if (type === 'ai') {
324 html += '<span class="mwai-name"><?= $aiName ?></span>';
325 }
326 else if (type === 'system') {
327 html += '<span class="mwai-name"><?= $sysName ?></span>';
328 }
329 else {
330 html += '<span class="mwai-name"><?= $userName ?></span>';
331 }
332 html += '<span class="mwai-text">' + text + '</span>';
333 html += '</div>';
334
335 conversation.innerHTML += html;
336 }
337
338 // Function to request the completion
339 function <?= $onSentClickFn ?>() {
340 let input = document.querySelector('#mwai-chat-<?= $id ?> .mwai-input textarea');
341 let inputText = input.value.trim();
342
343 if (inputText === '') {
344 return;
345 }
346
347 // Disable the button
348 var button = document.querySelector('#mwai-chat-<?= $id ?> .mwai-input button');
349 button.disabled = true;
350
351 // Add the user reply
352 <?= $addReplyFn ?>(inputText, 'user');
353 <?= $onGoingPrompt ?> += '<?= $userName ?>' + inputText + '\n';
354 input.value = '';
355 input.setAttribute('rows', 1);
356 input.disabled = true;
357
358 // Request the completion
359 <?= $onGoingPrompt ?> += '<?= $aiName ?>';
360 const data = {
361 prompt: <?= $onGoingPrompt ?>,
362 userName: '<?= $userName ?>',
363 aiName: '<?= $aiName ?>',
364 model: '<?= $model ?>',
365 temperature: '<?= $temperature ?>',
366 maxTokens: '<?= $maxTokens ?>',
367 apiKey: '<?= $apiKey ?>',
368 };
369 console.log('[BOT] Sent: ', data);
370 fetch('<?= $apiUrl ?>', { method: 'POST', headers: { 'Content-Type': 'application/json' },
371 body: JSON.stringify(data)
372 })
373 .then(response => response.json())
374 .then(data => {
375 console.log('[BOT] Recv: ', data);
376 if (!data.success) {
377 <?= $addReplyFn ?>(data.message, 'system');
378 }
379 else {
380 <?= $addReplyFn ?>(data.html, 'ai');
381 <?= $onGoingPrompt ?> += data.answer + '\n';
382 }
383 button.disabled = false;
384 input.disabled = false;
385 input.focus();
386 })
387 .catch(error => {
388 console.error(error);
389 button.disabled = false;
390 input.disabled = false;
391 });
392 }
393
394 function mwaiSetTextAreaHeight(textarea, lines) {
395 var rows = textarea.getAttribute('rows');
396 if (lines !== rows) {
397 textarea.setAttribute('rows', lines > 5 ? 5 : lines);
398 }
399 }
400
401 function <?= $initChatBotFn ?>() {
402 var input = document.querySelector('#mwai-chat-<?= $id ?> .mwai-input textarea');
403 input.addEventListener('keypress', (event) => {
404 if (event.keyCode === 13 && !event.shiftKey) {
405 <?= $onSentClickFn ?>();
406 }
407 });
408 input.addEventListener('keydown', (event) => {
409 var rows = input.getAttribute('rows');
410 if (event.keyCode === 13 && event.shiftKey) {
411 var lines = input.value.split('\n').length + 1;
412 mwaiSetTextAreaHeight(input, lines);
413 }
414 });
415 input.addEventListener('keyup', (event) => {
416 var rows = input.getAttribute('rows');
417 var lines = input.value.split('\n').length ;
418 mwaiSetTextAreaHeight(input, lines);
419 });
420 var button = document.querySelector('#mwai-chat-<?= $id ?> .mwai-input button');
421 button.addEventListener('click', (event) => {
422 <?= $onSentClickFn ?>();
423 });
424
425 <?= $addReplyFn ?>('<?= $atts['start_sentence'] ?>', 'ai');
426 }
427
428 <?= $initChatBotFn ?>();
429
430 </script>
431
432 <?php
433 $output = ob_get_contents();
434 ob_end_clean();
435 $output = apply_filters( 'mwai_chat_html', $output, $atts );
436 return $output;
437 }
438 }