PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 0.1.7
AI Engine – The Chatbot, AI Framework & MCP for WordPress v0.1.7
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 / shortcodes.php
ai-engine / classes Last commit date
admin.php 3 years ago ai.php 3 years ago answer.php 3 years ago core.php 3 years ago init.php 3 years ago query.php 3 years ago rest.php 3 years ago shortcodes.php 3 years ago ui.php 3 years ago
shortcodes.php
349 lines
1 <?php
2
3 class Meow_MWAI_Shortcodes {
4 private $core = null;
5 private $namespace = 'ai-engine/v1';
6
7 public function __construct( $core ) {
8 $this->core = $core;
9 add_shortcode( 'mwai_chat', array( $this, 'chat' ) );
10 add_action( 'rest_api_init', array( $this, 'rest_api_init' ) );
11
12 // If we apply ChatGPT styles
13 add_filter( 'mwai_chat_html', array( $this, 'chatgpt_style' ), 10, 2 );
14 add_filter( 'mwai_chat_html', array( $this, 'spinner_style' ), 10, 2 );
15 }
16
17 function rest_api_init() {
18 try {
19 register_rest_route( $this->namespace, '/chat', array(
20 'methods' => 'POST',
21 'callback' => array( $this, 'rest_chat' ),
22 'permission_callback' => '__return_true'
23 ) );
24 }
25 catch ( Exception $e ) {
26 var_dump( $e );
27 }
28 }
29
30 function spinner_style( $html, $atts ) {
31 // If needed, we can use the $id to apply styles
32 $id = $atts['id']; // This could be replace by the ID of a specific chatbot
33 return "
34 <style>
35 #mwai-chat-$id button {
36 position: relative;
37 }
38
39 #mwai-chat-$id button[disabled] span {
40 display: none;
41 }
42
43 #mwai-chat-$id button[disabled]::after {
44 content: '';
45 position: absolute;
46 width: 18px;
47 height: 18px;
48 top: 0;
49 left: 0;
50 right: 0;
51 bottom: 0;
52 margin: auto;
53 border: 3px solid transparent;
54 border-top-color: #ffffff;
55 border-radius: 50%;
56 animation: mwai-button-spinner 1s ease infinite;
57 }
58
59 @keyframes mwai-button-spinner {
60 from {
61 transform: rotate(0turn);
62 }
63
64 to {
65 transform: rotate(1turn);
66 }
67 }
68 </style>
69 " . $html;
70 }
71
72 function chatgpt_style( $html, $atts ) {
73 // If needed, we can use the $id to apply styles
74 $id = $atts['id']; // This could be replace by the ID of a specific chatbot
75 return "
76 <style>
77 #mwai-chat-$id {
78 background: #343541;
79 color: white;
80 font-size: 15px;
81 }
82
83 #mwai-chat-$id ol {
84 padding: 0;
85 margin: 0 0 0 20px;
86 }
87
88 #mwai-chat-$id .mwai-reply {
89 display: flex;
90 }
91
92 #mwai-chat-$id .mwai-user, #mwai-chat-$id .mwai-ai {
93 padding: 20px;
94 }
95
96 #mwai-chat-$id .mwai-ai {
97 background: #454654;
98 }
99
100 #mwai-chat-$id .mwai-user-name, #mwai-chat-$id .mwai-ai-name {
101 color: #a0a0a0;
102 margin-right: 5px;
103 min-width: 80px;
104 }
105
106 #mwai-chat-$id .mwai-input {
107 display: flex;
108 padding: 15px;
109 }
110
111 #mwai-chat-$id .mwai-input input {
112 background: #40414f;
113 color: white;
114 flex: auto;
115 padding: 15px;
116 border: none;
117 border-radius: 5px;
118 font-size: 15px;
119 }
120
121 #mwai-chat-$id .mwai-input button {
122 background: none;
123 color: white;
124 border: 1px solid #40414f;
125 margin-left: 15px;
126 width: 80px;
127 border-radius: 5px;
128 cursor: pointer;
129 }
130 </style>
131 " . $html;
132 }
133
134 function rest_chat( $request ) {
135 try {
136 $params = $request->get_json_params();
137 $prompt = $params['prompt'];
138 $model = $params['model'];
139 $temperature = $params['temperature'];
140 $apiKey = $params['apiKey'];
141 $query = new Meow_MWAI_Query( $prompt, 1024 );
142 if ( $model ) {
143 $query->setModel( $model );
144 }
145 if ( $temperature ) {
146 $query->setTemperature( $temperature );
147 }
148 if ( $apiKey ) {
149 $query->setApiKey( $apiKey );
150 }
151 $answer = $this->core->ai->run( $query );
152 return new WP_REST_Response([ 'success' => true, 'data' => $answer->result, 'usage' => $answer->usage ], 200 );
153 }
154 catch ( Exception $e ) {
155 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
156 }
157 }
158
159 function chat( $atts ) {
160 $defaults = apply_filters( 'mwai_chat_atts', [
161 'id' => uniqid(),
162 'context' => "Converse as if you were an AI assistant. Be friendly, creative.",
163 'ai_name' => "AI: ",
164 'user_name' => "You: ",
165 'sys_name' => "System: ",
166 'start_sentence' => "Hi! How can I help you?",
167 'model' => 'text-davinci-003',
168 'temperature' => 0.8,
169 'api_key' => ''
170 ] );
171 $atts = shortcode_atts( $defaults, $atts, 'meow_ai' );
172 $id = $atts['id'];
173 $apiUrl = get_rest_url( null, 'ai-engine/v1/chat' );
174 $onSentClickFn = "mwai_{$id}_onSendClick";
175 $addReplyFn = "mwai_{$id}_addReply";
176 $convertToHtmlFn = "mwai_{$id}_convertToHtml";
177 $aiName = trim($atts['ai_name']);
178 $userName = trim($atts['user_name']);
179 ob_start();
180 ?>
181
182 <div id="mwai-chat-<?= $id ?>" class="mwai-chat">
183 <div class="mwai-conversation">
184 </div>
185 <div class="mwai-input">
186 <input type="text" placeholder="Type your message here..." />
187 <button><span>Send</span></button>
188 </div>
189 </div>
190
191 <script>
192 function <?= $convertToHtmlFn ?>(text) {
193 // Split the input text into an array of lines
194 const lines = text.split('\n');
195
196 // Initialize an empty array to store the HTML
197 const html = [];
198
199 // Initialize a variable to keep track of the current list type (none, bullet, or numbered)
200 let listType = 'none';
201
202 // Iterate over the lines
203 for (const line of lines) {
204 // Check if the line is a bullet point
205 if (line.startsWith('*')) {
206 // If the current list type is not a bullet point, start a new bullet point list
207 if (listType !== 'bullet') {
208 html.push('<ul>');
209 listType = 'bullet';
210 }
211 // Add the bullet point to the HTML
212 html.push(`<li>${line.substring(1).trim()}</li>`);
213 }
214 // Check if the line is a numbered list item
215 else if (line.match(/^\d+\./)) {
216 // If the current list type is not a numbered list, start a new numbered list
217 if (listType !== 'numbered') {
218 html.push('<ol>');
219 listType = 'numbered';
220 }
221 // Add the numbered list item to the HTML
222 html.push(`<li>${line.substring(line.indexOf('.') + 1).trim()}</li>`);
223 }
224 // Otherwise, the line is not part of a list
225 else {
226 // If the current list type is not "none", close the current list
227 if (listType !== 'none') {
228 html.push(listType === 'bullet' ? '</ul>' : '</ol>');
229 listType = 'none';
230 }
231
232 // console.log('AI PROMPT: ', '|<?= $aiName ?>|');
233 // console.log('USER PROMPT: ', '|<?= $userName ?>|');
234 // console.log(line);
235
236 if (line.trim() === '') {
237 continue;
238 }
239 // If the line starts with the AI or user prompt, replace it with a span with the appropriate class
240 else if (line.startsWith('<?= $aiName ?>')) {
241 html.push(`<span class="mwai-ai-name"><?= $aiName ?> </span><span>${line.substring('<?= $aiName ?>'.length).trim()}</span>`);
242 }
243 else if (line.startsWith('<?= $userName ?>')) {
244 html.push(`<span class="mwai-user-name"><?= $userName ?> </span><span>${line.substring('<?= $userName ?>'.length).trim()}</span>`);
245 }
246 else {
247 // Otherwise, add the line as a paragraph to the HTML
248 console.log("We have something here...");
249 html.push(`<span>${line.trim()}</span>`);
250 }
251 }
252 }
253
254 // If the current list type is not "none", close the current list
255 if (listType !== 'none') {
256 html.push(listType === 'bullet' ? '</ul>' : '</ol>');
257 }
258
259 // Join the HTML array into a single string and return it
260 return html.join('');
261 }
262
263 // Function to add a reply in the conversation
264 function <?= $addReplyFn ?>(text, type = 'user') {
265 var conversation = document.querySelector('#mwai-chat-<?= $id ?> .mwai-conversation');
266 text = <?= $convertToHtmlFn ?>(text);
267 if (type === 'ai') {
268 conversation.innerHTML += '<div class="mwai-reply mwai-ai">' + text + '</div>';
269 }
270 else if (type === 'system') {
271 conversation.innerHTML += '<div class="mwai-reply mwai-system">' + text + '</div>';
272 }
273 else {
274 conversation.innerHTML += '<div class="mwai-reply mwai-user">' + text + '</div>';
275 }
276 }
277
278 // Function to request the completion
279 function <?= $onSentClickFn ?>() {
280 let input = document.querySelector('#mwai-chat-<?= $id ?> .mwai-input input');
281 let inputText = input.value.trim();
282
283 if (inputText === '') {
284 return;
285 }
286
287 // Disable the button
288 var button = document.querySelector('#mwai-chat-<?= $id ?> .mwai-input button');
289 button.disabled = true;
290
291 // Add the user reply
292 <?= $addReplyFn ?>('<?= $userName ?>' + inputText, 'user');
293 input.value = '';
294 input.disabled = true;
295
296 // Request the completion and add the reply
297 var conversation = document.querySelector('#mwai-chat-<?= $id ?> .mwai-conversation');
298 var promptToUse = '<?= $atts['context'] ?>' + '\n\n' + conversation.innerText + '\n';
299 const data = {
300 prompt: promptToUse,
301 model: '<?= $atts['model'] ?>',
302 temperature: '<?= $atts['temperature'] ?>',
303 apiKey: '<?= $atts['api_key'] ?>',
304 };
305 console.log('Sent: ', data);
306 fetch('<?= $apiUrl ?>', { method: 'POST', headers: { 'Content-Type': 'application/json' },
307 body: JSON.stringify(data)
308 })
309 .then(response => response.json())
310 .then(data => {
311 console.log('Received: ', data);
312 if (!data.success) {
313 <?= $addReplyFn ?>('<?= $atts['sys_name'] ?>' + data.message, 'system');
314 }
315 else {
316 <?= $addReplyFn ?>(data.data, 'ai');
317 }
318 button.disabled = false;
319 input.disabled = false;
320 })
321 .catch(error => {
322 console.error(error);
323 button.disabled = false;
324 input.disabled = false;
325 });
326 }
327
328 var input = document.querySelector('#mwai-chat-<?= $id ?> .mwai-input input');
329 input.addEventListener('keypress', (event) => {
330 if (event.keyCode === 13) {
331 <?= $onSentClickFn ?>();
332 }
333 });
334
335 var button = document.querySelector('#mwai-chat-<?= $id ?> .mwai-input button');
336 button.addEventListener('click', (event) => {
337 <?= $onSentClickFn ?>();
338 });
339
340 <?= $addReplyFn ?>('<?= $aiName ?>' + '<?= $atts['start_sentence'] ?>', 'ai');
341 </script>
342
343 <?php
344 $output = ob_get_contents();
345 ob_end_clean();
346 $output = apply_filters( 'mwai_chat_html', $output, $atts );
347 return $output;
348 }
349 }