PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 1.6.5
AI Engine – The Chatbot, AI Framework & MCP for WordPress v1.6.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 / 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
232 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 }
47
48 public function basics_security_check( $params ) {
49 if ( empty( $params['newMessage'] ) ) {
50 return false;
51 }
52 if ( empty( $params['chatId'] ) ) {
53 return false;
54 }
55 $length = strlen( trim( $params['newMessage'] ) );
56 if ( $length < 1 || $length > ( 4096 - 512 ) ) {
57 return false;
58 }
59 return true;
60 }
61
62 public function rest_chat( $request ) {
63 try {
64 $params = $request->get_json_params();
65 if ( !$this->basics_security_check( $params )) {
66 return new WP_REST_Response( [
67 'success' => false,
68 'message' => 'Sorry, your query has been rejected.' ], 403
69 );
70 }
71 $chatbot = $this->core->getChatbot( $params['chatId'] );
72 if ( !$chatbot ) {
73 return new WP_REST_Response( [
74 'success' => false,
75 'message' => 'Sorry, your query has been rejected.' ], 403
76 );
77 }
78
79 // Create QueryText
80 $context = null;
81 if ( $chatbot['mode'] === 'images' ) {
82 $query = new Meow_MWAI_QueryImage( $params['newMessage'] );
83
84 // Handle Params
85 $newParams = [];
86 foreach ( $chatbot as $key => $value ) {
87 $newParams[$key] = $value;
88 }
89 foreach ( $params as $key => $value ) {
90 $newParams[$key] = $value;
91 }
92 $params = apply_filters( 'mwai_chatbot_params', $newParams );
93 $query->injectParams( $params );
94 }
95 else {
96 $query = new Meow_MWAI_QueryText( $params['newMessage'], 1024 );
97 $query->setIsChat( true );
98
99 // Handle Params
100 $newParams = [];
101 foreach ( $chatbot as $key => $value ) {
102 $newParams[$key] = $value;
103 }
104 foreach ( $params as $key => $value ) {
105 $newParams[$key] = $value;
106 }
107 $params = apply_filters( 'mwai_chatbot_params', $newParams );
108 $query->injectParams( $params );
109
110 // Takeover
111 $takeoverAnswer = apply_filters( 'mwai_chatbot_takeover', null, $query, $params );
112 if ( !empty( $takeoverAnswer ) ) {
113 return new WP_REST_Response( [ 'success' => true, 'answer' => $takeoverAnswer,
114 'html' => $takeoverAnswer, 'usage' => null ], 200 );
115 }
116
117 // Moderation
118 if ( $this->core->get_option( 'shortcode_chat_moderation' ) ) {
119 global $mwai;
120 $isFlagged = $mwai->moderationCheck( $query->prompt );
121 if ( $isFlagged ) {
122 return new WP_REST_Response( [
123 'success' => false,
124 'message' => 'Sorry, your message has been rejected by moderation.' ], 403
125 );
126 }
127 }
128
129 // Awareness & Embeddings
130 $embeddingsIndex = $params['embeddingsIndex'];
131 if ( $query->mode === 'chat' && !empty( $embeddingsIndex ) ) {
132 $context = apply_filters( 'mwai_context_search', $query, $embeddingsIndex );
133 if ( !empty( $context ) ) {
134 $content = $this->core->cleanSentences( $context['content'] );
135 $query->injectContext( $content );
136 }
137 }
138 }
139
140 // Query the AI
141 $answer = $this->core->ai->run( $query );
142 $rawText = $answer->result;
143 $extra = [];
144 if ( $context ) {
145 $extra = [ 'embeddings' => $context['embeddings'] ];
146 }
147 $html = apply_filters( 'mwai_chatbot_reply', $rawText, $query, $params, $extra );
148 if ( $this->core->get_option( 'shortcode_chat_formatting' ) ) {
149 $html = $this->core->markdown_to_html( $html );
150 }
151 return new WP_REST_Response( [
152 'success' => true,
153 'answer' => $rawText,
154 'images' => $chatbot['mode'] === 'images' ? $answer->results : null,
155 'html' => $html,
156 'usage' => $answer->usage
157 ], 200 );
158 }
159 catch ( Exception $e ) {
160 return new WP_REST_Response( [ 'success' => false, 'message' => $e->getMessage() ], 500 );
161 }
162 }
163
164 public function inject_chat() {
165 $params = $this->core->getChatbot( $this->siteWideChatId );
166 $cleanParams = [];
167 if ( !empty( $params ) ) {
168 $cleanParams['window'] = true;
169 $cleanParams['id'] = $this->siteWideChatId;
170 echo $this->chat( $cleanParams );
171 }
172 return null;
173 }
174
175 public function chat( $atts ) {
176 $chatId = isset( $atts['id'] ) ? $atts['id'] : 'default';
177 $chatbot = $this->core->getChatbot( $chatId );
178 if ( !$chatbot ) {
179 return "Chatbot not found.";
180 }
181 unset( $atts['id'] );
182
183 // Rename the keys of the atts into camelCase to match the internal params system.
184 $atts = array_map( function( $key, $value ) {
185 $key = str_replace( '_', ' ', $key );
186 $key = ucwords( $key );
187 $key = str_replace( ' ', '', $key );
188 $key = lcfirst( $key );
189 return [ $key => $value ];
190 }, array_keys( $atts ), $atts );
191 $atts = array_merge( ...$atts );
192
193 $frontParams = [];
194 foreach ( MWAI_CHATBOT_FRONT_PARAMS as $param ) {
195 if ( isset( $atts[$param] ) ) {
196 if ( $param === 'localMemory' ) {
197 // It's a boolean
198 $frontParams[$param] = $atts[$param] === 'true';
199 }
200 else {
201 $frontParams[$param] = $atts[$param];
202 }
203 }
204 else if ( isset( $chatbot[$param] ) ) {
205 $frontParams[$param] = $chatbot[$param];
206 }
207 }
208
209 $frontSystem = [
210 'chatId' => $chatId,
211 'userData' => $this->core->getUserData(),
212 'sessionId' => $this->core->get_session_id(),
213 'restNonce' => wp_create_nonce( 'wp_rest' ),
214 'contextId' => get_the_ID(),
215 'pluginUrl' => MWAI_URL,
216 'restUrl' => untrailingslashit( rest_url() ),
217 'debugMode' => $this->core->get_option( 'debug_mode' ),
218 'typewriter' => $this->core->get_option( 'shortcode_chat_typewriter' )
219 ];
220
221 $theme = isset( $frontParams['themeId'] ) ? $this->core->getTheme( $frontParams['themeId'] ) : null;
222 $jsonFrontParams = htmlspecialchars(json_encode($frontParams), ENT_QUOTES, 'UTF-8');
223 $jsonFrontSystem = htmlspecialchars(json_encode($frontSystem), ENT_QUOTES, 'UTF-8');
224 $jsonFrontTheme = htmlspecialchars(json_encode($theme), ENT_QUOTES, 'UTF-8');
225 $jsonAttributes = htmlspecialchars(json_encode($atts), ENT_QUOTES, 'UTF-8');
226
227 $this->enqueue_scripts();
228 return "<div class='mwai-chatbot-container' data-params='{$jsonFrontParams}' data-system='{$jsonFrontSystem}' data-theme='{$jsonFrontTheme}' data-atts='{$jsonAttributes}'></div>";
229 }
230
231 }
232