ruby_llm_community 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +22 -0
  3. data/README.md +172 -0
  4. data/lib/generators/ruby_llm/install/templates/INSTALL_INFO.md.tt +108 -0
  5. data/lib/generators/ruby_llm/install/templates/chat_model.rb.tt +3 -0
  6. data/lib/generators/ruby_llm/install/templates/create_chats_migration.rb.tt +8 -0
  7. data/lib/generators/ruby_llm/install/templates/create_messages_migration.rb.tt +15 -0
  8. data/lib/generators/ruby_llm/install/templates/create_tool_calls_migration.rb.tt +14 -0
  9. data/lib/generators/ruby_llm/install/templates/initializer.rb.tt +6 -0
  10. data/lib/generators/ruby_llm/install/templates/message_model.rb.tt +3 -0
  11. data/lib/generators/ruby_llm/install/templates/tool_call_model.rb.tt +3 -0
  12. data/lib/generators/ruby_llm/install_generator.rb +121 -0
  13. data/lib/ruby_llm/active_record/acts_as.rb +382 -0
  14. data/lib/ruby_llm/aliases.json +217 -0
  15. data/lib/ruby_llm/aliases.rb +56 -0
  16. data/lib/ruby_llm/attachment.rb +164 -0
  17. data/lib/ruby_llm/chat.rb +219 -0
  18. data/lib/ruby_llm/chunk.rb +6 -0
  19. data/lib/ruby_llm/configuration.rb +75 -0
  20. data/lib/ruby_llm/connection.rb +126 -0
  21. data/lib/ruby_llm/content.rb +52 -0
  22. data/lib/ruby_llm/context.rb +29 -0
  23. data/lib/ruby_llm/embedding.rb +30 -0
  24. data/lib/ruby_llm/error.rb +84 -0
  25. data/lib/ruby_llm/image.rb +53 -0
  26. data/lib/ruby_llm/message.rb +76 -0
  27. data/lib/ruby_llm/mime_type.rb +67 -0
  28. data/lib/ruby_llm/model/info.rb +101 -0
  29. data/lib/ruby_llm/model/modalities.rb +22 -0
  30. data/lib/ruby_llm/model/pricing.rb +51 -0
  31. data/lib/ruby_llm/model/pricing_category.rb +48 -0
  32. data/lib/ruby_llm/model/pricing_tier.rb +34 -0
  33. data/lib/ruby_llm/model.rb +7 -0
  34. data/lib/ruby_llm/models.json +29924 -0
  35. data/lib/ruby_llm/models.rb +218 -0
  36. data/lib/ruby_llm/models_schema.json +168 -0
  37. data/lib/ruby_llm/provider.rb +219 -0
  38. data/lib/ruby_llm/providers/anthropic/capabilities.rb +179 -0
  39. data/lib/ruby_llm/providers/anthropic/chat.rb +106 -0
  40. data/lib/ruby_llm/providers/anthropic/embeddings.rb +20 -0
  41. data/lib/ruby_llm/providers/anthropic/media.rb +92 -0
  42. data/lib/ruby_llm/providers/anthropic/models.rb +48 -0
  43. data/lib/ruby_llm/providers/anthropic/streaming.rb +43 -0
  44. data/lib/ruby_llm/providers/anthropic/tools.rb +108 -0
  45. data/lib/ruby_llm/providers/anthropic.rb +37 -0
  46. data/lib/ruby_llm/providers/bedrock/capabilities.rb +167 -0
  47. data/lib/ruby_llm/providers/bedrock/chat.rb +65 -0
  48. data/lib/ruby_llm/providers/bedrock/media.rb +61 -0
  49. data/lib/ruby_llm/providers/bedrock/models.rb +82 -0
  50. data/lib/ruby_llm/providers/bedrock/signing.rb +831 -0
  51. data/lib/ruby_llm/providers/bedrock/streaming/base.rb +63 -0
  52. data/lib/ruby_llm/providers/bedrock/streaming/content_extraction.rb +63 -0
  53. data/lib/ruby_llm/providers/bedrock/streaming/message_processing.rb +79 -0
  54. data/lib/ruby_llm/providers/bedrock/streaming/payload_processing.rb +90 -0
  55. data/lib/ruby_llm/providers/bedrock/streaming/prelude_handling.rb +91 -0
  56. data/lib/ruby_llm/providers/bedrock/streaming.rb +36 -0
  57. data/lib/ruby_llm/providers/bedrock.rb +83 -0
  58. data/lib/ruby_llm/providers/deepseek/capabilities.rb +131 -0
  59. data/lib/ruby_llm/providers/deepseek/chat.rb +17 -0
  60. data/lib/ruby_llm/providers/deepseek.rb +30 -0
  61. data/lib/ruby_llm/providers/gemini/capabilities.rb +351 -0
  62. data/lib/ruby_llm/providers/gemini/chat.rb +139 -0
  63. data/lib/ruby_llm/providers/gemini/embeddings.rb +39 -0
  64. data/lib/ruby_llm/providers/gemini/images.rb +48 -0
  65. data/lib/ruby_llm/providers/gemini/media.rb +55 -0
  66. data/lib/ruby_llm/providers/gemini/models.rb +41 -0
  67. data/lib/ruby_llm/providers/gemini/streaming.rb +58 -0
  68. data/lib/ruby_llm/providers/gemini/tools.rb +82 -0
  69. data/lib/ruby_llm/providers/gemini.rb +36 -0
  70. data/lib/ruby_llm/providers/gpustack/chat.rb +17 -0
  71. data/lib/ruby_llm/providers/gpustack/models.rb +55 -0
  72. data/lib/ruby_llm/providers/gpustack.rb +33 -0
  73. data/lib/ruby_llm/providers/mistral/capabilities.rb +163 -0
  74. data/lib/ruby_llm/providers/mistral/chat.rb +26 -0
  75. data/lib/ruby_llm/providers/mistral/embeddings.rb +36 -0
  76. data/lib/ruby_llm/providers/mistral/models.rb +49 -0
  77. data/lib/ruby_llm/providers/mistral.rb +32 -0
  78. data/lib/ruby_llm/providers/ollama/chat.rb +28 -0
  79. data/lib/ruby_llm/providers/ollama/media.rb +50 -0
  80. data/lib/ruby_llm/providers/ollama.rb +29 -0
  81. data/lib/ruby_llm/providers/openai/capabilities.rb +306 -0
  82. data/lib/ruby_llm/providers/openai/chat.rb +86 -0
  83. data/lib/ruby_llm/providers/openai/embeddings.rb +36 -0
  84. data/lib/ruby_llm/providers/openai/images.rb +38 -0
  85. data/lib/ruby_llm/providers/openai/media.rb +81 -0
  86. data/lib/ruby_llm/providers/openai/models.rb +39 -0
  87. data/lib/ruby_llm/providers/openai/response.rb +115 -0
  88. data/lib/ruby_llm/providers/openai/response_media.rb +76 -0
  89. data/lib/ruby_llm/providers/openai/streaming.rb +190 -0
  90. data/lib/ruby_llm/providers/openai/tools.rb +100 -0
  91. data/lib/ruby_llm/providers/openai.rb +44 -0
  92. data/lib/ruby_llm/providers/openai_base.rb +44 -0
  93. data/lib/ruby_llm/providers/openrouter/models.rb +88 -0
  94. data/lib/ruby_llm/providers/openrouter.rb +26 -0
  95. data/lib/ruby_llm/providers/perplexity/capabilities.rb +138 -0
  96. data/lib/ruby_llm/providers/perplexity/chat.rb +17 -0
  97. data/lib/ruby_llm/providers/perplexity/models.rb +42 -0
  98. data/lib/ruby_llm/providers/perplexity.rb +52 -0
  99. data/lib/ruby_llm/railtie.rb +17 -0
  100. data/lib/ruby_llm/stream_accumulator.rb +97 -0
  101. data/lib/ruby_llm/streaming.rb +162 -0
  102. data/lib/ruby_llm/tool.rb +100 -0
  103. data/lib/ruby_llm/tool_call.rb +31 -0
  104. data/lib/ruby_llm/utils.rb +49 -0
  105. data/lib/ruby_llm/version.rb +5 -0
  106. data/lib/ruby_llm.rb +98 -0
  107. data/lib/tasks/aliases.rake +235 -0
  108. data/lib/tasks/models_docs.rake +224 -0
  109. data/lib/tasks/models_update.rake +108 -0
  110. data/lib/tasks/release.rake +32 -0
  111. data/lib/tasks/vcr.rake +99 -0
  112. metadata +128 -7
@@ -0,0 +1,108 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dotenv/load'
4
+ require 'ruby_llm'
5
+ require 'json-schema'
6
+
7
+ task default: ['models:update']
8
+
9
+ namespace :models do
10
+ desc 'Update available models from providers (API keys needed)'
11
+ task :update do
12
+ puts 'Configuring RubyLLM...'
13
+ configure_from_env
14
+
15
+ refresh_models
16
+ display_model_stats
17
+ end
18
+ end
19
+
20
+ def configure_from_env
21
+ RubyLLM.configure do |config|
22
+ config.openai_api_key = ENV.fetch('OPENAI_API_KEY', nil)
23
+ config.anthropic_api_key = ENV.fetch('ANTHROPIC_API_KEY', nil)
24
+ config.gemini_api_key = ENV.fetch('GEMINI_API_KEY', nil)
25
+ config.deepseek_api_key = ENV.fetch('DEEPSEEK_API_KEY', nil)
26
+ config.perplexity_api_key = ENV.fetch('PERPLEXITY_API_KEY', nil)
27
+ config.openrouter_api_key = ENV.fetch('OPENROUTER_API_KEY', nil)
28
+ config.mistral_api_key = ENV.fetch('MISTRAL_API_KEY', nil)
29
+ configure_bedrock(config)
30
+ config.request_timeout = 30
31
+ end
32
+ end
33
+
34
+ def configure_bedrock(config)
35
+ config.bedrock_api_key = ENV.fetch('AWS_ACCESS_KEY_ID', nil)
36
+ config.bedrock_secret_key = ENV.fetch('AWS_SECRET_ACCESS_KEY', nil)
37
+ config.bedrock_region = ENV.fetch('AWS_REGION', nil)
38
+ config.bedrock_session_token = ENV.fetch('AWS_SESSION_TOKEN', nil)
39
+ end
40
+
41
+ def refresh_models
42
+ initial_count = RubyLLM.models.all.size
43
+ puts "Refreshing models (#{initial_count} cached)..."
44
+
45
+ models = RubyLLM.models.refresh!
46
+
47
+ if models.all.empty? && initial_count.zero?
48
+ puts 'Error: Failed to fetch models.'
49
+ exit(1)
50
+ elsif models.all.size == initial_count && initial_count.positive?
51
+ puts 'Warning: Model list unchanged.'
52
+ else
53
+ puts 'Validating models...'
54
+ validate_models!(models)
55
+
56
+ puts "Saving models.json (#{models.all.size} models)"
57
+ models.save_models
58
+ end
59
+
60
+ @models = models
61
+ end
62
+
63
+ def validate_models!(models)
64
+ schema_path = File.expand_path('../ruby_llm/models_schema.json', __dir__)
65
+ models_data = models.all.map(&:to_h)
66
+
67
+ validation_errors = JSON::Validator.fully_validate(schema_path, models_data)
68
+
69
+ unless validation_errors.empty?
70
+ # Save failed models for inspection
71
+ failed_path = File.expand_path('../ruby_llm/models.failed.json', __dir__)
72
+ File.write(failed_path, JSON.pretty_generate(models_data))
73
+
74
+ puts 'ERROR: Models validation failed:'
75
+ puts "\nValidation errors:"
76
+ validation_errors.first(10).each { |error| puts " - #{error}" }
77
+ puts " ... and #{validation_errors.size - 10} more errors" if validation_errors.size > 10
78
+ puts "-> Failed models saved to: #{failed_path}"
79
+ exit(1)
80
+ end
81
+
82
+ puts '✓ Models validation passed'
83
+ end
84
+
85
+ def display_model_stats
86
+ puts "\nModel count:"
87
+ provider_counts = @models.all.group_by(&:provider).transform_values(&:count)
88
+
89
+ RubyLLM::Provider.providers.each do |sym, provider_class|
90
+ name = provider_class.name
91
+ count = provider_counts[sym.to_s] || 0
92
+ status = status(sym)
93
+ puts " #{name}: #{count} models #{status}"
94
+ end
95
+
96
+ puts 'Refresh complete.'
97
+ end
98
+
99
+ def status(provider_sym)
100
+ provider_class = RubyLLM::Provider.providers[provider_sym]
101
+ if provider_class.local?
102
+ ' (LOCAL - SKIP)'
103
+ elsif provider_class.configured?(RubyLLM.config)
104
+ ' (OK)'
105
+ else
106
+ ' (NOT CONFIGURED)'
107
+ end
108
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ namespace :release do
4
+ desc 'Verify cassettes are fresh enough for release'
5
+ task :verify_cassettes do
6
+ max_age_days = 1
7
+ cassette_dir = 'spec/fixtures/vcr_cassettes'
8
+ stale_cassettes = []
9
+
10
+ Dir.glob("#{cassette_dir}/**/*.yml").each do |cassette|
11
+ age_days = (Time.now - File.mtime(cassette)) / 86_400
12
+
13
+ next unless age_days > max_age_days
14
+
15
+ stale_cassettes << {
16
+ file: File.basename(cassette),
17
+ age: age_days.round(1)
18
+ }
19
+ end
20
+
21
+ if stale_cassettes.any?
22
+ puts "\n❌ Found stale cassettes (older than #{max_age_days} days):"
23
+ stale_cassettes.each do |c|
24
+ puts " - #{c[:file]} (#{c[:age]} days old)"
25
+ end
26
+ puts "\nRun locally: bundle exec rspec"
27
+ exit 1
28
+ else
29
+ puts "✅ All cassettes are fresh (< #{max_age_days} days old)"
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dotenv/load'
4
+
5
+ # Helper functions at the top level
6
+ def record_all_cassettes(cassette_dir)
7
+ # Re-record all cassettes
8
+ FileUtils.rm_rf(cassette_dir)
9
+ FileUtils.mkdir_p(cassette_dir)
10
+
11
+ puts 'Recording cassettes for all providers...'
12
+ run_tests
13
+ puts 'Done recording. Please review the new cassettes.'
14
+ end
15
+
16
+ def record_for_providers(providers, cassette_dir)
17
+ # Get the list of available providers from RubyLLM itself
18
+ all_providers = RubyLLM::Provider.providers.keys.map(&:to_s)
19
+
20
+ # Check for valid providers
21
+ if providers.empty?
22
+ puts "Please specify providers or 'all'. Example: rake vcr:record[openai,anthropic]"
23
+ puts "Available providers: #{all_providers.join(', ')}"
24
+ return
25
+ end
26
+
27
+ invalid_providers = providers - all_providers
28
+ if invalid_providers.any?
29
+ puts "Invalid providers: #{invalid_providers.join(', ')}"
30
+ puts "Available providers: #{all_providers.join(', ')}"
31
+ return
32
+ end
33
+
34
+ # Find and delete matching cassettes
35
+ cassettes_to_delete = find_matching_cassettes(cassette_dir, providers)
36
+
37
+ if cassettes_to_delete.empty?
38
+ puts 'No cassettes found for the specified providers.'
39
+ puts 'Running tests to record new cassettes...'
40
+ else
41
+ delete_cassettes(cassettes_to_delete)
42
+ puts "\nRunning tests to record new cassettes..."
43
+ end
44
+
45
+ run_tests
46
+
47
+ puts "\nDone recording cassettes for #{providers.join(', ')}."
48
+ puts 'Please review the updated cassettes for sensitive information.'
49
+ end
50
+
51
+ def find_matching_cassettes(dir, providers)
52
+ cassettes = []
53
+
54
+ Dir.glob("#{dir}/**/*.yml").each do |file|
55
+ basename = File.basename(file)
56
+
57
+ # Precise matching to avoid cross-provider confusion
58
+ providers.each do |provider|
59
+ # Match only exact provider prefixes
60
+ next unless basename =~ /^[^_]*_#{provider}_/ || # For first section like "chat_openai_"
61
+ basename =~ /_#{provider}_[^_]+_/ # For middle sections like "_openai_gpt4_"
62
+
63
+ cassettes << file
64
+ break
65
+ end
66
+ end
67
+
68
+ cassettes
69
+ end
70
+
71
+ def delete_cassettes(cassettes)
72
+ puts "Deleting #{cassettes.size} cassettes for re-recording:"
73
+ cassettes.each do |file|
74
+ puts " - #{File.basename(file)}"
75
+ File.delete(file)
76
+ end
77
+ end
78
+
79
+ def run_tests
80
+ system('bundle exec rspec') || abort('Tests failed')
81
+ end
82
+
83
+ namespace :vcr do
84
+ desc 'Record VCR cassettes (rake vcr:record[all] or vcr:record[openai,anthropic])'
85
+ task :record, [:providers] do |_, args|
86
+ require 'fileutils'
87
+ require 'ruby_llm'
88
+
89
+ providers = (args[:providers] || '').downcase.split(',')
90
+ cassette_dir = 'spec/fixtures/vcr_cassettes'
91
+ FileUtils.mkdir_p(cassette_dir)
92
+
93
+ if providers.include?('all')
94
+ record_all_cassettes(cassette_dir)
95
+ else
96
+ record_for_providers(providers, cassette_dir)
97
+ end
98
+ end
99
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_llm_community
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Shippy
@@ -121,18 +121,139 @@ dependencies:
121
121
  - - "~>"
122
122
  - !ruby/object:Gem::Version
123
123
  version: '2'
124
- description: RubyLLM with the latest contributions from the community. Placeholder
125
- - coming soon.
124
+ description: One beautiful Ruby API for GPT, Claude, Gemini, and more. Easily build
125
+ chatbots, AI agents, RAG applications, and content generators. Features chat (text,
126
+ images, audio, PDFs), image generation, embeddings, tools (function calling), structured
127
+ output, Rails integration, and streaming. Works with OpenAI, Anthropic, Google Gemini,
128
+ AWS Bedrock, DeepSeek, Mistral, Ollama (local models), OpenRouter, Perplexity, GPUStack,
129
+ and any OpenAI-compatible API. Minimal dependencies - just Faraday, Zeitwerk, and
130
+ Marcel. With additional features from the community.
126
131
  email:
127
132
  - pshippy@gmail.com
128
133
  executables: []
129
134
  extensions: []
130
135
  extra_rdoc_files: []
131
- files: []
132
- homepage: https://github.com/tpaulshippy/ruby_llm_community
136
+ files:
137
+ - LICENSE
138
+ - README.md
139
+ - lib/generators/ruby_llm/install/templates/INSTALL_INFO.md.tt
140
+ - lib/generators/ruby_llm/install/templates/chat_model.rb.tt
141
+ - lib/generators/ruby_llm/install/templates/create_chats_migration.rb.tt
142
+ - lib/generators/ruby_llm/install/templates/create_messages_migration.rb.tt
143
+ - lib/generators/ruby_llm/install/templates/create_tool_calls_migration.rb.tt
144
+ - lib/generators/ruby_llm/install/templates/initializer.rb.tt
145
+ - lib/generators/ruby_llm/install/templates/message_model.rb.tt
146
+ - lib/generators/ruby_llm/install/templates/tool_call_model.rb.tt
147
+ - lib/generators/ruby_llm/install_generator.rb
148
+ - lib/ruby_llm.rb
149
+ - lib/ruby_llm/active_record/acts_as.rb
150
+ - lib/ruby_llm/aliases.json
151
+ - lib/ruby_llm/aliases.rb
152
+ - lib/ruby_llm/attachment.rb
153
+ - lib/ruby_llm/chat.rb
154
+ - lib/ruby_llm/chunk.rb
155
+ - lib/ruby_llm/configuration.rb
156
+ - lib/ruby_llm/connection.rb
157
+ - lib/ruby_llm/content.rb
158
+ - lib/ruby_llm/context.rb
159
+ - lib/ruby_llm/embedding.rb
160
+ - lib/ruby_llm/error.rb
161
+ - lib/ruby_llm/image.rb
162
+ - lib/ruby_llm/message.rb
163
+ - lib/ruby_llm/mime_type.rb
164
+ - lib/ruby_llm/model.rb
165
+ - lib/ruby_llm/model/info.rb
166
+ - lib/ruby_llm/model/modalities.rb
167
+ - lib/ruby_llm/model/pricing.rb
168
+ - lib/ruby_llm/model/pricing_category.rb
169
+ - lib/ruby_llm/model/pricing_tier.rb
170
+ - lib/ruby_llm/models.json
171
+ - lib/ruby_llm/models.rb
172
+ - lib/ruby_llm/models_schema.json
173
+ - lib/ruby_llm/provider.rb
174
+ - lib/ruby_llm/providers/anthropic.rb
175
+ - lib/ruby_llm/providers/anthropic/capabilities.rb
176
+ - lib/ruby_llm/providers/anthropic/chat.rb
177
+ - lib/ruby_llm/providers/anthropic/embeddings.rb
178
+ - lib/ruby_llm/providers/anthropic/media.rb
179
+ - lib/ruby_llm/providers/anthropic/models.rb
180
+ - lib/ruby_llm/providers/anthropic/streaming.rb
181
+ - lib/ruby_llm/providers/anthropic/tools.rb
182
+ - lib/ruby_llm/providers/bedrock.rb
183
+ - lib/ruby_llm/providers/bedrock/capabilities.rb
184
+ - lib/ruby_llm/providers/bedrock/chat.rb
185
+ - lib/ruby_llm/providers/bedrock/media.rb
186
+ - lib/ruby_llm/providers/bedrock/models.rb
187
+ - lib/ruby_llm/providers/bedrock/signing.rb
188
+ - lib/ruby_llm/providers/bedrock/streaming.rb
189
+ - lib/ruby_llm/providers/bedrock/streaming/base.rb
190
+ - lib/ruby_llm/providers/bedrock/streaming/content_extraction.rb
191
+ - lib/ruby_llm/providers/bedrock/streaming/message_processing.rb
192
+ - lib/ruby_llm/providers/bedrock/streaming/payload_processing.rb
193
+ - lib/ruby_llm/providers/bedrock/streaming/prelude_handling.rb
194
+ - lib/ruby_llm/providers/deepseek.rb
195
+ - lib/ruby_llm/providers/deepseek/capabilities.rb
196
+ - lib/ruby_llm/providers/deepseek/chat.rb
197
+ - lib/ruby_llm/providers/gemini.rb
198
+ - lib/ruby_llm/providers/gemini/capabilities.rb
199
+ - lib/ruby_llm/providers/gemini/chat.rb
200
+ - lib/ruby_llm/providers/gemini/embeddings.rb
201
+ - lib/ruby_llm/providers/gemini/images.rb
202
+ - lib/ruby_llm/providers/gemini/media.rb
203
+ - lib/ruby_llm/providers/gemini/models.rb
204
+ - lib/ruby_llm/providers/gemini/streaming.rb
205
+ - lib/ruby_llm/providers/gemini/tools.rb
206
+ - lib/ruby_llm/providers/gpustack.rb
207
+ - lib/ruby_llm/providers/gpustack/chat.rb
208
+ - lib/ruby_llm/providers/gpustack/models.rb
209
+ - lib/ruby_llm/providers/mistral.rb
210
+ - lib/ruby_llm/providers/mistral/capabilities.rb
211
+ - lib/ruby_llm/providers/mistral/chat.rb
212
+ - lib/ruby_llm/providers/mistral/embeddings.rb
213
+ - lib/ruby_llm/providers/mistral/models.rb
214
+ - lib/ruby_llm/providers/ollama.rb
215
+ - lib/ruby_llm/providers/ollama/chat.rb
216
+ - lib/ruby_llm/providers/ollama/media.rb
217
+ - lib/ruby_llm/providers/openai.rb
218
+ - lib/ruby_llm/providers/openai/capabilities.rb
219
+ - lib/ruby_llm/providers/openai/chat.rb
220
+ - lib/ruby_llm/providers/openai/embeddings.rb
221
+ - lib/ruby_llm/providers/openai/images.rb
222
+ - lib/ruby_llm/providers/openai/media.rb
223
+ - lib/ruby_llm/providers/openai/models.rb
224
+ - lib/ruby_llm/providers/openai/response.rb
225
+ - lib/ruby_llm/providers/openai/response_media.rb
226
+ - lib/ruby_llm/providers/openai/streaming.rb
227
+ - lib/ruby_llm/providers/openai/tools.rb
228
+ - lib/ruby_llm/providers/openai_base.rb
229
+ - lib/ruby_llm/providers/openrouter.rb
230
+ - lib/ruby_llm/providers/openrouter/models.rb
231
+ - lib/ruby_llm/providers/perplexity.rb
232
+ - lib/ruby_llm/providers/perplexity/capabilities.rb
233
+ - lib/ruby_llm/providers/perplexity/chat.rb
234
+ - lib/ruby_llm/providers/perplexity/models.rb
235
+ - lib/ruby_llm/railtie.rb
236
+ - lib/ruby_llm/stream_accumulator.rb
237
+ - lib/ruby_llm/streaming.rb
238
+ - lib/ruby_llm/tool.rb
239
+ - lib/ruby_llm/tool_call.rb
240
+ - lib/ruby_llm/utils.rb
241
+ - lib/ruby_llm/version.rb
242
+ - lib/tasks/aliases.rake
243
+ - lib/tasks/models_docs.rake
244
+ - lib/tasks/models_update.rake
245
+ - lib/tasks/release.rake
246
+ - lib/tasks/vcr.rake
247
+ homepage: https://rubyllm.com
133
248
  licenses:
134
249
  - MIT
135
- metadata: {}
250
+ metadata:
251
+ homepage_uri: https://rubyllm.com
252
+ source_code_uri: https://github.com/tpaulshippy/ruby_llm_community
253
+ changelog_uri: https://github.com/tpaulshippy/ruby_llm_community/commits/main
254
+ documentation_uri: https://rubyllm.com
255
+ bug_tracker_uri: https://github.com/tpaulshippy/ruby_llm_community/issues
256
+ rubygems_mfa_required: 'true'
136
257
  rdoc_options: []
137
258
  require_paths:
138
259
  - lib
@@ -149,5 +270,5 @@ required_rubygems_version: !ruby/object:Gem::Requirement
149
270
  requirements: []
150
271
  rubygems_version: 3.6.9
151
272
  specification_version: 4
152
- summary: RubyLLM with the latest contributions from the community.
273
+ summary: One beautiful Ruby API for GPT, Claude, Gemini, and more with community additions.
153
274
  test_files: []