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