riffer 0.27.2 → 0.29.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 (146) hide show
  1. checksums.yaml +4 -4
  2. data/.agents/architecture.md +18 -11
  3. data/.agents/code-style.md +1 -1
  4. data/.agents/rbs-inline.md +2 -2
  5. data/.agents/testing.md +9 -5
  6. data/.release-please-manifest.json +1 -1
  7. data/AGENTS.md +17 -10
  8. data/CHANGELOG.md +31 -0
  9. data/README.md +17 -18
  10. data/Steepfile +7 -1
  11. data/docs/03_AGENTS.md +34 -3
  12. data/docs/04_AGENT_LIFECYCLE.md +134 -86
  13. data/docs/05_AGENT_LOOP.md +2 -2
  14. data/docs/06_TOOLS.md +9 -4
  15. data/docs/07_TOOL_ADVANCED.md +23 -19
  16. data/docs/08_MESSAGES.md +28 -31
  17. data/docs/09_STREAM_EVENTS.md +1 -1
  18. data/docs/10_CONFIGURATION.md +25 -15
  19. data/docs/providers/01_PROVIDERS.md +6 -0
  20. data/docs/providers/06_MOCK_PROVIDER.md +2 -1
  21. data/docs/providers/07_CUSTOM_PROVIDERS.md +4 -4
  22. data/docs/providers/08_GEMINI.md +2 -2
  23. data/docs/providers/09_OPENROUTER.md +242 -0
  24. data/lib/riffer/agent/config.rb +173 -0
  25. data/lib/riffer/agent/context.rb +125 -0
  26. data/lib/riffer/agent/response.rb +11 -2
  27. data/lib/riffer/agent/run.rb +308 -0
  28. data/lib/riffer/agent/session/repair.rb +112 -0
  29. data/lib/riffer/agent/session.rb +268 -0
  30. data/lib/riffer/{structured_output → agent/structured_output}/result.rb +1 -1
  31. data/lib/riffer/{structured_output.rb → agent/structured_output.rb} +4 -4
  32. data/lib/riffer/agent.rb +246 -684
  33. data/lib/riffer/config.rb +56 -7
  34. data/lib/riffer/evals/evaluator.rb +13 -3
  35. data/lib/riffer/evals/judge.rb +2 -2
  36. data/lib/riffer/evals/run_result.rb +2 -1
  37. data/lib/riffer/evals/scenario_result.rb +2 -1
  38. data/lib/riffer/guardrails/runner.rb +3 -2
  39. data/lib/riffer/helpers/call_or_value.rb +16 -0
  40. data/lib/riffer/helpers.rb +0 -1
  41. data/lib/riffer/mcp/authenticated_tool.rb +4 -0
  42. data/lib/riffer/mcp/client.rb +1 -1
  43. data/lib/riffer/mcp/registration.rb +2 -3
  44. data/lib/riffer/mcp/registry.rb +3 -1
  45. data/lib/riffer/mcp/tool_factory.rb +5 -0
  46. data/lib/riffer/messages/assistant.rb +9 -3
  47. data/lib/riffer/messages/base.rb +22 -0
  48. data/lib/riffer/messages/converter.rb +6 -6
  49. data/lib/riffer/{file_part.rb → messages/file_part.rb} +5 -5
  50. data/lib/riffer/messages/tool.rb +1 -1
  51. data/lib/riffer/messages/user.rb +4 -4
  52. data/lib/riffer/{boolean.rb → params/boolean.rb} +3 -3
  53. data/lib/riffer/{param.rb → params/param.rb} +6 -6
  54. data/lib/riffer/params.rb +27 -21
  55. data/lib/riffer/providers/amazon_bedrock.rb +19 -20
  56. data/lib/riffer/providers/anthropic.rb +27 -28
  57. data/lib/riffer/providers/base.rb +10 -9
  58. data/lib/riffer/providers/gemini.rb +15 -12
  59. data/lib/riffer/providers/mock.rb +41 -13
  60. data/lib/riffer/providers/open_ai.rb +24 -22
  61. data/lib/riffer/providers/open_router.rb +318 -0
  62. data/lib/riffer/providers/repository.rb +1 -0
  63. data/lib/riffer/{token_usage.rb → providers/token_usage.rb} +4 -4
  64. data/lib/riffer/providers.rb +1 -0
  65. data/lib/riffer/runner/fibers.rb +4 -3
  66. data/lib/riffer/runner/sequential.rb +1 -1
  67. data/lib/riffer/runner/threaded.rb +1 -1
  68. data/lib/riffer/runner.rb +1 -1
  69. data/lib/riffer/skills/activate_tool.rb +4 -3
  70. data/lib/riffer/skills/config.rb +1 -1
  71. data/lib/riffer/skills/context.rb +3 -3
  72. data/lib/riffer/skills/filesystem_backend.rb +7 -5
  73. data/lib/riffer/skills/markdown_adapter.rb +1 -1
  74. data/lib/riffer/skills/xml_adapter.rb +1 -1
  75. data/lib/riffer/stream_events/interrupt.rb +10 -3
  76. data/lib/riffer/stream_events/token_usage_done.rb +2 -2
  77. data/lib/riffer/stream_events/web_search_status.rb +1 -1
  78. data/lib/riffer/tool.rb +3 -3
  79. data/lib/riffer/{tool_runtime → tools/runtime}/fibers.rb +2 -2
  80. data/lib/riffer/{tool_runtime → tools/runtime}/inline.rb +1 -1
  81. data/lib/riffer/{tool_runtime → tools/runtime}/threaded.rb +2 -2
  82. data/lib/riffer/{tool_runtime.rb → tools/runtime.rb} +21 -15
  83. data/lib/riffer/{toolable.rb → tools/toolable.rb} +12 -9
  84. data/lib/riffer/version.rb +1 -1
  85. data/lib/riffer.rb +2 -1
  86. data/sig/generated/riffer/agent/config.rbs +119 -0
  87. data/sig/generated/riffer/agent/context.rbs +91 -0
  88. data/sig/generated/riffer/agent/response.rbs +10 -2
  89. data/sig/generated/riffer/agent/run.rbs +144 -0
  90. data/sig/generated/riffer/agent/session/repair.rbs +51 -0
  91. data/sig/generated/riffer/agent/session.rbs +145 -0
  92. data/sig/generated/riffer/{structured_output → agent/structured_output}/result.rbs +2 -2
  93. data/sig/generated/riffer/{structured_output.rbs → agent/structured_output.rbs} +6 -6
  94. data/sig/generated/riffer/agent.rbs +154 -225
  95. data/sig/generated/riffer/config.rbs +50 -5
  96. data/sig/generated/riffer/evals/judge.rbs +2 -2
  97. data/sig/generated/riffer/helpers/call_or_value.rbs +9 -0
  98. data/sig/generated/riffer/helpers.rbs +0 -1
  99. data/sig/generated/riffer/messages/assistant.rbs +7 -3
  100. data/sig/generated/riffer/messages/base.rbs +18 -0
  101. data/sig/generated/riffer/messages/converter.rbs +4 -4
  102. data/sig/generated/riffer/{file_part.rbs → messages/file_part.rbs} +5 -5
  103. data/sig/generated/riffer/messages/user.rbs +4 -4
  104. data/sig/generated/riffer/params/boolean.rbs +10 -0
  105. data/sig/generated/riffer/{param.rbs → params/param.rbs} +3 -3
  106. data/sig/generated/riffer/params.rbs +15 -15
  107. data/sig/generated/riffer/providers/amazon_bedrock.rbs +22 -22
  108. data/sig/generated/riffer/providers/anthropic.rbs +4 -4
  109. data/sig/generated/riffer/providers/base.rbs +10 -10
  110. data/sig/generated/riffer/providers/gemini.rbs +4 -4
  111. data/sig/generated/riffer/providers/mock.rbs +25 -5
  112. data/sig/generated/riffer/providers/open_ai.rbs +4 -4
  113. data/sig/generated/riffer/providers/open_router.rbs +85 -0
  114. data/sig/generated/riffer/{token_usage.rbs → providers/token_usage.rbs} +5 -5
  115. data/sig/generated/riffer/providers.rbs +1 -0
  116. data/sig/generated/riffer/runner/fibers.rbs +2 -2
  117. data/sig/generated/riffer/runner/sequential.rbs +2 -2
  118. data/sig/generated/riffer/runner/threaded.rbs +2 -2
  119. data/sig/generated/riffer/runner.rbs +2 -2
  120. data/sig/generated/riffer/skills/activate_tool.rbs +4 -3
  121. data/sig/generated/riffer/skills/config.rbs +1 -1
  122. data/sig/generated/riffer/skills/context.rbs +2 -2
  123. data/sig/generated/riffer/stream_events/interrupt.rbs +7 -2
  124. data/sig/generated/riffer/stream_events/token_usage_done.rbs +3 -3
  125. data/sig/generated/riffer/tool.rbs +5 -5
  126. data/sig/generated/riffer/{tool_runtime → tools/runtime}/fibers.rbs +3 -3
  127. data/sig/generated/riffer/{tool_runtime → tools/runtime}/inline.rbs +2 -2
  128. data/sig/generated/riffer/{tool_runtime → tools/runtime}/threaded.rbs +3 -3
  129. data/sig/generated/riffer/{tool_runtime.rbs → tools/runtime.rbs} +19 -13
  130. data/sig/generated/riffer/{toolable.rbs → tools/toolable.rbs} +6 -6
  131. data/sig/stubs/agent_ivars.rbs +7 -0
  132. data/sig/stubs/async.rbs +24 -0
  133. data/sig/stubs/aws-sdk-core/seahorse_request_context.rbs +7 -0
  134. data/sig/stubs/aws-sdk-core/static_token_provider.rbs +5 -0
  135. data/sig/stubs/extend_self.rbs +11 -0
  136. data/sig/stubs/lib_ivars.rbs +101 -0
  137. data/sig/stubs/mcp_sdk.rbs +22 -0
  138. data/sig/stubs/provider_ivars.rbs +36 -0
  139. data/sig/stubs/provider_sdk_methods.rbs +50 -0
  140. data/sig/stubs/zeitwerk.rbs +12 -0
  141. metadata +54 -33
  142. data/lib/riffer/core.rb +0 -28
  143. data/lib/riffer/helpers/validations.rb +0 -18
  144. data/sig/generated/riffer/boolean.rbs +0 -10
  145. data/sig/generated/riffer/core.rbs +0 -19
  146. data/sig/generated/riffer/helpers/validations.rbs +0 -12
@@ -28,6 +28,24 @@ class Riffer::Messages::Base
28
28
  # : () -> Symbol
29
29
  def role: () -> Symbol
30
30
 
31
+ # Whether this message carries pending tool calls. Defaults to +false+;
32
+ # +Riffer::Messages::Assistant+ overrides this when its +tool_calls+
33
+ # array is non-empty.
34
+ #
35
+ # --
36
+ # : () -> bool
37
+ def has_tool_calls?: () -> bool
38
+
39
+ # Merges another same-role message into this one.
40
+ #
41
+ # Raises NotImplementedError unless implemented by subclass. Mergeable
42
+ # message types (+User+, +Assistant+, +System+) override this; +Tool+
43
+ # messages are never merged.
44
+ #
45
+ # --
46
+ # : (untyped) -> Riffer::Messages::Base
47
+ def +: (untyped) -> Riffer::Messages::Base
48
+
31
49
  private
32
50
 
33
51
  # : () -> String?
@@ -12,18 +12,18 @@ module Riffer::Messages::Converter
12
12
  # : ((Hash[Symbol, untyped] | Riffer::Messages::Base)) -> Riffer::Messages::Base
13
13
  def convert_to_message_object: (Hash[Symbol, untyped] | Riffer::Messages::Base) -> Riffer::Messages::Base
14
14
 
15
- # Converts a hash or FilePart object to a Riffer::FilePart.
15
+ # Converts a hash or FilePart object to a Riffer::Messages::FilePart.
16
16
  #
17
17
  # Accepts:
18
- # - +Riffer::FilePart+ objects (passed through)
18
+ # - +Riffer::Messages::FilePart+ objects (passed through)
19
19
  # - <tt>{url: "https://...", media_type: "..."}</tt> (URL source)
20
20
  # - <tt>{data: "...", media_type: "..."}</tt> (raw base64)
21
21
  #
22
22
  # Raises Riffer::ArgumentError if the hash format is invalid.
23
23
  #
24
24
  # --
25
- # : ((Hash[Symbol, untyped] | Riffer::FilePart)) -> Riffer::FilePart
26
- def convert_to_file_part: (Hash[Symbol, untyped] | Riffer::FilePart) -> Riffer::FilePart
25
+ # : ((Hash[Symbol, untyped] | Riffer::Messages::FilePart)) -> Riffer::Messages::FilePart
26
+ def convert_to_file_part: (Hash[Symbol, untyped] | Riffer::Messages::FilePart) -> Riffer::Messages::FilePart
27
27
 
28
28
  private
29
29
 
@@ -1,4 +1,4 @@
1
- # Generated from lib/riffer/file_part.rb with RBS::Inline
1
+ # Generated from lib/riffer/messages/file_part.rb with RBS::Inline
2
2
 
3
3
  # Represents a file attachment (image or document) in a conversation.
4
4
  #
@@ -6,10 +6,10 @@
6
6
  # - URLs (stored and passed to providers that support them via +from_url+)
7
7
  # - Raw base64 data (via +new+)
8
8
  #
9
- # file = Riffer::FilePart.from_url("https://example.com/doc.pdf", media_type: "application/pdf")
9
+ # file = Riffer::Messages::FilePart.from_url("https://example.com/doc.pdf", media_type: "application/pdf")
10
10
  # file.url? # => true
11
11
  # file.document? # => true
12
- class Riffer::FilePart
12
+ class Riffer::Messages::FilePart
13
13
  MEDIA_TYPES: Hash[String, String]
14
14
 
15
15
  SUPPORTED_MEDIA_TYPES: Array[String]
@@ -39,8 +39,8 @@ class Riffer::FilePart
39
39
  # Raises Riffer::ArgumentError if media_type cannot be detected.
40
40
  #
41
41
  # --
42
- # : (String, ?media_type: String?) -> Riffer::FilePart
43
- def self.from_url: (String, ?media_type: String?) -> Riffer::FilePart
42
+ # : (String, ?media_type: String?) -> Riffer::Messages::FilePart
43
+ def self.from_url: (String, ?media_type: String?) -> Riffer::Messages::FilePart
44
44
 
45
45
  # Returns the base64-encoded data, or nil for URL-only sources.
46
46
  attr_reader data: String?
@@ -7,16 +7,16 @@
7
7
  # msg.content # => "Hello!"
8
8
  #
9
9
  # msg = Riffer::Messages::User.new("Describe this image", files: [file_part])
10
- # msg.files # => [#<Riffer::FilePart ...>]
10
+ # msg.files # => [#<Riffer::Messages::FilePart ...>]
11
11
  class Riffer::Messages::User < Riffer::Messages::Base
12
12
  # File attachments for this message.
13
- attr_reader files: Array[Riffer::FilePart]
13
+ attr_reader files: Array[Riffer::Messages::FilePart]
14
14
 
15
15
  # Initializes a user message.
16
16
  #
17
17
  # --
18
- # : (String, ?id: String?, ?files: Array[Riffer::FilePart]) -> void
19
- def initialize: (String, ?id: String?, ?files: Array[Riffer::FilePart]) -> void
18
+ # : (String, ?id: String?, ?files: Array[Riffer::Messages::FilePart]) -> void
19
+ def initialize: (String, ?id: String?, ?files: Array[Riffer::Messages::FilePart]) -> void
20
20
 
21
21
  # --
22
22
  # : () -> Symbol
@@ -0,0 +1,10 @@
1
+ # Generated from lib/riffer/params/boolean.rb with RBS::Inline
2
+
3
+ # Riffer::Params::Boolean is a sentinel type for declaring boolean parameters.
4
+ #
5
+ # Ruby has no +Boolean+ class (+true+ is +TrueClass+, +false+ is +FalseClass+).
6
+ # Use this module wherever you need a single type that means "boolean":
7
+ #
8
+ # required :verbose, Riffer::Params::Boolean
9
+ module Riffer::Params::Boolean
10
+ end
@@ -1,9 +1,9 @@
1
- # Generated from lib/riffer/param.rb with RBS::Inline
1
+ # Generated from lib/riffer/params/param.rb with RBS::Inline
2
2
 
3
- # Riffer::Param represents a single parameter definition.
3
+ # Riffer::Params::Param represents a single parameter definition.
4
4
  #
5
5
  # Handles type validation and JSON Schema generation for individual parameters.
6
- class Riffer::Param
6
+ class Riffer::Params::Param
7
7
  # Maps Ruby types to JSON Schema type strings
8
8
  TYPE_MAPPINGS: Hash[Module, String]
9
9
 
@@ -10,7 +10,7 @@
10
10
  # optional :units, String, default: "celsius", enum: ["celsius", "fahrenheit"]
11
11
  # end
12
12
  class Riffer::Params
13
- attr_reader parameters: Array[Riffer::Param]
13
+ attr_reader parameters: Array[Riffer::Params::Param]
14
14
 
15
15
  # --
16
16
  # : () -> void
@@ -19,14 +19,14 @@ class Riffer::Params
19
19
  # Defines a required parameter.
20
20
  #
21
21
  # --
22
- # : (Symbol, Class, ?description: String?, ?enum: Array[untyped]?, ?of: Class?) ?{ () -> void } -> void
23
- def required: (Symbol, Class, ?description: String?, ?enum: Array[untyped]?, ?of: Class?) ?{ () -> void } -> void
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
24
24
 
25
25
  # Defines an optional parameter.
26
26
  #
27
27
  # --
28
- # : (Symbol, Class, ?description: String?, ?enum: Array[untyped]?, ?default: untyped, ?of: Class?) ?{ () -> void } -> void
29
- def optional: (Symbol, Class, ?description: String?, ?enum: Array[untyped]?, ?default: untyped, ?of: Class?) ?{ () -> void } -> void
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
30
30
 
31
31
  # Validates arguments against parameter definitions.
32
32
  #
@@ -49,22 +49,22 @@ class Riffer::Params
49
49
  private
50
50
 
51
51
  # --
52
- # : (Class, Class?) ?{ () -> void } -> Riffer::Params?
53
- def build_nested: (Class, Class?) ?{ () -> void } -> Riffer::Params?
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?
54
54
 
55
55
  # --
56
- # : (Riffer::Param, untyped, Array[String]) -> untyped
57
- def validate_nested: (Riffer::Param, untyped, Array[String]) -> untyped
56
+ # : (Riffer::Params::Param, untyped, Array[String]) -> untyped
57
+ def validate_nested: (Riffer::Params::Param, untyped, Array[String]) -> untyped
58
58
 
59
59
  # --
60
- # : (Riffer::Param, Hash[Symbol, untyped], Array[String]) -> Hash[Symbol, untyped]
61
- def validate_nested_hash: (Riffer::Param, Hash[Symbol, untyped], Array[String]) -> Hash[Symbol, untyped]
60
+ # : (Riffer::Params::Param, Hash[Symbol, untyped], Array[String]) -> Hash[Symbol, untyped]
61
+ def validate_nested_hash: (Riffer::Params::Param, Hash[Symbol, untyped], Array[String]) -> Hash[Symbol, untyped]
62
62
 
63
63
  # --
64
- # : (Riffer::Param, Array[untyped], Array[String]) -> Array[untyped]
65
- def validate_nested_array_of_objects: (Riffer::Param, Array[untyped], Array[String]) -> Array[untyped]
64
+ # : (Riffer::Params::Param, Array[untyped], Array[String]) -> Array[untyped]
65
+ def validate_nested_array_of_objects: (Riffer::Params::Param, Array[untyped], Array[String]) -> Array[untyped]
66
66
 
67
67
  # --
68
- # : (Riffer::Param, Array[untyped], Array[String]) -> void
69
- def validate_typed_array: (Riffer::Param, Array[untyped], Array[String]) -> void
68
+ # : (Riffer::Params::Param, Array[untyped], Array[String]) -> void
69
+ def validate_typed_array: (Riffer::Params::Param, Array[untyped], Array[String]) -> void
70
70
  end
@@ -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::Types::ConverseResponse
38
- def execute_generate: (Hash[Symbol, untyped]) -> Aws::BedrockRuntime::Types::ConverseResponse
37
+ # : (Hash[Symbol, untyped]) -> Aws::BedrockRuntime::Client::_ConverseResponseSuccess
38
+ def execute_generate: (Hash[Symbol, untyped]) -> Aws::BedrockRuntime::Client::_ConverseResponseSuccess
39
39
 
40
40
  # --
41
- # : (Aws::BedrockRuntime::Types::ConverseResponse) -> Riffer::TokenUsage?
42
- def extract_token_usage: (Aws::BedrockRuntime::Types::ConverseResponse) -> Riffer::TokenUsage?
41
+ # : (Aws::BedrockRuntime::Client::_ConverseResponseSuccess) -> Riffer::Providers::TokenUsage?
42
+ def extract_token_usage: (Aws::BedrockRuntime::Client::_ConverseResponseSuccess) -> Riffer::Providers::TokenUsage?
43
43
 
44
44
  # --
45
- # : (Aws::BedrockRuntime::Types::ConverseResponse) -> String
46
- def extract_content: (Aws::BedrockRuntime::Types::ConverseResponse) -> String
45
+ # : (Aws::BedrockRuntime::Client::_ConverseResponseSuccess) -> String
46
+ def extract_content: (Aws::BedrockRuntime::Client::_ConverseResponseSuccess) -> String
47
47
 
48
48
  # --
49
- # : (Aws::BedrockRuntime::Types::ConverseResponse) -> Array[Riffer::Messages::Assistant::ToolCall]
50
- def extract_tool_calls: (Aws::BedrockRuntime::Types::ConverseResponse) -> Array[Riffer::Messages::Assistant::ToolCall]
49
+ # : (Aws::BedrockRuntime::Client::_ConverseResponseSuccess) -> Array[Riffer::Messages::Assistant::ToolCall]
50
+ def extract_tool_calls: (Aws::BedrockRuntime::Client::_ConverseResponseSuccess) -> 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[Riffer::StreamEvents::Base, void]) -> void
71
- def handle_content_block_start_tool_use: (Aws::BedrockRuntime::Types::ContentBlockStartEvent, state: Hash[Symbol, untyped], yielder: Enumerator[Riffer::StreamEvents::Base, void]) -> void
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
72
72
 
73
73
  # --
74
- # : (Aws::BedrockRuntime::Types::ContentBlockDeltaEvent, state: Hash[Symbol, untyped], yielder: Enumerator[Riffer::StreamEvents::Base, void]) -> void
75
- def handle_content_block_delta_text_delta: (Aws::BedrockRuntime::Types::ContentBlockDeltaEvent, state: Hash[Symbol, untyped], yielder: Enumerator[Riffer::StreamEvents::Base, void]) -> void
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
76
76
 
77
77
  # --
78
- # : (Aws::BedrockRuntime::Types::ContentBlockDeltaEvent, state: Hash[Symbol, untyped], yielder: Enumerator[Riffer::StreamEvents::Base, void]) -> void
79
- def handle_content_block_delta_tool_use: (Aws::BedrockRuntime::Types::ContentBlockDeltaEvent, state: Hash[Symbol, untyped], yielder: Enumerator[Riffer::StreamEvents::Base, void]) -> void
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
80
80
 
81
81
  # --
82
- # : (Aws::BedrockRuntime::Types::ContentBlockStopEvent, state: Hash[Symbol, untyped], yielder: Enumerator[Riffer::StreamEvents::Base, void]) -> void
83
- def handle_content_block_stop_text_delta: (Aws::BedrockRuntime::Types::ContentBlockStopEvent, state: Hash[Symbol, untyped], yielder: Enumerator[Riffer::StreamEvents::Base, void]) -> void
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
84
84
 
85
85
  # --
86
- # : (Aws::BedrockRuntime::Types::ContentBlockStopEvent, state: Hash[Symbol, untyped], yielder: Enumerator[Riffer::StreamEvents::Base, void]) -> void
87
- def handle_content_block_stop_tool_use: (Aws::BedrockRuntime::Types::ContentBlockStopEvent, state: Hash[Symbol, untyped], yielder: Enumerator[Riffer::StreamEvents::Base, void]) -> void
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
88
88
 
89
89
  # --
90
- # : (Aws::BedrockRuntime::Types::ConverseStreamMetadataEvent, state: Hash[Symbol, untyped], yielder: Enumerator[Riffer::StreamEvents::Base, void]) -> void
91
- def handle_metadata_usage: (Aws::BedrockRuntime::Types::ConverseStreamMetadataEvent, state: Hash[Symbol, untyped], yielder: Enumerator[Riffer::StreamEvents::Base, void]) -> void
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
92
92
 
93
93
  # --
94
94
  # : (Array[Riffer::Messages::Base]) -> Hash[Symbol, untyped]
@@ -103,8 +103,8 @@ class Riffer::Providers::AmazonBedrock < Riffer::Providers::Base
103
103
  def append_tool_result: (Array[Hash[Symbol, untyped]], Riffer::Messages::Tool) -> void
104
104
 
105
105
  # --
106
- # : (Riffer::FilePart) -> Hash[Symbol, untyped]
107
- def convert_file_part_to_bedrock_format: (Riffer::FilePart) -> Hash[Symbol, untyped]
106
+ # : (Riffer::Messages::FilePart) -> Hash[Symbol, untyped]
107
+ def convert_file_part_to_bedrock_format: (Riffer::Messages::FilePart) -> Hash[Symbol, untyped]
108
108
 
109
109
  BEDROCK_FORMAT_MAP: Hash[String, String]
110
110
 
@@ -31,8 +31,8 @@ class Riffer::Providers::Anthropic < Riffer::Providers::Base
31
31
  def execute_generate: (Hash[Symbol, untyped]) -> Anthropic::Models::Message
32
32
 
33
33
  # --
34
- # : (Anthropic::Models::Message) -> Riffer::TokenUsage?
35
- def extract_token_usage: (Anthropic::Models::Message) -> Riffer::TokenUsage?
34
+ # : (Anthropic::Models::Message) -> Riffer::Providers::TokenUsage?
35
+ def extract_token_usage: (Anthropic::Models::Message) -> Riffer::Providers::TokenUsage?
36
36
 
37
37
  # --
38
38
  # : (Anthropic::Models::Message) -> String
@@ -99,8 +99,8 @@ class Riffer::Providers::Anthropic < Riffer::Providers::Base
99
99
  def convert_assistant_to_anthropic_format: (Riffer::Messages::Assistant) -> Hash[Symbol, untyped]
100
100
 
101
101
  # --
102
- # : (Riffer::FilePart) -> Hash[Symbol, untyped]
103
- def convert_file_part_to_anthropic_format: (Riffer::FilePart) -> Hash[Symbol, untyped]
102
+ # : (Riffer::Messages::FilePart) -> Hash[Symbol, untyped]
103
+ def convert_file_part_to_anthropic_format: (Riffer::Messages::FilePart) -> Hash[Symbol, untyped]
104
104
 
105
105
  # --
106
106
  # : (singleton(Riffer::Tool)) -> Hash[Symbol, untyped]
@@ -35,14 +35,14 @@ class Riffer::Providers::Base
35
35
  # Generates text using the provider.
36
36
  #
37
37
  # --
38
- # : (?prompt: String?, ?system: String?, ?messages: Array[Hash[Symbol, untyped] | Riffer::Messages::Base]?, ?model: String?, ?files: Array[Hash[Symbol, untyped] | Riffer::FilePart]?, **untyped) -> Riffer::Messages::Assistant
39
- def generate_text: (?prompt: String?, ?system: String?, ?messages: Array[Hash[Symbol, untyped] | Riffer::Messages::Base]?, ?model: String?, ?files: Array[Hash[Symbol, untyped] | Riffer::FilePart]?, **untyped) -> Riffer::Messages::Assistant
38
+ # : (?prompt: String?, ?system: String?, ?messages: Array[Hash[Symbol, untyped] | Riffer::Messages::Base]?, ?model: String?, ?files: Array[Hash[Symbol, untyped] | Riffer::Messages::FilePart]?, **untyped) -> Riffer::Messages::Assistant
39
+ def generate_text: (?prompt: String?, ?system: String?, ?messages: Array[Hash[Symbol, untyped] | Riffer::Messages::Base]?, ?model: String?, ?files: Array[Hash[Symbol, untyped] | Riffer::Messages::FilePart]?, **untyped) -> Riffer::Messages::Assistant
40
40
 
41
41
  # Streams text from the provider.
42
42
  #
43
43
  # --
44
- # : (?prompt: String?, ?system: String?, ?messages: Array[Hash[Symbol, untyped] | Riffer::Messages::Base]?, ?model: String?, ?files: Array[Hash[Symbol, untyped] | Riffer::FilePart]?, **untyped) -> Enumerator[Riffer::StreamEvents::Base, void]
45
- def stream_text: (?prompt: String?, ?system: String?, ?messages: Array[Hash[Symbol, untyped] | Riffer::Messages::Base]?, ?model: String?, ?files: Array[Hash[Symbol, untyped] | Riffer::FilePart]?, **untyped) -> Enumerator[Riffer::StreamEvents::Base, void]
44
+ # : (?prompt: String?, ?system: String?, ?messages: Array[Hash[Symbol, untyped] | Riffer::Messages::Base]?, ?model: String?, ?files: Array[Hash[Symbol, untyped] | Riffer::Messages::FilePart]?, **untyped) -> Enumerator[Riffer::StreamEvents::Base, void]
45
+ def stream_text: (?prompt: String?, ?system: String?, ?messages: Array[Hash[Symbol, untyped] | Riffer::Messages::Base]?, ?model: String?, ?files: Array[Hash[Symbol, untyped] | Riffer::Messages::FilePart]?, **untyped) -> Enumerator[Riffer::StreamEvents::Base, void]
46
46
 
47
47
  private
48
48
 
@@ -51,8 +51,8 @@ class Riffer::Providers::Base
51
51
  def encode_tool_name: (String) -> String
52
52
 
53
53
  # --
54
- # : (String, tools: Array[Riffer::Tool]) -> String
55
- def decode_tool_name: (String, tools: Array[Riffer::Tool]) -> String
54
+ # : (String, tools: Array[singleton(Riffer::Tool)]) -> String
55
+ def decode_tool_name: (String, tools: Array[singleton(Riffer::Tool)]) -> String
56
56
 
57
57
  # --
58
58
  # : (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
@@ -67,8 +67,8 @@ class Riffer::Providers::Base
67
67
  def execute_stream: (Hash[Symbol, untyped], Enumerator::Yielder) -> void
68
68
 
69
69
  # --
70
- # : (untyped) -> Riffer::TokenUsage?
71
- def extract_token_usage: (untyped) -> Riffer::TokenUsage?
70
+ # : (untyped) -> Riffer::Providers::TokenUsage?
71
+ def extract_token_usage: (untyped) -> Riffer::Providers::TokenUsage?
72
72
 
73
73
  # --
74
74
  # : (untyped) -> String
@@ -95,8 +95,8 @@ class Riffer::Providers::Base
95
95
  def validate_input!: (prompt: String?, system: String?, messages: Array[Hash[Symbol | String, untyped] | Riffer::Messages::Base]?) -> void
96
96
 
97
97
  # --
98
- # : (prompt: String?, system: String?, messages: Array[Hash[Symbol, untyped] | Riffer::Messages::Base]?, ?files: Array[Hash[Symbol, untyped] | Riffer::FilePart]?) -> Array[Riffer::Messages::Base]
99
- def normalize_messages: (prompt: String?, system: String?, messages: Array[Hash[Symbol, untyped] | Riffer::Messages::Base]?, ?files: Array[Hash[Symbol, untyped] | Riffer::FilePart]?) -> Array[Riffer::Messages::Base]
98
+ # : (prompt: String?, system: String?, messages: Array[Hash[Symbol, untyped] | Riffer::Messages::Base]?, ?files: Array[Hash[Symbol, untyped] | Riffer::Messages::FilePart]?) -> Array[Riffer::Messages::Base]
99
+ def normalize_messages: (prompt: String?, system: String?, messages: Array[Hash[Symbol, untyped] | Riffer::Messages::Base]?, ?files: Array[Hash[Symbol, untyped] | Riffer::Messages::FilePart]?) -> Array[Riffer::Messages::Base]
100
100
 
101
101
  # --
102
102
  # : (Array[Riffer::Messages::Base]) -> void
@@ -35,8 +35,8 @@ class Riffer::Providers::Gemini < Riffer::Providers::Base
35
35
  def extract_tool_calls: (Hash[Symbol, untyped]) -> Array[Riffer::Messages::Assistant::ToolCall]
36
36
 
37
37
  # --
38
- # : (Hash[Symbol, untyped]) -> Riffer::TokenUsage?
39
- def extract_token_usage: (Hash[Symbol, untyped]) -> Riffer::TokenUsage?
38
+ # : (Hash[Symbol, untyped]) -> Riffer::Providers::TokenUsage?
39
+ def extract_token_usage: (Hash[Symbol, untyped]) -> Riffer::Providers::TokenUsage?
40
40
 
41
41
  # --
42
42
  # : (Hash[Symbol, untyped], Enumerator::Yielder) -> void
@@ -51,8 +51,8 @@ class Riffer::Providers::Gemini < Riffer::Providers::Base
51
51
  def convert_assistant_to_gemini_format: (Riffer::Messages::Assistant) -> Hash[Symbol, untyped]
52
52
 
53
53
  # --
54
- # : (Riffer::FilePart) -> Hash[Symbol, untyped]
55
- def convert_file_part_to_gemini_format: (Riffer::FilePart) -> Hash[Symbol, untyped]
54
+ # : (Riffer::Messages::FilePart) -> Hash[Symbol, untyped]
55
+ def convert_file_part_to_gemini_format: (Riffer::Messages::FilePart) -> Hash[Symbol, untyped]
56
56
 
57
57
  # --
58
58
  # : (singleton(Riffer::Tool)) -> Hash[Symbol, untyped]
@@ -21,6 +21,17 @@ class Riffer::Providers::Mock < Riffer::Providers::Base
21
21
 
22
22
  # Initializes the mock provider.
23
23
  #
24
+ # +responses:+ accepts an array of response hashes in the same shape
25
+ # +#stub_response+ takes — raw +tool_calls:+ hashes are normalised to
26
+ # +Riffer::Messages::Assistant::ToolCall+ instances. This is the canonical
27
+ # way to pre-configure canned LLM responses on an agent via
28
+ # +provider_options responses: [...]+.
29
+ #
30
+ # Riffer::Providers::Mock.new(responses: [
31
+ # {content: "", tool_calls: [{name: "tool_a", arguments: "{}"}]},
32
+ # {content: "Final answer"}
33
+ # ])
34
+ #
24
35
  # --
25
36
  # : (**untyped) -> void
26
37
  def initialize: (**untyped) -> void
@@ -31,11 +42,11 @@ class Riffer::Providers::Mock < Riffer::Providers::Base
31
42
  #
32
43
  # provider.stub_response("Hello")
33
44
  # provider.stub_response("", tool_calls: [{name: "my_tool", arguments: '{"key":"value"}'}])
34
- # provider.stub_response("Final response", token_usage: Riffer::TokenUsage.new(input_tokens: 10, output_tokens: 5))
45
+ # provider.stub_response("Final response", token_usage: Riffer::Providers::TokenUsage.new(input_tokens: 10, output_tokens: 5))
35
46
  #
36
47
  # --
37
- # : (String, ?tool_calls: Array[Hash[Symbol, untyped]], ?token_usage: Riffer::TokenUsage?) -> void
38
- def stub_response: (String, ?tool_calls: Array[Hash[Symbol, untyped]], ?token_usage: Riffer::TokenUsage?) -> void
48
+ # : (String, ?tool_calls: Array[Hash[Symbol, untyped]], ?token_usage: Riffer::Providers::TokenUsage?) -> void
49
+ def stub_response: (String, ?tool_calls: Array[Hash[Symbol, untyped]], ?token_usage: Riffer::Providers::TokenUsage?) -> void
39
50
 
40
51
  # Clears all stubbed responses.
41
52
  #
@@ -45,6 +56,15 @@ class Riffer::Providers::Mock < Riffer::Providers::Base
45
56
 
46
57
  private
47
58
 
59
+ # Normalises a response hash into Mock's internal format. Accepts the
60
+ # +#stub_response+ kwargs shape (+content:+, +tool_calls:+, +token_usage:+)
61
+ # or a pre-built hash with already-converted ToolCall instances. Raw
62
+ # +tool_calls:+ hashes are wrapped in +Riffer::Messages::Assistant::ToolCall+.
63
+ #
64
+ # --
65
+ # : (Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
66
+ def normalize_response: (Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
67
+
48
68
  # --
49
69
  # : (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
50
70
  def build_request_params: (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
@@ -54,8 +74,8 @@ class Riffer::Providers::Mock < Riffer::Providers::Base
54
74
  def execute_generate: (Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
55
75
 
56
76
  # --
57
- # : (untyped) -> Riffer::TokenUsage?
58
- def extract_token_usage: (untyped) -> Riffer::TokenUsage?
77
+ # : (untyped) -> Riffer::Providers::TokenUsage?
78
+ def extract_token_usage: (untyped) -> Riffer::Providers::TokenUsage?
59
79
 
60
80
  # --
61
81
  # : (untyped) -> String
@@ -23,8 +23,8 @@ class Riffer::Providers::OpenAI < Riffer::Providers::Base
23
23
  def execute_generate: (Hash[Symbol, untyped]) -> OpenAI::Models::Responses::Response
24
24
 
25
25
  # --
26
- # : (OpenAI::Models::Responses::Response) -> Riffer::TokenUsage?
27
- def extract_token_usage: (OpenAI::Models::Responses::Response) -> Riffer::TokenUsage?
26
+ # : (OpenAI::Models::Responses::Response) -> Riffer::Providers::TokenUsage?
27
+ def extract_token_usage: (OpenAI::Models::Responses::Response) -> Riffer::Providers::TokenUsage?
28
28
 
29
29
  # --
30
30
  # : (OpenAI::Models::Responses::Response) -> String
@@ -87,8 +87,8 @@ class Riffer::Providers::OpenAI < Riffer::Providers::Base
87
87
  def convert_assistant_to_openai_format: (Riffer::Messages::Assistant) -> (Hash[Symbol, untyped] | Array[Hash[Symbol, untyped]])
88
88
 
89
89
  # --
90
- # : (Riffer::FilePart) -> Hash[Symbol, untyped]
91
- def convert_file_part_to_openai_format: (Riffer::FilePart) -> Hash[Symbol, untyped]
90
+ # : (Riffer::Messages::FilePart) -> Hash[Symbol, untyped]
91
+ def convert_file_part_to_openai_format: (Riffer::Messages::FilePart) -> Hash[Symbol, untyped]
92
92
 
93
93
  # --
94
94
  # : (singleton(Riffer::Tool)) -> Hash[Symbol, untyped]
@@ -0,0 +1,85 @@
1
+ # Generated from lib/riffer/providers/open_router.rb with RBS::Inline
2
+
3
+ # OpenRouter provider for the OpenRouter unified gateway (https://openrouter.ai).
4
+ #
5
+ # Requires the +openai+ gem to be installed. OpenRouter exposes an
6
+ # OpenAI-compatible Chat Completions endpoint, so this provider reuses
7
+ # the OpenAI Ruby SDK with a +base_url+ override.
8
+ #
9
+ # The +api_key+ falls back to <tt>Riffer.config.openrouter.api_key</tt>
10
+ # and then to +OPENROUTER_API_KEY+.
11
+ class Riffer::Providers::OpenRouter < Riffer::Providers::Base
12
+ BASE_URL: String
13
+
14
+ # Initializes the OpenRouter provider.
15
+ #
16
+ # --
17
+ # : (?api_key: String?, **untyped) -> void
18
+ def initialize: (?api_key: String?, **untyped) -> void
19
+
20
+ private
21
+
22
+ # --
23
+ # : (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
24
+ def build_request_params: (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
25
+
26
+ # --
27
+ # : (Hash[Symbol, untyped]) -> OpenAI::Models::Chat::ChatCompletion
28
+ def execute_generate: (Hash[Symbol, untyped]) -> OpenAI::Models::Chat::ChatCompletion
29
+
30
+ # --
31
+ # : (OpenAI::Models::Chat::ChatCompletion) -> Riffer::Providers::TokenUsage?
32
+ def extract_token_usage: (OpenAI::Models::Chat::ChatCompletion) -> Riffer::Providers::TokenUsage?
33
+
34
+ # --
35
+ # : (OpenAI::Models::Chat::ChatCompletion) -> String
36
+ def extract_content: (OpenAI::Models::Chat::ChatCompletion) -> String
37
+
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]
41
+
42
+ # --
43
+ # : (Hash[Symbol, untyped], Enumerator::Yielder) -> void
44
+ def execute_stream: (Hash[Symbol, untyped], Enumerator::Yielder) -> void
45
+
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
49
+
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
53
+
54
+ # --
55
+ # : (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
56
+ def handle_reasoning_delta: (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
57
+
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
61
+
62
+ # --
63
+ # : (state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
64
+ def emit_tool_call_done_events: (state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
65
+
66
+ # --
67
+ # : (OpenAI::Models::Chat::ChatCompletionChunk::Choice) -> bool
68
+ def finish_reason_is_tool_calls?: (OpenAI::Models::Chat::ChatCompletionChunk::Choice) -> bool
69
+
70
+ # --
71
+ # : (Array[Riffer::Messages::Base]) -> Array[Hash[Symbol, untyped]]
72
+ def convert_messages_to_chat_completions_format: (Array[Riffer::Messages::Base]) -> Array[Hash[Symbol, untyped]]
73
+
74
+ # --
75
+ # : (Riffer::Messages::Assistant) -> Hash[Symbol, untyped]
76
+ def convert_assistant_to_chat_completions_format: (Riffer::Messages::Assistant) -> Hash[Symbol, untyped]
77
+
78
+ # --
79
+ # : (Riffer::Messages::FilePart) -> Hash[Symbol, untyped]
80
+ def convert_file_part_to_chat_completions_format: (Riffer::Messages::FilePart) -> Hash[Symbol, untyped]
81
+
82
+ # --
83
+ # : (singleton(Riffer::Tool)) -> Hash[Symbol, untyped]
84
+ def convert_tool_to_chat_completions_format: (singleton(Riffer::Tool)) -> Hash[Symbol, untyped]
85
+ end
@@ -1,14 +1,14 @@
1
- # Generated from lib/riffer/token_usage.rb with RBS::Inline
1
+ # Generated from lib/riffer/providers/token_usage.rb with RBS::Inline
2
2
 
3
3
  # Represents token usage data from an LLM API call.
4
4
  #
5
5
  # Tracks input tokens, output tokens, and optional cache statistics.
6
6
  #
7
- # token_usage = Riffer::TokenUsage.new(input_tokens: 100, output_tokens: 50)
7
+ # token_usage = Riffer::Providers::TokenUsage.new(input_tokens: 100, output_tokens: 50)
8
8
  # token_usage.total_tokens # => 150
9
9
  #
10
10
  # combined = token_usage1 + token_usage2 # Combine multiple token usage objects
11
- class Riffer::TokenUsage
11
+ class Riffer::Providers::TokenUsage
12
12
  # Number of tokens in the input/prompt.
13
13
  attr_reader input_tokens: Integer
14
14
 
@@ -34,8 +34,8 @@ class Riffer::TokenUsage
34
34
  # Combines two TokenUsage objects for cumulative tracking.
35
35
  #
36
36
  # --
37
- # : (Riffer::TokenUsage) -> Riffer::TokenUsage
38
- def +: (Riffer::TokenUsage) -> Riffer::TokenUsage
37
+ # : (Riffer::Providers::TokenUsage) -> Riffer::Providers::TokenUsage
38
+ def +: (Riffer::Providers::TokenUsage) -> Riffer::Providers::TokenUsage
39
39
 
40
40
  # Converts the token usage to a hash representation.
41
41
  #
@@ -6,6 +6,7 @@
6
6
  # - Riffer::Providers::OpenAI - OpenAI GPT models
7
7
  # - Riffer::Providers::AzureOpenAI - Azure OpenAI GPT models
8
8
  # - Riffer::Providers::AmazonBedrock - AWS Bedrock models
9
+ # - Riffer::Providers::OpenRouter - OpenRouter unified gateway
9
10
  # - Riffer::Providers::Mock - Mock provider for testing
10
11
  module Riffer::Providers
11
12
  end
@@ -22,6 +22,6 @@ class Riffer::Runner::Fibers < Riffer::Runner
22
22
  def initialize: (?max_concurrency: Integer?) -> void
23
23
 
24
24
  # --
25
- # : (Array[untyped], context: Hash[Symbol, untyped]?) { (untyped) -> untyped } -> Array[untyped]
26
- def map: (Array[untyped], context: Hash[Symbol, untyped]?) { (untyped) -> untyped } -> Array[untyped]
25
+ # : (Array[untyped], context: Riffer::Agent::Context?) { (untyped) -> untyped } -> Array[untyped]
26
+ def map: (Array[untyped], context: Riffer::Agent::Context?) { (untyped) -> untyped } -> Array[untyped]
27
27
  end
@@ -5,6 +5,6 @@
5
5
  # This is the default runner used when no concurrency is needed.
6
6
  class Riffer::Runner::Sequential < Riffer::Runner
7
7
  # --
8
- # : (Array[untyped], context: Hash[Symbol, untyped]?) { (untyped) -> untyped } -> Array[untyped]
9
- def map: (Array[untyped], context: Hash[Symbol, untyped]?) { (untyped) -> untyped } -> Array[untyped]
8
+ # : (Array[untyped], context: Riffer::Agent::Context?) { (untyped) -> untyped } -> Array[untyped]
9
+ def map: (Array[untyped], context: Riffer::Agent::Context?) { (untyped) -> untyped } -> Array[untyped]
10
10
  end
@@ -21,6 +21,6 @@ class Riffer::Runner::Threaded < Riffer::Runner
21
21
  def initialize: (?max_concurrency: Integer) -> void
22
22
 
23
23
  # --
24
- # : (Array[untyped], context: Hash[Symbol, untyped]?) { (untyped) -> untyped } -> Array[untyped]
25
- def map: (Array[untyped], context: Hash[Symbol, untyped]?) { (untyped) -> untyped } -> Array[untyped]
24
+ # : (Array[untyped], context: Riffer::Agent::Context?) { (untyped) -> untyped } -> Array[untyped]
25
+ def map: (Array[untyped], context: Riffer::Agent::Context?) { (untyped) -> untyped } -> Array[untyped]
26
26
  end
@@ -17,6 +17,6 @@ class Riffer::Runner
17
17
  # Raises NotImplementedError if not implemented by subclass.
18
18
  #
19
19
  # --
20
- # : (Array[untyped], context: Hash[Symbol, untyped]?) { (untyped) -> untyped } -> Array[untyped]
21
- def map: (Array[untyped], context: Hash[Symbol, untyped]?) { (untyped) -> untyped } -> Array[untyped]
20
+ # : (Array[untyped], context: Riffer::Agent::Context?) { (untyped) -> untyped } -> Array[untyped]
21
+ def map: (Array[untyped], context: Riffer::Agent::Context?) { (untyped) -> untyped } -> Array[untyped]
22
22
  end
@@ -9,10 +9,11 @@
9
9
  class Riffer::Skills::ActivateTool < Riffer::Tool
10
10
  # Activates a skill by name and returns its body.
11
11
  #
12
- # [context] tool context containing +:skills+ (a Riffer::Skills::Context).
12
+ # [context] the agent's +Riffer::Agent::Context+, exposing +#skills+
13
+ # (a +Riffer::Skills::Context+).
13
14
  # [name] the skill name to activate.
14
15
  #
15
16
  # --
16
- # : (context: Hash[Symbol, untyped]?, name: String) -> Riffer::Tools::Response
17
- def call: (context: Hash[Symbol, untyped]?, name: String) -> Riffer::Tools::Response
17
+ # : (context: Riffer::Agent::Context?, name: String) -> Riffer::Tools::Response
18
+ def call: (context: Riffer::Agent::Context?, name: String) -> Riffer::Tools::Response
18
19
  end