langchainrb 0.6.17 → 0.6.19

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 (43) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +15 -0
  3. data/README.md +18 -3
  4. data/lib/langchain/active_record/hooks.rb +14 -0
  5. data/lib/langchain/agent/react_agent.rb +1 -1
  6. data/lib/langchain/agent/sql_query_agent.rb +2 -2
  7. data/lib/langchain/chunk.rb +16 -0
  8. data/lib/langchain/chunker/base.rb +4 -0
  9. data/lib/langchain/chunker/recursive_text.rb +5 -2
  10. data/lib/langchain/chunker/semantic.rb +4 -1
  11. data/lib/langchain/chunker/sentence.rb +4 -2
  12. data/lib/langchain/chunker/text.rb +5 -2
  13. data/lib/langchain/conversation.rb +1 -1
  14. data/lib/langchain/llm/ai21.rb +4 -3
  15. data/lib/langchain/llm/anthropic.rb +3 -3
  16. data/lib/langchain/llm/cohere.rb +6 -5
  17. data/lib/langchain/llm/google_palm.rb +14 -10
  18. data/lib/langchain/llm/hugging_face.rb +4 -3
  19. data/lib/langchain/llm/llama_cpp.rb +1 -1
  20. data/lib/langchain/llm/ollama.rb +18 -6
  21. data/lib/langchain/llm/openai.rb +7 -6
  22. data/lib/langchain/llm/replicate.rb +6 -10
  23. data/lib/langchain/llm/response/ai21_response.rb +13 -0
  24. data/lib/langchain/llm/response/anthropic_response.rb +29 -0
  25. data/lib/langchain/llm/response/base_response.rb +79 -0
  26. data/lib/langchain/llm/response/cohere_response.rb +21 -0
  27. data/lib/langchain/llm/response/google_palm_response.rb +36 -0
  28. data/lib/langchain/llm/response/hugging_face_response.rb +13 -0
  29. data/lib/langchain/llm/response/ollama_response.rb +26 -0
  30. data/lib/langchain/llm/response/openai_response.rb +51 -0
  31. data/lib/langchain/llm/response/replicate_response.rb +28 -0
  32. data/lib/langchain/vectorsearch/base.rb +4 -7
  33. data/lib/langchain/vectorsearch/chroma.rb +13 -12
  34. data/lib/langchain/vectorsearch/elasticsearch.rb +147 -0
  35. data/lib/langchain/vectorsearch/hnswlib.rb +5 -5
  36. data/lib/langchain/vectorsearch/milvus.rb +5 -4
  37. data/lib/langchain/vectorsearch/pgvector.rb +12 -6
  38. data/lib/langchain/vectorsearch/pinecone.rb +14 -13
  39. data/lib/langchain/vectorsearch/qdrant.rb +9 -8
  40. data/lib/langchain/vectorsearch/weaviate.rb +9 -8
  41. data/lib/langchain/version.rb +1 -1
  42. data/lib/langchain.rb +5 -0
  43. metadata +27 -2
@@ -5,10 +5,11 @@ module Langchain::Vectorsearch
5
5
  #
6
6
  # Wrapper around Pinecone API.
7
7
  #
8
- # Gem requirements: gem "pinecone", "~> 0.1.6"
8
+ # Gem requirements:
9
+ # gem "pinecone", "~> 0.1.6"
9
10
  #
10
11
  # Usage:
11
- # pinecone = Langchain::Vectorsearch::Pinecone.new(environment:, api_key:, index_name:, llm:, llm_api_key:)
12
+ # pinecone = Langchain::Vectorsearch::Pinecone.new(environment:, api_key:, index_name:, llm:, llm_api_key:)
12
13
  #
13
14
 
14
15
  # Initialize the Pinecone client
@@ -31,7 +32,7 @@ module Langchain::Vectorsearch
31
32
  end
32
33
 
33
34
  # Find records by ids
34
- # @param ids [Array] The ids to find
35
+ # @param ids [Array<Integer>] The ids to find
35
36
  # @param namespace String The namespace to search through
36
37
  # @return [Hash] The response from the server
37
38
  def find(ids: [], namespace: "")
@@ -44,8 +45,8 @@ module Langchain::Vectorsearch
44
45
  end
45
46
 
46
47
  # Add a list of texts to the index
47
- # @param texts [Array] The list of texts to add
48
- # @param ids [Array] The list of IDs to add
48
+ # @param texts [Array<String>] The list of texts to add
49
+ # @param ids [Array<Integer>] The list of IDs to add
49
50
  # @param namespace [String] The namespace to add the texts to
50
51
  # @param metadata [Hash] The metadata to use for the texts
51
52
  # @return [Hash] The response from the server
@@ -54,7 +55,7 @@ module Langchain::Vectorsearch
54
55
  {
55
56
  id: ids[i] ? ids[i].to_s : SecureRandom.uuid,
56
57
  metadata: metadata || {content: text},
57
- values: llm.embed(text: text)
58
+ values: llm.embed(text: text).embedding
58
59
  }
59
60
  end
60
61
 
@@ -70,7 +71,7 @@ module Langchain::Vectorsearch
70
71
  .flatten
71
72
  .map do |path|
72
73
  data = Langchain::Loader.new(path)&.load&.chunks
73
- data.map { |chunk| chunk[:text] }
74
+ data.map { |chunk| chunk.text }
74
75
  end
75
76
 
76
77
  texts.flatten!
@@ -79,8 +80,8 @@ module Langchain::Vectorsearch
79
80
  end
80
81
 
81
82
  # Update a list of texts in the index
82
- # @param texts [Array] The list of texts to update
83
- # @param ids [Array] The list of IDs to update
83
+ # @param texts [Array<String>] The list of texts to update
84
+ # @param ids [Array<Integer>] The list of IDs to update
84
85
  # @param namespace [String] The namespace to update the texts in
85
86
  # @param metadata [Hash] The metadata to use for the texts
86
87
  # @return [Array] The response from the server
@@ -90,7 +91,7 @@ module Langchain::Vectorsearch
90
91
  index.update(
91
92
  namespace: namespace,
92
93
  id: ids[i].to_s,
93
- values: llm.embed(text: text),
94
+ values: llm.embed(text: text).embedding,
94
95
  set_metadata: metadata
95
96
  )
96
97
  end
@@ -102,7 +103,7 @@ module Langchain::Vectorsearch
102
103
  client.create_index(
103
104
  metric: DEFAULT_METRIC,
104
105
  name: index_name,
105
- dimension: default_dimension
106
+ dimension: llm.default_dimension
106
107
  )
107
108
  end
108
109
 
@@ -130,7 +131,7 @@ module Langchain::Vectorsearch
130
131
  namespace: "",
131
132
  filter: nil
132
133
  )
133
- embedding = llm.embed(text: query)
134
+ embedding = llm.embed(text: query).embedding
134
135
 
135
136
  similarity_search_by_vector(
136
137
  embedding: embedding,
@@ -141,7 +142,7 @@ module Langchain::Vectorsearch
141
142
  end
142
143
 
143
144
  # Search for similar texts by embedding
144
- # @param embedding [Array] The embedding to search for
145
+ # @param embedding [Array<Float>] The embedding to search for
145
146
  # @param k [Integer] The number of results to return
146
147
  # @param namespace [String] The namespace to search in
147
148
  # @param filter [String] The filter to use
@@ -5,10 +5,11 @@ module Langchain::Vectorsearch
5
5
  #
6
6
  # Wrapper around Qdrant
7
7
  #
8
- # Gem requirements: gem "qdrant-ruby", "~> 0.9.3"
8
+ # Gem requirements:
9
+ # gem "qdrant-ruby", "~> 0.9.3"
9
10
  #
10
11
  # Usage:
11
- # qdrant = Langchain::Vectorsearch::Qdrant.new(url:, api_key:, index_name:, llm:, llm_api_key:)
12
+ # qdrant = Langchain::Vectorsearch::Qdrant.new(url:, api_key:, index_name:, llm:, llm_api_key:)
12
13
  #
13
14
 
14
15
  # Initialize the Qdrant client
@@ -29,7 +30,7 @@ module Langchain::Vectorsearch
29
30
  end
30
31
 
31
32
  # Find records by ids
32
- # @param ids [Array] The ids to find
33
+ # @param ids [Array<Integer>] The ids to find
33
34
  # @return [Hash] The response from the server
34
35
  def find(ids: [])
35
36
  client.points.get_all(
@@ -41,7 +42,7 @@ module Langchain::Vectorsearch
41
42
  end
42
43
 
43
44
  # Add a list of texts to the index
44
- # @param texts [Array] The list of texts to add
45
+ # @param texts [Array<String>] The list of texts to add
45
46
  # @return [Hash] The response from the server
46
47
  def add_texts(texts:, ids: [])
47
48
  batch = {ids: [], vectors: [], payloads: []}
@@ -49,7 +50,7 @@ module Langchain::Vectorsearch
49
50
  Array(texts).each_with_index do |text, i|
50
51
  id = ids[i] || SecureRandom.uuid
51
52
  batch[:ids].push(id)
52
- batch[:vectors].push(llm.embed(text: text))
53
+ batch[:vectors].push(llm.embed(text: text).embedding)
53
54
  batch[:payloads].push({content: text})
54
55
  end
55
56
 
@@ -82,7 +83,7 @@ module Langchain::Vectorsearch
82
83
  collection_name: index_name,
83
84
  vectors: {
84
85
  distance: DEFAULT_METRIC.capitalize,
85
- size: default_dimension
86
+ size: llm.default_dimension
86
87
  }
87
88
  )
88
89
  end
@@ -95,7 +96,7 @@ module Langchain::Vectorsearch
95
96
  query:,
96
97
  k: 4
97
98
  )
98
- embedding = llm.embed(text: query)
99
+ embedding = llm.embed(text: query).embedding
99
100
 
100
101
  similarity_search_by_vector(
101
102
  embedding: embedding,
@@ -104,7 +105,7 @@ module Langchain::Vectorsearch
104
105
  end
105
106
 
106
107
  # Search for similar texts by embedding
107
- # @param embedding [Array] The embedding to search for
108
+ # @param embedding [Array<Float>] The embedding to search for
108
109
  # @param k [Integer] The number of results to return
109
110
  # @return [Hash] The response from the server
110
111
  def similarity_search_by_vector(
@@ -5,10 +5,11 @@ module Langchain::Vectorsearch
5
5
  #
6
6
  # Wrapper around Weaviate
7
7
  #
8
- # Gem requirements: gem "weaviate-ruby", "~> 0.8.3"
8
+ # Gem requirements:
9
+ # gem "weaviate-ruby", "~> 0.8.3"
9
10
  #
10
11
  # Usage:
11
- # weaviate = Langchain::Vectorsearch::Weaviate.new(url:, api_key:, index_name:, llm:, llm_api_key:)
12
+ # weaviate = Langchain::Vectorsearch::Weaviate.new(url:, api_key:, index_name:, llm:, llm_api_key:)
12
13
  #
13
14
 
14
15
  # Initialize the Weaviate adapter
@@ -32,7 +33,7 @@ module Langchain::Vectorsearch
32
33
  end
33
34
 
34
35
  # Add a list of texts to the index
35
- # @param texts [Array] The list of texts to add
36
+ # @param texts [Array<String>] The list of texts to add
36
37
  # @return [Hash] The response from the server
37
38
  def add_texts(texts:, ids: [])
38
39
  client.objects.batch_create(
@@ -41,7 +42,7 @@ module Langchain::Vectorsearch
41
42
  end
42
43
 
43
44
  # Update a list of texts in the index
44
- # @param texts [Array] The list of texts to update
45
+ # @param texts [Array<String>] The list of texts to update
45
46
  # @return [Hash] The response from the server
46
47
  def update_texts(texts:, ids:)
47
48
  uuids = []
@@ -65,7 +66,7 @@ module Langchain::Vectorsearch
65
66
  __id: ids[i].to_s,
66
67
  content: text
67
68
  },
68
- vector: llm.embed(text: text)
69
+ vector: llm.embed(text: text).embedding
69
70
  )
70
71
  end
71
72
  end
@@ -101,13 +102,13 @@ module Langchain::Vectorsearch
101
102
  # @param k [Integer|String] The number of results to return
102
103
  # @return [Hash] The search results
103
104
  def similarity_search(query:, k: 4)
104
- embedding = llm.embed(text: query)
105
+ embedding = llm.embed(text: query).embedding
105
106
 
106
107
  similarity_search_by_vector(embedding: embedding, k: k)
107
108
  end
108
109
 
109
110
  # Return documents similar to the vector
110
- # @param embedding [Array] The vector to search for
111
+ # @param embedding [Array<Float>] The vector to search for
111
112
  # @param k [Integer|String] The number of results to return
112
113
  # @return [Hash] The search results
113
114
  def similarity_search_by_vector(embedding:, k: 4)
@@ -154,7 +155,7 @@ module Langchain::Vectorsearch
154
155
  __id: id.to_s,
155
156
  content: text
156
157
  },
157
- vector: llm.embed(text: text)
158
+ vector: llm.embed(text: text).embedding
158
159
  }
159
160
  end
160
161
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Langchain
4
- VERSION = "0.6.17"
4
+ VERSION = "0.6.19"
5
5
  end
data/lib/langchain.rb CHANGED
@@ -8,6 +8,7 @@ loader = Zeitwerk::Loader.for_gem
8
8
  loader.ignore("#{__dir__}/langchainrb.rb")
9
9
  loader.inflector.inflect(
10
10
  "ai21" => "AI21",
11
+ "ai21_response" => "AI21Response",
11
12
  "ai21_validator" => "AI21Validator",
12
13
  "csv" => "CSV",
13
14
  "html" => "HTML",
@@ -16,10 +17,12 @@ loader.inflector.inflect(
16
17
  "llm" => "LLM",
17
18
  "openai" => "OpenAI",
18
19
  "openai_validator" => "OpenAIValidator",
20
+ "openai_response" => "OpenAIResponse",
19
21
  "pdf" => "PDF",
20
22
  "react_agent" => "ReActAgent",
21
23
  "sql_query_agent" => "SQLQueryAgent"
22
24
  )
25
+ loader.collapse("#{__dir__}/langchain/llm/response")
23
26
  loader.setup
24
27
 
25
28
  # Langchain.rb a is library for building LLM-backed Ruby applications. It is an abstraction layer that sits on top of the emerging AI-related tools that makes it easy for developers to consume and string those services together.
@@ -86,3 +89,5 @@ module Langchain
86
89
  class BaseError < StandardError; end
87
90
  end
88
91
  end
92
+
93
+ require "langchain/railtie" if defined?(Rails)
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.6.17
4
+ version: 0.6.19
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-10-10 00:00:00.000000000 Z
11
+ date: 2023-10-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: baran
@@ -220,6 +220,20 @@ dependencies:
220
220
  - - "~>"
221
221
  - !ruby/object:Gem::Version
222
222
  version: 0.8.0
223
+ - !ruby/object:Gem::Dependency
224
+ name: elasticsearch
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "~>"
228
+ - !ruby/object:Gem::Version
229
+ version: 8.2.0
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - "~>"
235
+ - !ruby/object:Gem::Version
236
+ version: 8.2.0
223
237
  - !ruby/object:Gem::Dependency
224
238
  name: eqn
225
239
  requirement: !ruby/object:Gem::Requirement
@@ -532,6 +546,7 @@ files:
532
546
  - lib/langchain/agent/sql_query_agent.rb
533
547
  - lib/langchain/agent/sql_query_agent/sql_query_agent_answer_prompt.yaml
534
548
  - lib/langchain/agent/sql_query_agent/sql_query_agent_sql_prompt.yaml
549
+ - lib/langchain/chunk.rb
535
550
  - lib/langchain/chunker/base.rb
536
551
  - lib/langchain/chunker/prompts/semantic_prompt_template.yml
537
552
  - lib/langchain/chunker/recursive_text.rb
@@ -558,6 +573,15 @@ files:
558
573
  - lib/langchain/llm/openai.rb
559
574
  - lib/langchain/llm/prompts/summarize_template.yaml
560
575
  - lib/langchain/llm/replicate.rb
576
+ - lib/langchain/llm/response/ai21_response.rb
577
+ - lib/langchain/llm/response/anthropic_response.rb
578
+ - lib/langchain/llm/response/base_response.rb
579
+ - lib/langchain/llm/response/cohere_response.rb
580
+ - lib/langchain/llm/response/google_palm_response.rb
581
+ - lib/langchain/llm/response/hugging_face_response.rb
582
+ - lib/langchain/llm/response/ollama_response.rb
583
+ - lib/langchain/llm/response/openai_response.rb
584
+ - lib/langchain/llm/response/replicate_response.rb
561
585
  - lib/langchain/loader.rb
562
586
  - lib/langchain/output_parsers/base.rb
563
587
  - lib/langchain/output_parsers/output_fixing_parser.rb
@@ -593,6 +617,7 @@ files:
593
617
  - lib/langchain/utils/token_length/token_limit_exceeded.rb
594
618
  - lib/langchain/vectorsearch/base.rb
595
619
  - lib/langchain/vectorsearch/chroma.rb
620
+ - lib/langchain/vectorsearch/elasticsearch.rb
596
621
  - lib/langchain/vectorsearch/hnswlib.rb
597
622
  - lib/langchain/vectorsearch/milvus.rb
598
623
  - lib/langchain/vectorsearch/pgvector.rb