langchainrb 0.14.0 → 0.15.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.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +15 -2
  3. data/lib/langchain/assistants/assistant.rb +175 -131
  4. data/lib/langchain/assistants/messages/ollama_message.rb +9 -21
  5. data/lib/langchain/contextual_logger.rb +11 -5
  6. data/lib/langchain/evals/ragas/faithfulness.rb +5 -1
  7. data/lib/langchain/llm/google_gemini.rb +1 -1
  8. data/lib/langchain/llm/ollama.rb +23 -17
  9. data/lib/langchain/llm/openai.rb +1 -1
  10. data/lib/langchain/llm/response/ollama_response.rb +1 -15
  11. data/lib/langchain/llm/unified_parameters.rb +2 -2
  12. data/lib/langchain/tool/calculator.rb +38 -0
  13. data/lib/langchain/tool/{database/database.rb → database.rb} +24 -12
  14. data/lib/langchain/tool/file_system.rb +44 -0
  15. data/lib/langchain/tool/{google_search/google_search.rb → google_search.rb} +17 -23
  16. data/lib/langchain/tool/{news_retriever/news_retriever.rb → news_retriever.rb} +41 -14
  17. data/lib/langchain/tool/ruby_code_interpreter.rb +41 -0
  18. data/lib/langchain/tool/{tavily/tavily.rb → tavily.rb} +24 -10
  19. data/lib/langchain/tool/vectorsearch.rb +40 -0
  20. data/lib/langchain/tool/weather.rb +109 -0
  21. data/lib/langchain/tool/{wikipedia/wikipedia.rb → wikipedia.rb} +17 -13
  22. data/lib/langchain/tool_definition.rb +212 -0
  23. data/lib/langchain/utils/colorizer.rb +19 -0
  24. data/lib/langchain/utils/hash_transformer.rb +9 -17
  25. data/lib/langchain/utils/to_boolean.rb +27 -0
  26. data/lib/langchain/vectorsearch/chroma.rb +2 -2
  27. data/lib/langchain/vectorsearch/elasticsearch.rb +2 -2
  28. data/lib/langchain/vectorsearch/epsilla.rb +3 -3
  29. data/lib/langchain/vectorsearch/milvus.rb +2 -2
  30. data/lib/langchain/vectorsearch/pgvector.rb +2 -2
  31. data/lib/langchain/vectorsearch/pinecone.rb +2 -2
  32. data/lib/langchain/vectorsearch/qdrant.rb +2 -2
  33. data/lib/langchain/vectorsearch/weaviate.rb +4 -4
  34. data/lib/langchain/version.rb +1 -1
  35. data/lib/langchain.rb +1 -2
  36. metadata +18 -54
  37. data/lib/langchain/tool/base.rb +0 -107
  38. data/lib/langchain/tool/calculator/calculator.json +0 -19
  39. data/lib/langchain/tool/calculator/calculator.rb +0 -34
  40. data/lib/langchain/tool/database/database.json +0 -46
  41. data/lib/langchain/tool/file_system/file_system.json +0 -57
  42. data/lib/langchain/tool/file_system/file_system.rb +0 -32
  43. data/lib/langchain/tool/google_search/google_search.json +0 -19
  44. data/lib/langchain/tool/news_retriever/news_retriever.json +0 -122
  45. data/lib/langchain/tool/ruby_code_interpreter/ruby_code_interpreter.json +0 -19
  46. data/lib/langchain/tool/ruby_code_interpreter/ruby_code_interpreter.rb +0 -37
  47. data/lib/langchain/tool/tavily/tavily.json +0 -54
  48. data/lib/langchain/tool/vectorsearch/vectorsearch.json +0 -24
  49. data/lib/langchain/tool/vectorsearch/vectorsearch.rb +0 -36
  50. data/lib/langchain/tool/weather/weather.json +0 -19
  51. data/lib/langchain/tool/weather/weather.rb +0 -55
  52. data/lib/langchain/tool/wikipedia/wikipedia.json +0 -19
@@ -0,0 +1,212 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+
5
+ #
6
+ # Extends a class to be used as a tool in the assistant.
7
+ # A tool is a collection of functions (methods) used to perform specific tasks.
8
+ #
9
+ # == Usage
10
+ #
11
+ # 1. Extend your class with {Langchain::ToolDefinition}
12
+ # 2. Use {#define_function} to define each function of the tool
13
+ #
14
+ # == Key Concepts
15
+ #
16
+ # - {#define_function}: Defines a new function (method) for the tool
17
+ # - {ParameterBuilder#property}: Defines properties for the function parameters
18
+ # - {ParameterBuilder#item}: Alias for {ParameterBuilder#property}, used for array items
19
+ #
20
+ # These methods support various data types and nested structures, allowing for flexible and expressive tool definitions.
21
+ #
22
+ # @example Defining a tool with various property types and configurations
23
+ # define_function :sample_function, description: "Demonstrates various property types and configurations" do
24
+ # property :string_prop, type: "string", description: "A simple string property"
25
+ # property :number_prop, type: "number", description: "A number property"
26
+ # property :integer_prop, type: "integer", description: "An integer property"
27
+ # property :boolean_prop, type: "boolean", description: "A boolean property"
28
+ # property :enum_prop, type: "string", description: "An enum property", enum: ["option1", "option2", "option3"]
29
+ # property :required_prop, type: "string", description: "A required property", required: true
30
+ # property :array_prop, type: "array", description: "An array property" do
31
+ # item type: "string", description: "Array item"
32
+ # end
33
+ # property :object_prop, type: "object", description: "An object property" do
34
+ # property :nested_string, type: "string", description: "Nested string property"
35
+ # property :nested_number, type: "number", description: "Nested number property"
36
+ # end
37
+ # end
38
+ #
39
+ module Langchain::ToolDefinition
40
+ # Defines a function for the tool
41
+ #
42
+ # @param method_name [Symbol] Name of the method to define
43
+ # @param description [String] Description of the function
44
+ # @yield Block that defines the parameters for the function
45
+ def define_function(method_name, description:, &)
46
+ function_schemas.add_function(method_name:, description:, &)
47
+ end
48
+
49
+ # Returns the FunctionSchemas instance for this tool
50
+ #
51
+ # @return [FunctionSchemas] The FunctionSchemas instance
52
+ def function_schemas
53
+ @function_schemas ||= FunctionSchemas.new(tool_name)
54
+ end
55
+
56
+ # Returns the snake_case version of the class name as the tool's name
57
+ #
58
+ # @return [String] The snake_case version of the class name
59
+ def tool_name
60
+ @tool_name ||= name
61
+ .gsub("::", "_")
62
+ .gsub(/(?<=[A-Z])(?=[A-Z][a-z])|(?<=[a-z\d])(?=[A-Z])/, "_")
63
+ .downcase
64
+ end
65
+
66
+ # Manages schemas for functions
67
+ class FunctionSchemas
68
+ def initialize(tool_name)
69
+ @schemas = {}
70
+ @tool_name = tool_name
71
+ end
72
+
73
+ # Adds a function to the schemas
74
+ #
75
+ # @param method_name [Symbol] Name of the method to add
76
+ # @param description [String] Description of the function
77
+ # @yield Block that defines the parameters for the function
78
+ # @raise [ArgumentError] If a block is defined and no parameters are specified for the function
79
+ def add_function(method_name:, description:, &)
80
+ name = "#{@tool_name}__#{method_name}"
81
+
82
+ if block_given?
83
+ parameters = ParameterBuilder.new(parent_type: "object").build(&)
84
+
85
+ if parameters[:properties].empty?
86
+ raise ArgumentError, "Function parameters must have at least one property defined within it, if a block is provided"
87
+ end
88
+ end
89
+
90
+ @schemas[method_name] = {
91
+ type: "function",
92
+ function: {name:, description:, parameters:}.compact
93
+ }
94
+ end
95
+
96
+ # Converts schemas to OpenAI-compatible format
97
+ #
98
+ # @return [String] JSON string of schemas in OpenAI format
99
+ def to_openai_format
100
+ @schemas.values
101
+ end
102
+
103
+ # Converts schemas to Anthropic-compatible format
104
+ #
105
+ # @return [String] JSON string of schemas in Anthropic format
106
+ def to_anthropic_format
107
+ @schemas.values.map do |schema|
108
+ schema[:function].transform_keys(parameters: :input_schema)
109
+ end
110
+ end
111
+
112
+ # Converts schemas to Google Gemini-compatible format
113
+ #
114
+ # @return [String] JSON string of schemas in Google Gemini format
115
+ def to_google_gemini_format
116
+ @schemas.values.map { |schema| schema[:function] }
117
+ end
118
+ end
119
+
120
+ # Builds parameter schemas for functions
121
+ class ParameterBuilder
122
+ VALID_TYPES = %w[object array string number integer boolean].freeze
123
+
124
+ def initialize(parent_type:)
125
+ @schema = (parent_type == "object") ? {type: "object", properties: {}, required: []} : {}
126
+ @parent_type = parent_type
127
+ end
128
+
129
+ # Builds the parameter schema
130
+ #
131
+ # @yield Block that defines the properties of the schema
132
+ # @return [Hash] The built schema
133
+ def build(&)
134
+ instance_eval(&)
135
+ @schema
136
+ end
137
+
138
+ # Defines a property in the schema
139
+ #
140
+ # @param name [Symbol] Name of the property (required only for a parent of type object)
141
+ # @param type [String] Type of the property
142
+ # @param description [String] Description of the property
143
+ # @param enum [Array] Array of allowed values
144
+ # @param required [Boolean] Whether the property is required
145
+ # @yield [Block] Block for nested properties (only for object and array types)
146
+ # @raise [ArgumentError] If any parameter is invalid
147
+ def property(name = nil, type:, description: nil, enum: nil, required: false, &)
148
+ validate_parameters(name:, type:, enum:, required:)
149
+
150
+ prop = {type:, description:, enum:}.compact
151
+
152
+ if block_given?
153
+ nested_schema = ParameterBuilder.new(parent_type: type).build(&)
154
+
155
+ case type
156
+ when "object"
157
+ if nested_schema[:properties].empty?
158
+ raise ArgumentError, "Object properties must have at least one property defined within it"
159
+ end
160
+ prop = nested_schema
161
+ when "array"
162
+ if nested_schema.empty?
163
+ raise ArgumentError, "Array properties must have at least one item defined within it"
164
+ end
165
+ prop[:items] = nested_schema
166
+ end
167
+ end
168
+
169
+ if @parent_type == "object"
170
+ @schema[:properties][name] = prop
171
+ @schema[:required] << name.to_s if required
172
+ else
173
+ @schema = prop
174
+ end
175
+ end
176
+
177
+ # Alias for property method, used for defining array items
178
+ alias_method :item, :property
179
+
180
+ private
181
+
182
+ # Validates the parameters for a property
183
+ #
184
+ # @param name [Symbol] Name of the property
185
+ # @param type [String] Type of the property
186
+ # @param enum [Array] Array of allowed values
187
+ # @param required [Boolean] Whether the property is required
188
+ # @raise [ArgumentError] If any parameter is invalid
189
+ def validate_parameters(name:, type:, enum:, required:)
190
+ if @parent_type == "object"
191
+ if name.nil?
192
+ raise ArgumentError, "Name must be provided for properties of an object"
193
+ end
194
+ unless name.is_a?(Symbol)
195
+ raise ArgumentError, "Invalid name '#{name}'. Name must be a symbol"
196
+ end
197
+ end
198
+
199
+ unless VALID_TYPES.include?(type)
200
+ raise ArgumentError, "Invalid type '#{type}'. Valid types are: #{VALID_TYPES.join(", ")}"
201
+ end
202
+
203
+ unless enum.nil? || enum.is_a?(Array)
204
+ raise ArgumentError, "Invalid enum '#{enum}'. Enum must be nil or an array"
205
+ end
206
+
207
+ unless [true, false].include?(required)
208
+ raise ArgumentError, "Invalid required '#{required}'. Required must be a boolean"
209
+ end
210
+ end
211
+ end
212
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Langchain
4
+ module Utils
5
+ class Colorizer
6
+ def self.colorize(line, options)
7
+ decorated_line = Rainbow(line)
8
+ options.each_pair.each do |modifier, value|
9
+ decorated_line = if modifier == :mode
10
+ decorated_line.public_send(value)
11
+ else
12
+ decorated_line.public_send(modifier, value)
13
+ end
14
+ end
15
+ decorated_line
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,24 +1,16 @@
1
1
  module Langchain
2
2
  module Utils
3
3
  class HashTransformer
4
- # Converts a string to camelCase
5
- def self.camelize_lower(str)
6
- str.split("_").inject([]) { |buffer, e| buffer.push(buffer.empty? ? e : e.capitalize) }.join
7
- end
8
-
9
- # Recursively transforms the keys of a hash to camel case
10
- def self.deep_transform_keys(hash, &block)
11
- case hash
12
- when Hash
13
- hash.each_with_object({}) do |(key, value), result|
14
- new_key = block.call(key)
15
- result[new_key] = deep_transform_keys(value, &block)
4
+ def self.symbolize_keys(hash)
5
+ hash.map do |k, v|
6
+ new_key = begin
7
+ k.to_sym
8
+ rescue
9
+ k
16
10
  end
17
- when Array
18
- hash.map { |item| deep_transform_keys(item, &block) }
19
- else
20
- hash
21
- end
11
+ new_value = v.is_a?(Hash) ? symbolize_keys(v) : v
12
+ [new_key, new_value]
13
+ end.to_h
22
14
  end
23
15
  end
24
16
  end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Langchain
4
+ module Utils
5
+ class ToBoolean
6
+ TRUTHABLE_STRINGS = %w[1 true t yes y]
7
+ private_constant :TRUTHABLE_STRINGS
8
+
9
+ def to_bool(value)
10
+ case value
11
+ when String
12
+ TRUTHABLE_STRINGS.include?(value.downcase)
13
+ when Integer
14
+ value == 1
15
+ when TrueClass
16
+ true
17
+ when FalseClass
18
+ false
19
+ when Symbol
20
+ to_bool(value.to_s)
21
+ else
22
+ false
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -124,7 +124,7 @@ module Langchain::Vectorsearch
124
124
  # @param k [Integer] The number of results to have in context
125
125
  # @yield [String] Stream responses back one String at a time
126
126
  # @return [String] The answer to the question
127
- def ask(question:, k: 4, &)
127
+ def ask(question:, k: 4, &block)
128
128
  search_results = similarity_search(query: question, k: k)
129
129
 
130
130
  context = search_results.map do |result|
@@ -136,7 +136,7 @@ module Langchain::Vectorsearch
136
136
  prompt = generate_rag_prompt(question: question, context: context)
137
137
 
138
138
  messages = [{role: "user", content: prompt}]
139
- response = llm.chat(messages: messages, &)
139
+ response = llm.chat(messages: messages, &block)
140
140
 
141
141
  response.context = context
142
142
  response
@@ -143,7 +143,7 @@ module Langchain::Vectorsearch
143
143
  # @param k [Integer] The number of results to have in context
144
144
  # @yield [String] Stream responses back one String at a time
145
145
  # @return [String] The answer to the question
146
- def ask(question:, k: 4, &)
146
+ def ask(question:, k: 4, &block)
147
147
  search_results = similarity_search(query: question, k: k)
148
148
 
149
149
  context = search_results.map do |result|
@@ -153,7 +153,7 @@ module Langchain::Vectorsearch
153
153
  prompt = generate_rag_prompt(question: question, context: context)
154
154
 
155
155
  messages = [{role: "user", content: prompt}]
156
- response = llm.chat(messages: messages, &)
156
+ response = llm.chat(messages: messages, &block)
157
157
 
158
158
  response.context = context
159
159
  response
@@ -96,7 +96,7 @@ module Langchain::Vectorsearch
96
96
 
97
97
  status_code, response = @client.database.insert(@table_name, data)
98
98
  raise "Failed to insert texts: #{response}" if status_code != 200
99
- response
99
+ JSON.parse(response)
100
100
  end
101
101
 
102
102
  # Search for similar texts
@@ -129,7 +129,7 @@ module Langchain::Vectorsearch
129
129
  # @param k [Integer] The number of results to have in context
130
130
  # @yield [String] Stream responses back one String at a time
131
131
  # @return [String] The answer to the question
132
- def ask(question:, k: 4, &)
132
+ def ask(question:, k: 4, &block)
133
133
  search_results = similarity_search(query: question, k: k)
134
134
 
135
135
  context = search_results.map do |result|
@@ -140,7 +140,7 @@ module Langchain::Vectorsearch
140
140
  prompt = generate_rag_prompt(question: question, context: context)
141
141
 
142
142
  messages = [{role: "user", content: prompt}]
143
- response = llm.chat(messages: messages, &)
143
+ response = llm.chat(messages: messages, &block)
144
144
 
145
145
  response.context = context
146
146
  response
@@ -156,7 +156,7 @@ module Langchain::Vectorsearch
156
156
  # @param k [Integer] The number of results to have in context
157
157
  # @yield [String] Stream responses back one String at a time
158
158
  # @return [String] The answer to the question
159
- def ask(question:, k: 4, &)
159
+ def ask(question:, k: 4, &block)
160
160
  search_results = similarity_search(query: question, k: k)
161
161
 
162
162
  content_field = search_results.dig("results", "fields_data").select { |field| field.dig("field_name") == "content" }
@@ -167,7 +167,7 @@ module Langchain::Vectorsearch
167
167
  prompt = generate_rag_prompt(question: question, context: context)
168
168
 
169
169
  messages = [{role: "user", content: prompt}]
170
- response = llm.chat(messages: messages, &)
170
+ response = llm.chat(messages: messages, &block)
171
171
 
172
172
  response.context = context
173
173
  response
@@ -146,7 +146,7 @@ module Langchain::Vectorsearch
146
146
  # @param k [Integer] The number of results to have in context
147
147
  # @yield [String] Stream responses back one String at a time
148
148
  # @return [String] The answer to the question
149
- def ask(question:, k: 4, &)
149
+ def ask(question:, k: 4, &block)
150
150
  search_results = similarity_search(query: question, k: k)
151
151
 
152
152
  context = search_results.map do |result|
@@ -157,7 +157,7 @@ module Langchain::Vectorsearch
157
157
  prompt = generate_rag_prompt(question: question, context: context)
158
158
 
159
159
  messages = [{role: "user", content: prompt}]
160
- response = llm.chat(messages: messages, &)
160
+ response = llm.chat(messages: messages, &block)
161
161
 
162
162
  response.context = context
163
163
  response
@@ -171,7 +171,7 @@ module Langchain::Vectorsearch
171
171
  # @param filter [String] The filter to use
172
172
  # @yield [String] Stream responses back one String at a time
173
173
  # @return [String] The answer to the question
174
- def ask(question:, namespace: "", filter: nil, k: 4, &)
174
+ def ask(question:, namespace: "", filter: nil, k: 4, &block)
175
175
  search_results = similarity_search(query: question, namespace: namespace, filter: filter, k: k)
176
176
 
177
177
  context = search_results.map do |result|
@@ -182,7 +182,7 @@ module Langchain::Vectorsearch
182
182
  prompt = generate_rag_prompt(question: question, context: context)
183
183
 
184
184
  messages = [{role: "user", content: prompt}]
185
- response = llm.chat(messages: messages, &)
185
+ response = llm.chat(messages: messages, &block)
186
186
 
187
187
  response.context = context
188
188
  response
@@ -137,7 +137,7 @@ module Langchain::Vectorsearch
137
137
  # @param k [Integer] The number of results to have in context
138
138
  # @yield [String] Stream responses back one String at a time
139
139
  # @return [String] The answer to the question
140
- def ask(question:, k: 4, &)
140
+ def ask(question:, k: 4, &block)
141
141
  search_results = similarity_search(query: question, k: k)
142
142
 
143
143
  context = search_results.map do |result|
@@ -148,7 +148,7 @@ module Langchain::Vectorsearch
148
148
  prompt = generate_rag_prompt(question: question, context: context)
149
149
 
150
150
  messages = [{role: "user", content: prompt}]
151
- response = llm.chat(messages: messages, &)
151
+ response = llm.chat(messages: messages, &block)
152
152
 
153
153
  response.context = context
154
154
  response
@@ -6,7 +6,7 @@ module Langchain::Vectorsearch
6
6
  # Wrapper around Weaviate
7
7
  #
8
8
  # Gem requirements:
9
- # gem "weaviate-ruby", "~> 0.8.9"
9
+ # gem "weaviate-ruby", "~> 0.9.0"
10
10
  #
11
11
  # Usage:
12
12
  # weaviate = Langchain::Vectorsearch::Weaviate.new(url: ENV["WEAVIATE_URL"], api_key: ENV["WEAVIATE_API_KEY"], index_name: "Docs", llm: llm)
@@ -17,7 +17,7 @@ module Langchain::Vectorsearch
17
17
  # @param api_key [String] The API key to use
18
18
  # @param index_name [String] The capitalized name of the index to use
19
19
  # @param llm [Object] The LLM client to use
20
- def initialize(url:, api_key:, index_name:, llm:)
20
+ def initialize(url:, index_name:, llm:, api_key: nil)
21
21
  depends_on "weaviate-ruby", req: "weaviate"
22
22
 
23
23
  @client = ::Weaviate::Client.new(
@@ -143,7 +143,7 @@ module Langchain::Vectorsearch
143
143
  # @param k [Integer] The number of results to have in context
144
144
  # @yield [String] Stream responses back one String at a time
145
145
  # @return [Hash] The answer
146
- def ask(question:, k: 4, &)
146
+ def ask(question:, k: 4, &block)
147
147
  search_results = similarity_search(query: question, k: k)
148
148
 
149
149
  context = search_results.map do |result|
@@ -154,7 +154,7 @@ module Langchain::Vectorsearch
154
154
  prompt = generate_rag_prompt(question: question, context: context)
155
155
 
156
156
  messages = [{role: "user", content: prompt}]
157
- response = llm.chat(messages: messages, &)
157
+ response = llm.chat(messages: messages, &block)
158
158
 
159
159
  response.context = context
160
160
  response
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Langchain
4
- VERSION = "0.14.0"
4
+ VERSION = "0.15.1"
5
5
  end
data/lib/langchain.rb CHANGED
@@ -2,8 +2,7 @@
2
2
 
3
3
  require "logger"
4
4
  require "pathname"
5
- require "colorize"
6
- require "to_bool"
5
+ require "rainbow"
7
6
  require "zeitwerk"
8
7
  loader = Zeitwerk::Loader.for_gem
9
8
  loader.ignore("#{__dir__}/langchainrb.rb")
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: langchainrb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.0
4
+ version: 0.15.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrei Bondarev
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-07-12 00:00:00.000000000 Z
11
+ date: 2024-08-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: baran
@@ -25,19 +25,19 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.1.9
27
27
  - !ruby/object:Gem::Dependency
28
- name: colorize
28
+ name: rainbow
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 1.1.0
33
+ version: 3.1.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 1.1.0
40
+ version: 3.1.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: json-schema
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -80,20 +80,6 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: 0.3.0
83
- - !ruby/object:Gem::Dependency
84
- name: to_bool
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: 2.0.0
90
- type: :runtime
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: 2.0.0
97
83
  - !ruby/object:Gem::Dependency
98
84
  name: matrix
99
85
  requirement: !ruby/object:Gem::Requirement
@@ -472,20 +458,6 @@ dependencies:
472
458
  - - ">="
473
459
  - !ruby/object:Gem::Version
474
460
  version: '0'
475
- - !ruby/object:Gem::Dependency
476
- name: open-weather-ruby-client
477
- requirement: !ruby/object:Gem::Requirement
478
- requirements:
479
- - - "~>"
480
- - !ruby/object:Gem::Version
481
- version: 0.4.0
482
- type: :development
483
- prerelease: false
484
- version_requirements: !ruby/object:Gem::Requirement
485
- requirements:
486
- - - "~>"
487
- - !ruby/object:Gem::Version
488
- version: 0.4.0
489
461
  - !ruby/object:Gem::Dependency
490
462
  name: pg
491
463
  requirement: !ruby/object:Gem::Requirement
@@ -774,29 +746,21 @@ files:
774
746
  - lib/langchain/prompt/few_shot_prompt_template.rb
775
747
  - lib/langchain/prompt/loading.rb
776
748
  - lib/langchain/prompt/prompt_template.rb
777
- - lib/langchain/tool/base.rb
778
- - lib/langchain/tool/calculator/calculator.json
779
- - lib/langchain/tool/calculator/calculator.rb
780
- - lib/langchain/tool/database/database.json
781
- - lib/langchain/tool/database/database.rb
782
- - lib/langchain/tool/file_system/file_system.json
783
- - lib/langchain/tool/file_system/file_system.rb
784
- - lib/langchain/tool/google_search/google_search.json
785
- - lib/langchain/tool/google_search/google_search.rb
786
- - lib/langchain/tool/news_retriever/news_retriever.json
787
- - lib/langchain/tool/news_retriever/news_retriever.rb
788
- - lib/langchain/tool/ruby_code_interpreter/ruby_code_interpreter.json
789
- - lib/langchain/tool/ruby_code_interpreter/ruby_code_interpreter.rb
790
- - lib/langchain/tool/tavily/tavily.json
791
- - lib/langchain/tool/tavily/tavily.rb
792
- - lib/langchain/tool/vectorsearch/vectorsearch.json
793
- - lib/langchain/tool/vectorsearch/vectorsearch.rb
794
- - lib/langchain/tool/weather/weather.json
795
- - lib/langchain/tool/weather/weather.rb
796
- - lib/langchain/tool/wikipedia/wikipedia.json
797
- - lib/langchain/tool/wikipedia/wikipedia.rb
749
+ - lib/langchain/tool/calculator.rb
750
+ - lib/langchain/tool/database.rb
751
+ - lib/langchain/tool/file_system.rb
752
+ - lib/langchain/tool/google_search.rb
753
+ - lib/langchain/tool/news_retriever.rb
754
+ - lib/langchain/tool/ruby_code_interpreter.rb
755
+ - lib/langchain/tool/tavily.rb
756
+ - lib/langchain/tool/vectorsearch.rb
757
+ - lib/langchain/tool/weather.rb
758
+ - lib/langchain/tool/wikipedia.rb
759
+ - lib/langchain/tool_definition.rb
760
+ - lib/langchain/utils/colorizer.rb
798
761
  - lib/langchain/utils/cosine_similarity.rb
799
762
  - lib/langchain/utils/hash_transformer.rb
763
+ - lib/langchain/utils/to_boolean.rb
800
764
  - lib/langchain/vectorsearch/base.rb
801
765
  - lib/langchain/vectorsearch/chroma.rb
802
766
  - lib/langchain/vectorsearch/elasticsearch.rb