PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 0.2.2
AI Engine – The Chatbot, AI Framework & MCP for WordPress v0.2.2
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
383 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 a {
89 color: #2196f3;
90 }
91
92 #mwai-chat-$id h2 {
93 font-size: 24px;
94 }
95
96 #mwai-chat-$id h3 {
97 font-size: 18px;
98 }
99
100 #mwai-chat-$id h4 {
101 font-size: 16px;
102 }
103
104 #mwai-chat-$id pre {
105 background: black;
106 color: white;
107 border-radius: 10px;
108 padding: 10px 15px;
109 break-after: auto;
110 font-size: 14px;
111 }
112
113 #mwai-chat-$id ol {
114 padding: 0;
115 margin: 0 0 0 20px;
116 }
117
118 #mwai-chat-$id .mwai-reply {
119 display: flex;
120 padding: 20px;
121 }
122
123 #mwai-chat-$id .mwai-ai {
124 background: #454654;
125 }
126
127 #mwai-chat-$id .mwai-name {
128 color: #a0a0a0;
129 margin-right: 20px;
130 }
131
132 #mwai-chat-$id .mwai-text {
133 flex: auto;
134 }
135
136 #mwai-chat-$id .mwai-text > *:first-child {
137 margin-top: 0;
138 }
139
140 #mwai-chat-$id .mwai-text > *:last-child {
141 margin-bottom: 0;
142 }
143
144 #mwai-chat-$id .mwai-input {
145 display: flex;
146 padding: 15px;
147 border-top: 1px solid #454654;
148 }
149
150 #mwai-chat-$id .mwai-input input {
151 background: #40414f;
152 color: white;
153 flex: auto;
154 height: 40px;
155 padding: 0px 15px;
156 border: none;
157 border-radius: 5px;
158 font-size: 15px;
159 }
160
161 #mwai-chat-$id .mwai-input input:focus {
162 outline: none;
163 }
164
165 #mwai-chat-$id .mwai-input button {
166 background: none;
167 color: white;
168 border: 1px solid #40414f;
169 margin-left: 15px;
170 width: 80px;
171 border-radius: 5px;
172 cursor: pointer;
173 }
174
175 #mwai-chat-$id .mwai-input button:hover {
176 background: #353640;
177 }
178
179 @media (max-width: 600px) {
180 #mwai-chat-$id .mwai-reply {
181 flex-direction: column;
182 }
183
184 #mwai-chat-$id .mwai-input {
185 flex-direction: column;
186 }
187
188 #mwai-chat-$id .mwai-input button {
189 margin: 15px 0 0 0;
190 height: 40px;
191 width: inherit;
192 }
193
194 #mwai-chat-$id .mwai-name {
195 margin-right: 0;
196 }
197 }
198 </style>
199 " . $html;
200 }
201
202 function rest_chat( $request ) {
203 try {
204 $params = $request->get_json_params();
205 $prompt = $params['prompt'];
206 $model = $params['model'];
207 $userName = $params['userName'];
208 $aiName = $params['aiName'];
209 $temperature = $params['temperature'];
210 $apiKey = $params['apiKey'];
211 $query = new Meow_MWAI_QueryText( $prompt, 1024 );
212 if ( $model ) {
213 $query->setModel( $model );
214 }
215 if ( $temperature ) {
216 $query->setTemperature( $temperature );
217 }
218 if ( $apiKey ) {
219 $query->setApiKey( $apiKey );
220 }
221 $answer = $this->core->ai->run( $query );
222 $rawText = $answer->result;
223
224 $html = $this->core->markdown_to_html( $answer->result );
225 return new WP_REST_Response([ 'success' => true, 'answer' => $rawText, 'html' => $html, 'usage' => $answer->usage ], 200 );
226 }
227 catch ( Exception $e ) {
228 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
229 }
230 }
231
232 function chat( $atts ) {
233 $defaults = apply_filters( 'mwai_chat_atts', [
234 'id' => uniqid(),
235 'context' => "Converse as if you were an AI assistant. Be friendly, creative.",
236 'ai_name' => "AI: ",
237 'user_name' => "User: ",
238 'sys_name' => "System: ",
239 'start_sentence' => "Hi! How can I help you?",
240 'model' => 'text-davinci-003',
241 'temperature' => 0.8,
242 'text_send' => 'Send',
243 'text_input_placeholder' => 'Type your message...',
244 'api_key' => ''
245 ] );
246 $atts = shortcode_atts( $defaults, $atts, 'mwai_chat_atts' );
247 $id = $atts['id'];
248 $apiUrl = get_rest_url( null, 'ai-engine/v1/chat' );
249 $onSentClickFn = "mwai_{$id}_onSendClick";
250 $addReplyFn = "mwai_{$id}_addReply";
251 $convertToHtmlFn = "mwai_{$id}_convertToHtml";
252 $aiName = addslashes( trim($atts['ai_name']) );
253 $userName = addslashes( trim($atts['user_name']) );
254 $sysName = addslashes( trim($atts['sys_name']) );
255 $context = addslashes( trim( $atts['context'] ) );
256 $textSend = addslashes( trim( $atts['text_send'] ) );
257 $textInputPlaceholder = addslashes( trim( $atts['text_input_placeholder'] ) );
258 $onGoingPrompt = "mwai_{$id}_onGoingPrompt";
259 ob_start();
260 ?>
261
262 <div id="mwai-chat-<?= $id ?>" class="mwai-chat">
263 <div class="mwai-conversation">
264 </div>
265 <div class="mwai-input">
266 <input type="text" placeholder="<?= $textInputPlaceholder ?>" />
267 <button><span><?= $textSend ?></span></button>
268 </div>
269 </div>
270
271 <script>
272 var <?= $onGoingPrompt ?> = '<?= $context ?>' + '\n\n';
273
274 function <?= $convertToHtmlFn ?>(text) {
275 return text;
276 }
277
278 // Function to add a reply in the conversation
279 function <?= $addReplyFn ?>(text, type = 'user') {
280 var conversation = document.querySelector('#mwai-chat-<?= $id ?> .mwai-conversation');
281 text = <?= $convertToHtmlFn ?>(text);
282 var mwaiClasses = 'mwai-reply';
283 if (type === 'ai') {
284 mwaiClasses += ' mwai-ai';
285 }
286 else if (type === 'system') {
287 mwaiClasses += ' mwai-system';
288 }
289 else {
290 mwaiClasses += ' mwai-user';
291 }
292 var html = '<div class="' + mwaiClasses + '">';
293 if (type === 'ai') {
294 html += '<span class="mwai-name"><?= $aiName ?></span>';
295 }
296 else if (type === 'system') {
297 html += '<span class="mwai-name"><?= $sysName ?></span>';
298 }
299 else {
300 html += '<span class="mwai-name"><?= $userName ?></span>';
301 }
302 html += '<span class="mwai-text">' + text + '</span>';
303 html += '</div>';
304
305 conversation.innerHTML += html;
306 }
307
308 // Function to request the completion
309 function <?= $onSentClickFn ?>() {
310 let input = document.querySelector('#mwai-chat-<?= $id ?> .mwai-input input');
311 let inputText = input.value.trim();
312
313 if (inputText === '') {
314 return;
315 }
316
317 // Disable the button
318 var button = document.querySelector('#mwai-chat-<?= $id ?> .mwai-input button');
319 button.disabled = true;
320
321 // Add the user reply
322 <?= $addReplyFn ?>(inputText, 'user');
323 <?= $onGoingPrompt ?> += '<?= $userName ?>' + inputText + '\n';
324 input.value = '';
325 input.disabled = true;
326
327 // Request the completion
328 <?= $onGoingPrompt ?> += '<?= $aiName ?>';
329 const data = {
330 prompt: <?= $onGoingPrompt ?>,
331 userName: '<?= $userName ?>',
332 aiName: '<?= $aiName ?>',
333 model: '<?= $atts['model'] ?>',
334 temperature: '<?= $atts['temperature'] ?>',
335 apiKey: '<?= $atts['api_key'] ?>',
336 };
337 console.log('[BOT] Sent: ', data);
338 fetch('<?= $apiUrl ?>', { method: 'POST', headers: { 'Content-Type': 'application/json' },
339 body: JSON.stringify(data)
340 })
341 .then(response => response.json())
342 .then(data => {
343 console.log('[BOT] Recv: ', data);
344 if (!data.success) {
345 <?= $addReplyFn ?>(data.message, 'system');
346 }
347 else {
348 <?= $addReplyFn ?>(data.html, 'ai');
349 <?= $onGoingPrompt ?> += data.answer + '\n';
350 }
351 button.disabled = false;
352 input.disabled = false;
353 input.focus();
354 })
355 .catch(error => {
356 console.error(error);
357 button.disabled = false;
358 input.disabled = false;
359 });
360 }
361
362 var input = document.querySelector('#mwai-chat-<?= $id ?> .mwai-input input');
363 input.addEventListener('keypress', (event) => {
364 if (event.keyCode === 13) {
365 <?= $onSentClickFn ?>();
366 }
367 });
368
369 var button = document.querySelector('#mwai-chat-<?= $id ?> .mwai-input button');
370 button.addEventListener('click', (event) => {
371 <?= $onSentClickFn ?>();
372 });
373
374 <?= $addReplyFn ?>('<?= $atts['start_sentence'] ?>', 'ai');
375 </script>
376
377 <?php
378 $output = ob_get_contents();
379 ob_end_clean();
380 $output = apply_filters( 'mwai_chat_html', $output, $atts );
381 return $output;
382 }
383 }