riffer 0.29.0 → 0.30.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 (93) hide show
  1. checksums.yaml +4 -4
  2. data/.agents/rbs-inline.md +51 -0
  3. data/.release-please-manifest.json +1 -1
  4. data/CHANGELOG.md +18 -0
  5. data/README.md +1 -0
  6. data/Steepfile +2 -1
  7. data/docs/01_OVERVIEW.md +1 -0
  8. data/docs/03_AGENTS.md +1 -1
  9. data/docs/15_SERIALIZATION.md +103 -0
  10. data/lib/riffer/agent/config.rb +2 -2
  11. data/lib/riffer/agent/context.rb +2 -0
  12. data/lib/riffer/agent/response.rb +2 -0
  13. data/lib/riffer/agent/run.rb +2 -1
  14. data/lib/riffer/agent/serializer.rb +215 -0
  15. data/lib/riffer/agent/session.rb +2 -0
  16. data/lib/riffer/agent.rb +84 -18
  17. data/lib/riffer/evals/evaluator.rb +5 -0
  18. data/lib/riffer/evals/judge.rb +5 -0
  19. data/lib/riffer/mcp/client.rb +2 -0
  20. data/lib/riffer/mcp/registration.rb +4 -0
  21. data/lib/riffer/mcp/registry.rb +3 -0
  22. data/lib/riffer/messages/file_part.rb +2 -0
  23. data/lib/riffer/params/param.rb +84 -4
  24. data/lib/riffer/params.rb +34 -3
  25. data/lib/riffer/providers/amazon_bedrock.rb +28 -21
  26. data/lib/riffer/providers/anthropic.rb +13 -9
  27. data/lib/riffer/providers/base.rb +2 -0
  28. data/lib/riffer/providers/gemini.rb +4 -0
  29. data/lib/riffer/providers/mock.rb +4 -0
  30. data/lib/riffer/providers/open_ai.rb +10 -7
  31. data/lib/riffer/providers/open_router.rb +25 -18
  32. data/lib/riffer/runner/fibers.rb +2 -0
  33. data/lib/riffer/runner/threaded.rb +2 -0
  34. data/lib/riffer/skills/config.rb +5 -0
  35. data/lib/riffer/skills/context.rb +3 -0
  36. data/lib/riffer/skills/filesystem_backend.rb +3 -0
  37. data/lib/riffer/tools/response.rb +2 -0
  38. data/lib/riffer/tools/runtime.rb +2 -0
  39. data/lib/riffer/tools/toolable.rb +7 -0
  40. data/lib/riffer/version.rb +1 -1
  41. data/lib/riffer.rb +2 -0
  42. data/sig/_private/anthropic.rbs +16 -0
  43. data/sig/_private/openai.rbs +29 -0
  44. data/sig/_private/riffer/providers/amazon_bedrock.rbs +4 -0
  45. data/sig/_private/riffer/providers/anthropic.rbs +4 -0
  46. data/sig/_private/riffer/providers/open_ai.rbs +4 -0
  47. data/sig/_private/riffer/providers/open_router.rbs +4 -0
  48. data/sig/generated/riffer/agent/config.rbs +3 -3
  49. data/sig/generated/riffer/agent/context.rbs +2 -0
  50. data/sig/generated/riffer/agent/response.rbs +2 -0
  51. data/sig/generated/riffer/agent/serializer.rbs +132 -0
  52. data/sig/generated/riffer/agent/session.rbs +2 -0
  53. data/sig/generated/riffer/agent.rbs +67 -11
  54. data/sig/generated/riffer/evals/evaluator.rbs +8 -0
  55. data/sig/generated/riffer/evals/judge.rbs +8 -0
  56. data/sig/generated/riffer/mcp/client.rbs +2 -0
  57. data/sig/generated/riffer/mcp/registration.rbs +6 -0
  58. data/sig/generated/riffer/mcp/registry.rbs +4 -0
  59. data/sig/generated/riffer/messages/file_part.rbs +2 -0
  60. data/sig/generated/riffer/params/param.rbs +46 -5
  61. data/sig/generated/riffer/params.rbs +25 -6
  62. data/sig/generated/riffer/providers/amazon_bedrock.rbs +20 -20
  63. data/sig/generated/riffer/providers/anthropic.rbs +10 -10
  64. data/sig/generated/riffer/providers/base.rbs +2 -0
  65. data/sig/generated/riffer/providers/gemini.rbs +6 -0
  66. data/sig/generated/riffer/providers/mock.rbs +6 -0
  67. data/sig/generated/riffer/providers/open_ai.rbs +8 -8
  68. data/sig/generated/riffer/providers/open_router.rbs +16 -16
  69. data/sig/generated/riffer/runner/fibers.rbs +2 -0
  70. data/sig/generated/riffer/runner/threaded.rbs +2 -0
  71. data/sig/generated/riffer/skills/config.rbs +8 -0
  72. data/sig/generated/riffer/skills/context.rbs +4 -0
  73. data/sig/generated/riffer/skills/filesystem_backend.rbs +4 -0
  74. data/sig/generated/riffer/tools/response.rbs +2 -0
  75. data/sig/generated/riffer/tools/runtime.rbs +2 -0
  76. data/sig/generated/riffer/tools/toolable.rbs +12 -0
  77. data/sig/generated/riffer.rbs +2 -0
  78. data/sig/manifest.yaml +3 -0
  79. data/sig/manual/riffer/agent/run.rbs +5 -0
  80. data/sig/manual/riffer/agent/serializer.rbs +5 -0
  81. data/sig/manual/riffer/helpers/call_or_value.rbs +5 -0
  82. data/sig/manual/riffer/tools/toolable.rbs +6 -0
  83. metadata +20 -11
  84. data/sig/stubs/agent_ivars.rbs +0 -7
  85. data/sig/stubs/extend_self.rbs +0 -11
  86. data/sig/stubs/lib_ivars.rbs +0 -101
  87. data/sig/stubs/provider_ivars.rbs +0 -36
  88. data/sig/stubs/provider_sdk_methods.rbs +0 -50
  89. /data/sig/{stubs → _private}/async.rbs +0 -0
  90. /data/sig/{stubs → _private}/aws-sdk-core/seahorse_request_context.rbs +0 -0
  91. /data/sig/{stubs → _private}/aws-sdk-core/static_token_provider.rbs +0 -0
  92. /data/sig/{stubs/mcp_sdk.rbs → _private/mcp.rbs} +0 -0
  93. /data/sig/{stubs → _private}/zeitwerk.rbs +0 -0
@@ -14,6 +14,14 @@
14
14
  # judge_model "anthropic/claude-opus-4-5-20251101"
15
15
  # end
16
16
  class Riffer::Evals::Evaluator
17
+ self.@instructions: String?
18
+
19
+ self.@higher_is_better: bool?
20
+
21
+ self.@judge_model: String?
22
+
23
+ @judge: Riffer::Evals::Judge?
24
+
17
25
  # Gets or sets the evaluation instructions (criteria and scoring rubric).
18
26
  #
19
27
  # --
@@ -15,6 +15,14 @@
15
15
  # result[:score] # => 0.85
16
16
  # result[:reason] # => "The response is relevant..."
17
17
  class Riffer::Evals::Judge
18
+ @provider_options: Hash[Symbol, untyped]
19
+
20
+ @provider_instance: Riffer::Providers::Base?
21
+
22
+ @provider_name: String?
23
+
24
+ @model_name: String?
25
+
18
26
  # Internal tool for structured evaluation output.
19
27
  class EvaluationTool < Riffer::Tool
20
28
  # --
@@ -14,6 +14,8 @@
14
14
  class Riffer::Mcp::Client
15
15
  include Riffer::Helpers::Dependencies
16
16
 
17
+ @client: untyped
18
+
17
19
  # --
18
20
  # : (endpoint: String, ?headers: (Hash[String, String] | Proc), ?client: untyped?) -> void
19
21
  def initialize: (endpoint: String, ?headers: Hash[String, String] | Proc, ?client: untyped?) -> void
@@ -5,6 +5,12 @@
5
5
  # Created when a server is registered. Discovers tools via the MCP
6
6
  # +tools/list+ call, then generates tool classes.
7
7
  class Riffer::Mcp::Registration
8
+ @cancelled: bool
9
+
10
+ @tools: Array[singleton(Riffer::Tool)]
11
+
12
+ @mutex: Thread::Mutex
13
+
8
14
  # The manifest that describes this server.
9
15
  attr_reader manifest: Riffer::Mcp::Manifest
10
16
 
@@ -4,6 +4,10 @@
4
4
  #
5
5
  # Keyed by manifest name. All public methods are mutex-guarded.
6
6
  module Riffer::Mcp::Registry
7
+ self.@mutex: Thread::Mutex
8
+
9
+ self.@store: Hash[String, Riffer::Mcp::Registration]
10
+
7
11
  # Registers an MCP server and starts async tool discovery.
8
12
  #
9
13
  # Accepts a Manifest instance or a hash of manifest keyword arguments.
@@ -10,6 +10,8 @@
10
10
  # file.url? # => true
11
11
  # file.document? # => true
12
12
  class Riffer::Messages::FilePart
13
+ @url_string: String?
14
+
13
15
  MEDIA_TYPES: Hash[String, String]
14
16
 
15
17
  SUPPORTED_MEDIA_TYPES: Array[String]
@@ -8,11 +8,16 @@ class Riffer::Params::Param
8
8
  TYPE_MAPPINGS: Hash[Module, String]
9
9
 
10
10
  # Primitive types allowed for the <tt>of:</tt> keyword on Array params
11
- PRIMITIVE_TYPES: Array[Class]
11
+ PRIMITIVE_TYPES: Array[Module]
12
+
13
+ # Maps JSON Schema type strings back to Ruby types. The inverse of
14
+ # TYPE_MAPPINGS, collapsing the three boolean spellings onto
15
+ # Riffer::Params::Boolean. Used by +from_json_schema+.
16
+ JSON_TYPE_MAPPINGS: Hash[String, Module]
12
17
 
13
18
  attr_reader name: Symbol
14
19
 
15
- attr_reader type: Class
20
+ attr_reader type: Module
16
21
 
17
22
  attr_reader required: bool
18
23
 
@@ -22,13 +27,44 @@ class Riffer::Params::Param
22
27
 
23
28
  attr_reader default: untyped
24
29
 
25
- attr_reader item_type: Class?
30
+ attr_reader item_type: Module?
26
31
 
27
32
  attr_reader nested_params: Riffer::Params?
28
33
 
29
34
  # --
30
- # : (name: Symbol, type: Class, required: bool, ?description: String?, ?enum: Array[untyped]?, ?default: untyped, ?item_type: Class?, ?nested_params: Riffer::Params?) -> void
31
- def initialize: (name: Symbol, type: Class, required: bool, ?description: String?, ?enum: Array[untyped]?, ?default: untyped, ?item_type: Class?, ?nested_params: Riffer::Params?) -> void
35
+ # Reconstructs a Param from a single JSON Schema property.
36
+ #
37
+ # [name] the parameter name (Symbol).
38
+ # [schema] the property's JSON Schema (Symbol-keyed).
39
+ # [required] whether the property appeared in the parent's +required+ list.
40
+ #
41
+ # Raises Riffer::ArgumentError on a type outside the Params-expressible subset.
42
+ #
43
+ # --
44
+ # : (Symbol, Hash[Symbol, untyped], required: bool) -> Riffer::Params::Param
45
+ def self.from_json_schema: (Symbol, Hash[Symbol, untyped], required: bool) -> Riffer::Params::Param
46
+
47
+ # Resolves the +[item_type, nested_params]+ pair for a reconstructed Param:
48
+ # a nested Params for object / array-of-object schemas, an +item_type+ for
49
+ # typed primitive arrays, and +nil+ for everything else.
50
+ #
51
+ # --
52
+ # : (Module, Hash[Symbol, untyped]) -> [Module?, Riffer::Params?]
53
+ def self.resolve_nesting: (Module, Hash[Symbol, untyped]) -> [ Module?, Riffer::Params? ]
54
+
55
+ # Resolves a JSON Schema +type+ (a String, or a <tt>[type, "null"]</tt>
56
+ # union) back to its Ruby type. Returns a Module because
57
+ # Riffer::Params::Boolean is a Module, not a Class — the same widening the
58
+ # +type+ attribute uses. Raises Riffer::ArgumentError on a type outside the
59
+ # Params-expressible subset (the block runs only for an unmapped type).
60
+ #
61
+ # --
62
+ # : (untyped) -> Module
63
+ def self.json_type_to_ruby: (untyped) -> Module
64
+
65
+ # --
66
+ # : (name: Symbol, type: Module, required: bool, ?description: String?, ?enum: Array[untyped]?, ?default: untyped, ?item_type: Module?, ?nested_params: Riffer::Params?) -> void
67
+ def initialize: (name: Symbol, type: Module, required: bool, ?description: String?, ?enum: Array[untyped]?, ?default: untyped, ?item_type: Module?, ?nested_params: Riffer::Params?) -> void
32
68
 
33
69
  # Validates that a value matches the expected type.
34
70
  #
@@ -52,6 +88,11 @@ class Riffer::Params::Param
52
88
  # constraint from the null type, since providers like Anthropic reject
53
89
  # <tt>{"type": ["string", "null"], "enum": [...]}</tt>.
54
90
  #
91
+ # In non-strict mode a +default+ is emitted when set (a standard JSON
92
+ # Schema keyword), making the schema a lossless source for
93
+ # +Riffer::Params.from_json_schema+. Strict mode omits it, since strict
94
+ # providers reject the keyword.
95
+ #
55
96
  # --
56
97
  # : (?strict: bool) -> Hash[Symbol, untyped]
57
98
  def to_json_schema: (?strict: bool) -> Hash[Symbol, untyped]
@@ -16,17 +16,36 @@ class Riffer::Params
16
16
  # : () -> void
17
17
  def initialize: () -> void
18
18
 
19
+ # Reconstructs a Params from a JSON Schema object (the inverse of
20
+ # +to_json_schema(strict: false)+).
21
+ #
22
+ # Accepts the Symbol-keyed object schema produced by +to_json_schema+
23
+ # (property-name keys may be String or Symbol — both are normalized).
24
+ # Reconstructs types, +required+, +description+, +enum+, +default+,
25
+ # typed-array +item_type+, and nested object/array Params recursively.
26
+ #
27
+ # Round-trips losslessly with +to_json_schema(strict: false)+ over the
28
+ # Params-expressible subset of JSON Schema. Raises Riffer::ArgumentError
29
+ # on a schema using features outside that subset.
30
+ #
31
+ # schema = params.to_json_schema(strict: false)
32
+ # Riffer::Params.from_json_schema(schema) # => equivalent Riffer::Params
33
+ #
34
+ # --
35
+ # : (Hash[Symbol, untyped]) -> Riffer::Params
36
+ def self.from_json_schema: (Hash[Symbol, untyped]) -> Riffer::Params
37
+
19
38
  # Defines a required parameter.
20
39
  #
21
40
  # --
22
- # : (Symbol, Class, ?description: String?, ?enum: Array[untyped]?, ?of: Class?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> void
23
- def required: (Symbol, Class, ?description: String?, ?enum: Array[untyped]?, ?of: Class?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> void
41
+ # : (Symbol, Module, ?description: String?, ?enum: Array[untyped]?, ?of: Module?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> void
42
+ def required: (Symbol, Module, ?description: String?, ?enum: Array[untyped]?, ?of: Module?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> void
24
43
 
25
44
  # Defines an optional parameter.
26
45
  #
27
46
  # --
28
- # : (Symbol, Class, ?description: String?, ?enum: Array[untyped]?, ?default: untyped, ?of: Class?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> void
29
- def optional: (Symbol, Class, ?description: String?, ?enum: Array[untyped]?, ?default: untyped, ?of: Class?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> void
47
+ # : (Symbol, Module, ?description: String?, ?enum: Array[untyped]?, ?default: untyped, ?of: Module?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> void
48
+ def optional: (Symbol, Module, ?description: String?, ?enum: Array[untyped]?, ?default: untyped, ?of: Module?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> void
30
49
 
31
50
  # Validates arguments against parameter definitions.
32
51
  #
@@ -49,8 +68,8 @@ class Riffer::Params
49
68
  private
50
69
 
51
70
  # --
52
- # : (Class, Class?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> Riffer::Params?
53
- def build_nested: (Class, Class?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> Riffer::Params?
71
+ # : (Module, Module?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> Riffer::Params?
72
+ def build_nested: (Module, Module?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> Riffer::Params?
54
73
 
55
74
  # --
56
75
  # : (Riffer::Params::Param, untyped, Array[String]) -> untyped
@@ -34,20 +34,20 @@ class Riffer::Providers::AmazonBedrock < Riffer::Providers::Base
34
34
  def build_request_params: (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
35
35
 
36
36
  # --
37
- # : (Hash[Symbol, untyped]) -> Aws::BedrockRuntime::Client::_ConverseResponseSuccess
38
- def execute_generate: (Hash[Symbol, untyped]) -> Aws::BedrockRuntime::Client::_ConverseResponseSuccess
37
+ # : (Hash[Symbol, untyped]) -> untyped
38
+ def execute_generate: (Hash[Symbol, untyped]) -> untyped
39
39
 
40
40
  # --
41
- # : (Aws::BedrockRuntime::Client::_ConverseResponseSuccess) -> Riffer::Providers::TokenUsage?
42
- def extract_token_usage: (Aws::BedrockRuntime::Client::_ConverseResponseSuccess) -> Riffer::Providers::TokenUsage?
41
+ # : (untyped) -> Riffer::Providers::TokenUsage?
42
+ def extract_token_usage: (untyped) -> Riffer::Providers::TokenUsage?
43
43
 
44
44
  # --
45
- # : (Aws::BedrockRuntime::Client::_ConverseResponseSuccess) -> String
46
- def extract_content: (Aws::BedrockRuntime::Client::_ConverseResponseSuccess) -> String
45
+ # : (untyped) -> String
46
+ def extract_content: (untyped) -> String
47
47
 
48
48
  # --
49
- # : (Aws::BedrockRuntime::Client::_ConverseResponseSuccess) -> Array[Riffer::Messages::Assistant::ToolCall]
50
- def extract_tool_calls: (Aws::BedrockRuntime::Client::_ConverseResponseSuccess) -> Array[Riffer::Messages::Assistant::ToolCall]
49
+ # : (untyped) -> Array[Riffer::Messages::Assistant::ToolCall]
50
+ def extract_tool_calls: (untyped) -> Array[Riffer::Messages::Assistant::ToolCall]
51
51
 
52
52
  # --
53
53
  # : (Hash[Symbol, untyped], Enumerator::Yielder) -> void
@@ -67,28 +67,28 @@ class Riffer::Providers::AmazonBedrock < Riffer::Providers::Base
67
67
  def raise_if_stream_exception!: (untyped) -> void
68
68
 
69
69
  # --
70
- # : (Aws::BedrockRuntime::Types::ContentBlockStartEvent, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
71
- def handle_content_block_start_tool_use: (Aws::BedrockRuntime::Types::ContentBlockStartEvent, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
70
+ # : (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
71
+ def handle_content_block_start_tool_use: (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
72
72
 
73
73
  # --
74
- # : (Aws::BedrockRuntime::Types::ContentBlockDeltaEvent, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
75
- def handle_content_block_delta_text_delta: (Aws::BedrockRuntime::Types::ContentBlockDeltaEvent, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
74
+ # : (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
75
+ def handle_content_block_delta_text_delta: (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
76
76
 
77
77
  # --
78
- # : (Aws::BedrockRuntime::Types::ContentBlockDeltaEvent, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
79
- def handle_content_block_delta_tool_use: (Aws::BedrockRuntime::Types::ContentBlockDeltaEvent, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
78
+ # : (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
79
+ def handle_content_block_delta_tool_use: (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
80
80
 
81
81
  # --
82
- # : (Aws::BedrockRuntime::Types::ContentBlockStopEvent, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
83
- def handle_content_block_stop_text_delta: (Aws::BedrockRuntime::Types::ContentBlockStopEvent, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
82
+ # : (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
83
+ def handle_content_block_stop_text_delta: (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
84
84
 
85
85
  # --
86
- # : (Aws::BedrockRuntime::Types::ContentBlockStopEvent, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
87
- def handle_content_block_stop_tool_use: (Aws::BedrockRuntime::Types::ContentBlockStopEvent, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
86
+ # : (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
87
+ def handle_content_block_stop_tool_use: (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
88
88
 
89
89
  # --
90
- # : (Aws::BedrockRuntime::Types::ConverseStreamMetadataEvent, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
91
- def handle_metadata_usage: (Aws::BedrockRuntime::Types::ConverseStreamMetadataEvent, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
90
+ # : (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
91
+ def handle_metadata_usage: (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
92
92
 
93
93
  # --
94
94
  # : (Array[Riffer::Messages::Base]) -> Hash[Symbol, untyped]
@@ -27,20 +27,20 @@ class Riffer::Providers::Anthropic < Riffer::Providers::Base
27
27
  def build_request_params: (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
28
28
 
29
29
  # --
30
- # : (Hash[Symbol, untyped]) -> Anthropic::Models::Message
31
- def execute_generate: (Hash[Symbol, untyped]) -> Anthropic::Models::Message
30
+ # : (Hash[Symbol, untyped]) -> untyped
31
+ def execute_generate: (Hash[Symbol, untyped]) -> untyped
32
32
 
33
33
  # --
34
- # : (Anthropic::Models::Message) -> Riffer::Providers::TokenUsage?
35
- def extract_token_usage: (Anthropic::Models::Message) -> Riffer::Providers::TokenUsage?
34
+ # : (untyped) -> Riffer::Providers::TokenUsage?
35
+ def extract_token_usage: (untyped) -> Riffer::Providers::TokenUsage?
36
36
 
37
37
  # --
38
- # : (Anthropic::Models::Message) -> String
39
- def extract_content: (Anthropic::Models::Message) -> String
38
+ # : (untyped) -> String
39
+ def extract_content: (untyped) -> String
40
40
 
41
41
  # --
42
- # : (Anthropic::Models::Message) -> Array[Riffer::Messages::Assistant::ToolCall]
43
- def extract_tool_calls: (Anthropic::Models::Message) -> Array[Riffer::Messages::Assistant::ToolCall]
42
+ # : (untyped) -> Array[Riffer::Messages::Assistant::ToolCall]
43
+ def extract_tool_calls: (untyped) -> Array[Riffer::Messages::Assistant::ToolCall]
44
44
 
45
45
  # --
46
46
  # : (Hash[Symbol, untyped], Enumerator::Yielder) -> void
@@ -87,8 +87,8 @@ class Riffer::Providers::Anthropic < Riffer::Providers::Base
87
87
  def handle_content_block_stop_web_search_result: (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
88
88
 
89
89
  # --
90
- # : (untyped, accumulated_message: Anthropic::Models::Message?, yielder: Enumerator::Yielder) -> void
91
- def handle_message_stop: (untyped, accumulated_message: Anthropic::Models::Message?, yielder: Enumerator::Yielder) -> void
90
+ # : (untyped, accumulated_message: untyped, yielder: Enumerator::Yielder) -> void
91
+ def handle_message_stop: (untyped, accumulated_message: untyped, yielder: Enumerator::Yielder) -> void
92
92
 
93
93
  # --
94
94
  # : (Array[Riffer::Messages::Base]) -> Hash[Symbol, untyped]
@@ -14,6 +14,8 @@
14
14
  # [extract_content] extract text content from the SDK response
15
15
  # [extract_tool_calls] extract tool calls from the SDK response
16
16
  class Riffer::Providers::Base
17
+ @current_tools: Array[singleton(Riffer::Tool)]
18
+
17
19
  include Riffer::Helpers::Dependencies
18
20
 
19
21
  include Riffer::Messages::Converter
@@ -2,6 +2,12 @@
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
+
5
11
  BASE_URI: URI::Generic
6
12
 
7
13
  VALID_MODEL_PATTERN: Regexp
@@ -4,6 +4,12 @@
4
4
  #
5
5
  # No external gems required.
6
6
  class Riffer::Providers::Mock < Riffer::Providers::Base
7
+ @stubbed_responses: Array[Hash[Symbol, untyped]]
8
+
9
+ @current_index: Integer
10
+
11
+ @responses: Array[Hash[Symbol, untyped]]
12
+
7
13
  # Returns the preferred skill adapter for the given mock model.
8
14
  #
9
15
  # Mock is used to stand in for any real provider in tests, so the model
@@ -19,20 +19,20 @@ class Riffer::Providers::OpenAI < Riffer::Providers::Base
19
19
  def build_request_params: (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
20
20
 
21
21
  # --
22
- # : (Hash[Symbol, untyped]) -> OpenAI::Models::Responses::Response
23
- def execute_generate: (Hash[Symbol, untyped]) -> OpenAI::Models::Responses::Response
22
+ # : (Hash[Symbol, untyped]) -> untyped
23
+ def execute_generate: (Hash[Symbol, untyped]) -> untyped
24
24
 
25
25
  # --
26
- # : (OpenAI::Models::Responses::Response) -> Riffer::Providers::TokenUsage?
27
- def extract_token_usage: (OpenAI::Models::Responses::Response) -> Riffer::Providers::TokenUsage?
26
+ # : (untyped) -> Riffer::Providers::TokenUsage?
27
+ def extract_token_usage: (untyped) -> Riffer::Providers::TokenUsage?
28
28
 
29
29
  # --
30
- # : (OpenAI::Models::Responses::Response) -> String
31
- def extract_content: (OpenAI::Models::Responses::Response) -> String
30
+ # : (untyped) -> String
31
+ def extract_content: (untyped) -> String
32
32
 
33
33
  # --
34
- # : (OpenAI::Models::Responses::Response) -> Array[Riffer::Messages::Assistant::ToolCall]
35
- def extract_tool_calls: (OpenAI::Models::Responses::Response) -> Array[Riffer::Messages::Assistant::ToolCall]
34
+ # : (untyped) -> Array[Riffer::Messages::Assistant::ToolCall]
35
+ def extract_tool_calls: (untyped) -> Array[Riffer::Messages::Assistant::ToolCall]
36
36
 
37
37
  # --
38
38
  # : (Hash[Symbol, untyped], Enumerator::Yielder) -> void
@@ -24,48 +24,48 @@ class Riffer::Providers::OpenRouter < Riffer::Providers::Base
24
24
  def build_request_params: (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
25
25
 
26
26
  # --
27
- # : (Hash[Symbol, untyped]) -> OpenAI::Models::Chat::ChatCompletion
28
- def execute_generate: (Hash[Symbol, untyped]) -> OpenAI::Models::Chat::ChatCompletion
27
+ # : (Hash[Symbol, untyped]) -> untyped
28
+ def execute_generate: (Hash[Symbol, untyped]) -> untyped
29
29
 
30
30
  # --
31
- # : (OpenAI::Models::Chat::ChatCompletion) -> Riffer::Providers::TokenUsage?
32
- def extract_token_usage: (OpenAI::Models::Chat::ChatCompletion) -> Riffer::Providers::TokenUsage?
31
+ # : (untyped) -> Riffer::Providers::TokenUsage?
32
+ def extract_token_usage: (untyped) -> Riffer::Providers::TokenUsage?
33
33
 
34
34
  # --
35
- # : (OpenAI::Models::Chat::ChatCompletion) -> String
36
- def extract_content: (OpenAI::Models::Chat::ChatCompletion) -> String
35
+ # : (untyped) -> String
36
+ def extract_content: (untyped) -> String
37
37
 
38
38
  # --
39
- # : (OpenAI::Models::Chat::ChatCompletion) -> Array[Riffer::Messages::Assistant::ToolCall]
40
- def extract_tool_calls: (OpenAI::Models::Chat::ChatCompletion) -> Array[Riffer::Messages::Assistant::ToolCall]
39
+ # : (untyped) -> Array[Riffer::Messages::Assistant::ToolCall]
40
+ def extract_tool_calls: (untyped) -> Array[Riffer::Messages::Assistant::ToolCall]
41
41
 
42
42
  # --
43
43
  # : (Hash[Symbol, untyped], Enumerator::Yielder) -> void
44
44
  def execute_stream: (Hash[Symbol, untyped], Enumerator::Yielder) -> void
45
45
 
46
46
  # --
47
- # : (OpenAI::Models::Chat::ChatCompletionChunk, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
48
- def handle_stream_chunk: (OpenAI::Models::Chat::ChatCompletionChunk, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
47
+ # : (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
48
+ def handle_stream_chunk: (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
49
49
 
50
50
  # --
51
- # : (OpenAI::Models::Chat::ChatCompletionChunk::Choice::Delta, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
52
- def handle_text_delta: (OpenAI::Models::Chat::ChatCompletionChunk::Choice::Delta, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
51
+ # : (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
52
+ def handle_text_delta: (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
53
53
 
54
54
  # --
55
55
  # : (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
56
56
  def handle_reasoning_delta: (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
57
57
 
58
58
  # --
59
- # : (OpenAI::Models::Chat::ChatCompletionChunk::Choice::Delta, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
60
- def handle_tool_call_deltas: (OpenAI::Models::Chat::ChatCompletionChunk::Choice::Delta, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
59
+ # : (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
60
+ def handle_tool_call_deltas: (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
61
61
 
62
62
  # --
63
63
  # : (state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
64
64
  def emit_tool_call_done_events: (state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
65
65
 
66
66
  # --
67
- # : (OpenAI::Models::Chat::ChatCompletionChunk::Choice) -> bool
68
- def finish_reason_is_tool_calls?: (OpenAI::Models::Chat::ChatCompletionChunk::Choice) -> bool
67
+ # : (untyped) -> bool
68
+ def finish_reason_is_tool_calls?: (untyped) -> bool
69
69
 
70
70
  # --
71
71
  # : (Array[Riffer::Messages::Base]) -> Array[Hash[Symbol, untyped]]
@@ -12,6 +12,8 @@
12
12
  # runner = Riffer::Runner::Fibers.new
13
13
  # runner.map(items) { |item| expensive_operation(item) }
14
14
  class Riffer::Runner::Fibers < Riffer::Runner
15
+ @max_concurrency: Integer?
16
+
15
17
  include Riffer::Helpers::Dependencies
16
18
 
17
19
  # [max_concurrency] maximum number of fibers to run simultaneously.
@@ -12,6 +12,8 @@
12
12
  # runner = Riffer::Runner::Threaded.new(max_concurrency: 3)
13
13
  # runner.map(items) { |item| expensive_operation(item) }
14
14
  class Riffer::Runner::Threaded < Riffer::Runner
15
+ @max_concurrency: Integer
16
+
15
17
  DEFAULT_MAX_CONCURRENCY: Integer
16
18
 
17
19
  # [max_concurrency] maximum number of threads to run simultaneously.
@@ -10,6 +10,14 @@
10
10
  # activate ["code-review"]
11
11
  # end
12
12
  class Riffer::Skills::Config
13
+ @backend: (Riffer::Skills::Backend | Proc)?
14
+
15
+ @adapter: singleton(Riffer::Skills::Adapter)?
16
+
17
+ @activate: (Array[String] | Proc)?
18
+
19
+ @activate_tool: singleton(Riffer::Tool)?
20
+
13
21
  # Creates a new Config with all options unset.
14
22
  #
15
23
  # --
@@ -10,6 +10,10 @@
10
10
  #
11
11
  # See Riffer::Skills::Backend, Riffer::Skills::Frontmatter.
12
12
  class Riffer::Skills::Context
13
+ @backend: Riffer::Skills::Backend
14
+
15
+ @activated: Hash[String, String]
16
+
13
17
  # Skill catalog indexed by name.
14
18
  attr_reader skills: Hash[String, Riffer::Skills::Frontmatter]
15
19
 
@@ -9,6 +9,10 @@
9
9
  # backend.list_skills # => [Riffer::Skills::Frontmatter, ...]
10
10
  # backend.read_skill("code-review") # => "Full skill instructions..."
11
11
  class Riffer::Skills::FilesystemBackend < Riffer::Skills::Backend
12
+ @paths: Array[String]
13
+
14
+ @skills_cache: Hash[String, String]?
15
+
12
16
  # Creates a new FilesystemBackend.
13
17
  #
14
18
  # [paths] one or more directory paths to scan for skills.
@@ -14,6 +14,8 @@
14
14
  # end
15
15
  # end
16
16
  class Riffer::Tools::Response
17
+ @success: bool
18
+
17
19
  VALID_FORMATS: Array[Symbol]
18
20
 
19
21
  attr_reader content: String
@@ -11,6 +11,8 @@
11
11
  # runtime = Riffer::Tools::Runtime::Inline.new
12
12
  # results = runtime.execute(tool_calls, tools: tools, context: context)
13
13
  class Riffer::Tools::Runtime
14
+ @runner: Riffer::Runner
15
+
14
16
  # [runner] the concurrency runner to use for batch execution.
15
17
  #
16
18
  # Subclasses must provide a runner; instantiating Riffer::Tools::Runtime directly
@@ -21,6 +21,18 @@
21
21
  # end
22
22
  # end
23
23
  module Riffer::Tools::Toolable
24
+ @kind: Symbol?
25
+
26
+ @params_builder: Riffer::Params?
27
+
28
+ @timeout: (Integer | Float)?
29
+
30
+ @identifier: String?
31
+
32
+ @description: String?
33
+
34
+ self.@extenders: Array[Module]?
35
+
24
36
  DEFAULT_TIMEOUT: Integer
25
37
 
26
38
  # Tracks all classes that extend Toolable.
@@ -1,6 +1,8 @@
1
1
  # Generated from lib/riffer.rb with RBS::Inline
2
2
 
3
3
  module Riffer
4
+ self.@config: Riffer::Config?
5
+
4
6
  # Base error class for Riffer.
5
7
  class Error < StandardError
6
8
  end
data/sig/manifest.yaml ADDED
@@ -0,0 +1,3 @@
1
+ dependencies:
2
+ - name: uri
3
+ - name: net-http
@@ -0,0 +1,5 @@
1
+ # `Riffer::Agent::Run` uses `extend self`; rbs-inline doesn't emit that, so
2
+ # re-extend here to expose its instance methods as singleton methods.
3
+ module Riffer::Agent::Run
4
+ extend ::Riffer::Agent::Run
5
+ end
@@ -0,0 +1,5 @@
1
+ # `Riffer::Agent::Serializer` 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::Agent::Serializer
4
+ extend ::Riffer::Agent::Serializer
5
+ end
@@ -0,0 +1,5 @@
1
+ # `Riffer::Helpers::CallOrValue` 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::Helpers::CallOrValue
4
+ extend ::Riffer::Helpers::CallOrValue
5
+ end
@@ -0,0 +1,6 @@
1
+ # Toolable is extended onto tool classes; its instance methods run as class
2
+ # methods on the extender, which is also extended with ClassNameConverter
3
+ # (see Toolable.extended). The include models that method availability for Steep.
4
+ module Riffer::Tools::Toolable
5
+ include Riffer::Helpers::ClassNameConverter
6
+ end