riffer 0.40.0 → 0.41.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/.agents/providers.md +10 -1
  3. data/.agents/rbs-inline.md +2 -2
  4. data/.release-please-manifest.json +1 -1
  5. data/CHANGELOG.md +11 -0
  6. data/README.md +20 -24
  7. data/docs/AGENTS.md +0 -11
  8. data/docs/CONFIGURATION.md +105 -21
  9. data/docs/SERIALIZATION.md +4 -3
  10. data/docs/providers/AMAZON_BEDROCK.md +14 -8
  11. data/docs/providers/ANTHROPIC.md +9 -7
  12. data/docs/providers/AZURE_OPENAI.md +12 -12
  13. data/docs/providers/CUSTOM_PROVIDERS.md +32 -16
  14. data/docs/providers/GEMINI.md +28 -5
  15. data/docs/providers/OPENAI.md +21 -5
  16. data/docs/providers/OPENROUTER.md +11 -6
  17. data/docs/providers/PROVIDERS.md +16 -1
  18. data/lib/riffer/agent/config.rb +0 -6
  19. data/lib/riffer/agent/serializer.rb +0 -2
  20. data/lib/riffer/agent.rb +1 -9
  21. data/lib/riffer/config.rb +6 -6
  22. data/lib/riffer/evals/judge.rb +3 -5
  23. data/lib/riffer/providers/amazon_bedrock.rb +31 -19
  24. data/lib/riffer/providers/anthropic.rb +19 -8
  25. data/lib/riffer/providers/azure_open_ai.rb +19 -11
  26. data/lib/riffer/providers/base.rb +28 -0
  27. data/lib/riffer/providers/gemini/client.rb +120 -0
  28. data/lib/riffer/providers/gemini.rb +13 -62
  29. data/lib/riffer/providers/mock.rb +5 -4
  30. data/lib/riffer/providers/open_ai.rb +23 -8
  31. data/lib/riffer/providers/open_router.rb +23 -9
  32. data/lib/riffer/version.rb +1 -1
  33. data/sig/_private/riffer/providers/amazon_bedrock.rbs +4 -2
  34. data/sig/_private/riffer/providers/anthropic.rbs +4 -2
  35. data/sig/_private/riffer/providers/gemini.rbs +7 -0
  36. data/sig/_private/riffer/providers/open_ai.rbs +4 -2
  37. data/sig/_private/riffer/providers/open_router.rbs +4 -2
  38. data/sig/generated/riffer/agent/config.rbs +1 -5
  39. data/sig/generated/riffer/agent.rbs +0 -6
  40. data/sig/generated/riffer/config.rbs +25 -15
  41. data/sig/generated/riffer/evals/judge.rbs +2 -4
  42. data/sig/generated/riffer/providers/amazon_bedrock.rbs +13 -2
  43. data/sig/generated/riffer/providers/anthropic.rbs +13 -2
  44. data/sig/generated/riffer/providers/azure_open_ai.rbs +14 -4
  45. data/sig/generated/riffer/providers/base.rbs +20 -0
  46. data/sig/generated/riffer/providers/gemini/client.rbs +65 -0
  47. data/sig/generated/riffer/providers/gemini.rbs +7 -23
  48. data/sig/generated/riffer/providers/mock.rbs +4 -3
  49. data/sig/generated/riffer/providers/open_ai.rbs +13 -2
  50. data/sig/generated/riffer/providers/open_router.rbs +16 -3
  51. metadata +4 -1
@@ -2,20 +2,8 @@
2
2
 
3
3
  # Google Gemini provider for Gemini models via the Gemini REST API.
4
4
  class Riffer::Providers::Gemini < Riffer::Providers::Base
5
- @read_timeout: Integer
6
-
7
- @open_timeout: Integer
8
-
9
- @api_key: String?
10
-
11
- BASE_URI: URI::Generic
12
-
13
5
  VALID_MODEL_PATTERN: Regexp
14
6
 
15
- DEFAULT_OPEN_TIMEOUT: Integer
16
-
17
- DEFAULT_READ_TIMEOUT: Integer
18
-
19
7
  FINISH_REASONS: Hash[String, Symbol]
20
8
 
21
9
  # The GenAI semconv well-known provider name.
@@ -23,11 +11,15 @@ class Riffer::Providers::Gemini < Riffer::Providers::Base
23
11
  # : () -> String
24
12
  def self.semconv_provider_name: () -> String
25
13
 
14
+ private
15
+
26
16
  # --
27
- # : (?api_key: String?, ?open_timeout: Integer?, ?read_timeout: Integer?, **untyped) -> void
28
- def initialize: (?api_key: String?, ?open_timeout: Integer?, ?read_timeout: Integer?, **untyped) -> void
17
+ # : () -> untyped
18
+ def global_client: () -> untyped
29
19
 
30
- private
20
+ # --
21
+ # : () -> untyped
22
+ def build_client: () -> untyped
31
23
 
32
24
  # --
33
25
  # : (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
@@ -89,10 +81,6 @@ class Riffer::Providers::Gemini < Riffer::Providers::Base
89
81
  # : (untyped) -> String
90
82
  def encode_tool_arguments: (untyped) -> String
91
83
 
92
- # --
93
- # : (String, Hash[Symbol, untyped]) -> Net::HTTPResponse
94
- def post_request: (String, Hash[Symbol, untyped]) -> Net::HTTPResponse
95
-
96
84
  # --
97
85
  # : (String, String) -> String
98
86
  def api_path: (String, String) -> String
@@ -104,8 +92,4 @@ class Riffer::Providers::Gemini < Riffer::Providers::Base
104
92
  # --
105
93
  # : (Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
106
94
  def strip_additional_properties: (Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
107
-
108
- # --
109
- # : (Net::HTTPResponse) -> void
110
- def handle_api_error!: (Net::HTTPResponse) -> void
111
95
  end
@@ -23,7 +23,8 @@ class Riffer::Providers::Mock < Riffer::Providers::Base
23
23
  attr_reader calls: Array[Hash[Symbol, untyped]]
24
24
 
25
25
  # +responses:+ pre-configures canned responses (same shape as
26
- # +#stub_response+), typically set via +provider_options responses: [...]+.
26
+ # +#stub_response+) for standalone use; agent tests queue responses on
27
+ # <tt>agent.provider</tt> via +#stub_response+ instead.
27
28
  #
28
29
  # Riffer::Providers::Mock.new(responses: [
29
30
  # {content: "", tool_calls: [{name: "tool_a", arguments: "{}"}]},
@@ -31,8 +32,8 @@ class Riffer::Providers::Mock < Riffer::Providers::Base
31
32
  # ])
32
33
  #
33
34
  # --
34
- # : (**untyped) -> void
35
- def initialize: (**untyped) -> void
35
+ # : (?responses: Array[Hash[Symbol, untyped]]) -> void
36
+ def initialize: (?responses: Array[Hash[Symbol, untyped]]) -> void
36
37
 
37
38
  # Stubs the next response; call repeatedly to queue several. +finish_reason+
38
39
  # defaults to +:tool_calls+ when tool calls are present, else +:stop+.
@@ -10,11 +10,22 @@ class Riffer::Providers::OpenAI < Riffer::Providers::Base
10
10
  def self.semconv_provider_name: () -> String
11
11
 
12
12
  # --
13
- # : (**untyped) -> void
14
- def initialize: (**untyped) -> void
13
+ # : () -> void
14
+ def initialize: () -> void
15
15
 
16
16
  private
17
17
 
18
+ # --
19
+ # : () -> untyped
20
+ def global_client: () -> untyped
21
+
22
+ # Compacted so an unset value stays absent: the SDK reads +OPENAI_API_KEY+ /
23
+ # +OPENAI_BASE_URL+ only for a missing argument, and an explicit nil would
24
+ # suppress that fallback.
25
+ # --
26
+ # : () -> untyped
27
+ def build_client: () -> untyped
28
+
18
29
  # --
19
30
  # : (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
20
31
  def build_request_params: (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
@@ -2,7 +2,7 @@
2
2
 
3
3
  # OpenRouter provider (https://openrouter.ai). Requires the +openai+ gem —
4
4
  # OpenRouter exposes an OpenAI-compatible endpoint, so this reuses the OpenAI
5
- # SDK with a +base_url+ override. +api_key+ falls back to config, then
5
+ # SDK with a +base_url+ override. +api_key+ resolves from config, then
6
6
  # +OPENROUTER_API_KEY+.
7
7
  class Riffer::Providers::OpenRouter < Riffer::Providers::Base
8
8
  BASE_URL: String
@@ -15,11 +15,24 @@ class Riffer::Providers::OpenRouter < Riffer::Providers::Base
15
15
  def self.semconv_provider_name: () -> String
16
16
 
17
17
  # --
18
- # : (?api_key: String?, **untyped) -> void
19
- def initialize: (?api_key: String?, **untyped) -> void
18
+ # : () -> void
19
+ def initialize: () -> void
20
20
 
21
21
  private
22
22
 
23
+ # --
24
+ # : () -> untyped
25
+ def global_client: () -> untyped
26
+
27
+ # Deliberately not compacted: this borrows the OpenAI SDK to talk to a
28
+ # different vendor, so omitting an unset +api_key+ would let the SDK fall
29
+ # back to +OPENAI_API_KEY+ and send an OpenAI credential to OpenRouter.
30
+ # Passing nil raises in the SDK instead. +OPENROUTER_API_KEY+ is read here
31
+ # rather than left to the SDK for the same reason.
32
+ # --
33
+ # : () -> untyped
34
+ def build_client: () -> untyped
35
+
23
36
  # --
24
37
  # : (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
25
38
  def build_request_params: (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: riffer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.40.0
4
+ version: 0.41.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jake Bottrall
@@ -151,6 +151,7 @@ files:
151
151
  - lib/riffer/providers/base.rb
152
152
  - lib/riffer/providers/finish_reason.rb
153
153
  - lib/riffer/providers/gemini.rb
154
+ - lib/riffer/providers/gemini/client.rb
154
155
  - lib/riffer/providers/mock.rb
155
156
  - lib/riffer/providers/open_ai.rb
156
157
  - lib/riffer/providers/open_router.rb
@@ -209,6 +210,7 @@ files:
209
210
  - sig/_private/opentelemetry.rbs
210
211
  - sig/_private/riffer/providers/amazon_bedrock.rbs
211
212
  - sig/_private/riffer/providers/anthropic.rbs
213
+ - sig/_private/riffer/providers/gemini.rbs
212
214
  - sig/_private/riffer/providers/open_ai.rbs
213
215
  - sig/_private/riffer/providers/open_router.rbs
214
216
  - sig/_private/zeitwerk.rbs
@@ -268,6 +270,7 @@ files:
268
270
  - sig/generated/riffer/providers/base.rbs
269
271
  - sig/generated/riffer/providers/finish_reason.rbs
270
272
  - sig/generated/riffer/providers/gemini.rbs
273
+ - sig/generated/riffer/providers/gemini/client.rbs
271
274
  - sig/generated/riffer/providers/mock.rbs
272
275
  - sig/generated/riffer/providers/open_ai.rbs
273
276
  - sig/generated/riffer/providers/open_router.rbs