rager 0.1.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 (44) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.md +21 -0
  3. data/README.md +23 -0
  4. data/lib/rager/chat/message.rb +13 -0
  5. data/lib/rager/chat/message_content.rb +14 -0
  6. data/lib/rager/chat/message_content_image_type.rb +16 -0
  7. data/lib/rager/chat/message_content_type.rb +16 -0
  8. data/lib/rager/chat/message_delta.rb +13 -0
  9. data/lib/rager/chat/message_role.rb +16 -0
  10. data/lib/rager/chat/options.rb +52 -0
  11. data/lib/rager/chat/providers/abstract.rb +25 -0
  12. data/lib/rager/chat/providers/openai.rb +196 -0
  13. data/lib/rager/chat/schema.rb +48 -0
  14. data/lib/rager/chat.rb +35 -0
  15. data/lib/rager/config.rb +30 -0
  16. data/lib/rager/context.rb +116 -0
  17. data/lib/rager/error.rb +7 -0
  18. data/lib/rager/errors/http_error.rb +19 -0
  19. data/lib/rager/errors/missing_credentials_error.rb +19 -0
  20. data/lib/rager/errors/options_error.rb +19 -0
  21. data/lib/rager/errors/parse_error.rb +19 -0
  22. data/lib/rager/errors/unknown_provider_error.rb +17 -0
  23. data/lib/rager/http/adapters/abstract.rb +20 -0
  24. data/lib/rager/http/adapters/async_http.rb +65 -0
  25. data/lib/rager/http/adapters/mock.rb +138 -0
  26. data/lib/rager/http/request.rb +15 -0
  27. data/lib/rager/http/response.rb +14 -0
  28. data/lib/rager/http/verb.rb +20 -0
  29. data/lib/rager/image_gen/options.rb +29 -0
  30. data/lib/rager/image_gen/providers/abstract.rb +25 -0
  31. data/lib/rager/image_gen/providers/replicate.rb +55 -0
  32. data/lib/rager/image_gen.rb +31 -0
  33. data/lib/rager/logger.rb +13 -0
  34. data/lib/rager/mesh_gen/options.rb +30 -0
  35. data/lib/rager/mesh_gen/providers/abstract.rb +25 -0
  36. data/lib/rager/mesh_gen/providers/replicate.rb +61 -0
  37. data/lib/rager/mesh_gen.rb +31 -0
  38. data/lib/rager/operation.rb +14 -0
  39. data/lib/rager/options.rb +21 -0
  40. data/lib/rager/result.rb +198 -0
  41. data/lib/rager/types.rb +45 -0
  42. data/lib/rager/version.rb +6 -0
  43. data/lib/rager.rb +35 -0
  44. metadata +123 -0
@@ -0,0 +1,21 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+
6
+ module Rager
7
+ module Options
8
+ extend T::Sig
9
+ extend T::Helpers
10
+ requires_ancestor { T::Struct }
11
+ interface!
12
+
13
+ sig { abstract.returns(T::Hash[String, T.untyped]) }
14
+ def serialize_safe
15
+ end
16
+
17
+ sig { abstract.void }
18
+ def validate
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,198 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "json"
5
+ require "securerandom"
6
+ require "sorbet-runtime"
7
+
8
+ module Rager
9
+ class Result
10
+ extend T::Sig
11
+
12
+ sig { returns(Rager::Operation) }
13
+ attr_reader :operation
14
+
15
+ sig { returns(Rager::Options) }
16
+ attr_reader :options
17
+
18
+ sig { returns(Rager::Types::Input) }
19
+ attr_reader :input
20
+
21
+ sig { returns(Integer) }
22
+ attr_reader :start_time
23
+
24
+ sig { returns(Integer) }
25
+ attr_reader :end_time
26
+
27
+ sig { returns(T.nilable(String)) }
28
+ attr_reader :result_id
29
+
30
+ sig { returns(T.nilable(String)) }
31
+ attr_reader :context_id
32
+
33
+ sig { returns(T.nilable(String)) }
34
+ attr_reader :hash
35
+
36
+ sig do
37
+ params(
38
+ operation: Rager::Operation,
39
+ options: Rager::Options,
40
+ input: Rager::Types::Input,
41
+ output: Rager::Types::Output,
42
+ start_time: Integer,
43
+ end_time: Integer,
44
+ context_id: T.nilable(String),
45
+ hash: T.nilable(String)
46
+ ).void
47
+ end
48
+ def initialize(
49
+ operation:,
50
+ options:,
51
+ input:,
52
+ output:,
53
+ start_time:,
54
+ end_time:,
55
+ context_id: nil,
56
+ hash: nil
57
+ )
58
+ @operation = operation
59
+ @options = options
60
+ @input = input
61
+ @output = output
62
+ @start_time = start_time
63
+ @end_time = end_time
64
+ @stream = T.let(nil, T.nilable(Rager::Types::Stream))
65
+ @buffer = T.let([], Rager::Types::Buffer)
66
+ @consumed = T.let(false, T::Boolean)
67
+ @result_id = T.let(SecureRandom.uuid, T.nilable(String))
68
+ @context_id = T.let(context_id, T.nilable(String))
69
+ @hash = T.let(hash, T.nilable(String))
70
+ end
71
+
72
+ sig { returns(T::Boolean) }
73
+ def stream?
74
+ @output.is_a?(Enumerator)
75
+ end
76
+
77
+ sig { returns(Rager::Types::Output) }
78
+ def out
79
+ return @output unless stream?
80
+ return @buffer.each if @consumed
81
+
82
+ log
83
+
84
+ @stream = Enumerator.new do |yielder|
85
+ T.cast(@output, Rager::Types::Stream)
86
+ .each { |message_delta|
87
+ @buffer << message_delta
88
+ yielder << message_delta
89
+ }
90
+
91
+ @consumed = true
92
+ @end_time = Time.now.to_i
93
+
94
+ log
95
+ end
96
+
97
+ @stream
98
+ end
99
+
100
+ sig { returns(Rager::Types::NonStreamOutput) }
101
+ def mat
102
+ return T.cast(@output, Rager::Types::NonStreamOutput) unless stream?
103
+
104
+ if !@consumed
105
+ T.cast(out, Rager::Types::Stream).each { |_| }
106
+ end
107
+
108
+ parts = {}
109
+
110
+ @buffer.each do |message_delta|
111
+ parts[message_delta.index] =
112
+ (parts[message_delta.index] || "") + message_delta.content
113
+ end
114
+
115
+ parts
116
+ .sort_by { |index, _| index }
117
+ .map { |_, content| content }
118
+ end
119
+
120
+ sig { returns(T.any(String, T::Array[T::Hash[String, T.untyped]])) }
121
+ def serialize_input
122
+ case @input
123
+ when String
124
+ @input
125
+ when Array
126
+ @input.map(&:serialize)
127
+ end
128
+ end
129
+
130
+ sig { returns(Rager::Types::NonStreamOutput) }
131
+ def serialize_output
132
+ if @consumed
133
+ mat
134
+ elsif stream?
135
+ "[STREAM]"
136
+ else
137
+ T.cast(@output, Rager::Types::NonStreamOutput)
138
+ end
139
+ end
140
+
141
+ sig { returns(T::Hash[String, T.untyped]) }
142
+ def to_h
143
+ {
144
+ operation: @operation.serialize,
145
+ options: @options.serialize_safe,
146
+ input: serialize_input,
147
+ output: if @consumed
148
+ mat
149
+ elsif stream?
150
+ "[STREAM]"
151
+ else
152
+ @output
153
+ end,
154
+ start_time: @start_time,
155
+ end_time: @end_time,
156
+ result_id: @result_id,
157
+ context_id: @context_id,
158
+ hash: @hash
159
+ }
160
+ end
161
+
162
+ sig { void }
163
+ def log
164
+ return unless Rager.config.logger
165
+
166
+ json = to_h.to_json
167
+
168
+ case Rager.config.logger
169
+ when Rager::Logger::Stdout
170
+ puts "LOG: #{json}"
171
+ when Rager::Logger::Remote
172
+ http_adapter = Rager.config.http_adapter
173
+ url = Rager.config.url
174
+ api_key = Rager.config.api_key
175
+
176
+ headers = {
177
+ "Content-Type" => "application/json",
178
+ "Authorization" => "Bearer #{api_key}"
179
+ }
180
+
181
+ if url && api_key
182
+ request = Rager::Http::Request.new(
183
+ url: url,
184
+ verb: Rager::Http::Verb::Post,
185
+ headers: headers,
186
+ body: json
187
+ )
188
+
189
+ response = http_adapter.make_request(request)
190
+
191
+ unless response.status >= 200 && response.status < 300
192
+ warn "Remote log failed: \\#{response.status} \\#{response.body}"
193
+ end
194
+ end
195
+ end
196
+ end
197
+ end
198
+ end
@@ -0,0 +1,45 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module Rager
5
+ module Types
6
+ extend T::Sig
7
+
8
+ ChatInput = T.type_alias { T.any(String, T::Array[Rager::Chat::Message]) }
9
+ ImageGenInput = T.type_alias { String }
10
+ MeshGenInput = T.type_alias { String }
11
+ Input = T.type_alias {
12
+ T.any(
13
+ ChatInput,
14
+ ImageGenInput,
15
+ MeshGenInput
16
+ )
17
+ }
18
+
19
+ ChatStream = T.type_alias { T::Enumerator[Rager::Chat::MessageDelta] }
20
+ Stream = T.type_alias { ChatStream }
21
+
22
+ ChatBuffer = T.type_alias { T::Array[Rager::Chat::MessageDelta] }
23
+ Buffer = T.type_alias { ChatBuffer }
24
+
25
+ ChatOutput = T.type_alias { T.any(T::Array[String], ChatStream) }
26
+ ImageGenOutput = T.type_alias { String }
27
+ MeshGenOutput = T.type_alias { String }
28
+ Output = T.type_alias {
29
+ T.any(
30
+ ChatOutput,
31
+ ImageGenOutput,
32
+ MeshGenOutput
33
+ )
34
+ }
35
+
36
+ ChatNonStreamOutput = T.type_alias { T::Array[String] }
37
+ NonStreamOutput = T.type_alias {
38
+ T.any(
39
+ ChatNonStreamOutput,
40
+ ImageGenOutput,
41
+ MeshGenOutput
42
+ )
43
+ }
44
+ end
45
+ end
@@ -0,0 +1,6 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module Rager
5
+ VERSION = "0.1.0"
6
+ end
data/lib/rager.rb ADDED
@@ -0,0 +1,35 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "zeitwerk"
5
+ loader = Zeitwerk::Loader.for_gem
6
+ loader.setup
7
+
8
+ require "sorbet-runtime"
9
+
10
+ module Rager
11
+ extend T::Sig
12
+
13
+ ConfigBlock = T.type_alias do
14
+ T.proc.params(config: Config).void
15
+ end
16
+
17
+ @config = T.let(nil, T.nilable(Rager::Config))
18
+
19
+ sig { returns(Config) }
20
+ def self.config
21
+ @config ||= Config.new
22
+ end
23
+
24
+ sig { params(block: ConfigBlock).void }
25
+ def self.configure(&block)
26
+ yield(config)
27
+ end
28
+
29
+ sig { void }
30
+ def self.reset_config!
31
+ @config = Config.new
32
+ end
33
+ end
34
+
35
+ loader.eager_load
metadata ADDED
@@ -0,0 +1,123 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rager
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - mvkvc
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: dry-schema
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '1.14'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '1.14'
26
+ - !ruby/object:Gem::Dependency
27
+ name: sorbet-runtime
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: 0.5.12028
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: 0.5.12028
40
+ - !ruby/object:Gem::Dependency
41
+ name: zeitwerk
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '2.7'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '2.7'
54
+ email:
55
+ - mail@mvk.vc
56
+ executables: []
57
+ extensions: []
58
+ extra_rdoc_files: []
59
+ files:
60
+ - LICENSE.md
61
+ - README.md
62
+ - lib/rager.rb
63
+ - lib/rager/chat.rb
64
+ - lib/rager/chat/message.rb
65
+ - lib/rager/chat/message_content.rb
66
+ - lib/rager/chat/message_content_image_type.rb
67
+ - lib/rager/chat/message_content_type.rb
68
+ - lib/rager/chat/message_delta.rb
69
+ - lib/rager/chat/message_role.rb
70
+ - lib/rager/chat/options.rb
71
+ - lib/rager/chat/providers/abstract.rb
72
+ - lib/rager/chat/providers/openai.rb
73
+ - lib/rager/chat/schema.rb
74
+ - lib/rager/config.rb
75
+ - lib/rager/context.rb
76
+ - lib/rager/error.rb
77
+ - lib/rager/errors/http_error.rb
78
+ - lib/rager/errors/missing_credentials_error.rb
79
+ - lib/rager/errors/options_error.rb
80
+ - lib/rager/errors/parse_error.rb
81
+ - lib/rager/errors/unknown_provider_error.rb
82
+ - lib/rager/http/adapters/abstract.rb
83
+ - lib/rager/http/adapters/async_http.rb
84
+ - lib/rager/http/adapters/mock.rb
85
+ - lib/rager/http/request.rb
86
+ - lib/rager/http/response.rb
87
+ - lib/rager/http/verb.rb
88
+ - lib/rager/image_gen.rb
89
+ - lib/rager/image_gen/options.rb
90
+ - lib/rager/image_gen/providers/abstract.rb
91
+ - lib/rager/image_gen/providers/replicate.rb
92
+ - lib/rager/logger.rb
93
+ - lib/rager/mesh_gen.rb
94
+ - lib/rager/mesh_gen/options.rb
95
+ - lib/rager/mesh_gen/providers/abstract.rb
96
+ - lib/rager/mesh_gen/providers/replicate.rb
97
+ - lib/rager/operation.rb
98
+ - lib/rager/options.rb
99
+ - lib/rager/result.rb
100
+ - lib/rager/types.rb
101
+ - lib/rager/version.rb
102
+ homepage: https://github.com/mvkvc/rager_ruby
103
+ licenses:
104
+ - MIT
105
+ metadata: {}
106
+ rdoc_options: []
107
+ require_paths:
108
+ - lib
109
+ required_ruby_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: '3.1'
114
+ required_rubygems_version: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ requirements: []
120
+ rubygems_version: 3.6.7
121
+ specification_version: 4
122
+ summary: Build continuously improving AI applications.
123
+ test_files: []