advisor.php
3 months ago
chatbot.php
3 weeks ago
discussions.php
1 day ago
editor-assistant.php
3 months ago
files.php
3 months ago
forms-manager.php
3 months ago
gdpr.php
4 months ago
search.php
3 months ago
security.php
1 year ago
tasks-examples.php
6 months ago
tasks.php
1 month ago
wand.php
3 months ago
editor-assistant.php
178 lines
| 1 | <?php |
| 2 | |
| 3 | class Meow_MWAI_Modules_Editor_Assistant { |
| 4 | protected $core = null; |
| 5 | protected $botId = 'mwai_assistant'; |
| 6 | protected $namespace = 'mwai-ui/v1'; |
| 7 | |
| 8 | public function __construct( $core ) { |
| 9 | $this->core = $core; |
| 10 | add_filter( 'mwai_internal_chatbot', [ $this, 'get_internal_chatbot' ], 10, 3 ); |
| 11 | add_action( 'rest_api_init', [ $this, 'rest_api_init' ] ); |
| 12 | add_action( 'admin_head', [ $this, 'admin_head' ] ); |
| 13 | add_action( 'admin_footer', [ $this, 'admin_footer' ] ); |
| 14 | } |
| 15 | |
| 16 | public function admin_head() { |
| 17 | ?> |
| 18 | <style id="mwai-editor-assistant-base"> |
| 19 | html.mwai-assistant-active { |
| 20 | transition: margin-top 0.3s ease !important; |
| 21 | } |
| 22 | html.mwai-assistant-active .interface-interface-skeleton { |
| 23 | transition: top 0.3s ease, left 0.3s ease, right 0.3s ease, |
| 24 | bottom 0.3s ease, border-radius 0.3s ease, filter 0.3s ease !important; |
| 25 | } |
| 26 | html.mwai-assistant-active #wpadminbar, |
| 27 | html.mwai-assistant-active #adminmenuwrap, |
| 28 | html.mwai-assistant-active #adminmenuback { |
| 29 | transition: transform 0.3s ease, opacity 0.3s ease !important; |
| 30 | } |
| 31 | html.mwai-assistant-active #wpcontent, |
| 32 | html.mwai-assistant-active #wpfooter { |
| 33 | transition: margin-left 0.3s ease !important; |
| 34 | } |
| 35 | html.mwai-assistant-open { |
| 36 | margin-top: 0 !important; |
| 37 | background: #f0f0f1 !important; |
| 38 | } |
| 39 | html.mwai-assistant-open body { |
| 40 | background: transparent !important; |
| 41 | } |
| 42 | html.mwai-assistant-open #wpadminbar { |
| 43 | transform: translateY(-100%); |
| 44 | opacity: 0; |
| 45 | pointer-events: none; |
| 46 | } |
| 47 | html.mwai-assistant-open #adminmenuwrap, |
| 48 | html.mwai-assistant-open #adminmenuback { |
| 49 | transform: translateX(-100%); |
| 50 | opacity: 0; |
| 51 | pointer-events: none; |
| 52 | } |
| 53 | html.mwai-assistant-open #wpcontent, |
| 54 | html.mwai-assistant-open #wpfooter { |
| 55 | margin-left: 0 !important; |
| 56 | } |
| 57 | html.mwai-assistant-open .interface-interface-skeleton { |
| 58 | position: fixed !important; |
| 59 | top: 15px !important; |
| 60 | left: 15px !important; |
| 61 | right: 410px !important; |
| 62 | bottom: 15px !important; |
| 63 | border-radius: 12px !important; |
| 64 | overflow: hidden !important; |
| 65 | filter: drop-shadow(0 0 12px rgba(0, 0, 0, 0.15)) !important; |
| 66 | } |
| 67 | html.mwai-assistant-busy .interface-interface-skeleton { |
| 68 | pointer-events: none !important; |
| 69 | opacity: 0.6 !important; |
| 70 | } |
| 71 | </style> |
| 72 | <?php |
| 73 | } |
| 74 | |
| 75 | public function admin_footer() { |
| 76 | echo '<div id="mwai-editor-assistant-root"></div>'; |
| 77 | } |
| 78 | |
| 79 | public function rest_api_init() { |
| 80 | register_rest_route( $this->namespace, '/editor/submit', [ |
| 81 | 'methods' => 'POST', |
| 82 | 'callback' => [ $this, 'rest_submit' ], |
| 83 | 'permission_callback' => [ $this->core, 'check_rest_nonce' ], |
| 84 | ] ); |
| 85 | } |
| 86 | |
| 87 | public function get_internal_chatbot( $chatbot, $botId, $params ) { |
| 88 | if ( $botId !== $this->botId ) { |
| 89 | return $chatbot; |
| 90 | } |
| 91 | $envId = $params['envId'] ?? null; |
| 92 | return [ |
| 93 | 'botId' => $this->botId, |
| 94 | 'name' => 'AI Assistant', |
| 95 | 'mode' => 'chat', |
| 96 | 'scope' => 'editor-assistant', |
| 97 | 'envId' => $envId, |
| 98 | 'instructions' => '', |
| 99 | 'textInputMaxLength' => 16384, |
| 100 | 'startSentence' => '', |
| 101 | 'contentAware' => false, |
| 102 | ]; |
| 103 | } |
| 104 | |
| 105 | protected function create_response( $data, $status = 200 ) { |
| 106 | $current_nonce = $this->core->get_nonce( true ); |
| 107 | $request_nonce = isset( $_SERVER['HTTP_X_WP_NONCE'] ) ? $_SERVER['HTTP_X_WP_NONCE'] : null; |
| 108 | $should_refresh = false; |
| 109 | if ( $request_nonce ) { |
| 110 | $verify = wp_verify_nonce( $request_nonce, 'wp_rest' ); |
| 111 | if ( $verify === 2 ) { |
| 112 | $should_refresh = true; |
| 113 | } |
| 114 | } |
| 115 | if ( $should_refresh || ( $request_nonce && $current_nonce !== $request_nonce ) ) { |
| 116 | $data['new_token'] = $current_nonce; |
| 117 | } |
| 118 | return new WP_REST_Response( $data, $status ); |
| 119 | } |
| 120 | |
| 121 | protected function build_response( $reply ) { |
| 122 | return [ |
| 123 | 'success' => true, |
| 124 | 'reply' => $reply->result, |
| 125 | 'actions' => [], |
| 126 | 'feedbackId' => null, |
| 127 | 'usage' => $reply->usage, |
| 128 | ]; |
| 129 | } |
| 130 | |
| 131 | public function rest_submit( $request ) { |
| 132 | try { |
| 133 | $params = $request->get_json_params(); |
| 134 | $newMessage = trim( $params['newMessage'] ?? '' ); |
| 135 | $instructions = $params['instructions'] ?? ''; |
| 136 | $messages = $params['messages'] ?? []; |
| 137 | $envId = $params['envId'] ?? null; |
| 138 | $model = $params['model'] ?? null; |
| 139 | $chatId = $params['chatId'] ?? null; |
| 140 | |
| 141 | if ( empty( $newMessage ) ) { |
| 142 | return $this->create_response( [ 'success' => false, 'message' => 'Empty message.' ], 400 ); |
| 143 | } |
| 144 | |
| 145 | $query = new Meow_MWAI_Query_Text( $newMessage, 4096 ); |
| 146 | $queryParams = [ |
| 147 | 'botId' => $this->botId, |
| 148 | 'scope' => 'editor-assistant', |
| 149 | 'instructions' => $instructions, |
| 150 | 'messages' => $messages, |
| 151 | ]; |
| 152 | if ( $envId ) { |
| 153 | $queryParams['envId'] = $envId; |
| 154 | } |
| 155 | if ( $model ) { |
| 156 | $queryParams['model'] = $model; |
| 157 | } |
| 158 | if ( $chatId ) { |
| 159 | $queryParams['chatId'] = $chatId; |
| 160 | } |
| 161 | $query->inject_params( $queryParams ); |
| 162 | $query = apply_filters( 'mwai_chatbot_query', $query, $queryParams ); |
| 163 | |
| 164 | Meow_MWAI_Logging::log( "Editor Assistant: Submitting query: \"{$newMessage}\"" ); |
| 165 | $reply = $this->core->run_query( $query ); |
| 166 | |
| 167 | return $this->create_response( $this->build_response( $reply ) ); |
| 168 | } |
| 169 | catch ( Exception $e ) { |
| 170 | Meow_MWAI_Logging::error( 'Editor Assistant: ' . $e->getMessage() ); |
| 171 | return $this->create_response( [ |
| 172 | 'success' => false, |
| 173 | 'message' => apply_filters( 'mwai_ai_exception', $e->getMessage() ), |
| 174 | ], 500 ); |
| 175 | } |
| 176 | } |
| 177 | } |
| 178 |