riffer 0.47.2 → 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 (267) 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 +42 -0
  7. data/docs/AGENTS.md +39 -7
  8. data/docs/AGENT_LIFECYCLE.md +14 -16
  9. data/docs/CONFIGURATION.md +23 -34
  10. data/docs/EVALS.md +2 -1
  11. data/docs/MCP.md +0 -4
  12. data/docs/MESSAGES.md +85 -17
  13. data/docs/STREAM_EVENTS.md +8 -4
  14. data/docs/TOOL_ADVANCED.md +1 -3
  15. data/docs/TRACING.md +2 -2
  16. data/docs/providers/AMAZON_BEDROCK.md +32 -1
  17. data/docs/providers/CUSTOM_PROVIDERS.md +56 -4
  18. data/docs/providers/GEMINI.md +1 -1
  19. data/docs/providers/MOCK_PROVIDER.md +17 -0
  20. data/docs/providers/OPENROUTER.md +18 -1
  21. data/docs-site/build.rb +0 -6
  22. data/docs-site/check.rb +1 -5
  23. data/lib/riffer/agent/config.rb +27 -44
  24. data/lib/riffer/agent/context.rb +2 -26
  25. data/lib/riffer/agent/outcome.rb +0 -20
  26. data/lib/riffer/agent/response.rb +4 -35
  27. data/lib/riffer/agent/run.rb +32 -48
  28. data/lib/riffer/agent/serializer.rb +10 -39
  29. data/lib/riffer/agent/session/repair.rb +3 -15
  30. data/lib/riffer/agent/session.rb +26 -38
  31. data/lib/riffer/agent/structured_output/result.rb +0 -8
  32. data/lib/riffer/agent/structured_output.rb +0 -7
  33. data/lib/riffer/agent.rb +31 -127
  34. data/lib/riffer/config/amazon_bedrock.rb +30 -0
  35. data/lib/riffer/config/anthropic.rb +21 -0
  36. data/lib/riffer/config/azure_open_ai.rb +30 -0
  37. data/lib/riffer/config/evals.rb +18 -0
  38. data/lib/riffer/config/files.rb +61 -0
  39. data/lib/riffer/config/gemini.rb +21 -0
  40. data/lib/riffer/config/mcp.rb +31 -0
  41. data/lib/riffer/config/open_ai.rb +30 -0
  42. data/lib/riffer/config/open_router.rb +21 -0
  43. data/lib/riffer/config/pricing/rates.rb +36 -0
  44. data/lib/riffer/config/pricing.rb +64 -0
  45. data/lib/riffer/config/skills.rb +38 -0
  46. data/lib/riffer/config/tracing.rb +43 -0
  47. data/lib/riffer/config.rb +3 -362
  48. data/lib/riffer/evals/evaluator.rb +22 -23
  49. data/lib/riffer/evals/evaluator_runner.rb +0 -15
  50. data/lib/riffer/evals/judge.rb +9 -11
  51. data/lib/riffer/evals/result.rb +1 -11
  52. data/lib/riffer/evals/run_result.rb +0 -12
  53. data/lib/riffer/evals/scenario_result.rb +0 -19
  54. data/lib/riffer/files/downloader.rb +2 -3
  55. data/lib/riffer/files/resolver.rb +5 -10
  56. data/lib/riffer/guardrail.rb +2 -22
  57. data/lib/riffer/guardrails/modification.rb +0 -8
  58. data/lib/riffer/guardrails/result.rb +0 -17
  59. data/lib/riffer/guardrails/runner.rb +2 -11
  60. data/lib/riffer/guardrails/tripwire.rb +0 -8
  61. data/lib/riffer/guardrails.rb +0 -2
  62. data/lib/riffer/helpers/boolean.rb +0 -4
  63. data/lib/riffer/helpers/call_or_value.rb +0 -3
  64. data/lib/riffer/helpers/deep_dup.rb +37 -0
  65. data/lib/riffer/helpers/dependencies.rb +0 -4
  66. data/lib/riffer/helpers/identifier.rb +3 -12
  67. data/lib/riffer/helpers/validate.rb +42 -0
  68. data/lib/riffer/mcp/authenticated_tool.rb +4 -12
  69. data/lib/riffer/mcp/client.rb +0 -7
  70. data/lib/riffer/mcp/manifest.rb +3 -7
  71. data/lib/riffer/mcp/registration.rb +0 -10
  72. data/lib/riffer/mcp/registry.rb +0 -9
  73. data/lib/riffer/mcp/search_tool.rb +0 -4
  74. data/lib/riffer/mcp/tool.rb +1 -4
  75. data/lib/riffer/mcp/tool_factory.rb +3 -6
  76. data/lib/riffer/mcp.rb +2 -23
  77. data/lib/riffer/messages/assistant/reasoning_part.rb +73 -0
  78. data/lib/riffer/messages/assistant/tool_call.rb +55 -0
  79. data/lib/riffer/messages/assistant.rb +43 -15
  80. data/lib/riffer/messages/base.rb +5 -33
  81. data/lib/riffer/messages/system.rb +8 -1
  82. data/lib/riffer/messages/tool.rb +15 -13
  83. data/lib/riffer/messages/{file_part.rb → user/file_part.rb} +16 -40
  84. data/lib/riffer/messages/user.rb +11 -4
  85. data/lib/riffer/params/boolean.rb +1 -5
  86. data/lib/riffer/params/param.rb +15 -31
  87. data/lib/riffer/params.rb +15 -39
  88. data/lib/riffer/providers/amazon_bedrock.rb +104 -44
  89. data/lib/riffer/providers/anthropic.rb +11 -26
  90. data/lib/riffer/providers/azure_open_ai.rb +3 -8
  91. data/lib/riffer/providers/base.rb +30 -32
  92. data/lib/riffer/providers/finish_reason.rb +0 -6
  93. data/lib/riffer/providers/gemini/client.rb +4 -17
  94. data/lib/riffer/providers/gemini.rb +6 -12
  95. data/lib/riffer/providers/mock.rb +18 -27
  96. data/lib/riffer/providers/open_ai.rb +12 -21
  97. data/lib/riffer/providers/open_router.rb +109 -33
  98. data/lib/riffer/providers/repository.rb +2 -14
  99. data/lib/riffer/providers/token_usage.rb +19 -12
  100. data/lib/riffer/registrable.rb +11 -45
  101. data/lib/riffer/runner/fibers.rb +1 -6
  102. data/lib/riffer/runner/sequential.rb +0 -1
  103. data/lib/riffer/runner/threaded.rb +0 -3
  104. data/lib/riffer/runner.rb +0 -3
  105. data/lib/riffer/skills/activate_tool.rb +0 -3
  106. data/lib/riffer/skills/adapter.rb +0 -8
  107. data/lib/riffer/skills/backend.rb +2 -7
  108. data/lib/riffer/skills/config.rb +13 -17
  109. data/lib/riffer/skills/context.rb +0 -29
  110. data/lib/riffer/skills/filesystem_backend.rb +0 -7
  111. data/lib/riffer/skills/frontmatter.rb +2 -16
  112. data/lib/riffer/skills/markdown_adapter.rb +3 -6
  113. data/lib/riffer/skills/xml_adapter.rb +0 -3
  114. data/lib/riffer/stream_events/base.rb +0 -3
  115. data/lib/riffer/stream_events/finish_reason_done.rb +1 -6
  116. data/lib/riffer/stream_events/guardrail_modification.rb +0 -10
  117. data/lib/riffer/stream_events/guardrail_tripwire.rb +0 -10
  118. data/lib/riffer/stream_events/interrupt.rb +2 -12
  119. data/lib/riffer/stream_events/reasoning_delta.rb +0 -3
  120. data/lib/riffer/stream_events/reasoning_done.rb +6 -8
  121. data/lib/riffer/stream_events/skill_activation.rb +0 -3
  122. data/lib/riffer/stream_events/text_delta.rb +0 -2
  123. data/lib/riffer/stream_events/text_done.rb +0 -2
  124. data/lib/riffer/stream_events/token_usage_done.rb +0 -2
  125. data/lib/riffer/stream_events/tool_call_delta.rb +1 -5
  126. data/lib/riffer/stream_events/tool_call_done.rb +0 -5
  127. data/lib/riffer/stream_events/web_search_done.rb +0 -3
  128. data/lib/riffer/stream_events/web_search_status.rb +1 -5
  129. data/lib/riffer/testing/minitest.rb +4 -5
  130. data/lib/riffer/testing.rb +5 -38
  131. data/lib/riffer/tool.rb +2 -28
  132. data/lib/riffer/tools/response.rb +3 -32
  133. data/lib/riffer/tools/runtime/fibers.rb +0 -6
  134. data/lib/riffer/tools/runtime/inline.rb +0 -1
  135. data/lib/riffer/tools/runtime/threaded.rb +0 -6
  136. data/lib/riffer/tools/runtime.rb +8 -30
  137. data/lib/riffer/tools/toolable.rb +0 -37
  138. data/lib/riffer/tracing/capture.rb +5 -9
  139. data/lib/riffer/tracing/no_op.rb +0 -7
  140. data/lib/riffer/tracing/otel.rb +7 -16
  141. data/lib/riffer/tracing/stream_recorder.rb +0 -7
  142. data/lib/riffer/tracing.rb +4 -27
  143. data/lib/riffer/version.rb +1 -1
  144. data/lib/riffer.rb +2 -30
  145. data/sig/generated/riffer/agent/config.rbs +24 -46
  146. data/sig/generated/riffer/agent/context.rbs +2 -26
  147. data/sig/generated/riffer/agent/outcome.rbs +0 -20
  148. data/sig/generated/riffer/agent/response.rbs +4 -27
  149. data/sig/generated/riffer/agent/run.rbs +12 -31
  150. data/sig/generated/riffer/agent/serializer.rbs +2 -27
  151. data/sig/generated/riffer/agent/session/repair.rbs +2 -10
  152. data/sig/generated/riffer/agent/session.rbs +10 -36
  153. data/sig/generated/riffer/agent/structured_output/result.rbs +0 -7
  154. data/sig/generated/riffer/agent/structured_output.rbs +0 -7
  155. data/sig/generated/riffer/agent.rbs +25 -125
  156. data/sig/generated/riffer/config/amazon_bedrock.rbs +21 -0
  157. data/sig/generated/riffer/config/anthropic.rbs +15 -0
  158. data/sig/generated/riffer/config/azure_open_ai.rbs +21 -0
  159. data/sig/generated/riffer/config/evals.rbs +13 -0
  160. data/sig/generated/riffer/config/files.rbs +43 -0
  161. data/sig/generated/riffer/config/gemini.rbs +15 -0
  162. data/sig/generated/riffer/config/mcp.rbs +19 -0
  163. data/sig/generated/riffer/config/open_ai.rbs +21 -0
  164. data/sig/generated/riffer/config/open_router.rbs +15 -0
  165. data/sig/generated/riffer/config/pricing/rates.rbs +19 -0
  166. data/sig/generated/riffer/config/pricing.rbs +31 -0
  167. data/sig/generated/riffer/config/skills.rbs +19 -0
  168. data/sig/generated/riffer/config/tracing.rbs +25 -0
  169. data/sig/generated/riffer/config.rbs +2 -307
  170. data/sig/generated/riffer/evals/evaluator.rbs +12 -21
  171. data/sig/generated/riffer/evals/evaluator_runner.rbs +0 -14
  172. data/sig/generated/riffer/evals/judge.rbs +4 -8
  173. data/sig/generated/riffer/evals/result.rbs +1 -11
  174. data/sig/generated/riffer/evals/run_result.rbs +0 -12
  175. data/sig/generated/riffer/evals/scenario_result.rbs +0 -14
  176. data/sig/generated/riffer/files/resolver.rbs +6 -13
  177. data/sig/generated/riffer/guardrail.rbs +2 -22
  178. data/sig/generated/riffer/guardrails/modification.rbs +0 -6
  179. data/sig/generated/riffer/guardrails/result.rbs +0 -15
  180. data/sig/generated/riffer/guardrails/runner.rbs +0 -11
  181. data/sig/generated/riffer/guardrails/tripwire.rbs +0 -8
  182. data/sig/generated/riffer/guardrails.rbs +0 -2
  183. data/sig/generated/riffer/helpers/boolean.rbs +0 -4
  184. data/sig/generated/riffer/helpers/call_or_value.rbs +0 -3
  185. data/sig/generated/riffer/helpers/deep_dup.rbs +13 -0
  186. data/sig/generated/riffer/helpers/dependencies.rbs +0 -4
  187. data/sig/generated/riffer/helpers/identifier.rbs +0 -12
  188. data/sig/generated/riffer/helpers/validate.rbs +21 -0
  189. data/sig/generated/riffer/mcp/authenticated_tool.rbs +0 -5
  190. data/sig/generated/riffer/mcp/client.rbs +0 -7
  191. data/sig/generated/riffer/mcp/manifest.rbs +3 -7
  192. data/sig/generated/riffer/mcp/registration.rbs +0 -10
  193. data/sig/generated/riffer/mcp/registry.rbs +0 -9
  194. data/sig/generated/riffer/mcp/search_tool.rbs +0 -4
  195. data/sig/generated/riffer/mcp/tool.rbs +0 -4
  196. data/sig/generated/riffer/mcp/tool_factory.rbs +0 -6
  197. data/sig/generated/riffer/mcp.rbs +2 -22
  198. data/sig/generated/riffer/messages/assistant/reasoning_part.rbs +45 -0
  199. data/sig/generated/riffer/messages/assistant/tool_call.rbs +34 -0
  200. data/sig/generated/riffer/messages/assistant.rbs +25 -31
  201. data/sig/generated/riffer/messages/base.rbs +0 -12
  202. data/sig/generated/riffer/messages/system.rbs +4 -1
  203. data/sig/generated/riffer/messages/tool.rbs +4 -10
  204. data/sig/generated/riffer/messages/user/file_part.rbs +76 -0
  205. data/sig/generated/riffer/messages/user.rbs +7 -5
  206. data/sig/generated/riffer/params/boolean.rbs +1 -4
  207. data/sig/generated/riffer/params/param.rbs +7 -31
  208. data/sig/generated/riffer/params.rbs +8 -38
  209. data/sig/generated/riffer/providers/amazon_bedrock.rbs +33 -29
  210. data/sig/generated/riffer/providers/anthropic.rbs +2 -12
  211. data/sig/generated/riffer/providers/azure_open_ai.rbs +0 -8
  212. data/sig/generated/riffer/providers/base.rbs +18 -34
  213. data/sig/generated/riffer/providers/finish_reason.rbs +0 -6
  214. data/sig/generated/riffer/providers/gemini/client.rbs +4 -17
  215. data/sig/generated/riffer/providers/gemini.rbs +4 -10
  216. data/sig/generated/riffer/providers/mock.rbs +6 -27
  217. data/sig/generated/riffer/providers/open_ai.rbs +6 -13
  218. data/sig/generated/riffer/providers/open_router.rbs +37 -18
  219. data/sig/generated/riffer/providers/repository.rbs +2 -14
  220. data/sig/generated/riffer/providers/token_usage.rbs +9 -12
  221. data/sig/generated/riffer/registrable.rbs +0 -45
  222. data/sig/generated/riffer/runner/fibers.rbs +0 -6
  223. data/sig/generated/riffer/runner/sequential.rbs +0 -1
  224. data/sig/generated/riffer/runner/threaded.rbs +0 -3
  225. data/sig/generated/riffer/runner.rbs +0 -3
  226. data/sig/generated/riffer/skills/activate_tool.rbs +0 -3
  227. data/sig/generated/riffer/skills/adapter.rbs +0 -8
  228. data/sig/generated/riffer/skills/backend.rbs +2 -7
  229. data/sig/generated/riffer/skills/config.rbs +6 -17
  230. data/sig/generated/riffer/skills/context.rbs +0 -29
  231. data/sig/generated/riffer/skills/filesystem_backend.rbs +0 -7
  232. data/sig/generated/riffer/skills/frontmatter.rbs +2 -16
  233. data/sig/generated/riffer/skills/markdown_adapter.rbs +0 -6
  234. data/sig/generated/riffer/skills/xml_adapter.rbs +0 -3
  235. data/sig/generated/riffer/stream_events/base.rbs +0 -3
  236. data/sig/generated/riffer/stream_events/finish_reason_done.rbs +1 -6
  237. data/sig/generated/riffer/stream_events/guardrail_modification.rbs +0 -10
  238. data/sig/generated/riffer/stream_events/guardrail_tripwire.rbs +0 -10
  239. data/sig/generated/riffer/stream_events/interrupt.rbs +2 -10
  240. data/sig/generated/riffer/stream_events/reasoning_delta.rbs +0 -3
  241. data/sig/generated/riffer/stream_events/reasoning_done.rbs +4 -6
  242. data/sig/generated/riffer/stream_events/skill_activation.rbs +0 -3
  243. data/sig/generated/riffer/stream_events/text_delta.rbs +0 -2
  244. data/sig/generated/riffer/stream_events/text_done.rbs +0 -2
  245. data/sig/generated/riffer/stream_events/token_usage_done.rbs +0 -2
  246. data/sig/generated/riffer/stream_events/tool_call_delta.rbs +1 -5
  247. data/sig/generated/riffer/stream_events/tool_call_done.rbs +0 -5
  248. data/sig/generated/riffer/stream_events/web_search_done.rbs +0 -3
  249. data/sig/generated/riffer/stream_events/web_search_status.rbs +1 -5
  250. data/sig/generated/riffer/testing.rbs +0 -38
  251. data/sig/generated/riffer/tool.rbs +0 -27
  252. data/sig/generated/riffer/tools/response.rbs +3 -29
  253. data/sig/generated/riffer/tools/runtime/fibers.rbs +0 -5
  254. data/sig/generated/riffer/tools/runtime/inline.rbs +0 -1
  255. data/sig/generated/riffer/tools/runtime/threaded.rbs +0 -5
  256. data/sig/generated/riffer/tools/runtime.rbs +4 -26
  257. data/sig/generated/riffer/tools/toolable.rbs +0 -37
  258. data/sig/generated/riffer/tracing/capture.rbs +6 -9
  259. data/sig/generated/riffer/tracing/no_op.rbs +0 -7
  260. data/sig/generated/riffer/tracing/otel.rbs +7 -16
  261. data/sig/generated/riffer/tracing/stream_recorder.rbs +0 -2
  262. data/sig/generated/riffer/tracing.rbs +4 -23
  263. data/sig/generated/riffer.rbs +2 -29
  264. data/sig/manual/riffer/helpers/deep_dup.rbs +5 -0
  265. data/sig/manual/riffer/helpers/validate.rbs +5 -0
  266. metadata +39 -3
  267. data/sig/generated/riffer/messages/file_part.rbs +0 -101
@@ -1,58 +1,22 @@
1
1
  # Generated from lib/riffer/testing.rb with RBS::Inline
2
2
 
3
- # Builds throwaway agents and tools a test suite can resolve by identifier or
4
- # constant name, and removes them again. Require <tt>riffer/testing/rspec</tt>
5
- # or <tt>riffer/testing/minitest</tt> to get +stub_agent+/+stub_tool+ in every
6
- # example plus per-test cleanup; otherwise include this module and call +reset!+
7
- # from your own teardown, or call the methods on the module directly.
8
- #
9
- # Tracking is not synchronized — stub from a single-threaded test, before
10
- # concurrent lookups begin.
11
3
  module Riffer::Testing
12
4
  self.@registrations: Array[[ Class, String? ]]?
13
5
 
14
6
  CONST_NAME_PATTERN: Regexp
15
7
 
16
- # Builds an agent class, evaluates the optional body in it, and makes it
17
- # resolvable until the next +reset!+. A +name+ assigns a top-level constant
18
- # and derives the identifier; the body may set +identifier+ like any other
19
- # agent config.
20
- #
21
- # agent = stub_agent("SupportAgent") { model "mock/gpt-5-mini" }
22
- #
23
- # Raises Riffer::ArgumentError when the constant is already defined or the
24
- # stub ends up with no identifier, and Riffer::DuplicateIdentifierError when
25
- # another agent already holds the identifier.
26
- #
27
8
  # --
28
9
  # : (?(String | Symbol)?, ?base: singleton(Riffer::Agent)) ?{ () [self: singleton(Riffer::Agent)] -> void } -> singleton(Riffer::Agent)
29
10
  def stub_agent: (?(String | Symbol)?, ?base: singleton(Riffer::Agent)) ?{ () [self: singleton(Riffer::Agent)] -> void } -> singleton(Riffer::Agent)
30
11
 
31
- # Builds a tool class, evaluates the optional body in it, and makes it
32
- # resolvable until the next +reset!+. A +name+ assigns a top-level constant
33
- # and derives the identifier; the body may set +identifier+ like any other
34
- # tool config.
35
- #
36
- # tool = stub_tool("KbSearch") { def call(context:, **) = text("stubbed") }
37
- #
38
- # Raises Riffer::ArgumentError when the constant is already defined or the
39
- # stub ends up with no identifier, and Riffer::DuplicateIdentifierError when
40
- # another tool already holds the identifier.
41
- #
42
12
  # --
43
13
  # : (?(String | Symbol)?, ?base: singleton(Riffer::Tool)) ?{ () [self: singleton(Riffer::Tool)] -> void } -> singleton(Riffer::Tool)
44
14
  def stub_tool: (?(String | Symbol)?, ?base: singleton(Riffer::Tool)) ?{ () [self: singleton(Riffer::Tool)] -> void } -> singleton(Riffer::Tool)
45
15
 
46
- # Removes every stub built since the last reset — its registration and any
47
- # constant it created — newest first, and forgets them. A no-op when nothing
48
- # has been stubbed.
49
16
  # --
50
17
  # : () -> void
51
18
  def reset!: () -> void
52
19
 
53
- # The stub classes awaiting cleanup. Lives on the module rather than the
54
- # caller so an including test case and a direct
55
- # <tt>Riffer::Testing.stub_*</tt> call share one list.
56
20
  # --
57
21
  # : () -> Array[[Class, String?]]
58
22
  def self.registrations: () -> Array[[ Class, String? ]]
@@ -67,8 +31,6 @@ module Riffer::Testing
67
31
  # : ((String | Symbol)?) -> String?
68
32
  def validate_const_name: ((String | Symbol)?) -> String?
69
33
 
70
- # A test may have removed or replaced the constant itself, so never clobber
71
- # one that no longer points at the stub.
72
34
  # --
73
35
  # : (String, Class) -> void
74
36
  def remove_stub_const: (String, Class) -> void
@@ -1,53 +1,26 @@
1
1
  # Generated from lib/riffer/tool.rb with RBS::Inline
2
2
 
3
- # Base class for all tools in the Riffer framework. Subclasses must implement
4
- # the +call+ method.
5
- #
6
- # class WeatherLookupTool < Riffer::Tool
7
- # description "Provides current weather information for a specified city."
8
- #
9
- # params do
10
- # required :city, String, description: "The city to look up"
11
- # optional :units, String, default: "celsius"
12
- # end
13
- #
14
- # def call(context:, city:, units: nil)
15
- # # Implementation
16
- # end
17
- # end
18
3
  class Riffer::Tool
19
4
  extend Riffer::Tools::Toolable
20
5
 
21
6
  extend Riffer::Registrable
22
7
 
23
- # Executes the tool with the given arguments.
24
8
  # --
25
9
  # : (context: Riffer::Agent::Context?, **untyped) -> Riffer::Tools::Response
26
10
  def call: (context: Riffer::Agent::Context?, **untyped) -> Riffer::Tools::Response
27
11
 
28
- # Creates a text response.
29
- #
30
12
  # --
31
13
  # : (untyped) -> Riffer::Tools::Response
32
14
  def text: (untyped) -> Riffer::Tools::Response
33
15
 
34
- # Creates a JSON response.
35
- #
36
16
  # --
37
17
  # : (untyped) -> Riffer::Tools::Response
38
18
  def json: (untyped) -> Riffer::Tools::Response
39
19
 
40
- # Creates an error response.
41
- #
42
20
  # --
43
21
  # : (String, ?type: Symbol) -> Riffer::Tools::Response
44
22
  def error: (String, ?type: Symbol) -> Riffer::Tools::Response
45
23
 
46
- # Executes the tool with validation and timeout, folding every +StandardError+
47
- # into an error Response. Anything outside +StandardError+ — an unimplemented
48
- # +#call+ above all — still propagates, because a broken tool is a broken
49
- # deploy rather than a bad request.
50
- #
51
24
  # --
52
25
  # : (context: Riffer::Agent::Context?, **untyped) -> Riffer::Tools::Response
53
26
  def call_with_validation: (context: Riffer::Agent::Context?, **untyped) -> Riffer::Tools::Response
@@ -1,71 +1,45 @@
1
1
  # Generated from lib/riffer/tools/response.rb with RBS::Inline
2
2
 
3
- # Represents the result of a tool execution; every tool's +call+ must return one.
4
- #
5
- # class MyTool < Riffer::Tool
6
- # def call(context:, **kwargs)
7
- # result = perform_operation
8
- # Riffer::Tools::Response.success(result)
9
- # rescue MyError => e
10
- # Riffer::Tools::Response.error(e.message)
11
- # end
12
- # end
3
+ # Every tool's +call+ must return one.
13
4
  class Riffer::Tools::Response
14
5
  @success: bool
15
6
 
16
7
  VALID_FORMATS: Array[Symbol]
17
8
 
18
- # The response content.
19
9
  attr_reader content: String
20
10
 
21
- # The error message, or +nil+ on success.
22
11
  attr_reader error_message: String?
23
12
 
24
- # The error type, or +nil+ on success.
25
13
  attr_reader error_type: Symbol?
26
14
 
27
- # The exception an unhandled failure was folded from, or +nil+. Kept out of
28
- # every serialized form so it never reaches an LLM or a message payload.
15
+ # Kept out of every serialized form so it never reaches an LLM or a message
16
+ # payload.
29
17
  attr_reader exception: Exception?
30
18
 
31
- # Creates a success response.
32
- #
33
- # Raises Riffer::ArgumentError if format is invalid.
34
- #
35
19
  # --
36
20
  # : (untyped, ?format: Symbol) -> Riffer::Tools::Response
37
21
  def self.success: (untyped, ?format: Symbol) -> Riffer::Tools::Response
38
22
 
39
- # Creates a success response with text format.
40
- #
41
23
  # --
42
24
  # : (untyped) -> Riffer::Tools::Response
43
25
  def self.text: (untyped) -> Riffer::Tools::Response
44
26
 
45
- # Creates a success response with JSON format.
46
- #
47
27
  # --
48
28
  # : (untyped) -> Riffer::Tools::Response
49
29
  def self.json: (untyped) -> Riffer::Tools::Response
50
30
 
51
- # Creates an error response.
52
- #
53
31
  # --
54
32
  # : (String, ?type: Symbol, ?exception: Exception?) -> Riffer::Tools::Response
55
33
  def self.error: (String, ?type: Symbol, ?exception: Exception?) -> Riffer::Tools::Response
56
34
 
57
- # Returns true if the tool execution succeeded.
58
35
  # --
59
36
  # : () -> bool
60
37
  def success?: () -> bool
61
38
 
62
- # Returns true if the tool execution failed.
63
39
  # --
64
40
  # : () -> bool
65
41
  def error?: () -> bool
66
42
 
67
- # Returns a hash representation of the response.
68
- #
69
43
  # --
70
44
  # : () -> Hash[Symbol, untyped]
71
45
  def to_h: () -> Hash[Symbol, untyped]
@@ -1,10 +1,5 @@
1
1
  # Generated from lib/riffer/tools/runtime/fibers.rb with RBS::Inline
2
2
 
3
- # Executes tool calls concurrently using fibers via the +async+ gem.
4
- #
5
- # class MyAgent < Riffer::Agent
6
- # tool_runtime Riffer::Tools::Runtime::Fibers
7
- # end
8
3
  class Riffer::Tools::Runtime::Fibers < Riffer::Tools::Runtime
9
4
  # --
10
5
  # : (?max_concurrency: Integer?) -> void
@@ -1,6 +1,5 @@
1
1
  # Generated from lib/riffer/tools/runtime/inline.rb with RBS::Inline
2
2
 
3
- # Executes tool calls sequentially in the current thread — the default runtime.
4
3
  class Riffer::Tools::Runtime::Inline < Riffer::Tools::Runtime
5
4
  # --
6
5
  # : () -> void
@@ -1,10 +1,5 @@
1
1
  # Generated from lib/riffer/tools/runtime/threaded.rb with RBS::Inline
2
2
 
3
- # Executes tool calls concurrently using threads.
4
- #
5
- # class MyAgent < Riffer::Agent
6
- # tool_runtime Riffer::Tools::Runtime::Threaded
7
- # end
8
3
  class Riffer::Tools::Runtime::Threaded < Riffer::Tools::Runtime
9
4
  DEFAULT_MAX_CONCURRENCY: Integer
10
5
 
@@ -1,8 +1,5 @@
1
1
  # Generated from lib/riffer/tools/runtime.rb with RBS::Inline
2
2
 
3
- # Handles tool call execution for an agent, composing with a Riffer::Runner for
4
- # concurrency. Subclass and override +dispatch_tool_call+ to customize dispatch
5
- # (e.g. HTTP, gRPC).
6
3
  class Riffer::Tools::Runtime
7
4
  @runner: Riffer::Runner
8
5
 
@@ -10,25 +7,11 @@ class Riffer::Tools::Runtime
10
7
  # : (runner: Riffer::Runner) -> void
11
8
  def initialize: (runner: Riffer::Runner) -> void
12
9
 
13
- # Executes a batch of tool calls, returning <tt>[tool_call, response]</tt> pairs.
14
10
  # --
15
11
  # : (Array[Riffer::Messages::Assistant::ToolCall], tools: Array[singleton(Riffer::Tool)], context: Riffer::Agent::Context?, ?assistant_message: Riffer::Messages::Assistant?, ?tags: Hash[String, String]) -> Array[[Riffer::Messages::Assistant::ToolCall, Riffer::Tools::Response]]
16
12
  def execute: (Array[Riffer::Messages::Assistant::ToolCall], tools: Array[singleton(Riffer::Tool)], context: Riffer::Agent::Context?, ?assistant_message: Riffer::Messages::Assistant?, ?tags: Hash[String, String]) -> Array[[ Riffer::Messages::Assistant::ToolCall, Riffer::Tools::Response ]]
17
13
 
18
- # Hook wrapping each tool call; override in subclasses to instrument or
19
- # customize. Must +yield+ to continue.
20
- #
21
- # class InstrumentedRuntime < Riffer::Tools::Runtime::Inline
22
- # private
23
- #
24
- # def around_tool_call(tool_call, context:, assistant_message: nil)
25
- # start = Time.now
26
- # result = yield
27
- # Rails.logger.info("Tool #{tool_call.name} took #{Time.now - start}s")
28
- # result
29
- # end
30
- # end
31
- #
14
+ # Overrides must +yield+ and return its Response.
32
15
  # --
33
16
  # : (Riffer::Messages::Assistant::ToolCall, context: Riffer::Agent::Context?, ?assistant_message: Riffer::Messages::Assistant?) { () -> Riffer::Tools::Response } -> Riffer::Tools::Response
34
17
  def around_tool_call: (Riffer::Messages::Assistant::ToolCall, context: Riffer::Agent::Context?, ?assistant_message: Riffer::Messages::Assistant?) { () -> Riffer::Tools::Response } -> Riffer::Tools::Response
@@ -39,15 +22,15 @@ class Riffer::Tools::Runtime
39
22
  # : (Riffer::Messages::Assistant::ToolCall, ?Hash[String, String]) { () -> Riffer::Tools::Response } -> [Riffer::Messages::Assistant::ToolCall, Riffer::Tools::Response]
40
23
  def instrument_tool_call: (Riffer::Messages::Assistant::ToolCall, ?Hash[String, String]) { () -> Riffer::Tools::Response } -> [ Riffer::Messages::Assistant::ToolCall, Riffer::Tools::Response ]
41
24
 
25
+ # Subclasses override this to dispatch elsewhere (e.g. HTTP, gRPC).
42
26
  # --
43
27
  # : (Riffer::Messages::Assistant::ToolCall, tools: Array[singleton(Riffer::Tool)], context: Riffer::Agent::Context?, ?assistant_message: Riffer::Messages::Assistant?) -> Riffer::Tools::Response
44
28
  def dispatch_tool_call: (Riffer::Messages::Assistant::ToolCall, tools: Array[singleton(Riffer::Tool)], context: Riffer::Agent::Context?, ?assistant_message: Riffer::Messages::Assistant?) -> Riffer::Tools::Response
45
29
 
46
30
  # --
47
- # : (String?) -> untyped
48
- def parse_arguments: (String?) -> untyped
31
+ # : (String) -> untyped
32
+ def parse_arguments: (String) -> untyped
49
33
 
50
- # Emitted outside +around_tool_call+ so host enrichment spans nest beneath it.
51
34
  # --
52
35
  # : [R] (Riffer::Messages::Assistant::ToolCall, ?Hash[String, String]) { ((Riffer::Tracing::Otel::Span | Riffer::Tracing::NoOp::Span)) -> R } -> R
53
36
  def in_tool_span: [R] (Riffer::Messages::Assistant::ToolCall, ?Hash[String, String]) { (Riffer::Tracing::Otel::Span | Riffer::Tracing::NoOp::Span) -> R } -> R
@@ -56,15 +39,10 @@ class Riffer::Tools::Runtime
56
39
  # : (Riffer::Messages::Assistant::ToolCall, ?Hash[String, String]) -> Hash[String, untyped]
57
40
  def tool_span_attributes: (Riffer::Messages::Assistant::ToolCall, ?Hash[String, String]) -> Hash[String, untyped]
58
41
 
59
- # Maps normalized tags to their namespaced span attribute form. An empty map
60
- # yields an empty hash, so merging it is a no-op.
61
42
  # --
62
43
  # : (Hash[String, String]) -> Hash[String, String]
63
44
  def tag_attributes: (Hash[String, String]) -> Hash[String, String]
64
45
 
65
- # A deliberate error Response is a handled outcome, so its status stays unset.
66
- # An error status is reserved for a Response carrying the exception it was
67
- # folded from — the tool failed for a reason nobody anticipated.
68
46
  # --
69
47
  # : ((Riffer::Tracing::Otel::Span | Riffer::Tracing::NoOp::Span), Riffer::Tools::Response) -> void
70
48
  def record_tool_outcome: (Riffer::Tracing::Otel::Span | Riffer::Tracing::NoOp::Span, Riffer::Tools::Response) -> void
@@ -1,19 +1,5 @@
1
1
  # Generated from lib/riffer/tools/toolable.rb with RBS::Inline
2
2
 
3
- # Shared class-level DSL for anything that presents as a tool to an LLM. Extend
4
- # it to make a class discoverable as a tool; instance-level execution (+call+,
5
- # +call_with_validation+) lives on Riffer::Tool instead.
6
- #
7
- # class MyTool
8
- # extend Riffer::Tools::Toolable
9
- #
10
- # description "Does something useful"
11
- #
12
- # params do
13
- # required :input, String
14
- # end
15
- # end
16
- #
17
3
  # @rbs module-self Module
18
4
  module Riffer::Tools::Toolable : Module
19
5
  @kind: Symbol?
@@ -30,69 +16,46 @@ module Riffer::Tools::Toolable : Module
30
16
 
31
17
  DEFAULT_TIMEOUT: Integer
32
18
 
33
- # Tracks all classes that extend Toolable.
34
- #
35
19
  # --
36
20
  # : (Module) -> void
37
21
  def self.extended: (Module) -> void
38
22
 
39
- # Returns all classes that have extended Toolable.
40
- #
41
23
  # --
42
24
  # : () -> Array[Module]
43
25
  def self.all: () -> Array[Module]
44
26
 
45
- # Gets or sets the tool description.
46
- #
47
27
  # --
48
28
  # : (?String?) -> String?
49
29
  def description: (?String?) -> String?
50
30
 
51
- # Gets or sets the tool identifier/name.
52
- #
53
31
  # --
54
32
  # : (?String?) -> String
55
33
  def identifier: (?String?) -> String
56
34
 
57
- # Alias for identifier — used by providers.
58
- #
59
35
  # --
60
36
  # : (?String?) -> String
61
37
  def name: (?String?) -> String
62
38
 
63
- # Gets or sets the tool timeout in seconds.
64
- #
65
39
  # --
66
40
  # : (?(Integer | Float)?) -> (Integer | Float)
67
41
  def timeout: (?(Integer | Float)?) -> (Integer | Float)
68
42
 
69
- # Defines parameters using the Params DSL.
70
- #
71
43
  # --
72
44
  # : () ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> Riffer::Params?
73
45
  def params: () ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> Riffer::Params?
74
46
 
75
- # Returns the JSON Schema for the tool's parameters.
76
- #
77
47
  # --
78
48
  # : (?strict: bool) -> Hash[Symbol, untyped]
79
49
  def parameters_schema: (?strict: bool) -> Hash[Symbol, untyped]
80
50
 
81
- # Returns the kind of toolable entity; defaults to +:tool+.
82
51
  # --
83
52
  # : (?Symbol?) -> Symbol
84
53
  def kind: (?Symbol?) -> Symbol
85
54
 
86
- # Returns a provider-agnostic tool schema hash.
87
- #
88
55
  # --
89
56
  # : (?strict: bool) -> Hash[Symbol, untyped]
90
57
  def to_tool_schema: (?strict: bool) -> Hash[Symbol, untyped]
91
58
 
92
- # Validates that the minimum required metadata is present for LLM tool use.
93
- #
94
- # Raises Riffer::ArgumentError if validation fails.
95
- #
96
59
  # --
97
60
  # : () -> true
98
61
  def validate_as_tool!: () -> true
@@ -1,8 +1,5 @@
1
1
  # Generated from lib/riffer/tracing/capture.rb with RBS::Inline
2
2
 
3
- # Serializes riffer messages into the GenAI semconv JSON message structure
4
- # for opt-in span content capture. File parts become metadata-only stubs —
5
- # bytes and URLs never reach a span attribute.
6
3
  module Riffer::Tracing::Capture
7
4
  # --
8
5
  # : (Array[Riffer::Messages::Base]) -> String
@@ -35,12 +32,12 @@ module Riffer::Tracing::Capture
35
32
  def tool_call_part: (Riffer::Messages::Assistant::ToolCall) -> Hash[Symbol, untyped]
36
33
 
37
34
  # --
38
- # : (Riffer::Messages::FilePart) -> Hash[Symbol, untyped]
39
- def file_part: (Riffer::Messages::FilePart) -> Hash[Symbol, untyped]
35
+ # : (Riffer::Messages::User::FilePart) -> Hash[Symbol, untyped]
36
+ def file_part: (Riffer::Messages::User::FilePart) -> Hash[Symbol, untyped]
40
37
 
41
- # Semconv's tool_call part carries arguments as a JSON object; riffer holds
42
- # them as a string — parse so the captured payload isn't double-encoded.
38
+ # Semconv's tool_call part carries arguments as a JSON object, so a string
39
+ # would be double-encoded.
43
40
  # --
44
- # : (untyped) -> untyped
45
- def parse_arguments: (untyped) -> untyped
41
+ # : (String) -> untyped
42
+ def parse_arguments: (String) -> untyped
46
43
  end
@@ -1,10 +1,6 @@
1
1
  # Generated from lib/riffer/tracing/no_op.rb with RBS::Inline
2
2
 
3
- # No-op tracing backend, used when OTEL is unavailable or tracing is
4
- # disabled.
5
3
  module Riffer::Tracing::NoOp
6
- # No-op stand-in for a span; answers <tt>recording?</tt> with +false+ so
7
- # callers can skip expensive attribute serialization.
8
4
  class Span
9
5
  # --
10
6
  # : (String, untyped) -> void
@@ -29,17 +25,14 @@ module Riffer::Tracing::NoOp
29
25
 
30
26
  SPAN: Riffer::Tracing::NoOp::Span
31
27
 
32
- # Yields the no-op span, ignoring all span options.
33
28
  # --
34
29
  # : [R] (String, **untyped) { (Riffer::Tracing::NoOp::Span) -> R } -> R
35
30
  def in_span: [R] (String, **untyped) { (Riffer::Tracing::NoOp::Span) -> R } -> R
36
31
 
37
- # Returns +nil+; there is no trace context without OTEL.
38
32
  # --
39
33
  # : () -> nil
40
34
  def current_context: () -> nil
41
35
 
42
- # Yields immediately; there is no context to attach.
43
36
  # --
44
37
  # : [R] (untyped) { () -> R } -> R
45
38
  def with_context: [R] (untyped) { () -> R } -> R
@@ -1,14 +1,13 @@
1
1
  # Generated from lib/riffer/tracing/otel.rb with RBS::Inline
2
2
 
3
- # OTEL-backed tracing backend. <tt>::OpenTelemetry</tt> constants appear only
4
- # inside method bodies here, so the gem loads and eager-loads cleanly when the
5
- # OpenTelemetry API is absent.
3
+ # <tt>::OpenTelemetry</tt> constants must appear only inside method bodies, so
4
+ # the gem eager-loads cleanly when the OpenTelemetry API is absent.
6
5
  class Riffer::Tracing::Otel
7
6
  # :nodoc: all
8
7
  SUPPORTED_API_VERSIONS: Gem::Requirement
9
8
 
10
- # Wraps a live OTEL span behind the port's span surface, so callers never
11
- # touch <tt>::OpenTelemetry</tt> constants (status objects in particular).
9
+ # Keeps callers from touching <tt>::OpenTelemetry</tt> constants (status
10
+ # objects in particular).
12
11
  class Span
13
12
  @otel_span: untyped
14
13
 
@@ -28,7 +27,6 @@ class Riffer::Tracing::Otel
28
27
  # : (Exception) -> void
29
28
  def record_exception: (Exception) -> void
30
29
 
31
- # Marks the span status as error.
32
30
  # --
33
31
  # : (?String) -> void
34
32
  def error!: (?String) -> void
@@ -38,21 +36,17 @@ class Riffer::Tracing::Otel
38
36
  def recording?: () -> bool
39
37
  end
40
38
 
41
- # Builds a backend when the OpenTelemetry API is loadable at a supported
42
- # version; returns +nil+ so resolution falls back to NoOp. +provider+
43
- # defaults to the global <tt>OpenTelemetry.tracer_provider</tt>.
39
+ # Returns +nil+ so resolution falls back to NoOp.
44
40
  # --
45
41
  # : (?provider: untyped) -> Riffer::Tracing::Otel?
46
42
  def self.build: (?provider: untyped) -> Riffer::Tracing::Otel?
47
43
 
48
- # Whether the OpenTelemetry API gem is loadable at a supported version.
49
44
  # --
50
45
  # : () -> bool
51
46
  def self.available?: () -> bool
52
47
 
53
- # Whether the given opentelemetry-api version is one riffer codes
54
- # against. The gem is undeclared, so this guard is the only protection
55
- # against an incompatible API.
48
+ # opentelemetry-api is undeclared, so this is the only protection against
49
+ # an incompatible API.
56
50
  # --
57
51
  # : (Gem::Version) -> bool
58
52
  def self.supported?: (Gem::Version) -> bool
@@ -67,17 +61,14 @@ class Riffer::Tracing::Otel
67
61
  # : (provider: untyped) -> void
68
62
  def initialize: (provider: untyped) -> void
69
63
 
70
- # Opens an OTEL span around the block, yielding the wrapped span.
71
64
  # --
72
65
  # : [R] (String, attributes: Hash[String, untyped]?, kind: Symbol) { (Riffer::Tracing::Otel::Span) -> R } -> R
73
66
  def in_span: [R] (String, attributes: Hash[String, untyped]?, kind: Symbol) { (Riffer::Tracing::Otel::Span) -> R } -> R
74
67
 
75
- # Returns the active OTEL context.
76
68
  # --
77
69
  # : () -> untyped
78
70
  def current_context: () -> untyped
79
71
 
80
- # Runs the block with the given OTEL context active.
81
72
  # --
82
73
  # : [R] (untyped) { () -> R } -> R
83
74
  def with_context: [R] (untyped) { () -> R } -> R
@@ -1,7 +1,5 @@
1
1
  # Generated from lib/riffer/tracing/stream_recorder.rb with RBS::Inline
2
2
 
3
- # Wraps a stream yielder to observe terminal events for span stamping while
4
- # forwarding every event downstream untouched.
5
3
  class Riffer::Tracing::StreamRecorder
6
4
  @yielder: Enumerator::Yielder
7
5
 
@@ -1,52 +1,33 @@
1
1
  # Generated from lib/riffer/tracing.rb with RBS::Inline
2
2
 
3
- # Internal tracing port — emits OTEL spans when the host bundles the
4
- # OpenTelemetry API and no-ops otherwise, so riffer never declares an OTEL
5
- # dependency.
3
+ # No-ops unless the host bundles the OpenTelemetry API, so riffer never
4
+ # declares an OTEL dependency.
6
5
  module Riffer::Tracing
7
- @backend: untyped
8
-
9
- MUTEX: Mutex
10
-
11
6
  # The Ruby API cannot attach a schema URL to a tracer, so the semconv pin
12
7
  # lives here as the documented contract version.
13
8
  SCHEMA_URL: String
14
9
 
15
- # Opens a span around the block, yielding the span.
16
10
  # --
17
11
  # : [R] (String, ?attributes: Hash[String, untyped]?, ?kind: Symbol) { (Riffer::Tracing::Otel::Span | Riffer::Tracing::NoOp::Span) -> R } -> R
18
12
  def in_span: [R] (String, ?attributes: Hash[String, untyped]?, ?kind: Symbol) { (Riffer::Tracing::Otel::Span | Riffer::Tracing::NoOp::Span) -> R } -> R
19
13
 
20
- # Returns the active trace context, for re-attachment across fiber or
21
- # thread boundaries.
14
+ # For re-attachment across fiber or thread boundaries.
22
15
  # --
23
16
  # : () -> untyped
24
17
  def current_context: () -> untyped
25
18
 
26
- # Runs the block with the given trace context active; +nil+ passes through
27
- # so captures taken while tracing was dark stay harmless.
19
+ # +nil+ passes through so captures taken while tracing was off stay harmless.
28
20
  # --
29
21
  # : [R] (untyped) { () -> R } -> R
30
22
  def with_context: [R] (untyped) { () -> R } -> R
31
23
 
32
- # Stamps token usage onto the span — the <tt>gen_ai.usage.*</tt> counts and,
33
- # when the model was priced, <tt>riffer.cost</tt>.
34
24
  # --
35
25
  # : ((Riffer::Tracing::Otel::Span | Riffer::Tracing::NoOp::Span), Riffer::Providers::TokenUsage?) -> void
36
26
  def record_usage: (Riffer::Tracing::Otel::Span | Riffer::Tracing::NoOp::Span, Riffer::Providers::TokenUsage?) -> void
37
27
 
38
- # Discards the resolved backend so the next span re-resolves it.
39
- # --
40
- # : () -> void
41
- def reset!: () -> void
42
-
43
28
  private
44
29
 
45
30
  # --
46
31
  # : () -> untyped
47
32
  def backend: () -> untyped
48
-
49
- # --
50
- # : () -> untyped
51
- def resolve_backend: () -> untyped
52
33
  end
@@ -3,89 +3,62 @@
3
3
  module Riffer
4
4
  @config: Riffer::Config?
5
5
 
6
- # Base error class for Riffer.
7
6
  class Error < StandardError
8
7
  end
9
8
 
10
- # Raised when invalid arguments are provided.
11
9
  class ArgumentError < ::ArgumentError
12
10
  end
13
11
 
14
- # Raised when tool parameter validation fails.
15
12
  class ValidationError < Error
16
13
  end
17
14
 
18
- # Raised inside a tool's +call+ when execution exceeds the configured
19
- # timeout. Rescue it in the tool to clean up; otherwise it becomes a
15
+ # Rescue it in the tool to clean up; otherwise it becomes a
20
16
  # +:timeout_error+ response.
21
17
  class TimeoutError < Error
22
18
  end
23
19
 
24
- # Raised when a tool encounters an expected execution error.
25
20
  class ToolExecutionError < Error
26
21
  end
27
22
 
28
- # Raised when a provider's stream ends before its terminal event (Bedrock's
29
- # messageStop, Anthropic's message_stop, OpenAI's response.completed /
30
- # incomplete / failed), so a truncated or empty response is never returned
31
- # as a complete message. Events already yielded were delivered; the
32
- # request is safe to retry.
23
+ # Events already yielded were delivered; the request is safe to retry.
33
24
  class IncompleteStreamError < Error
34
25
  end
35
26
 
36
- # Base error for a file attachment that can't be resolved for the provider.
37
27
  class FileError < Error
38
28
  end
39
29
 
40
- # Raised when the provider can't accept the file at all.
41
30
  class FileUnsupportedError < FileError
42
31
  end
43
32
 
44
- # Raised when a download is required but Riffer.config.files.allow_downloads is false.
45
33
  class FileDownloadsDisabledError < FileError
46
34
  end
47
35
 
48
- # Raised when a message carries more files than Riffer.config.files.max_per_message allows.
49
36
  class TooManyFilesError < FileError
50
37
  end
51
38
 
52
- # Raised when there's an issue downloading a file
53
39
  class FileDownloadError < FileError
54
40
  end
55
41
 
56
- # Raised when a file size exceeds Riffer.config.files.max_bytes
57
42
  class FileTooLargeError < FileError
58
43
  end
59
44
 
60
- # Raised when a downloaded or inline file's sha256 doesn't match.
61
45
  class FileChecksumMismatchError < FileError
62
46
  end
63
47
 
64
- # Raised when a FilePart's data isn't valid base64
65
48
  class FileEncodingError < FileError
66
49
  end
67
50
 
68
- # Raised when two registered subclasses share the same identifier.
69
51
  class DuplicateIdentifierError < Error
70
52
  end
71
53
 
72
- # Returns the Riffer configuration.
73
- #
74
54
  # --
75
55
  # : () -> Riffer::Config
76
56
  def config: () -> Riffer::Config
77
57
 
78
- # Yields the configuration for block-based setup.
79
- #
80
- # Riffer.configure do |config|
81
- # config.openai.api_key = ENV['OPENAI_API_KEY']
82
- # end
83
- #
84
58
  # --
85
59
  # : () ?{ (Riffer::Config) -> void } -> void
86
60
  def configure: () ?{ (Riffer::Config) -> void } -> void
87
61
 
88
- # Returns the gem version.
89
62
  # --
90
63
  # : () -> String
91
64
  def version: () -> String