class LittleGhost::Providers::Bedrock
Bedrock lets LittleGhost agents use models available through Amazon Bedrock Converse. Its output follows the same streaming events as every other LittleGhost provider.
provider = LittleGhost::Providers::Bedrock.new( model: ENV.fetch("BEDROCK_MODEL_ID"), region: ENV.fetch("AWS_REGION") )
The default client requires the optional aws-sdk-bedrockruntime gem and uses the AWS SDK credential chain. Applications may inject client instead.
Transient service and stream failures retry with exponential backoff. Each retry emits :model_retry and reports whether partial text was already emitted, allowing stream consumers to handle repeated output deliberately.
Attributes
Public Class Methods
# File lib/little_ghost/providers/bedrock.rb, line 60 def initialize(model:, region: nil, client: nil, max_retries: 2, sleeper: nil, on_retry: ->(*) {}, **client_options) @model = model @client = client || build_client(region:, **client_options) @max_retries = Integer(max_retries) @sleeper = sleeper @on_retry = on_retry end
Configures Bedrock for model.
region and remaining client_options configure the default AWS client. max_retries, sleeper, and on_retry control retry behavior. Injecting client bypasses creation of the optional SDK client.
Public Instance Methods
Source
# File lib/little_ghost/providers/bedrock.rb, line 129 def capabilities(metadata: {}) parameters = metadata[:supported_parameters] || metadata["supported_parameters"] return ModelCapabilities.unknown unless parameters.is_a?(Array) values = parameters.map(&:to_s) ModelCapabilities.new( native_structured_output: values.include?("structured_outputs"), tools: values.include?("tools"), tool_choice: values.include?("tool_choice"), supported_parameters: values ) end
Reads capabilities from Bedrock supported_parameters metadata. Missing metadata produces ModelCapabilities.unknown.
# File lib/little_ghost/providers/bedrock.rb, line 74 def stream(request) return enum_for(__method__, request) unless block_given? attempts = 0 begin partial_text = false request.cancellation_token.raise_if_cancelled! normalizer = StreamNormalizer.new(model:) stream = Support::InterruptibleStream.new( cancellation_token: request.cancellation_token, deadline: request.deadline ) do |emit| response = @client.converse_stream(**request_parameters(request)) response.stream.each { |event| emit.call(event) } end stream.each do |event| normalizer.consume(event_hash(event)).each do |normalized| partial_text ||= normalized.type == :text_delta && !normalized.data[:text].to_s.empty? yield normalized end end normalizer.finish.each do |event| partial_text ||= event.type == :text_delta && !event.data[:text].to_s.empty? yield event end rescue CancelledError, DeadlineExceededError, CleanupError raise rescue => error raise if error.is_a?(Error) && !error.is_a?(StreamError) if context_window_overflow?(error) raise ContextWindowOverflowError, "The model context window was exceeded" end raise provider_error(error) if !retryable?(error) || attempts >= @max_retries attempts += 1 request.cancellation_token.raise_if_cancelled! delay = capped_retry_delay(request, retry_delay(attempts)) @on_retry.call(attempts, error, delay) wait_before_retry(request, delay) yield StreamEvent.build( :model_retry, attempt: attempts, delay:, error_class: error.class.name, error_code: (error.event_type if error.is_a?(StreamError)), partial_text: ) retry end end
Streams LittleGhost StreamEvent objects for request.
Without a block, returns an Enumerator. Context-window failures normalize to ContextWindowOverflowError and malformed tool calls normalize to MalformedToolCallError.