PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 1.6.85
AI Engine – The Chatbot, AI Framework & MCP for WordPress v1.6.85
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 3 years ago chatbot_legacy.php 3 years ago discussions.php 3 years ago security.php 3 years ago
discussions.php
268 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 = $params['offset'];
65 $limit = $params['limit'];
66 $botId = $params['botId'];
67 $userId = get_current_user_id();
68 if ( !$userId ) {
69 return new WP_REST_Response([ 'success' => false, 'message' => "You need to be connected." ], 200 );
70 }
71 $filters = [
72 [ 'accessor' => 'user', 'value' => $userId ],
73 [ 'accessor' => 'botId', 'value' => $botId ],
74 ];
75 $chats = $this->chats_query( [], $offset, $limit, $filters );
76 return new WP_REST_Response([ 'success' => true, 'total' => $chats['total'], 'chats' => $chats['rows'] ], 200 );
77 }
78 catch ( Exception $e ) {
79 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
80 }
81 }
82
83 function rest_discussions_delete( $request ) {
84 try {
85 $params = $request->get_json_params();
86 $chatsIds = $params['chatIds'];
87 if ( is_array( $chatsIds ) ) {
88 if ( count( $chatsIds ) === 0 ) {
89 $this->wpdb->query( "TRUNCATE TABLE $this->table_chats" );
90 }
91 foreach( $chatsIds as $chatId ) {
92 $this->wpdb->delete( $this->table_chats, [ 'chatId' => $chatId ] );
93 }
94 }
95 return new WP_REST_Response([ 'success' => true ], 200 );
96 }
97 catch ( Exception $e ) {
98 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
99 }
100 }
101
102 function chats_query( $chats = [], $offset = 0, $limit = null, $filters = null, $sort = null ) {
103 $this->check_db();
104 $offset = !empty( $offset ) ? intval( $offset ) : 0;
105 $limit = !empty( $limit ) ? intval( $limit ) : 5;
106 $filters = !empty( $filters ) ? $filters : [];
107 $sort = !empty( $sort ) ? $sort : [ 'accessor' => 'updated', 'by' => 'desc' ];
108 $query = "SELECT * FROM $this->table_chats";
109
110 // Filters
111 if ( is_array( $filters ) ) {
112 $where = array();
113 foreach ( $filters as $filter ) {
114 if ( $filter['accessor'] === 'user' ) {
115 $value = esc_sql( $filter['value'] );
116 if ( is_null( $value ) || $value === '' ) {
117 continue;
118 }
119 $isIP = filter_var( $value, FILTER_VALIDATE_IP );
120 if ( $isIP ) {
121 $where[] = "ip = '{$value}'";
122 }
123 else {
124 $where[] = "userId = '{$value}'";
125 }
126 }
127 if ( $filter['accessor'] === 'botId' ) {
128 $value = esc_sql( $filter['value'] );
129 if ( is_null( $value ) || $value === '' ) {
130 continue;
131 }
132 $where[] = "botId = '{$value}'";
133 }
134 if ( $filter['accessor'] === 'preview' ) {
135 $value = $filter['value'];
136 if ( empty( $value ) ) {
137 continue;
138 }
139 $where[] = "messages LIKE '%{$value}%'";
140 }
141 }
142 if ( count( $where ) > 0 ) {
143 $query .= " WHERE " . implode( " AND ", $where );
144 }
145 }
146
147 // Count based on this query
148 $chats['total'] = $this->wpdb->get_var( "SELECT COUNT(*) FROM ($query) AS t" );
149
150 // Order by
151 $query .= " ORDER BY " . esc_sql( $sort['accessor'] ) . " " . esc_sql( $sort['by'] );
152
153 // Limits
154 if ( $limit > 0 ) {
155 $query .= " LIMIT $offset, $limit";
156 }
157
158 $chats['rows'] = $this->wpdb->get_results( $query, ARRAY_A );
159 return $chats;
160 }
161
162 function chatbot_reply( $rawText, $query, $params, $extra ) {
163 global $mwai_core;
164 $userIp = $mwai_core->get_ip_address();
165 $userId = $mwai_core->get_user_id();
166 $botId = isset( $params['botId'] ) ? $params['botId'] : null;
167 $chatId = isset( $params['clientId'] ) ? $params['clientId'] : $query->session;
168 //$chatId = hash( 'sha256', $userIp . $userId . $clientChatId );
169 $this->check_db();
170 $chat = $this->wpdb->get_row( $this->wpdb->prepare( "SELECT * FROM $this->table_chats WHERE chatId = %s", $chatId ) );
171 $extra = [
172 'embeddings' => isset( $extra['embeddings'] ) ? $extra['embeddings'] : null
173 ];
174 if ( $chat ) {
175 $chat->messages = json_decode( $chat->messages );
176 $chat->messages[] = [
177 'role' => 'user',
178 'content' => $params['newMessage']
179 ];
180 $chat->messages[] = [
181 'role' => 'assistant',
182 'content' => $rawText,
183 'extra' => $extra
184 ];
185 $chat->messages = json_encode( $chat->messages );
186 $this->wpdb->update( $this->table_chats, [
187 'messages' => $chat->messages,
188 'updated' => date( 'Y-m-d H:i:s' )
189 ], [ 'id' => $chat->id ] );
190 }
191 else {
192 $chat = [
193 'userId' => $userId,
194 'ip' => $userIp,
195 'messages' => json_encode( [
196 [
197 'role' => 'user',
198 'content' => $params['newMessage']
199 ],
200 [
201 'role' => 'assistant',
202 'content' => $rawText,
203 'extra' => $extra
204 ]
205 ] ),
206 'extra' => json_encode( [
207 'session' => $query->session,
208 'model' => $query->model,
209 'temperature' => $query->temperature,
210 'context' => $query->context,
211 ] ),
212 'botId' => $botId,
213 'chatId' => $chatId,
214 'created' => date( 'Y-m-d H:i:s' ),
215 'updated' => date( 'Y-m-d H:i:s' )
216 ];
217 $this->wpdb->insert( $this->table_chats, $chat );
218 }
219 return $rawText;
220 }
221
222 function check_db() {
223 if ( $this->db_check ) {
224 return true;
225 }
226 $this->db_check = !( strtolower(
227 $this->wpdb->get_var( "SHOW TABLES LIKE '$this->table_chats'" ) ) != strtolower( $this->table_chats )
228 );
229 if ( !$this->db_check ) {
230 $this->create_db();
231 $this->db_check = !( strtolower(
232 $this->wpdb->get_var( "SHOW TABLES LIKE '$this->table_chats'" ) ) != strtolower( $this->table_chats )
233 );
234 }
235
236 // LATER: REMOVE THIS AFTER SEPTEMBER 2023
237 // Make sure the column "userId" and "ip "exist in the $this->table_chats table
238 $this->db_check = $this->db_check && $this->wpdb->get_var( "SHOW COLUMNS FROM $this->table_chats LIKE 'userId'" );
239 if ( !$this->db_check ) {
240 $this->wpdb->query( "ALTER TABLE $this->table_chats ADD COLUMN userId BIGINT(20) NULL" );
241 $this->wpdb->query( "ALTER TABLE $this->table_chats ADD COLUMN ip VARCHAR(64) NULL" );
242 $this->wpdb->query( "ALTER TABLE $this->table_chats ADD COLUMN botId VARCHAR(64) NULL" );
243 $this->db_check = true;
244 }
245
246 return $this->db_check;
247 }
248
249 function create_db() {
250 $charset_collate = $this->wpdb->get_charset_collate();
251 $sqlLogs = "CREATE TABLE $this->table_chats (
252 id BIGINT(20) NOT NULL AUTO_INCREMENT,
253 userId BIGINT(20) NULL,
254 ip VARCHAR(64) NULL,
255 messages TEXT NOT NULL NULL,
256 extra TEXT NOT NULL NULL,
257 botId VARCHAR(64) NULL,
258 chatId VARCHAR(64) NOT NULL,
259 created DATETIME NOT NULL,
260 updated DATETIME NOT NULL,
261 PRIMARY KEY (id),
262 INDEX chatId (chatId)
263 ) $charset_collate;";
264 require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
265 dbDelta( $sqlLogs );
266 }
267
268 }