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