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