rubycanusellm 0.4.0 → 0.4.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: 95279ea6440be4ca1db0588578072aeec9ceb7ed60b3491a9a8a7e2e9f1cd354
4
- data.tar.gz: d584565619149e8e23a50997345da518c65d1646daee38b5dafecabd76b467cd
3
+ metadata.gz: 4fa122c59f084a74df8fe6cc1b7b0cf26982d5d7dd29a1dbf37937f821024e08
4
+ data.tar.gz: 3d01defe930449e9b6cd4adc974c6d051b3af6171287673e1cdd4b679b4648a0
5
5
  SHA512:
6
- metadata.gz: f390e611e876ebbe93e4f9a80a2f48126156d620477489fb4de1786db739bfddbc029bbcd3ddfcfc3f06947956ffbec2d942a3dc10430ada08c6a8c754f92673
7
- data.tar.gz: 95b04a2d9c73571ed57c97ad8f2b752866329ff9f8914eb8324e0b1eeb3000ca963a56b4e31206f7fbec17b5f5ba56874380e98ecc658f4ab43efd3b1f215c0d
6
+ metadata.gz: 968934bfc95e1d8b5b1e8400ef9a784aa391db310984849ab4a5208c80c8378792afc26463ff4efb5b7f08772fbe72cf71266a2383cd41f1bb2c44078e6da7a8
7
+ data.tar.gz: 69800687f81c9753267db171bd9a64e74097126f16fa9ffaade1704536976fca53f0c151e4ab187ba2daf9febe45d5614ff9ff8a700c3265593b983db1595494
data/CHANGELOG.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Changelog
2
2
 
3
- ## [0.4.0] - 2026-04-03
3
+ ## [0.4.1] - 2026-04-03
4
4
 
5
5
  ### Added
6
6
 
@@ -8,6 +8,7 @@
8
8
  - Ollama provider (chat + embeddings, local, no API key required)
9
9
  - `config.base_url` for pointing to custom Ollama instances
10
10
  - Mistral and Ollama added to `EMBEDDING_PROVIDERS`
11
+ - `generate:embedding` command — scaffolds an embedding service with `embed`, `similarity`, and `most_similar` methods
11
12
 
12
13
  ## [0.3.1] - 2026-04-03
13
14
 
data/README.md CHANGED
@@ -218,7 +218,7 @@ end
218
218
  - [x] Voyage AI provider (embeddings)
219
219
  - [x] Mistral provider (chat + embeddings)
220
220
  - [x] Ollama provider (chat + embeddings, local)
221
- - [ ] `generate:embedding` command
221
+ - [x] `generate:embedding` command
222
222
  - [ ] Tool calling
223
223
 
224
224
  ## Development
@@ -5,7 +5,8 @@ module RubyCanUseLLM
5
5
  class CLI
6
6
  COMMANDS = {
7
7
  "generate:config" => :generate_config,
8
- "generate:completion" => :generate_completion
8
+ "generate:completion" => :generate_completion,
9
+ "generate:embedding" => :generate_embedding
9
10
  }.freeze
10
11
 
11
12
  def self.start(args)
@@ -19,6 +20,7 @@ module RubyCanUseLLM
19
20
  puts "Commands:"
20
21
  puts " generate:config Generate configuration file"
21
22
  puts " generate:completion Generate completion service object"
23
+ puts " generate:embedding Generate embedding service object"
22
24
  end
23
25
  end
24
26
 
@@ -45,6 +47,18 @@ module RubyCanUseLLM
45
47
  write_template("completion", path)
46
48
  end
47
49
 
50
+ def generate_embedding
51
+ if rails?
52
+ FileUtils.mkdir_p("app/services")
53
+ path = "app/services/embedding_service.rb"
54
+ else
55
+ FileUtils.mkdir_p("lib")
56
+ path = "lib/embedding_service.rb"
57
+ end
58
+
59
+ write_template("embedding", path)
60
+ end
61
+
48
62
  private
49
63
 
50
64
  def rails?
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ class EmbeddingService
4
+ def embed(text, **options)
5
+ RubyCanUseLLM.embed(text, **options)
6
+ end
7
+
8
+ def similarity(text_a, text_b, **options)
9
+ response_a = embed(text_a, **options)
10
+ response_b = embed(text_b, **options)
11
+ response_a.cosine_similarity(response_b.embedding)
12
+ end
13
+
14
+ def most_similar(query, candidates, **options)
15
+ query_embedding = embed(query, **options)
16
+ candidates.max_by do |candidate|
17
+ response = embed(candidate, **options)
18
+ query_embedding.cosine_similarity(response.embedding)
19
+ end
20
+ end
21
+ end
22
+
23
+ # Usage:
24
+ # service = EmbeddingService.new
25
+ #
26
+ # # Get an embedding vector
27
+ # response = service.embed("Hello world")
28
+ # puts response.embedding # [0.1, 0.2, ...]
29
+ # puts response.tokens # 3
30
+ #
31
+ # # Compare two texts
32
+ # score = service.similarity("cat", "dog")
33
+ # puts score # 0.87
34
+ #
35
+ # # Find the most similar candidate
36
+ # best = service.most_similar("ruby programming", ["python", "ruby", "javascript"])
37
+ # puts best # "ruby"
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Rubycanusellm
4
- VERSION = "0.4.0"
4
+ VERSION = "0.4.1"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubycanusellm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Juan Manuel Guzman Nava
@@ -42,6 +42,7 @@ files:
42
42
  - lib/rubycanusellm/response.rb
43
43
  - lib/rubycanusellm/templates/completion.rb.tt
44
44
  - lib/rubycanusellm/templates/config.rb.tt
45
+ - lib/rubycanusellm/templates/embedding.rb.tt
45
46
  - lib/rubycanusellm/version.rb
46
47
  - sig/rubycanusellm.rbs
47
48
  homepage: https://github.com/mgznv/rubycanusellm