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
data/lib/rager/chat.rb DELETED
@@ -1,35 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- require "sorbet-runtime"
5
-
6
- module Rager
7
- module Chat
8
- extend T::Sig
9
-
10
- sig do
11
- params(
12
- messages: Rager::Types::ChatInput,
13
- options: Rager::Chat::Options
14
- ).returns(Rager::Types::ChatOutput)
15
- end
16
- def self.chat(messages, options = Rager::Chat::Options.new)
17
- provider = get_provider(options.provider)
18
- provider.chat(messages, options)
19
- end
20
-
21
- sig do
22
- params(
23
- key: String
24
- ).returns(Rager::Chat::Providers::Abstract)
25
- end
26
- def self.get_provider(key)
27
- case key.downcase
28
- when "openai"
29
- Rager::Chat::Providers::Openai.new
30
- else
31
- raise Rager::Errors::UnknownProviderError.new(Rager::Operation::Chat, key)
32
- end
33
- end
34
- end
35
- end
data/lib/rager/embed.rb DELETED
@@ -1,35 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- require "sorbet-runtime"
5
-
6
- module Rager
7
- module Embed
8
- extend T::Sig
9
-
10
- sig do
11
- params(
12
- text: Rager::Types::EmbedInput,
13
- options: Rager::Embed::Options
14
- ).returns(Rager::Types::EmbedOutput)
15
- end
16
- def self.embed(text, options = Rager::Embed::Options.new)
17
- provider = get_provider(options.provider)
18
- provider.embed(text, options)
19
- end
20
-
21
- sig do
22
- params(
23
- key: String
24
- ).returns(Rager::Embed::Providers::Abstract)
25
- end
26
- def self.get_provider(key)
27
- case key.downcase
28
- when "openai"
29
- Rager::Embed::Providers::Openai.new
30
- else
31
- raise Rager::Errors::UnknownProviderError.new(Rager::Operation::Embed, key)
32
- end
33
- end
34
- end
35
- end
@@ -1,19 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- require "sorbet-runtime"
5
-
6
- module Rager
7
- module Errors
8
- class MissingCredentialsError < Rager::Error
9
- extend T::Sig
10
-
11
- sig { params(provider_name: String, env_var: T.nilable(String)).void }
12
- def initialize(provider_name, env_var = nil)
13
- message = "Missing credentials for provider #{provider_name}"
14
- message += " -- attempted lookup with #{env_var}" if env_var
15
- super(message)
16
- end
17
- end
18
- end
19
- end
@@ -1,17 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- require "sorbet-runtime"
5
-
6
- module Rager
7
- module Errors
8
- class UnknownProviderError < Rager::Error
9
- extend T::Sig
10
-
11
- sig { params(operation: Rager::Operation, key: String).void }
12
- def initialize(operation, key)
13
- super("Unknown provider #{key} for operation #{operation.serialize}")
14
- end
15
- end
16
- end
17
- end
@@ -1,31 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- require "sorbet-runtime"
5
-
6
- module Rager
7
- module ImageGen
8
- extend T::Sig
9
-
10
- sig do
11
- params(
12
- prompt: Rager::Types::ImageGenInput,
13
- options: Rager::ImageGen::Options
14
- ).returns(Rager::Types::ImageGenOutput)
15
- end
16
- def self.image_gen(prompt, options = Rager::ImageGen::Options.new)
17
- provider = get_provider(options.provider)
18
- provider.image_gen(prompt, options)
19
- end
20
-
21
- sig { params(key: String).returns(Rager::ImageGen::Providers::Abstract) }
22
- def self.get_provider(key)
23
- case key.downcase
24
- when "replicate"
25
- Rager::ImageGen::Providers::Replicate.new
26
- else
27
- raise Rager::Errors::UnknownProviderError.new(Rager::Operation::ImageGen, key)
28
- end
29
- end
30
- end
31
- end
@@ -1,31 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- require "sorbet-runtime"
5
-
6
- module Rager
7
- module MeshGen
8
- extend T::Sig
9
-
10
- sig do
11
- params(
12
- image_url: Rager::Types::MeshGenInput,
13
- options: Rager::MeshGen::Options
14
- ).returns(Rager::Types::MeshGenOutput)
15
- end
16
- def self.mesh_gen(image_url, options = Rager::MeshGen::Options.new)
17
- provider = get_provider(options.provider)
18
- provider.mesh_gen(image_url, options)
19
- end
20
-
21
- sig { params(key: String).returns(Rager::MeshGen::Providers::Abstract) }
22
- def self.get_provider(key)
23
- case key.downcase
24
- when "replicate"
25
- Rager::MeshGen::Providers::Replicate.new
26
- else
27
- raise Rager::Errors::UnknownProviderError.new(Rager::Operation::MeshGen, key)
28
- end
29
- end
30
- end
31
- end
data/lib/rager/rerank.rb DELETED
@@ -1,35 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- require "sorbet-runtime"
5
-
6
- module Rager
7
- module Rerank
8
- extend T::Sig
9
-
10
- sig do
11
- params(
12
- query: Rager::Types::RerankInput,
13
- options: Rager::Rerank::Options
14
- ).returns(Rager::Types::RerankOutput)
15
- end
16
- def self.rerank(query, options = Rager::Rerank::Options.new)
17
- provider = get_provider(options.provider)
18
- provider.rerank(query, options)
19
- end
20
-
21
- sig do
22
- params(
23
- key: String
24
- ).returns(Rager::Rerank::Providers::Abstract)
25
- end
26
- def self.get_provider(key)
27
- case key.downcase
28
- when "cohere"
29
- Rager::Rerank::Providers::Cohere.new
30
- else
31
- raise Rager::Errors::UnknownProviderError.new(Rager::Operation::Rerank, key)
32
- end
33
- end
34
- end
35
- end
@@ -1,59 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- require "json"
5
- require "uri"
6
- require "sorbet-runtime"
7
-
8
- module Rager
9
- module Search
10
- module Providers
11
- class Brave < Rager::Search::Providers::Abstract
12
- extend T::Sig
13
-
14
- sig do
15
- override.params(
16
- query: String,
17
- options: Rager::Search::Options
18
- ).returns(Rager::Types::SearchOutput)
19
- end
20
- def search(query, options)
21
- api_key = options.api_key || ENV["BRAVE_API_KEY"]
22
- raise Rager::Errors::MissingCredentialsError.new("Brave", "BRAVE_API_KEY") if api_key.nil?
23
-
24
- params = {"q" => query}.tap do |p|
25
- p["count"] = options.n.to_s if options.n
26
- end
27
-
28
- request = Rager::Http::Request.new(
29
- verb: Rager::Http::Verb::Get,
30
- url: "https://api.search.brave.com/res/v1/web/search?#{URI.encode_www_form(params)}",
31
- headers: {
32
- "Accept" => "application/json",
33
- "Accept-Encoding" => "gzip",
34
- "x-subscription-token" => api_key
35
- }
36
- )
37
-
38
- response = Rager.config.http_adapter.make_request(request)
39
- response_body = T.cast(T.must(response.body), String)
40
-
41
- raise Rager::Errors::HttpError.new(Rager.config.http_adapter, response.status, response_body) if response.status != 200
42
-
43
- parsed_response = JSON.parse(response_body)
44
- web_results = parsed_response.dig("web", "results") || []
45
-
46
- web_results.filter_map do |result|
47
- next unless result["title"] && result["url"] && result["description"]
48
-
49
- Rager::Search::Result.new(
50
- title: result["title"],
51
- url: result["url"],
52
- description: result["description"]
53
- )
54
- end
55
- end
56
- end
57
- end
58
- end
59
- end
data/lib/rager/search.rb DELETED
@@ -1,35 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- require "sorbet-runtime"
5
-
6
- module Rager
7
- module Search
8
- extend T::Sig
9
-
10
- sig do
11
- params(
12
- query: Rager::Types::SearchInput,
13
- options: Rager::Search::Options
14
- ).returns(Rager::Types::SearchOutput)
15
- end
16
- def self.search(query, options = Rager::Search::Options.new)
17
- provider = get_provider(options.provider)
18
- provider.search(query, options)
19
- end
20
-
21
- sig do
22
- params(
23
- key: String
24
- ).returns(Rager::Search::Providers::Abstract)
25
- end
26
- def self.get_provider(key)
27
- case key.downcase
28
- when "brave"
29
- Rager::Search::Providers::Brave.new
30
- else
31
- raise Rager::Errors::UnknownProviderError.new(Rager::Operation::Search, key)
32
- end
33
- end
34
- end
35
- end
@@ -1,35 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- require "sorbet-runtime"
5
-
6
- module Rager
7
- module Template
8
- extend T::Sig
9
-
10
- sig do
11
- params(
12
- input: Rager::Types::TemplateInput,
13
- options: Rager::Template::Options
14
- ).returns(Rager::Types::TemplateOutput)
15
- end
16
- def self.template(input, options = Rager::Template::Options.new)
17
- provider = get_provider(options.provider)
18
- provider.template(input, options)
19
- end
20
-
21
- sig do
22
- params(
23
- key: String
24
- ).returns(Rager::Template::Providers::Abstract)
25
- end
26
- def self.get_provider(key)
27
- case key.downcase
28
- when "erb"
29
- Rager::Template::Providers::Erb.new
30
- else
31
- raise Rager::Errors::UnknownProviderError.new(Rager::Operation::Template, key)
32
- end
33
- end
34
- end
35
- end