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