PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 1.9.84
AI Engine – The Chatbot, AI Framework & MCP for WordPress v1.9.84
3.5.8 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 / discussions.php
ai-engine / classes / modules Last commit date
assistants.php 3 years ago chatbot.php 2 years ago chatbot_legacy.php 2 years ago discussions.php 2 years ago security.php 3 years ago
discussions.php
289 lines
1 <?php
2
3 class Meow_MWAI_Modules_Discussions {
4 private $wpdb = null;
5 private $core = null;
6 private $table_chats = null;
7 private $db_check = false;
8 private $namespace_admin = 'mwai/v1';
9 private $namespace_ui = 'mwai-ui/v1';
10
11 public function __construct() {
12 global $wpdb;
13 global $mwai_core;
14 $this->core = $mwai_core;
15 $this->wpdb = $wpdb;
16 $this->table_chats = $wpdb->prefix . 'mwai_chats';
17
18 if ( $this->core->get_option( 'shortcode_chat_discussions' ) ) {
19 add_filter( 'mwai_chatbot_reply', [ $this, 'chatbot_reply' ], 10, 4 );
20 add_action( 'rest_api_init', [ $this, 'rest_api_init' ] );
21 }
22 }
23
24 public function rest_api_init() {
25
26 // Admin
27 register_rest_route( $this->namespace_admin, '/discussions/list', [
28 'methods' => 'POST',
29 'callback' => [ $this, 'rest_discussions_list' ],
30 'permission_callback' => [ $this->core, 'can_access_settings' ],
31 ] );
32 register_rest_route( $this->namespace_admin, '/discussions/delete', [
33 'methods' => 'POST',
34 'callback' => [ $this, 'rest_discussions_delete' ],
35 'permission_callback' => [ $this->core, 'can_access_settings' ],
36 ] );
37
38 // UI
39 register_rest_route( $this->namespace_ui, '/discussions/list', [
40 'methods' => 'POST',
41 'callback' => [ $this, 'rest_discussions_ui_list' ],
42 'permission_callback' => '__return_true'
43 ] );
44 }
45
46 function rest_discussions_list( $request ) {
47 try {
48 $params = $request->get_json_params();
49 $offset = $params['offset'];
50 $limit = $params['limit'];
51 $filters = $params['filters'];
52 $sort = $params['sort'];
53 $chats = $this->chats_query( [], $offset, $limit, $filters, $sort );
54 return new WP_REST_Response([ 'success' => true, 'total' => $chats['total'], 'chats' => $chats['rows'] ], 200 );
55 }
56 catch ( Exception $e ) {
57 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
58 }
59 }
60
61 function rest_discussions_ui_list( $request ) {
62 try {
63 $params = $request->get_json_params();
64 $offset = isset( $params['offset'] ) ? $params['offset'] : 0;
65 $limit = isset( $params['limit'] ) ? $params['limit'] : 10;
66 $botId = isset( $params['botId'] ) ? $params['botId'] : null;
67
68 if ( is_null( $botId ) ) {
69 return new WP_REST_Response([ 'success' => false, 'message' => "Bot ID is required." ], 200 );
70 }
71
72 $userId = get_current_user_id();
73 if ( !$userId ) {
74 return new WP_REST_Response([ 'success' => false, 'message' => "You need to be connected." ], 200 );
75 }
76 $filters = [
77 [ 'accessor' => 'user', 'value' => $userId ],
78 [ 'accessor' => 'botId', 'value' => $botId ],
79 ];
80 $chats = $this->chats_query( [], $offset, $limit, $filters );
81 return new WP_REST_Response([ 'success' => true, 'total' => $chats['total'], 'chats' => $chats['rows'] ], 200 );
82 }
83 catch ( Exception $e ) {
84 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
85 }
86 }
87
88 function rest_discussions_delete( $request ) {
89 try {
90 $params = $request->get_json_params();
91 $chatsIds = $params['chatIds'];
92 if ( is_array( $chatsIds ) ) {
93 if ( count( $chatsIds ) === 0 ) {
94 $this->wpdb->query( "TRUNCATE TABLE $this->table_chats" );
95 }
96 foreach( $chatsIds as $chatId ) {
97 $this->wpdb->delete( $this->table_chats, [ 'chatId' => $chatId ] );
98 }
99 }
100 return new WP_REST_Response([ 'success' => true ], 200 );
101 }
102 catch ( Exception $e ) {
103 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
104 }
105 }
106
107 // Get latest discussion for the given parameter
108 function get_discussion( $botId, $chatId ) {
109 $this->check_db();
110 $chat = $this->wpdb->get_row( $this->wpdb->prepare( "SELECT *
111 FROM $this->table_chats
112 WHERE chatId = %s AND botId = %s", $chatId, $botId
113 ) );
114 if ( $chat ) {
115 $chat->messages = json_decode( $chat->messages );
116 return $chat;
117 }
118 return null;
119 }
120
121 function chats_query( $chats = [], $offset = 0, $limit = null, $filters = null, $sort = null ) {
122 $this->check_db();
123 $offset = !empty( $offset ) ? intval( $offset ) : 0;
124 $limit = !empty( $limit ) ? intval( $limit ) : 5;
125 $filters = !empty( $filters ) ? $filters : [];
126 $sort = !empty( $sort ) ? $sort : [ 'accessor' => 'updated', 'by' => 'desc' ];
127 $query = "SELECT * FROM $this->table_chats";
128
129 // Filters
130 if ( is_array( $filters ) ) {
131 $where = array();
132 foreach ( $filters as $filter ) {
133 if ( $filter['accessor'] === 'user' ) {
134 $value = esc_sql( $filter['value'] );
135 if ( is_null( $value ) || $value === '' ) {
136 continue;
137 }
138 $isIP = filter_var( $value, FILTER_VALIDATE_IP );
139 if ( $isIP ) {
140 $where[] = "ip = '{$value}'";
141 }
142 else {
143 $where[] = "userId = '{$value}'";
144 }
145 }
146 if ( $filter['accessor'] === 'botId' ) {
147 $value = esc_sql( $filter['value'] );
148 if ( is_null( $value ) || $value === '' ) {
149 continue;
150 }
151 $where[] = "botId = '{$value}'";
152 }
153 if ( $filter['accessor'] === 'preview' ) {
154 $value = $filter['value'];
155 if ( empty( $value ) ) {
156 continue;
157 }
158 $where[] = "messages LIKE '%{$value}%'";
159 }
160 }
161 if ( count( $where ) > 0 ) {
162 $query .= " WHERE " . implode( " AND ", $where );
163 }
164 }
165
166 // Count based on this query
167 $chats['total'] = $this->wpdb->get_var( "SELECT COUNT(*) FROM ($query) AS t" );
168
169 // Order by
170 $query .= " ORDER BY " . esc_sql( $sort['accessor'] ) . " " . esc_sql( $sort['by'] );
171
172 // Limits
173 if ( $limit > 0 ) {
174 $query .= " LIMIT $offset, $limit";
175 }
176
177 $chats['rows'] = $this->wpdb->get_results( $query, ARRAY_A );
178 return $chats;
179 }
180
181 function chatbot_reply( $rawText, $query, $params, $extra ) {
182 global $mwai_core;
183 $userIp = $mwai_core->get_ip_address();
184 $userId = $mwai_core->get_user_id();
185 $botId = isset( $params['botId'] ) ? $params['botId'] : null;
186 $chatId = isset( $params['chatId'] ) ? $params['chatId'] : $query->session;
187 $newMessage = isset( $params['newMessage'] ) ? $params['newMessage'] : $query->prompt;
188 //$chatId = hash( 'sha256', $userIp . $userId . $clientChatId );
189 $this->check_db();
190 $chat = $this->wpdb->get_row( $this->wpdb->prepare( "SELECT * FROM $this->table_chats WHERE chatId = %s", $chatId ) );
191 $extra = [
192 'embeddings' => isset( $extra['embeddings'] ) ? $extra['embeddings'] : null
193 ];
194 if ( $chat ) {
195 $chat->messages = json_decode( $chat->messages );
196 $chat->messages[] = [
197 'role' => 'user',
198 'content' => $newMessage
199 ];
200 $chat->messages[] = [
201 'role' => 'assistant',
202 'content' => $rawText,
203 'extra' => $extra
204 ];
205 $chat->messages = json_encode( $chat->messages );
206 $this->wpdb->update( $this->table_chats, [
207 'userId' => $userId,
208 'messages' => $chat->messages,
209 'updated' => date( 'Y-m-d H:i:s' )
210 ], [ 'id' => $chat->id ] );
211 }
212 else {
213 $chat = [
214 'userId' => $userId,
215 'ip' => $userIp,
216 'messages' => json_encode( [
217 [
218 'role' => 'user',
219 'content' => $newMessage
220 ],
221 [
222 'role' => 'assistant',
223 'content' => $rawText,
224 'extra' => $extra
225 ]
226 ] ),
227 'extra' => json_encode( [
228 'session' => $query->session,
229 'model' => $query->model,
230 'temperature' => $query->temperature,
231 'context' => $query->context,
232 ] ),
233 'botId' => $botId,
234 'chatId' => $chatId,
235 'created' => date( 'Y-m-d H:i:s' ),
236 'updated' => date( 'Y-m-d H:i:s' )
237 ];
238 $this->wpdb->insert( $this->table_chats, $chat );
239 }
240 return $rawText;
241 }
242
243 function check_db() {
244 if ( $this->db_check ) {
245 return true;
246 }
247 $this->db_check = !( strtolower(
248 $this->wpdb->get_var( "SHOW TABLES LIKE '$this->table_chats'" ) ) != strtolower( $this->table_chats )
249 );
250 if ( !$this->db_check ) {
251 $this->create_db();
252 $this->db_check = !( strtolower(
253 $this->wpdb->get_var( "SHOW TABLES LIKE '$this->table_chats'" ) ) != strtolower( $this->table_chats )
254 );
255 }
256
257 // LATER: REMOVE THIS AFTER SEPTEMBER 2023
258 // Make sure the column "userId" and "ip "exist in the $this->table_chats table
259 $this->db_check = $this->db_check && $this->wpdb->get_var( "SHOW COLUMNS FROM $this->table_chats LIKE 'userId'" );
260 if ( !$this->db_check ) {
261 $this->wpdb->query( "ALTER TABLE $this->table_chats ADD COLUMN userId BIGINT(20) NULL" );
262 $this->wpdb->query( "ALTER TABLE $this->table_chats ADD COLUMN ip VARCHAR(64) NULL" );
263 $this->wpdb->query( "ALTER TABLE $this->table_chats ADD COLUMN botId VARCHAR(64) NULL" );
264 $this->db_check = true;
265 }
266
267 return $this->db_check;
268 }
269
270 function create_db() {
271 $charset_collate = $this->wpdb->get_charset_collate();
272 $sqlLogs = "CREATE TABLE $this->table_chats (
273 id BIGINT(20) NOT NULL AUTO_INCREMENT,
274 userId BIGINT(20) NULL,
275 ip VARCHAR(64) NULL,
276 messages TEXT NOT NULL NULL,
277 extra TEXT NOT NULL NULL,
278 botId VARCHAR(64) NULL,
279 chatId VARCHAR(64) NOT NULL,
280 created DATETIME NOT NULL,
281 updated DATETIME NOT NULL,
282 PRIMARY KEY (id),
283 INDEX chatId (chatId)
284 ) $charset_collate;";
285 require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
286 dbDelta( $sqlLogs );
287 }
288
289 }