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 +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +38 -0
- data/lib/openrouter/embedding.rb +108 -0
- data/lib/openrouter/version.rb +1 -1
- data/lib/openrouter.rb +1 -0
- data/rbi/openrouter/embedding.rbi +68 -0
- metadata +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a13939cbccbd1e6a70514d6d422987b702c313d3db1c7226e61966da6c858acb
|
|
4
|
+
data.tar.gz: edfcd5e0eb7f703b91ca93a04de8f3cf33b0ae219119a65064acbed22c1ce731
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5edd0c39d7b2a1c57db82dcd4ab0d5b1e44042b496e54ff1c5b8b79b6268c2b5964b443a7297735e2692ed4388fff70a26d357c4cbabfd2b47eee502ca5422ba
|
|
7
|
+
data.tar.gz: 86724cc812f08258dd292cd467887c2a94d5866bb670e8394345ed8da2bdd5d596e98760d4a14f432be3d41c9e4a8f5b1585f58ee88ff2874c5eb515fbb672ac
|
data/Gemfile.lock
CHANGED
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
|
data/lib/openrouter/version.rb
CHANGED
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.
|
|
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-
|
|
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
|