langchainrb 0.4.1 → 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 100c9989f1a6787168064f6d810f009c6ded8129949f0040a7c1ed05ebff9d20
4
- data.tar.gz: 0cf01f053841e9a45353d72b62df9a29c0daf7268fb69aff794aae830f7db448
3
+ metadata.gz: e6e84f50b6e12bd94f5fa8de956549537f5d34b8a901bc6af3fbc5d392fc2e0a
4
+ data.tar.gz: '08c01f481d64b0c35f7e86491d1115d975497c8561f50408516fad388f084c3e'
5
5
  SHA512:
6
- metadata.gz: becea5f089e7455e8dd9437cb3647c921eebb3155a9685697190e0e757d31ec8d9f4572faa3e299911b44b371c097bd9b5edf3da35772562027d1b12cd743b9e
7
- data.tar.gz: 44cfe6f8cb2056d6a0a5c619ded7828a9cdad0e5f4e8876242adad2f13251ea1c3dbb64c9feffea25b61e91f163245954c1f272fadb9f4f3a2a06cadd64bd9a0
6
+ metadata.gz: 8a1d29180f3c0cf89307413bc99e22accc6875d458b3ae12ea72d30146cf5ff172fba7047fe00b385d324057638115254c8dcc6f01459a75f96dccb9a99a301b
7
+ data.tar.gz: 070a0b6836cdb7dd356c99186964f61926498d5f585910bbb30449d4b2a12d50797797dc34c6fe3eb6a4e64c156230d23606c2ac0cf131eeccc942c6231ab3c9
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.4.2] - 2023-06-03
4
+ - 🗣️ LLMs
5
+ - Introducing support for AI21
6
+ - Better docs generation
7
+ - Refactors
8
+
3
9
  ## [0.4.1] - 2023-06-02
4
10
  - Beautiful colored log messages
5
11
  - 🛠️ Tools
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- langchainrb (0.4.1)
4
+ langchainrb (0.4.2)
5
5
  colorize (~> 0.8.1)
6
6
  tiktoken_ruby (~> 0.0.5)
7
7
 
@@ -30,6 +30,7 @@ GEM
30
30
  addressable (2.8.4)
31
31
  public_suffix (>= 2.0.2, < 6.0)
32
32
  afm (0.2.2)
33
+ ai21 (0.2.0)
33
34
  ast (2.4.2)
34
35
  builder (3.2.4)
35
36
  byebug (11.1.3)
@@ -210,6 +211,7 @@ GEM
210
211
  rainbow (3.1.1)
211
212
  rake (13.0.6)
212
213
  rb_sys (0.9.78)
214
+ rdiscount (2.2.7)
213
215
  regexp_parser (2.8.0)
214
216
  replicate-ruby (0.2.2)
215
217
  addressable
@@ -286,6 +288,7 @@ GEM
286
288
  graphlient (~> 0.6.0)
287
289
  wikipedia-client (1.17.0)
288
290
  addressable (~> 2.7)
291
+ yard (0.9.34)
289
292
  zeitwerk (2.6.8)
290
293
 
291
294
  PLATFORMS
@@ -297,6 +300,7 @@ PLATFORMS
297
300
  x86_64-linux
298
301
 
299
302
  DEPENDENCIES
303
+ ai21 (~> 0.2.0)
300
304
  chroma-db (~> 0.3.0)
301
305
  cohere-ruby (~> 0.9.4)
302
306
  docx (~> 0.8.0)
@@ -315,6 +319,7 @@ DEPENDENCIES
315
319
  pry-byebug (~> 3.10.0)
316
320
  qdrant-ruby (~> 0.9.0)
317
321
  rake (~> 13.0)
322
+ rdiscount
318
323
  replicate-ruby (~> 0.2.2)
319
324
  rspec (~> 3.0)
320
325
  ruby-openai (~> 4.0.0)
@@ -322,6 +327,7 @@ DEPENDENCIES
322
327
  standardrb
323
328
  weaviate-ruby (~> 0.8.0)
324
329
  wikipedia-client (~> 1.17.0)
330
+ yard
325
331
 
326
332
  BUNDLED WITH
327
333
  2.4.0
data/README.md CHANGED
@@ -109,6 +109,10 @@ Add `gem "ruby-openai", "~> 4.0.0"` to your Gemfile.
109
109
  ```ruby
110
110
  openai = Langchain::LLM::OpenAI.new(api_key: ENV["OPENAI_API_KEY"])
111
111
  ```
112
+ You can pass additional parameters to the constructor, it will be passed to the OpenAI client:
113
+ ```ruby
114
+ openai = Langchain::LLM::OpenAI.new(api_key: ENV["OPENAI_API_KEY"], llm_options: {uri_base: "http://localhost:1234"}) )
115
+ ```
112
116
  ```ruby
113
117
  openai.embed(text: "foo bar")
114
118
  ```
@@ -300,7 +304,7 @@ Additional examples available: [/examples](https://github.com/andreibondarev/lan
300
304
 
301
305
  ## Logging
302
306
 
303
- LangChain.rb uses standard logging mechanisms and defaults to `:debug` level. Most messages are at info level, but we will add debug or warn statements as needed.
307
+ LangChain.rb uses standard logging mechanisms and defaults to `:warn` level. Most messages are at info level, but we will add debug or warn statements as needed.
304
308
  To show all log messages:
305
309
 
306
310
  ```ruby
@@ -314,6 +318,9 @@ Langchain.logger.level = :info
314
318
  3. `bundle exec rake` to ensure that the tests pass and to run standardrb
315
319
  4. `bin/console` to load the gem in a REPL session. Feel free to add your own instances of LLMs, Tools, Agents, etc. and experiment with them.
316
320
 
321
+ ## Community
322
+ Join us in the [Ruby AI Builders](https://discord.gg/SBmjAnKT) Discord community in #langchainrb
323
+
317
324
  ## Core Contributors
318
325
  [<img style="border-radius:50%" alt="Andrei Bondarev" src="https://avatars.githubusercontent.com/u/541665?v=4" width="80" height="80" class="avatar">](https://github.com/andreibondarev)
319
326
 
data/Rakefile CHANGED
@@ -3,6 +3,7 @@
3
3
  require "bundler/gem_tasks"
4
4
  require "rspec/core/rake_task"
5
5
  require "standard/rake"
6
+ require "yard"
6
7
 
7
8
  RSpec::Core::RakeTask.new(:spec)
8
9
 
@@ -11,3 +12,7 @@ task default: :spec
11
12
  Rake::Task["spec"].enhance do
12
13
  Rake::Task["standard:fix"].invoke
13
14
  end
15
+
16
+ YARD::Rake::YardocTask.new do |t|
17
+ t.options = ["--fail-on-warning"]
18
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Langchain
4
+ module DependencyHelper
5
+ class VersionError < ScriptError; end
6
+
7
+ # This method requires and loads the given gem, and then checks to see if the version of the gem meets the requirements listed in `langchain.gemspec`
8
+ # This solution was built to avoid auto-loading every single gem in the Gemfile when the developer will mostly likely be only using a few of them.
9
+ #
10
+ # @param gem_name [String] The name of the gem to load
11
+ # @return [Boolean] Whether or not the gem was loaded successfully
12
+ # @raise [LoadError] If the gem is not installed
13
+ # @raise [VersionError] If the gem is installed, but the version does not meet the requirements
14
+ #
15
+ def depends_on(gem_name)
16
+ gem(gem_name) # require the gem
17
+
18
+ return(true) unless defined?(Bundler) # If we're in a non-bundler environment, we're no longer able to determine if we'll meet requirements
19
+
20
+ gem_version = Gem.loaded_specs[gem_name].version
21
+ gem_requirement = Bundler.load.dependencies.find { |g| g.name == gem_name }&.requirement
22
+
23
+ raise LoadError unless gem_requirement
24
+
25
+ unless gem_requirement.satisfied_by?(gem_version)
26
+ raise VersionError, "The #{gem_name} gem is installed, but version #{gem_requirement} is required. You have #{gem_version}."
27
+ end
28
+
29
+ true
30
+ rescue LoadError
31
+ raise LoadError, "Could not load #{gem_name}. Please ensure that the #{gem_name} gem is installed."
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Langchain::LLM
4
+ class AI21 < Base
5
+ #
6
+ # Wrapper around AI21 Studio APIs.
7
+ #
8
+ # Gem requirements: gem "ai21", "~> 0.2.0"
9
+ #
10
+ # Usage:
11
+ # ai21 = Langchain::LLM::AI21.new(api_key:)
12
+ #
13
+
14
+ def initialize(api_key:)
15
+ depends_on "ai21"
16
+ require "ai21"
17
+
18
+ @client = ::AI21::Client.new(api_key)
19
+ end
20
+
21
+ #
22
+ # Generate a completion for a given prompt
23
+ #
24
+ # @param prompt [String] The prompt to generate a completion for
25
+ # @param params [Hash] The parameters to pass to the API
26
+ # @return [String] The completion
27
+ #
28
+ def complete(prompt:, **params)
29
+ response = client.complete(prompt, params)
30
+ response.dig(:completions, 0, :data, :text)
31
+ end
32
+
33
+ #
34
+ # Generate a summary for a given text
35
+ #
36
+ # @param text [String] The text to generate a summary for
37
+ # @param params [Hash] The parameters to pass to the API
38
+ # @return [String] The summary
39
+ #
40
+ def summarize(text:, **params)
41
+ response = client.summarize(text, "TEXT", params)
42
+ response.dig(:summary)
43
+ end
44
+ end
45
+ end
@@ -2,10 +2,11 @@
2
2
 
3
3
  module Langchain::LLM
4
4
  class Base
5
+ include Langchain::DependencyHelper
6
+
5
7
  attr_reader :client
6
8
 
7
9
  # Currently supported LLMs
8
- # TODO: Add support for HuggingFace and other LLMs
9
10
  LLMS = {
10
11
  cohere: "Cohere",
11
12
  google_palm: "GooglePalm",
@@ -2,6 +2,15 @@
2
2
 
3
3
  module Langchain::LLM
4
4
  class Cohere < Base
5
+ #
6
+ # Wrapper around the Cohere API.
7
+ #
8
+ # Gem requirements: gem "cohere-ruby", "~> 0.9.4"
9
+ #
10
+ # Usage:
11
+ # cohere = Langchain::LLM::Cohere.new(api_key: "YOUR_API_KEY")
12
+ #
13
+
5
14
  DEFAULTS = {
6
15
  temperature: 0.0,
7
16
  completion_model_name: "base",
@@ -2,7 +2,14 @@
2
2
 
3
3
  module Langchain::LLM
4
4
  class GooglePalm < Base
5
+ #
5
6
  # Wrapper around the Google PaLM (Pathways Language Model) APIs.
7
+ #
8
+ # Gem requirements: gem "google_palm_api", "~> 0.1.0"
9
+ #
10
+ # Usage:
11
+ # google_palm = Langchain::LLM::GooglePalm.new(api_key: "YOUR_API_KEY")
12
+ #
6
13
 
7
14
  DEFAULTS = {
8
15
  temperature: 0.0,
@@ -2,6 +2,15 @@
2
2
 
3
3
  module Langchain::LLM
4
4
  class HuggingFace < Base
5
+ #
6
+ # Wrapper around the HuggingFace Inference API.
7
+ #
8
+ # Gem requirements: gem "hugging-face", "~> 0.3.4"
9
+ #
10
+ # Usage:
11
+ # hf = Langchain::LLM::HuggingFace.new(api_key: "YOUR_API_KEY")
12
+ #
13
+
5
14
  # The gem does not currently accept other models:
6
15
  # https://github.com/alchaplinsky/hugging-face/blob/main/lib/hugging_face/inference_api.rb#L32-L34
7
16
  DEFAULTS = {
@@ -2,6 +2,15 @@
2
2
 
3
3
  module Langchain::LLM
4
4
  class OpenAI < Base
5
+ #
6
+ # Wrapper around OpenAI APIs.
7
+ #
8
+ # Gem requirements: gem "ruby-openai", "~> 4.0.0"
9
+ #
10
+ # Usage:
11
+ # openai = Langchain::LLM::OpenAI.new(api_key:, llm_options: {})
12
+ #
13
+
5
14
  DEFAULTS = {
6
15
  temperature: 0.0,
7
16
  completion_model_name: "text-davinci-003",
@@ -10,12 +19,11 @@ module Langchain::LLM
10
19
  dimension: 1536
11
20
  }.freeze
12
21
 
13
- def initialize(api_key:)
22
+ def initialize(api_key:, llm_options: {})
14
23
  depends_on "ruby-openai"
15
24
  require "openai"
16
25
 
17
- # TODO: Add support to pass `organization_id:`
18
- @client = ::OpenAI::Client.new(access_token: api_key)
26
+ @client = ::OpenAI::Client.new(access_token: api_key, **llm_options)
19
27
  end
20
28
 
21
29
  #
@@ -24,17 +32,12 @@ module Langchain::LLM
24
32
  # @param text [String] The text to generate an embedding for
25
33
  # @return [Array] The embedding
26
34
  #
27
- def embed(text:)
28
- model = DEFAULTS[:embeddings_model_name]
35
+ def embed(text:, **params)
36
+ parameters = {model: DEFAULTS[:embeddings_model_name], input: text}
29
37
 
30
- Langchain::Utils::TokenLengthValidator.validate!(text, model)
38
+ Langchain::Utils::TokenLengthValidator.validate!(text, parameters[:model])
31
39
 
32
- response = client.embeddings(
33
- parameters: {
34
- model: model,
35
- input: text
36
- }
37
- )
40
+ response = client.embeddings(parameters: parameters.merge(params))
38
41
  response.dig("data").first.dig("embedding")
39
42
  end
40
43
 
@@ -45,23 +48,13 @@ module Langchain::LLM
45
48
  # @return [String] The completion
46
49
  #
47
50
  def complete(prompt:, **params)
48
- model = DEFAULTS[:completion_model_name]
49
-
50
- Langchain::Utils::TokenLengthValidator.validate!(prompt, model)
51
-
52
- default_params = {
53
- model: model,
54
- temperature: DEFAULTS[:temperature],
55
- prompt: prompt
56
- }
51
+ parameters = compose_parameters DEFAULTS[:completion_model_name], params
57
52
 
58
- if params[:stop_sequences]
59
- default_params[:stop] = params.delete(:stop_sequences)
60
- end
53
+ Langchain::Utils::TokenLengthValidator.validate!(prompt, parameters[:model])
61
54
 
62
- default_params.merge!(params)
55
+ parameters[:prompt] = prompt
63
56
 
64
- response = client.completions(parameters: default_params)
57
+ response = client.completions(parameters: parameters)
65
58
  response.dig("choices", 0, "text")
66
59
  end
67
60
 
@@ -72,24 +65,13 @@ module Langchain::LLM
72
65
  # @return [String] The chat completion
73
66
  #
74
67
  def chat(prompt:, **params)
75
- model = DEFAULTS[:chat_completion_model_name]
68
+ parameters = compose_parameters DEFAULTS[:chat_completion_model_name], params
76
69
 
77
- Langchain::Utils::TokenLengthValidator.validate!(prompt, model)
70
+ Langchain::Utils::TokenLengthValidator.validate!(prompt, parameters[:model])
78
71
 
79
- default_params = {
80
- model: model,
81
- temperature: DEFAULTS[:temperature],
82
- # TODO: Figure out how to introduce persisted conversations
83
- messages: [{role: "user", content: prompt}]
84
- }
85
-
86
- if params[:stop_sequences]
87
- default_params[:stop] = params.delete(:stop_sequences)
88
- end
72
+ parameters[:messages] = [{role: "user", content: prompt}]
89
73
 
90
- default_params.merge!(params)
91
-
92
- response = client.chat(parameters: default_params)
74
+ response = client.chat(parameters: parameters)
93
75
  response.dig("choices", 0, "message", "content")
94
76
  end
95
77
 
@@ -112,5 +94,15 @@ module Langchain::LLM
112
94
  max_tokens: 2048
113
95
  )
114
96
  end
97
+
98
+ private
99
+
100
+ def compose_parameters(model, params)
101
+ default_params = {model: model, temperature: DEFAULTS[:temperature]}
102
+
103
+ default_params[:stop] = params.delete(:stop_sequences) if params[:stop_sequences]
104
+
105
+ default_params.merge(params)
106
+ end
115
107
  end
116
108
  end
@@ -2,7 +2,11 @@
2
2
 
3
3
  module Langchain::LLM
4
4
  class Replicate < Base
5
+ #
5
6
  # Wrapper around Replicate.com LLM provider
7
+ #
8
+ # Gem requirements: gem "replicate-ruby", "~> 0.2.2"
9
+ #
6
10
  # Use it directly:
7
11
  # replicate = LLM::Replicate.new(api_key: ENV["REPLICATE_API_KEY"])
8
12
  #
@@ -3,6 +3,8 @@
3
3
  module Langchain
4
4
  module Processors
5
5
  class Base
6
+ include Langchain::DependencyHelper
7
+
6
8
  EXTENSIONS = []
7
9
  CONTENT_TYPES = []
8
10
 
@@ -64,9 +64,9 @@ module Langchain::Prompt
64
64
  #
65
65
  # This method takes a template string and returns an array of input variable names
66
66
  # contained within the template. Input variables are defined as text enclosed in
67
- # curly braces (e.g. "{variable_name}").
67
+ # curly braces (e.g. <code>\{variable_name\}</code>).
68
68
  #
69
- # Content within two consecutive curly braces (e.g. "{{ignore_me}}) are ignored.
69
+ # Content within two consecutive curly braces (e.g. <code>\{\{ignore_me}}</code>) are ignored.
70
70
  #
71
71
  # @param template [String] The template string to extract variables from.
72
72
  #
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "strscan"
4
4
  require "pathname"
5
+ require "json"
5
6
 
6
7
  module Langchain::Prompt
7
8
  TYPE_TO_LOADER = {
@@ -20,7 +20,7 @@ module Langchain::Prompt
20
20
  end
21
21
 
22
22
  #
23
- # Format the prompt with the inputs. Double {{}} replaced with single {} to adhere to f-string spec.
23
+ # Format the prompt with the inputs. Double <code>{{}}</code> replaced with single <code>{}</code> to adhere to f-string spec.
24
24
  #
25
25
  # @param kwargs [Hash] Any arguments to be passed to the prompt template.
26
26
  # @return [String] A formatted string.
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Langchain::Tool
4
4
  class Base
5
+ include Langchain::DependencyHelper
6
+
5
7
  # How to add additional Tools?
6
8
  # 1. Create a new file in lib/tool/your_tool_name.rb
7
9
  # 2. Add your tool to the TOOLS hash below
@@ -2,6 +2,15 @@
2
2
 
3
3
  module Langchain::Tool
4
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
+ # ENV requirements: ENV["SERPAPI_API_KEY"]
12
+ #
13
+
5
14
  description <<~DESC
6
15
  Useful for getting the result of a math expression.
7
16
 
@@ -2,6 +2,12 @@
2
2
 
3
3
  module Langchain::Tool
4
4
  class RubyCodeInterpreter < Base
5
+ #
6
+ # A tool that execute Ruby code in a sandboxed environment.
7
+ #
8
+ # Gem requirements: gem "safe_ruby", "~> 1.0.4"
9
+ #
10
+
5
11
  description <<~DESC
6
12
  A Ruby code interpreter. Use this to execute ruby expressions. Input should be a valid ruby expression. If you want to see the output of the tool, make sure to return a value.
7
13
  DESC
@@ -2,8 +2,12 @@
2
2
 
3
3
  module Langchain::Tool
4
4
  class SerpApi < Base
5
+ #
5
6
  # Wrapper around SerpAPI
6
- # Set ENV["SERPAPI_API_KEY"] to use it
7
+ #
8
+ # Gem requirements: gem "google_search_results", "~> 2.0.0"
9
+ # ENV requirements: ENV["SERPAPI_API_KEY"] # https://serpapi.com/manage-api-key)
10
+ #
7
11
 
8
12
  description <<~DESC
9
13
  A wrapper around Google Search.
@@ -2,7 +2,11 @@
2
2
 
3
3
  module Langchain::Tool
4
4
  class Wikipedia < Base
5
+ #
5
6
  # Tool that adds the capability to search using the Wikipedia API
7
+ #
8
+ # Gem requirements: gem "wikipedia-client", "~> 1.17.0"
9
+ #
6
10
 
7
11
  description <<~DESC
8
12
  A wrapper around Wikipedia.
@@ -4,6 +4,7 @@ require "forwardable"
4
4
 
5
5
  module Langchain::Vectorsearch
6
6
  class Base
7
+ include Langchain::DependencyHelper
7
8
  extend Forwardable
8
9
 
9
10
  attr_reader :client, :index_name, :llm, :llm_api_key, :llm_client
@@ -2,6 +2,15 @@
2
2
 
3
3
  module Langchain::Vectorsearch
4
4
  class Chroma < Base
5
+ #
6
+ # Wrapper around Chroma DB
7
+ #
8
+ # Gem requirements: gem "chroma-db", "~> 0.3.0"
9
+ #
10
+ # Usage:
11
+ # chroma = Langchain::Vectorsearch::Chroma.new(url:, index_name:, llm:, llm_api_key:, api_key: nil)
12
+ #
13
+
5
14
  # Initialize the Chroma client
6
15
  # @param url [String] The URL of the Qdrant server
7
16
  # @param api_key [String] The API key to use
@@ -2,6 +2,15 @@
2
2
 
3
3
  module Langchain::Vectorsearch
4
4
  class Milvus < Base
5
+ #
6
+ # Wrapper around Milvus REST APIs.
7
+ #
8
+ # Gem requirements: gem "milvus", "~> 0.9.0"
9
+ #
10
+ # Usage:
11
+ # milvus = Langchain::Vectorsearch::Milvus.new(url:, index_name:, llm:, llm_api_key:)
12
+ #
13
+
5
14
  def initialize(url:, index_name:, llm:, llm_api_key:, api_key: nil)
6
15
  depends_on "milvus"
7
16
  require "milvus"
@@ -1,8 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Langchain::Vectorsearch
4
- # The PostgreSQL vector search adapter
5
4
  class Pgvector < Base
5
+ #
6
+ # The PostgreSQL vector search adapter
7
+ #
8
+ # Gem requirements: gem "pgvector", "~> 0.2"
9
+ #
10
+ # Usage:
11
+ # pgvector = Langchain::Vectorsearch::Pgvector.new(url:, index_name:, llm:, llm_api_key:)
12
+ #
13
+
6
14
  # The operators supported by the PostgreSQL vector search adapter
7
15
  OPERATORS = {
8
16
  "cosine_distance" => "<=>",
@@ -2,6 +2,15 @@
2
2
 
3
3
  module Langchain::Vectorsearch
4
4
  class Pinecone < Base
5
+ #
6
+ # Wrapper around Pinecone API.
7
+ #
8
+ # Gem requirements: gem "pinecone", "~> 0.1.6"
9
+ #
10
+ # Usage:
11
+ # pinecone = Langchain::Vectorsearch::Pinecone.new(environment:, api_key:, index_name:, llm:, llm_api_key:)
12
+ #
13
+
5
14
  # Initialize the Pinecone client
6
15
  # @param environment [String] The environment to use
7
16
  # @param api_key [String] The API key to use
@@ -2,6 +2,15 @@
2
2
 
3
3
  module Langchain::Vectorsearch
4
4
  class Qdrant < Base
5
+ #
6
+ # Wrapper around Qdrant
7
+ #
8
+ # Gem requirements: gem "qdrant-ruby", "~> 0.9.0"
9
+ #
10
+ # Usage:
11
+ # qdrant = Langchain::Vectorsearch::Qdrant.new(url:, api_key:, index_name:, llm:, llm_api_key:)
12
+ #
13
+
5
14
  # Initialize the Qdrant client
6
15
  # @param url [String] The URL of the Qdrant server
7
16
  # @param api_key [String] The API key to use
@@ -2,6 +2,15 @@
2
2
 
3
3
  module Langchain::Vectorsearch
4
4
  class Weaviate < Base
5
+ #
6
+ # Wrapper around Weaviate
7
+ #
8
+ # Gem requirements: gem "weaviate-ruby", "~> 0.8.0"
9
+ #
10
+ # Usage:
11
+ # weaviate = Langchain::Vectorsearch::Weaviate.new(url:, api_key:, index_name:, llm:, llm_api_key:)
12
+ #
13
+
5
14
  # Initialize the Weaviate adapter
6
15
  # @param url [String] The URL of the Weaviate instance
7
16
  # @param api_key [String] The API key to use
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Langchain
4
- VERSION = "0.4.1"
4
+ VERSION = "0.4.2"
5
5
  end
data/lib/langchain.rb CHANGED
@@ -4,8 +4,7 @@ require "logger"
4
4
  require "pathname"
5
5
  require "colorize"
6
6
 
7
- require_relative "./version"
8
- require_relative "./dependency_helper"
7
+ require_relative "./langchain/version"
9
8
 
10
9
  module Langchain
11
10
  class << self
@@ -20,6 +19,7 @@ module Langchain
20
19
 
21
20
  autoload :Loader, "langchain/loader"
22
21
  autoload :Data, "langchain/data"
22
+ autoload :DependencyHelper, "langchain/dependency_helper"
23
23
 
24
24
  module Agent
25
25
  autoload :Base, "langchain/agent/base"
@@ -60,6 +60,7 @@ module Langchain
60
60
  end
61
61
 
62
62
  module LLM
63
+ autoload :AI21, "langchain/llm/ai21"
63
64
  autoload :Base, "langchain/llm/base"
64
65
  autoload :Cohere, "langchain/llm/cohere"
65
66
  autoload :GooglePalm, "langchain/llm/google_palm"
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.1
4
+ version: 0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrei Bondarev
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-06-02 00:00:00.000000000 Z
11
+ date: 2023-06-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: tiktoken_ruby
@@ -66,6 +66,48 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: 3.10.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: yard
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rdiscount
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: ai21
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.2.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.2.0
69
111
  - !ruby/object:Gem::Dependency
70
112
  name: chroma-db
71
113
  requirement: !ruby/object:Gem::Requirement
@@ -353,12 +395,13 @@ files:
353
395
  - examples/store_and_query_with_pinecone.rb
354
396
  - examples/store_and_query_with_qdrant.rb
355
397
  - examples/store_and_query_with_weaviate.rb
356
- - lib/dependency_helper.rb
357
398
  - lib/langchain.rb
358
399
  - lib/langchain/agent/base.rb
359
400
  - lib/langchain/agent/chain_of_thought_agent/chain_of_thought_agent.rb
360
401
  - lib/langchain/agent/chain_of_thought_agent/chain_of_thought_agent_prompt.json
361
402
  - lib/langchain/data.rb
403
+ - lib/langchain/dependency_helper.rb
404
+ - lib/langchain/llm/ai21.rb
362
405
  - lib/langchain/llm/base.rb
363
406
  - lib/langchain/llm/cohere.rb
364
407
  - lib/langchain/llm/google_palm.rb
@@ -392,8 +435,8 @@ files:
392
435
  - lib/langchain/vectorsearch/pinecone.rb
393
436
  - lib/langchain/vectorsearch/qdrant.rb
394
437
  - lib/langchain/vectorsearch/weaviate.rb
438
+ - lib/langchain/version.rb
395
439
  - lib/langchainrb.rb
396
- - lib/version.rb
397
440
  - sig/langchain.rbs
398
441
  homepage: https://rubygems.org/gems/langchainrb
399
442
  licenses:
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- VersionError = Class.new(ScriptError)
4
-
5
- # This method requires and loads the given gem, and then checks to see if the version of the gem meets the requirements listed in `langchain.gemspec`
6
- # This solution was built to avoid auto-loading every single gem in the Gemfile when the developer will mostly likely be only using a few of them.
7
- #
8
- # @param gem_name [String] The name of the gem to load
9
- # @return [Boolean] Whether or not the gem was loaded successfully
10
- # @raise [LoadError] If the gem is not installed
11
- # @raise [VersionError] If the gem is installed, but the version does not meet the requirements
12
- #
13
- def depends_on(gem_name)
14
- gem(gem_name) # require the gem
15
-
16
- return(true) unless defined?(Bundler) # If we're in a non-bundler environment, we're no longer able to determine if we'll meet requirements
17
-
18
- gem_version = Gem.loaded_specs[gem_name].version
19
- gem_requirement = Bundler.load.dependencies.find { |g| g.name == gem_name }&.requirement
20
-
21
- raise LoadError unless gem_requirement
22
-
23
- unless gem_requirement.satisfied_by?(gem_version)
24
- raise VersionError, "The #{gem_name} gem is installed, but version #{gem_requirement} is required. You have #{gem_version}."
25
- end
26
-
27
- true
28
- rescue LoadError
29
- raise LoadError, "Could not load #{gem_name}. Please ensure that the #{gem_name} gem is installed."
30
- end