langchainrb 0.18.0 → 0.19.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +30 -0
- data/README.md +4 -4
- data/lib/langchain/assistant/llm/adapter.rb +7 -6
- data/lib/langchain/assistant/llm/adapters/anthropic.rb +1 -3
- data/lib/langchain/assistant/llm/adapters/aws_bedrock_anthropic.rb +35 -0
- data/lib/langchain/assistant/llm/adapters/ollama.rb +1 -3
- data/lib/langchain/assistant/messages/anthropic_message.rb +89 -17
- data/lib/langchain/assistant/messages/base.rb +4 -0
- data/lib/langchain/assistant/messages/google_gemini_message.rb +62 -21
- data/lib/langchain/assistant/messages/mistral_ai_message.rb +69 -24
- data/lib/langchain/assistant/messages/ollama_message.rb +9 -5
- data/lib/langchain/assistant/messages/openai_message.rb +78 -26
- data/lib/langchain/assistant.rb +2 -1
- data/lib/langchain/llm/anthropic.rb +10 -10
- data/lib/langchain/llm/aws_bedrock.rb +75 -120
- data/lib/langchain/llm/azure.rb +1 -1
- data/lib/langchain/llm/base.rb +1 -1
- data/lib/langchain/llm/cohere.rb +8 -8
- data/lib/langchain/llm/google_gemini.rb +5 -6
- data/lib/langchain/llm/google_vertex_ai.rb +6 -5
- data/lib/langchain/llm/hugging_face.rb +4 -4
- data/lib/langchain/llm/mistral_ai.rb +4 -4
- data/lib/langchain/llm/ollama.rb +10 -8
- data/lib/langchain/llm/openai.rb +6 -5
- data/lib/langchain/llm/parameters/chat.rb +4 -1
- data/lib/langchain/llm/replicate.rb +6 -6
- data/lib/langchain/llm/response/ai21_response.rb +20 -0
- data/lib/langchain/tool_definition.rb +7 -0
- data/lib/langchain/utils/image_wrapper.rb +37 -0
- data/lib/langchain/version.rb +1 -1
- metadata +4 -2
@@ -8,8 +8,8 @@ module Langchain::LLM
|
|
8
8
|
# llm = Langchain::LLM::MistralAI.new(api_key: ENV["MISTRAL_AI_API_KEY"])
|
9
9
|
class MistralAI < Base
|
10
10
|
DEFAULTS = {
|
11
|
-
|
12
|
-
|
11
|
+
chat_model: "mistral-large-latest",
|
12
|
+
embedding_model: "mistral-embed"
|
13
13
|
}.freeze
|
14
14
|
|
15
15
|
attr_reader :defaults
|
@@ -24,7 +24,7 @@ module Langchain::LLM
|
|
24
24
|
|
25
25
|
@defaults = DEFAULTS.merge(default_options)
|
26
26
|
chat_parameters.update(
|
27
|
-
model: {default: @defaults[:
|
27
|
+
model: {default: @defaults[:chat_model]},
|
28
28
|
n: {default: @defaults[:n]},
|
29
29
|
safe_prompt: {},
|
30
30
|
temperature: {default: @defaults[:temperature]},
|
@@ -44,7 +44,7 @@ module Langchain::LLM
|
|
44
44
|
|
45
45
|
def embed(
|
46
46
|
text:,
|
47
|
-
model: defaults[:
|
47
|
+
model: defaults[:embedding_model],
|
48
48
|
encoding_format: nil
|
49
49
|
)
|
50
50
|
params = {
|
data/lib/langchain/llm/ollama.rb
CHANGED
@@ -12,9 +12,10 @@ module Langchain::LLM
|
|
12
12
|
|
13
13
|
DEFAULTS = {
|
14
14
|
temperature: 0.0,
|
15
|
-
|
16
|
-
|
17
|
-
|
15
|
+
completion_model: "llama3.1",
|
16
|
+
embedding_model: "llama3.1",
|
17
|
+
chat_model: "llama3.1",
|
18
|
+
options: {}
|
18
19
|
}.freeze
|
19
20
|
|
20
21
|
EMBEDDING_SIZES = {
|
@@ -41,11 +42,12 @@ module Langchain::LLM
|
|
41
42
|
@api_key = api_key
|
42
43
|
@defaults = DEFAULTS.merge(default_options)
|
43
44
|
chat_parameters.update(
|
44
|
-
model: {default: @defaults[:
|
45
|
+
model: {default: @defaults[:chat_model]},
|
45
46
|
temperature: {default: @defaults[:temperature]},
|
46
47
|
template: {},
|
47
48
|
stream: {default: false},
|
48
|
-
response_format: {default: @defaults[:response_format]}
|
49
|
+
response_format: {default: @defaults[:response_format]},
|
50
|
+
options: {default: @defaults[:options]}
|
49
51
|
)
|
50
52
|
chat_parameters.remap(response_format: :format)
|
51
53
|
end
|
@@ -55,7 +57,7 @@ module Langchain::LLM
|
|
55
57
|
def default_dimensions
|
56
58
|
# since Ollama can run multiple models, look it up or generate an embedding and return the size
|
57
59
|
@default_dimensions ||=
|
58
|
-
EMBEDDING_SIZES.fetch(defaults[:
|
60
|
+
EMBEDDING_SIZES.fetch(defaults[:embedding_model].to_sym) do
|
59
61
|
embed(text: "test").embedding.size
|
60
62
|
end
|
61
63
|
end
|
@@ -77,7 +79,7 @@ module Langchain::LLM
|
|
77
79
|
#
|
78
80
|
def complete(
|
79
81
|
prompt:,
|
80
|
-
model: defaults[:
|
82
|
+
model: defaults[:completion_model],
|
81
83
|
images: nil,
|
82
84
|
format: nil,
|
83
85
|
system: nil,
|
@@ -199,7 +201,7 @@ module Langchain::LLM
|
|
199
201
|
#
|
200
202
|
def embed(
|
201
203
|
text:,
|
202
|
-
model: defaults[:
|
204
|
+
model: defaults[:embedding_model],
|
203
205
|
mirostat: nil,
|
204
206
|
mirostat_eta: nil,
|
205
207
|
mirostat_tau: nil,
|
data/lib/langchain/llm/openai.rb
CHANGED
@@ -16,8 +16,8 @@ module Langchain::LLM
|
|
16
16
|
DEFAULTS = {
|
17
17
|
n: 1,
|
18
18
|
temperature: 0.0,
|
19
|
-
|
20
|
-
|
19
|
+
chat_model: "gpt-4o-mini",
|
20
|
+
embedding_model: "text-embedding-3-small"
|
21
21
|
}.freeze
|
22
22
|
|
23
23
|
EMBEDDING_SIZES = {
|
@@ -41,7 +41,7 @@ module Langchain::LLM
|
|
41
41
|
|
42
42
|
@defaults = DEFAULTS.merge(default_options)
|
43
43
|
chat_parameters.update(
|
44
|
-
model: {default: @defaults[:
|
44
|
+
model: {default: @defaults[:chat_model]},
|
45
45
|
logprobs: {},
|
46
46
|
top_logprobs: {},
|
47
47
|
n: {default: @defaults[:n]},
|
@@ -61,7 +61,7 @@ module Langchain::LLM
|
|
61
61
|
# @return [Langchain::LLM::OpenAIResponse] Response object
|
62
62
|
def embed(
|
63
63
|
text:,
|
64
|
-
model: defaults[:
|
64
|
+
model: defaults[:embedding_model],
|
65
65
|
encoding_format: nil,
|
66
66
|
user: nil,
|
67
67
|
dimensions: @defaults[:dimensions]
|
@@ -109,6 +109,7 @@ module Langchain::LLM
|
|
109
109
|
messages = [{role: "user", content: prompt}]
|
110
110
|
chat(messages: messages, **params)
|
111
111
|
end
|
112
|
+
|
112
113
|
# rubocop:enable Style/ArgumentsForwarding
|
113
114
|
|
114
115
|
# Generate a chat completion for given messages.
|
@@ -159,7 +160,7 @@ module Langchain::LLM
|
|
159
160
|
end
|
160
161
|
|
161
162
|
def default_dimensions
|
162
|
-
@defaults[:dimensions] || EMBEDDING_SIZES.fetch(defaults[:
|
163
|
+
@defaults[:dimensions] || EMBEDDING_SIZES.fetch(defaults[:embedding_model])
|
163
164
|
end
|
164
165
|
|
165
166
|
private
|
@@ -14,8 +14,8 @@ module Langchain::LLM
|
|
14
14
|
# TODO: Figure out how to send the temperature to the API
|
15
15
|
temperature: 0.01, # Minimum accepted value
|
16
16
|
# TODO: Design the interface to pass and use different models
|
17
|
-
|
18
|
-
|
17
|
+
completion_model: "replicate/vicuna-13b",
|
18
|
+
embedding_model: "creatorrr/all-mpnet-base-v2",
|
19
19
|
dimensions: 384
|
20
20
|
}.freeze
|
21
21
|
|
@@ -49,7 +49,7 @@ module Langchain::LLM
|
|
49
49
|
sleep(0.1)
|
50
50
|
end
|
51
51
|
|
52
|
-
Langchain::LLM::ReplicateResponse.new(response, model: @defaults[:
|
52
|
+
Langchain::LLM::ReplicateResponse.new(response, model: @defaults[:embedding_model])
|
53
53
|
end
|
54
54
|
|
55
55
|
#
|
@@ -66,7 +66,7 @@ module Langchain::LLM
|
|
66
66
|
sleep(0.1)
|
67
67
|
end
|
68
68
|
|
69
|
-
Langchain::LLM::ReplicateResponse.new(response, model: @defaults[:
|
69
|
+
Langchain::LLM::ReplicateResponse.new(response, model: @defaults[:completion_model])
|
70
70
|
end
|
71
71
|
|
72
72
|
#
|
@@ -94,11 +94,11 @@ module Langchain::LLM
|
|
94
94
|
private
|
95
95
|
|
96
96
|
def completion_model
|
97
|
-
@completion_model ||= client.retrieve_model(@defaults[:
|
97
|
+
@completion_model ||= client.retrieve_model(@defaults[:completion_model]).latest_version
|
98
98
|
end
|
99
99
|
|
100
100
|
def embeddings_model
|
101
|
-
@embeddings_model ||= client.retrieve_model(@defaults[:
|
101
|
+
@embeddings_model ||= client.retrieve_model(@defaults[:embedding_model]).latest_version
|
102
102
|
end
|
103
103
|
end
|
104
104
|
end
|
@@ -9,5 +9,25 @@ module Langchain::LLM
|
|
9
9
|
def completion
|
10
10
|
completions.dig(0, :data, :text)
|
11
11
|
end
|
12
|
+
|
13
|
+
def chat_completion
|
14
|
+
raw_response.dig(:choices, 0, :message, :content)
|
15
|
+
end
|
16
|
+
|
17
|
+
def prompt_tokens
|
18
|
+
raw_response.dig(:usage, :prompt_tokens).to_i
|
19
|
+
end
|
20
|
+
|
21
|
+
def completion_tokens
|
22
|
+
raw_response.dig(:usage, :completion_tokens).to_i
|
23
|
+
end
|
24
|
+
|
25
|
+
def total_tokens
|
26
|
+
raw_response.dig(:usage, :total_tokens).to_i
|
27
|
+
end
|
28
|
+
|
29
|
+
def role
|
30
|
+
raw_response.dig(:choices, 0, :message, :role)
|
31
|
+
end
|
12
32
|
end
|
13
33
|
end
|
@@ -103,6 +103,13 @@ module Langchain::ToolDefinition
|
|
103
103
|
# @return [String] JSON string of schemas in Anthropic format
|
104
104
|
def to_anthropic_format
|
105
105
|
@schemas.values.map do |schema|
|
106
|
+
# Adds a default input_schema if no parameters are present
|
107
|
+
schema[:function][:parameters] ||= {
|
108
|
+
type: "object",
|
109
|
+
properties: {},
|
110
|
+
required: []
|
111
|
+
}
|
112
|
+
|
106
113
|
schema[:function].transform_keys(parameters: :input_schema)
|
107
114
|
end
|
108
115
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "open-uri"
|
4
|
+
require "base64"
|
5
|
+
|
6
|
+
module Langchain
|
7
|
+
module Utils
|
8
|
+
class ImageWrapper
|
9
|
+
attr_reader :image_url
|
10
|
+
|
11
|
+
def initialize(image_url)
|
12
|
+
@image_url = image_url
|
13
|
+
end
|
14
|
+
|
15
|
+
def base64
|
16
|
+
@base64 ||= begin
|
17
|
+
image_data = open_image.read
|
18
|
+
Base64.strict_encode64(image_data)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def mime_type
|
23
|
+
# TODO: Make it work with local files
|
24
|
+
open_image.meta["content-type"]
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def open_image
|
30
|
+
# TODO: Make it work with local files
|
31
|
+
uri = URI.parse(image_url)
|
32
|
+
raise URI::InvalidURIError, "Invalid URL scheme" unless %w[http https].include?(uri.scheme)
|
33
|
+
@open_image ||= URI.open(image_url) # rubocop:disable Security/Open
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
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.19.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-
|
11
|
+
date: 2024-11-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: baran
|
@@ -640,6 +640,7 @@ files:
|
|
640
640
|
- lib/langchain/assistant.rb
|
641
641
|
- lib/langchain/assistant/llm/adapter.rb
|
642
642
|
- lib/langchain/assistant/llm/adapters/anthropic.rb
|
643
|
+
- lib/langchain/assistant/llm/adapters/aws_bedrock_anthropic.rb
|
643
644
|
- lib/langchain/assistant/llm/adapters/base.rb
|
644
645
|
- lib/langchain/assistant/llm/adapters/google_gemini.rb
|
645
646
|
- lib/langchain/assistant/llm/adapters/mistral_ai.rb
|
@@ -736,6 +737,7 @@ files:
|
|
736
737
|
- lib/langchain/tool_definition.rb
|
737
738
|
- lib/langchain/utils/cosine_similarity.rb
|
738
739
|
- lib/langchain/utils/hash_transformer.rb
|
740
|
+
- lib/langchain/utils/image_wrapper.rb
|
739
741
|
- lib/langchain/utils/to_boolean.rb
|
740
742
|
- lib/langchain/vectorsearch/base.rb
|
741
743
|
- lib/langchain/vectorsearch/chroma.rb
|