lammy 0.8.0 → 0.8.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ec35c0b162ca174c4baaa39d040632e10ce1e18a8b79e281161ff79f99a0758b
4
- data.tar.gz: 88542e30eddbd8e1d26e2fbef989e7e2467f0503abc1544410f9f6f9490f6083
3
+ metadata.gz: 4708e6d34ee95ab93a6e737204ced2d8bac4dab9dde0102b1cfeaa9df7f31afd
4
+ data.tar.gz: 896b3e2211f6fd6ad2918f31657fd794d98e53a27027773c7b7d2f275f5ad390
5
5
  SHA512:
6
- metadata.gz: 9f2230a56f061fb8595ad27a6539c42807e0507fbd86542866f79a9a40f8c98cd345d45a3d3611ebc7c738b5e0919b55f5567b27c60db83c393b64be25edcbde
7
- data.tar.gz: d2c855118e9cfb30287ba8902c1dd74aed6bcd5161ba59b8752eeb755b75735ec1a634166b2493f718c5a6572d496f796e370c3232ec0e05dc01a0f30772441c
6
+ metadata.gz: 7b7c7d3fa8d35996d5287d9be7cbf16dee55ed828f39e38faf460e87f9d1d75f9f9073b1e96461ea7ddf3459a2d7d8b1617dadd0ccc2b6ad44e4a6db2fe2be89
7
+ data.tar.gz: de5c76c9ede8414de9fc9de0da4bbca907948be8c5ce43cae6477d1f0e868cedfcd8095ce06fbfaff1f960b58ed8bf2150c7051a8048fcacdbc2d5b3665eff8b
data/lib/lammy/chat.rb CHANGED
@@ -1,20 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module L
3
+ module Lammy
4
4
  module Chat
5
- def llm(**kwargs)
6
- @next_llm_settings = kwargs
7
- end
8
-
9
- def handle_llm(method_name)
10
- settings = @next_llm_settings
11
- @next_llm_settings = nil
12
-
5
+ def self.handle(klass, method_name, settings)
13
6
  # Unbind the original method
14
- original_method = instance_method(method_name)
7
+ original_method = klass.instance_method(method_name)
15
8
 
16
9
  # Redefine the method
17
- define_method(method_name) do |*args, &block|
10
+ klass.define_method(method_name) do |*args, &block|
18
11
  # Initialize context
19
12
  @system_message = nil
20
13
 
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'anthropic'
4
+ require 'hashie'
5
+
6
+ module Lammy
7
+ # Use the Claude API's Ruby library
8
+ class Claude
9
+ MODELS = %w[
10
+ claude-3-5-sonnet-20240620
11
+ claude-3-opus-20240229 claude-3-sonnet-20240229 claude-3-haiku-20240307
12
+ claude-2.1 claude-2.0 claude-instant-1.2
13
+ ].freeze
14
+
15
+ attr_reader :settings
16
+
17
+ def initialize(settings)
18
+ @settings = settings
19
+ end
20
+
21
+ # Generate a response with support for structured output
22
+ def chat(user_message, system_message = nil, stream = nil)
23
+ response = client.messages(
24
+ parameters: {
25
+ system: system_message,
26
+ model: settings[:model],
27
+ max_tokens: settings[:max_tokens] || 4096,
28
+ stream: stream ? ->(chunk) { stream.call(stream_content(chunk)) } : nil,
29
+ messages: user_message.is_a?(Array) ? user_message : [vision(L.user(user_message))]
30
+ }.compact
31
+ )
32
+
33
+ stream || response.dig('content', 0, 'text')
34
+ end
35
+
36
+ private
37
+
38
+ def stream_content(chunk)
39
+ chunk.dig('delta', 'text')
40
+ end
41
+
42
+ def vision(message)
43
+ image = message[:_image]
44
+ base = message.except(:_image)
45
+
46
+ return base unless image
47
+
48
+ messages = [
49
+ { 'type' => 'image',
50
+ 'source' => { 'type' => 'base64', 'media_type' => 'image/jpeg', 'data' => Base64.strict_encode64(image) } },
51
+ { 'type' => 'text', 'text' => message[:content] }
52
+ ]
53
+
54
+ base.merge(content: messages)
55
+ end
56
+
57
+ def client
58
+ return settings[:client] if settings[:client]
59
+
60
+ @client ||= ::Anthropic::Client.new(
61
+ access_token: ENV.fetch('ANTHROPIC_API_KEY')
62
+ )
63
+ end
64
+ end
65
+ end
@@ -1,20 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module L
3
+ module Lammy
4
4
  module Embeddings
5
- def v(**kwargs)
6
- @next_v_settings = kwargs
7
- end
8
-
9
- def handle_v(method_name)
10
- settings = @next_v_settings
11
- @next_v_settings = nil
12
-
5
+ def self.handle(klass, method_name, settings)
13
6
  # Unbind the original method
14
- original_method = instance_method(method_name)
7
+ original_method = klass.instance_method(method_name)
15
8
 
16
9
  # Redefine the method
17
- define_method(method_name) do |*args, &block|
10
+ klass.define_method(method_name) do |*args, &block|
18
11
  # # Initialize chunking settings
19
12
  # @chunk_by_size = nil
20
13
 
data/lib/lammy/openai.rb CHANGED
@@ -4,7 +4,7 @@ require 'openai'
4
4
  require 'hashie'
5
5
  require 'base64'
6
6
 
7
- module L
7
+ module Lammy
8
8
  # Use the OpenAI API's Ruby library
9
9
  class OpenAI
10
10
  MODELS = %w[
data/lib/lammy/schema.rb CHANGED
@@ -15,7 +15,7 @@ module L
15
15
  def user(content, image: nil)
16
16
  return content if L::Schema.formatted?(content)
17
17
 
18
- { role: :user, content: content, _image: image }
18
+ { role: :user, content: content, _image: image }.compact
19
19
  end
20
20
 
21
21
  def assistant(content)
data/lib/lammy.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ module Lammy; end
4
+
3
5
  require 'lammy/embeddings'
4
6
  require 'lammy/claude'
5
7
  require 'lammy/openai'
@@ -10,16 +12,34 @@ module L
10
12
  extend Schema
11
13
 
12
14
  def self.included(base)
13
- base.extend Chat
14
- base.extend Embeddings
15
15
  base.extend ClassMethods
16
16
  end
17
17
 
18
18
  # Wrap generative methods with handlers
19
19
  module ClassMethods
20
+ def llm(**kwargs)
21
+ @next_llm_settings = kwargs
22
+ end
23
+
24
+ def v(**kwargs)
25
+ @next_v_settings = kwargs
26
+ end
27
+
20
28
  def method_added(method_name)
21
- handle_llm(method_name) if @next_llm_settings
22
- handle_v(method_name) if @next_v_settings
29
+ if @next_llm_settings
30
+ next_llm_settings = @next_llm_settings
31
+ @next_llm_settings = nil
32
+
33
+ Lammy::Chat.handle(self, method_name, next_llm_settings)
34
+ end
35
+
36
+ if @next_v_settings
37
+ next_v_settings = @next_v_settings
38
+ @next_v_settings = nil
39
+
40
+ Lammy::Embeddings.handle(self, method_name, next_v_settings)
41
+ end
42
+
23
43
  super
24
44
  end
25
45
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lammy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kamil Nicieja
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-10-08 00:00:00.000000000 Z
11
+ date: 2024-10-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: anthropic
@@ -74,6 +74,7 @@ extra_rdoc_files: []
74
74
  files:
75
75
  - lib/lammy.rb
76
76
  - lib/lammy/chat.rb
77
+ - lib/lammy/claude.rb
77
78
  - lib/lammy/embeddings.rb
78
79
  - lib/lammy/openai.rb
79
80
  - lib/lammy/schema.rb