rager 0.6.0 → 0.7.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.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +26 -27
  3. data/lib/rager/chat/message.rb +10 -0
  4. data/lib/rager/chat/message_content.rb +7 -0
  5. data/lib/rager/chat/message_delta.rb +7 -0
  6. data/lib/rager/chat/options.rb +6 -7
  7. data/lib/rager/chat/providers/openai.rb +49 -34
  8. data/lib/rager/chat/schema.rb +0 -2
  9. data/lib/rager/config.rb +12 -20
  10. data/lib/rager/context.rb +302 -186
  11. data/lib/rager/context_options.rb +23 -0
  12. data/lib/rager/embed/options.rb +3 -3
  13. data/lib/rager/embed/providers/openai.rb +7 -3
  14. data/lib/rager/errors/options_error.rb +1 -1
  15. data/lib/rager/http/adapters/async_http.rb +0 -2
  16. data/lib/rager/http/adapters/mock.rb +0 -2
  17. data/lib/rager/http/adapters/net_http.rb +18 -19
  18. data/lib/rager/{image_gen → image}/options.rb +4 -4
  19. data/lib/rager/{image_gen → image}/output_format.rb +1 -1
  20. data/lib/rager/{image_gen → image}/providers/abstract.rb +4 -4
  21. data/lib/rager/{image_gen → image}/providers/replicate.rb +14 -10
  22. data/lib/rager/{logger.rb → log_strategy.rb} +2 -1
  23. data/lib/rager/{mesh_gen → mesh}/options.rb +3 -3
  24. data/lib/rager/{mesh_gen → mesh}/providers/abstract.rb +4 -4
  25. data/lib/rager/{mesh_gen → mesh}/providers/replicate.rb +13 -9
  26. data/lib/rager/operation.rb +2 -2
  27. data/lib/rager/options.rb +1 -1
  28. data/lib/rager/outcome.rb +25 -0
  29. data/lib/rager/providers.rb +37 -25
  30. data/lib/rager/rerank/input.rb +20 -0
  31. data/lib/rager/rerank/options.rb +2 -2
  32. data/lib/rager/rerank/providers/abstract.rb +2 -3
  33. data/lib/rager/rerank/providers/cohere.rb +19 -13
  34. data/lib/rager/rerank/result.rb +20 -0
  35. data/lib/rager/result.rb +92 -122
  36. data/lib/rager/search/options.rb +3 -2
  37. data/lib/rager/search/providers/jina.rb +16 -15
  38. data/lib/rager/search/result.rb +21 -0
  39. data/lib/rager/template/input.rb +20 -0
  40. data/lib/rager/template/options.rb +1 -1
  41. data/lib/rager/template/providers/abstract.rb +2 -3
  42. data/lib/rager/template/providers/erb.rb +4 -5
  43. data/lib/rager/template/providers/mustache.rb +30 -0
  44. data/lib/rager/types.rb +31 -24
  45. data/lib/rager/utils/http.rb +73 -15
  46. data/lib/rager/utils/replicate.rb +28 -6
  47. data/lib/rager/utils/runtime.rb +21 -0
  48. data/lib/rager/version.rb +1 -1
  49. metadata +18 -12
  50. data/lib/rager/rerank/output.rb +0 -13
  51. data/lib/rager/search/output.rb +0 -14
@@ -13,17 +13,13 @@ module Rager
13
13
  module Http
14
14
  extend T::Sig
15
15
 
16
- sig { params(duration: Numeric).void }
17
- def self.sleep(duration)
18
- if defined?(Async::Task) && (task = Async::Task.current?)
19
- task.sleep(duration)
20
- else
21
- Kernel.sleep(duration)
22
- end
23
- end
24
-
25
- sig { params(url: String, http_adapter: T.nilable(Rager::Http::Adapters::Abstract)).returns(T.nilable(String)) }
26
- def self.download_binary(url, http_adapter: nil)
16
+ sig {
17
+ params(
18
+ url: String,
19
+ http_adapter: T.nilable(Rager::Http::Adapters::Abstract)
20
+ ).returns(T.nilable(String))
21
+ }
22
+ def self.download(url, http_adapter: nil)
27
23
  adapter = http_adapter || Rager.config.http_adapter
28
24
  response = adapter.make_request(
29
25
  Rager::Http::Request.new(url: url, headers: {})
@@ -42,15 +38,77 @@ module Rager
42
38
  end
43
39
  end
44
40
 
45
- sig { params(url: String, path: String, http_adapter: T.nilable(Rager::Http::Adapters::Abstract)).returns(T.nilable(String)) }
46
- def self.download_file(url, path, http_adapter: nil)
47
- content = download_binary(url, http_adapter: http_adapter)
41
+ sig {
42
+ params(
43
+ url: String,
44
+ path: String,
45
+ http_adapter: T.nilable(Rager::Http::Adapters::Abstract)
46
+ ).returns(T.nilable(String))
47
+ }
48
+ def self.download_to_file(url, path, http_adapter: nil)
49
+ content = download(url, http_adapter: http_adapter)
48
50
  return nil if content.nil?
49
51
 
50
52
  FileUtils.mkdir_p(File.dirname(path))
51
- File.write(path, content)
53
+ File.write(path, content, mode: "wb")
52
54
  path
53
55
  end
56
+
57
+ sig do
58
+ params(
59
+ endpoint: String,
60
+ body: String,
61
+ error: T::Boolean
62
+ ).void
63
+ end
64
+ def self.log_remote(endpoint, body, error = false)
65
+ logger = Rager.config.logger
66
+
67
+ case Rager.config.log_strategy
68
+ when Rager::LogStrategy::Stdout
69
+ error ? logger.error(body) : logger.info(body)
70
+ when Rager::LogStrategy::Remote
71
+ http_adapter = Rager.config.http_adapter
72
+ url = Rager.config.url
73
+ api_key = Rager.config.api_key
74
+
75
+ unless url && api_key
76
+ raise Rager::Errors::CredentialsError.new("Rager Cloud", details: "Missing url or api_key for remote logging")
77
+ end
78
+
79
+ headers = {
80
+ "Content-Type" => "application/json",
81
+ "Authorization" => "Bearer #{api_key}"
82
+ }
83
+
84
+ request = Rager::Http::Request.new(
85
+ url: "#{url}/#{endpoint}",
86
+ verb: Rager::Http::Verb::Post,
87
+ headers: headers,
88
+ body: body
89
+ )
90
+
91
+ begin
92
+ response = http_adapter.make_request(request)
93
+
94
+ unless response.success?
95
+ raise Rager::Errors::HttpError.new(
96
+ http_adapter,
97
+ request.url,
98
+ response.status,
99
+ body: T.cast(response.body, String),
100
+ details: "HTTP request failed during remote logging"
101
+ )
102
+ end
103
+ rescue Rager::Error => e
104
+ if Rager.config.log_raise
105
+ raise e
106
+ else
107
+ Rager.config.logger.error(e.message)
108
+ end
109
+ end
110
+ end
111
+ end
54
112
  end
55
113
  end
56
114
  end
@@ -10,20 +10,33 @@ module Rager
10
10
  module Replicate
11
11
  extend T::Sig
12
12
 
13
- sig { params(prediction_url: String, key: T.nilable(String), http_adapter: T.nilable(Rager::Http::Adapters::Abstract)).returns(T.nilable(String)) }
13
+ sig {
14
+ params(
15
+ prediction_url: String,
16
+ key: T.nilable(String),
17
+ http_adapter: T.nilable(Rager::Http::Adapters::Abstract)
18
+ ).returns(T.nilable(String))
19
+ }
14
20
  def self.download_prediction(prediction_url, key = nil, http_adapter: nil)
15
21
  download_url = get_download_url(prediction_url, key, http_adapter: http_adapter)
16
22
  return nil if download_url.nil?
17
23
 
18
- Rager::Utils::Http.download_binary(download_url)
24
+ Rager::Utils::Http.download(download_url)
19
25
  end
20
26
 
21
- sig { params(prediction_url: String, key: T.nilable(String), path: String, http_adapter: T.nilable(Rager::Http::Adapters::Abstract)).returns(T.nilable(String)) }
27
+ sig {
28
+ params(
29
+ prediction_url: String,
30
+ key: T.nilable(String),
31
+ path: String,
32
+ http_adapter: T.nilable(Rager::Http::Adapters::Abstract)
33
+ ).returns(T.nilable(String))
34
+ }
22
35
  def self.download_prediction_to_file(prediction_url, key = nil, path:, http_adapter: nil)
23
36
  download_url = get_download_url(prediction_url, key, http_adapter: http_adapter)
24
37
  return nil if download_url.nil?
25
38
 
26
- Rager::Utils::Http.download_file(download_url, path)
39
+ Rager::Utils::Http.download_to_file(download_url, path)
27
40
  end
28
41
 
29
42
  sig { params(prediction_url: String, key: T.nilable(String), http_adapter: T.nilable(Rager::Http::Adapters::Abstract)).returns(T.nilable(String)) }
@@ -70,7 +83,16 @@ module Rager
70
83
  raise Rager::Errors::ParseError.new("Failed to parse prediction response", details: e.message)
71
84
  end
72
85
 
73
- sig { params(prediction_url: String, key: T.nilable(String), path: T.nilable(String), max_attempts: Integer, sleep_interval: Integer, http_adapter: T.nilable(Rager::Http::Adapters::Abstract)).returns(T.nilable(String)) }
86
+ sig {
87
+ params(
88
+ prediction_url: String,
89
+ key: T.nilable(String),
90
+ path: T.nilable(String),
91
+ max_attempts: Integer,
92
+ sleep_interval: Integer,
93
+ http_adapter: T.nilable(Rager::Http::Adapters::Abstract)
94
+ ).returns(T.nilable(String))
95
+ }
74
96
  def self.poll_prediction(prediction_url, key: nil, path: nil, max_attempts: 30, sleep_interval: 10, http_adapter: nil)
75
97
  max_attempts.times do
76
98
  result = if path
@@ -79,7 +101,7 @@ module Rager
79
101
  download_prediction(prediction_url, key, http_adapter: http_adapter)
80
102
  end
81
103
  return result unless result.nil?
82
- Rager::Utils::Http.sleep(sleep_interval)
104
+ Rager::Utils::Runtime.sleep(sleep_interval)
83
105
  end
84
106
 
85
107
  raise Rager::Errors::TimeoutError.new(
@@ -0,0 +1,21 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+
6
+ module Rager
7
+ module Utils
8
+ module Runtime
9
+ extend T::Sig
10
+
11
+ sig { params(duration: Numeric).void }
12
+ def self.sleep(duration)
13
+ if defined?(Async::Task) && (task = Async::Task.current?)
14
+ task.sleep(duration)
15
+ else
16
+ Kernel.sleep(duration)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
data/lib/rager/version.rb CHANGED
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Rager
5
- VERSION = "0.6.0"
5
+ VERSION = "0.7.0"
6
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rager
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - mvkvc
@@ -72,6 +72,7 @@ files:
72
72
  - lib/rager/chat/schema.rb
73
73
  - lib/rager/config.rb
74
74
  - lib/rager/context.rb
75
+ - lib/rager/context_options.rb
75
76
  - lib/rager/embed/options.rb
76
77
  - lib/rager/embed/providers/abstract.rb
77
78
  - lib/rager/embed/providers/openai.rb
@@ -90,32 +91,37 @@ files:
90
91
  - lib/rager/http/request.rb
91
92
  - lib/rager/http/response.rb
92
93
  - lib/rager/http/verb.rb
93
- - lib/rager/image_gen/options.rb
94
- - lib/rager/image_gen/output_format.rb
95
- - lib/rager/image_gen/providers/abstract.rb
96
- - lib/rager/image_gen/providers/replicate.rb
97
- - lib/rager/logger.rb
98
- - lib/rager/mesh_gen/options.rb
99
- - lib/rager/mesh_gen/providers/abstract.rb
100
- - lib/rager/mesh_gen/providers/replicate.rb
94
+ - lib/rager/image/options.rb
95
+ - lib/rager/image/output_format.rb
96
+ - lib/rager/image/providers/abstract.rb
97
+ - lib/rager/image/providers/replicate.rb
98
+ - lib/rager/log_strategy.rb
99
+ - lib/rager/mesh/options.rb
100
+ - lib/rager/mesh/providers/abstract.rb
101
+ - lib/rager/mesh/providers/replicate.rb
101
102
  - lib/rager/operation.rb
102
103
  - lib/rager/options.rb
104
+ - lib/rager/outcome.rb
103
105
  - lib/rager/providers.rb
106
+ - lib/rager/rerank/input.rb
104
107
  - lib/rager/rerank/options.rb
105
- - lib/rager/rerank/output.rb
106
108
  - lib/rager/rerank/providers/abstract.rb
107
109
  - lib/rager/rerank/providers/cohere.rb
110
+ - lib/rager/rerank/result.rb
108
111
  - lib/rager/result.rb
109
112
  - lib/rager/search/options.rb
110
- - lib/rager/search/output.rb
111
113
  - lib/rager/search/providers/abstract.rb
112
114
  - lib/rager/search/providers/jina.rb
115
+ - lib/rager/search/result.rb
116
+ - lib/rager/template/input.rb
113
117
  - lib/rager/template/options.rb
114
118
  - lib/rager/template/providers/abstract.rb
115
119
  - lib/rager/template/providers/erb.rb
120
+ - lib/rager/template/providers/mustache.rb
116
121
  - lib/rager/types.rb
117
122
  - lib/rager/utils/http.rb
118
123
  - lib/rager/utils/replicate.rb
124
+ - lib/rager/utils/runtime.rb
119
125
  - lib/rager/version.rb
120
126
  homepage: https://github.com/mvkvc/rager_rb
121
127
  licenses:
@@ -135,7 +141,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
135
141
  - !ruby/object:Gem::Version
136
142
  version: '0'
137
143
  requirements: []
138
- rubygems_version: 3.6.7
144
+ rubygems_version: 3.6.9
139
145
  specification_version: 4
140
146
  summary: Build continuously improving generative workflows.
141
147
  test_files: []
@@ -1,13 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- require "sorbet-runtime"
5
-
6
- module Rager
7
- module Rerank
8
- class Output < T::Struct
9
- const :scores, T::Array[Float]
10
- const :documents, T::Array[String]
11
- end
12
- end
13
- end
@@ -1,14 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- require "sorbet-runtime"
5
-
6
- module Rager
7
- module Search
8
- class Output < T::Struct
9
- const :urls, T::Array[String]
10
- const :titles, T::Array[String]
11
- const :contents, T::Array[String]
12
- end
13
- end
14
- end