riffer 0.52.1 → 0.54.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 (68) hide show
  1. checksums.yaml +4 -4
  2. data/.claude/rules/rbs-inline.md +2 -2
  3. data/.release-please-manifest.json +1 -1
  4. data/CHANGELOG.md +22 -0
  5. data/Steepfile +19 -0
  6. data/docs/AGENTS.md +81 -4
  7. data/docs/CATALOG.md +205 -0
  8. data/docs/CONFIGURATION.md +35 -23
  9. data/docs/MESSAGES.md +1 -1
  10. data/docs/OVERVIEW.md +1 -1
  11. data/docs/SERIALIZATION.md +1 -0
  12. data/docs/TOOLS.md +15 -12
  13. data/docs/TRACING.md +2 -1
  14. data/docs/providers/AMAZON_BEDROCK.md +2 -0
  15. data/docs/providers/ANTHROPIC.md +2 -0
  16. data/docs/providers/AZURE_OPENAI.md +2 -0
  17. data/docs/providers/CUSTOM_PROVIDERS.md +15 -1
  18. data/docs/providers/GEMINI.md +11 -0
  19. data/docs/providers/MOCK_PROVIDER.md +2 -0
  20. data/docs/providers/OPENAI.md +2 -0
  21. data/docs/providers/OPENROUTER.md +2 -0
  22. data/docs-site/manifest.yml +3 -0
  23. data/lib/riffer/agent/config.rb +17 -0
  24. data/lib/riffer/agent/run.rb +2 -0
  25. data/lib/riffer/agent/serializer.rb +2 -0
  26. data/lib/riffer/agent/structured_output.rb +23 -3
  27. data/lib/riffer/agent.rb +7 -0
  28. data/lib/riffer/{config/pricing → catalog}/rates.rb +21 -6
  29. data/lib/riffer/catalog.rb +225 -0
  30. data/lib/riffer/config/pricing.rb +17 -27
  31. data/lib/riffer/config.rb +29 -0
  32. data/lib/riffer/params/any_of.rb +22 -0
  33. data/lib/riffer/params/format.rb +73 -0
  34. data/lib/riffer/params/param.rb +120 -17
  35. data/lib/riffer/params.rb +135 -24
  36. data/lib/riffer/providers/amazon_bedrock.rb +14 -0
  37. data/lib/riffer/providers/anthropic.rb +8 -0
  38. data/lib/riffer/providers/base.rb +67 -15
  39. data/lib/riffer/providers/gemini.rb +7 -0
  40. data/lib/riffer/providers/mock.rb +7 -0
  41. data/lib/riffer/providers/open_ai.rb +6 -0
  42. data/lib/riffer/providers/open_router.rb +6 -0
  43. data/lib/riffer/version.rb +1 -1
  44. data/lib/riffer.rb +2 -0
  45. data/rbs_collection.lock.yaml +8 -0
  46. data/rbs_collection.yaml +2 -0
  47. data/sig/generated/riffer/agent/config.rbs +10 -1
  48. data/sig/generated/riffer/agent/structured_output.rbs +6 -0
  49. data/sig/generated/riffer/agent.rbs +4 -0
  50. data/sig/generated/riffer/{config/pricing → catalog}/rates.rbs +10 -4
  51. data/sig/generated/riffer/catalog.rbs +77 -0
  52. data/sig/generated/riffer/config/pricing.rbs +12 -11
  53. data/sig/generated/riffer/config.rbs +17 -0
  54. data/sig/generated/riffer/params/any_of.rbs +13 -0
  55. data/sig/generated/riffer/params/format.rbs +39 -0
  56. data/sig/generated/riffer/params/param.rbs +22 -4
  57. data/sig/generated/riffer/params.rbs +34 -8
  58. data/sig/generated/riffer/providers/amazon_bedrock.rbs +6 -0
  59. data/sig/generated/riffer/providers/anthropic.rbs +4 -0
  60. data/sig/generated/riffer/providers/base.rbs +22 -2
  61. data/sig/generated/riffer/providers/gemini.rbs +4 -0
  62. data/sig/generated/riffer/providers/mock.rbs +5 -0
  63. data/sig/generated/riffer/providers/open_ai.rbs +4 -0
  64. data/sig/generated/riffer/providers/open_router.rbs +4 -0
  65. data/sig/generated/riffer.rbs +1 -0
  66. data/sig/manifest.yaml +2 -1
  67. data/sig/manual/riffer/params/format.rbs +5 -0
  68. metadata +11 -3
@@ -14,12 +14,16 @@ class Riffer::Params
14
14
  def self.from_json_schema: (Hash[Symbol, untyped]) -> Riffer::Params
15
15
 
16
16
  # --
17
- # : (Symbol, Module, ?description: String?, ?enum: Array[untyped]?, ?of: Module?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> void
18
- def required: (Symbol, Module, ?description: String?, ?enum: Array[untyped]?, ?of: Module?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> void
17
+ # : (Symbol, singleton(Riffer::Params::AnyOf), ?description: String?) { (Riffer::Params::AnyOf) [self: Riffer::Params::AnyOf] -> void } -> void
18
+ # : (Symbol, Module, ?description: String?, ?enum: Array[untyped]?, ?format: String?, ?of: (Module | Array[untyped])?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> void
19
+ def required: (Symbol, singleton(Riffer::Params::AnyOf), ?description: String?) { (Riffer::Params::AnyOf) [self: Riffer::Params::AnyOf] -> void } -> void
20
+ | (Symbol, Module, ?description: String?, ?enum: Array[untyped]?, ?format: String?, ?of: (Module | Array[untyped])?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> void
19
21
 
20
22
  # --
21
- # : (Symbol, Module, ?description: String?, ?enum: Array[untyped]?, ?default: untyped, ?of: Module?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> void
22
- def optional: (Symbol, Module, ?description: String?, ?enum: Array[untyped]?, ?default: untyped, ?of: Module?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> void
23
+ # : (Symbol, singleton(Riffer::Params::AnyOf), ?description: String?, ?default: untyped) { (Riffer::Params::AnyOf) [self: Riffer::Params::AnyOf] -> void } -> void
24
+ # : (Symbol, Module, ?description: String?, ?enum: Array[untyped]?, ?format: String?, ?default: untyped, ?of: (Module | Array[untyped])?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> void
25
+ def optional: (Symbol, singleton(Riffer::Params::AnyOf), ?description: String?, ?default: untyped) { (Riffer::Params::AnyOf) [self: Riffer::Params::AnyOf] -> void } -> void
26
+ | (Symbol, Module, ?description: String?, ?enum: Array[untyped]?, ?format: String?, ?default: untyped, ?of: (Module | Array[untyped])?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> void
23
27
 
24
28
  # --
25
29
  # : (Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
@@ -38,8 +42,16 @@ class Riffer::Params
38
42
  def initialize_copy: (Riffer::Params) -> void
39
43
 
40
44
  # --
41
- # : (Module, Module?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> Riffer::Params?
42
- def build_nested: (Module, Module?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> Riffer::Params?
45
+ # : ((Module | Array[untyped])?, ?Integer) -> [Module?, Integer]
46
+ def unwrap_of: ((Module | Array[untyped])?, ?Integer) -> [ Module?, Integer ]
47
+
48
+ # --
49
+ # : (Module, Module?, Array[untyped]?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> Riffer::Params?
50
+ def build_nested: (Module, Module?, Array[untyped]?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> Riffer::Params?
51
+
52
+ # --
53
+ # : ((Module | Array[untyped])?, Array[untyped]?) ?{ (Riffer::Params::AnyOf) [self: Riffer::Params::AnyOf] -> void } -> Array[Riffer::Params]
54
+ def build_variants: ((Module | Array[untyped])?, Array[untyped]?) ?{ (Riffer::Params::AnyOf) [self: Riffer::Params::AnyOf] -> void } -> Array[Riffer::Params]
43
55
 
44
56
  # --
45
57
  # : (Riffer::Params::Param, untyped, Array[String]) -> untyped
@@ -49,13 +61,27 @@ class Riffer::Params
49
61
  # : (Riffer::Params::Param, Hash[Symbol, untyped], Array[String]) -> Hash[Symbol, untyped]
50
62
  def validate_nested_hash: (Riffer::Params::Param, Hash[Symbol, untyped], Array[String]) -> Hash[Symbol, untyped]
51
63
 
64
+ # --
65
+ # : (Riffer::Params::Param, Hash[Symbol, untyped], Array[String]) -> Hash[Symbol, untyped]
66
+ def validate_any_of: (Riffer::Params::Param, Hash[Symbol, untyped], Array[String]) -> Hash[Symbol, untyped]
67
+
68
+ # Validation drops keys a Params doesn't declare, at any depth, so they are
69
+ # the keys in the input that are missing from the output.
70
+ # --
71
+ # : (untyped, untyped, ?String?) -> Array[String]
72
+ def undeclared_keys: (untyped, untyped, ?String?) -> Array[String]
73
+
52
74
  # --
53
75
  # : (Riffer::Params::Param, Array[untyped], Array[String]) -> Array[untyped]
54
76
  def validate_nested_array_of_objects: (Riffer::Params::Param, Array[untyped], Array[String]) -> Array[untyped]
55
77
 
56
78
  # --
57
- # : (Riffer::Params::Param, Array[untyped], Array[String]) -> Array[untyped]
58
- def validate_typed_array: (Riffer::Params::Param, Array[untyped], Array[String]) -> Array[untyped]
79
+ # : (Riffer::Params::Param, Array[untyped], Array[String], ?String, ?Integer) -> Array[untyped]
80
+ def validate_typed_array: (Riffer::Params::Param, Array[untyped], Array[String], ?String, ?Integer) -> Array[untyped]
81
+
82
+ # --
83
+ # : (Module, untyped) -> bool
84
+ def valid_item?: (Module, untyped) -> bool
59
85
 
60
86
  # --
61
87
  # : (Module, untyped) -> untyped
@@ -36,6 +36,12 @@ class Riffer::Providers::AmazonBedrock < Riffer::Providers::Base
36
36
  # : () -> untyped
37
37
  def build_client: () -> untyped
38
38
 
39
+ # Claude's fields, since application inference profile ARNs hide the model
40
+ # family; other families need a catalog entry.
41
+ # --
42
+ # : (Symbol) -> Hash[Symbol, untyped]
43
+ def default_reasoning_options: (Symbol) -> Hash[Symbol, untyped]
44
+
39
45
  # --
40
46
  # : (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
41
47
  def build_request_params: (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
@@ -32,6 +32,10 @@ class Riffer::Providers::Anthropic < Riffer::Providers::Base
32
32
  # : () -> untyped
33
33
  def build_client: () -> untyped
34
34
 
35
+ # --
36
+ # : (Symbol) -> Hash[Symbol, untyped]
37
+ def default_reasoning_options: (Symbol) -> Hash[Symbol, untyped]
38
+
35
39
  # --
36
40
  # : (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
37
41
  def build_request_params: (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
@@ -76,8 +76,28 @@ class Riffer::Providers::Base
76
76
  def apply_pricing: (Riffer::Providers::TokenUsage) -> Riffer::Providers::TokenUsage
77
77
 
78
78
  # --
79
- # : () -> Riffer::Config::Pricing::Rates?
80
- def pricing_rates: () -> Riffer::Config::Pricing::Rates?
79
+ # : () -> Riffer::Catalog::Rates?
80
+ def pricing_rates: () -> Riffer::Catalog::Rates?
81
+
82
+ # --
83
+ # : (String) -> String?
84
+ def catalog_key: (String) -> String?
85
+
86
+ # A catalog fragment beats the provider default per level; the caller's
87
+ # options are merged over either, so +model_options+ always wins.
88
+ # --
89
+ # : (String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
90
+ def apply_reasoning: (String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
91
+
92
+ # Maps a level onto the provider's own reasoning params when the catalog has
93
+ # no entry; +nil+ means riffer raises before the request.
94
+ # --
95
+ # : (Symbol) -> Hash[Symbol, untyped]?
96
+ def default_reasoning_options: (Symbol) -> Hash[Symbol, untyped]?
97
+
98
+ # --
99
+ # : (Hash[Symbol, untyped], Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
100
+ def deep_merge: (Hash[Symbol, untyped], Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
81
101
 
82
102
  # --
83
103
  # : (untyped) -> Riffer::Providers::FinishReason?
@@ -23,6 +23,10 @@ class Riffer::Providers::Gemini < Riffer::Providers::Base
23
23
  # : () -> untyped
24
24
  def build_client: () -> untyped
25
25
 
26
+ # --
27
+ # : (Symbol) -> Hash[Symbol, untyped]
28
+ def default_reasoning_options: (Symbol) -> Hash[Symbol, untyped]
29
+
26
30
  # --
27
31
  # : (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
28
32
  def build_request_params: (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
@@ -35,6 +35,11 @@ class Riffer::Providers::Mock < Riffer::Providers::Base
35
35
  # : (Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
36
36
  def normalize_response: (Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
37
37
 
38
+ # Never raises, so test suites can set +reasoning+ without catalog entries.
39
+ # --
40
+ # : (Symbol) -> Hash[Symbol, untyped]
41
+ def default_reasoning_options: (Symbol) -> Hash[Symbol, untyped]
42
+
38
43
  # --
39
44
  # : (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
40
45
  def build_request_params: (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
@@ -29,6 +29,10 @@ class Riffer::Providers::OpenAI < Riffer::Providers::Base
29
29
  # : () -> untyped
30
30
  def build_client: () -> untyped
31
31
 
32
+ # --
33
+ # : (Symbol) -> Hash[Symbol, untyped]
34
+ def default_reasoning_options: (Symbol) -> Hash[Symbol, untyped]
35
+
32
36
  # --
33
37
  # : (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
34
38
  def build_request_params: (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
@@ -34,6 +34,10 @@ class Riffer::Providers::OpenRouter < Riffer::Providers::Base
34
34
  # : () -> untyped
35
35
  def build_client: () -> untyped
36
36
 
37
+ # --
38
+ # : (Symbol) -> Hash[Symbol, untyped]
39
+ def default_reasoning_options: (Symbol) -> Hash[Symbol, untyped]
40
+
37
41
  # --
38
42
  # : (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
39
43
  def build_request_params: (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
@@ -55,6 +55,7 @@ module Riffer
55
55
  # : () -> Riffer::Config
56
56
  def config: () -> Riffer::Config
57
57
 
58
+ # Builds the catalog after the block, so a bad catalog file fails boot.
58
59
  # --
59
60
  # : () ?{ (Riffer::Config) -> void } -> void
60
61
  def configure: () ?{ (Riffer::Config) -> void } -> void
data/sig/manifest.yaml CHANGED
@@ -1,4 +1,5 @@
1
1
  dependencies:
2
2
  - name: uri
3
3
  - name: net-http
4
- - name: digest
4
+ - name: digest
5
+ - name: ipaddr
@@ -0,0 +1,5 @@
1
+ # `Riffer::Params::Format` uses `extend self`; rbs-inline doesn't emit that,
2
+ # so re-extend here to expose its instance methods as singleton methods.
3
+ module Riffer::Params::Format
4
+ extend ::Riffer::Params::Format
5
+ end
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.52.1
4
+ version: 0.54.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jake Bottrall
@@ -83,6 +83,7 @@ files:
83
83
  - docs/AGENTS.md
84
84
  - docs/AGENT_LIFECYCLE.md
85
85
  - docs/AGENT_LOOP.md
86
+ - docs/CATALOG.md
86
87
  - docs/CONFIGURATION.md
87
88
  - docs/EVALS.md
88
89
  - docs/GETTING_STARTED.md
@@ -119,6 +120,8 @@ files:
119
120
  - lib/riffer/agent/structured_output.rb
120
121
  - lib/riffer/agent/structured_output/parser.rb
121
122
  - lib/riffer/agent/structured_output/result.rb
123
+ - lib/riffer/catalog.rb
124
+ - lib/riffer/catalog/rates.rb
122
125
  - lib/riffer/config.rb
123
126
  - lib/riffer/config/amazon_bedrock.rb
124
127
  - lib/riffer/config/anthropic.rb
@@ -130,7 +133,6 @@ files:
130
133
  - lib/riffer/config/open_ai.rb
131
134
  - lib/riffer/config/open_router.rb
132
135
  - lib/riffer/config/pricing.rb
133
- - lib/riffer/config/pricing/rates.rb
134
136
  - lib/riffer/config/skills.rb
135
137
  - lib/riffer/config/tracing.rb
136
138
  - lib/riffer/evals.rb
@@ -175,7 +177,9 @@ files:
175
177
  - lib/riffer/messages/user.rb
176
178
  - lib/riffer/messages/user/file_part.rb
177
179
  - lib/riffer/params.rb
180
+ - lib/riffer/params/any_of.rb
178
181
  - lib/riffer/params/boolean.rb
182
+ - lib/riffer/params/format.rb
179
183
  - lib/riffer/params/param.rb
180
184
  - lib/riffer/providers.rb
181
185
  - lib/riffer/providers/amazon_bedrock.rb
@@ -268,6 +272,8 @@ files:
268
272
  - sig/generated/riffer/agent/structured_output.rbs
269
273
  - sig/generated/riffer/agent/structured_output/parser.rbs
270
274
  - sig/generated/riffer/agent/structured_output/result.rbs
275
+ - sig/generated/riffer/catalog.rbs
276
+ - sig/generated/riffer/catalog/rates.rbs
271
277
  - sig/generated/riffer/config.rbs
272
278
  - sig/generated/riffer/config/amazon_bedrock.rbs
273
279
  - sig/generated/riffer/config/anthropic.rbs
@@ -279,7 +285,6 @@ files:
279
285
  - sig/generated/riffer/config/open_ai.rbs
280
286
  - sig/generated/riffer/config/open_router.rbs
281
287
  - sig/generated/riffer/config/pricing.rbs
282
- - sig/generated/riffer/config/pricing/rates.rbs
283
288
  - sig/generated/riffer/config/skills.rbs
284
289
  - sig/generated/riffer/config/tracing.rbs
285
290
  - sig/generated/riffer/evals.rbs
@@ -324,7 +329,9 @@ files:
324
329
  - sig/generated/riffer/messages/user.rbs
325
330
  - sig/generated/riffer/messages/user/file_part.rbs
326
331
  - sig/generated/riffer/params.rbs
332
+ - sig/generated/riffer/params/any_of.rbs
327
333
  - sig/generated/riffer/params/boolean.rbs
334
+ - sig/generated/riffer/params/format.rbs
328
335
  - sig/generated/riffer/params/param.rbs
329
336
  - sig/generated/riffer/providers.rbs
330
337
  - sig/generated/riffer/providers/amazon_bedrock.rbs
@@ -404,6 +411,7 @@ files:
404
411
  - sig/manual/riffer/mcp/authenticated_tool.rbs
405
412
  - sig/manual/riffer/mcp/registry.rbs
406
413
  - sig/manual/riffer/mcp/tool_factory.rbs
414
+ - sig/manual/riffer/params/format.rbs
407
415
  - sig/manual/riffer/providers.rbs
408
416
  - sig/manual/riffer/providers/repository.rbs
409
417
  - sig/manual/riffer/testing.rbs