langchainrb 0.19.3 → 0.19.4
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 +4 -4
- data/CHANGELOG.md +4 -0
- data/README.md +2 -2
- data/lib/langchain/assistant/llm/adapters/openai.rb +3 -1
- data/lib/langchain/assistant.rb +7 -1
- data/lib/langchain/output_parsers/base.rb +0 -11
- data/lib/langchain/output_parsers/output_parser_exception.rb +10 -0
- data/lib/langchain/tool/calculator.rb +4 -3
- data/lib/langchain/tool/database.rb +15 -10
- data/lib/langchain/tool/file_system.rb +6 -5
- data/lib/langchain/tool/google_search.rb +15 -15
- data/lib/langchain/tool/news_retriever.rb +9 -6
- data/lib/langchain/tool/ruby_code_interpreter.rb +2 -2
- data/lib/langchain/tool/tavily.rb +2 -2
- data/lib/langchain/tool/vectorsearch.rb +3 -1
- data/lib/langchain/tool/weather.rb +3 -3
- data/lib/langchain/tool/wikipedia.rb +2 -2
- data/lib/langchain/tool_definition.rb +14 -0
- data/lib/langchain/tool_response.rb +24 -0
- data/lib/langchain/version.rb +1 -1
- metadata +5 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 65a5c3e4eb0dcf204f75f20fde73d4e049fe657177e19d3fbcc8ffefad059776
|
4
|
+
data.tar.gz: 167a2e8c9305859afc8d384a3b2ff33ea7fc77f7abe7feb93a8f6c104effd2f3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7b65c3e5ef0f7774f634157a98e2fdb2db57fcb9981c96c0ae476ef78ee4a4a3d4822c48339543b0cd0e4d708bf043f2d9653fdfdda5f0df093ea01839d033e3
|
7
|
+
data.tar.gz: e93b0e741cf729697067a4d89b0c938e8261cc8df3d0b30dc0a1dbbb03a0f6100ede5120e2ba8f2d7cc65cf6b5707061d64a4b6e101020413713ef445c0265be
|
data/CHANGELOG.md
CHANGED
@@ -11,6 +11,10 @@
|
|
11
11
|
|
12
12
|
## [Unreleased]
|
13
13
|
|
14
|
+
## [0.19.4] - 2025-02-17
|
15
|
+
- [BREAKING] [https://github.com/patterns-ai-core/langchainrb/pull/894] Tools can now output image_urls, and all tool output must be wrapped by a tool_response() method
|
16
|
+
- [BUGFIX] [https://github.com/patterns-ai-core/langchainrb/pull/921] Fix for Assistant when OpenAI o1/o3 models are used
|
17
|
+
|
14
18
|
## [0.19.3] - 2025-01-13
|
15
19
|
- [BUGFIX] [https://github.com/patterns-ai-core/langchainrb/pull/900] Empty text content should not be set when content is nil when using AnthropicMessage
|
16
20
|
|
data/README.md
CHANGED
@@ -24,7 +24,9 @@ module Langchain
|
|
24
24
|
if tools.any?
|
25
25
|
params[:tools] = build_tools(tools)
|
26
26
|
params[:tool_choice] = build_tool_choice(tool_choice)
|
27
|
-
|
27
|
+
# Temporary fix because OpenAI o1/o3/reasoning models don't support `parallel_tool_calls` parameter.
|
28
|
+
# Set `Assistant.new(parallel_tool_calls: nil, ...)` to avoid the error.
|
29
|
+
params[:parallel_tool_calls] = parallel_tool_calls unless parallel_tool_calls.nil?
|
28
30
|
end
|
29
31
|
params
|
30
32
|
end
|
data/lib/langchain/assistant.rb
CHANGED
@@ -371,9 +371,15 @@ module Langchain
|
|
371
371
|
|
372
372
|
# Call the callback if set
|
373
373
|
tool_execution_callback.call(tool_call_id, tool_name, method_name, tool_arguments) if tool_execution_callback # rubocop:disable Style/SafeNavigation
|
374
|
+
|
374
375
|
output = tool_instance.send(method_name, **tool_arguments)
|
375
376
|
|
376
|
-
|
377
|
+
# Handle both ToolResponse and legacy return values
|
378
|
+
if output.is_a?(ToolResponse)
|
379
|
+
add_message(role: @llm_adapter.tool_role, content: output.content, image_url: output.image_url, tool_call_id: tool_call_id)
|
380
|
+
else
|
381
|
+
submit_tool_output(tool_call_id: tool_call_id, output: output)
|
382
|
+
end
|
377
383
|
end
|
378
384
|
|
379
385
|
# Build a message
|
@@ -28,15 +28,4 @@ module Langchain::OutputParsers
|
|
28
28
|
raise NotImplementedError
|
29
29
|
end
|
30
30
|
end
|
31
|
-
|
32
|
-
class OutputParserException < StandardError
|
33
|
-
def initialize(message, text)
|
34
|
-
@message = message
|
35
|
-
@text = text
|
36
|
-
end
|
37
|
-
|
38
|
-
def to_s
|
39
|
-
"#{@message}\nText: #{@text}"
|
40
|
-
end
|
41
|
-
end
|
42
31
|
end
|
@@ -26,13 +26,14 @@ module Langchain::Tool
|
|
26
26
|
# Evaluates a pure math expression or if equation contains non-math characters (e.g.: "12F in Celsius") then it uses the google search calculator to evaluate the expression
|
27
27
|
#
|
28
28
|
# @param input [String] math expression
|
29
|
-
# @return [
|
29
|
+
# @return [Langchain::Tool::Response] Answer
|
30
30
|
def execute(input:)
|
31
31
|
Langchain.logger.debug("#{self.class} - Executing \"#{input}\"")
|
32
32
|
|
33
|
-
Eqn::Calculator.calc(input)
|
33
|
+
result = Eqn::Calculator.calc(input)
|
34
|
+
tool_response(content: result)
|
34
35
|
rescue Eqn::ParseError, Eqn::NoVariableValueError
|
35
|
-
"\"#{input}\" is an invalid mathematical expression"
|
36
|
+
tool_response(content: "\"#{input}\" is an invalid mathematical expression")
|
36
37
|
end
|
37
38
|
end
|
38
39
|
end
|
@@ -49,50 +49,53 @@ module Langchain::Tool
|
|
49
49
|
|
50
50
|
# Database Tool: Returns a list of tables in the database
|
51
51
|
#
|
52
|
-
# @return [
|
52
|
+
# @return [Langchain::Tool::Response] List of tables in the database
|
53
53
|
def list_tables
|
54
|
-
db.tables
|
54
|
+
tool_response(content: db.tables)
|
55
55
|
end
|
56
56
|
|
57
57
|
# Database Tool: Returns the schema for a list of tables
|
58
58
|
#
|
59
59
|
# @param tables [Array<String>] The tables to describe.
|
60
|
-
# @return [
|
60
|
+
# @return [Langchain::Tool::Response] The schema for the tables
|
61
61
|
def describe_tables(tables: [])
|
62
62
|
return "No tables specified" if tables.empty?
|
63
63
|
|
64
64
|
Langchain.logger.debug("#{self.class} - Describing tables: #{tables}")
|
65
65
|
|
66
|
-
tables
|
66
|
+
result = tables
|
67
67
|
.map do |table|
|
68
68
|
describe_table(table)
|
69
69
|
end
|
70
70
|
.join("\n")
|
71
|
+
|
72
|
+
tool_response(content: result)
|
71
73
|
end
|
72
74
|
|
73
75
|
# Database Tool: Returns the database schema
|
74
76
|
#
|
75
|
-
# @return [
|
77
|
+
# @return [Langchain::Tool::Response] Database schema
|
76
78
|
def dump_schema
|
77
79
|
Langchain.logger.debug("#{self.class} - Dumping schema tables and keys")
|
78
80
|
|
79
81
|
schemas = db.tables.map do |table|
|
80
82
|
describe_table(table)
|
81
83
|
end
|
82
|
-
|
84
|
+
|
85
|
+
tool_response(content: schemas.join("\n"))
|
83
86
|
end
|
84
87
|
|
85
88
|
# Database Tool: Executes a SQL query and returns the results
|
86
89
|
#
|
87
90
|
# @param input [String] SQL query to be executed
|
88
|
-
# @return [
|
91
|
+
# @return [Langchain::Tool::Response] Results from the SQL query
|
89
92
|
def execute(input:)
|
90
93
|
Langchain.logger.debug("#{self.class} - Executing \"#{input}\"")
|
91
94
|
|
92
|
-
db[input].to_a
|
95
|
+
tool_response(content: db[input].to_a)
|
93
96
|
rescue Sequel::DatabaseError => e
|
94
97
|
Langchain.logger.error("#{self.class} - #{e.message}")
|
95
|
-
e.message
|
98
|
+
tool_response(content: e.message)
|
96
99
|
end
|
97
100
|
|
98
101
|
private
|
@@ -100,7 +103,7 @@ module Langchain::Tool
|
|
100
103
|
# Describes a table and its schema
|
101
104
|
#
|
102
105
|
# @param table [String] The table to describe
|
103
|
-
# @return [
|
106
|
+
# @return [Langchain::Tool::Response] The schema for the table
|
104
107
|
def describe_table(table)
|
105
108
|
# TODO: There's probably a clear way to do all of this below
|
106
109
|
|
@@ -127,6 +130,8 @@ module Langchain::Tool
|
|
127
130
|
schema << ",\n" unless fk == db.foreign_key_list(table).last
|
128
131
|
end
|
129
132
|
schema << ");\n"
|
133
|
+
|
134
|
+
tool_response(content: schema)
|
130
135
|
end
|
131
136
|
end
|
132
137
|
end
|
@@ -24,21 +24,22 @@ module Langchain::Tool
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def list_directory(directory_path:)
|
27
|
-
Dir.entries(directory_path)
|
27
|
+
tool_response(content: Dir.entries(directory_path))
|
28
28
|
rescue Errno::ENOENT
|
29
|
-
"No such directory: #{directory_path}"
|
29
|
+
tool_response(content: "No such directory: #{directory_path}")
|
30
30
|
end
|
31
31
|
|
32
32
|
def read_file(file_path:)
|
33
|
-
File.read(file_path)
|
33
|
+
tool_response(content: File.read(file_path))
|
34
34
|
rescue Errno::ENOENT
|
35
|
-
"No such file: #{file_path}"
|
35
|
+
tool_response(content: "No such file: #{file_path}")
|
36
36
|
end
|
37
37
|
|
38
38
|
def write_to_file(file_path:, content:)
|
39
39
|
File.write(file_path, content)
|
40
|
+
tool_response(content: "File written successfully")
|
40
41
|
rescue Errno::EACCES
|
41
|
-
"Permission denied: #{file_path}"
|
42
|
+
tool_response(content: "Permission denied: #{file_path}")
|
42
43
|
end
|
43
44
|
end
|
44
45
|
end
|
@@ -36,7 +36,7 @@ module Langchain::Tool
|
|
36
36
|
# Executes Google Search and returns the result
|
37
37
|
#
|
38
38
|
# @param input [String] search query
|
39
|
-
# @return [
|
39
|
+
# @return [Langchain::Tool::Response] Answer
|
40
40
|
def execute(input:)
|
41
41
|
Langchain.logger.debug("#{self.class} - Executing \"#{input}\"")
|
42
42
|
|
@@ -44,31 +44,31 @@ module Langchain::Tool
|
|
44
44
|
|
45
45
|
answer_box = results[:answer_box_list] ? results[:answer_box_list].first : results[:answer_box]
|
46
46
|
if answer_box
|
47
|
-
return answer_box[:result] ||
|
47
|
+
return tool_response(content: answer_box[:result] ||
|
48
48
|
answer_box[:answer] ||
|
49
49
|
answer_box[:snippet] ||
|
50
50
|
answer_box[:snippet_highlighted_words] ||
|
51
|
-
answer_box.reject { |_k, v| v.is_a?(Hash) || v.is_a?(Array) || v.start_with?("http") }
|
51
|
+
answer_box.reject { |_k, v| v.is_a?(Hash) || v.is_a?(Array) || v.start_with?("http") })
|
52
52
|
elsif (events_results = results[:events_results])
|
53
|
-
return events_results.take(10)
|
53
|
+
return tool_response(content: events_results.take(10))
|
54
54
|
elsif (sports_results = results[:sports_results])
|
55
|
-
return sports_results
|
55
|
+
return tool_response(content: sports_results)
|
56
56
|
elsif (top_stories = results[:top_stories])
|
57
|
-
return top_stories
|
57
|
+
return tool_response(content: top_stories)
|
58
58
|
elsif (news_results = results[:news_results])
|
59
|
-
return news_results
|
59
|
+
return tool_response(content: news_results)
|
60
60
|
elsif (jobs_results = results.dig(:jobs_results, :jobs))
|
61
|
-
return jobs_results
|
61
|
+
return tool_response(content: jobs_results)
|
62
62
|
elsif (shopping_results = results[:shopping_results]) && shopping_results.first.key?(:title)
|
63
|
-
return shopping_results.take(3)
|
63
|
+
return tool_response(content: shopping_results.take(3))
|
64
64
|
elsif (questions_and_answers = results[:questions_and_answers])
|
65
|
-
return questions_and_answers
|
65
|
+
return tool_response(content: questions_and_answers)
|
66
66
|
elsif (popular_destinations = results.dig(:popular_destinations, :destinations))
|
67
|
-
return popular_destinations
|
67
|
+
return tool_response(content: popular_destinations)
|
68
68
|
elsif (top_sights = results.dig(:top_sights, :sights))
|
69
|
-
return top_sights
|
69
|
+
return tool_response(content: top_sights)
|
70
70
|
elsif (images_results = results[:images_results]) && images_results.first.key?(:thumbnail)
|
71
|
-
return images_results.map { |h| h[:thumbnail] }.take(10)
|
71
|
+
return tool_response(content: images_results.map { |h| h[:thumbnail] }.take(10))
|
72
72
|
end
|
73
73
|
|
74
74
|
snippets = []
|
@@ -110,8 +110,8 @@ module Langchain::Tool
|
|
110
110
|
snippets << local_results
|
111
111
|
end
|
112
112
|
|
113
|
-
return "No good search result found" if snippets.empty?
|
114
|
-
snippets
|
113
|
+
return tool_response(content: "No good search result found") if snippets.empty?
|
114
|
+
tool_response(content: snippets)
|
115
115
|
end
|
116
116
|
|
117
117
|
#
|
@@ -57,7 +57,7 @@ module Langchain::Tool
|
|
57
57
|
# @param page_size [Integer] The number of results to return per page. 20 is the API's default, 100 is the maximum. Our default is 5.
|
58
58
|
# @param page [Integer] Use this to page through the results.
|
59
59
|
#
|
60
|
-
# @return [
|
60
|
+
# @return [Langchain::Tool::Response] JSON response
|
61
61
|
def get_everything(
|
62
62
|
q: nil,
|
63
63
|
search_in: nil,
|
@@ -86,7 +86,8 @@ module Langchain::Tool
|
|
86
86
|
params[:pageSize] = page_size if page_size
|
87
87
|
params[:page] = page if page
|
88
88
|
|
89
|
-
send_request(path: "everything", params: params)
|
89
|
+
response = send_request(path: "everything", params: params)
|
90
|
+
tool_response(content: response)
|
90
91
|
end
|
91
92
|
|
92
93
|
# Retrieve top headlines
|
@@ -98,7 +99,7 @@ module Langchain::Tool
|
|
98
99
|
# @param page_size [Integer] The number of results to return per page. 20 is the API's default, 100 is the maximum. Our default is 5.
|
99
100
|
# @param page [Integer] Use this to page through the results.
|
100
101
|
#
|
101
|
-
# @return [
|
102
|
+
# @return [Langchain::Tool::Response] JSON response
|
102
103
|
def get_top_headlines(
|
103
104
|
country: nil,
|
104
105
|
category: nil,
|
@@ -117,7 +118,8 @@ module Langchain::Tool
|
|
117
118
|
params[:pageSize] = page_size if page_size
|
118
119
|
params[:page] = page if page
|
119
120
|
|
120
|
-
send_request(path: "top-headlines", params: params)
|
121
|
+
response = send_request(path: "top-headlines", params: params)
|
122
|
+
tool_response(content: response)
|
121
123
|
end
|
122
124
|
|
123
125
|
# Retrieve news sources
|
@@ -126,7 +128,7 @@ module Langchain::Tool
|
|
126
128
|
# @param language [String] The 2-letter ISO-639-1 code of the language you want to get headlines for. Possible options: ar, de, en, es, fr, he, it, nl, no, pt, ru, se, ud, zh.
|
127
129
|
# @param country [String] The 2-letter ISO 3166-1 code of the country you want to get headlines for. Possible options: ae, ar, at, au, be, bg, br, ca, ch, cn, co, cu, cz, de, eg, fr, gb, gr, hk, hu, id, ie, il, in, it, jp, kr, lt, lv, ma, mx, my, ng, nl, no, nz, ph, pl, pt, ro, rs, ru, sa, se, sg, si, sk, th, tr, tw, ua, us, ve, za.
|
128
130
|
#
|
129
|
-
# @return [
|
131
|
+
# @return [Langchain::Tool::Response] JSON response
|
130
132
|
def get_sources(
|
131
133
|
category: nil,
|
132
134
|
language: nil,
|
@@ -139,7 +141,8 @@ module Langchain::Tool
|
|
139
141
|
params[:category] = category if category
|
140
142
|
params[:language] = language if language
|
141
143
|
|
142
|
-
send_request(path: "top-headlines/sources", params: params)
|
144
|
+
response = send_request(path: "top-headlines/sources", params: params)
|
145
|
+
tool_response(content: response)
|
143
146
|
end
|
144
147
|
|
145
148
|
private
|
@@ -27,11 +27,11 @@ module Langchain::Tool
|
|
27
27
|
# Executes Ruby code in a sandboxes environment.
|
28
28
|
#
|
29
29
|
# @param input [String] ruby code expression
|
30
|
-
# @return [
|
30
|
+
# @return [Langchain::Tool::Response] Answer
|
31
31
|
def execute(input:)
|
32
32
|
Langchain.logger.debug("#{self.class} - Executing \"#{input}\"")
|
33
33
|
|
34
|
-
safe_eval(input)
|
34
|
+
tool_response(content: safe_eval(input))
|
35
35
|
end
|
36
36
|
|
37
37
|
def safe_eval(code)
|
@@ -41,7 +41,7 @@ module Langchain::Tool
|
|
41
41
|
# @param include_domains [Array<String>] A list of domains to specifically include in the search results. Default is None, which includes all domains.
|
42
42
|
# @param exclude_domains [Array<String>] A list of domains to specifically exclude from the search results. Default is None, which doesn't exclude any domains.
|
43
43
|
#
|
44
|
-
# @return [
|
44
|
+
# @return [Langchain::Tool::Response] The search results in JSON format.
|
45
45
|
def search(
|
46
46
|
query:,
|
47
47
|
search_depth: "basic",
|
@@ -70,7 +70,7 @@ module Langchain::Tool
|
|
70
70
|
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == "https") do |http|
|
71
71
|
http.request(request)
|
72
72
|
end
|
73
|
-
response.body
|
73
|
+
tool_response(content: response.body)
|
74
74
|
end
|
75
75
|
end
|
76
76
|
end
|
@@ -33,8 +33,10 @@ module Langchain::Tool
|
|
33
33
|
#
|
34
34
|
# @param query [String] The query to search for
|
35
35
|
# @param k [Integer] The number of results to return
|
36
|
+
# @return [Langchain::Tool::Response] The response from the server
|
36
37
|
def similarity_search(query:, k: 4)
|
37
|
-
vectorsearch.similarity_search(query:, k: 4)
|
38
|
+
result = vectorsearch.similarity_search(query:, k: 4)
|
39
|
+
tool_response(content: result)
|
38
40
|
end
|
39
41
|
end
|
40
42
|
end
|
@@ -55,15 +55,15 @@ module Langchain::Tool
|
|
55
55
|
params = {appid: @api_key, q: [city, state_code, country_code].compact.join(","), units: units}
|
56
56
|
|
57
57
|
location_response = send_request(path: "geo/1.0/direct", params: params.except(:units))
|
58
|
-
return location_response if location_response.is_a?(String) # Error occurred
|
58
|
+
return tool_response(content: location_response) if location_response.is_a?(String) # Error occurred
|
59
59
|
|
60
60
|
location = location_response.first
|
61
|
-
return "Location not found" unless location
|
61
|
+
return tool_response(content: "Location not found") unless location
|
62
62
|
|
63
63
|
params = params.merge(lat: location["lat"], lon: location["lon"]).except(:q)
|
64
64
|
weather_data = send_request(path: "data/2.5/weather", params: params)
|
65
65
|
|
66
|
-
parse_weather_response(weather_data, units)
|
66
|
+
tool_response(content: parse_weather_response(weather_data, units))
|
67
67
|
end
|
68
68
|
|
69
69
|
def send_request(path:, params:)
|
@@ -27,13 +27,13 @@ module Langchain::Tool
|
|
27
27
|
# Executes Wikipedia API search and returns the answer
|
28
28
|
#
|
29
29
|
# @param input [String] search query
|
30
|
-
# @return [
|
30
|
+
# @return [Langchain::Tool::Response] Answer
|
31
31
|
def execute(input:)
|
32
32
|
Langchain.logger.debug("#{self.class} - Executing \"#{input}\"")
|
33
33
|
|
34
34
|
page = ::Wikipedia.find(input)
|
35
35
|
# It would be nice to figure out a way to provide page.content but the LLM token limit is an issue
|
36
|
-
page.summary
|
36
|
+
tool_response(content: page.summary)
|
37
37
|
end
|
38
38
|
end
|
39
39
|
end
|
@@ -61,6 +61,20 @@ module Langchain::ToolDefinition
|
|
61
61
|
.downcase
|
62
62
|
end
|
63
63
|
|
64
|
+
def self.extended(base)
|
65
|
+
base.include(InstanceMethods)
|
66
|
+
end
|
67
|
+
|
68
|
+
module InstanceMethods
|
69
|
+
# Create a tool response
|
70
|
+
# @param content [String, nil] The content of the tool response
|
71
|
+
# @param image_url [String, nil] The URL of an image
|
72
|
+
# @return [Langchain::ToolResponse] The tool response
|
73
|
+
def tool_response(content: nil, image_url: nil)
|
74
|
+
Langchain::ToolResponse.new(content: content, image_url: image_url)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
64
78
|
# Manages schemas for functions
|
65
79
|
class FunctionSchemas
|
66
80
|
def initialize(tool_name)
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Langchain
|
4
|
+
# ToolResponse represents the standardized output of a tool.
|
5
|
+
# It can contain either text content or an image URL.
|
6
|
+
class ToolResponse
|
7
|
+
attr_reader :content, :image_url
|
8
|
+
|
9
|
+
# Initializes a new ToolResponse.
|
10
|
+
#
|
11
|
+
# @param content [String] The text content of the response.
|
12
|
+
# @param image_url [String, nil] Optional URL to an image.
|
13
|
+
def initialize(content: nil, image_url: nil)
|
14
|
+
raise ArgumentError, "Either content or image_url must be provided" if content.nil? && image_url.nil?
|
15
|
+
|
16
|
+
@content = content
|
17
|
+
@image_url = image_url
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_s
|
21
|
+
content.to_s
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/langchain/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: langchainrb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.19.
|
4
|
+
version: 0.19.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrei Bondarev
|
8
|
-
autorequire:
|
9
8
|
bindir: exe
|
10
9
|
cert_chain: []
|
11
|
-
date: 2025-
|
10
|
+
date: 2025-02-17 00:00:00.000000000 Z
|
12
11
|
dependencies:
|
13
12
|
- !ruby/object:Gem::Dependency
|
14
13
|
name: baran
|
@@ -718,6 +717,7 @@ files:
|
|
718
717
|
- lib/langchain/loader.rb
|
719
718
|
- lib/langchain/output_parsers/base.rb
|
720
719
|
- lib/langchain/output_parsers/output_fixing_parser.rb
|
720
|
+
- lib/langchain/output_parsers/output_parser_exception.rb
|
721
721
|
- lib/langchain/output_parsers/prompts/naive_fix_prompt.yaml
|
722
722
|
- lib/langchain/output_parsers/structured_output_parser.rb
|
723
723
|
- lib/langchain/processors/base.rb
|
@@ -749,6 +749,7 @@ files:
|
|
749
749
|
- lib/langchain/tool/weather.rb
|
750
750
|
- lib/langchain/tool/wikipedia.rb
|
751
751
|
- lib/langchain/tool_definition.rb
|
752
|
+
- lib/langchain/tool_response.rb
|
752
753
|
- lib/langchain/utils/cosine_similarity.rb
|
753
754
|
- lib/langchain/utils/hash_transformer.rb
|
754
755
|
- lib/langchain/utils/image_wrapper.rb
|
@@ -775,7 +776,6 @@ metadata:
|
|
775
776
|
source_code_uri: https://github.com/patterns-ai-core/langchainrb
|
776
777
|
changelog_uri: https://github.com/patterns-ai-core/langchainrb/blob/main/CHANGELOG.md
|
777
778
|
documentation_uri: https://rubydoc.info/gems/langchainrb
|
778
|
-
post_install_message:
|
779
779
|
rdoc_options: []
|
780
780
|
require_paths:
|
781
781
|
- lib
|
@@ -790,8 +790,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
790
790
|
- !ruby/object:Gem::Version
|
791
791
|
version: '0'
|
792
792
|
requirements: []
|
793
|
-
rubygems_version: 3.
|
794
|
-
signing_key:
|
793
|
+
rubygems_version: 3.6.2
|
795
794
|
specification_version: 4
|
796
795
|
summary: Build LLM-backed Ruby applications with Ruby's Langchain.rb
|
797
796
|
test_files: []
|