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