diff --git a/lib/llm/config_service.rb b/lib/llm/config_service.rb new file mode 100644 index 000000000..932e8a756 --- /dev/null +++ b/lib/llm/config_service.rb @@ -0,0 +1,95 @@ +# frozen_string_literal: true + +module Llm::ConfigService + CONFIG_PATH = Rails.root.join('config/llm.yml').freeze + + class << self + def config + @config ||= load_config + end + + def reload! + @config = load_config + end + + def providers + config['providers'] || {} + end + + def models + config['models'] || {} + end + + def features + config['features'] || {} + end + + def models_for_feature(feature_key) + feature = features[feature_key.to_s] + return [] unless feature + + feature['models'] || [] + end + + def default_model_for_feature(feature_key) + feature = features[feature_key.to_s] + return nil unless feature + + feature['default'] + end + + def model_info(model_name) + models[model_name.to_s] + end + + def provider_info(provider_name) + providers[provider_name.to_s] + end + + def feature_keys + features.keys + end + + def valid_model_for_feature?(feature_key, model_name) + allowed_models = models_for_feature(feature_key) + allowed_models.include?(model_name.to_s) + end + + def feature_config(feature_key) + feature = features[feature_key.to_s] + return nil unless feature + + { + models: feature['models'].map do |model_name| + model = models[model_name] + next nil unless model + + { + id: model_name, + display_name: model['display_name'], + provider: model['provider'], + credit_multiplier: model['credit_multiplier'] + } + end.compact, + default: feature['default'] + } + end + + def all_features_config + features.keys.index_with do |feature_key| + feature_config(feature_key) + end + end + + private + + def load_config + return {} unless File.exist?(CONFIG_PATH) + + YAML.load_file(CONFIG_PATH) || {} + rescue StandardError => e + Rails.logger.error("Failed to load LLM config: #{e.message}") + {} + end + end +end