PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 0.1.5
AI Engine – The Chatbot, AI Framework & MCP for WordPress v0.1.5
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
306 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 $apiKey = $params['apiKey'];
98 $query = new Meow_MWAI_Query( $prompt, 1024 );
99 if ( $model ) {
100 $query->setModel( $model );
101 }
102 if ( $temperature ) {
103 $query->setTemperature( $temperature );
104 }
105 if ( $apiKey ) {
106 $query->setApiKey( $apiKey );
107 }
108 $answer = $this->core->ai->run( $query );
109 return new WP_REST_Response([ 'success' => true, 'data' => $answer->result, 'usage' => $answer->usage ], 200 );
110 }
111 catch ( Exception $e ) {
112 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
113 }
114 }
115
116 function chat( $atts ) {
117 $defaults = apply_filters( 'mwai_chat_atts', [
118 'id' => uniqid(),
119 'context' => "Converse as if you were an AI assistant. Be friendly, creative.",
120 'ai_name' => "AI: ",
121 'user_name' => "You: ",
122 'sys_name' => "System: ",
123 'start_sentence' => "Hi! How can I help you?",
124 'model' => 'text-davinci-003',
125 'temperature' => 0.8,
126 'api_key' => ''
127 ] );
128 $atts = shortcode_atts( $defaults, $atts, 'meow_ai' );
129 $id = $atts['id'];
130 $apiUrl = get_rest_url( null, 'ai-engine/v1/chat' );
131 $onSentClickFn = "mwai_{$id}_onSendClick";
132 $addReplyFn = "mwai_{$id}_addReply";
133 $convertToHtmlFn = "mwai_{$id}_convertToHtml";
134 $aiName = trim($atts['ai_name']);
135 $userName = trim($atts['user_name']);
136 ob_start();
137 ?>
138
139 <div id="mwai-chat-<?= $id ?>" class="mwai-chat">
140 <div class="mwai-conversation">
141 </div>
142 <div class="mwai-input">
143 <input type="text" placeholder="Type your message here..." />
144 <button>Send</button>
145 </div>
146 </div>
147
148 <script>
149 function <?= $convertToHtmlFn ?>(text) {
150 // Split the input text into an array of lines
151 const lines = text.split('\n');
152
153 // Initialize an empty array to store the HTML
154 const html = [];
155
156 // Initialize a variable to keep track of the current list type (none, bullet, or numbered)
157 let listType = 'none';
158
159 // Iterate over the lines
160 for (const line of lines) {
161 // Check if the line is a bullet point
162 if (line.startsWith('*')) {
163 // If the current list type is not a bullet point, start a new bullet point list
164 if (listType !== 'bullet') {
165 html.push('<ul>');
166 listType = 'bullet';
167 }
168 // Add the bullet point to the HTML
169 html.push(`<li>${line.substring(1).trim()}</li>`);
170 }
171 // Check if the line is a numbered list item
172 else if (line.match(/^\d+\./)) {
173 // If the current list type is not a numbered list, start a new numbered list
174 if (listType !== 'numbered') {
175 html.push('<ol>');
176 listType = 'numbered';
177 }
178 // Add the numbered list item to the HTML
179 html.push(`<li>${line.substring(line.indexOf('.') + 1).trim()}</li>`);
180 }
181 // Otherwise, the line is not part of a list
182 else {
183 // If the current list type is not "none", close the current list
184 if (listType !== 'none') {
185 html.push(listType === 'bullet' ? '</ul>' : '</ol>');
186 listType = 'none';
187 }
188
189 // console.log('AI PROMPT: ', '|<?= $aiName ?>|');
190 // console.log('USER PROMPT: ', '|<?= $userName ?>|');
191 // console.log(line);
192
193 if (line.trim() === '') {
194 continue;
195 }
196 // If the line starts with the AI or user prompt, replace it with a span with the appropriate class
197 else if (line.startsWith('<?= $aiName ?>')) {
198 html.push(`<span class="mwai-ai-name"><?= $aiName ?> </span><span>${line.substring('<?= $aiName ?>'.length).trim()}</span>`);
199 }
200 else if (line.startsWith('<?= $userName ?>')) {
201 html.push(`<span class="mwai-user-name"><?= $userName ?> </span><span>${line.substring('<?= $userName ?>'.length).trim()}</span>`);
202 }
203 else {
204 // Otherwise, add the line as a paragraph to the HTML
205 console.log("We have something here...");
206 html.push(`<span>${line.trim()}</span>`);
207 }
208 }
209 }
210
211 // If the current list type is not "none", close the current list
212 if (listType !== 'none') {
213 html.push(listType === 'bullet' ? '</ul>' : '</ol>');
214 }
215
216 // Join the HTML array into a single string and return it
217 return html.join('');
218 }
219
220 // Function to add a reply in the conversation
221 function <?= $addReplyFn ?>(text, type = 'user') {
222 var conversation = document.querySelector('#mwai-chat-<?= $id ?> .mwai-conversation');
223 text = <?= $convertToHtmlFn ?>(text);
224 if (type === 'ai') {
225 conversation.innerHTML += '<div class="mwai-reply mwai-ai">' + text + '</div>';
226 }
227 else if (type === 'system') {
228 conversation.innerHTML += '<div class="mwai-reply mwai-system">' + text + '</div>';
229 }
230 else {
231 conversation.innerHTML += '<div class="mwai-reply mwai-user">' + text + '</div>';
232 }
233 }
234
235 // Function to request the completion
236 function <?= $onSentClickFn ?>() {
237 let input = document.querySelector('#mwai-chat-<?= $id ?> .mwai-input input');
238 let inputText = input.value.trim();
239
240 if (inputText === '') {
241 return;
242 }
243
244 // Disable the button
245 var button = document.querySelector('#mwai-chat-<?= $id ?> .mwai-input button');
246 button.disabled = true;
247
248 // Add the user reply
249 <?= $addReplyFn ?>('<?= $userName ?>' + inputText, 'user');
250 input.value = '';
251 input.disabled = true;
252
253 // Request the completion and add the reply
254 var conversation = document.querySelector('#mwai-chat-<?= $id ?> .mwai-conversation');
255 var promptToUse = '<?= $atts['context'] ?>' + '\n\n' + conversation.innerText + '\n';
256 const data = {
257 prompt: promptToUse,
258 model: '<?= $atts['model'] ?>',
259 temperature: '<?= $atts['temperature'] ?>',
260 apiKey: '<?= $atts['api_key'] ?>',
261 };
262 console.log('Sent: ', data);
263 fetch('<?= $apiUrl ?>', { method: 'POST', headers: { 'Content-Type': 'application/json' },
264 body: JSON.stringify(data)
265 })
266 .then(response => response.json())
267 .then(data => {
268 console.log('Received: ', data);
269 if (!data.success) {
270 <?= $addReplyFn ?>('<?= $atts['sys_name'] ?>' + data.message, 'system');
271 }
272 else {
273 <?= $addReplyFn ?>(data.data, 'ai');
274 }
275 button.disabled = false;
276 input.disabled = false;
277 })
278 .catch(error => {
279 console.error(error);
280 button.disabled = false;
281 input.disabled = false;
282 });
283 }
284
285 var input = document.querySelector('#mwai-chat-<?= $id ?> .mwai-input input');
286 input.addEventListener('keypress', (event) => {
287 if (event.keyCode === 13) {
288 <?= $onSentClickFn ?>();
289 }
290 });
291
292 var button = document.querySelector('#mwai-chat-<?= $id ?> .mwai-input button');
293 button.addEventListener('click', (event) => {
294 <?= $onSentClickFn ?>();
295 });
296
297 <?= $addReplyFn ?>('<?= $aiName ?>' + '<?= $atts['start_sentence'] ?>', 'ai');
298 </script>
299
300 <?php
301 $output = ob_get_contents();
302 ob_end_clean();
303 $output = apply_filters( 'mwai_chat_html', $output, $atts );
304 return $output;
305 }
306 }