ruby_llm-agents 3.1.0 → 3.3.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 (89) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -0
  3. data/app/controllers/ruby_llm/agents/agents_controller.rb +16 -14
  4. data/app/controllers/ruby_llm/agents/dashboard_controller.rb +20 -20
  5. data/app/controllers/ruby_llm/agents/executions_controller.rb +5 -7
  6. data/app/helpers/ruby_llm/agents/application_helper.rb +57 -58
  7. data/app/models/ruby_llm/agents/execution/analytics.rb +27 -27
  8. data/app/models/ruby_llm/agents/execution/scopes.rb +4 -6
  9. data/app/models/ruby_llm/agents/execution.rb +25 -25
  10. data/app/models/ruby_llm/agents/tenant/budgetable.rb +16 -10
  11. data/app/models/ruby_llm/agents/tenant/resettable.rb +12 -12
  12. data/app/models/ruby_llm/agents/tenant/trackable.rb +7 -7
  13. data/app/services/ruby_llm/agents/agent_registry.rb +6 -6
  14. data/app/views/ruby_llm/agents/executions/_audio_player.html.erb +57 -0
  15. data/app/views/ruby_llm/agents/executions/show.html.erb +8 -0
  16. data/lib/generators/ruby_llm_agents/agent_generator.rb +4 -4
  17. data/lib/generators/ruby_llm_agents/background_remover_generator.rb +6 -6
  18. data/lib/generators/ruby_llm_agents/embedder_generator.rb +4 -4
  19. data/lib/generators/ruby_llm_agents/image_analyzer_generator.rb +7 -7
  20. data/lib/generators/ruby_llm_agents/image_editor_generator.rb +4 -4
  21. data/lib/generators/ruby_llm_agents/image_generator_generator.rb +6 -6
  22. data/lib/generators/ruby_llm_agents/image_pipeline_generator.rb +9 -9
  23. data/lib/generators/ruby_llm_agents/image_transformer_generator.rb +6 -6
  24. data/lib/generators/ruby_llm_agents/image_upscaler_generator.rb +4 -4
  25. data/lib/generators/ruby_llm_agents/image_variator_generator.rb +4 -4
  26. data/lib/generators/ruby_llm_agents/install_generator.rb +3 -3
  27. data/lib/generators/ruby_llm_agents/migrate_structure_generator.rb +4 -4
  28. data/lib/generators/ruby_llm_agents/multi_tenancy_generator.rb +2 -2
  29. data/lib/generators/ruby_llm_agents/restructure_generator.rb +13 -13
  30. data/lib/generators/ruby_llm_agents/speaker_generator.rb +6 -6
  31. data/lib/generators/ruby_llm_agents/transcriber_generator.rb +4 -4
  32. data/lib/generators/ruby_llm_agents/upgrade_generator.rb +2 -2
  33. data/lib/ruby_llm/agents/audio/speaker/active_storage_support.rb +87 -0
  34. data/lib/ruby_llm/agents/audio/speaker.rb +50 -31
  35. data/lib/ruby_llm/agents/audio/speech_client.rb +328 -0
  36. data/lib/ruby_llm/agents/audio/speech_pricing.rb +273 -0
  37. data/lib/ruby_llm/agents/audio/transcriber.rb +43 -33
  38. data/lib/ruby_llm/agents/base_agent.rb +14 -14
  39. data/lib/ruby_llm/agents/core/base/callbacks.rb +3 -3
  40. data/lib/ruby_llm/agents/core/configuration.rb +90 -73
  41. data/lib/ruby_llm/agents/core/errors.rb +27 -2
  42. data/lib/ruby_llm/agents/core/instrumentation.rb +64 -66
  43. data/lib/ruby_llm/agents/core/llm_tenant.rb +7 -7
  44. data/lib/ruby_llm/agents/core/version.rb +1 -1
  45. data/lib/ruby_llm/agents/dsl/base.rb +3 -3
  46. data/lib/ruby_llm/agents/dsl/reliability.rb +9 -9
  47. data/lib/ruby_llm/agents/image/analyzer/dsl.rb +1 -1
  48. data/lib/ruby_llm/agents/image/analyzer/execution.rb +4 -4
  49. data/lib/ruby_llm/agents/image/background_remover/dsl.rb +1 -1
  50. data/lib/ruby_llm/agents/image/background_remover/execution.rb +3 -3
  51. data/lib/ruby_llm/agents/image/concerns/image_operation_execution.rb +8 -8
  52. data/lib/ruby_llm/agents/image/editor/execution.rb +1 -1
  53. data/lib/ruby_llm/agents/image/generator/pricing.rb +9 -10
  54. data/lib/ruby_llm/agents/image/generator.rb +6 -6
  55. data/lib/ruby_llm/agents/image/pipeline/dsl.rb +6 -6
  56. data/lib/ruby_llm/agents/image/pipeline/execution.rb +9 -9
  57. data/lib/ruby_llm/agents/image/pipeline.rb +1 -1
  58. data/lib/ruby_llm/agents/image/transformer/execution.rb +1 -1
  59. data/lib/ruby_llm/agents/image/upscaler/dsl.rb +1 -1
  60. data/lib/ruby_llm/agents/image/upscaler/execution.rb +3 -5
  61. data/lib/ruby_llm/agents/image/variator/execution.rb +1 -1
  62. data/lib/ruby_llm/agents/infrastructure/alert_manager.rb +4 -4
  63. data/lib/ruby_llm/agents/infrastructure/attempt_tracker.rb +4 -4
  64. data/lib/ruby_llm/agents/infrastructure/budget/budget_query.rb +9 -9
  65. data/lib/ruby_llm/agents/infrastructure/budget/config_resolver.rb +3 -3
  66. data/lib/ruby_llm/agents/infrastructure/budget/forecaster.rb +1 -1
  67. data/lib/ruby_llm/agents/infrastructure/budget/spend_recorder.rb +17 -17
  68. data/lib/ruby_llm/agents/infrastructure/circuit_breaker.rb +1 -0
  69. data/lib/ruby_llm/agents/infrastructure/execution_logger_job.rb +1 -1
  70. data/lib/ruby_llm/agents/infrastructure/reliability.rb +6 -6
  71. data/lib/ruby_llm/agents/pipeline/builder.rb +11 -11
  72. data/lib/ruby_llm/agents/pipeline/middleware/budget.rb +3 -3
  73. data/lib/ruby_llm/agents/pipeline/middleware/cache.rb +4 -4
  74. data/lib/ruby_llm/agents/pipeline/middleware/instrumentation.rb +83 -22
  75. data/lib/ruby_llm/agents/pipeline/middleware/reliability.rb +2 -3
  76. data/lib/ruby_llm/agents/pipeline/middleware/tenant.rb +7 -7
  77. data/lib/ruby_llm/agents/results/background_removal_result.rb +6 -6
  78. data/lib/ruby_llm/agents/results/embedding_result.rb +15 -15
  79. data/lib/ruby_llm/agents/results/image_analysis_result.rb +7 -7
  80. data/lib/ruby_llm/agents/results/image_edit_result.rb +4 -4
  81. data/lib/ruby_llm/agents/results/image_generation_result.rb +5 -5
  82. data/lib/ruby_llm/agents/results/image_pipeline_result.rb +4 -4
  83. data/lib/ruby_llm/agents/results/image_transform_result.rb +4 -4
  84. data/lib/ruby_llm/agents/results/image_upscale_result.rb +5 -5
  85. data/lib/ruby_llm/agents/results/image_variation_result.rb +4 -4
  86. data/lib/ruby_llm/agents/results/speech_result.rb +12 -7
  87. data/lib/ruby_llm/agents/results/transcription_result.rb +1 -1
  88. data/lib/ruby_llm/agents/text/embedder.rb +13 -13
  89. metadata +5 -1
@@ -18,9 +18,9 @@ module RubyLLM
18
18
  #
19
19
  class ImageAnalysisResult
20
20
  attr_reader :image, :model_id, :analysis_type,
21
- :caption, :description, :tags, :objects, :colors, :text,
22
- :raw_response, :started_at, :completed_at, :tenant_id, :analyzer_class,
23
- :error_class, :error_message
21
+ :caption, :description, :tags, :objects, :colors, :text,
22
+ :raw_response, :started_at, :completed_at, :tenant_id, :analyzer_class,
23
+ :error_class, :error_message
24
24
 
25
25
  # Initialize a new result
26
26
  #
@@ -41,8 +41,8 @@ module RubyLLM
41
41
  # @param error_class [String, nil] Error class name if failed
42
42
  # @param error_message [String, nil] Error message if failed
43
43
  def initialize(image:, model_id:, analysis_type:, caption:, description:, tags:,
44
- objects:, colors:, text:, raw_response:, started_at:, completed_at:,
45
- tenant_id:, analyzer_class:, error_class: nil, error_message: nil)
44
+ objects:, colors:, text:, raw_response:, started_at:, completed_at:,
45
+ tenant_id:, analyzer_class:, error_class: nil, error_message: nil)
46
46
  @image = image
47
47
  @model_id = model_id
48
48
  @analysis_type = analysis_type
@@ -235,8 +235,8 @@ module RubyLLM
235
235
  # Lightweight result for cached analyses
236
236
  class CachedImageAnalysisResult
237
237
  attr_reader :image, :model_id, :analysis_type,
238
- :caption, :description, :tags, :objects, :colors, :text,
239
- :total_cost, :cached_at
238
+ :caption, :description, :tags, :objects, :colors, :text,
239
+ :total_cost, :cached_at
240
240
 
241
241
  def initialize(data)
242
242
  @image = data[:image]
@@ -18,8 +18,8 @@ module RubyLLM
18
18
  #
19
19
  class ImageEditResult
20
20
  attr_reader :images, :source_image, :mask, :prompt, :model_id, :size,
21
- :started_at, :completed_at, :tenant_id, :editor_class,
22
- :error_class, :error_message
21
+ :started_at, :completed_at, :tenant_id, :editor_class,
22
+ :error_class, :error_message
23
23
 
24
24
  # Initialize a new result
25
25
  #
@@ -36,8 +36,8 @@ module RubyLLM
36
36
  # @param error_class [String, nil] Error class name if failed
37
37
  # @param error_message [String, nil] Error message if failed
38
38
  def initialize(images:, source_image:, mask:, prompt:, model_id:, size:,
39
- started_at:, completed_at:, tenant_id:, editor_class:,
40
- error_class: nil, error_message: nil)
39
+ started_at:, completed_at:, tenant_id:, editor_class:,
40
+ error_class: nil, error_message: nil)
41
41
  @images = images
42
42
  @source_image = source_image
43
43
  @mask = mask
@@ -21,8 +21,8 @@ module RubyLLM
21
21
  #
22
22
  class ImageGenerationResult
23
23
  attr_reader :images, :prompt, :model_id, :size, :quality, :style,
24
- :started_at, :completed_at, :tenant_id, :generator_class,
25
- :error_class, :error_message
24
+ :started_at, :completed_at, :tenant_id, :generator_class,
25
+ :error_class, :error_message
26
26
 
27
27
  # Initialize a new result
28
28
  #
@@ -39,8 +39,8 @@ module RubyLLM
39
39
  # @param error_class [String, nil] Error class name if failed
40
40
  # @param error_message [String, nil] Error message if failed
41
41
  def initialize(images:, prompt:, model_id:, size:, quality:, style:,
42
- started_at:, completed_at:, tenant_id:, generator_class:,
43
- error_class: nil, error_message: nil)
42
+ started_at:, completed_at:, tenant_id:, generator_class:,
43
+ error_class: nil, error_message: nil)
44
44
  @images = images
45
45
  @prompt = prompt
46
46
  @model_id = model_id
@@ -294,7 +294,7 @@ module RubyLLM
294
294
  #
295
295
  class CachedImageGenerationResult
296
296
  attr_reader :urls, :datas, :mime_type, :revised_prompts, :model_id,
297
- :total_cost, :cached_at
297
+ :total_cost, :cached_at
298
298
 
299
299
  def initialize(data)
300
300
  @urls = data[:urls] || []
@@ -22,7 +22,7 @@ module RubyLLM
22
22
  #
23
23
  class ImagePipelineResult
24
24
  attr_reader :step_results, :started_at, :completed_at, :tenant_id,
25
- :pipeline_class, :context, :error_class, :error_message
25
+ :pipeline_class, :context, :error_class, :error_message
26
26
 
27
27
  # Initialize a new pipeline result
28
28
  #
@@ -35,7 +35,7 @@ module RubyLLM
35
35
  # @param error_class [String, nil] Error class name if failed
36
36
  # @param error_message [String, nil] Error message if failed
37
37
  def initialize(step_results:, started_at:, completed_at:, tenant_id:,
38
- pipeline_class:, context:, error_class: nil, error_message: nil)
38
+ pipeline_class:, context:, error_class: nil, error_message: nil)
39
39
  @step_results = step_results
40
40
  @started_at = started_at
41
41
  @completed_at = completed_at
@@ -100,7 +100,7 @@ module RubyLLM
100
100
  step_data&.dig(:result)
101
101
  end
102
102
 
103
- alias [] step
103
+ alias_method :[], :step
104
104
 
105
105
  # Get step names
106
106
  #
@@ -378,7 +378,7 @@ module RubyLLM
378
378
  step_data&.dig(:cached_result)
379
379
  end
380
380
 
381
- alias [] step
381
+ alias_method :[], :step
382
382
 
383
383
  def final_image
384
384
  # Find last non-analyzer step
@@ -18,8 +18,8 @@ module RubyLLM
18
18
  #
19
19
  class ImageTransformResult
20
20
  attr_reader :images, :source_image, :prompt, :model_id, :size, :strength,
21
- :started_at, :completed_at, :tenant_id, :transformer_class,
22
- :error_class, :error_message
21
+ :started_at, :completed_at, :tenant_id, :transformer_class,
22
+ :error_class, :error_message
23
23
 
24
24
  # Initialize a new result
25
25
  #
@@ -36,8 +36,8 @@ module RubyLLM
36
36
  # @param error_class [String, nil] Error class name if failed
37
37
  # @param error_message [String, nil] Error message if failed
38
38
  def initialize(images:, source_image:, prompt:, model_id:, size:, strength:,
39
- started_at:, completed_at:, tenant_id:, transformer_class:,
40
- error_class: nil, error_message: nil)
39
+ started_at:, completed_at:, tenant_id:, transformer_class:,
40
+ error_class: nil, error_message: nil)
41
41
  @images = images
42
42
  @source_image = source_image
43
43
  @prompt = prompt
@@ -16,8 +16,8 @@ module RubyLLM
16
16
  #
17
17
  class ImageUpscaleResult
18
18
  attr_reader :image, :source_image, :model_id, :scale, :output_size, :face_enhance,
19
- :started_at, :completed_at, :tenant_id, :upscaler_class,
20
- :error_class, :error_message
19
+ :started_at, :completed_at, :tenant_id, :upscaler_class,
20
+ :error_class, :error_message
21
21
 
22
22
  # Initialize a new result
23
23
  #
@@ -34,8 +34,8 @@ module RubyLLM
34
34
  # @param error_class [String, nil] Error class name if failed
35
35
  # @param error_message [String, nil] Error message if failed
36
36
  def initialize(image:, source_image:, model_id:, scale:, output_size:, face_enhance:,
37
- started_at:, completed_at:, tenant_id:, upscaler_class:,
38
- error_class: nil, error_message: nil)
37
+ started_at:, completed_at:, tenant_id:, upscaler_class:,
38
+ error_class: nil, error_message: nil)
39
39
  @image = image
40
40
  @source_image = source_image
41
41
  @model_id = model_id
@@ -198,7 +198,7 @@ module RubyLLM
198
198
  # Lightweight result for cached upscales
199
199
  class CachedImageUpscaleResult
200
200
  attr_reader :url, :data, :mime_type, :model_id, :scale, :output_size,
201
- :total_cost, :cached_at
201
+ :total_cost, :cached_at
202
202
 
203
203
  def initialize(data)
204
204
  @url = data[:url]
@@ -15,8 +15,8 @@ module RubyLLM
15
15
  #
16
16
  class ImageVariationResult
17
17
  attr_reader :images, :source_image, :model_id, :size, :variation_strength,
18
- :started_at, :completed_at, :tenant_id, :variator_class,
19
- :error_class, :error_message
18
+ :started_at, :completed_at, :tenant_id, :variator_class,
19
+ :error_class, :error_message
20
20
 
21
21
  # Initialize a new result
22
22
  #
@@ -32,8 +32,8 @@ module RubyLLM
32
32
  # @param error_class [String, nil] Error class name if failed
33
33
  # @param error_message [String, nil] Error message if failed
34
34
  def initialize(images:, source_image:, model_id:, size:, variation_strength:,
35
- started_at:, completed_at:, tenant_id:, variator_class:,
36
- error_class: nil, error_message: nil)
35
+ started_at:, completed_at:, tenant_id:, variator_class:,
36
+ error_class: nil, error_message: nil)
37
37
  @images = images
38
38
  @source_image = source_image
39
39
  @model_id = model_id
@@ -29,17 +29,17 @@ module RubyLLM
29
29
  # @return [String, nil] Binary audio data
30
30
  attr_reader :audio
31
31
 
32
- # @!attribute [r] audio_url
32
+ # @!attribute [rw] audio_url
33
33
  # @return [String, nil] URL if audio was stored remotely
34
- attr_reader :audio_url
34
+ attr_accessor :audio_url
35
35
 
36
- # @!attribute [r] audio_key
36
+ # @!attribute [rw] audio_key
37
37
  # @return [String, nil] Storage key if stored
38
- attr_reader :audio_key
38
+ attr_accessor :audio_key
39
39
 
40
- # @!attribute [r] audio_path
40
+ # @!attribute [rw] audio_path
41
41
  # @return [String, nil] Local file path if saved
42
- attr_reader :audio_path
42
+ attr_accessor :audio_path
43
43
 
44
44
  # @!endgroup
45
45
 
@@ -308,7 +308,12 @@ module RubyLLM
308
308
  }
309
309
  end
310
310
 
311
- private
311
+ # Returns MIME type for the audio format
312
+ #
313
+ # @return [String] MIME type
314
+ def content_type
315
+ mime_type_for_format
316
+ end
312
317
 
313
318
  # Returns MIME type for the audio format
314
319
  #
@@ -322,7 +322,7 @@ module RubyLLM
322
322
  return nil unless segments.present?
323
323
 
324
324
  segments.find do |segment|
325
- timestamp >= segment[:start] && timestamp <= segment[:end]
325
+ timestamp.between?(segment[:start], segment[:end])
326
326
  end
327
327
  end
328
328
 
@@ -117,19 +117,19 @@ module RubyLLM
117
117
 
118
118
  def default_embedding_model
119
119
  RubyLLM::Agents.configuration.default_embedding_model
120
- rescue StandardError
120
+ rescue
121
121
  "text-embedding-3-small"
122
122
  end
123
123
 
124
124
  def default_embedding_dimensions
125
125
  RubyLLM::Agents.configuration.default_embedding_dimensions
126
- rescue StandardError
126
+ rescue
127
127
  nil
128
128
  end
129
129
 
130
130
  def default_embedding_batch_size
131
131
  RubyLLM::Agents.configuration.default_embedding_batch_size
132
- rescue StandardError
132
+ rescue
133
133
  100
134
134
  end
135
135
  end
@@ -333,7 +333,7 @@ module RubyLLM
333
333
  def execute_batch(texts, context = nil)
334
334
  preprocessed = texts.map { |t| preprocess(t) }
335
335
 
336
- embed_options = { model: context&.model || resolved_model }
336
+ embed_options = {model: context&.model || resolved_model}
337
337
  embed_options[:dimensions] = resolved_dimensions if resolved_dimensions
338
338
 
339
339
  response = RubyLLM.embed(preprocessed, **embed_options)
@@ -405,15 +405,15 @@ module RubyLLM
405
405
  model_name = response.model.to_s
406
406
 
407
407
  price_per_million = case model_name
408
- when /text-embedding-3-small/
409
- 0.02
410
- when /text-embedding-3-large/
411
- 0.13
412
- when /text-embedding-ada/
413
- 0.10
414
- else
415
- 0.02 # Default to small pricing
416
- end
408
+ when /text-embedding-3-small/
409
+ 0.02
410
+ when /text-embedding-3-large/
411
+ 0.13
412
+ when /text-embedding-ada/
413
+ 0.10
414
+ else
415
+ 0.02 # Default to small pricing
416
+ end
417
417
 
418
418
  (tokens / 1_000_000.0) * price_per_million
419
419
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_llm-agents
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.0
4
+ version: 3.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - adham90
@@ -111,6 +111,7 @@ files:
111
111
  - app/views/ruby_llm/agents/dashboard/_action_center.html.erb
112
112
  - app/views/ruby_llm/agents/dashboard/_tenant_budget.html.erb
113
113
  - app/views/ruby_llm/agents/dashboard/index.html.erb
114
+ - app/views/ruby_llm/agents/executions/_audio_player.html.erb
114
115
  - app/views/ruby_llm/agents/executions/_execution.html.erb
115
116
  - app/views/ruby_llm/agents/executions/_filters.html.erb
116
117
  - app/views/ruby_llm/agents/executions/_list.html.erb
@@ -209,6 +210,9 @@ files:
209
210
  - lib/ruby_llm-agents.rb
210
211
  - lib/ruby_llm/agents.rb
211
212
  - lib/ruby_llm/agents/audio/speaker.rb
213
+ - lib/ruby_llm/agents/audio/speaker/active_storage_support.rb
214
+ - lib/ruby_llm/agents/audio/speech_client.rb
215
+ - lib/ruby_llm/agents/audio/speech_pricing.rb
212
216
  - lib/ruby_llm/agents/audio/transcriber.rb
213
217
  - lib/ruby_llm/agents/base_agent.rb
214
218
  - lib/ruby_llm/agents/core/base.rb