Class: Agentic::RetryHandler
- Inherits:
-
Object
- Object
- Agentic::RetryHandler
- Defined in:
- lib/agentic/retry_handler.rb
Overview
Handles retrying operations with configurable backoff strategies
Instance Attribute Summary collapse
-
#after_retry ⇒ Proc?
readonly
Optional block to run after each retry.
-
#backoff_strategy ⇒ Symbol
readonly
The backoff strategy to use.
-
#before_retry ⇒ Proc?
readonly
Optional block to run before each retry.
-
#max_retries ⇒ Integer
readonly
The maximum number of retry attempts.
-
#retryable_errors ⇒ Array<Class, String>
readonly
List of retryable error types/names.
Instance Method Summary collapse
-
#initialize(max_retries: 3, retryable_errors: [Errors::LlmTimeoutError, Errors::LlmRateLimitError, Errors::LlmServerError, Errors::LlmNetworkError], backoff_strategy: :exponential, backoff_options: {}, before_retry: nil, after_retry: nil) ⇒ RetryHandler
constructor
Initializes a new RetryHandler.
-
#with_retry(&block) ⇒ Object
Executes the given block with retries.
Constructor Details
#initialize(max_retries: 3, retryable_errors: [Errors::LlmTimeoutError, Errors::LlmRateLimitError, Errors::LlmServerError, Errors::LlmNetworkError], backoff_strategy: :exponential, backoff_options: {}, before_retry: nil, after_retry: nil) ⇒ RetryHandler
Initializes a new RetryHandler
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/agentic/retry_handler.rb', line 30 def initialize( max_retries: 3, retryable_errors: [Errors::LlmTimeoutError, Errors::LlmRateLimitError, Errors::LlmServerError, Errors::LlmNetworkError], backoff_strategy: :exponential, backoff_options: {}, before_retry: nil, after_retry: nil ) @max_retries = max_retries @retryable_errors = retryable_errors @backoff_strategy = backoff_strategy @backoff_options = { base_delay: 1.0, jitter_factor: 0.25 }.merge() @before_retry = before_retry @after_retry = after_retry end |
Instance Attribute Details
#after_retry ⇒ Proc? (readonly)
Returns Optional block to run after each retry.
19 20 21 |
# File 'lib/agentic/retry_handler.rb', line 19 def after_retry @after_retry end |
#backoff_strategy ⇒ Symbol (readonly)
Returns The backoff strategy to use.
13 14 15 |
# File 'lib/agentic/retry_handler.rb', line 13 def backoff_strategy @backoff_strategy end |
#before_retry ⇒ Proc? (readonly)
Returns Optional block to run before each retry.
16 17 18 |
# File 'lib/agentic/retry_handler.rb', line 16 def before_retry @before_retry end |
#max_retries ⇒ Integer (readonly)
Returns The maximum number of retry attempts.
7 8 9 |
# File 'lib/agentic/retry_handler.rb', line 7 def max_retries @max_retries end |
#retryable_errors ⇒ Array<Class, String> (readonly)
Returns List of retryable error types/names.
10 11 12 |
# File 'lib/agentic/retry_handler.rb', line 10 def retryable_errors @retryable_errors end |
Instance Method Details
#with_retry(&block) ⇒ Object
Executes the given block with retries
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
# File 'lib/agentic/retry_handler.rb', line 53 def with_retry(&block) attempt = 0 begin attempt += 1 block.call rescue => e error = e.is_a?(Errors::LlmError) ? e : Errors::LlmError.new(e., context: {original_error: e.class.name}) if retryable?(error) && attempt <= max_retries delay = calculate_backoff_delay(attempt) Agentic.logger.info("Retry #{attempt}/#{max_retries} for error: #{error.}. Waiting #{delay.round(2)}s before retrying.") @before_retry&.call(attempt: attempt, error: error, delay: delay) sleep(delay) @after_retry&.call(attempt: attempt, error: error, delay: delay) retry else if attempt > max_retries Agentic.logger.error("Max retries (#{max_retries}) exceeded for error: #{error.}") else Agentic.logger.error("Non-retryable error: #{error.}") end raise error end end end |