PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 0.2.2
AI Engine – The Chatbot, AI Framework & MCP for WordPress v0.2.2
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 / imagesbot.php
ai-engine / classes / modules Last commit date
chatbot.php 3 years ago imagesbot.php 3 years ago statistics.php 3 years ago
imagesbot.php
378 lines
1 <?php
2
3 class Meow_MWAI_Modules_ImagesBot {
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_imagesbot', array( $this, 'imagesbot' ) );
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, '/imagesbot', array(
23 'methods' => 'POST',
24 'callback' => array( $this, 'rest_imagesbot' ),
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-imgbot-$id button {
39 position: relative;
40 }
41
42 #mwai-imgbot-$id button[disabled] span {
43 display: none;
44 }
45
46 #mwai-imgbot-$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-imgbot-$id {
81 background: #343541;
82 color: white;
83 font-size: 15px;
84 border-radius: 10px;
85 overflow: hidden;
86 }
87
88 #mwai-imgbot-$id .mwai-reply {
89 display: flex;
90 padding: 20px;
91 }
92
93 #mwai-imgbot-$id .mwai-actions div {
94 border: 1px solid #454654;
95 border-radius: 6px;
96 width: 26px;
97 height: 26px;
98 display: flex;
99 justify-content: center;
100 font-size: 14px;
101 align-items: center;
102 cursor: pointer;
103 }
104
105 #mwai-imgbot-$id .mwai-ai {
106 background: #454654;
107 }
108
109 #mwai-imgbot-$id .mwai-name {
110 color: #a0a0a0;
111 margin-right: 20px;
112 }
113
114 #mwai-imgbot-$id .mwai-text {
115 flex: auto;
116 }
117
118 #mwai-imgbot-$id .mwai-gallery {
119 display: grid;
120 grid-template-columns: repeat(3, 1fr);
121 grid-gap: 5px;
122 }
123
124 #mwai-imgbot-$id .mwai-gallery img {
125 width: 100%;
126 }
127
128 #mwai-imgbot-$id .mwai-text > *:first-child {
129 margin-top: 0;
130 }
131
132 #mwai-imgbot-$id .mwai-text > *:last-child {
133 margin-bottom: 0;
134 }
135
136 #mwai-imgbot-$id .mwai-input {
137 display: flex;
138 padding: 15px;
139 border-top: 1px solid #454654;
140 }
141
142 #mwai-imgbot-$id .mwai-input input {
143 background: #40414f;
144 color: white;
145 flex: auto;
146 height: 40px;
147 padding: 0px 15px;
148 border: none;
149 border-radius: 5px;
150 font-size: 15px;
151 }
152
153 #mwai-imgbot-$id .mwai-input input:focus {
154 outline: none;
155 }
156
157 #mwai-imgbot-$id .mwai-input button {
158 background: none;
159 color: white;
160 border: 1px solid #40414f;
161 margin-left: 15px;
162 width: 80px;
163 border-radius: 5px;
164 cursor: pointer;
165 }
166
167 #mwai-imgbot-$id .mwai-input button:hover {
168 background: #353640;
169 }
170
171 @media (max-width: 600px) {
172 #mwai-imgbot-$id .mwai-reply {
173 flex-direction: column;
174 }
175
176 #mwai-imgbot-$id .mwai-input {
177 flex-direction: column;
178 }
179
180 #mwai-imgbot-$id .mwai-input button {
181 margin: 15px 0 0 0;
182 height: 40px;
183 width: inherit;
184 }
185
186 #mwai-imgbot-$id .mwai-name {
187 margin-right: 0;
188 }
189 }
190 </style>
191 " . $html;
192 }
193
194 function rest_imagesbot( $request ) {
195 try {
196 $params = $request->get_json_params();
197 $prompt = $params['prompt'];
198 //$model = $params['model'];
199 $maxResults = $params['maxResults'];
200 $apiKey = $params['apiKey'];
201 $query = new Meow_MWAI_QueryImage( $prompt );
202 if ( $maxResults ) {
203 $query->setMaxResults( $maxResults );
204 }
205 if ( $apiKey ) {
206 $query->setApiKey( $apiKey );
207 }
208 $answer = $this->core->ai->run( $query );
209 return new WP_REST_Response([ 'success' => true, 'images' => $answer->results, 'usage' => $answer->usage ], 200 );
210 }
211 catch ( Exception $e ) {
212 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
213 }
214 }
215
216 function imagesbot( $atts ) {
217 $defaults = apply_filters( 'mwai_imagesbot_atts', [
218 'id' => uniqid(),
219 'ai_name' => "AI: ",
220 'user_name' => "You: ",
221 'sys_name' => "System: ",
222 'start_sentence' => "Hey there! Can you tell me what kind of images you need?",
223 'max_results' => 3,
224 'model' => 'dall-e',
225 'text_send' => 'Send',
226 'text_input_placeholder' => 'Type your message...',
227 'api_key' => ''
228 ] );
229 $atts = shortcode_atts( $defaults, $atts, 'mwai_chat_atts' );
230 $id = $atts['id'];
231 $apiUrl = get_rest_url( null, 'ai-engine/v1/imagesbot' );
232 $onSentClickFn = "mwai_{$id}_onSendClick";
233 $addReplyFn = "mwai_{$id}_addReply";
234 $convertToHtmlFn = "mwai_{$id}_convertToHtml";
235 $reuseFn = "mwai_{$id}_reuse";
236 $aiName = addslashes( trim($atts['ai_name']) );
237 $userName = addslashes( trim($atts['user_name']) );
238 $sysName = addslashes( trim($atts['sys_name']) );
239 $textSend = addslashes( trim( $atts['text_send'] ) );
240 $maxResults = $atts['max_results'];
241 $textInputPlaceholder = addslashes( trim( $atts['text_input_placeholder'] ) );
242 ob_start();
243 ?>
244
245 <div id="mwai-imgbot-<?= $id ?>" class="mwai-imgbot">
246 <div class="mwai-conversation">
247 </div>
248 <div class="mwai-input">
249 <input type="text" placeholder="<?= $textInputPlaceholder ?>" />
250 <button><span><?= $textSend ?></span></button>
251 </div>
252 </div>
253
254 <script>
255 function <?= $convertToHtmlFn ?>(text) {
256 return text;
257 }
258
259 // Function to add a reply in the conversation
260 function <?= $addReplyFn ?>(text, type = 'user') {
261 var conversation = document.querySelector('#mwai-imgbot-<?= $id ?> .mwai-conversation');
262
263 // If text is array, then it's image URLs. Let's create a simple gallery in HTML in $text.
264 if (Array.isArray(text)) {
265 var newText = '<div class="mwai-gallery">';
266 for (var i = 0; i < text.length; i++) {
267 newText += '<a href="' + text[i] + '" target="_blank"><img src="' + text[i] + '" />';
268 }
269 text = newText + '</div>';
270 }
271
272 text = <?= $convertToHtmlFn ?>(text);
273 var mwaiClasses = 'mwai-reply';
274 if (type === 'ai') {
275 mwaiClasses += ' mwai-ai';
276 }
277 else if (type === 'system') {
278 mwaiClasses += ' mwai-system';
279 }
280 else {
281 mwaiClasses += ' mwai-user';
282 }
283 var html = '<div class="' + mwaiClasses + '">';
284 if (type === 'ai') {
285 html += '<span class="mwai-name"><?= $aiName ?></span>';
286 }
287 else if (type === 'system') {
288 html += '<span class="mwai-name"><?= $sysName ?></span>';
289 }
290 else {
291 html += '<span class="mwai-name"><?= $userName ?></span>';
292 }
293 html += '<span class="mwai-text">' + text + '</span>';
294 if (type === 'user') {
295 html += '<div class="mwai-actions">';
296 text = encodeURIComponent(text);
297 html += '<div class="mwai-action-reuse" onclick="<?= $reuseFn ?>(\'' + text + '\')">📝</div>';
298 html += '</div>';
299 }
300 html += '</div>';
301 conversation.innerHTML += html;
302 }
303
304 function <?= $reuseFn ?>(text) {
305 text = decodeURIComponent(text);
306 let input = document.querySelector('#mwai-imgbot-<?= $id ?> .mwai-input input');
307 input.value = text;
308 }
309
310 // Function to request the completion
311 function <?= $onSentClickFn ?>() {
312 let input = document.querySelector('#mwai-imgbot-<?= $id ?> .mwai-input input');
313 let inputText = input.value.trim();
314 if (inputText === '') {
315 return;
316 }
317
318 // Disable the button
319 var button = document.querySelector('#mwai-imgbot-<?= $id ?> .mwai-input button');
320 button.disabled = true;
321
322 // Add the user reply
323 <?= $addReplyFn ?>(inputText, 'user');
324 input.value = '';
325 input.disabled = true;
326
327 // Request the completion
328 const data = {
329 prompt: inputText,
330 maxResults: <?= $maxResults ?>,
331 model: '<?= $atts['model'] ?>',
332 apiKey: '<?= $atts['api_key'] ?>',
333 };
334 console.log('[BOT] Sent: ', data);
335 fetch('<?= $apiUrl ?>', { method: 'POST', headers: { 'Content-Type': 'application/json' },
336 body: JSON.stringify(data)
337 })
338 .then(response => response.json())
339 .then(data => {
340 console.log('[BOT] Recv: ', data);
341 if (!data.success) {
342 <?= $addReplyFn ?>(data.message, 'system');
343 }
344 else {
345 <?= $addReplyFn ?>(data.images, 'ai');
346 }
347 button.disabled = false;
348 input.disabled = false;
349 })
350 .catch(error => {
351 console.error(error);
352 button.disabled = false;
353 input.disabled = false;
354 });
355 }
356
357 var input = document.querySelector('#mwai-imgbot-<?= $id ?> .mwai-input input');
358 input.addEventListener('keypress', (event) => {
359 if (event.keyCode === 13) {
360 <?= $onSentClickFn ?>();
361 }
362 });
363
364 var button = document.querySelector('#mwai-imgbot-<?= $id ?> .mwai-input button');
365 button.addEventListener('click', (event) => {
366 <?= $onSentClickFn ?>();
367 });
368
369 <?= $addReplyFn ?>('<?= $atts['start_sentence'] ?>', 'ai');
370 </script>
371
372 <?php
373 $output = ob_get_contents();
374 ob_end_clean();
375 $output = apply_filters( 'mwai_chat_html', $output, $atts );
376 return $output;
377 }
378 }