= self::MAX_REQUESTS_PER_MINUTE ) { return new WP_Error( 'rate_limit_exceeded', __( 'Rate limit exceeded. Please wait a moment before sending more AI requests.', 'wpfnl' ), [ 'status' => 429 ] ); } set_transient( $transient_key, $count + 1, MINUTE_IN_SECONDS ); return true; } /** * Record token usage for telemetry tracking. * * @param int $input_tokens Input tokens. * @param int $output_tokens Output tokens. * @param string $provider Provider slug. * @return void */ public static function recordUsage( $input_tokens, $output_tokens, $provider = 'openai' ) { $total = (int) get_option( 'wpfnl_ai_total_tokens_used', 0 ); update_option( 'wpfnl_ai_total_tokens_used', $total + $input_tokens + $output_tokens ); do_action( 'wpfunnels_ai_usage_recorded', [ 'input_tokens' => $input_tokens, 'output_tokens' => $output_tokens, 'provider' => $provider, ] ); } }