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,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,6 +22,7 @@ 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
@@ -47,7 +31,6 @@ class Riffer::Tools::Runtime
47
31
  # : (String) -> untyped
48
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
@@ -38,8 +35,8 @@ module Riffer::Tracing::Capture
38
35
  # : (Riffer::Messages::User::FilePart) -> Hash[Symbol, untyped]
39
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
41
  # : (String) -> untyped
45
42
  def parse_arguments: (String) -> untyped
@@ -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
@@ -0,0 +1,5 @@
1
+ # `Riffer::Helpers::Validate` uses `extend self`; rbs-inline doesn't emit that,
2
+ # so re-extend here to expose its instance methods as singleton methods.
3
+ module Riffer::Helpers::Validate
4
+ extend ::Riffer::Helpers::Validate
5
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: riffer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.48.0
4
+ version: 0.49.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jake Bottrall
@@ -119,6 +119,19 @@ files:
119
119
  - lib/riffer/agent/structured_output.rb
120
120
  - lib/riffer/agent/structured_output/result.rb
121
121
  - lib/riffer/config.rb
122
+ - lib/riffer/config/amazon_bedrock.rb
123
+ - lib/riffer/config/anthropic.rb
124
+ - lib/riffer/config/azure_open_ai.rb
125
+ - lib/riffer/config/evals.rb
126
+ - lib/riffer/config/files.rb
127
+ - lib/riffer/config/gemini.rb
128
+ - lib/riffer/config/mcp.rb
129
+ - lib/riffer/config/open_ai.rb
130
+ - lib/riffer/config/open_router.rb
131
+ - lib/riffer/config/pricing.rb
132
+ - lib/riffer/config/pricing/rates.rb
133
+ - lib/riffer/config/skills.rb
134
+ - lib/riffer/config/tracing.rb
122
135
  - lib/riffer/evals.rb
123
136
  - lib/riffer/evals/evaluator.rb
124
137
  - lib/riffer/evals/evaluator_runner.rb
@@ -141,6 +154,7 @@ files:
141
154
  - lib/riffer/helpers/deep_dup.rb
142
155
  - lib/riffer/helpers/dependencies.rb
143
156
  - lib/riffer/helpers/identifier.rb
157
+ - lib/riffer/helpers/validate.rb
144
158
  - lib/riffer/mcp.rb
145
159
  - lib/riffer/mcp/authenticated_tool.rb
146
160
  - lib/riffer/mcp/client.rb
@@ -253,6 +267,19 @@ files:
253
267
  - sig/generated/riffer/agent/structured_output.rbs
254
268
  - sig/generated/riffer/agent/structured_output/result.rbs
255
269
  - sig/generated/riffer/config.rbs
270
+ - sig/generated/riffer/config/amazon_bedrock.rbs
271
+ - sig/generated/riffer/config/anthropic.rbs
272
+ - sig/generated/riffer/config/azure_open_ai.rbs
273
+ - sig/generated/riffer/config/evals.rbs
274
+ - sig/generated/riffer/config/files.rbs
275
+ - sig/generated/riffer/config/gemini.rbs
276
+ - sig/generated/riffer/config/mcp.rbs
277
+ - sig/generated/riffer/config/open_ai.rbs
278
+ - sig/generated/riffer/config/open_router.rbs
279
+ - sig/generated/riffer/config/pricing.rbs
280
+ - sig/generated/riffer/config/pricing/rates.rbs
281
+ - sig/generated/riffer/config/skills.rbs
282
+ - sig/generated/riffer/config/tracing.rbs
256
283
  - sig/generated/riffer/evals.rbs
257
284
  - sig/generated/riffer/evals/evaluator.rbs
258
285
  - sig/generated/riffer/evals/evaluator_runner.rbs
@@ -275,6 +302,7 @@ files:
275
302
  - sig/generated/riffer/helpers/deep_dup.rbs
276
303
  - sig/generated/riffer/helpers/dependencies.rbs
277
304
  - sig/generated/riffer/helpers/identifier.rbs
305
+ - sig/generated/riffer/helpers/validate.rbs
278
306
  - sig/generated/riffer/mcp.rbs
279
307
  - sig/generated/riffer/mcp/authenticated_tool.rbs
280
308
  - sig/generated/riffer/mcp/client.rbs
@@ -368,6 +396,7 @@ files:
368
396
  - sig/manual/riffer/helpers/deep_dup.rbs
369
397
  - sig/manual/riffer/helpers/dependencies.rbs
370
398
  - sig/manual/riffer/helpers/identifier.rbs
399
+ - sig/manual/riffer/helpers/validate.rbs
371
400
  - sig/manual/riffer/mcp.rbs
372
401
  - sig/manual/riffer/mcp/authenticated_tool.rbs
373
402
  - sig/manual/riffer/mcp/registry.rbs