openrouter_client 0.1.2 → 0.1.3

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: f98e5959581fadc509a596c15ef862b8432d5355605e3c36c0fdefb0cb4dcf28
4
- data.tar.gz: 04e7534567aa13c34c26a159a2df648a69cd13e1233f7c3e8ecb137f56935986
3
+ metadata.gz: a13939cbccbd1e6a70514d6d422987b702c313d3db1c7226e61966da6c858acb
4
+ data.tar.gz: edfcd5e0eb7f703b91ca93a04de8f3cf33b0ae219119a65064acbed22c1ce731
5
5
  SHA512:
6
- metadata.gz: d4d992b00d394aefb85553611fbce0e3d516f3ae93c35aeb243e171bf0f5493672fae79a8ee79666145a691a3aef14f68a40bda609a115bec058a48d86348e31
7
- data.tar.gz: 164ee4e2f29f5991c872ad79cfeadd3496744f6c729d911eb3e42e7430a009a33b6fd8adaf8a6abe21aa87647d8fc8fe664a395a287fcbb523070c2341bc6d50
6
+ metadata.gz: 5edd0c39d7b2a1c57db82dcd4ab0d5b1e44042b496e54ff1c5b8b79b6268c2b5964b443a7297735e2692ed4388fff70a26d357c4cbabfd2b47eee502ca5422ba
7
+ data.tar.gz: 86724cc812f08258dd292cd467887c2a94d5866bb670e8394345ed8da2bdd5d596e98760d4a14f432be3d41c9e4a8f5b1585f58ee88ff2874c5eb515fbb672ac
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- openrouter_client (0.1.2)
4
+ openrouter_client (0.1.3)
5
5
  faraday (>= 1)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -242,6 +242,44 @@ model = OpenRouter::Model.find("openai/gpt-4")
242
242
  completion = model.complete(messages: [{ role: "user", content: "Hello!" }])
243
243
  ```
244
244
 
245
+ ### Embeddings
246
+
247
+ Generate vector embeddings from text for semantic search, RAG, and more:
248
+
249
+ ```ruby
250
+ # Single text embedding
251
+ embedding = OpenRouter::Embedding.create!(
252
+ model: "openai/text-embedding-3-small",
253
+ input: "The quick brown fox jumps over the lazy dog"
254
+ )
255
+
256
+ puts embedding.vector # => [0.123, -0.456, ...]
257
+ puts embedding.dimensions # => 1536
258
+ puts embedding.total_tokens # => 9
259
+
260
+ # Batch embedding (multiple texts)
261
+ embedding = OpenRouter::Embedding.create!(
262
+ model: "openai/text-embedding-3-small",
263
+ input: [
264
+ "Machine learning is a subset of AI",
265
+ "Deep learning uses neural networks"
266
+ ]
267
+ )
268
+
269
+ embedding.vectors.each_with_index do |vector, i|
270
+ puts "Text #{i}: #{vector.length} dimensions"
271
+ end
272
+
273
+ # Access individual embedding data
274
+ embedding.data.each do |item|
275
+ puts "Index: #{item.index}, Dimensions: #{item.dimensions}"
276
+ end
277
+
278
+ # List available embedding models
279
+ models = OpenRouter::Embedding.models
280
+ models.each { |m| puts m["id"] }
281
+ ```
282
+
245
283
  ### Generation Stats
246
284
 
247
285
  Query detailed usage information for a completion:
@@ -0,0 +1,108 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenRouter
4
+ # Generate vector embeddings from text using OpenRouter's unified embeddings API.
5
+ # Embeddings transform text into high-dimensional vectors where semantically similar
6
+ # texts are positioned closer together in vector space.
7
+ class Embedding
8
+ EMBEDDINGS_PATH = "/embeddings"
9
+ EMBEDDING_MODELS_PATH = "/embeddings/models"
10
+
11
+ # @return [String] The model used for embedding
12
+ attr_reader :model
13
+ # @return [Array<EmbeddingData>] The embedding data objects
14
+ attr_reader :data
15
+ # @return [Hash, nil] Usage statistics
16
+ attr_reader :usage
17
+
18
+ # @param attributes [Hash] Raw response from OpenRouter API
19
+ def initialize(attributes)
20
+ @model = attributes["model"]
21
+ @usage = attributes["usage"]
22
+ @data = build_data(attributes["data"])
23
+ end
24
+
25
+ # Generate embeddings for the given input.
26
+ # @param model [String] The embedding model to use (e.g., "openai/text-embedding-3-small")
27
+ # @param input [String, Array<String>] Text or array of texts to embed
28
+ # @param client [OpenRouter::Client] HTTP client
29
+ # @param options [Hash] Additional options (e.g., provider preferences)
30
+ # @return [OpenRouter::Embedding]
31
+ def self.create!(model:, input:, client: OpenRouter.client, **options)
32
+ payload = {
33
+ model: model,
34
+ input: input,
35
+ **options
36
+ }
37
+
38
+ response = client.post(EMBEDDINGS_PATH, payload)
39
+ new(response)
40
+ end
41
+
42
+ # List available embedding models.
43
+ # @param client [OpenRouter::Client] HTTP client
44
+ # @return [Array<Hash>] Array of model information
45
+ def self.models(client: OpenRouter.client)
46
+ response = client.get(EMBEDDING_MODELS_PATH)
47
+ Array(response && response["data"])
48
+ end
49
+
50
+ # Get the first embedding vector (convenience method for single input).
51
+ # @return [Array<Float>, nil]
52
+ def vector
53
+ @data&.first&.embedding
54
+ end
55
+
56
+ # Get all embedding vectors.
57
+ # @return [Array<Array<Float>>]
58
+ def vectors
59
+ @data&.map(&:embedding) || []
60
+ end
61
+
62
+ # Get the dimension of the embedding vectors.
63
+ # @return [Integer, nil]
64
+ def dimensions
65
+ vector&.length
66
+ end
67
+
68
+ # Get the total tokens used.
69
+ # @return [Integer, nil]
70
+ def total_tokens
71
+ @usage&.dig("total_tokens")
72
+ end
73
+
74
+ # Get the prompt tokens used.
75
+ # @return [Integer, nil]
76
+ def prompt_tokens
77
+ @usage&.dig("prompt_tokens")
78
+ end
79
+
80
+ private
81
+
82
+ def build_data(data_array)
83
+ return [] unless data_array
84
+
85
+ data_array.map { |attrs| EmbeddingData.new(attrs) }
86
+ end
87
+ end
88
+
89
+ # Represents a single embedding result within an Embedding response.
90
+ class EmbeddingData
91
+ # @return [Integer] Index of this embedding in the batch
92
+ attr_reader :index
93
+ # @return [Array<Float>] The embedding vector
94
+ attr_reader :embedding
95
+
96
+ # @param attributes [Hash] Raw attributes from API response
97
+ def initialize(attributes)
98
+ @index = attributes["index"]
99
+ @embedding = attributes["embedding"]
100
+ end
101
+
102
+ # Get the dimension of this embedding vector.
103
+ # @return [Integer]
104
+ def dimensions
105
+ @embedding&.length || 0
106
+ end
107
+ end
108
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module OpenRouter
4
- VERSION = "0.1.2"
4
+ VERSION = "0.1.3"
5
5
  end
data/lib/openrouter.rb CHANGED
@@ -115,6 +115,7 @@ require_relative "openrouter/completion"
115
115
  require_relative "openrouter/stream"
116
116
  require_relative "openrouter/endpoint"
117
117
  require_relative "openrouter/model"
118
+ require_relative "openrouter/embedding"
118
119
  require_relative "openrouter/generation"
119
120
  require_relative "openrouter/credit"
120
121
  require_relative "openrouter/api_key"
@@ -0,0 +1,68 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module OpenRouter
5
+ class Embedding
6
+ EMBEDDINGS_PATH = T.let(T.unsafe(nil), String)
7
+ EMBEDDING_MODELS_PATH = T.let(T.unsafe(nil), String)
8
+
9
+ sig { returns(String) }
10
+ def model; end
11
+
12
+ sig { returns(T::Array[OpenRouter::EmbeddingData]) }
13
+ def data; end
14
+
15
+ sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) }
16
+ def usage; end
17
+
18
+ sig { params(attributes: T.untyped).void }
19
+ def initialize(attributes); end
20
+
21
+ sig do
22
+ params(
23
+ model: String,
24
+ input: T.any(String, T::Array[String]),
25
+ client: OpenRouter::Client,
26
+ options: T.untyped
27
+ ).returns(OpenRouter::Embedding)
28
+ end
29
+ def self.create!(model:, input:, client: OpenRouter.client, **options); end
30
+
31
+ sig { params(client: OpenRouter::Client).returns(T::Array[T::Hash[T.untyped, T.untyped]]) }
32
+ def self.models(client: OpenRouter.client); end
33
+
34
+ sig { returns(T.nilable(T::Array[Float])) }
35
+ def vector; end
36
+
37
+ sig { returns(T::Array[T::Array[Float]]) }
38
+ def vectors; end
39
+
40
+ sig { returns(T.nilable(Integer)) }
41
+ def dimensions; end
42
+
43
+ sig { returns(T.nilable(Integer)) }
44
+ def total_tokens; end
45
+
46
+ sig { returns(T.nilable(Integer)) }
47
+ def prompt_tokens; end
48
+
49
+ private
50
+
51
+ sig { params(data_array: T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])).returns(T::Array[OpenRouter::EmbeddingData]) }
52
+ def build_data(data_array); end
53
+ end
54
+
55
+ class EmbeddingData
56
+ sig { returns(Integer) }
57
+ def index; end
58
+
59
+ sig { returns(T::Array[Float]) }
60
+ def embedding; end
61
+
62
+ sig { params(attributes: T.untyped).void }
63
+ def initialize(attributes); end
64
+
65
+ sig { returns(Integer) }
66
+ def dimensions; end
67
+ end
68
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openrouter_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dylan Player
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2026-01-06 00:00:00.000000000 Z
10
+ date: 2026-01-07 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: faraday
@@ -44,6 +44,7 @@ files:
44
44
  - lib/openrouter/client.rb
45
45
  - lib/openrouter/completion.rb
46
46
  - lib/openrouter/credit.rb
47
+ - lib/openrouter/embedding.rb
47
48
  - lib/openrouter/endpoint.rb
48
49
  - lib/openrouter/generation.rb
49
50
  - lib/openrouter/model.rb
@@ -54,6 +55,7 @@ files:
54
55
  - rbi/openrouter/client.rbi
55
56
  - rbi/openrouter/completion.rbi
56
57
  - rbi/openrouter/credit.rbi
58
+ - rbi/openrouter/embedding.rbi
57
59
  - rbi/openrouter/endpoint.rbi
58
60
  - rbi/openrouter/generation.rbi
59
61
  - rbi/openrouter/model.rbi