langchainrb 0.14.0 → 0.15.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/lib/langchain/assistants/assistant.rb +175 -131
- data/lib/langchain/assistants/messages/ollama_message.rb +9 -21
- data/lib/langchain/contextual_logger.rb +2 -2
- data/lib/langchain/llm/google_gemini.rb +1 -1
- data/lib/langchain/llm/ollama.rb +23 -17
- data/lib/langchain/llm/openai.rb +1 -1
- data/lib/langchain/llm/response/ollama_response.rb +1 -15
- data/lib/langchain/llm/unified_parameters.rb +2 -2
- data/lib/langchain/tool/calculator.rb +38 -0
- data/lib/langchain/tool/{database/database.rb → database.rb} +24 -12
- data/lib/langchain/tool/file_system.rb +44 -0
- data/lib/langchain/tool/{google_search/google_search.rb → google_search.rb} +17 -23
- data/lib/langchain/tool/{news_retriever/news_retriever.rb → news_retriever.rb} +41 -14
- data/lib/langchain/tool/ruby_code_interpreter.rb +41 -0
- data/lib/langchain/tool/{tavily/tavily.rb → tavily.rb} +24 -10
- data/lib/langchain/tool/vectorsearch.rb +40 -0
- data/lib/langchain/tool/{weather/weather.rb → weather.rb} +21 -17
- data/lib/langchain/tool/{wikipedia/wikipedia.rb → wikipedia.rb} +17 -13
- data/lib/langchain/tool_definition.rb +212 -0
- data/lib/langchain/utils/hash_transformer.rb +9 -17
- data/lib/langchain/vectorsearch/chroma.rb +2 -2
- data/lib/langchain/vectorsearch/elasticsearch.rb +2 -2
- data/lib/langchain/vectorsearch/epsilla.rb +3 -3
- data/lib/langchain/vectorsearch/milvus.rb +2 -2
- data/lib/langchain/vectorsearch/pgvector.rb +2 -2
- data/lib/langchain/vectorsearch/pinecone.rb +2 -2
- data/lib/langchain/vectorsearch/qdrant.rb +2 -2
- data/lib/langchain/vectorsearch/weaviate.rb +4 -4
- data/lib/langchain/version.rb +1 -1
- metadata +13 -23
- data/lib/langchain/tool/base.rb +0 -107
- data/lib/langchain/tool/calculator/calculator.json +0 -19
- data/lib/langchain/tool/calculator/calculator.rb +0 -34
- data/lib/langchain/tool/database/database.json +0 -46
- data/lib/langchain/tool/file_system/file_system.json +0 -57
- data/lib/langchain/tool/file_system/file_system.rb +0 -32
- data/lib/langchain/tool/google_search/google_search.json +0 -19
- data/lib/langchain/tool/news_retriever/news_retriever.json +0 -122
- data/lib/langchain/tool/ruby_code_interpreter/ruby_code_interpreter.json +0 -19
- data/lib/langchain/tool/ruby_code_interpreter/ruby_code_interpreter.rb +0 -37
- data/lib/langchain/tool/tavily/tavily.json +0 -54
- data/lib/langchain/tool/vectorsearch/vectorsearch.json +0 -24
- data/lib/langchain/tool/vectorsearch/vectorsearch.rb +0 -36
- data/lib/langchain/tool/weather/weather.json +0 -19
- data/lib/langchain/tool/wikipedia/wikipedia.json +0 -19
@@ -1,24 +1,16 @@
|
|
1
1
|
module Langchain
|
2
2
|
module Utils
|
3
3
|
class HashTransformer
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
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
|
-
|
18
|
-
|
19
|
-
|
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
|
@@ -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.
|
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:,
|
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
|
data/lib/langchain/version.rb
CHANGED
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.
|
4
|
+
version: 0.15.0
|
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-
|
11
|
+
date: 2024-08-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: baran
|
@@ -774,27 +774,17 @@ files:
|
|
774
774
|
- lib/langchain/prompt/few_shot_prompt_template.rb
|
775
775
|
- lib/langchain/prompt/loading.rb
|
776
776
|
- lib/langchain/prompt/prompt_template.rb
|
777
|
-
- lib/langchain/tool/
|
778
|
-
- lib/langchain/tool/
|
779
|
-
- lib/langchain/tool/
|
780
|
-
- lib/langchain/tool/
|
781
|
-
- lib/langchain/tool/
|
782
|
-
- lib/langchain/tool/
|
783
|
-
- lib/langchain/tool/
|
784
|
-
- lib/langchain/tool/
|
785
|
-
- lib/langchain/tool/
|
786
|
-
- lib/langchain/tool/
|
787
|
-
- lib/langchain/
|
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
|
777
|
+
- lib/langchain/tool/calculator.rb
|
778
|
+
- lib/langchain/tool/database.rb
|
779
|
+
- lib/langchain/tool/file_system.rb
|
780
|
+
- lib/langchain/tool/google_search.rb
|
781
|
+
- lib/langchain/tool/news_retriever.rb
|
782
|
+
- lib/langchain/tool/ruby_code_interpreter.rb
|
783
|
+
- lib/langchain/tool/tavily.rb
|
784
|
+
- lib/langchain/tool/vectorsearch.rb
|
785
|
+
- lib/langchain/tool/weather.rb
|
786
|
+
- lib/langchain/tool/wikipedia.rb
|
787
|
+
- lib/langchain/tool_definition.rb
|
798
788
|
- lib/langchain/utils/cosine_similarity.rb
|
799
789
|
- lib/langchain/utils/hash_transformer.rb
|
800
790
|
- lib/langchain/vectorsearch/base.rb
|
data/lib/langchain/tool/base.rb
DELETED
@@ -1,107 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Langchain::Tool
|
4
|
-
# = Tools
|
5
|
-
#
|
6
|
-
# Tools are used by Agents to perform specific tasks. A 'Tool' is a collection of functions ("methods").
|
7
|
-
#
|
8
|
-
# == Available Tools
|
9
|
-
#
|
10
|
-
# - {Langchain::Tool::Calculator}: calculate the result of a math expression
|
11
|
-
# - {Langchain::Tool::Database}: executes SQL queries
|
12
|
-
# - {Langchain::Tool::FileSystem}: interacts with the file system
|
13
|
-
# - {Langchain::Tool::GoogleSearch}: search on Google (via SerpAPI)
|
14
|
-
# - {Langchain::Tool::RubyCodeInterpreter}: runs ruby code
|
15
|
-
# - {Langchain::Tool::Weather}: gets current weather data
|
16
|
-
# - {Langchain::Tool::Wikipedia}: search on Wikipedia
|
17
|
-
#
|
18
|
-
# == Usage
|
19
|
-
#
|
20
|
-
# 1. Pick the tools you'd like to pass to an Agent and install the gems listed under **Gem Requirements**
|
21
|
-
#
|
22
|
-
# # For example to use the Calculator, GoogleSearch, and Wikipedia:
|
23
|
-
# gem install eqn
|
24
|
-
# gem install google_search_results
|
25
|
-
# gem install wikipedia-client
|
26
|
-
#
|
27
|
-
# 2. Set the environment variables listed under **ENV Requirements**
|
28
|
-
#
|
29
|
-
# export SERPAPI_API_KEY=paste-your-serpapi-api-key-here
|
30
|
-
#
|
31
|
-
# 3. Pass the tools when Agent is instantiated.
|
32
|
-
#
|
33
|
-
# agent = Langchain::Assistant.new(
|
34
|
-
# llm: Langchain::LLM::OpenAI.new(api_key: "YOUR_API_KEY"), # or other LLM that supports function calling (coming soon)
|
35
|
-
# thread: Langchain::Thread.new,
|
36
|
-
# tools: [
|
37
|
-
# Langchain::Tool::GoogleSearch.new(api_key: "YOUR_API_KEY"),
|
38
|
-
# Langchain::Tool::Calculator.new,
|
39
|
-
# Langchain::Tool::Wikipedia.new
|
40
|
-
# ]
|
41
|
-
# )
|
42
|
-
#
|
43
|
-
# == Adding Tools
|
44
|
-
#
|
45
|
-
# 1. Create a new folder in lib/langchain/tool/your_tool_name/
|
46
|
-
# 2. Inside of this folder create a file with a class YourToolName that inherits from {Langchain::Tool::Base}
|
47
|
-
# 3. Add `NAME=` and `ANNOTATIONS_PATH=` constants in your Tool class
|
48
|
-
# 4. Implement various public methods in your tool class
|
49
|
-
# 5. Create a sidecar .json file in the same directory as your tool file annotating the methods in the Open API format
|
50
|
-
# 6. Add your tool to the {file:README.md}
|
51
|
-
class Base
|
52
|
-
include Langchain::DependencyHelper
|
53
|
-
|
54
|
-
# Returns the NAME constant of the tool
|
55
|
-
#
|
56
|
-
# @return [String] tool name
|
57
|
-
def name
|
58
|
-
self.class.const_get(:NAME)
|
59
|
-
end
|
60
|
-
|
61
|
-
def self.logger_options
|
62
|
-
{
|
63
|
-
color: :light_blue
|
64
|
-
}
|
65
|
-
end
|
66
|
-
|
67
|
-
# Returns the tool as a list of OpenAI formatted functions
|
68
|
-
#
|
69
|
-
# @return [Array<Hash>] List of hashes representing the tool as OpenAI formatted functions
|
70
|
-
def to_openai_tools
|
71
|
-
method_annotations
|
72
|
-
end
|
73
|
-
|
74
|
-
# Returns the tool as a list of Anthropic formatted functions
|
75
|
-
#
|
76
|
-
# @return [Array<Hash>] List of hashes representing the tool as Anthropic formatted functions
|
77
|
-
def to_anthropic_tools
|
78
|
-
method_annotations.map do |annotation|
|
79
|
-
# Slice out only the content of the "function" key
|
80
|
-
annotation["function"]
|
81
|
-
# Rename "parameters" to "input_schema" key
|
82
|
-
.transform_keys("parameters" => "input_schema")
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
# Returns the tool as a list of Google Gemini formatted functions
|
87
|
-
#
|
88
|
-
# @return [Array<Hash>] List of hashes representing the tool as Google Gemini formatted functions
|
89
|
-
def to_google_gemini_tools
|
90
|
-
method_annotations.map do |annotation|
|
91
|
-
# Slice out only the content of the "function" key
|
92
|
-
annotation["function"]
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
# Return tool's method annotations as JSON
|
97
|
-
#
|
98
|
-
# @return [Hash] Tool's method annotations
|
99
|
-
def method_annotations
|
100
|
-
JSON.parse(
|
101
|
-
File.read(
|
102
|
-
self.class.const_get(:ANNOTATIONS_PATH)
|
103
|
-
)
|
104
|
-
)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
[
|
2
|
-
{
|
3
|
-
"type": "function",
|
4
|
-
"function": {
|
5
|
-
"name": "calculator__execute",
|
6
|
-
"description": "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",
|
7
|
-
"parameters": {
|
8
|
-
"type": "object",
|
9
|
-
"properties": {
|
10
|
-
"input": {
|
11
|
-
"type": "string",
|
12
|
-
"description": "math expression"
|
13
|
-
}
|
14
|
-
},
|
15
|
-
"required": ["input"]
|
16
|
-
}
|
17
|
-
}
|
18
|
-
}
|
19
|
-
]
|
@@ -1,34 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Langchain::Tool
|
4
|
-
class Calculator < Base
|
5
|
-
#
|
6
|
-
# A calculator tool that falls back to the Google calculator widget
|
7
|
-
#
|
8
|
-
# Gem requirements:
|
9
|
-
# gem "eqn", "~> 1.6.5"
|
10
|
-
# gem "google_search_results", "~> 2.0.0"
|
11
|
-
#
|
12
|
-
# Usage:
|
13
|
-
# calculator = Langchain::Tool::Calculator.new
|
14
|
-
#
|
15
|
-
NAME = "calculator"
|
16
|
-
ANNOTATIONS_PATH = Langchain.root.join("./langchain/tool/#{NAME}/#{NAME}.json").to_path
|
17
|
-
|
18
|
-
def initialize
|
19
|
-
depends_on "eqn"
|
20
|
-
end
|
21
|
-
|
22
|
-
# 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
|
23
|
-
#
|
24
|
-
# @param input [String] math expression
|
25
|
-
# @return [String] Answer
|
26
|
-
def execute(input:)
|
27
|
-
Langchain.logger.info("Executing \"#{input}\"", for: self.class)
|
28
|
-
|
29
|
-
Eqn::Calculator.calc(input)
|
30
|
-
rescue Eqn::ParseError, Eqn::NoVariableValueError
|
31
|
-
"\"#{input}\" is an invalid mathematical expression"
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
[
|
2
|
-
{
|
3
|
-
"type": "function",
|
4
|
-
"function": {
|
5
|
-
"name": "database__describe_tables",
|
6
|
-
"description": "Database Tool: Returns the schema for a list of tables",
|
7
|
-
"parameters": {
|
8
|
-
"type": "object",
|
9
|
-
"properties": {
|
10
|
-
"tables": {
|
11
|
-
"type": "string",
|
12
|
-
"description": "The tables to describe."
|
13
|
-
}
|
14
|
-
},
|
15
|
-
"required": ["tables"]
|
16
|
-
}
|
17
|
-
}
|
18
|
-
}, {
|
19
|
-
"type": "function",
|
20
|
-
"function": {
|
21
|
-
"name": "database__list_tables",
|
22
|
-
"description": "Database Tool: Returns a list of tables in the database",
|
23
|
-
"parameters": {
|
24
|
-
"type": "object",
|
25
|
-
"properties": {},
|
26
|
-
"required": []
|
27
|
-
}
|
28
|
-
}
|
29
|
-
}, {
|
30
|
-
"type": "function",
|
31
|
-
"function": {
|
32
|
-
"name": "database__execute",
|
33
|
-
"description": "Database Tool: Executes a SQL query and returns the results",
|
34
|
-
"parameters": {
|
35
|
-
"type": "object",
|
36
|
-
"properties": {
|
37
|
-
"input": {
|
38
|
-
"type": "string",
|
39
|
-
"description": "SQL query to be executed"
|
40
|
-
}
|
41
|
-
},
|
42
|
-
"required": ["input"]
|
43
|
-
}
|
44
|
-
}
|
45
|
-
}
|
46
|
-
]
|
@@ -1,57 +0,0 @@
|
|
1
|
-
[
|
2
|
-
{
|
3
|
-
"type": "function",
|
4
|
-
"function": {
|
5
|
-
"name": "file_system__list_directory",
|
6
|
-
"description": "File System Tool: Lists out the content of a specified directory",
|
7
|
-
"parameters": {
|
8
|
-
"type": "object",
|
9
|
-
"properties": {
|
10
|
-
"directory_path": {
|
11
|
-
"type": "string",
|
12
|
-
"description": "Directory path to list"
|
13
|
-
}
|
14
|
-
},
|
15
|
-
"required": ["directory_path"]
|
16
|
-
}
|
17
|
-
}
|
18
|
-
},
|
19
|
-
{
|
20
|
-
"type": "function",
|
21
|
-
"function": {
|
22
|
-
"name": "file_system__read_file",
|
23
|
-
"description": "File System Tool: Reads the contents of a file",
|
24
|
-
"parameters": {
|
25
|
-
"type": "object",
|
26
|
-
"properties": {
|
27
|
-
"file_path": {
|
28
|
-
"type": "string",
|
29
|
-
"description": "Path to the file to read from"
|
30
|
-
}
|
31
|
-
},
|
32
|
-
"required": ["file_path"]
|
33
|
-
}
|
34
|
-
}
|
35
|
-
},
|
36
|
-
{
|
37
|
-
"type": "function",
|
38
|
-
"function": {
|
39
|
-
"name": "file_system__write_to_file",
|
40
|
-
"description": "File System Tool: Write content to a file",
|
41
|
-
"parameters": {
|
42
|
-
"type": "object",
|
43
|
-
"properties": {
|
44
|
-
"file_path": {
|
45
|
-
"type": "string",
|
46
|
-
"description": "Path to the file to write"
|
47
|
-
},
|
48
|
-
"content": {
|
49
|
-
"type": "string",
|
50
|
-
"description": "Content to write to the file"
|
51
|
-
}
|
52
|
-
},
|
53
|
-
"required": ["file_path", "content"]
|
54
|
-
}
|
55
|
-
}
|
56
|
-
}
|
57
|
-
]
|
@@ -1,32 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Langchain::Tool
|
4
|
-
class FileSystem < Base
|
5
|
-
#
|
6
|
-
# A tool that wraps the Ruby file system classes.
|
7
|
-
#
|
8
|
-
# Usage:
|
9
|
-
# file_system = Langchain::Tool::FileSystem.new
|
10
|
-
#
|
11
|
-
NAME = "file_system"
|
12
|
-
ANNOTATIONS_PATH = Langchain.root.join("./langchain/tool/#{NAME}/#{NAME}.json").to_path
|
13
|
-
|
14
|
-
def list_directory(directory_path:)
|
15
|
-
Dir.entries(directory_path)
|
16
|
-
rescue Errno::ENOENT
|
17
|
-
"No such directory: #{directory_path}"
|
18
|
-
end
|
19
|
-
|
20
|
-
def read_file(file_path:)
|
21
|
-
File.read(file_path)
|
22
|
-
rescue Errno::ENOENT
|
23
|
-
"No such file: #{file_path}"
|
24
|
-
end
|
25
|
-
|
26
|
-
def write_to_file(file_path:, content:)
|
27
|
-
File.write(file_path, content)
|
28
|
-
rescue Errno::EACCES
|
29
|
-
"Permission denied: #{file_path}"
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
[
|
2
|
-
{
|
3
|
-
"type": "function",
|
4
|
-
"function": {
|
5
|
-
"name": "google_search-execute",
|
6
|
-
"description": "Executes Google Search and returns the result",
|
7
|
-
"parameters": {
|
8
|
-
"type": "object",
|
9
|
-
"properties": {
|
10
|
-
"input": {
|
11
|
-
"type": "string",
|
12
|
-
"description": "search query"
|
13
|
-
}
|
14
|
-
},
|
15
|
-
"required": ["input"]
|
16
|
-
}
|
17
|
-
}
|
18
|
-
}
|
19
|
-
]
|