ruby_llm 1.6.3 → 1.7.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 (81) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -3
  3. data/lib/generators/ruby_llm/chat_ui/chat_ui_generator.rb +115 -0
  4. data/lib/generators/ruby_llm/chat_ui/templates/controllers/chats_controller.rb.tt +39 -0
  5. data/lib/generators/ruby_llm/chat_ui/templates/controllers/messages_controller.rb.tt +24 -0
  6. data/lib/generators/ruby_llm/chat_ui/templates/controllers/models_controller.rb.tt +14 -0
  7. data/lib/generators/ruby_llm/chat_ui/templates/jobs/chat_response_job.rb.tt +12 -0
  8. data/lib/generators/ruby_llm/chat_ui/templates/views/chats/_chat.html.erb.tt +16 -0
  9. data/lib/generators/ruby_llm/chat_ui/templates/views/chats/_form.html.erb.tt +29 -0
  10. data/lib/generators/ruby_llm/chat_ui/templates/views/chats/index.html.erb.tt +16 -0
  11. data/lib/generators/ruby_llm/chat_ui/templates/views/chats/new.html.erb.tt +11 -0
  12. data/lib/generators/ruby_llm/chat_ui/templates/views/chats/show.html.erb.tt +23 -0
  13. data/lib/generators/ruby_llm/chat_ui/templates/views/messages/_form.html.erb.tt +21 -0
  14. data/lib/generators/ruby_llm/chat_ui/templates/views/messages/_message.html.erb.tt +10 -0
  15. data/lib/generators/ruby_llm/chat_ui/templates/views/messages/create.turbo_stream.erb.tt +9 -0
  16. data/lib/generators/ruby_llm/chat_ui/templates/views/models/_model.html.erb.tt +16 -0
  17. data/lib/generators/ruby_llm/chat_ui/templates/views/models/index.html.erb.tt +30 -0
  18. data/lib/generators/ruby_llm/chat_ui/templates/views/models/show.html.erb.tt +18 -0
  19. data/lib/generators/ruby_llm/install/templates/chat_model.rb.tt +2 -2
  20. data/lib/generators/ruby_llm/install/templates/create_chats_migration.rb.tt +4 -4
  21. data/lib/generators/ruby_llm/install/templates/create_messages_migration.rb.tt +8 -7
  22. data/lib/generators/ruby_llm/install/templates/create_models_migration.rb.tt +43 -0
  23. data/lib/generators/ruby_llm/install/templates/create_tool_calls_migration.rb.tt +6 -5
  24. data/lib/generators/ruby_llm/install/templates/initializer.rb.tt +10 -4
  25. data/lib/generators/ruby_llm/install/templates/message_model.rb.tt +4 -3
  26. data/lib/generators/ruby_llm/install/templates/model_model.rb.tt +3 -0
  27. data/lib/generators/ruby_llm/install/templates/tool_call_model.rb.tt +2 -2
  28. data/lib/generators/ruby_llm/install_generator.rb +129 -33
  29. data/lib/generators/ruby_llm/upgrade_to_v1_7/templates/migration.rb.tt +137 -0
  30. data/lib/generators/ruby_llm/upgrade_to_v1_7_generator.rb +160 -0
  31. data/lib/ruby_llm/active_record/acts_as.rb +112 -319
  32. data/lib/ruby_llm/active_record/acts_as_legacy.rb +398 -0
  33. data/lib/ruby_llm/active_record/chat_methods.rb +336 -0
  34. data/lib/ruby_llm/active_record/message_methods.rb +72 -0
  35. data/lib/ruby_llm/active_record/model_methods.rb +84 -0
  36. data/lib/ruby_llm/aliases.json +58 -13
  37. data/lib/ruby_llm/attachment.rb +20 -0
  38. data/lib/ruby_llm/chat.rb +8 -7
  39. data/lib/ruby_llm/configuration.rb +9 -0
  40. data/lib/ruby_llm/connection.rb +4 -4
  41. data/lib/ruby_llm/model/info.rb +12 -0
  42. data/lib/ruby_llm/models.json +3579 -2029
  43. data/lib/ruby_llm/models.rb +51 -22
  44. data/lib/ruby_llm/provider.rb +3 -3
  45. data/lib/ruby_llm/providers/anthropic/chat.rb +2 -2
  46. data/lib/ruby_llm/providers/anthropic/media.rb +1 -1
  47. data/lib/ruby_llm/providers/anthropic/tools.rb +1 -1
  48. data/lib/ruby_llm/providers/bedrock/chat.rb +2 -2
  49. data/lib/ruby_llm/providers/bedrock/models.rb +19 -1
  50. data/lib/ruby_llm/providers/gemini/chat.rb +53 -25
  51. data/lib/ruby_llm/providers/gemini/media.rb +1 -1
  52. data/lib/ruby_llm/providers/gpustack/chat.rb +11 -0
  53. data/lib/ruby_llm/providers/gpustack/media.rb +45 -0
  54. data/lib/ruby_llm/providers/gpustack/models.rb +44 -8
  55. data/lib/ruby_llm/providers/gpustack.rb +1 -0
  56. data/lib/ruby_llm/providers/ollama/media.rb +2 -6
  57. data/lib/ruby_llm/providers/ollama/models.rb +36 -0
  58. data/lib/ruby_llm/providers/ollama.rb +1 -0
  59. data/lib/ruby_llm/providers/openai/chat.rb +1 -1
  60. data/lib/ruby_llm/providers/openai/media.rb +4 -4
  61. data/lib/ruby_llm/providers/openai/tools.rb +11 -6
  62. data/lib/ruby_llm/providers/openai.rb +2 -2
  63. data/lib/ruby_llm/providers/vertexai/chat.rb +14 -0
  64. data/lib/ruby_llm/providers/vertexai/embeddings.rb +32 -0
  65. data/lib/ruby_llm/providers/vertexai/models.rb +130 -0
  66. data/lib/ruby_llm/providers/vertexai/streaming.rb +14 -0
  67. data/lib/ruby_llm/providers/vertexai.rb +55 -0
  68. data/lib/ruby_llm/railtie.rb +20 -3
  69. data/lib/ruby_llm/streaming.rb +1 -1
  70. data/lib/ruby_llm/utils.rb +5 -9
  71. data/lib/ruby_llm/version.rb +1 -1
  72. data/lib/ruby_llm.rb +4 -3
  73. data/lib/tasks/models.rake +525 -0
  74. data/lib/tasks/release.rake +37 -2
  75. data/lib/tasks/ruby_llm.rake +15 -0
  76. data/lib/tasks/vcr.rake +2 -2
  77. metadata +37 -5
  78. data/lib/generators/ruby_llm/install/templates/INSTALL_INFO.md.tt +0 -108
  79. data/lib/tasks/aliases.rake +0 -205
  80. data/lib/tasks/models_docs.rake +0 -214
  81. data/lib/tasks/models_update.rake +0 -108
@@ -1,108 +0,0 @@
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 = RubyLLM::Models.schema_file
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