riffer 0.48.0 → 0.49.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 (258) hide show
  1. checksums.yaml +4 -4
  2. data/.claude/rules/comments.md +2 -4
  3. data/.claude/rules/rbs-inline.md +2 -12
  4. data/.release-please-manifest.json +1 -1
  5. data/.rubocop.yml +5 -0
  6. data/CHANGELOG.md +19 -0
  7. data/docs/AGENTS.md +3 -5
  8. data/docs/AGENT_LIFECYCLE.md +13 -16
  9. data/docs/CONFIGURATION.md +22 -33
  10. data/docs/TOOL_ADVANCED.md +1 -3
  11. data/docs/TRACING.md +1 -1
  12. data/docs/providers/AMAZON_BEDROCK.md +31 -0
  13. data/docs/providers/OPENROUTER.md +18 -1
  14. data/docs-site/build.rb +0 -6
  15. data/docs-site/check.rb +1 -5
  16. data/lib/riffer/agent/config.rb +4 -45
  17. data/lib/riffer/agent/context.rb +2 -26
  18. data/lib/riffer/agent/outcome.rb +0 -20
  19. data/lib/riffer/agent/response.rb +0 -38
  20. data/lib/riffer/agent/run.rb +11 -43
  21. data/lib/riffer/agent/serializer.rb +10 -39
  22. data/lib/riffer/agent/session/repair.rb +3 -15
  23. data/lib/riffer/agent/session.rb +25 -38
  24. data/lib/riffer/agent/structured_output/result.rb +0 -8
  25. data/lib/riffer/agent/structured_output.rb +0 -7
  26. data/lib/riffer/agent.rb +10 -130
  27. data/lib/riffer/config/amazon_bedrock.rb +30 -0
  28. data/lib/riffer/config/anthropic.rb +21 -0
  29. data/lib/riffer/config/azure_open_ai.rb +30 -0
  30. data/lib/riffer/config/evals.rb +18 -0
  31. data/lib/riffer/config/files.rb +61 -0
  32. data/lib/riffer/config/gemini.rb +21 -0
  33. data/lib/riffer/config/mcp.rb +31 -0
  34. data/lib/riffer/config/open_ai.rb +30 -0
  35. data/lib/riffer/config/open_router.rb +21 -0
  36. data/lib/riffer/config/pricing/rates.rb +36 -0
  37. data/lib/riffer/config/pricing.rb +64 -0
  38. data/lib/riffer/config/skills.rb +38 -0
  39. data/lib/riffer/config/tracing.rb +43 -0
  40. data/lib/riffer/config.rb +3 -362
  41. data/lib/riffer/evals/evaluator.rb +1 -29
  42. data/lib/riffer/evals/evaluator_runner.rb +0 -15
  43. data/lib/riffer/evals/judge.rb +0 -8
  44. data/lib/riffer/evals/result.rb +1 -11
  45. data/lib/riffer/evals/run_result.rb +0 -12
  46. data/lib/riffer/evals/scenario_result.rb +0 -19
  47. data/lib/riffer/files/downloader.rb +2 -3
  48. data/lib/riffer/files/resolver.rb +2 -7
  49. data/lib/riffer/guardrail.rb +2 -22
  50. data/lib/riffer/guardrails/modification.rb +0 -8
  51. data/lib/riffer/guardrails/result.rb +0 -17
  52. data/lib/riffer/guardrails/runner.rb +2 -11
  53. data/lib/riffer/guardrails/tripwire.rb +0 -8
  54. data/lib/riffer/guardrails.rb +0 -2
  55. data/lib/riffer/helpers/boolean.rb +0 -4
  56. data/lib/riffer/helpers/call_or_value.rb +0 -3
  57. data/lib/riffer/helpers/deep_dup.rb +3 -8
  58. data/lib/riffer/helpers/dependencies.rb +0 -4
  59. data/lib/riffer/helpers/identifier.rb +3 -12
  60. data/lib/riffer/helpers/validate.rb +42 -0
  61. data/lib/riffer/mcp/authenticated_tool.rb +4 -12
  62. data/lib/riffer/mcp/client.rb +0 -7
  63. data/lib/riffer/mcp/manifest.rb +3 -7
  64. data/lib/riffer/mcp/registration.rb +0 -10
  65. data/lib/riffer/mcp/registry.rb +0 -9
  66. data/lib/riffer/mcp/search_tool.rb +0 -4
  67. data/lib/riffer/mcp/tool.rb +1 -4
  68. data/lib/riffer/mcp/tool_factory.rb +3 -6
  69. data/lib/riffer/mcp.rb +2 -23
  70. data/lib/riffer/messages/assistant/reasoning_part.rb +4 -21
  71. data/lib/riffer/messages/assistant/tool_call.rb +1 -9
  72. data/lib/riffer/messages/assistant.rb +1 -21
  73. data/lib/riffer/messages/base.rb +0 -12
  74. data/lib/riffer/messages/system.rb +0 -3
  75. data/lib/riffer/messages/tool.rb +0 -15
  76. data/lib/riffer/messages/user/file_part.rb +2 -30
  77. data/lib/riffer/messages/user.rb +0 -4
  78. data/lib/riffer/params/boolean.rb +1 -5
  79. data/lib/riffer/params/param.rb +3 -31
  80. data/lib/riffer/params.rb +8 -41
  81. data/lib/riffer/providers/amazon_bedrock.rb +101 -42
  82. data/lib/riffer/providers/anthropic.rb +9 -24
  83. data/lib/riffer/providers/azure_open_ai.rb +3 -8
  84. data/lib/riffer/providers/base.rb +7 -28
  85. data/lib/riffer/providers/finish_reason.rb +0 -6
  86. data/lib/riffer/providers/gemini/client.rb +4 -17
  87. data/lib/riffer/providers/gemini.rb +4 -10
  88. data/lib/riffer/providers/mock.rb +1 -26
  89. data/lib/riffer/providers/open_ai.rb +7 -17
  90. data/lib/riffer/providers/open_router.rb +105 -30
  91. data/lib/riffer/providers/repository.rb +2 -14
  92. data/lib/riffer/providers/token_usage.rb +5 -14
  93. data/lib/riffer/registrable.rb +11 -45
  94. data/lib/riffer/runner/fibers.rb +1 -6
  95. data/lib/riffer/runner/sequential.rb +0 -1
  96. data/lib/riffer/runner/threaded.rb +0 -3
  97. data/lib/riffer/runner.rb +0 -3
  98. data/lib/riffer/skills/activate_tool.rb +0 -3
  99. data/lib/riffer/skills/adapter.rb +0 -8
  100. data/lib/riffer/skills/backend.rb +2 -7
  101. data/lib/riffer/skills/config.rb +4 -20
  102. data/lib/riffer/skills/context.rb +0 -29
  103. data/lib/riffer/skills/filesystem_backend.rb +0 -7
  104. data/lib/riffer/skills/frontmatter.rb +2 -16
  105. data/lib/riffer/skills/markdown_adapter.rb +3 -6
  106. data/lib/riffer/skills/xml_adapter.rb +0 -3
  107. data/lib/riffer/stream_events/base.rb +0 -3
  108. data/lib/riffer/stream_events/finish_reason_done.rb +1 -6
  109. data/lib/riffer/stream_events/guardrail_modification.rb +0 -10
  110. data/lib/riffer/stream_events/guardrail_tripwire.rb +0 -10
  111. data/lib/riffer/stream_events/interrupt.rb +2 -12
  112. data/lib/riffer/stream_events/reasoning_delta.rb +0 -3
  113. data/lib/riffer/stream_events/reasoning_done.rb +1 -5
  114. data/lib/riffer/stream_events/skill_activation.rb +0 -3
  115. data/lib/riffer/stream_events/text_delta.rb +0 -2
  116. data/lib/riffer/stream_events/text_done.rb +0 -2
  117. data/lib/riffer/stream_events/token_usage_done.rb +0 -2
  118. data/lib/riffer/stream_events/tool_call_delta.rb +1 -5
  119. data/lib/riffer/stream_events/tool_call_done.rb +0 -5
  120. data/lib/riffer/stream_events/web_search_done.rb +0 -3
  121. data/lib/riffer/stream_events/web_search_status.rb +1 -5
  122. data/lib/riffer/testing/minitest.rb +4 -5
  123. data/lib/riffer/testing.rb +5 -38
  124. data/lib/riffer/tool.rb +2 -28
  125. data/lib/riffer/tools/response.rb +3 -32
  126. data/lib/riffer/tools/runtime/fibers.rb +0 -6
  127. data/lib/riffer/tools/runtime/inline.rb +0 -1
  128. data/lib/riffer/tools/runtime/threaded.rb +0 -6
  129. data/lib/riffer/tools/runtime.rb +5 -26
  130. data/lib/riffer/tools/toolable.rb +0 -37
  131. data/lib/riffer/tracing/capture.rb +3 -5
  132. data/lib/riffer/tracing/no_op.rb +0 -7
  133. data/lib/riffer/tracing/otel.rb +7 -16
  134. data/lib/riffer/tracing/stream_recorder.rb +0 -7
  135. data/lib/riffer/tracing.rb +4 -27
  136. data/lib/riffer/version.rb +1 -1
  137. data/lib/riffer.rb +2 -30
  138. data/sig/generated/riffer/agent/config.rbs +12 -48
  139. data/sig/generated/riffer/agent/context.rbs +2 -26
  140. data/sig/generated/riffer/agent/outcome.rbs +0 -20
  141. data/sig/generated/riffer/agent/response.rbs +1 -29
  142. data/sig/generated/riffer/agent/run.rbs +1 -27
  143. data/sig/generated/riffer/agent/serializer.rbs +2 -27
  144. data/sig/generated/riffer/agent/session/repair.rbs +2 -10
  145. data/sig/generated/riffer/agent/session.rbs +10 -36
  146. data/sig/generated/riffer/agent/structured_output/result.rbs +0 -7
  147. data/sig/generated/riffer/agent/structured_output.rbs +0 -7
  148. data/sig/generated/riffer/agent.rbs +5 -121
  149. data/sig/generated/riffer/config/amazon_bedrock.rbs +21 -0
  150. data/sig/generated/riffer/config/anthropic.rbs +15 -0
  151. data/sig/generated/riffer/config/azure_open_ai.rbs +21 -0
  152. data/sig/generated/riffer/config/evals.rbs +13 -0
  153. data/sig/generated/riffer/config/files.rbs +43 -0
  154. data/sig/generated/riffer/config/gemini.rbs +15 -0
  155. data/sig/generated/riffer/config/mcp.rbs +19 -0
  156. data/sig/generated/riffer/config/open_ai.rbs +21 -0
  157. data/sig/generated/riffer/config/open_router.rbs +15 -0
  158. data/sig/generated/riffer/config/pricing/rates.rbs +19 -0
  159. data/sig/generated/riffer/config/pricing.rbs +31 -0
  160. data/sig/generated/riffer/config/skills.rbs +19 -0
  161. data/sig/generated/riffer/config/tracing.rbs +25 -0
  162. data/sig/generated/riffer/config.rbs +2 -307
  163. data/sig/generated/riffer/evals/evaluator.rbs +0 -28
  164. data/sig/generated/riffer/evals/evaluator_runner.rbs +0 -14
  165. data/sig/generated/riffer/evals/judge.rbs +0 -7
  166. data/sig/generated/riffer/evals/result.rbs +1 -11
  167. data/sig/generated/riffer/evals/run_result.rbs +0 -12
  168. data/sig/generated/riffer/evals/scenario_result.rbs +0 -14
  169. data/sig/generated/riffer/files/resolver.rbs +0 -7
  170. data/sig/generated/riffer/guardrail.rbs +2 -22
  171. data/sig/generated/riffer/guardrails/modification.rbs +0 -6
  172. data/sig/generated/riffer/guardrails/result.rbs +0 -15
  173. data/sig/generated/riffer/guardrails/runner.rbs +0 -11
  174. data/sig/generated/riffer/guardrails/tripwire.rbs +0 -8
  175. data/sig/generated/riffer/guardrails.rbs +0 -2
  176. data/sig/generated/riffer/helpers/boolean.rbs +0 -4
  177. data/sig/generated/riffer/helpers/call_or_value.rbs +0 -3
  178. data/sig/generated/riffer/helpers/deep_dup.rbs +0 -8
  179. data/sig/generated/riffer/helpers/dependencies.rbs +0 -4
  180. data/sig/generated/riffer/helpers/identifier.rbs +0 -12
  181. data/sig/generated/riffer/helpers/validate.rbs +21 -0
  182. data/sig/generated/riffer/mcp/authenticated_tool.rbs +0 -5
  183. data/sig/generated/riffer/mcp/client.rbs +0 -7
  184. data/sig/generated/riffer/mcp/manifest.rbs +3 -7
  185. data/sig/generated/riffer/mcp/registration.rbs +0 -10
  186. data/sig/generated/riffer/mcp/registry.rbs +0 -9
  187. data/sig/generated/riffer/mcp/search_tool.rbs +0 -4
  188. data/sig/generated/riffer/mcp/tool.rbs +0 -4
  189. data/sig/generated/riffer/mcp/tool_factory.rbs +0 -6
  190. data/sig/generated/riffer/mcp.rbs +2 -22
  191. data/sig/generated/riffer/messages/assistant/reasoning_part.rbs +4 -17
  192. data/sig/generated/riffer/messages/assistant/tool_call.rbs +1 -9
  193. data/sig/generated/riffer/messages/assistant.rbs +10 -30
  194. data/sig/generated/riffer/messages/base.rbs +0 -12
  195. data/sig/generated/riffer/messages/system.rbs +0 -3
  196. data/sig/generated/riffer/messages/tool.rbs +0 -12
  197. data/sig/generated/riffer/messages/user/file_part.rbs +0 -30
  198. data/sig/generated/riffer/messages/user.rbs +0 -4
  199. data/sig/generated/riffer/params/boolean.rbs +1 -4
  200. data/sig/generated/riffer/params/param.rbs +0 -31
  201. data/sig/generated/riffer/params.rbs +4 -40
  202. data/sig/generated/riffer/providers/amazon_bedrock.rbs +29 -25
  203. data/sig/generated/riffer/providers/anthropic.rbs +0 -10
  204. data/sig/generated/riffer/providers/azure_open_ai.rbs +0 -8
  205. data/sig/generated/riffer/providers/base.rbs +0 -28
  206. data/sig/generated/riffer/providers/finish_reason.rbs +0 -6
  207. data/sig/generated/riffer/providers/gemini/client.rbs +4 -17
  208. data/sig/generated/riffer/providers/gemini.rbs +0 -6
  209. data/sig/generated/riffer/providers/mock.rbs +0 -26
  210. data/sig/generated/riffer/providers/open_ai.rbs +2 -9
  211. data/sig/generated/riffer/providers/open_router.rbs +33 -14
  212. data/sig/generated/riffer/providers/repository.rbs +2 -14
  213. data/sig/generated/riffer/providers/token_usage.rbs +5 -14
  214. data/sig/generated/riffer/registrable.rbs +0 -45
  215. data/sig/generated/riffer/runner/fibers.rbs +0 -6
  216. data/sig/generated/riffer/runner/sequential.rbs +0 -1
  217. data/sig/generated/riffer/runner/threaded.rbs +0 -3
  218. data/sig/generated/riffer/runner.rbs +0 -3
  219. data/sig/generated/riffer/skills/activate_tool.rbs +0 -3
  220. data/sig/generated/riffer/skills/adapter.rbs +0 -8
  221. data/sig/generated/riffer/skills/backend.rbs +2 -7
  222. data/sig/generated/riffer/skills/config.rbs +0 -20
  223. data/sig/generated/riffer/skills/context.rbs +0 -29
  224. data/sig/generated/riffer/skills/filesystem_backend.rbs +0 -7
  225. data/sig/generated/riffer/skills/frontmatter.rbs +2 -16
  226. data/sig/generated/riffer/skills/markdown_adapter.rbs +0 -6
  227. data/sig/generated/riffer/skills/xml_adapter.rbs +0 -3
  228. data/sig/generated/riffer/stream_events/base.rbs +0 -3
  229. data/sig/generated/riffer/stream_events/finish_reason_done.rbs +1 -6
  230. data/sig/generated/riffer/stream_events/guardrail_modification.rbs +0 -10
  231. data/sig/generated/riffer/stream_events/guardrail_tripwire.rbs +0 -10
  232. data/sig/generated/riffer/stream_events/interrupt.rbs +2 -10
  233. data/sig/generated/riffer/stream_events/reasoning_delta.rbs +0 -3
  234. data/sig/generated/riffer/stream_events/reasoning_done.rbs +1 -5
  235. data/sig/generated/riffer/stream_events/skill_activation.rbs +0 -3
  236. data/sig/generated/riffer/stream_events/text_delta.rbs +0 -2
  237. data/sig/generated/riffer/stream_events/text_done.rbs +0 -2
  238. data/sig/generated/riffer/stream_events/token_usage_done.rbs +0 -2
  239. data/sig/generated/riffer/stream_events/tool_call_delta.rbs +1 -5
  240. data/sig/generated/riffer/stream_events/tool_call_done.rbs +0 -5
  241. data/sig/generated/riffer/stream_events/web_search_done.rbs +0 -3
  242. data/sig/generated/riffer/stream_events/web_search_status.rbs +1 -5
  243. data/sig/generated/riffer/testing.rbs +0 -38
  244. data/sig/generated/riffer/tool.rbs +0 -27
  245. data/sig/generated/riffer/tools/response.rbs +3 -29
  246. data/sig/generated/riffer/tools/runtime/fibers.rbs +0 -5
  247. data/sig/generated/riffer/tools/runtime/inline.rbs +0 -1
  248. data/sig/generated/riffer/tools/runtime/threaded.rbs +0 -5
  249. data/sig/generated/riffer/tools/runtime.rbs +2 -24
  250. data/sig/generated/riffer/tools/toolable.rbs +0 -37
  251. data/sig/generated/riffer/tracing/capture.rbs +2 -5
  252. data/sig/generated/riffer/tracing/no_op.rbs +0 -7
  253. data/sig/generated/riffer/tracing/otel.rbs +7 -16
  254. data/sig/generated/riffer/tracing/stream_recorder.rbs +0 -2
  255. data/sig/generated/riffer/tracing.rbs +4 -23
  256. data/sig/generated/riffer.rbs +2 -29
  257. data/sig/manual/riffer/helpers/validate.rbs +5 -0
  258. metadata +30 -1
@@ -1,42 +1,30 @@
1
1
  # Generated from lib/riffer/messages/base.rb with RBS::Inline
2
2
 
3
- # Base class for all message types. Subclasses must implement +role+.
4
3
  class Riffer::Messages::Base
5
- # Builds the matching message subclass from a hash, or returns +msg+ unchanged
6
- # when it is already a message. Raises Riffer::ArgumentError on an invalid message.
7
4
  # --
8
5
  # : ((Hash[Symbol, untyped] | Riffer::Messages::Base)) -> Riffer::Messages::Base
9
6
  def self.from_hash: (Hash[Symbol, untyped] | Riffer::Messages::Base) -> Riffer::Messages::Base
10
7
 
11
- # The message content.
12
8
  attr_reader content: String
13
9
 
14
- # The message id, or nil when +Riffer.config.message_id_strategy+ is +:none+.
15
10
  attr_reader id: String?
16
11
 
17
12
  # --
18
13
  # : (String, ?id: String?) -> void
19
14
  def initialize: (String, ?id: String?) -> void
20
15
 
21
- # Converts the message to a hash.
22
- #
23
16
  # --
24
17
  # : () -> Hash[Symbol, untyped]
25
18
  def to_h: () -> Hash[Symbol, untyped]
26
19
 
27
- # Returns the message role.
28
20
  # --
29
21
  # : () -> Symbol
30
22
  def role: () -> Symbol
31
23
 
32
- # Whether this message carries pending tool calls (overridden by
33
- # +Riffer::Messages::Assistant+).
34
24
  # --
35
25
  # : () -> bool
36
26
  def has_tool_calls?: () -> bool
37
27
 
38
- # Merges another same-role message into this one. +Tool+ messages are never
39
- # merged.
40
28
  # --
41
29
  # : (untyped) -> Riffer::Messages::Base
42
30
  def +: (untyped) -> Riffer::Messages::Base
@@ -1,9 +1,6 @@
1
1
  # Generated from lib/riffer/messages/system.rb with RBS::Inline
2
2
 
3
- # Represents a system message (instructions) in a conversation.
4
3
  class Riffer::Messages::System < Riffer::Messages::Base
5
- # Builds a System message from a hash, or returns +msg+ unchanged when it is
6
- # already a System message.
7
4
  # --
8
5
  # : ((Hash[Symbol, untyped] | Riffer::Messages::System)) -> Riffer::Messages::System
9
6
  def self.from_hash: (Hash[Symbol, untyped] | Riffer::Messages::System) -> Riffer::Messages::System
@@ -1,32 +1,22 @@
1
1
  # Generated from lib/riffer/messages/tool.rb with RBS::Inline
2
2
 
3
- # Represents a tool execution result in a conversation.
4
3
  class Riffer::Messages::Tool < Riffer::Messages::Base
5
- # Builds a Tool message from a hash, or returns +msg+ unchanged when it is
6
- # already a Tool message.
7
4
  # --
8
5
  # : ((Hash[Symbol, untyped] | Riffer::Messages::Tool)) -> Riffer::Messages::Tool
9
6
  def self.from_hash: (Hash[Symbol, untyped] | Riffer::Messages::Tool) -> Riffer::Messages::Tool
10
7
 
11
- # The ID of the tool call this result responds to.
12
8
  attr_reader tool_call_id: String
13
9
 
14
- # The name of the tool that was called.
15
10
  attr_reader name: String
16
11
 
17
- # The error message if the tool execution failed.
18
12
  attr_reader error: String?
19
13
 
20
- # The type of error (:unknown_tool, :validation_error, :execution_error,
21
- # :timeout_error, :unhandled_error).
22
14
  attr_reader error_type: Symbol?
23
15
 
24
16
  # --
25
17
  # : (String, tool_call_id: String, name: String, ?id: String?, ?error: String?, ?error_type: Symbol?) -> void
26
18
  def initialize: (String, tool_call_id: String, name: String, ?id: String?, ?error: String?, ?error_type: Symbol?) -> void
27
19
 
28
- # Returns true if the tool execution resulted in an error.
29
- #
30
20
  # --
31
21
  # : () -> bool
32
22
  def error?: () -> bool
@@ -35,8 +25,6 @@ class Riffer::Messages::Tool < Riffer::Messages::Base
35
25
  # : () -> Symbol
36
26
  def role: () -> Symbol
37
27
 
38
- # Converts the message to a hash.
39
- #
40
28
  # --
41
29
  # : () -> Hash[Symbol, untyped]
42
30
  def to_h: () -> Hash[Symbol, untyped]
@@ -1,7 +1,5 @@
1
1
  # Generated from lib/riffer/messages/user/file_part.rb with RBS::Inline
2
2
 
3
- # Represents a file attachment (image or document) — from a URL (+from_url+) or
4
- # raw base64 data (+new+).
5
3
  class Riffer::Messages::User::FilePart
6
4
  @data_bytes: String?
7
5
 
@@ -17,41 +15,28 @@ class Riffer::Messages::User::FilePart
17
15
 
18
16
  SHA256_PATTERN: Regexp
19
17
 
20
- # The MIME type of the file.
21
18
  attr_reader media_type: String
22
19
 
23
- # The filename, if available.
24
20
  attr_reader filename: String?
25
21
 
26
- # The expected SHA-256 of the file contents, if the caller supplied one.
27
22
  attr_reader sha256: String?
28
23
 
29
- # Raises Riffer::ArgumentError unless +data+ or +url+ is given and
30
- # +media_type+ is supported.
31
24
  # --
32
25
  # : (media_type: String, ?data: String?, ?filename: String?, ?url: String?, ?sha256: String?) -> void
33
26
  def initialize: (media_type: String, ?data: String?, ?filename: String?, ?url: String?, ?sha256: String?) -> void
34
27
 
35
- # Creates a FilePart from a URL, detecting +media_type+ from the path
36
- # extension when omitted. Raises Riffer::ArgumentError if it can't be detected.
37
28
  # --
38
29
  # : (String, ?media_type: String?, ?filename: String?, ?sha256: String?) -> Riffer::Messages::User::FilePart
39
30
  def self.from_url: (String, ?media_type: String?, ?filename: String?, ?sha256: String?) -> Riffer::Messages::User::FilePart
40
31
 
41
- # Builds a FilePart from a +{url:, media_type:}+ or +{data:, media_type:}+ hash,
42
- # or returns +file+ unchanged when it is already a FilePart. Raises
43
- # Riffer::ArgumentError on an invalid hash.
44
32
  # --
45
33
  # : ((Hash[Symbol, untyped] | Riffer::Messages::User::FilePart)) -> Riffer::Messages::User::FilePart
46
34
  def self.from_hash: (Hash[Symbol, untyped] | Riffer::Messages::User::FilePart) -> Riffer::Messages::User::FilePart
47
35
 
48
- # Raises Riffer::ArgumentError when the URL's extension isn't a known media type.
49
36
  # --
50
37
  # : (String) -> String
51
38
  def self.detect_media_type: (String) -> String
52
39
 
53
- # The base64-encoded contents - caller-supplied, or filled in by the file
54
- # resolver after a download. Nil for a URL source riffer hasn't fetched.
55
40
  # --
56
41
  # : () -> String?
57
42
  def data: () -> String?
@@ -62,44 +47,29 @@ class Riffer::Messages::User::FilePart
62
47
  # : (String) -> void
63
48
  def cache_data_bytes: (String) -> void
64
49
 
65
- # Whether data was supplied directly, as opposed to filled in later by the
66
- # file resolver after a download
67
50
  # : () -> bool
68
51
  def inline_data?: () -> bool
69
52
 
70
- # Caches bytes fetched for a URL source. Deliberately absent from +to_h+:
71
- # the agent loop re-sends history on every turn, so the cache saves refreshing
72
- # the same file, while persisted history stays free of megabytes of base64
73
53
  # --
74
54
  # : (String) -> void
75
55
  def cache_downloaded_data: (String) -> void
76
56
 
77
- # Returns the URL if the source was a URL, nil otherwise.
78
- #
79
57
  # --
80
58
  # : () -> String?
81
59
  def url: () -> String?
82
60
 
83
- # Returns true if the source was a URL.
84
- #
85
61
  # --
86
62
  # : () -> bool
87
63
  def url?: () -> bool
88
64
 
89
- # Returns true if the file is an image.
90
- #
91
65
  # --
92
66
  # : () -> bool
93
67
  def image?: () -> bool
94
68
 
95
- # Returns true if the file is a document (not an image).
96
- #
97
69
  # --
98
70
  # : () -> bool
99
71
  def document?: () -> bool
100
72
 
101
- # Serializes the FilePart to a hash.
102
- #
103
73
  # --
104
74
  # : () -> Hash[Symbol, untyped]
105
75
  def to_h: () -> Hash[Symbol, untyped]
@@ -1,14 +1,10 @@
1
1
  # Generated from lib/riffer/messages/user.rb with RBS::Inline
2
2
 
3
- # Represents a user message in a conversation.
4
3
  class Riffer::Messages::User < Riffer::Messages::Base
5
- # Builds a User message from a hash, or returns +msg+ unchanged when it is
6
- # already a User message. Raises Riffer::ArgumentError on an invalid file.
7
4
  # --
8
5
  # : ((Hash[Symbol, untyped] | Riffer::Messages::User)) -> Riffer::Messages::User
9
6
  def self.from_hash: (Hash[Symbol, untyped] | Riffer::Messages::User) -> Riffer::Messages::User
10
7
 
11
- # File attachments for this message.
12
8
  attr_reader files: Array[Riffer::Messages::User::FilePart]
13
9
 
14
10
  # --
@@ -1,8 +1,5 @@
1
1
  # Generated from lib/riffer/params/boolean.rb with RBS::Inline
2
2
 
3
- # Sentinel type for declaring boolean parameters — Ruby has no +Boolean+ class
4
- # (+true+/+false+ are +TrueClass+/+FalseClass+).
5
- #
6
- # required :verbose, Riffer::Params::Boolean
3
+ # Ruby has no +Boolean+ class, so params declare booleans with this sentinel.
7
4
  module Riffer::Params::Boolean
8
5
  end
@@ -1,44 +1,28 @@
1
1
  # Generated from lib/riffer/params/param.rb with RBS::Inline
2
2
 
3
- # A single parameter definition, handling type validation and JSON Schema
4
- # generation.
5
3
  class Riffer::Params::Param
6
- # Maps Ruby types to JSON Schema type strings
7
4
  TYPE_MAPPINGS: Hash[Module, String]
8
5
 
9
- # Primitive types allowed for the <tt>of:</tt> keyword on Array params
10
6
  PRIMITIVE_TYPES: Array[Module]
11
7
 
12
- # Maps JSON Schema type strings back to Ruby types (inverse of TYPE_MAPPINGS),
13
- # collapsing the three boolean spellings onto Riffer::Params::Boolean.
14
8
  JSON_TYPE_MAPPINGS: Hash[String, Module]
15
9
 
16
- # The parameter name.
17
10
  attr_reader name: Symbol
18
11
 
19
- # The Ruby type.
20
12
  attr_reader type: Module
21
13
 
22
- # Whether the parameter is required.
23
14
  attr_reader required: bool
24
15
 
25
- # The parameter description, if any.
26
16
  attr_reader description: String?
27
17
 
28
- # Allowed values, if constrained.
29
18
  attr_reader enum: Array[untyped]?
30
19
 
31
- # The default value, if any.
32
20
  attr_reader default: untyped
33
21
 
34
- # Element type for a typed array (+of:+).
35
22
  attr_reader item_type: Module?
36
23
 
37
- # Nested Params for object / array-of-object types.
38
24
  attr_reader nested_params: Riffer::Params?
39
25
 
40
- # Reconstructs a Param from a single JSON Schema property. Raises
41
- # Riffer::ArgumentError on a type outside the Params-expressible subset.
42
26
  # --
43
27
  # : (Symbol, Hash[Symbol, untyped], required: bool) -> Riffer::Params::Param
44
28
  def self.from_json_schema: (Symbol, Hash[Symbol, untyped], required: bool) -> Riffer::Params::Param
@@ -47,9 +31,6 @@ class Riffer::Params::Param
47
31
  # : (Module, Hash[Symbol, untyped]) -> [Module?, Riffer::Params?]
48
32
  def self.resolve_nesting: (Module, Hash[Symbol, untyped]) -> [ Module?, Riffer::Params? ]
49
33
 
50
- # Resolves a JSON Schema +type+ (or a <tt>[type, "null"]</tt> union) to its
51
- # Ruby type. Returns a Module — Riffer::Params::Boolean is a Module, not a
52
- # Class. Raises Riffer::ArgumentError on an unsupported type.
53
34
  # --
54
35
  # : (untyped) -> Module
55
36
  def self.json_type_to_ruby: (untyped) -> Module
@@ -58,26 +39,14 @@ class Riffer::Params::Param
58
39
  # : (name: Symbol, type: Module, required: bool, ?description: String?, ?enum: Array[untyped]?, ?default: untyped, ?item_type: Module?, ?nested_params: Riffer::Params?) -> void
59
40
  def initialize: (name: Symbol, type: Module, required: bool, ?description: String?, ?enum: Array[untyped]?, ?default: untyped, ?item_type: Module?, ?nested_params: Riffer::Params?) -> void
60
41
 
61
- # Validates that a value matches the expected type.
62
- #
63
42
  # --
64
43
  # : (untyped) -> bool
65
44
  def valid_type?: (untyped) -> bool
66
45
 
67
- # Returns the JSON Schema type name for this parameter.
68
- #
69
46
  # --
70
47
  # : () -> String
71
48
  def type_name: () -> String
72
49
 
73
- # Converts this parameter to JSON Schema format. When +strict+, optional
74
- # params are made nullable (<tt>["type", "null"]</tt>) so strict providers
75
- # distinguish absent from present; optional params with an +enum+ use +anyOf+
76
- # instead, since providers like Anthropic reject
77
- # <tt>{"type": ["string", "null"], "enum": [...]}</tt>. Raises
78
- # Riffer::ArgumentError when +strict+ and a Hash param has no block or an
79
- # Array param has neither a block nor <tt>of:</tt>, since strict providers
80
- # reject objects without +properties+ and arrays without +items+.
81
50
  # --
82
51
  # : (?strict: bool) -> Hash[Symbol, untyped]
83
52
  def to_json_schema: (?strict: bool) -> Hash[Symbol, untyped]
@@ -1,69 +1,38 @@
1
1
  # Generated from lib/riffer/params.rb with RBS::Inline
2
2
 
3
- # A DSL for defining tool parameters and structured-output schemas, used within
4
- # a Tool's +params+ block.
5
- #
6
- # params do
7
- # required :city, String, description: "The city name"
8
- # optional :units, String, default: "celsius", enum: ["celsius", "fahrenheit"]
9
- # end
10
3
  class Riffer::Params
11
- # The defined parameters.
12
4
  attr_reader parameters: Array[Riffer::Params::Param]
13
5
 
14
6
  # --
15
7
  # : () -> void
16
8
  def initialize: () -> void
17
9
 
18
- # Reconstructs a Params from a JSON Schema object — the inverse of
19
- # +to_json_schema(strict: false)+. Raises Riffer::ArgumentError on features
20
- # outside the Params-expressible subset of JSON Schema.
21
- #
22
- # schema = params.to_json_schema(strict: false)
23
- # Riffer::Params.from_json_schema(schema) # => equivalent Riffer::Params
24
- #
10
+ # The inverse of +to_json_schema(strict: false)+. Raises Riffer::ArgumentError
11
+ # on features outside the Params-expressible subset of JSON Schema.
25
12
  # --
26
13
  # : (Hash[Symbol, untyped]) -> Riffer::Params
27
14
  def self.from_json_schema: (Hash[Symbol, untyped]) -> Riffer::Params
28
15
 
29
- # Defines a required parameter.
30
- #
31
16
  # --
32
17
  # : (Symbol, Module, ?description: String?, ?enum: Array[untyped]?, ?of: Module?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> void
33
18
  def required: (Symbol, Module, ?description: String?, ?enum: Array[untyped]?, ?of: Module?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> void
34
19
 
35
- # Defines an optional parameter.
36
- #
37
20
  # --
38
21
  # : (Symbol, Module, ?description: String?, ?enum: Array[untyped]?, ?default: untyped, ?of: Module?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> void
39
22
  def optional: (Symbol, Module, ?description: String?, ?enum: Array[untyped]?, ?default: untyped, ?of: Module?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> void
40
23
 
41
- # Validates arguments against parameter definitions.
42
- #
43
- # A Float param accepts an Integer (JSON Schema <tt>"number"</tt> covers
44
- # integers) and its value is coerced with +to_f+, so callers always get a
45
- # Float. The same holds for the items of an <tt>of: Float</tt> array. No other
46
- # type is coerced.
47
- #
48
- # Raises Riffer::ValidationError if validation fails.
49
- #
50
24
  # --
51
25
  # : (Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
52
26
  def validate: (Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
53
27
 
54
- # Converts all parameters to JSON Schema format. When +strict+ is true, every
55
- # property is listed in +required+ and optional ones are made nullable
56
- # instead, satisfying providers that enforce strict structured output schemas.
57
- # Raises Riffer::ArgumentError when +strict+ and a Hash param (at any depth)
58
- # has no block or an Array param has neither a block nor <tt>of:</tt>.
59
28
  # --
60
29
  # : (?strict: bool) -> Hash[Symbol, untyped]
61
30
  def to_json_schema: (?strict: bool) -> Hash[Symbol, untyped]
62
31
 
63
32
  private
64
33
 
65
- # +dup+ would leave the copy sharing this one's parameters, so a caller
66
- # defining a parameter on either would reach the other.
34
+ # Without this, +dup+ shares parameters, so defining one on either copy
35
+ # would reach the other.
67
36
  # --
68
37
  # : (Riffer::Params) -> void
69
38
  def initialize_copy: (Riffer::Params) -> void
@@ -84,15 +53,10 @@ class Riffer::Params
84
53
  # : (Riffer::Params::Param, Array[untyped], Array[String]) -> Array[untyped]
85
54
  def validate_nested_array_of_objects: (Riffer::Params::Param, Array[untyped], Array[String]) -> Array[untyped]
86
55
 
87
- # Returns the array with its valid items coerced by +coerce_value+.
88
56
  # --
89
57
  # : (Riffer::Params::Param, Array[untyped], Array[String]) -> Array[untyped]
90
58
  def validate_typed_array: (Riffer::Params::Param, Array[untyped], Array[String]) -> Array[untyped]
91
59
 
92
- # Coerces an already-validated value to the Ruby type its param declares.
93
- # Only Float coerces today, because JSON Schema "number" accepts integers and
94
- # callers should not get a type that depends on whether the model wrote a
95
- # decimal point. Add a branch here rather than inline at a call site.
96
60
  # --
97
61
  # : (Module, untyped) -> untyped
98
62
  def coerce_value: (Module, untyped) -> untyped
@@ -1,21 +1,19 @@
1
1
  # Generated from lib/riffer/providers/amazon_bedrock.rb with RBS::Inline
2
2
 
3
- # Amazon Bedrock provider for Claude and other foundation models. Requires the
4
- # +aws-sdk-bedrockruntime+ gem.
5
3
  class Riffer::Providers::AmazonBedrock < Riffer::Providers::Base
6
- # Matches Anthropic models on Bedrock — bare (+anthropic.claude-...+) and
7
- # cross-region (+us.anthropic.claude-...+) ids.
4
+ # Bedrock ids are bare (+anthropic.claude-...+) or cross-region (+us.anthropic.claude-...+).
8
5
  ANTHROPIC_MODEL_PATTERN: Regexp
9
6
 
10
7
  FINISH_REASONS: Hash[String, Symbol]
11
8
 
12
- # Returns the skill adapter for the Bedrock model — XML for Anthropic models
13
- # (which Bedrock hosts alongside other vendors'), else Markdown.
9
+ # Only parts carrying this tag are replayed, so reasoning captured by another
10
+ # adapter, whose signatures Converse cannot verify, never reaches the request.
11
+ REASONING_FORMAT: String
12
+
14
13
  # --
15
14
  # : (?String?) -> singleton(Riffer::Skills::Adapter)
16
15
  def self.skills_adapter: (?String?) -> singleton(Riffer::Skills::Adapter)
17
16
 
18
- # The GenAI semconv well-known provider name.
19
17
  # --
20
18
  # : () -> String
21
19
  def self.semconv_provider_name: () -> String
@@ -34,9 +32,6 @@ class Riffer::Providers::AmazonBedrock < Riffer::Providers::Base
34
32
  # : () -> untyped
35
33
  def global_client: () -> untyped
36
34
 
37
- # Compacted so an unset region stays absent: the AWS SDK resolves +AWS_REGION+
38
- # and the shared config only for a missing argument, and raises
39
- # +Aws::Errors::MissingRegionError+ on an explicit nil.
40
35
  # --
41
36
  # : () -> untyped
42
37
  def build_client: () -> untyped
@@ -45,10 +40,6 @@ class Riffer::Providers::AmazonBedrock < Riffer::Providers::Base
45
40
  # : (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
46
41
  def build_request_params: (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
47
42
 
48
- # Converse treats +tools -> system -> messages+ as one prefix and looks back
49
- # from a +cachePoint+ for the longest cached run, so the point on the final
50
- # message reuses the previous step's cache wherever that point sat. Mixed
51
- # ttls must be ordered 1h before 5m, so both points share one.
52
43
  # --
53
44
  # : (Hash[Symbol, untyped], untyped) -> void
54
45
  def apply_cache_point: (Hash[Symbol, untyped], untyped) -> void
@@ -65,8 +56,6 @@ class Riffer::Providers::AmazonBedrock < Riffer::Providers::Base
65
56
  # : (untyped) -> Riffer::Providers::TokenUsage?
66
57
  def extract_token_usage: (untyped) -> Riffer::Providers::TokenUsage?
67
58
 
68
- # Converse's +input_tokens+ excludes the cache buckets; TokenUsage's
69
- # input includes them.
70
59
  # --
71
60
  # : (untyped) -> Riffer::Providers::TokenUsage
72
61
  def build_token_usage: (untyped) -> Riffer::Providers::TokenUsage
@@ -87,23 +76,24 @@ class Riffer::Providers::AmazonBedrock < Riffer::Providers::Base
87
76
  # : (untyped) -> Array[Riffer::Messages::Assistant::ToolCall]
88
77
  def extract_tool_calls: (untyped) -> Array[Riffer::Messages::Assistant::ToolCall]
89
78
 
79
+ # --
80
+ # : (untyped) -> Array[Riffer::Messages::Assistant::ReasoningPart]
81
+ def extract_reasoning: (untyped) -> Array[Riffer::Messages::Assistant::ReasoningPart]
82
+
83
+ # +redacted_content+ is raw bytes; it is stored Base64-encoded so the part
84
+ # survives JSON persistence.
85
+ # --
86
+ # : (?text: String?, ?signature: String?, ?redacted_content: String?) -> Riffer::Messages::Assistant::ReasoningPart
87
+ def build_reasoning_part: (?text: String?, ?signature: String?, ?redacted_content: String?) -> Riffer::Messages::Assistant::ReasoningPart
88
+
90
89
  # --
91
90
  # : (Hash[Symbol, untyped], Riffer::Providers::_EventSink) -> void
92
91
  def execute_stream: (Hash[Symbol, untyped], Riffer::Providers::_EventSink) -> void
93
92
 
94
- # Re-raises an +Aws::Errors::EventError+ event with a message built from its
95
- # error code and message. The SDK's own +#message+ is just the class name,
96
- # so without this the failure would be unreadable.
97
93
  # --
98
94
  # : (untyped) -> void
99
95
  def raise_stream_event_error!: (untyped) -> void
100
96
 
101
- # Re-raises a Bedrock stream-exception event as the matching
102
- # +Aws::BedrockRuntime::Errors+ class. ConverseStream delivers API errors on
103
- # the same channel as content, so without this a mid-stream failure would
104
- # silently end the stream with no content. Non-exception events that we do
105
- # not consume (including the SDK's +:unknown_event+ struct) are ignored for
106
- # forward compatibility.
107
97
  # --
108
98
  # : (untyped) -> void
109
99
  def raise_if_stream_exception!: (untyped) -> void
@@ -120,6 +110,16 @@ class Riffer::Providers::AmazonBedrock < Riffer::Providers::Base
120
110
  # : (untyped, state: Hash[Symbol, untyped], yielder: Riffer::Providers::_EventSink) -> void
121
111
  def handle_content_block_delta_tool_use: (untyped, state: Hash[Symbol, untyped], yielder: Riffer::Providers::_EventSink) -> void
122
112
 
113
+ # A reasoning block streams its text in pieces, then its signature (or its
114
+ # redacted bytes) in a delta of its own.
115
+ # --
116
+ # : (untyped, state: Hash[Symbol, untyped], yielder: Riffer::Providers::_EventSink) -> void
117
+ def handle_reasoning_delta: (untyped, state: Hash[Symbol, untyped], yielder: Riffer::Providers::_EventSink) -> void
118
+
119
+ # --
120
+ # : (untyped, state: Hash[Symbol, untyped], yielder: Riffer::Providers::_EventSink) -> void
121
+ def handle_reasoning_stop: (untyped, state: Hash[Symbol, untyped], yielder: Riffer::Providers::_EventSink) -> void
122
+
123
123
  # --
124
124
  # : (untyped, state: Hash[Symbol, untyped], yielder: Riffer::Providers::_EventSink) -> void
125
125
  def handle_content_block_stop_text_delta: (untyped, state: Hash[Symbol, untyped], yielder: Riffer::Providers::_EventSink) -> void
@@ -140,6 +140,10 @@ class Riffer::Providers::AmazonBedrock < Riffer::Providers::Base
140
140
  # : (Riffer::Messages::Assistant) -> Hash[Symbol, untyped]
141
141
  def convert_assistant_to_bedrock_format: (Riffer::Messages::Assistant) -> Hash[Symbol, untyped]
142
142
 
143
+ # --
144
+ # : (Riffer::Messages::Assistant::ReasoningPart) -> Hash[Symbol, untyped]
145
+ def convert_reasoning_part_to_bedrock_format: (Riffer::Messages::Assistant::ReasoningPart) -> Hash[Symbol, untyped]
146
+
143
147
  # --
144
148
  # : (Array[Hash[Symbol, untyped]], Riffer::Messages::Tool) -> void
145
149
  def append_tool_result: (Array[Hash[Symbol, untyped]], Riffer::Messages::Tool) -> void
@@ -1,19 +1,14 @@
1
1
  # Generated from lib/riffer/providers/anthropic.rb with RBS::Inline
2
2
 
3
- # Anthropic provider for Claude models via the Anthropic API. Requires the
4
- # +anthropic+ gem.
5
3
  class Riffer::Providers::Anthropic < Riffer::Providers::Base
6
4
  WEB_SEARCH_TOOL_TYPE: String
7
5
 
8
6
  FINISH_REASONS: Hash[String, Symbol]
9
7
 
10
- # Returns the XML skill adapter for Anthropic/Claude.
11
- #
12
8
  # --
13
9
  # : (?String?) -> singleton(Riffer::Skills::Adapter)
14
10
  def self.skills_adapter: (?String?) -> singleton(Riffer::Skills::Adapter)
15
11
 
16
- # The GenAI semconv well-known provider name.
17
12
  # --
18
13
  # : () -> String
19
14
  def self.semconv_provider_name: () -> String
@@ -28,9 +23,6 @@ class Riffer::Providers::Anthropic < Riffer::Providers::Base
28
23
  # : () -> untyped
29
24
  def global_client: () -> untyped
30
25
 
31
- # Compacted for the same reason as the other providers: never hand an SDK an
32
- # explicit nil credential, so its own +ANTHROPIC_API_KEY+ resolution stays
33
- # reachable regardless of how that SDK distinguishes nil from absent.
34
26
  # --
35
27
  # : () -> untyped
36
28
  def build_client: () -> untyped
@@ -55,8 +47,6 @@ class Riffer::Providers::Anthropic < Riffer::Providers::Base
55
47
  # : (untyped) -> Riffer::Providers::FinishReason?
56
48
  def build_finish_reason: (untyped) -> Riffer::Providers::FinishReason?
57
49
 
58
- # Anthropic's +input_tokens+ excludes the cache buckets; TokenUsage's
59
- # input includes them.
60
50
  # --
61
51
  # : (untyped) -> Riffer::Providers::TokenUsage
62
52
  def build_token_usage: (untyped) -> Riffer::Providers::TokenUsage
@@ -1,10 +1,6 @@
1
1
  # Generated from lib/riffer/providers/azure_open_ai.rb with RBS::Inline
2
2
 
3
- # Azure OpenAI provider for GPT models hosted on Azure. Requires the +openai+
4
- # gem. Credentials resolve from config, then +AZURE_OPENAI_API_KEY+ /
5
- # +AZURE_OPENAI_ENDPOINT+.
6
3
  class Riffer::Providers::AzureOpenAI < Riffer::Providers::OpenAI
7
- # The GenAI semconv well-known provider name.
8
4
  # --
9
5
  # : () -> String
10
6
  def self.semconv_provider_name: () -> String
@@ -15,10 +11,6 @@ class Riffer::Providers::AzureOpenAI < Riffer::Providers::OpenAI
15
11
  # : () -> untyped
16
12
  def global_client: () -> untyped
17
13
 
18
- # Deliberately not compacted: this borrows the OpenAI SDK to talk to Azure, so
19
- # omitting an unset argument would let the SDK fall back to +OPENAI_API_KEY+
20
- # and +OPENAI_BASE_URL+ — sending Azure traffic, and an OpenAI credential, to
21
- # whatever those name. Passing nil raises in the SDK instead.
22
14
  # --
23
15
  # : () -> untyped
24
16
  def build_client: () -> untyped
@@ -1,9 +1,5 @@
1
1
  # Generated from lib/riffer/providers/base.rb with RBS::Inline
2
2
 
3
- # Base class for all LLM providers. A template-method flow: subclasses implement
4
- # the hooks (+build_request_params+, +execute_generate+, +execute_stream+,
5
- # +extract_token_usage+, +extract_content+, +extract_tool_calls+) and the base
6
- # class orchestrates them.
7
3
  class Riffer::Providers::Base
8
4
  self.@semconv_provider_name: String?
9
5
 
@@ -15,28 +11,18 @@ class Riffer::Providers::Base
15
11
 
16
12
  WIRE_SEPARATOR: String
17
13
 
18
- # Returns the preferred skill adapter for this provider; override in
19
- # subclasses (optionally introspecting +model+) for provider-specific formats.
20
14
  # --
21
15
  # : (?String?) -> singleton(Riffer::Skills::Adapter)
22
16
  def self.skills_adapter: (?String?) -> singleton(Riffer::Skills::Adapter)
23
17
 
24
- # Returns the provider name stamped as <tt>gen_ai.provider.name</tt> on trace
25
- # spans, ideally a GenAI semconv well-known value. Defaults to the snake_cased
26
- # class name rather than raising like the abstract provider methods, so
27
- # enabling tracing never breaks an otherwise-working custom provider.
28
18
  # --
29
19
  # : () -> String
30
20
  def self.semconv_provider_name: () -> String
31
21
 
32
- # Generates text using the provider.
33
- #
34
22
  # --
35
23
  # : (?prompt: String?, ?system: String?, ?messages: Array[Hash[Symbol, untyped] | Riffer::Messages::Base]?, ?model: String?, ?files: Array[Hash[Symbol, untyped] | Riffer::Messages::User::FilePart]?, **untyped) -> Riffer::Messages::Assistant
36
24
  def generate_text: (?prompt: String?, ?system: String?, ?messages: Array[Hash[Symbol, untyped] | Riffer::Messages::Base]?, ?model: String?, ?files: Array[Hash[Symbol, untyped] | Riffer::Messages::User::FilePart]?, **untyped) -> Riffer::Messages::Assistant
37
25
 
38
- # Streams text from the provider.
39
- #
40
26
  # --
41
27
  # : (?prompt: String?, ?system: String?, ?messages: Array[Hash[Symbol, untyped] | Riffer::Messages::Base]?, ?model: String?, ?files: Array[Hash[Symbol, untyped] | Riffer::Messages::User::FilePart]?, **untyped) -> Enumerator[Riffer::StreamEvents::Base, void]
42
28
  def stream_text: (?prompt: String?, ?system: String?, ?messages: Array[Hash[Symbol, untyped] | Riffer::Messages::Base]?, ?model: String?, ?files: Array[Hash[Symbol, untyped] | Riffer::Messages::User::FilePart]?, **untyped) -> Enumerator[Riffer::StreamEvents::Base, void]
@@ -50,16 +36,10 @@ class Riffer::Providers::Base
50
36
  # : (String) -> true
51
37
  def depends_on: (String) -> true
52
38
 
53
- # Returns the client for the current LLM call. A configured client wins,
54
- # resolved on every call so a Proc can vary the client by process or
55
- # credential lifetime; otherwise the provider builds one from the configured
56
- # credentials, memoized for the life of the provider.
57
39
  # --
58
40
  # : () -> untyped
59
41
  def client: () -> untyped
60
42
 
61
- # Returns the consumer-configured client for this provider; nil when none is
62
- # configured, and for providers that take no configuration at all.
63
43
  # --
64
44
  # : () -> untyped
65
45
  def global_client: () -> untyped
@@ -99,14 +79,10 @@ class Riffer::Providers::Base
99
79
  # : () -> Riffer::Config::Pricing::Rates?
100
80
  def pricing_rates: () -> Riffer::Config::Pricing::Rates?
101
81
 
102
- # Defaults to nil rather than raising — finish reasons are optional, so
103
- # providers that don't report one stay valid.
104
82
  # --
105
83
  # : (untyped) -> Riffer::Providers::FinishReason?
106
84
  def extract_finish_reason: (untyped) -> Riffer::Providers::FinishReason?
107
85
 
108
- # Defaults to no parts rather than raising — reasoning parts are optional, so
109
- # providers that don't expose replayable reasoning stay valid.
110
86
  # --
111
87
  # : (untyped) -> Array[Riffer::Messages::Assistant::ReasoningPart]
112
88
  def extract_reasoning: (untyped) -> Array[Riffer::Messages::Assistant::ReasoningPart]
@@ -130,8 +106,6 @@ class Riffer::Providers::Base
130
106
  # : (String?, Hash[Symbol, untyped]) -> Hash[String, untyped]
131
107
  def chat_span_attributes: (String?, Hash[Symbol, untyped]) -> Hash[String, untyped]
132
108
 
133
- # Maps normalized tags to their namespaced span attribute form. An empty map
134
- # yields an empty hash, so merging it is a no-op.
135
109
  # --
136
110
  # : (Hash[String, String]) -> Hash[String, String]
137
111
  def tag_attributes: (Hash[String, String]) -> Hash[String, String]
@@ -156,8 +130,6 @@ class Riffer::Providers::Base
156
130
  # : ((Riffer::Tracing::Otel::Span | Riffer::Tracing::NoOp::Span)) -> bool
157
131
  def capture_messages?: (Riffer::Tracing::Otel::Span | Riffer::Tracing::NoOp::Span) -> bool
158
132
 
159
- # Wraps reasoning text that an adapter cannot yet replay in a +:text+ part
160
- # with no +format+, so it persists for display but is never sent back.
161
133
  # --
162
134
  # : (Riffer::Providers::_EventSink, String) -> void
163
135
  def yield_reasoning_done: (Riffer::Providers::_EventSink, String) -> void