open_router 0.2.1 → 0.3.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 +4 -4
- data/.ruby-version +1 -0
- data/CHANGELOG.md +8 -1
- data/Gemfile +11 -5
- data/Gemfile.lock +72 -1
- data/README.md +26 -0
- data/lib/open_router/client.rb +1 -1
- data/lib/open_router/http.rb +14 -18
- data/lib/open_router/version.rb +1 -1
- data/lib/open_router.rb +11 -6
- data/open_router.gemspec +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 3f81b52efb709758f501e3e43fd3967d36a0cde6b78aefd2512b21aafa0f3f5d
|
|
4
|
+
data.tar.gz: 347a0b754f0ed374ab6bdb0847e8efe1f762370c4c4e7b1faf1e3a7813dece10
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 64d714806a4cda2841d1310357db4a8ed2737a064530676f484fe4213d2dfc863e6143b159915f57177f33448ca03585b953b164cb0825929d426ec2beeb30ba
|
|
7
|
+
data.tar.gz: a0fe64e1d6dcc790c478fa888f5b1db43edaec01001ca5f6903481042fb41a65d8808951d78bc49904797074620e8fdbb9616ffedcb8b1be2c0a1ee667b2de55
|
data/.ruby-version
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.2.2
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
|
-
## [
|
|
1
|
+
## [0.3.0] - 2024-05-03
|
|
2
|
+
|
|
3
|
+
- Uses Faraday's built-in JSON mode
|
|
4
|
+
- Added support for configuring Faraday and its middleware
|
|
5
|
+
- Spec creates a STDOUT logger by default (headers, bodies, errors)
|
|
6
|
+
- Spec filters Bearer token from logs by default
|
|
2
7
|
|
|
3
8
|
## [0.1.0] - 2024-03-19
|
|
4
9
|
|
|
5
10
|
- Initial release
|
|
11
|
+
|
|
12
|
+
## [Unreleased]
|
data/Gemfile
CHANGED
|
@@ -6,8 +6,14 @@ source "https://rubygems.org"
|
|
|
6
6
|
gemspec
|
|
7
7
|
|
|
8
8
|
gem "activesupport", ">= 6.0"
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
gem "
|
|
12
|
-
gem "
|
|
13
|
-
gem "
|
|
9
|
+
|
|
10
|
+
group :development do
|
|
11
|
+
gem "dotenv", ">= 2"
|
|
12
|
+
gem "pry", ">= 0.14"
|
|
13
|
+
gem "rake", "~> 13.0"
|
|
14
|
+
gem "rspec", "~> 3.0"
|
|
15
|
+
gem "rubocop", "~> 1.21"
|
|
16
|
+
gem "solargraph-rails", "~> 0.2.0.pre"
|
|
17
|
+
gem "sorbet"
|
|
18
|
+
gem "tapioca", require: false
|
|
19
|
+
end
|
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
open_router (0.2.
|
|
4
|
+
open_router (0.2.2)
|
|
5
5
|
activesupport (>= 6.0)
|
|
6
6
|
dotenv (>= 2)
|
|
7
7
|
faraday (>= 1)
|
|
@@ -21,7 +21,9 @@ GEM
|
|
|
21
21
|
mutex_m
|
|
22
22
|
tzinfo (~> 2.0)
|
|
23
23
|
ast (2.4.2)
|
|
24
|
+
backport (1.2.0)
|
|
24
25
|
base64 (0.2.0)
|
|
26
|
+
benchmark (0.3.0)
|
|
25
27
|
bigdecimal (3.1.7)
|
|
26
28
|
coderay (1.1.3)
|
|
27
29
|
concurrent-ruby (1.2.3)
|
|
@@ -29,6 +31,8 @@ GEM
|
|
|
29
31
|
diff-lcs (1.5.0)
|
|
30
32
|
dotenv (3.1.0)
|
|
31
33
|
drb (2.2.1)
|
|
34
|
+
e2mmap (0.1.0)
|
|
35
|
+
erubi (1.12.0)
|
|
32
36
|
faraday (2.7.10)
|
|
33
37
|
faraday-net_http (>= 2.0, < 3.1)
|
|
34
38
|
ruby2_keywords (>= 0.0.4)
|
|
@@ -37,23 +41,40 @@ GEM
|
|
|
37
41
|
faraday-net_http (3.0.2)
|
|
38
42
|
i18n (1.14.4)
|
|
39
43
|
concurrent-ruby (~> 1.0)
|
|
44
|
+
jaro_winkler (1.5.6)
|
|
40
45
|
json (2.6.3)
|
|
46
|
+
kramdown (2.4.0)
|
|
47
|
+
rexml
|
|
48
|
+
kramdown-parser-gfm (1.1.0)
|
|
49
|
+
kramdown (~> 2.0)
|
|
41
50
|
language_server-protocol (3.17.0.3)
|
|
42
51
|
method_source (1.0.0)
|
|
43
52
|
minitest (5.22.3)
|
|
44
53
|
multipart-post (2.3.0)
|
|
45
54
|
mutex_m (0.2.0)
|
|
55
|
+
netrc (0.11.0)
|
|
56
|
+
nokogiri (1.16.4-arm64-darwin)
|
|
57
|
+
racc (~> 1.4)
|
|
58
|
+
nokogiri (1.16.4-x86_64-linux)
|
|
59
|
+
racc (~> 1.4)
|
|
46
60
|
parallel (1.23.0)
|
|
47
61
|
parser (3.2.2.3)
|
|
48
62
|
ast (~> 2.4.1)
|
|
49
63
|
racc
|
|
64
|
+
prism (0.24.0)
|
|
50
65
|
pry (0.14.2)
|
|
51
66
|
coderay (~> 1.1)
|
|
52
67
|
method_source (~> 1.0)
|
|
53
68
|
racc (1.7.1)
|
|
54
69
|
rainbow (3.1.1)
|
|
55
70
|
rake (13.0.6)
|
|
71
|
+
rbi (0.1.10)
|
|
72
|
+
prism (>= 0.18.0, < 0.25)
|
|
73
|
+
sorbet-runtime (>= 0.5.9204)
|
|
74
|
+
rbs (2.8.4)
|
|
56
75
|
regexp_parser (2.8.1)
|
|
76
|
+
reverse_markdown (2.1.1)
|
|
77
|
+
nokogiri
|
|
57
78
|
rexml (3.2.6)
|
|
58
79
|
rspec (3.12.0)
|
|
59
80
|
rspec-core (~> 3.12.0)
|
|
@@ -83,9 +104,56 @@ GEM
|
|
|
83
104
|
parser (>= 3.2.1.0)
|
|
84
105
|
ruby-progressbar (1.13.0)
|
|
85
106
|
ruby2_keywords (0.0.5)
|
|
107
|
+
solargraph (0.50.0)
|
|
108
|
+
backport (~> 1.2)
|
|
109
|
+
benchmark
|
|
110
|
+
bundler (~> 2.0)
|
|
111
|
+
diff-lcs (~> 1.4)
|
|
112
|
+
e2mmap
|
|
113
|
+
jaro_winkler (~> 1.5)
|
|
114
|
+
kramdown (~> 2.3)
|
|
115
|
+
kramdown-parser-gfm (~> 1.1)
|
|
116
|
+
parser (~> 3.0)
|
|
117
|
+
rbs (~> 2.0)
|
|
118
|
+
reverse_markdown (~> 2.0)
|
|
119
|
+
rubocop (~> 1.38)
|
|
120
|
+
thor (~> 1.0)
|
|
121
|
+
tilt (~> 2.0)
|
|
122
|
+
yard (~> 0.9, >= 0.9.24)
|
|
123
|
+
solargraph-rails (0.2.2.pre.4)
|
|
124
|
+
activesupport
|
|
125
|
+
solargraph (>= 0.41.1)
|
|
126
|
+
sorbet (0.5.11342)
|
|
127
|
+
sorbet-static (= 0.5.11342)
|
|
128
|
+
sorbet-runtime (0.5.11342)
|
|
129
|
+
sorbet-static (0.5.11342-universal-darwin)
|
|
130
|
+
sorbet-static (0.5.11342-x86_64-linux)
|
|
131
|
+
sorbet-static-and-runtime (0.5.11342)
|
|
132
|
+
sorbet (= 0.5.11342)
|
|
133
|
+
sorbet-runtime (= 0.5.11342)
|
|
134
|
+
spoom (1.3.0)
|
|
135
|
+
erubi (>= 1.10.0)
|
|
136
|
+
prism (>= 0.19.0)
|
|
137
|
+
sorbet-static-and-runtime (>= 0.5.10187)
|
|
138
|
+
thor (>= 0.19.2)
|
|
139
|
+
tapioca (0.13.1)
|
|
140
|
+
bundler (>= 2.2.25)
|
|
141
|
+
netrc (>= 0.11.0)
|
|
142
|
+
parallel (>= 1.21.0)
|
|
143
|
+
rbi (>= 0.1.4, < 0.2)
|
|
144
|
+
sorbet-static-and-runtime (>= 0.5.11087)
|
|
145
|
+
spoom (>= 1.2.0)
|
|
146
|
+
thor (>= 1.2.0)
|
|
147
|
+
yard-sorbet
|
|
148
|
+
thor (1.3.1)
|
|
149
|
+
tilt (2.3.0)
|
|
86
150
|
tzinfo (2.0.6)
|
|
87
151
|
concurrent-ruby (~> 1.0)
|
|
88
152
|
unicode-display_width (2.4.2)
|
|
153
|
+
yard (0.9.36)
|
|
154
|
+
yard-sorbet (0.8.1)
|
|
155
|
+
sorbet-runtime (>= 0.5)
|
|
156
|
+
yard (>= 0.9)
|
|
89
157
|
|
|
90
158
|
PLATFORMS
|
|
91
159
|
arm64-darwin-21
|
|
@@ -99,6 +167,9 @@ DEPENDENCIES
|
|
|
99
167
|
rake (~> 13.0)
|
|
100
168
|
rspec (~> 3.0)
|
|
101
169
|
rubocop (~> 1.21)
|
|
170
|
+
solargraph-rails (~> 0.2.0.pre)
|
|
171
|
+
sorbet
|
|
172
|
+
tapioca
|
|
102
173
|
|
|
103
174
|
BUNDLED WITH
|
|
104
175
|
2.4.12
|
data/README.md
CHANGED
|
@@ -63,6 +63,32 @@ Then you can create a client like this:
|
|
|
63
63
|
client = OpenRouter::Client.new
|
|
64
64
|
```
|
|
65
65
|
|
|
66
|
+
#### Configure Faraday
|
|
67
|
+
|
|
68
|
+
The configuration object exposes a [`faraday`](https://github.com/lostisland/faraday-retry) method that you can pass a block to configure Faraday settings and middleware.
|
|
69
|
+
|
|
70
|
+
This example adds `faraday-retry` and a logger that redacts the api key so it doesn't get leaked to logs.
|
|
71
|
+
|
|
72
|
+
```ruby
|
|
73
|
+
require 'faraday/retry'
|
|
74
|
+
|
|
75
|
+
retry_options = {
|
|
76
|
+
max: 2,
|
|
77
|
+
interval: 0.05,
|
|
78
|
+
interval_randomness: 0.5,
|
|
79
|
+
backoff_factor: 2
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
OpenRouter::Client.new(access_token: ENV["ACCESS_TOKEN"]) do |config|
|
|
83
|
+
config.faraday do |f|
|
|
84
|
+
f.request :retry, retry_options
|
|
85
|
+
f.response :logger, ::Logger.new($stdout), { headers: true, bodies: true, errors: true } do |logger|
|
|
86
|
+
logger.filter(/(Bearer) (\S+)/, '\1[REDACTED]')
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
```
|
|
91
|
+
|
|
66
92
|
#### Change version or timeout
|
|
67
93
|
|
|
68
94
|
The default timeout for any request using this library is 120 seconds. You can change that by passing a number of seconds to the `request_timeout` when initializing the client.
|
data/lib/open_router/client.rb
CHANGED
|
@@ -41,7 +41,7 @@ module OpenRouter
|
|
|
41
41
|
parameters[:stream] = stream if stream
|
|
42
42
|
parameters.merge!(extras)
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
post(path: "/chat/completions", parameters:).tap do |response|
|
|
45
45
|
raise ServerError, "Empty response from OpenRouter. Might be worth retrying once or twice." if response.blank?
|
|
46
46
|
raise ServerError, response.dig("error", "message") if response.dig("error", "message").present?
|
|
47
47
|
end.with_indifferent_access
|
data/lib/open_router/http.rb
CHANGED
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
module OpenRouter
|
|
4
4
|
module HTTP
|
|
5
5
|
def get(path:)
|
|
6
|
-
|
|
6
|
+
conn.get(uri(path:)) do |req|
|
|
7
7
|
req.headers = headers
|
|
8
|
-
end&.body
|
|
8
|
+
end&.body
|
|
9
9
|
end
|
|
10
10
|
|
|
11
|
-
def
|
|
12
|
-
|
|
11
|
+
def post(path:, parameters:)
|
|
12
|
+
conn.post(uri(path:)) do |req|
|
|
13
13
|
if parameters[:stream].respond_to?(:call)
|
|
14
14
|
req.options.on_data = to_json_stream(user_proc: parameters[:stream])
|
|
15
15
|
parameters[:stream] = true # Necessary to tell OpenRouter to stream.
|
|
@@ -17,33 +17,24 @@ module OpenRouter
|
|
|
17
17
|
|
|
18
18
|
req.headers = headers
|
|
19
19
|
req.body = parameters.to_json
|
|
20
|
-
end&.body
|
|
20
|
+
end&.body
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
def multipart_post(path:, parameters: nil)
|
|
24
|
-
|
|
24
|
+
conn(multipart: true).post(uri(path:)) do |req|
|
|
25
25
|
req.headers = headers.merge({ "Content-Type" => "multipart/form-data" })
|
|
26
26
|
req.body = multipart_parameters(parameters)
|
|
27
|
-
end&.body
|
|
27
|
+
end&.body
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
def delete(path:)
|
|
31
|
-
|
|
31
|
+
conn.delete(uri(path:)) do |req|
|
|
32
32
|
req.headers = headers
|
|
33
|
-
end&.body
|
|
33
|
+
end&.body
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
private
|
|
37
37
|
|
|
38
|
-
def to_json(string)
|
|
39
|
-
return unless string
|
|
40
|
-
|
|
41
|
-
JSON.parse(string)
|
|
42
|
-
rescue JSON::ParserError
|
|
43
|
-
# Convert a multiline string of JSON objects to a JSON array.
|
|
44
|
-
JSON.parse(string.gsub("}\n{", "},{").prepend("[").concat("]"))
|
|
45
|
-
end
|
|
46
|
-
|
|
47
38
|
# Given a proc, returns an outer proc that can be used to iterate over a JSON stream of chunks.
|
|
48
39
|
# For each chunk, the inner user_proc is called giving it the JSON object. The JSON object could
|
|
49
40
|
# be a data object or an error object as described in the OpenRouter API documentation.
|
|
@@ -66,6 +57,11 @@ module OpenRouter
|
|
|
66
57
|
Faraday.new do |f|
|
|
67
58
|
f.options[:timeout] = OpenRouter.configuration.request_timeout
|
|
68
59
|
f.request(:multipart) if multipart
|
|
60
|
+
f.use MiddlewareErrors if @log_errors
|
|
61
|
+
f.response :raise_error
|
|
62
|
+
f.response :json
|
|
63
|
+
|
|
64
|
+
OpenRouter.configuration.faraday_config&.call(f)
|
|
69
65
|
end
|
|
70
66
|
end
|
|
71
67
|
|
data/lib/open_router/version.rb
CHANGED
data/lib/open_router.rb
CHANGED
|
@@ -13,18 +13,19 @@ module OpenRouter
|
|
|
13
13
|
|
|
14
14
|
class Configuration
|
|
15
15
|
attr_writer :access_token
|
|
16
|
-
attr_accessor :api_version, :extra_headers, :request_timeout, :uri_base
|
|
16
|
+
attr_accessor :api_version, :extra_headers, :faraday_config, :log_errors, :request_timeout, :uri_base
|
|
17
17
|
|
|
18
18
|
DEFAULT_API_VERSION = "v1"
|
|
19
19
|
DEFAULT_REQUEST_TIMEOUT = 120
|
|
20
20
|
DEFAULT_URI_BASE = "https://openrouter.ai/api"
|
|
21
21
|
|
|
22
22
|
def initialize
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
23
|
+
self.access_token = nil
|
|
24
|
+
self.api_version = DEFAULT_API_VERSION
|
|
25
|
+
self.extra_headers = {}
|
|
26
|
+
self.log_errors = false
|
|
27
|
+
self.request_timeout = DEFAULT_REQUEST_TIMEOUT
|
|
28
|
+
self.uri_base = DEFAULT_URI_BASE
|
|
28
29
|
end
|
|
29
30
|
|
|
30
31
|
def access_token
|
|
@@ -33,6 +34,10 @@ module OpenRouter
|
|
|
33
34
|
raise ConfigurationError, "OpenRouter access token missing!"
|
|
34
35
|
end
|
|
35
36
|
|
|
37
|
+
def faraday(&block)
|
|
38
|
+
self.faraday_config = block
|
|
39
|
+
end
|
|
40
|
+
|
|
36
41
|
def site_name=(value)
|
|
37
42
|
@extra_headers["X-Title"] = value
|
|
38
43
|
end
|
data/open_router.gemspec
CHANGED
|
@@ -11,7 +11,7 @@ Gem::Specification.new do |spec|
|
|
|
11
11
|
spec.summary = "Ruby library for OpenRouter API."
|
|
12
12
|
spec.homepage = "https://github.com/OlympiaAI/open_router"
|
|
13
13
|
spec.license = "MIT"
|
|
14
|
-
spec.required_ruby_version = ">= 3.2.
|
|
14
|
+
spec.required_ruby_version = ">= 3.2.2"
|
|
15
15
|
|
|
16
16
|
spec.metadata["homepage_uri"] = spec.homepage
|
|
17
17
|
spec.metadata["source_code_uri"] = "https://github.com/OlympiaAI/open_router"
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: open_router
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.3.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Obie Fernandez
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2024-03
|
|
11
|
+
date: 2024-05-03 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activesupport
|
|
@@ -75,6 +75,7 @@ extra_rdoc_files: []
|
|
|
75
75
|
files:
|
|
76
76
|
- ".rspec"
|
|
77
77
|
- ".rubocop.yml"
|
|
78
|
+
- ".ruby-version"
|
|
78
79
|
- CHANGELOG.md
|
|
79
80
|
- CODE_OF_CONDUCT.md
|
|
80
81
|
- Gemfile
|
|
@@ -103,14 +104,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
103
104
|
requirements:
|
|
104
105
|
- - ">="
|
|
105
106
|
- !ruby/object:Gem::Version
|
|
106
|
-
version: 3.2.
|
|
107
|
+
version: 3.2.2
|
|
107
108
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
108
109
|
requirements:
|
|
109
110
|
- - ">="
|
|
110
111
|
- !ruby/object:Gem::Version
|
|
111
112
|
version: '0'
|
|
112
113
|
requirements: []
|
|
113
|
-
rubygems_version: 3.4.
|
|
114
|
+
rubygems_version: 3.4.10
|
|
114
115
|
signing_key:
|
|
115
116
|
specification_version: 4
|
|
116
117
|
summary: Ruby library for OpenRouter API.
|