'POST', 'permission_callback'=>[Security::class,'rest_can_edit_request'], 'callback'=>[$this,'generate'] ]); register_rest_route('wp-ai-builder/v1','/models',[ 'methods'=>'GET', 'permission_callback'=>function(){ return Security::can_edit_posts(); }, 'callback'=>[$this,'models'] ]); register_rest_route('wp-ai-builder/v1','/elementor/generate',[ 'methods'=>'POST', 'permission_callback'=>[Security::class,'rest_can_edit_request'], 'callback'=>[$this,'elementor_generate'] ]); register_rest_route('wp-ai-builder/v1','/tools',[ 'methods'=>'GET', 'permission_callback'=>function(){ return Security::can_edit_posts(); }, 'callback'=>[$this,'tools'] ]); } public function generate(WP_REST_Request $req){ $service=new AI_Service(); $provider = $req->get_param('provider'); $model = $req->get_param('model'); $attachments = $req->get_param('attachments') ?? []; $messages = $req->get_param('messages') ?? []; $selection = $req->get_param('selection'); $post_id = $req->get_param('post_id'); $page_content = $req->get_param('page_content'); $use_global_theme = $req->get_param('use_global_theme'); $block_type_preference = $req->get_param('block_type_preference') ?: 'auto'; $result = $service->run($req->get_param('prompt'),$provider,$model,$attachments,$messages,$selection,$post_id ? intval($post_id) : null, $page_content, (bool) $use_global_theme, 'gutenberg', $block_type_preference); if ( is_wp_error( $result ) ) { return $this->rest_error( $result ); } return rest_ensure_response($result); } public function tools(){ $service=new AI_Service(); return rest_ensure_response($service->get_tool_schemas()); } public function models(){ if ( ! class_exists( AiClient::class ) ) { return rest_ensure_response( [] ); } $keyed_connectors = []; foreach ( Compat::get_connectors() as $id => $connector ) { if ( 'ai_provider' !== $connector['type'] ) { continue; } $auth = $connector['authentication'] ?? []; if ( 'api_key' !== ( $auth['method'] ?? '' ) || empty( $auth['setting_name'] ) ) { continue; } if ( ! $this->has_api_key( $auth ) ) { continue; } $keyed_connectors[$id] = $connector; } if ( empty( $keyed_connectors ) ) { return rest_ensure_response( [ 'models' => [], 'inactive' => [] ] ); } try { $registry = AiClient::defaultRegistry(); $requirements = new ModelRequirements( [ CapabilityEnum::textGeneration() ], [] ); $models = []; $inactive = []; $found_ids = []; foreach ( $registry->findModelsMetadataForSupport( $requirements ) as $provider_models ) { $provider_metadata = $provider_models->getProvider(); $provider_id = $provider_metadata->getId(); $found_ids[] = $provider_id; if ( ! isset( $keyed_connectors[$provider_id] ) ) { continue; } foreach ( $provider_models->getModels() as $model_metadata ) { $models[] = [ 'provider' => $provider_id, 'providerName' => $provider_metadata->getName(), 'id' => $model_metadata->getId(), 'name' => $model_metadata->getName(), ]; } } foreach ( $keyed_connectors as $id => $connector ) { if ( ! in_array( $id, $found_ids, true ) ) { $inactive[] = [ 'id' => $id, 'name' => $connector['name'], ]; } } return rest_ensure_response( [ 'models' => $models, 'inactive' => $inactive ] ); } catch ( \Exception $e ) { return rest_ensure_response( [ 'models' => [], 'inactive' => [] ] ); } } private function has_api_key( array $auth ): bool { $env_var_name = $auth['env_var_name'] ?? ''; $constant_name = $auth['constant_name'] ?? ''; $setting_name = $auth['setting_name'] ?? ''; if ( '' !== $env_var_name ) { $env_value = getenv( $env_var_name ); if ( false !== $env_value && '' !== $env_value ) { return true; } } if ( '' !== $constant_name && defined( $constant_name ) ) { $const_value = constant( $constant_name ); if ( is_string( $const_value ) && '' !== $const_value ) { return true; } } if ( '' !== $setting_name ) { $db_value = get_option( $setting_name, '' ); if ( '' !== $db_value ) { return true; } } return false; } public function elementor_generate(WP_REST_Request $req){ $service=new AI_Service(); $provider = $req->get_param('provider'); $model = $req->get_param('model'); $attachments = $req->get_param('attachments') ?? []; $messages = $req->get_param('messages') ?? []; $selection = $req->get_param('selection'); $post_id = $req->get_param('post_id'); $page_content = $req->get_param('page_content'); $use_global_theme = $req->get_param('use_global_theme'); $block_type_preference = $req->get_param('block_type_preference') ?: 'auto'; $editor_tools = $req->get_param('editor_tools'); $continuation = $req->get_param('continuation'); $editor_tool_results = $req->get_param('editor_tool_results'); $editor_resources = $req->get_param('editor_resources'); $result = $service->run( $req->get_param('prompt'), $provider, $model, $attachments, $messages, $selection, $post_id ? intval($post_id) : null, $page_content, (bool) $use_global_theme, 'elementor', $block_type_preference, is_array( $editor_tools ) ? $editor_tools : array(), is_array( $continuation ) ? $continuation : null, is_array( $editor_tool_results ) ? $editor_tool_results : array(), is_array( $editor_resources ) ? $editor_resources : array() ); if ( is_wp_error( $result ) ) { return $this->rest_error( $result ); } return rest_ensure_response($result); } private function rest_error( \WP_Error $error ): \WP_Error { return new \WP_Error( $error->get_error_code(), $error->get_error_message(), $error->get_error_data() ); } }