ruby_llm 1.3.1 → 1.4.0

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 (47) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +13 -14
  3. data/lib/generators/ruby_llm/install/templates/INSTALL_INFO.md.tt +108 -0
  4. data/lib/generators/ruby_llm/install/templates/chat_model.rb.tt +3 -0
  5. data/lib/generators/ruby_llm/install/templates/create_chats_migration.rb.tt +8 -0
  6. data/lib/generators/ruby_llm/install/templates/create_messages_migration.rb.tt +15 -0
  7. data/lib/generators/ruby_llm/install/templates/create_tool_calls_migration.rb.tt +14 -0
  8. data/lib/generators/ruby_llm/install/templates/initializer.rb.tt +6 -0
  9. data/lib/generators/ruby_llm/install/templates/message_model.rb.tt +3 -0
  10. data/lib/generators/ruby_llm/install/templates/tool_call_model.rb.tt +3 -0
  11. data/lib/generators/ruby_llm/install_generator.rb +121 -0
  12. data/lib/ruby_llm/active_record/acts_as.rb +23 -5
  13. data/lib/ruby_llm/aliases.json +20 -39
  14. data/lib/ruby_llm/attachment.rb +1 -1
  15. data/lib/ruby_llm/chat.rb +68 -15
  16. data/lib/ruby_llm/configuration.rb +2 -0
  17. data/lib/ruby_llm/error.rb +1 -0
  18. data/lib/ruby_llm/message.rb +3 -1
  19. data/lib/ruby_llm/models.json +7117 -7084
  20. data/lib/ruby_llm/models.rb +2 -1
  21. data/lib/ruby_llm/provider.rb +13 -7
  22. data/lib/ruby_llm/providers/anthropic/chat.rb +13 -12
  23. data/lib/ruby_llm/providers/anthropic/media.rb +2 -0
  24. data/lib/ruby_llm/providers/anthropic/tools.rb +23 -13
  25. data/lib/ruby_llm/providers/bedrock/chat.rb +4 -5
  26. data/lib/ruby_llm/providers/bedrock/media.rb +2 -0
  27. data/lib/ruby_llm/providers/bedrock/streaming/base.rb +2 -2
  28. data/lib/ruby_llm/providers/bedrock/streaming/prelude_handling.rb +4 -4
  29. data/lib/ruby_llm/providers/gemini/chat.rb +37 -2
  30. data/lib/ruby_llm/providers/gemini/embeddings.rb +4 -2
  31. data/lib/ruby_llm/providers/gemini/media.rb +2 -0
  32. data/lib/ruby_llm/providers/gpustack/chat.rb +17 -0
  33. data/lib/ruby_llm/providers/gpustack/models.rb +55 -0
  34. data/lib/ruby_llm/providers/gpustack.rb +36 -0
  35. data/lib/ruby_llm/providers/ollama/media.rb +2 -0
  36. data/lib/ruby_llm/providers/openai/chat.rb +17 -2
  37. data/lib/ruby_llm/providers/openai/embeddings.rb +4 -3
  38. data/lib/ruby_llm/providers/openai/media.rb +2 -0
  39. data/lib/ruby_llm/providers/openai/streaming.rb +14 -0
  40. data/lib/ruby_llm/railtie.rb +5 -0
  41. data/lib/ruby_llm/stream_accumulator.rb +3 -2
  42. data/lib/ruby_llm/streaming.rb +25 -7
  43. data/lib/ruby_llm/utils.rb +10 -0
  44. data/lib/ruby_llm/version.rb +1 -1
  45. data/lib/ruby_llm.rb +3 -0
  46. data/lib/tasks/models_docs.rake +3 -2
  47. metadata +15 -3
@@ -11,7 +11,7 @@ module RubyLLM
11
11
  def stream_response(connection, payload, &block)
12
12
  accumulator = StreamAccumulator.new
13
13
 
14
- connection.post stream_url, payload do |req|
14
+ response = connection.post stream_url, payload do |req|
15
15
  if req.options.respond_to?(:on_data)
16
16
  # Handle Faraday 2.x streaming with on_data method
17
17
  req.options.on_data = handle_stream do |chunk|
@@ -27,7 +27,7 @@ module RubyLLM
27
27
  end
28
28
  end
29
29
 
30
- accumulator.to_message
30
+ accumulator.to_message(response)
31
31
  end
32
32
 
33
33
  def handle_stream(&block)
@@ -55,13 +55,13 @@ module RubyLLM
55
55
  end
56
56
  end
57
57
 
58
- def process_stream_chunk(chunk, parser, _env, &)
58
+ def process_stream_chunk(chunk, parser, env, &)
59
59
  RubyLLM.logger.debug "Received chunk: #{chunk}"
60
60
 
61
61
  if error_chunk?(chunk)
62
- handle_error_chunk(chunk, nil)
62
+ handle_error_chunk(chunk, env)
63
63
  else
64
- yield handle_sse(chunk, parser, nil, &)
64
+ yield handle_sse(chunk, parser, env, &)
65
65
  end
66
66
  end
67
67
 
@@ -88,7 +88,16 @@ module RubyLLM
88
88
  def handle_error_chunk(chunk, env)
89
89
  error_data = chunk.split("\n")[1].delete_prefix('data: ')
90
90
  status, _message = parse_streaming_error(error_data)
91
- error_response = env.merge(body: JSON.parse(error_data), status: status)
91
+ parsed_data = JSON.parse(error_data)
92
+
93
+ # Create a response-like object that works for both Faraday v1 and v2
94
+ error_response = if env
95
+ env.merge(body: parsed_data, status: status)
96
+ else
97
+ # For Faraday v1, create a simple object that responds to .status and .body
98
+ Struct.new(:body, :status).new(parsed_data, status)
99
+ end
100
+
92
101
  ErrorMiddleware.parse_error(provider: self, response: error_response)
93
102
  rescue JSON::ParserError => e
94
103
  RubyLLM.logger.debug "Failed to parse error chunk: #{e.message}"
@@ -122,7 +131,16 @@ module RubyLLM
122
131
 
123
132
  def handle_error_event(data, env)
124
133
  status, _message = parse_streaming_error(data)
125
- error_response = env.merge(body: JSON.parse(data), status: status)
134
+ parsed_data = JSON.parse(data)
135
+
136
+ # Create a response-like object that works for both Faraday v1 and v2
137
+ error_response = if env
138
+ env.merge(body: parsed_data, status: status)
139
+ else
140
+ # For Faraday v1, create a simple object that responds to .status and .body
141
+ Struct.new(:body, :status).new(parsed_data, status)
142
+ end
143
+
126
144
  ErrorMiddleware.parse_error(provider: self, response: error_response)
127
145
  rescue JSON::ParserError => e
128
146
  RubyLLM.logger.debug "Failed to parse error event: #{e.message}"
@@ -23,5 +23,15 @@ module RubyLLM
23
23
  Array(item)
24
24
  end
25
25
  end
26
+
27
+ def deep_merge(params, payload)
28
+ params.merge(payload) do |_key, params_value, payload_value|
29
+ if params_value.is_a?(Hash) && payload_value.is_a?(Hash)
30
+ deep_merge(params_value, payload_value)
31
+ else
32
+ payload_value
33
+ end
34
+ end
35
+ end
26
36
  end
27
37
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RubyLLM
4
- VERSION = '1.3.1'
4
+ VERSION = '1.4.0'
5
5
  end
data/lib/ruby_llm.rb CHANGED
@@ -18,11 +18,13 @@ loader.inflector.inflect(
18
18
  'deepseek' => 'DeepSeek',
19
19
  'bedrock' => 'Bedrock',
20
20
  'openrouter' => 'OpenRouter',
21
+ 'gpustack' => 'GPUStack',
21
22
  'pdf' => 'PDF'
22
23
  )
23
24
  loader.ignore("#{__dir__}/tasks")
24
25
  loader.ignore("#{__dir__}/ruby_llm/railtie")
25
26
  loader.ignore("#{__dir__}/ruby_llm/active_record")
27
+ loader.ignore("#{__dir__}/generators")
26
28
  loader.setup
27
29
 
28
30
  # A delightful Ruby interface to modern AI language models.
@@ -83,6 +85,7 @@ RubyLLM::Provider.register :deepseek, RubyLLM::Providers::DeepSeek
83
85
  RubyLLM::Provider.register :bedrock, RubyLLM::Providers::Bedrock
84
86
  RubyLLM::Provider.register :openrouter, RubyLLM::Providers::OpenRouter
85
87
  RubyLLM::Provider.register :ollama, RubyLLM::Providers::Ollama
88
+ RubyLLM::Provider.register :gpustack, RubyLLM::Providers::GPUStack
86
89
 
87
90
  if defined?(Rails::Railtie)
88
91
  require 'ruby_llm/railtie'
@@ -23,14 +23,15 @@ def generate_models_markdown
23
23
  layout: default
24
24
  title: Available Models
25
25
  parent: Guides
26
- nav_order: 10
26
+ nav_order: 11
27
27
  permalink: /guides/available-models
28
+ description: Browse hundreds of AI models from every major provider. Always up-to-date, automatically generated.
28
29
  ---
29
30
 
30
31
  # Available Models
31
32
  {: .no_toc }
32
33
 
33
- This guide lists all models available in RubyLLM, automatically generated from the current [model registry](https://github.com/crmne/ruby_llm/blob/main/lib/ruby_llm/models.json).
34
+ Every model, every provider, always current. Your complete AI model reference.
34
35
  {: .fs-6 .fw-300 }
35
36
 
36
37
  ## Table of contents
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_llm
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Carmine Paolino
@@ -135,6 +135,15 @@ extra_rdoc_files: []
135
135
  files:
136
136
  - LICENSE
137
137
  - README.md
138
+ - lib/generators/ruby_llm/install/templates/INSTALL_INFO.md.tt
139
+ - lib/generators/ruby_llm/install/templates/chat_model.rb.tt
140
+ - lib/generators/ruby_llm/install/templates/create_chats_migration.rb.tt
141
+ - lib/generators/ruby_llm/install/templates/create_messages_migration.rb.tt
142
+ - lib/generators/ruby_llm/install/templates/create_tool_calls_migration.rb.tt
143
+ - lib/generators/ruby_llm/install/templates/initializer.rb.tt
144
+ - lib/generators/ruby_llm/install/templates/message_model.rb.tt
145
+ - lib/generators/ruby_llm/install/templates/tool_call_model.rb.tt
146
+ - lib/generators/ruby_llm/install_generator.rb
138
147
  - lib/ruby_llm.rb
139
148
  - lib/ruby_llm/active_record/acts_as.rb
140
149
  - lib/ruby_llm/aliases.json
@@ -192,6 +201,9 @@ files:
192
201
  - lib/ruby_llm/providers/gemini/models.rb
193
202
  - lib/ruby_llm/providers/gemini/streaming.rb
194
203
  - lib/ruby_llm/providers/gemini/tools.rb
204
+ - lib/ruby_llm/providers/gpustack.rb
205
+ - lib/ruby_llm/providers/gpustack/chat.rb
206
+ - lib/ruby_llm/providers/gpustack/models.rb
195
207
  - lib/ruby_llm/providers/ollama.rb
196
208
  - lib/ruby_llm/providers/ollama/chat.rb
197
209
  - lib/ruby_llm/providers/ollama/media.rb
@@ -235,14 +247,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
235
247
  requirements:
236
248
  - - ">="
237
249
  - !ruby/object:Gem::Version
238
- version: 3.1.0
250
+ version: 3.1.3
239
251
  required_rubygems_version: !ruby/object:Gem::Requirement
240
252
  requirements:
241
253
  - - ">="
242
254
  - !ruby/object:Gem::Version
243
255
  version: '0'
244
256
  requirements: []
245
- rubygems_version: 3.6.7
257
+ rubygems_version: 3.6.9
246
258
  specification_version: 4
247
259
  summary: A single delightful Ruby way to work with AI.
248
260
  test_files: []