rager 0.5.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 (65) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +49 -7
  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 +12 -9
  7. data/lib/rager/chat/providers/openai.rb +64 -48
  8. data/lib/rager/chat/schema.rb +3 -4
  9. data/lib/rager/config.rb +16 -20
  10. data/lib/rager/context.rb +326 -97
  11. data/lib/rager/context_options.rb +23 -0
  12. data/lib/rager/embed/options.rb +4 -3
  13. data/lib/rager/embed/providers/openai.rb +14 -6
  14. data/lib/rager/errors/credentials_error.rb +24 -0
  15. data/lib/rager/errors/dependency_error.rb +23 -0
  16. data/lib/rager/errors/http_error.rb +12 -5
  17. data/lib/rager/errors/options_error.rb +10 -5
  18. data/lib/rager/errors/parse_error.rb +9 -5
  19. data/lib/rager/errors/template_error.rb +10 -4
  20. data/lib/rager/errors/timeout_error.rb +25 -0
  21. data/lib/rager/http/adapters/async_http.rb +66 -14
  22. data/lib/rager/http/adapters/mock.rb +41 -45
  23. data/lib/rager/http/adapters/net_http.rb +144 -0
  24. data/lib/rager/http/request.rb +2 -0
  25. data/lib/rager/{image_gen → image}/options.rb +5 -4
  26. data/lib/rager/{image_gen → image}/output_format.rb +1 -1
  27. data/lib/rager/{image_gen → image}/providers/abstract.rb +4 -4
  28. data/lib/rager/{image_gen → image}/providers/replicate.rb +19 -14
  29. data/lib/rager/{logger.rb → log_strategy.rb} +2 -1
  30. data/lib/rager/{mesh_gen → mesh}/options.rb +4 -3
  31. data/lib/rager/{mesh_gen → mesh}/providers/abstract.rb +4 -4
  32. data/lib/rager/{mesh_gen → mesh}/providers/replicate.rb +20 -14
  33. data/lib/rager/operation.rb +2 -2
  34. data/lib/rager/options.rb +1 -1
  35. data/lib/rager/outcome.rb +25 -0
  36. data/lib/rager/providers.rb +61 -0
  37. data/lib/rager/rerank/{query.rb → input.rb} +8 -1
  38. data/lib/rager/rerank/options.rb +3 -2
  39. data/lib/rager/rerank/providers/abstract.rb +2 -2
  40. data/lib/rager/rerank/providers/cohere.rb +24 -15
  41. data/lib/rager/rerank/result.rb +8 -1
  42. data/lib/rager/result.rb +98 -108
  43. data/lib/rager/search/options.rb +4 -1
  44. data/lib/rager/search/providers/jina.rb +68 -0
  45. data/lib/rager/search/result.rb +9 -2
  46. data/lib/rager/template/input.rb +9 -0
  47. data/lib/rager/template/options.rb +1 -1
  48. data/lib/rager/template/providers/erb.rb +3 -3
  49. data/lib/rager/template/providers/mustache.rb +30 -0
  50. data/lib/rager/types.rb +28 -17
  51. data/lib/rager/utils/http.rb +92 -27
  52. data/lib/rager/utils/replicate.rb +40 -21
  53. data/lib/rager/utils/runtime.rb +21 -0
  54. data/lib/rager/version.rb +1 -1
  55. metadata +22 -36
  56. data/lib/rager/chat.rb +0 -35
  57. data/lib/rager/embed.rb +0 -35
  58. data/lib/rager/errors/missing_credentials_error.rb +0 -19
  59. data/lib/rager/errors/unknown_provider_error.rb +0 -17
  60. data/lib/rager/image_gen.rb +0 -31
  61. data/lib/rager/mesh_gen.rb +0 -31
  62. data/lib/rager/rerank.rb +0 -35
  63. data/lib/rager/search/providers/brave.rb +0 -59
  64. data/lib/rager/search.rb +0 -35
  65. data/lib/rager/template.rb +0 -35
@@ -4,7 +4,7 @@
4
4
  require "sorbet-runtime"
5
5
 
6
6
  module Rager
7
- module MeshGen
7
+ module Mesh
8
8
  module Providers
9
9
  class Abstract
10
10
  extend T::Sig
@@ -14,10 +14,10 @@ module Rager
14
14
  sig do
15
15
  abstract.params(
16
16
  image_url: String,
17
- options: Rager::MeshGen::Options
18
- ).returns(Rager::Types::MeshGenOutput)
17
+ options: Rager::Mesh::Options
18
+ ).returns(Rager::Types::MeshOutput)
19
19
  end
20
- def mesh_gen(image_url, options)
20
+ def mesh(image_url, options)
21
21
  end
22
22
  end
23
23
  end
@@ -1,19 +1,27 @@
1
1
  # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
- require "sorbet-runtime"
5
4
  require "json"
6
5
 
6
+ require "sorbet-runtime"
7
+
7
8
  module Rager
8
- module MeshGen
9
+ module Mesh
9
10
  module Providers
10
- class Replicate < Rager::MeshGen::Providers::Abstract
11
+ class Replicate < Rager::Mesh::Providers::Abstract
11
12
  extend T::Sig
12
13
 
13
- sig { override.params(image_url: String, options: Rager::MeshGen::Options).returns(Rager::Types::MeshGenOutput) }
14
- def mesh_gen(image_url, options)
14
+ sig { override.params(image_url: String, options: Rager::Mesh::Options).returns(Rager::Types::MeshOutput) }
15
+ def mesh(image_url, options)
15
16
  api_key = options.api_key || ENV["REPLICATE_API_KEY"]
16
- raise Rager::Errors::MissingCredentialsError.new("Replicate", "REPLICATE_API_KEY") if api_key.nil?
17
+ raise Rager::Errors::CredentialsError.new("Replicate", env_var: ["REPLICATE_API_KEY"]) if api_key.nil?
18
+
19
+ url = "https://api.replicate.com/v1/predictions"
20
+
21
+ headers = {
22
+ "Authorization" => "Bearer #{api_key}",
23
+ "Content-Type" => "application/json"
24
+ }
17
25
 
18
26
  body = {
19
27
  version: options.version,
@@ -30,24 +38,22 @@ module Rager
30
38
  end
31
39
 
32
40
  request = Rager::Http::Request.new(
33
- url: "https://api.replicate.com/v1/predictions",
41
+ url: url,
34
42
  verb: Rager::Http::Verb::Post,
35
- headers: {
36
- "Authorization" => "Bearer #{api_key}",
37
- "Content-Type" => "application/json"
38
- },
39
- body: body.to_json
43
+ headers: headers,
44
+ body: body.to_json,
45
+ timeout: options.timeout || Rager.config.timeout
40
46
  )
41
47
 
42
48
  response = Rager.config.http_adapter.make_request(request)
43
49
  response_body = T.cast(T.must(response.body), String)
44
50
 
45
- raise Rager::Errors::HttpError.new(Rager.config.http_adapter, response.status, response_body) unless [200, 201, 202].include?(response.status)
51
+ raise Rager::Errors::HttpError.new(Rager.config.http_adapter, request.url, response.status, body: response_body) unless [200, 201, 202].include?(response.status)
46
52
 
47
53
  json = JSON.parse(response_body)
48
54
  json.fetch("urls").fetch("get")
49
55
  rescue JSON::ParserError, KeyError => e
50
- raise Rager::Errors::ParseError.new(e.message, response_body)
56
+ raise Rager::Errors::ParseError.new(response_body || "", details: e.message)
51
57
  end
52
58
  end
53
59
  end
@@ -8,8 +8,8 @@ module Rager
8
8
  enums do
9
9
  Chat = new("chat")
10
10
  Embed = new("embed")
11
- ImageGen = new("image_gen")
12
- MeshGen = new("mesh_gen")
11
+ Image = new("image")
12
+ Mesh = new("mesh")
13
13
  Rerank = new("rerank")
14
14
  Search = new("search")
15
15
  Template = new("template")
data/lib/rager/options.rb CHANGED
@@ -9,7 +9,7 @@ module Rager
9
9
  extend T::Helpers
10
10
  requires_ancestor { T::Struct }
11
11
 
12
- sig { returns(T::Hash[String, T.untyped]) }
12
+ sig { returns(T::Hash[Symbol, T.untyped]) }
13
13
  def serialize_safe
14
14
  result = T.cast(self, T::Struct).serialize
15
15
  result["api_key"] = "[REDACTED]" if result.key?("api_key")
@@ -0,0 +1,25 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+
6
+ module Rager
7
+ class Outcome < T::Struct
8
+ extend T::Sig
9
+
10
+ const :context_id, String
11
+ const :value, Float
12
+ const :feedback, T.nilable(String)
13
+ const :tags, T::Array[T.untyped], default: []
14
+
15
+ sig { params(options: T.untyped).returns(String) }
16
+ def to_json(options = nil)
17
+ {
18
+ context_id: context_id,
19
+ value: value,
20
+ feedback: feedback,
21
+ tags: tags
22
+ }.to_json(options)
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,61 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+
6
+ module Rager
7
+ module Providers
8
+ extend T::Sig
9
+
10
+ PROVIDERS = T.let({
11
+ Rager::Operation::Chat => {
12
+ openai: -> { Rager::Chat::Providers::Openai.new }
13
+ },
14
+ Rager::Operation::Embed => {
15
+ openai: -> { Rager::Embed::Providers::Openai.new }
16
+ },
17
+ Rager::Operation::Rerank => {
18
+ cohere: -> { Rager::Rerank::Providers::Cohere.new }
19
+ },
20
+ Rager::Operation::Image => {
21
+ replicate: -> { Rager::Image::Providers::Replicate.new }
22
+ },
23
+ Rager::Operation::Mesh => {
24
+ replicate: -> { Rager::Mesh::Providers::Replicate.new }
25
+ },
26
+ Rager::Operation::Template => {
27
+ erb: -> { Rager::Template::Providers::Erb.new },
28
+ mustache: -> { Rager::Template::Providers::Mustache.new }
29
+ },
30
+ Rager::Operation::Search => {
31
+ jina: -> { Rager::Search::Providers::Jina.new }
32
+ }
33
+ }, T::Hash[Rager::Operation, T::Hash[Symbol, T.proc.returns(T.untyped)]])
34
+
35
+ sig { params(operation: Rager::Operation).returns(T::Array[Symbol]) }
36
+ def self.list_providers(operation)
37
+ PROVIDERS.fetch(operation, {}).keys
38
+ end
39
+
40
+ sig {
41
+ params(
42
+ operation: Rager::Operation,
43
+ key: Symbol,
44
+ options: Rager::Types::Options
45
+ ).returns(T.untyped)
46
+ }
47
+ def self.get_provider(operation, key, options)
48
+ operation_providers = PROVIDERS[operation]
49
+
50
+ unless operation_providers&.key?(key)
51
+ raise Rager::Errors::OptionsError.new(
52
+ options,
53
+ ["provider"],
54
+ details: "Unknown #{operation} provider: #{key}. Known providers: #{list_providers(operation).join(", ")}"
55
+ )
56
+ end
57
+
58
+ T.must(operation_providers[key]).call
59
+ end
60
+ end
61
+ end
@@ -5,9 +5,16 @@ require "sorbet-runtime"
5
5
 
6
6
  module Rager
7
7
  module Rerank
8
- class Query < T::Struct
8
+ class Input < T::Struct
9
+ extend T::Sig
10
+
9
11
  const :query, String
10
12
  const :documents, T::Array[String]
13
+
14
+ sig { params(options: T.untyped).returns(String) }
15
+ def to_json(options = nil)
16
+ serialize.to_json(options)
17
+ end
11
18
  end
12
19
  end
13
20
  end
@@ -9,11 +9,12 @@ module Rager
9
9
  extend T::Sig
10
10
  include Rager::Options
11
11
 
12
- const :provider, String, default: "cohere"
13
- const :url, T.nilable(String)
12
+ const :provider, Symbol, default: :cohere
14
13
  const :model, T.nilable(String)
15
14
  const :n, T.nilable(Integer)
15
+ const :url, T.nilable(String)
16
16
  const :api_key, T.nilable(String)
17
+ const :timeout, T.nilable(Numeric)
17
18
  end
18
19
  end
19
20
  end
@@ -13,11 +13,11 @@ module Rager
13
13
 
14
14
  sig do
15
15
  abstract.params(
16
- query: Rager::Rerank::Query,
16
+ input: Rager::Rerank::Input,
17
17
  options: Rager::Rerank::Options
18
18
  ).returns(Rager::Types::RerankOutput)
19
19
  end
20
- def rerank(query, options)
20
+ def rerank(input, options)
21
21
  end
22
22
  end
23
23
  end
@@ -2,6 +2,7 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "json"
5
+
5
6
  require "sorbet-runtime"
6
7
 
7
8
  module Rager
@@ -12,44 +13,52 @@ module Rager
12
13
 
13
14
  sig do
14
15
  override.params(
15
- query: Rager::Rerank::Query,
16
+ input: Rager::Rerank::Input,
16
17
  options: Rager::Rerank::Options
17
18
  ).returns(Rager::Types::RerankOutput)
18
19
  end
19
- def rerank(query, options)
20
+ def rerank(input, options)
20
21
  api_key = options.api_key || ENV["COHERE_API_KEY"]
21
- raise Rager::Errors::MissingCredentialsError.new("Cohere", "COHERE_API_KEY") if api_key.nil?
22
+ raise Rager::Errors::CredentialsError.new("Cohere", env_var: ["COHERE_API_KEY"]) if api_key.nil?
23
+
24
+ base_url = options.url || ENV["COHERE_URL"] || "https://api.cohere.com/v2"
25
+ url = "#{base_url}/rerank"
26
+
27
+ headers = {"Content-Type" => "application/json"}
28
+ headers["Authorization"] = "Bearer #{api_key}" if api_key
22
29
 
23
30
  body = {
24
31
  model: options.model || "rerank-v3.5",
25
- query: query.query,
26
- documents: query.documents
32
+ query: input.query,
33
+ documents: input.documents
27
34
  }.tap do |b|
28
35
  b[:top_n] = options.n if options.n
29
36
  end
30
37
 
31
- headers = {"Content-Type" => "application/json"}
32
- headers["Authorization"] = "Bearer #{api_key}" if api_key
33
-
34
38
  request = Rager::Http::Request.new(
35
39
  verb: Rager::Http::Verb::Post,
36
- url: options.url || ENV["COHERE_URL"] || "https://api.cohere.com/v2/rerank",
40
+ url: url,
37
41
  headers: headers,
38
- body: body.to_json
42
+ body: body.to_json,
43
+ timeout: options.timeout || Rager.config.timeout
39
44
  )
40
45
 
41
46
  response = Rager.config.http_adapter.make_request(request)
42
47
  response_body = T.cast(T.must(response.body), String)
43
48
 
44
- raise Rager::Errors::HttpError.new(Rager.config.http_adapter, response.status, response_body) if response.status != 200
49
+ raise Rager::Errors::HttpError.new(Rager.config.http_adapter, request.url, response.status, body: response_body) if response.status != 200
45
50
 
46
51
  parsed_response = JSON.parse(response_body)
47
- results = parsed_response["results"] || []
52
+ results = parsed_response["results"]
53
+
54
+ results.map do |r|
55
+ score = r["relevance_score"].to_f
56
+ content = input.documents[r["index"]]
57
+ next if content.nil?
48
58
 
49
- results.map do |result|
50
59
  Rager::Rerank::Result.new(
51
- score: result["relevance_score"],
52
- index: result["index"]
60
+ score: score,
61
+ content: content
53
62
  )
54
63
  end
55
64
  end
@@ -6,8 +6,15 @@ require "sorbet-runtime"
6
6
  module Rager
7
7
  module Rerank
8
8
  class Result < T::Struct
9
+ extend T::Sig
10
+
9
11
  const :score, Float
10
- const :index, Integer
12
+ const :content, String
13
+
14
+ sig { params(options: T.untyped).returns(String) }
15
+ def to_json(options = nil)
16
+ serialize.to_json(options)
17
+ end
11
18
  end
12
19
  end
13
20
  end
data/lib/rager/result.rb CHANGED
@@ -4,6 +4,7 @@
4
4
  require "json"
5
5
  require "logger"
6
6
  require "securerandom"
7
+
7
8
  require "sorbet-runtime"
8
9
 
9
10
  module Rager
@@ -25,7 +26,7 @@ module Rager
25
26
  sig { returns(T.nilable(Rager::Types::Output)) }
26
27
  attr_reader :output
27
28
 
28
- sig { returns(Rager::Options) }
29
+ sig { returns(Rager::Types::Options) }
29
30
  attr_reader :options
30
31
 
31
32
  sig { returns(Integer) }
@@ -34,17 +35,29 @@ module Rager
34
35
  sig { returns(Integer) }
35
36
  attr_reader :end_time
36
37
 
38
+ sig { returns(Integer) }
39
+ attr_reader :attempt
40
+
41
+ sig { returns(T::Array[String]) }
42
+ attr_reader :errors
43
+
44
+ sig { returns(T::Array[String]) }
45
+ attr_reader :input_ids
46
+
37
47
  sig { returns(T.nilable(String)) }
38
48
  attr_reader :name
39
49
 
50
+ sig { returns(T::Array[String]) }
51
+ attr_reader :tags
52
+
40
53
  sig { returns(T.nilable(String)) }
41
54
  attr_reader :context_name
42
55
 
43
- sig { returns(T.nilable(T::Array[String])) }
44
- attr_reader :iids
56
+ sig { returns(T::Array[String]) }
57
+ attr_reader :context_tags
45
58
 
46
- sig { returns(T.nilable(String)) }
47
- attr_reader :error
59
+ sig { returns(T.untyped) }
60
+ attr_reader :transform
48
61
 
49
62
  sig do
50
63
  params(
@@ -53,29 +66,20 @@ module Rager
53
66
  operation: Rager::Operation,
54
67
  input: Rager::Types::Input,
55
68
  output: T.nilable(Rager::Types::Output),
56
- options: Rager::Options,
69
+ options: Rager::Types::Options,
57
70
  start_time: Integer,
58
71
  end_time: Integer,
72
+ attempt: Integer,
73
+ errors: T::Array[String],
74
+ input_ids: T::Array[String],
59
75
  name: T.nilable(String),
76
+ tags: T::Array[String],
60
77
  context_name: T.nilable(String),
61
- iids: T.nilable(T::Array[String]),
62
- error: T.nilable(String)
78
+ context_tags: T::Array[String],
79
+ transform: T.untyped
63
80
  ).void
64
81
  end
65
- def initialize(
66
- id:,
67
- context_id:,
68
- operation:,
69
- input:,
70
- output:,
71
- options:,
72
- start_time:,
73
- end_time:,
74
- name: nil,
75
- context_name: nil,
76
- iids: nil,
77
- error: nil
78
- )
82
+ def initialize(id:, context_id:, operation:, input:, output:, options:, start_time:, end_time:, attempt: 0, errors: [], input_ids: [], name: nil, tags: [], context_name: nil, context_tags: [], transform: nil)
79
83
  @id = id
80
84
  @context_id = context_id
81
85
  @operation = operation
@@ -84,10 +88,14 @@ module Rager
84
88
  @options = options
85
89
  @start_time = start_time
86
90
  @end_time = end_time
87
- @name = T.let(name, T.nilable(String))
88
- @context_name = T.let(context_name, T.nilable(String))
89
- @iids = T.let(iids, T.nilable(T::Array[String]))
90
- @error = T.let(error, T.nilable(String))
91
+ @attempt = attempt
92
+ @errors = T.let(errors, T::Array[String])
93
+ @input_ids = T.let(input_ids, T::Array[String])
94
+ @name = name
95
+ @tags = tags
96
+ @context_name = context_name
97
+ @context_tags = T.let(context_tags, T::Array[String])
98
+ @transform = transform
91
99
 
92
100
  @stream = T.let(nil, T.nilable(Rager::Types::Stream))
93
101
  @buffer = T.let([], Rager::Types::Buffer)
@@ -96,7 +104,7 @@ module Rager
96
104
 
97
105
  sig { returns(T::Boolean) }
98
106
  def success?
99
- @error.nil?
107
+ @errors.empty?
100
108
  end
101
109
 
102
110
  sig { returns(T::Boolean) }
@@ -105,7 +113,7 @@ module Rager
105
113
  end
106
114
 
107
115
  sig { returns(Rager::Types::Output) }
108
- def out
116
+ def stream
109
117
  return T.must(@output) unless stream?
110
118
  return @buffer.each if @consumed
111
119
 
@@ -125,62 +133,53 @@ module Rager
125
133
  @stream
126
134
  end
127
135
 
128
- sig { returns(Rager::Types::NonStreamOutput) }
129
- def mat
130
- return T.cast(@output, Rager::Types::NonStreamOutput) unless stream?
131
-
132
- if !@consumed
133
- T.cast(out, Rager::Types::Stream).each { |_| }
134
- end
136
+ sig { returns(T.untyped) }
137
+ def value
138
+ return @transform if @transform
135
139
 
136
- parts = {}
140
+ return T.cast(@output, Rager::Types::NonStreamOutput) unless stream?
137
141
 
138
- @buffer.each do |message_delta|
139
- parts[message_delta.index] =
140
- (parts[message_delta.index] || "") + message_delta.content
141
- end
142
+ T.cast(stream, Rager::Types::Stream).each { |_| } unless @consumed
142
143
 
143
- parts
144
- .sort_by { |index, _| index }
145
- .map { |_, content| content }
144
+ @buffer
145
+ .group_by(&:index)
146
+ .transform_values { |deltas| deltas.map(&:content).join }
147
+ .sort
148
+ .map(&:last)
149
+ .then { |parts| (parts.length == 1) ? parts.first : parts }
146
150
  end
147
151
 
148
152
  sig do
149
- returns(
150
- T.any(
151
- String,
152
- T::Hash[String, T.untyped],
153
- T::Array[T.untyped]
154
- )
155
- )
156
- end
157
- def serialize_input
158
- case @input
159
- when String
160
- @input
161
- when Rager::Rerank::Query
162
- @input.serialize
163
- when Rager::Template::Input
164
- @input.serialize
165
- when Array
166
- @input.map do |item|
167
- if !item.is_a?(String)
168
- item.serialize
169
- else
170
- item
171
- end
172
- end
173
- end
153
+ params(
154
+ block: T.proc.params(
155
+ value: Rager::Types::NonStreamOutput
156
+ ).returns(T.untyped)
157
+ ).returns(Rager::Result)
174
158
  end
175
-
176
- sig { returns(T.nilable(Rager::Types::NonStreamOutput)) }
177
- def serialize_output
178
- return nil unless success?
179
- return @consumed ? mat : "[STREAM]" if stream?
180
- T.cast(@output, Rager::Types::NonStreamOutput)
159
+ def let(&block)
160
+ transform = yield(value)
161
+
162
+ Result.new(
163
+ id: @id,
164
+ context_id: @context_id,
165
+ operation: @operation,
166
+ input: @input,
167
+ output: @output,
168
+ options: @options,
169
+ start_time: @start_time,
170
+ end_time: @end_time,
171
+ attempt: @attempt,
172
+ errors: @errors,
173
+ input_ids: @input_ids,
174
+ name: @name,
175
+ tags: @tags,
176
+ context_name: @context_name,
177
+ context_tags: @context_tags,
178
+ transform: transform
179
+ )
181
180
  end
182
181
 
183
- sig { returns(T::Hash[String, T.untyped]) }
182
+ sig { returns(T::Hash[Symbol, T.untyped]) }
184
183
  def to_h
185
184
  {
186
185
  version: "1",
@@ -188,53 +187,44 @@ module Rager
188
187
  id: @id,
189
188
  context_id: @context_id,
190
189
  operation: @operation.serialize,
191
- input: serialize_input,
192
- output: serialize_output,
190
+ input: @input,
191
+ output: display_output,
193
192
  options: @options.serialize_safe,
194
193
  start_time: @start_time,
195
194
  end_time: @end_time,
195
+ attempt: @attempt,
196
+ errors: @errors,
197
+ input_ids: @input_ids,
196
198
  name: @name,
199
+ tags: @tags,
197
200
  context_name: @context_name,
198
- iids: @iids,
199
- error: @error
201
+ context_tags: @context_tags
200
202
  }
201
203
  }
202
204
  end
203
205
 
206
+ sig { returns(String) }
207
+ def to_json
208
+ to_h.to_json
209
+ end
210
+
204
211
  sig { void }
205
212
  def log
206
- return unless Rager.config.logger_type
207
-
208
- json = to_h.to_json
209
-
210
- logger = Rager.config.logger
211
-
212
- case Rager.config.logger_type
213
- when Rager::Logger::Stdout
214
- success? ? logger.info(json) : logger.error(json)
215
- when Rager::Logger::Remote
216
- http_adapter = Rager.config.http_adapter
217
- url = Rager.config.url
218
- api_key = Rager.config.api_key
219
-
220
- headers = {
221
- "Content-Type" => "application/json",
222
- "Authorization" => "Bearer #{api_key}"
223
- }
213
+ Rager::Utils::Http.log_remote(
214
+ "results",
215
+ to_json,
216
+ !success?
217
+ )
218
+ end
224
219
 
225
- if url && api_key
226
- request = Rager::Http::Request.new(
227
- url: url,
228
- verb: Rager::Http::Verb::Post,
229
- headers: headers,
230
- body: json
231
- )
220
+ private
232
221
 
233
- response = http_adapter.make_request(request)
222
+ sig { returns(T.nilable(Rager::Types::NonStreamOutput)) }
223
+ def display_output
224
+ return nil unless success?
225
+ return @consumed ? value : "[STREAM]" if stream?
234
226
 
235
- logger.warn "Remote log failed: \\#{response.status} \\#{response.body}" unless response.success?
236
- end
237
- end
227
+ T.cast(@output, Rager::Types::NonStreamOutput)
238
228
  end
239
229
  end
240
230
  end
@@ -9,9 +9,12 @@ module Rager
9
9
  extend T::Sig
10
10
  include Rager::Options
11
11
 
12
- const :provider, String, default: "brave"
12
+ const :provider, Symbol, default: :jina
13
13
  const :n, T.nilable(Integer)
14
+ const :pagination, T.nilable(Integer)
15
+ const :max_length, T.nilable(Integer)
14
16
  const :api_key, T.nilable(String)
17
+ const :timeout, T.nilable(Numeric)
15
18
  end
16
19
  end
17
20
  end