app/models/ruby_conversations/concerns/llm_credentials.rb



# frozen_string_literal: true

module RubyConversations
  module Concerns
    # Handles the management of LLM credentials for AI conversations.
    # Provides methods for configuring LLM credentials from either
    # environment variables or an AWS credential provider.
    module LlmCredentials
      extend ActiveSupport::Concern

      # Helper methods for retrieving AWS credentials from different sources
      # These methods are meant to be used as class methods in the LlmCredentials module
      module CredentialHelpers
        private

        def env_credentials
          {
            api_key: ENV.fetch('AWS_ACCESS_KEY_ID', nil),
            secret_key: ENV.fetch('AWS_SECRET_ACCESS_KEY', nil),
            session_token: ENV.fetch('AWS_SESSION_TOKEN', nil)
          }
        end

        def provider_credentials
          provider = AwsCredentialProvider.instance
          provider.refresh_if_expired!
          {
            api_key: provider.access_key_id,
            secret_key: provider.secret_access_key,
            session_token: provider.session_token
          }
        end
      end

      class_methods do
        include CredentialHelpers

        def configure_llm_credentials
          RubyLLM.configure do |config|
            creds                 = provider_credentials
            config.bedrock_region = ENV.fetch('AWS_REGION', 'us-west-2')
            config.bedrock_api_key     = creds[:api_key]
            config.bedrock_secret_key  = creds[:secret_key]
            config.bedrock_session_token = creds[:session_token]
          end
        end
      end

      def configure_llm_credentials
        self.class.configure_llm_credentials
      end
    end
  end
end