riffer 0.29.0 → 0.29.1

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 (79) 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 +7 -0
  5. data/Steepfile +2 -1
  6. data/lib/riffer/agent/context.rb +2 -0
  7. data/lib/riffer/agent/response.rb +2 -0
  8. data/lib/riffer/agent/session.rb +2 -0
  9. data/lib/riffer/agent.rb +2 -0
  10. data/lib/riffer/evals/evaluator.rb +5 -0
  11. data/lib/riffer/evals/judge.rb +5 -0
  12. data/lib/riffer/mcp/client.rb +2 -0
  13. data/lib/riffer/mcp/registration.rb +4 -0
  14. data/lib/riffer/mcp/registry.rb +3 -0
  15. data/lib/riffer/messages/file_part.rb +2 -0
  16. data/lib/riffer/providers/amazon_bedrock.rb +28 -21
  17. data/lib/riffer/providers/anthropic.rb +13 -9
  18. data/lib/riffer/providers/base.rb +2 -0
  19. data/lib/riffer/providers/gemini.rb +4 -0
  20. data/lib/riffer/providers/mock.rb +4 -0
  21. data/lib/riffer/providers/open_ai.rb +10 -7
  22. data/lib/riffer/providers/open_router.rb +25 -18
  23. data/lib/riffer/runner/fibers.rb +2 -0
  24. data/lib/riffer/runner/threaded.rb +2 -0
  25. data/lib/riffer/skills/config.rb +5 -0
  26. data/lib/riffer/skills/context.rb +3 -0
  27. data/lib/riffer/skills/filesystem_backend.rb +3 -0
  28. data/lib/riffer/tools/response.rb +2 -0
  29. data/lib/riffer/tools/runtime.rb +2 -0
  30. data/lib/riffer/tools/toolable.rb +7 -0
  31. data/lib/riffer/version.rb +1 -1
  32. data/lib/riffer.rb +2 -0
  33. data/sig/_private/anthropic.rbs +16 -0
  34. data/sig/_private/openai.rbs +29 -0
  35. data/sig/_private/riffer/providers/amazon_bedrock.rbs +4 -0
  36. data/sig/_private/riffer/providers/anthropic.rbs +4 -0
  37. data/sig/_private/riffer/providers/open_ai.rbs +4 -0
  38. data/sig/_private/riffer/providers/open_router.rbs +4 -0
  39. data/sig/generated/riffer/agent/context.rbs +2 -0
  40. data/sig/generated/riffer/agent/response.rbs +2 -0
  41. data/sig/generated/riffer/agent/session.rbs +2 -0
  42. data/sig/generated/riffer/agent.rbs +2 -0
  43. data/sig/generated/riffer/evals/evaluator.rbs +8 -0
  44. data/sig/generated/riffer/evals/judge.rbs +8 -0
  45. data/sig/generated/riffer/mcp/client.rbs +2 -0
  46. data/sig/generated/riffer/mcp/registration.rbs +6 -0
  47. data/sig/generated/riffer/mcp/registry.rbs +4 -0
  48. data/sig/generated/riffer/messages/file_part.rbs +2 -0
  49. data/sig/generated/riffer/providers/amazon_bedrock.rbs +20 -20
  50. data/sig/generated/riffer/providers/anthropic.rbs +10 -10
  51. data/sig/generated/riffer/providers/base.rbs +2 -0
  52. data/sig/generated/riffer/providers/gemini.rbs +6 -0
  53. data/sig/generated/riffer/providers/mock.rbs +6 -0
  54. data/sig/generated/riffer/providers/open_ai.rbs +8 -8
  55. data/sig/generated/riffer/providers/open_router.rbs +16 -16
  56. data/sig/generated/riffer/runner/fibers.rbs +2 -0
  57. data/sig/generated/riffer/runner/threaded.rbs +2 -0
  58. data/sig/generated/riffer/skills/config.rbs +8 -0
  59. data/sig/generated/riffer/skills/context.rbs +4 -0
  60. data/sig/generated/riffer/skills/filesystem_backend.rbs +4 -0
  61. data/sig/generated/riffer/tools/response.rbs +2 -0
  62. data/sig/generated/riffer/tools/runtime.rbs +2 -0
  63. data/sig/generated/riffer/tools/toolable.rbs +12 -0
  64. data/sig/generated/riffer.rbs +2 -0
  65. data/sig/manifest.yaml +3 -0
  66. data/sig/manual/riffer/agent/run.rbs +5 -0
  67. data/sig/manual/riffer/helpers/call_or_value.rbs +5 -0
  68. data/sig/manual/riffer/tools/toolable.rbs +6 -0
  69. metadata +16 -11
  70. data/sig/stubs/agent_ivars.rbs +0 -7
  71. data/sig/stubs/extend_self.rbs +0 -11
  72. data/sig/stubs/lib_ivars.rbs +0 -101
  73. data/sig/stubs/provider_ivars.rbs +0 -36
  74. data/sig/stubs/provider_sdk_methods.rbs +0 -50
  75. /data/sig/{stubs → _private}/async.rbs +0 -0
  76. /data/sig/{stubs → _private}/aws-sdk-core/seahorse_request_context.rbs +0 -0
  77. /data/sig/{stubs → _private}/aws-sdk-core/static_token_provider.rbs +0 -0
  78. /data/sig/{stubs/mcp_sdk.rbs → _private/mcp.rbs} +0 -0
  79. /data/sig/{stubs → _private}/zeitwerk.rbs +0 -0
@@ -15,6 +15,8 @@ require "json"
15
15
  # results = runtime.execute(tool_calls, tools: tools, context: context)
16
16
  #
17
17
  class Riffer::Tools::Runtime
18
+ # @rbs @runner: Riffer::Runner
19
+
18
20
  # [runner] the concurrency runner to use for batch execution.
19
21
  #
20
22
  # Subclasses must provide a runner; instantiating Riffer::Tools::Runtime directly
@@ -23,6 +23,13 @@
23
23
  # end
24
24
  #
25
25
  module Riffer::Tools::Toolable
26
+ # @rbs self.@extenders: Array[Module]?
27
+ # @rbs @description: String?
28
+ # @rbs @identifier: String?
29
+ # @rbs @timeout: (Integer | Float)?
30
+ # @rbs @params_builder: Riffer::Params?
31
+ # @rbs @kind: Symbol?
32
+
26
33
  DEFAULT_TIMEOUT = 10 #: Integer
27
34
 
28
35
  # Tracks all classes that extend Toolable.
@@ -2,5 +2,5 @@
2
2
  # rbs_inline: enabled
3
3
 
4
4
  module Riffer
5
- VERSION = "0.29.0" #: String
5
+ VERSION = "0.29.1" #: String
6
6
  end
data/lib/riffer.rb CHANGED
@@ -17,6 +17,8 @@ loader.inflector.inflect(
17
17
  loader.setup
18
18
 
19
19
  module Riffer
20
+ # @rbs self.@config: Riffer::Config?
21
+
20
22
  # Base error class for Riffer.
21
23
  class Error < StandardError; end
22
24
 
@@ -0,0 +1,16 @@
1
+ # Arity patch for the `anthropic` gem (see openai.rbs for the rationale).
2
+ # `Messages#create` is positional at runtime but typed keyword-only in the gem's
3
+ # RBS; `Messages#stream` is omitted from the gem's RBS but present at runtime
4
+ # (returns a MessageStream helper). Loaded only for riffer's own Steep run.
5
+ module Anthropic
6
+ module Resources
7
+ class Messages
8
+ def create: (Hash[Symbol, untyped] params) -> Anthropic::Models::Message
9
+ | (**untyped) -> Anthropic::Models::Message
10
+ | ...
11
+
12
+ def stream: (Hash[Symbol, untyped] params) -> untyped
13
+ | (**untyped) -> untyped
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,29 @@
1
+ # Arity patch for the `openai` gem. Its Resources methods are positional
2
+ # `def x(params)` at runtime, but the gem's shipped RBS advertises keyword-only
3
+ # signatures. We accept a positional hash or a keyword splat (`| ...` extends the
4
+ # gem's existing overloads). Streaming returns `untyped` — the event objects are a
5
+ # ~60-member union dispatched dynamically on `#type`. Loaded only for riffer's own
6
+ # Steep run (consumers skip sig/_private).
7
+ module OpenAI
8
+ module Resources
9
+ class Responses
10
+ def create: (Hash[Symbol, untyped] params) -> OpenAI::Models::Responses::Response
11
+ | (**untyped) -> OpenAI::Models::Responses::Response
12
+ | ...
13
+ def stream: (Hash[Symbol, untyped] params) -> untyped
14
+ | (**untyped) -> untyped
15
+ | ...
16
+ end
17
+
18
+ class Chat
19
+ class Completions
20
+ def create: (Hash[Symbol, untyped] params) -> OpenAI::Models::Chat::ChatCompletion
21
+ | (**untyped) -> OpenAI::Models::Chat::ChatCompletion
22
+ | ...
23
+ def stream_raw: (Hash[Symbol, untyped] params) -> untyped
24
+ | (**untyped) -> untyped
25
+ | ...
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,4 @@
1
+ # `@client` is typed against the SDK, so this ivar stub stays in _private (never ships)
2
+ class Riffer::Providers::AmazonBedrock
3
+ @client: ::Aws::BedrockRuntime::Client
4
+ end
@@ -0,0 +1,4 @@
1
+ # `@client` is typed against the SDK, so this ivar stub stays in _private (never ships)
2
+ class Riffer::Providers::Anthropic
3
+ @client: ::Anthropic::Client
4
+ end
@@ -0,0 +1,4 @@
1
+ # `@client` is typed against the SDK, so this ivar stub stays in _private (never ships)
2
+ class Riffer::Providers::OpenAI
3
+ @client: ::OpenAI::Client
4
+ end
@@ -0,0 +1,4 @@
1
+ # `@client` is typed against the SDK, so this ivar stub stays in _private (never ships)
2
+ class Riffer::Providers::OpenRouter
3
+ @client: ::OpenAI::Client
4
+ end
@@ -17,6 +17,8 @@
17
17
  # context.skills # => nil
18
18
  # context.token_usage # => nil
19
19
  class Riffer::Agent::Context
20
+ @data: Hash[Symbol, untyped]
21
+
20
22
  # Keys reserved for framework use. Passing any of these to the
21
23
  # constructor raises +Riffer::ArgumentError+.
22
24
  RESERVED_KEYS: Array[Symbol]
@@ -12,6 +12,8 @@
12
12
  # puts response.content
13
13
  # end
14
14
  class Riffer::Agent::Response
15
+ @interrupted: bool
16
+
15
17
  # The response content.
16
18
  attr_reader content: String
17
19
 
@@ -16,6 +16,8 @@
16
16
  class Riffer::Agent::Session
17
17
  include Enumerable[Riffer::Messages::Base]
18
18
 
19
+ @callbacks: Array[^(Riffer::Messages::Base) -> void]
20
+
19
21
  # The message history.
20
22
  attr_reader messages: Array[Riffer::Messages::Base]
21
23
 
@@ -15,6 +15,8 @@
15
15
  # agent = MyAgent.new
16
16
  # agent.generate('Hello!')
17
17
  class Riffer::Agent
18
+ self.@config: Riffer::Agent::Config?
19
+
18
20
  include Riffer::Messages::Converter
19
21
 
20
22
  extend Riffer::Helpers::ClassNameConverter
@@ -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]
@@ -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::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