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