ai.php
336 lines
| 1 | <?php |
| 2 | |
| 3 | class Meow_MWAI_Rest_AI extends Meow_MWAI_Rest_Base { |
| 4 | public function register_routes() { |
| 5 | register_rest_route( $this->namespace, '/ai/models', [ |
| 6 | 'methods' => 'POST', |
| 7 | 'callback' => [ $this, 'rest_ai_models' ], |
| 8 | 'permission_callback' => [ $this->core, 'check_rest_nonce' ] |
| 9 | ] ); |
| 10 | register_rest_route( $this->namespace, '/ai/completions', [ |
| 11 | 'methods' => 'POST', |
| 12 | 'callback' => [ $this, 'rest_ai_completions' ], |
| 13 | 'permission_callback' => [ $this->core, 'check_rest_nonce' ] |
| 14 | ] ); |
| 15 | register_rest_route( $this->namespace, '/ai/images', [ |
| 16 | 'methods' => 'POST', |
| 17 | 'callback' => [ $this, 'rest_ai_images' ], |
| 18 | 'permission_callback' => [ $this->core, 'check_rest_nonce' ] |
| 19 | ] ); |
| 20 | register_rest_route( $this->namespace, '/ai/image_edit', [ |
| 21 | 'methods' => 'POST', |
| 22 | 'callback' => [ $this, 'rest_ai_image_edit' ], |
| 23 | 'permission_callback' => [ $this->core, 'check_rest_nonce' ] |
| 24 | ] ); |
| 25 | register_rest_route( $this->namespace, '/ai/copilot', [ |
| 26 | 'methods' => 'POST', |
| 27 | 'callback' => [ $this, 'rest_ai_copilot' ], |
| 28 | 'permission_callback' => [ $this->core, 'check_rest_nonce' ] |
| 29 | ] ); |
| 30 | |
| 31 | register_rest_route( $this->namespace, '/ai/magic_wand', [ |
| 32 | 'methods' => 'POST', |
| 33 | 'callback' => [ $this, 'rest_ai_magic_wand' ], |
| 34 | 'permission_callback' => [ $this->core, 'check_rest_nonce' ] |
| 35 | ] ); |
| 36 | register_rest_route( $this->namespace, '/ai/moderate', [ |
| 37 | 'methods' => 'POST', |
| 38 | 'callback' => [ $this, 'rest_ai_moderate' ], |
| 39 | 'permission_callback' => [ $this->core, 'check_rest_nonce' ] |
| 40 | ] ); |
| 41 | register_rest_route( $this->namespace, '/ai/transcribe_audio', [ |
| 42 | 'methods' => 'POST', |
| 43 | 'callback' => [ $this, 'rest_ai_transcribe_audio' ], |
| 44 | 'permission_callback' => [ $this->core, 'check_rest_nonce' ] |
| 45 | ] ); |
| 46 | register_rest_route( $this->namespace, '/ai/transcribe_image', [ |
| 47 | 'methods' => 'POST', |
| 48 | 'callback' => [ $this, 'rest_ai_transcribe_image' ], |
| 49 | 'permission_callback' => [ $this->core, 'check_rest_nonce' ] |
| 50 | ] ); |
| 51 | register_rest_route( $this->namespace, '/ai/json', [ |
| 52 | 'methods' => 'POST', |
| 53 | 'callback' => [ $this, 'rest_ai_json' ], |
| 54 | 'permission_callback' => [ $this->core, 'check_rest_nonce' ] |
| 55 | ] ); |
| 56 | } |
| 57 | |
| 58 | public function rest_ai_models( $request ) { |
| 59 | try { |
| 60 | $params = $request->get_json_params(); |
| 61 | $envId = $params['envId']; |
| 62 | $query = new Meow_MWAI_Query_Text( '', 4096 ); |
| 63 | $query->envId = $envId; |
| 64 | $models = $this->core->get_engine_models( $query ); |
| 65 | return $this->create_rest_response( [ 'success' => true, 'models' => $models ], 200 ); |
| 66 | } |
| 67 | catch ( Exception $e ) { |
| 68 | return $this->create_rest_response( [ 'success' => false, 'message' => $e->getMessage() ], 500 ); |
| 69 | } |
| 70 | } |
| 71 | |
| 72 | public function rest_ai_completions( $request ) { |
| 73 | try { |
| 74 | $params = $request->get_json_params(); |
| 75 | $message = $this->retrieve_message( $params['message'] ); |
| 76 | if ( empty( $message ) ) { |
| 77 | return $this->create_rest_response( [ 'success' => false, 'message' => 'Message cannot be empty.' ], 500 ); |
| 78 | } |
| 79 | $query = apply_filters( 'mwai_ai_completions', null, $message, $params ); |
| 80 | if ( !is_null( $query ) && $query instanceof Meow_MWAI_Query_Base ) { |
| 81 | // We got back a query. |
| 82 | } |
| 83 | else if ( is_string( $query ) ) { |
| 84 | // We got back a string. |
| 85 | return $this->create_rest_response( [ 'success' => true, 'data' => $query ], 200 ); |
| 86 | } |
| 87 | else { |
| 88 | $query = new Meow_MWAI_Query_Text( $message ); |
| 89 | $query->set_max_tokens( $params['maxTokens'] ); |
| 90 | $query->set_temperature( $params['temperature'] ); |
| 91 | if ( !empty( $params['stop'] ) ) { |
| 92 | $query->set_stop( $params['stop'] ); |
| 93 | } |
| 94 | } |
| 95 | $query->set_env( $params['envId'] ); |
| 96 | $query->set_model( $params['model'] ); |
| 97 | if ( !empty( $params['sessionId'] ) ) { |
| 98 | $query->session = $params['sessionId']; |
| 99 | } |
| 100 | $query->user = $this->core->get_user_by( 'id', get_current_user_id() ); |
| 101 | $reply = $this->core->run_query( $query ); |
| 102 | return $this->create_rest_response( [ 'success' => true, 'data' => $reply->result ], 200 ); |
| 103 | } |
| 104 | catch ( Exception $e ) { |
| 105 | return $this->create_rest_response( [ 'success' => false, 'message' => $e->getMessage() ], 500 ); |
| 106 | } |
| 107 | } |
| 108 | |
| 109 | public function rest_ai_images( $request ) { |
| 110 | try { |
| 111 | $params = $request->get_json_params(); |
| 112 | $message = $this->retrieve_message( $params['message'] ); |
| 113 | $query = new Meow_MWAI_Query_Image( $message ); |
| 114 | $query->set_resolution( isset( $params['resolution'] ) ? $params['resolution'] : '1024x1024' ); |
| 115 | if ( isset( $params['quality'] ) ) { |
| 116 | $query->set_quality( $params['quality'] ); |
| 117 | } |
| 118 | $query->set_style( isset( $params['style'] ) ? $params['style'] : null ); |
| 119 | $query->set_env( $params['envId'] ); |
| 120 | $query->set_model( $params['model'] ); |
| 121 | $query->user = $this->core->get_user_by( 'id', get_current_user_id() ); |
| 122 | $reply = $this->core->run_query( $query ); |
| 123 | $images = []; |
| 124 | foreach ( $reply->get_images() as $image ) { |
| 125 | $images[] = [ 'url' => $image, 'caption' => $reply->get_caption(), 'alt' => $reply->get_alt() ]; |
| 126 | } |
| 127 | return $this->create_rest_response( [ 'success' => true, 'images' => $images ], 200 ); |
| 128 | } |
| 129 | catch ( Exception $e ) { |
| 130 | return $this->create_rest_response( [ 'success' => false, 'message' => $e->getMessage() ], 500 ); |
| 131 | } |
| 132 | } |
| 133 | |
| 134 | public function rest_ai_image_edit( $request ) { |
| 135 | try { |
| 136 | $params = $request->get_json_params(); |
| 137 | $imageId = $params['imageId']; |
| 138 | $maskId = isset( $params['maskId'] ) ? $params['maskId'] : null; |
| 139 | if ( !$imageId ) { |
| 140 | return $this->create_rest_response( [ 'success' => false, 'message' => 'Image ID is required.' ], 500 ); |
| 141 | } |
| 142 | if ( $maskId ) { |
| 143 | $maskInfo = $this->core->files->get_attachment_info( $maskId ); |
| 144 | $maskFile = $maskInfo['path']; |
| 145 | } |
| 146 | else { |
| 147 | $maskFile = null; |
| 148 | } |
| 149 | $imageInfo = $this->core->files->get_attachment_info( $imageId ); |
| 150 | $imageFile = $imageInfo['path']; |
| 151 | $message = $this->retrieve_message( $params['message'] ); |
| 152 | $query = new Meow_MWAI_Query_EditImage( $message, $imageFile, $maskFile ); |
| 153 | $query->set_resolution( isset( $params['resolution'] ) ? $params['resolution'] : '1024x1024' ); |
| 154 | $query->set_env( $params['envId'] ); |
| 155 | $query->set_model( $params['model'] ); |
| 156 | $query->user = $this->core->get_user_by( 'id', get_current_user_id() ); |
| 157 | $reply = $this->core->run_query( $query ); |
| 158 | $images = []; |
| 159 | foreach ( $reply->get_images() as $image ) { |
| 160 | $images[] = [ 'url' => $image, 'caption' => $reply->get_caption(), 'alt' => $reply->get_alt() ]; |
| 161 | } |
| 162 | return $this->create_rest_response( [ 'success' => true, 'images' => $images ], 200 ); |
| 163 | } |
| 164 | catch ( Exception $e ) { |
| 165 | return $this->create_rest_response( [ 'success' => false, 'message' => $e->getMessage() ], 500 ); |
| 166 | } |
| 167 | } |
| 168 | |
| 169 | public function rest_ai_copilot( $request ) { |
| 170 | try { |
| 171 | $params = $request->get_json_params(); |
| 172 | $message = $this->retrieve_message( $params['message'] ); |
| 173 | if ( empty( $message ) ) { |
| 174 | return $this->create_rest_response( [ 'success' => false, 'message' => 'Message cannot be empty.' ], 500 ); |
| 175 | } |
| 176 | $query = apply_filters( 'mwai_ai_copilot', null, $message, $params ); |
| 177 | if ( !is_null( $query ) && $query instanceof Meow_MWAI_Query_Base ) { |
| 178 | // We got back a query. |
| 179 | } |
| 180 | else if ( is_string( $query ) ) { |
| 181 | // We got back a string. |
| 182 | return $this->create_rest_response( [ 'success' => true, 'data' => $query ], 200 ); |
| 183 | } |
| 184 | else { |
| 185 | $query = new Meow_MWAI_Query_Text( $message ); |
| 186 | $query->set_max_tokens( $params['maxTokens'] ); |
| 187 | $query->set_temperature( $params['temperature'] ); |
| 188 | if ( !empty( $params['stop'] ) ) { |
| 189 | $query->set_stop( $params['stop'] ); |
| 190 | } |
| 191 | } |
| 192 | $query->set_env( $params['envId'] ); |
| 193 | $query->set_model( $params['model'] ); |
| 194 | if ( !empty( $params['sessionId'] ) ) { |
| 195 | $query->session = $params['sessionId']; |
| 196 | } |
| 197 | $query->user = $this->core->get_user_by( 'id', get_current_user_id() ); |
| 198 | if ( isset( $params['context'] ) ) { |
| 199 | $context = $params['context']; |
| 200 | $query->set_context( $context ); |
| 201 | } |
| 202 | $reply = $this->core->run_query( $query ); |
| 203 | return $this->create_rest_response( [ 'success' => true, 'data' => $reply->result ], 200 ); |
| 204 | } |
| 205 | catch ( Exception $e ) { |
| 206 | return $this->create_rest_response( [ 'success' => false, 'message' => $e->getMessage() ], 500 ); |
| 207 | } |
| 208 | } |
| 209 | |
| 210 | public function rest_ai_magic_wand( $request ) { |
| 211 | try { |
| 212 | global $mwai; |
| 213 | $params = $request->get_json_params(); |
| 214 | $message = $this->retrieve_message( $params['message'] ); |
| 215 | $context = isset( $params['context'] ) ? $params['context'] : null; |
| 216 | $action = $params['action']; |
| 217 | $options = $params['options']; |
| 218 | $data = null; |
| 219 | if ( !$mwai->magicWand ) { |
| 220 | throw new Exception( __( 'Magic Wand is not enabled.', 'ai-engine' ) ); |
| 221 | } |
| 222 | $data = $mwai->magicWand->run( $action, $message, $context, $options ); |
| 223 | return $this->create_rest_response( [ 'success' => true, 'data' => $data ], 200 ); |
| 224 | } |
| 225 | catch ( Exception $e ) { |
| 226 | return $this->create_rest_response( [ 'success' => false, 'message' => $e->getMessage() ], 500 ); |
| 227 | } |
| 228 | } |
| 229 | |
| 230 | public function rest_ai_moderate( $request ) { |
| 231 | try { |
| 232 | $params = $request->get_json_params(); |
| 233 | $message = $this->retrieve_message( $params['message'] ); |
| 234 | if ( empty( $message ) ) { |
| 235 | $message = $params['message']; |
| 236 | } |
| 237 | $query = new Meow_MWAI_Query_Moderate( $message ); |
| 238 | $query->set_env( $params['envId'] ); |
| 239 | $query->user = $this->core->get_user_by( 'id', get_current_user_id() ); |
| 240 | $reply = $this->core->run_query( $query ); |
| 241 | return $this->create_rest_response( [ 'success' => true, 'data' => $reply->result ], 200 ); |
| 242 | } |
| 243 | catch ( Exception $e ) { |
| 244 | return $this->create_rest_response( [ 'success' => false, 'message' => $e->getMessage() ], 500 ); |
| 245 | } |
| 246 | } |
| 247 | |
| 248 | public function rest_ai_transcribe_audio( $request ) { |
| 249 | try { |
| 250 | $params = $request->get_json_params(); |
| 251 | if ( empty( $params['attachmentId'] ) ) { |
| 252 | return $this->create_rest_response( [ 'success' => false, 'message' => 'Attachment ID is required.' ], 500 ); |
| 253 | } |
| 254 | $attachmentId = intval( $params['attachmentId'] ); |
| 255 | $attachment = get_post( $attachmentId ); |
| 256 | if ( !$attachment ) { |
| 257 | return $this->create_rest_response( [ 'success' => false, 'message' => 'Attachment not found.' ], 500 ); |
| 258 | } |
| 259 | $mimeType = get_post_mime_type( $attachmentId ); |
| 260 | if ( strpos( $mimeType, 'audio' ) === false ) { |
| 261 | return $this->create_rest_response( [ 'success' => false, 'message' => 'Attachment is not an audio file.' ], 500 ); |
| 262 | } |
| 263 | $url = wp_get_attachment_url( $attachmentId ); |
| 264 | $query = new Meow_MWAI_Query_Transcribe( $url ); |
| 265 | $query->set_env( $params['envId'] ); |
| 266 | $query->set_model( $params['model'] ); |
| 267 | $query->user = $this->core->get_user_by( 'id', get_current_user_id() ); |
| 268 | $reply = $this->core->run_query( $query ); |
| 269 | return $this->create_rest_response( [ 'success' => true, 'data' => $reply->result ], 200 ); |
| 270 | } |
| 271 | catch ( Exception $e ) { |
| 272 | return $this->create_rest_response( [ 'success' => false, 'message' => $e->getMessage() ], 500 ); |
| 273 | } |
| 274 | } |
| 275 | |
| 276 | public function rest_ai_transcribe_image( $request ) { |
| 277 | try { |
| 278 | $params = $request->get_json_params(); |
| 279 | $message = $this->retrieve_message( $params['message'] ); |
| 280 | if ( empty( $params['attachmentId'] ) ) { |
| 281 | return $this->create_rest_response( [ 'success' => false, 'message' => 'Attachment ID is required.' ], 500 ); |
| 282 | } |
| 283 | $attachmentId = intval( $params['attachmentId'] ); |
| 284 | $attachment = get_post( $attachmentId ); |
| 285 | if ( !$attachment ) { |
| 286 | return $this->create_rest_response( [ 'success' => false, 'message' => 'Attachment not found.' ], 500 ); |
| 287 | } |
| 288 | $mimeType = get_post_mime_type( $attachmentId ); |
| 289 | if ( !$this->core->is_image( $mimeType ) ) { |
| 290 | return $this->create_rest_response( [ 'success' => false, 'message' => 'Attachment is not an image file.' ], 500 ); |
| 291 | } |
| 292 | $url = wp_get_attachment_url( $attachmentId ); |
| 293 | $query = new Meow_MWAI_Query_Text( $message ); |
| 294 | $query->set_max_tokens( !empty( $params['maxTokens'] ) ? $params['maxTokens'] : 4096 ); |
| 295 | $query->set_env( $params['envId'] ); |
| 296 | $query->set_model( $params['model'] ); |
| 297 | $query->add_image( $url ); |
| 298 | $query->user = $this->core->get_user_by( 'id', get_current_user_id() ); |
| 299 | $reply = $this->core->run_query( $query ); |
| 300 | return $this->create_rest_response( [ 'success' => true, 'data' => $reply->result ], 200 ); |
| 301 | } |
| 302 | catch ( Exception $e ) { |
| 303 | return $this->create_rest_response( [ 'success' => false, 'message' => $e->getMessage() ], 500 ); |
| 304 | } |
| 305 | } |
| 306 | |
| 307 | public function rest_ai_json( $request ) { |
| 308 | try { |
| 309 | $params = $request->get_json_params(); |
| 310 | $message = $this->retrieve_message( $params['message'] ); |
| 311 | if ( empty( $message ) ) { |
| 312 | return $this->create_rest_response( [ 'success' => false, 'message' => 'Message cannot be empty.' ], 500 ); |
| 313 | } |
| 314 | $query = new Meow_MWAI_Query_Text( $message ); |
| 315 | $query->set_max_tokens( !empty( $params['maxTokens'] ) ? $params['maxTokens'] : 4096 ); |
| 316 | $query->set_temperature( !empty( $params['temperature'] ) ? $params['temperature'] : 0 ); |
| 317 | if ( !empty( $params['stop'] ) ) { |
| 318 | $query->set_stop( $params['stop'] ); |
| 319 | } |
| 320 | $query->responseFormat = 'json_object'; |
| 321 | $query->set_env( $params['envId'] ); |
| 322 | $query->set_model( $params['model'] ); |
| 323 | if ( !empty( $params['sessionId'] ) ) { |
| 324 | $query->session = $params['sessionId']; |
| 325 | } |
| 326 | $query->user = $this->core->get_user_by( 'id', get_current_user_id() ); |
| 327 | $reply = $this->core->run_query( $query ); |
| 328 | $json = json_decode( $reply->result ); |
| 329 | return $this->create_rest_response( [ 'success' => true, 'data' => $json ], 200 ); |
| 330 | } |
| 331 | catch ( Exception $e ) { |
| 332 | return $this->create_rest_response( [ 'success' => false, 'message' => $e->getMessage() ], 500 ); |
| 333 | } |
| 334 | } |
| 335 | } |
| 336 |