voyageai 1.3.0 → 1.6.0

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: ac2d6a908abb5d1383cdf74f736b5aa7eae9fc9a66634ec1fd40ce8710571763
4
- data.tar.gz: 7df317f435acc60bde69219f7dc50e19952433dce8d4dee9ebda10a8a6b0ba46
3
+ metadata.gz: 8afba7d9e268ee2d7c8f606bb8dc13794839c960d31a0dada531dc92002d1122
4
+ data.tar.gz: 29a4d077a33abda9c88eb95c17abeb1e785cde693ba5a85fc2e54967028c358b
5
5
  SHA512:
6
- metadata.gz: af23bbd90f54d69d912223071a4a9ca3ba9d4128c10e7d5e60ce57632c54a244f4dc656ae6dd3a923d8b8273e1836ae670401a8de7de155350d1a1a5e2e24a1b
7
- data.tar.gz: a778faecde1b31e4c7a9c8955019af8ec618076dff925b3d26dce0bceeaae054174f24cfeb120d4c076750fcc730679338014c50c5ffdfe47ee2bad9a10700a4
6
+ metadata.gz: 3defa2dcaaee1f8da7e4fcd492d082d9ac63d1e5c22994b03ca1bff091327b84c883ef88dba1b1722bda1c7169eb6403227661fb649bac25aa2281c4188ec94a
7
+ data.tar.gz: 0371ccd81feb78fb19566c9be5bb71c43306c395d47002a917cd314af2985dd92967126f69179a1ca976dae750fc787393e442f74d0134a42f4e112575d3cb4f
data/README.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # VoyageAI
2
2
 
3
+ [![LICENSE](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/ksylvest/voyageai/blob/main/LICENSE)
4
+ [![RubyGems](https://img.shields.io/gem/v/voyageai)](https://rubygems.org/gems/voyageai)
5
+ [![GitHub](https://img.shields.io/badge/github-repo-blue.svg)](https://github.com/ksylvest/voyageai)
6
+ [![Yard](https://img.shields.io/badge/docs-site-blue.svg)](https://voyageai.ksylvest.com)
7
+ [![CircleCI](https://img.shields.io/circleci/build/github/ksylvest/voyageai)](https://circleci.com/gh/ksylvest/voyageai)
8
+
3
9
  `voyageai` is a ruby client for [VoyageAI](https://www.voyageai.com)
4
10
 
5
11
  ## Installation
@@ -82,3 +88,81 @@ VoyageAI.configure do |config|
82
88
  config.logger = Logger.new(STDOUT)
83
89
  end
84
90
  ```
91
+
92
+ ## Examples
93
+
94
+ ```ruby
95
+ require "voyageai"
96
+
97
+ Entry = Data.define(:document, :embedding)
98
+
99
+ VOYAGEAI = VoyageAI::Client.new
100
+
101
+ DOCUMENTS = [
102
+ "John is a musician.",
103
+ "Paul is a plumber.",
104
+ "George is a teacher.",
105
+ "Ringo is a doctor.",
106
+ "Lisa is a lawyer.",
107
+ "Stuart is a painter.",
108
+ "Brian is a writer.",
109
+ "Jane is a chef.",
110
+ "Bill is a nurse.",
111
+ "Susan is a carpenter.",
112
+ ].freeze
113
+
114
+ embeddings = VOYAGEAI.embed(DOCUMENTS, input_type: "document").embeddings
115
+
116
+ ENTRIES = DOCUMENTS.zip(embeddings).map do |document, embedding|
117
+ Entry.new(document:, embedding:)
118
+ end
119
+
120
+ # @param src [Array<Float>]
121
+ # @param dst [Array<Float>]
122
+ #
123
+ # @return [Float]
124
+ def euclidean_distance(src, dst)
125
+ Math.sqrt(src.zip(dst).map { |a, b| (a - b)**2 }.reduce(:+))
126
+ end
127
+
128
+ # @param query [String]
129
+ # @param limit [Integer]
130
+ #
131
+ # @return [Array<String>]
132
+ def nearest_documents(query:, limit: 4)
133
+ embedding = VOYAGEAI.embed(query, input_type: "query").embedding
134
+
135
+ ENTRIES
136
+ .sort_by { |entry| euclidean_distance(entry.embedding, embedding) }
137
+ .first(limit)
138
+ .map(&:document)
139
+ end
140
+
141
+ # @param query [String]
142
+ def search(query:)
143
+ documents = nearest_documents(query:)
144
+
145
+ results = VOYAGEAI.rerank(query:, documents:, top_k: 2).results
146
+
147
+ puts "query=#{query.inspect}"
148
+ results.each do |reranking|
149
+ document = documents[reranking.index]
150
+ puts("document=#{document.inspect} relevance_score=#{reranking.relevance_score}")
151
+ end
152
+ end
153
+
154
+ search(query: "What do George and Ringo do?")
155
+ search(query: "Who works in the medical field?")
156
+ ```
157
+
158
+ ```
159
+ query="What do George and Ringo do?"
160
+ document="Ringo is a doctor." relevance_score=0.67968755
161
+ document="George is a teacher." relevance_score=0.58593755
162
+ ```
163
+
164
+ ```
165
+ query="Who works in the medical field?"
166
+ document="Bill is a nurse." relevance_score=0.55078125
167
+ document="Ringo is a doctor." relevance_score=0.50390625
168
+ ```
@@ -37,12 +37,14 @@ module VoyageAI
37
37
  "#<#{self.class.name} api_key=#{masked_api_key.inspect} host=#{@host.inspect} version=#{@version.inspect}>"
38
38
  end
39
39
 
40
- # @param model [String] optional (e.g. VoyageAI::Model::VOYAGE or "voyage-3")
41
40
  # @param input [String, Array<String>] required (e.g. "Sample" or ["Sample 1", "Sample 2", ...])
41
+ # @param model [String] optional (e.g. VoyageAI::Model::VOYAGE or "voyage-3")
42
+ # @param input_type [Symbol] optional (e.g. :query or :document)
43
+ # @param truncation [Boolean] optional
42
44
  #
43
45
  # @return [Embedding]
44
- def embed(input, model: Model::VOYAGE)
45
- payload = { input: arrayify(input), model: model }
46
+ def embed(input, model: Model::VOYAGE, input_type: nil, truncation: nil)
47
+ payload = { input: arrayify(input), model: model, truncation:, input_type: }.compact
46
48
  response = http.accept(:json).post("/#{@version}/embeddings", json: payload)
47
49
 
48
50
  raise RequestError.new(response:) unless response.status.ok?
@@ -3,6 +3,7 @@
3
3
  module VoyageAI
4
4
  module Model
5
5
  VOYAGE_3 = "voyage-3"
6
+ VOYAGE_3_LARGE = "voyage-3-large"
6
7
  VOYAGE_3_LITE = "voyage-3-lite"
7
8
  VOYAGE_FINANCE_2 = "voyage-finance-2"
8
9
  VOYAGE_MULTILINGUAL_2 = "age-multilingual-2"
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module VoyageAI
4
- VERSION = "1.3.0"
4
+ VERSION = "1.6.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: voyageai
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin Sylvestre
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-10-22 00:00:00.000000000 Z
10
+ date: 2025-01-08 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: http
@@ -63,10 +62,11 @@ homepage: https://github.com/ksylvest/voyageai
63
62
  licenses:
64
63
  - MIT
65
64
  metadata:
66
- homepage_uri: https://github.com/ksylvest/voyageai
67
- changelog_uri: https://github.com/ksylvest/voyageai/releases
68
65
  rubygems_mfa_required: 'true'
69
- post_install_message:
66
+ homepage_uri: https://github.com/ksylvest/voyageai
67
+ source_code_uri: https://github.com/ksylvest/voyageai/tree/v1.6.0
68
+ changelog_uri: https://github.com/ksylvest/voyageai/releases/tag/v1.6.0
69
+ documentation_uri: https://voyageai.ksylvest.com/
70
70
  rdoc_options: []
71
71
  require_paths:
72
72
  - lib
@@ -81,8 +81,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  requirements: []
84
- rubygems_version: 3.5.18
85
- signing_key:
84
+ rubygems_version: 3.6.2
86
85
  specification_version: 4
87
86
  summary: A client for voyageai.com.
88
87
  test_files: []