WP_REST_Server::READABLE, 'callback' => NS . 'send_request', 'permission_callback' => fn() => current_user_can( 'edit_posts' ), 'args' => [], ] ); } /** * Send request to OpenAI API. * * @param WP_REST_Request $request The request object. * * @since 0.0.1 * * @return string */ function send_request( WP_REST_Request $request ): string { $options = get_option( 'aiBlock', [] ); $prompt = $request->get_param( 'prompt' ) ?? ''; $max_tokens = (int) ( $request->get_param( 'max_tokens' ) ? $request->get_param( 'max_tokens' ) : $options['maxTokens'] ?? 25 ); $api_key = $request->get_param( 'api_key' ) ?? $options['apiKey'] ?? ''; $base_url = 'https://api.openai.com/v1/completions'; $model_id = 'text-davinci-003'; if ( ! $api_key ) { return __( 'Please enter your API key.', 'ai-block' ); } $options = [ 'method' => 'POST', 'headers' => [ 'Content-Type' => 'application/json', 'Authorization' => 'Bearer ' . $api_key, ], 'body' => wp_json_encode( [ 'model' => $model_id, 'prompt' => $prompt, 'max_tokens' => $max_tokens, ] ), ]; $response = wp_remote_post( $base_url, $options ); if ( is_wp_error( $response ) ) { $response = wp_remote_post( $base_url, $options ); } if ( is_wp_error( $response ) ) { $response = wp_remote_post( $base_url, $options ); } if ( is_wp_error( $response ) ) { return $response->get_error_message(); } $text = json_decode( $response['body'], true )['choices'][0]['text'] ?? ''; if ( $prompt === 'check' && $max_tokens === 2 ) { return $text ? 'valid' : 'invalid'; } return $text; } add_action( 'admin_init', NS . 'register_settings' ); add_action( 'rest_api_init', NS . 'register_settings' ); /** * Register plugin settings. * * @since 0.0.1 * * @return void */ function register_settings(): void { register_setting( 'options', 'aiBlock', [ 'description' => __( 'AI Block.', 'blockify' ), 'type' => 'object', 'show_in_rest' => [ 'schema' => [ 'type' => 'object', 'properties' => [ 'apiKey' => [ 'type' => 'string', ], 'apiKeyStatus' => [ 'type' => 'string', ], 'maxTokens' => [ 'type' => 'integer', ], ], ], ], ] ); }