PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 1.6.0
AI Engine – The Chatbot, AI Framework & MCP for WordPress v1.6.0
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 / chatbot.php
ai-engine / classes / modules Last commit date
assistants.php 3 years ago chatbot.php 3 years ago chatbot_legacy.php 3 years ago chatbot_logs.php 3 years ago discussions.php 3 years ago
chatbot.php
233 lines
1 <?php
2
3 define( 'MWAI_CHATBOT_FRONT_PARAMS', [ 'aiName', 'userName', 'guestName', 'textSend', 'textClear',
4 'textInputPlaceholder', 'textInputMaxLength', 'textCompliance', 'startSentence', 'localMemory',
5 'themeId', 'window', 'icon', 'iconText', 'iconAlt', 'iconPosition', 'fullscreen', 'copyButton'
6 ] );
7
8 class Meow_MWAI_Modules_Chatbot {
9 private $core = null;
10 private $namespace = 'mwai-bot/v1';
11 private $siteWideChatId = null;
12
13 public function __construct() {
14 global $mwai_core;
15 $this->core = $mwai_core;
16 add_shortcode( 'mwai_chatbot_v2', array( $this, 'chat' ) );
17 add_action( 'rest_api_init', array( $this, 'rest_api_init' ) );
18 $this->siteWideChatId = $this->core->get_option( 'chatId' );
19 add_action( 'wp_enqueue_scripts', array( $this, 'register_scripts' ) );
20 }
21
22 public function register_scripts() {
23 wp_register_script( 'mwai_highlight', MWAI_URL . 'vendor/highlightjs/highlight.min.js', [], '11.7', false );
24 $physical_file = MWAI_PATH . '/app/chatbot.js';
25 $cache_buster = file_exists( $physical_file ) ? filemtime( $physical_file ) : MWAI_VERSION;
26 wp_register_script( 'mwai_chatbot', MWAI_URL . '/app/chatbot.js', [ 'wp-element' ], $cache_buster, false );
27 if ( !empty( $this->siteWideChatId ) && $this->siteWideChatId !== 'none' ) {
28 $this->enqueue_scripts();
29 add_action( 'wp_footer', array( $this, 'inject_chat' ) );
30 }
31 }
32
33 public function enqueue_scripts() {
34 wp_enqueue_script( "mwai_chatbot" );
35 if ( $this->core->get_option( 'shortcode_chat_syntax_highlighting' ) ) {
36 wp_enqueue_script( "mwai_highlight" );
37 }
38 }
39
40 public function rest_api_init() {
41 register_rest_route( $this->namespace, '/chat', array(
42 'methods' => 'POST',
43 'callback' => array( $this, 'rest_chat' ),
44 'permission_callback' => '__return_true'
45 ) );
46 register_rest_route( $this->namespace, '/images', array(
47 'methods' => 'POST',
48 'callback' => array( $this, 'rest_images' ),
49 'permission_callback' => '__return_true'
50 ) );
51 }
52
53 public function basics_security_check( $params ) {
54 if ( empty( $params['newMessage'] ) ) {
55 return false;
56 }
57 if ( empty( $params['chatId'] ) ) {
58 return false;
59 }
60 $length = strlen( trim( $params['newMessage'] ) );
61 if ( $length < 1 || $length > ( 4096 - 512 ) ) {
62 return false;
63 }
64 return true;
65 }
66
67 public function rest_chat( $request ) {
68 try {
69 $params = $request->get_json_params();
70 if ( !$this->basics_security_check( $params )) {
71 return new WP_REST_Response( [
72 'success' => false,
73 'message' => 'Sorry, your query has been rejected.' ], 403
74 );
75 }
76 $chatbot = $this->core->getChatbot( $params['chatId'] );
77 if ( !$chatbot ) {
78 return new WP_REST_Response( [
79 'success' => false,
80 'message' => 'Sorry, your query has been rejected.' ], 403
81 );
82 }
83
84 // Create QueryText
85 $query = new Meow_MWAI_QueryText( $params['newMessage'], 1024 );
86 $query->setIsChat( true );
87
88 // Handle Params
89 $newParams = [];
90 foreach ( $chatbot as $key => $value ) {
91 $newParams[$key] = $value;
92 }
93 foreach ( $params as $key => $value ) {
94 $newParams[$key] = $value;
95 }
96 $params = apply_filters( 'mwai_chatbot_params', $newParams );
97 $query->injectParams( $params );
98
99 // Takeover
100 $takeoverAnswer = apply_filters( 'mwai_chatbot_takeover', null, $query, $params );
101 if ( !empty( $takeoverAnswer ) ) {
102 return new WP_REST_Response( [ 'success' => true, 'answer' => $takeoverAnswer,
103 'html' => $takeoverAnswer, 'usage' => null ], 200 );
104 }
105
106 // Moderation
107 if ( $this->core->get_option( 'shortcode_chat_moderation' ) ) {
108 global $mwai;
109 $isFlagged = $mwai->moderationCheck( $query->prompt );
110 if ( $isFlagged ) {
111 return new WP_REST_Response( [
112 'success' => false,
113 'message' => 'Sorry, your message has been rejected by moderation.' ], 403
114 );
115 }
116 }
117
118 // Awareness & Embeddings
119 $context = null;
120 $embeddingsIndex = $params['embeddingsIndex'];
121 if ( $query->mode === 'chat' && !empty( $embeddingsIndex ) ) {
122 $context = apply_filters( 'mwai_context_search', $query, $embeddingsIndex );
123 if ( !empty( $context ) ) {
124 $content = $this->core->cleanSentences( $context['content'] );
125 $query->injectContext( $content );
126 }
127 }
128
129 // Query the AI
130 $answer = $this->core->ai->run( $query );
131 $rawText = $answer->result;
132 $extra = [];
133 if ( $context ) {
134 $extra = [ 'embeddings' => $context['embeddings'] ];
135 }
136 $html = apply_filters( 'mwai_chatbot_reply', $rawText, $query, $params, $extra );
137 if ( $this->core->get_option( 'shortcode_chat_formatting' ) ) {
138 $html = $this->core->markdown_to_html( $html );
139 }
140 return new WP_REST_Response( [ 'success' => true, 'answer' => $rawText,
141 'html' => $html, 'usage' => $answer->usage ], 200 );
142 }
143 catch ( Exception $e ) {
144 return new WP_REST_Response( [ 'success' => false, 'message' => $e->getMessage() ], 500 );
145 }
146 }
147
148 public function rest_images( $request ) {
149 try {
150 $params = $request->get_json_params();
151 $query = new Meow_MWAI_QueryImage( $params['prompt'] );
152 $query->injectParams( $params );
153 $answer = $this->core->ai->run( $query );
154 return new WP_REST_Response( [ 'success' => true, 'images' => $answer->results, 'usage' => $answer->usage ], 200 );
155 }
156 catch ( Exception $e ) {
157 return new WP_REST_Response( [ 'success' => false, 'message' => $e->getMessage() ], 500 );
158 }
159 }
160
161 public function inject_chat() {
162 $params = $this->core->getChatbot( $this->siteWideChatId );
163 if ( !empty( $params ) ) {
164 $params['window'] = true;
165 $params['id'] = $this->siteWideChatId;
166 echo $this->chat( $params );
167 }
168 return null;
169 }
170
171 public function imageschat( $atts ) {
172 $atts['mode'] = 'images';
173 return $this->chat( $atts );
174 }
175
176 public function chat( $atts ) {
177 $chatId = isset( $atts['id'] ) ? $atts['id'] : 'default';
178 $chatbot = $this->core->getChatbot( $chatId );
179 if ( !$chatbot ) {
180 return "Chatbot not found.";
181 }
182 unset( $atts['id'] );
183
184 // Rename the keys of the atts into camelCase to match the internal params system.
185 $atts = array_map( function( $key, $value ) {
186 $key = str_replace( '_', ' ', $key );
187 $key = ucwords( $key );
188 $key = str_replace( ' ', '', $key );
189 $key = lcfirst( $key );
190 return [ $key => $value ];
191 }, array_keys( $atts ), $atts );
192 $atts = array_merge( ...$atts );
193
194 $frontParams = [];
195 foreach ( MWAI_CHATBOT_FRONT_PARAMS as $param ) {
196 if ( isset( $atts[$param] ) ) {
197 if ( $param === 'localMemory' ) {
198 // It's a boolean
199 $frontParams[$param] = $atts[$param] === 'true';
200 }
201 else {
202 $frontParams[$param] = $atts[$param];
203 }
204 }
205 else if ( isset( $chatbot[$param] ) ) {
206 $frontParams[$param] = $chatbot[$param];
207 }
208 }
209
210 $frontSystem = [
211 'chatId' => $chatId,
212 'userData' => $this->core->getUserData(),
213 'sessionId' => $this->core->get_session_id(),
214 'restNonce' => wp_create_nonce( 'wp_rest' ),
215 'contextId' => get_the_ID(),
216 'pluginUrl' => MWAI_URL,
217 'restUrl' => untrailingslashit( rest_url() ),
218 'debugMode' => $this->core->get_option( 'debug_mode' ),
219 'typewriter' => $this->core->get_option( 'shortcode_chat_typewriter' )
220 ];
221
222 $theme = isset( $frontParams['themeId'] ) ? $this->core->getTheme( $frontParams['themeId'] ) : null;
223 $jsonFrontParams = htmlspecialchars(json_encode($frontParams), ENT_QUOTES, 'UTF-8');
224 $jsonFrontSystem = htmlspecialchars(json_encode($frontSystem), ENT_QUOTES, 'UTF-8');
225 $jsonFrontTheme = htmlspecialchars(json_encode($theme), ENT_QUOTES, 'UTF-8');
226 $jsonAttributes = htmlspecialchars(json_encode($atts), ENT_QUOTES, 'UTF-8');
227
228 $this->enqueue_scripts();
229 return "<div class='mwai-chatbot-container' data-params='{$jsonFrontParams}' data-system='{$jsonFrontSystem}' data-theme='{$jsonFrontTheme}' data-atts='{$jsonAttributes}'></div>";
230 }
231
232 }
233