module RubyLLM::Provider

def configured_providers

def configured_providers
  providers.select { |_name, provider| provider.configured? }.values
end

def extended(base)

def extended(base)
  base.extend(Methods)
  base.extend(Streaming)
end

def for(model)

def for(model)
  model_info = Models.find(model)
  providers[model_info.provider.to_sym]
end

def parse_data_uri(uri)

def parse_data_uri(uri)
  if uri&.start_with?('data:')
    match = uri.match(/\Adata:([^;]+);base64,(.+)\z/)
    return { mime_type: match[1], data: match[2] } if match
  end
  # If it's not a data URI, return nil
  nil
end

def parse_error(response) # rubocop:disable Metrics/MethodLength

rubocop:disable Metrics/MethodLength
def parse_error(response) # rubocop:disable Metrics/MethodLength
  return if response.body.empty?
  body = try_parse_json(response.body)
  case body
  when Hash
    body.dig('error', 'message')
  when Array
    body.map do |part|
      part.dig('error', 'message')
    end.join('. ')
  else
    body
  end
end

def providers

def providers
  @providers ||= {}
end

def register(name, provider_module)

def register(name, provider_module)
  providers[name.to_sym] = provider_module
end

def try_parse_json(maybe_json)

def try_parse_json(maybe_json)
  return maybe_json unless maybe_json.is_a?(String)
  JSON.parse(maybe_json)
rescue JSON::ParserError
  maybe_json
end