dify_llm 1.9.0 → 1.9.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 75dbb53612d3fa2c1089038bcf48fbbc0fe9425d37ffd8fccdfa56337daf97af
4
- data.tar.gz: 316d3ef004a7387a6e723a02f8ab09729b167097127f9cb85ce5a864e6e4ef1e
3
+ metadata.gz: d85ea7861e7fdc76f629a92f9aa4768d61d8ad6ad069d540c35943356ab622cc
4
+ data.tar.gz: f684857d9908d597c2f913e0f57fad58e71bab4be9698e29dee95ec49c571f74
5
5
  SHA512:
6
- metadata.gz: bca45bf0d49f6e98e9ea00cf2e760537fbff5f861394080f8dec8baa634784289f23779476eedbda5c9d11e4323e2a67f6eadc84144c18cd4adc7d09e3b9cfe7
7
- data.tar.gz: a12a868701ae4e70f6f397de290d3bc018da91993950366d956fd8d60f0c37cc8ef89f882a680db396336258107e032f881817224668b81d9d65b3f53c1f44d9
6
+ metadata.gz: 71a889822eeb0a384e5dd9639eb92db1dc1d9da7d6da02fcc97000596affdb023ae32d9bebc341bf6810050b2146198fdb90af544d99a8d70a2b84be05dfe87e
7
+ data.tar.gz: 912691efa352436b5cc6ba1d1b5fbf0890e48591399b5c6e98f44a7d6c2721f2164ae1acebe906d48f987ce0f4cb90ff261cef66c35e7f8982133c31c9bfebfb
@@ -52,8 +52,10 @@ module RubyLLM
52
52
  def acts_as_chat_declaration
53
53
  params = []
54
54
 
55
- add_association_params(params, :messages, message_table_name, message_model_name, plural: true)
56
- add_association_params(params, :model, model_table_name, model_model_name)
55
+ add_association_params(params, :messages, message_table_name, message_model_name,
56
+ owner_table: chat_table_name, plural: true)
57
+ add_association_params(params, :model, model_table_name, model_model_name,
58
+ owner_table: chat_table_name)
57
59
 
58
60
  "acts_as_chat#{" #{params.join(', ')}" if params.any?}"
59
61
  end
@@ -61,9 +63,12 @@ module RubyLLM
61
63
  def acts_as_message_declaration
62
64
  params = []
63
65
 
64
- add_association_params(params, :chat, chat_table_name, chat_model_name)
65
- add_association_params(params, :tool_calls, tool_call_table_name, tool_call_model_name, plural: true)
66
- add_association_params(params, :model, model_table_name, model_model_name)
66
+ add_association_params(params, :chat, chat_table_name, chat_model_name,
67
+ owner_table: message_table_name)
68
+ add_association_params(params, :tool_calls, tool_call_table_name, tool_call_model_name,
69
+ owner_table: message_table_name, plural: true)
70
+ add_association_params(params, :model, model_table_name, model_model_name,
71
+ owner_table: message_table_name)
67
72
 
68
73
  "acts_as_message#{" #{params.join(', ')}" if params.any?}"
69
74
  end
@@ -71,7 +76,8 @@ module RubyLLM
71
76
  def acts_as_model_declaration
72
77
  params = []
73
78
 
74
- add_association_params(params, :chats, chat_table_name, chat_model_name, plural: true)
79
+ add_association_params(params, :chats, chat_table_name, chat_model_name,
80
+ owner_table: model_table_name, plural: true)
75
81
 
76
82
  "acts_as_model#{" #{params.join(', ')}" if params.any?}"
77
83
  end
@@ -79,7 +85,8 @@ module RubyLLM
79
85
  def acts_as_tool_call_declaration
80
86
  params = []
81
87
 
82
- add_association_params(params, :message, message_table_name, message_model_name)
88
+ add_association_params(params, :message, message_table_name, message_model_name,
89
+ owner_table: tool_call_table_name)
83
90
 
84
91
  "acts_as_tool_call#{" #{params.join(', ')}" if params.any?}"
85
92
  end
@@ -120,6 +127,12 @@ module RubyLLM
120
127
  false
121
128
  end
122
129
 
130
+ def mysql?
131
+ ::ActiveRecord::Base.connection.adapter_name.downcase.include?('mysql')
132
+ rescue StandardError
133
+ false
134
+ end
135
+
123
136
  def table_exists?(table_name)
124
137
  ::ActiveRecord::Base.connection.table_exists?(table_name)
125
138
  rescue StandardError
@@ -128,13 +141,21 @@ module RubyLLM
128
141
 
129
142
  private
130
143
 
131
- def add_association_params(params, default_assoc, table_name, model_name, plural: false)
144
+ def add_association_params(params, default_assoc, table_name, model_name, owner_table:, plural: false) # rubocop:disable Metrics/ParameterLists
132
145
  assoc = plural ? table_name.to_sym : table_name.singularize.to_sym
133
146
 
134
- return if assoc == default_assoc
147
+ default_foreign_key = "#{default_assoc}_id"
148
+ # has_many/has_one: foreign key is on the associated table pointing back to owner
149
+ # belongs_to: foreign key is on the owner table pointing to associated table
150
+ foreign_key = if plural || default_assoc.to_s.pluralize == default_assoc.to_s # has_many or has_one
151
+ "#{owner_table.singularize}_id"
152
+ else # belongs_to
153
+ "#{table_name.singularize}_id"
154
+ end
135
155
 
136
- params << "#{default_assoc}: :#{assoc}"
156
+ params << "#{default_assoc}: :#{assoc}" if assoc != default_assoc
137
157
  params << "#{default_assoc.to_s.singularize}_class: '#{model_name}'" if model_name != assoc.to_s.classify
158
+ params << "#{default_assoc}_foreign_key: :#{foreign_key}" if foreign_key != default_foreign_key
138
159
  end
139
160
 
140
161
  # Convert namespaced model names to proper table names
@@ -14,6 +14,11 @@ class Create<%= model_model_name.gsub('::', '').pluralize %> < ActiveRecord::Mig
14
14
  t.jsonb :capabilities, default: []
15
15
  t.jsonb :pricing, default: {}
16
16
  t.jsonb :metadata, default: {}
17
+ <% elsif mysql? %>
18
+ t.json :modalities
19
+ t.json :capabilities
20
+ t.json :pricing
21
+ t.json :metadata
17
22
  <% else %>
18
23
  t.json :modalities, default: {}
19
24
  t.json :capabilities, default: []
@@ -4,7 +4,13 @@ class Create<%= tool_call_model_name.gsub('::', '').pluralize %> < ActiveRecord:
4
4
  create_table :<%= tool_call_table_name %> do |t|
5
5
  t.string :tool_call_id, null: false
6
6
  t.string :name, null: false
7
- t.<%= postgresql? ? 'jsonb' : 'json' %> :arguments, default: {}
7
+ <% if postgresql? %>
8
+ t.jsonb :arguments, default: {}
9
+ <% elsif mysql? %>
10
+ t.json :arguments
11
+ <% else %>
12
+ t.json :arguments, default: {}
13
+ <% end %>
8
14
  t.timestamps
9
15
  end
10
16
 
@@ -31,8 +31,8 @@ module RubyLLM
31
31
  end
32
32
 
33
33
  class_methods do # rubocop:disable Metrics/BlockLength
34
- def acts_as_chat(messages: :messages, message_class: nil,
35
- model: :model, model_class: nil)
34
+ def acts_as_chat(messages: :messages, message_class: nil, messages_foreign_key: nil, # rubocop:disable Metrics/ParameterLists
35
+ model: :model, model_class: nil, model_foreign_key: nil)
36
36
  include RubyLLM::ActiveRecord::ChatMethods
37
37
 
38
38
  class_attribute :messages_association_name, :model_association_name, :message_class, :model_class
@@ -45,12 +45,12 @@ module RubyLLM
45
45
  has_many messages,
46
46
  -> { order(created_at: :asc) },
47
47
  class_name: self.message_class,
48
- foreign_key: ActiveSupport::Inflector.foreign_key(table_name.singularize),
48
+ foreign_key: messages_foreign_key,
49
49
  dependent: :destroy
50
50
 
51
51
  belongs_to model,
52
52
  class_name: self.model_class,
53
- foreign_key: ActiveSupport::Inflector.foreign_key(model.to_s.singularize),
53
+ foreign_key: model_foreign_key,
54
54
  optional: true
55
55
 
56
56
  delegate :add_message, to: :to_llm
@@ -68,7 +68,7 @@ module RubyLLM
68
68
  end
69
69
  end
70
70
 
71
- def acts_as_model(chats: :chats, chat_class: nil)
71
+ def acts_as_model(chats: :chats, chat_class: nil, chats_foreign_key: nil)
72
72
  include RubyLLM::ActiveRecord::ModelMethods
73
73
 
74
74
  class_attribute :chats_association_name, :chat_class
@@ -80,18 +80,16 @@ module RubyLLM
80
80
  validates :provider, presence: true
81
81
  validates :name, presence: true
82
82
 
83
- has_many chats,
84
- class_name: self.chat_class,
85
- foreign_key: ActiveSupport::Inflector.foreign_key(table_name.singularize)
83
+ has_many chats, class_name: self.chat_class, foreign_key: chats_foreign_key
86
84
 
87
85
  define_method :chats_association do
88
86
  send(chats_association_name)
89
87
  end
90
88
  end
91
89
 
92
- def acts_as_message(chat: :chat, chat_class: nil, touch_chat: false, # rubocop:disable Metrics/ParameterLists
93
- tool_calls: :tool_calls, tool_call_class: nil,
94
- model: :model, model_class: nil)
90
+ def acts_as_message(chat: :chat, chat_class: nil, chat_foreign_key: nil, touch_chat: false, # rubocop:disable Metrics/ParameterLists
91
+ tool_calls: :tool_calls, tool_call_class: nil, tool_calls_foreign_key: nil,
92
+ model: :model, model_class: nil, model_foreign_key: nil)
95
93
  include RubyLLM::ActiveRecord::MessageMethods
96
94
 
97
95
  class_attribute :chat_association_name, :tool_calls_association_name, :model_association_name,
@@ -106,12 +104,12 @@ module RubyLLM
106
104
 
107
105
  belongs_to chat,
108
106
  class_name: self.chat_class,
109
- foreign_key: ActiveSupport::Inflector.foreign_key(chat.to_s.singularize),
107
+ foreign_key: chat_foreign_key,
110
108
  touch: touch_chat
111
109
 
112
110
  has_many tool_calls,
113
111
  class_name: self.tool_call_class,
114
- foreign_key: ActiveSupport::Inflector.foreign_key(table_name.singularize),
112
+ foreign_key: tool_calls_foreign_key,
115
113
  dependent: :destroy
116
114
 
117
115
  belongs_to :parent_tool_call,
@@ -126,7 +124,7 @@ module RubyLLM
126
124
 
127
125
  belongs_to model,
128
126
  class_name: self.model_class,
129
- foreign_key: ActiveSupport::Inflector.foreign_key(model.to_s.singularize),
127
+ foreign_key: model_foreign_key,
130
128
  optional: true
131
129
 
132
130
  delegate :tool_call?, :tool_result?, to: :to_llm
@@ -144,8 +142,8 @@ module RubyLLM
144
142
  end
145
143
  end
146
144
 
147
- def acts_as_tool_call(message: :message, message_class: nil,
148
- result: :result, result_class: nil)
145
+ def acts_as_tool_call(message: :message, message_class: nil, message_foreign_key: nil, # rubocop:disable Metrics/ParameterLists
146
+ result: :result, result_class: nil, result_foreign_key: nil)
149
147
  class_attribute :message_association_name, :result_association_name, :message_class, :result_class
150
148
 
151
149
  self.message_association_name = message
@@ -155,11 +153,11 @@ module RubyLLM
155
153
 
156
154
  belongs_to message,
157
155
  class_name: self.message_class,
158
- foreign_key: ActiveSupport::Inflector.foreign_key(message.to_s.singularize)
156
+ foreign_key: message_foreign_key
159
157
 
160
158
  has_one result,
161
159
  class_name: self.result_class,
162
- foreign_key: ActiveSupport::Inflector.foreign_key(table_name.singularize),
160
+ foreign_key: result_foreign_key,
163
161
  dependent: :nullify
164
162
 
165
163
  define_method :message_association do
@@ -11,11 +11,6 @@
11
11
  "claude-3-5-haiku-latest": {
12
12
  "anthropic": "claude-3-5-haiku-latest"
13
13
  },
14
- "claude-3-5-sonnet": {
15
- "anthropic": "claude-3-5-sonnet-20241022",
16
- "openrouter": "anthropic/claude-3.5-sonnet",
17
- "bedrock": "anthropic.claude-3-5-sonnet-20240620-v1:0:200k"
18
- },
19
14
  "claude-3-7-sonnet": {
20
15
  "anthropic": "claude-3-7-sonnet-20250219",
21
16
  "openrouter": "anthropic/claude-3.7-sonnet",
@@ -265,14 +260,6 @@
265
260
  "openai": "o1",
266
261
  "openrouter": "openai/o1"
267
262
  },
268
- "o1-mini": {
269
- "openai": "o1-mini",
270
- "openrouter": "openai/o1-mini"
271
- },
272
- "o1-mini-2024-09-12": {
273
- "openai": "o1-mini-2024-09-12",
274
- "openrouter": "openai/o1-mini-2024-09-12"
275
- },
276
263
  "o1-pro": {
277
264
  "openai": "o1-pro",
278
265
  "openrouter": "openai/o1-pro"
@@ -7,19 +7,8 @@ module RubyLLM
7
7
 
8
8
  def initialize(source, filename: nil)
9
9
  @source = source
10
- if url?
11
- @source = URI source
12
- @filename = filename || File.basename(@source.path).to_s
13
- elsif uuid?
14
- @upload_file_id = source
15
- elsif path?
16
- @source = Pathname.new source
17
- @filename = filename || @source.basename.to_s
18
- elsif active_storage?
19
- @filename = filename || extract_filename_from_active_storage
20
- else
21
- @filename = filename
22
- end
10
+ @source = source_type_cast
11
+ @filename = filename || source_filename
23
12
 
24
13
  determine_mime_type if @upload_file_id.nil?
25
14
  end
@@ -173,6 +162,40 @@ module RubyLLM
173
162
  end
174
163
  end
175
164
 
165
+ def source_type_cast
166
+ if url?
167
+ URI(@source)
168
+ elsif uuid?
169
+ @upload_file_id = @source
170
+ elsif path?
171
+ Pathname.new(@source)
172
+ else
173
+ @source
174
+ end
175
+ end
176
+
177
+ def source_filename
178
+ if url?
179
+ File.basename(@source.path).to_s
180
+ elsif path?
181
+ @source.basename.to_s
182
+ elsif io_like?
183
+ extract_filename_from_io
184
+ elsif active_storage?
185
+ extract_filename_from_active_storage
186
+ end
187
+ end
188
+
189
+ def extract_filename_from_io
190
+ if defined?(ActionDispatch::Http::UploadedFile) && @source.is_a?(ActionDispatch::Http::UploadedFile)
191
+ @source.original_filename.to_s
192
+ elsif @source.respond_to?(:path)
193
+ File.basename(@source.path).to_s
194
+ else
195
+ 'attachment'
196
+ end
197
+ end
198
+
176
199
  def extract_filename_from_active_storage # rubocop:disable Metrics/PerceivedComplexity
177
200
  return 'attachment' unless defined?(ActiveStorage)
178
201