Class: RubyLLM::Generators::Provider::Scaffold

Inherits:
Object
  • Object
show all
Defined in:
lib/generators/ruby_llm/provider/scaffold.rb

Overview

Generates first-party providers and standalone provider gems.

Defined Under Namespace

Classes: Result

Constant Summary collapse

SUPPORTED_MODES =

:nodoc: all

%w[core gem].freeze
SUPPORTED_DIALECTS =
%w[chat_completions responses anthropic gemini converse ollama].freeze
TEMPLATE_ROOT =
File.expand_path('templates', __dir__)

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, **options) ⇒ Scaffold

Returns a new instance of Scaffold.



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/generators/ruby_llm/provider/scaffold.rb', line 26

def initialize(name, **options)
  @name = normalize_provider_name(name)
  @mode = normalize_option(options.fetch(:mode, :core), SUPPORTED_MODES, 'mode')
  @dialect = normalize_option(options.fetch(:dialect, :chat_completions), SUPPORTED_DIALECTS, 'dialect')
  @api_base = options[:api_base] || 'https://api.example.com/v1'
  @api_key_env = options[:api_key_env] || "#{env_prefix}_API_KEY"
  @api_base_env = options[:api_base_env] || "#{env_prefix}_API_BASE"
  @models_dev_provider = blank_to_nil(options[:models_dev_provider])
  @dynamic_models = dynamic_models_option?(options)
  @gem_name = normalize_gem_name(options[:gem_name] || "ruby_llm-providers-#{slug.tr('_', '-')}")
  @destination = File.expand_path(options[:destination] || default_destination)
  @github_owner = options[:github_owner] || 'your-github-org'
  @force = options.fetch(:force, false)
  @result = Result.new(written: [], updated: [], skipped: [], actions: [])
end

Instance Attribute Details

#api_baseObject (readonly)

Returns the value of attribute api_base.



23
24
25
# File 'lib/generators/ruby_llm/provider/scaffold.rb', line 23

def api_base
  @api_base
end

#api_base_envObject (readonly)

Returns the value of attribute api_base_env.



23
24
25
# File 'lib/generators/ruby_llm/provider/scaffold.rb', line 23

def api_base_env
  @api_base_env
end

#api_key_envObject (readonly)

Returns the value of attribute api_key_env.



23
24
25
# File 'lib/generators/ruby_llm/provider/scaffold.rb', line 23

def api_key_env
  @api_key_env
end

#destinationObject (readonly)

Returns the value of attribute destination.



23
24
25
# File 'lib/generators/ruby_llm/provider/scaffold.rb', line 23

def destination
  @destination
end

#dialectObject (readonly)

Returns the value of attribute dialect.



23
24
25
# File 'lib/generators/ruby_llm/provider/scaffold.rb', line 23

def dialect
  @dialect
end

#gem_nameObject (readonly)

Returns the value of attribute gem_name.



23
24
25
# File 'lib/generators/ruby_llm/provider/scaffold.rb', line 23

def gem_name
  @gem_name
end

#github_ownerObject (readonly)

Returns the value of attribute github_owner.



23
24
25
# File 'lib/generators/ruby_llm/provider/scaffold.rb', line 23

def github_owner
  @github_owner
end

#modeObject (readonly)

Returns the value of attribute mode.



23
24
25
# File 'lib/generators/ruby_llm/provider/scaffold.rb', line 23

def mode
  @mode
end

#models_dev_providerObject (readonly)

Returns the value of attribute models_dev_provider.



23
24
25
# File 'lib/generators/ruby_llm/provider/scaffold.rb', line 23

def models_dev_provider
  @models_dev_provider
end

#nameObject (readonly)

Returns the value of attribute name.



23
24
25
# File 'lib/generators/ruby_llm/provider/scaffold.rb', line 23

def name
  @name
end

Instance Method Details

#api_base_configObject



63
64
65
# File 'lib/generators/ruby_llm/provider/scaffold.rb', line 63

def api_base_config
  "#{slug}_api_base"
end

#api_key_configObject



59
60
61
# File 'lib/generators/ruby_llm/provider/scaffold.rb', line 59

def api_key_config
  "#{slug}_api_key"
end

#class_nameObject



47
48
49
# File 'lib/generators/ruby_llm/provider/scaffold.rb', line 47

def class_name
  @class_name ||= classify(name)
end

#dynamic_models?Boolean

Returns:

  • (Boolean)


67
68
69
# File 'lib/generators/ruby_llm/provider/scaffold.rb', line 67

def dynamic_models?
  !!@dynamic_models
end

#env_prefixObject



55
56
57
# File 'lib/generators/ruby_llm/provider/scaffold.rb', line 55

def env_prefix
  slug.upcase
end

#generateObject



42
43
44
45
# File 'lib/generators/ruby_llm/provider/scaffold.rb', line 42

def generate
  mode == 'core' ? generate_core_provider : generate_provider_gem
  @result
end

#protocol_class_nameObject



75
76
77
78
79
80
81
82
83
84
# File 'lib/generators/ruby_llm/provider/scaffold.rb', line 75

def protocol_class_name
  {
    'chat_completions' => 'ChatCompletions',
    'responses' => 'Responses',
    'anthropic' => 'Anthropic',
    'gemini' => 'Gemini',
    'converse' => 'Converse',
    'ollama' => 'ChatCompletions'
  }.fetch(dialect)
end

#protocol_nameObject



71
72
73
# File 'lib/generators/ruby_llm/provider/scaffold.rb', line 71

def protocol_name
  dialect == 'ollama' ? 'chat_completions' : dialect
end

#protocol_superclassObject



86
87
88
89
90
91
92
93
94
95
# File 'lib/generators/ruby_llm/provider/scaffold.rb', line 86

def protocol_superclass
  {
    'chat_completions' => 'Protocols::ChatCompletions',
    'responses' => 'Protocols::Responses',
    'anthropic' => 'Protocols::Anthropic',
    'gemini' => 'Protocols::Gemini',
    'converse' => 'Protocols::Converse',
    'ollama' => 'Ollama::ChatCompletions'
  }.fetch(dialect)
end

#provider_descriptionObject



97
98
99
# File 'lib/generators/ruby_llm/provider/scaffold.rb', line 97

def provider_description
  "#{class_name} API integration."
end

#require_pathObject



101
102
103
# File 'lib/generators/ruby_llm/provider/scaffold.rb', line 101

def require_path
  "ruby_llm/providers/#{slug}"
end

#slugObject



51
52
53
# File 'lib/generators/ruby_llm/provider/scaffold.rb', line 51

def slug
  @slug ||= RubyLLM::Support::Utils.underscore(class_name).tr('-', '_')
end