riffer 0.17.0 → 0.20.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 (173) hide show
  1. checksums.yaml +4 -4
  2. data/.agents/architecture.md +64 -2
  3. data/.agents/rdoc.md +16 -4
  4. data/.release-please-manifest.json +1 -1
  5. data/.ruby-version +1 -1
  6. data/CHANGELOG.md +29 -0
  7. data/README.md +1 -1
  8. data/Rakefile +1 -2
  9. data/docs/01_OVERVIEW.md +2 -2
  10. data/docs/02_GETTING_STARTED.md +2 -2
  11. data/docs/03_AGENTS.md +98 -81
  12. data/docs/04_TOOLS.md +38 -8
  13. data/docs/06_STREAM_EVENTS.md +2 -2
  14. data/docs/07_CONFIGURATION.md +16 -16
  15. data/docs/08_EVALS.md +4 -3
  16. data/docs/10_SKILLS.md +166 -0
  17. data/docs_providers/01_PROVIDERS.md +19 -13
  18. data/docs_providers/02_AMAZON_BEDROCK.md +7 -7
  19. data/docs_providers/03_ANTHROPIC.md +7 -7
  20. data/docs_providers/04_OPENAI.md +7 -9
  21. data/docs_providers/05_AZURE_OPENAI.md +165 -0
  22. data/lib/riffer/agent/response.rb +18 -9
  23. data/lib/riffer/agent.rb +203 -82
  24. data/lib/riffer/config.rb +8 -1
  25. data/lib/riffer/core.rb +2 -0
  26. data/lib/riffer/evals/evaluator.rb +13 -5
  27. data/lib/riffer/evals/evaluator_runner.rb +12 -6
  28. data/lib/riffer/evals/judge.rb +13 -4
  29. data/lib/riffer/evals/result.rb +3 -0
  30. data/lib/riffer/evals/run_result.rb +3 -0
  31. data/lib/riffer/evals/scenario_result.rb +11 -3
  32. data/lib/riffer/file_part.rb +7 -0
  33. data/lib/riffer/guardrail.rb +14 -9
  34. data/lib/riffer/guardrails/modification.rb +5 -3
  35. data/lib/riffer/guardrails/result.rb +15 -7
  36. data/lib/riffer/guardrails/runner.rb +10 -5
  37. data/lib/riffer/guardrails/tripwire.rb +6 -4
  38. data/lib/riffer/helpers/class_name_converter.rb +1 -0
  39. data/lib/riffer/helpers/dependencies.rb +1 -0
  40. data/lib/riffer/helpers/validations.rb +1 -0
  41. data/lib/riffer/messages/assistant.rb +4 -0
  42. data/lib/riffer/messages/base.rb +3 -0
  43. data/lib/riffer/messages/converter.rb +5 -2
  44. data/lib/riffer/messages/system.rb +1 -0
  45. data/lib/riffer/messages/tool.rb +4 -0
  46. data/lib/riffer/messages/user.rb +3 -0
  47. data/lib/riffer/param.rb +7 -3
  48. data/lib/riffer/params.rb +10 -0
  49. data/lib/riffer/providers/amazon_bedrock.rb +19 -0
  50. data/lib/riffer/providers/anthropic.rb +30 -0
  51. data/lib/riffer/providers/azure_open_ai.rb +41 -0
  52. data/lib/riffer/providers/base.rb +29 -6
  53. data/lib/riffer/providers/mock.rb +10 -0
  54. data/lib/riffer/providers/open_ai.rb +21 -0
  55. data/lib/riffer/providers/repository.rb +2 -0
  56. data/lib/riffer/providers.rb +1 -0
  57. data/lib/riffer/runner/fibers.rb +62 -0
  58. data/lib/riffer/runner/sequential.rb +3 -2
  59. data/lib/riffer/runner/threaded.rb +5 -3
  60. data/lib/riffer/runner.rb +6 -4
  61. data/lib/riffer/skills/activate_tool.rb +35 -0
  62. data/lib/riffer/skills/adapter.rb +37 -0
  63. data/lib/riffer/skills/backend.rb +39 -0
  64. data/lib/riffer/skills/config.rb +62 -0
  65. data/lib/riffer/skills/context.rb +81 -0
  66. data/lib/riffer/skills/filesystem_backend.rb +83 -0
  67. data/lib/riffer/skills/frontmatter.rb +105 -0
  68. data/lib/riffer/skills/markdown_adapter.rb +28 -0
  69. data/lib/riffer/skills/xml_adapter.rb +32 -0
  70. data/lib/riffer/skills.rb +5 -0
  71. data/lib/riffer/stream_events/base.rb +2 -0
  72. data/lib/riffer/stream_events/guardrail_modification.rb +7 -2
  73. data/lib/riffer/stream_events/guardrail_tripwire.rb +7 -2
  74. data/lib/riffer/stream_events/interrupt.rb +2 -0
  75. data/lib/riffer/stream_events/reasoning_delta.rb +2 -0
  76. data/lib/riffer/stream_events/reasoning_done.rb +2 -0
  77. data/lib/riffer/stream_events/skill_activation.rb +24 -0
  78. data/lib/riffer/stream_events/text_delta.rb +2 -0
  79. data/lib/riffer/stream_events/text_done.rb +2 -0
  80. data/lib/riffer/stream_events/token_usage_done.rb +2 -0
  81. data/lib/riffer/stream_events/tool_call_delta.rb +2 -0
  82. data/lib/riffer/stream_events/tool_call_done.rb +2 -0
  83. data/lib/riffer/stream_events/web_search_done.rb +2 -0
  84. data/lib/riffer/stream_events/web_search_status.rb +2 -0
  85. data/lib/riffer/stream_events.rb +1 -0
  86. data/lib/riffer/structured_output/result.rb +3 -0
  87. data/lib/riffer/structured_output.rb +3 -0
  88. data/lib/riffer/token_usage.rb +5 -0
  89. data/lib/riffer/tool.rb +11 -0
  90. data/lib/riffer/tool_runtime/fibers.rb +19 -0
  91. data/lib/riffer/tool_runtime/inline.rb +1 -0
  92. data/lib/riffer/tool_runtime/threaded.rb +2 -1
  93. data/lib/riffer/tool_runtime.rb +14 -9
  94. data/lib/riffer/tools/response.rb +8 -0
  95. data/lib/riffer/version.rb +1 -1
  96. data/lib/riffer.rb +5 -1
  97. data/sig/generated/riffer/agent/response.rbs +17 -9
  98. data/sig/generated/riffer/agent.rbs +115 -32
  99. data/sig/generated/riffer/config.rbs +15 -1
  100. data/sig/generated/riffer/core.rbs +2 -0
  101. data/sig/generated/riffer/evals/evaluator.rbs +13 -5
  102. data/sig/generated/riffer/evals/evaluator_runner.rbs +8 -4
  103. data/sig/generated/riffer/evals/judge.rbs +13 -4
  104. data/sig/generated/riffer/evals/result.rbs +3 -0
  105. data/sig/generated/riffer/evals/run_result.rbs +3 -0
  106. data/sig/generated/riffer/evals/scenario_result.rbs +8 -2
  107. data/sig/generated/riffer/file_part.rbs +7 -0
  108. data/sig/generated/riffer/guardrail.rbs +14 -9
  109. data/sig/generated/riffer/guardrails/modification.rbs +5 -3
  110. data/sig/generated/riffer/guardrails/result.rbs +15 -7
  111. data/sig/generated/riffer/guardrails/runner.rbs +10 -5
  112. data/sig/generated/riffer/guardrails/tripwire.rbs +6 -4
  113. data/sig/generated/riffer/helpers/class_name_converter.rbs +1 -0
  114. data/sig/generated/riffer/helpers/dependencies.rbs +1 -0
  115. data/sig/generated/riffer/helpers/validations.rbs +1 -0
  116. data/sig/generated/riffer/messages/assistant.rbs +4 -0
  117. data/sig/generated/riffer/messages/base.rbs +3 -0
  118. data/sig/generated/riffer/messages/converter.rbs +5 -2
  119. data/sig/generated/riffer/messages/system.rbs +1 -0
  120. data/sig/generated/riffer/messages/tool.rbs +4 -0
  121. data/sig/generated/riffer/messages/user.rbs +3 -0
  122. data/sig/generated/riffer/param.rbs +7 -3
  123. data/sig/generated/riffer/params.rbs +10 -0
  124. data/sig/generated/riffer/providers/amazon_bedrock.rbs +19 -0
  125. data/sig/generated/riffer/providers/anthropic.rbs +28 -0
  126. data/sig/generated/riffer/providers/azure_open_ai.rbs +25 -0
  127. data/sig/generated/riffer/providers/base.rbs +27 -6
  128. data/sig/generated/riffer/providers/mock.rbs +10 -0
  129. data/sig/generated/riffer/providers/open_ai.rbs +21 -0
  130. data/sig/generated/riffer/providers/repository.rbs +1 -0
  131. data/sig/generated/riffer/providers.rbs +1 -0
  132. data/sig/generated/riffer/runner/fibers.rbs +27 -0
  133. data/sig/generated/riffer/runner/sequential.rbs +3 -2
  134. data/sig/generated/riffer/runner/threaded.rbs +5 -3
  135. data/sig/generated/riffer/runner.rbs +6 -4
  136. data/sig/generated/riffer/skills/activate_tool.rbs +18 -0
  137. data/sig/generated/riffer/skills/adapter.rbs +32 -0
  138. data/sig/generated/riffer/skills/backend.rbs +34 -0
  139. data/sig/generated/riffer/skills/config.rbs +48 -0
  140. data/sig/generated/riffer/skills/context.rbs +59 -0
  141. data/sig/generated/riffer/skills/filesystem_backend.rbs +45 -0
  142. data/sig/generated/riffer/skills/frontmatter.rbs +71 -0
  143. data/sig/generated/riffer/skills/markdown_adapter.rbs +17 -0
  144. data/sig/generated/riffer/skills/xml_adapter.rbs +16 -0
  145. data/sig/generated/riffer/skills.rbs +4 -0
  146. data/sig/generated/riffer/stream_events/base.rbs +2 -0
  147. data/sig/generated/riffer/stream_events/guardrail_modification.rbs +7 -2
  148. data/sig/generated/riffer/stream_events/guardrail_tripwire.rbs +7 -2
  149. data/sig/generated/riffer/stream_events/interrupt.rbs +2 -0
  150. data/sig/generated/riffer/stream_events/reasoning_delta.rbs +2 -0
  151. data/sig/generated/riffer/stream_events/reasoning_done.rbs +2 -0
  152. data/sig/generated/riffer/stream_events/skill_activation.rbs +18 -0
  153. data/sig/generated/riffer/stream_events/text_delta.rbs +2 -0
  154. data/sig/generated/riffer/stream_events/text_done.rbs +2 -0
  155. data/sig/generated/riffer/stream_events/token_usage_done.rbs +2 -0
  156. data/sig/generated/riffer/stream_events/tool_call_delta.rbs +2 -0
  157. data/sig/generated/riffer/stream_events/tool_call_done.rbs +2 -0
  158. data/sig/generated/riffer/stream_events/web_search_done.rbs +2 -0
  159. data/sig/generated/riffer/stream_events/web_search_status.rbs +2 -0
  160. data/sig/generated/riffer/stream_events.rbs +1 -0
  161. data/sig/generated/riffer/structured_output/result.rbs +3 -0
  162. data/sig/generated/riffer/structured_output.rbs +3 -0
  163. data/sig/generated/riffer/token_usage.rbs +5 -0
  164. data/sig/generated/riffer/tool.rbs +11 -0
  165. data/sig/generated/riffer/tool_runtime/fibers.rbs +15 -0
  166. data/sig/generated/riffer/tool_runtime/inline.rbs +1 -0
  167. data/sig/generated/riffer/tool_runtime/threaded.rbs +2 -1
  168. data/sig/generated/riffer/tool_runtime.rbs +13 -8
  169. data/sig/generated/riffer/tools/response.rbs +8 -0
  170. data/sig/generated/riffer.rbs +3 -0
  171. metadata +71 -7
  172. /data/docs_providers/{05_MOCK_PROVIDER.md → 06_MOCK_PROVIDER.md} +0 -0
  173. /data/docs_providers/{06_CUSTOM_PROVIDERS.md → 07_CUSTOM_PROVIDERS.md} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 849df927faaf4614ad3a4833aafa5323731d3c1f4a7a8687db35ee5d341eb334
4
- data.tar.gz: 1d992d83487a673fef8714d6f72811eb94fdb5e646e33612eb18ac915257b832
3
+ metadata.gz: '09506e8a2dfa346e49231fa598f1e899066a5597ddd5b6738758ca49594ca7c2'
4
+ data.tar.gz: 684dc3caf2f6a59d052adb51a5c33bdf0a5542a2a375f188a1bc0a600a7df5ef
5
5
  SHA512:
6
- metadata.gz: f1967690dfbe21181d4670117de7563936c05dd7d7303597378584acba35a0543de292fb9e4f72d9ed71789d4b73dc17023ce1d1c0bba27434dea93646dccc4d
7
- data.tar.gz: 71b4c1568a2b4f5f420f3546283f5c56bc979b8234734049a8df714363faf132f36bc892dabc3e62702c59c43e74ad7e697fb702c772f2bfdec6f56950c0a1fb
6
+ metadata.gz: 2b1c4119f8afac1367aac6a7d9caddd656a598dab1ad44c921802864e73815d19c3a4f96e554483d9062c9e87864bd870e8af260b9d7f5922331bdcc714ccb52
7
+ data.tar.gz: 5f8387e02a6b2638550e59265980c8de6ce9422b77f905dcc019360e039d59ffb5b8d76310ba90819f7f7b51a5af34588b0de40782255c57215d4bf32ca862c8
@@ -4,7 +4,7 @@
4
4
 
5
5
  ### Agent (`lib/riffer/agent.rb`)
6
6
 
7
- Base class for AI agents. Subclass and use DSL methods `model`, `instructions`, and `structured_output` to configure. Orchestrates message flow, LLM calls, tool execution, and structured output parsing via a generate/stream loop.
7
+ Base class for AI agents. Subclass and use DSL methods `model`, `instructions`, `structured_output`, and `skills` to configure. Orchestrates message flow, LLM calls, tool execution, structured output parsing, and skill activation via a generate/stream loop.
8
8
 
9
9
  ```ruby
10
10
  class EchoAgent < Riffer::Agent
@@ -40,6 +40,22 @@ Adapters for LLM APIs. The base class uses a template-method pattern — `genera
40
40
 
41
41
  Providers are registered in `Riffer::Providers::Repository::REPO` with identifiers (e.g., `openai`, `amazon_bedrock`).
42
42
 
43
+ Each provider declares a preferred skill adapter via `self.skills_adapter` (Markdown for most, XML for Anthropic).
44
+
45
+ ### Skills (`lib/riffer/skills/`)
46
+
47
+ Support for the [Agent Skills spec](https://agentskills.io/). Skills are packaged as directories containing `SKILL.md` files with YAML frontmatter. The framework discovers skills through a pluggable backend, injects metadata into the system prompt, and provides a tool (`skill_activate`) for the LLM to load full skill instructions on demand.
48
+
49
+ - `Config` - DSL configuration object (`backend`, `adapter`, `activate`)
50
+ - `Backend` - base class interface (`list_skills`, `read_skill`)
51
+ - `FilesystemBackend` - built-in filesystem scanner
52
+ - `Frontmatter` - parsed YAML frontmatter value object with `.parse(raw)` class method
53
+ - `Context` - coordinates discovery, activation, caching, and prompt rendering for a generation cycle
54
+ - `Adapter` - base class for skill adapters (`render_catalog`, `activate_tool`)
55
+ - `MarkdownAdapter` - default Markdown skill adapter
56
+ - `XmlAdapter` - XML skill adapter for Anthropic/Claude
57
+ - `ActivateTool` - default tool the LLM calls to activate a skill
58
+
43
59
  ### Messages (`lib/riffer/messages/`)
44
60
 
45
61
  Typed message objects that extend `Riffer::Messages::Base`:
@@ -65,6 +81,10 @@ Structured events for streaming responses:
65
81
  - `WebSearchDone` - web search completion with query and sources
66
82
  - `Interrupt` - callback interrupted the agent loop
67
83
 
84
+ ### Per-Call State Reset
85
+
86
+ Each call to `generate` or `stream` resets `context`, tools, tool runtime, model, skills state, and the interrupted flag via `prepare_run`. Only the message history and cumulative `token_usage` persist across calls. This means `context:` must be passed on every call.
87
+
68
88
  ### Stopping the Loop Early
69
89
 
70
90
  Two mechanisms can stop the agent loop before the LLM finishes naturally:
@@ -75,10 +95,41 @@ Two mechanisms can stop the agent loop before the LLM finishes naturally:
75
95
 
76
96
  ### Resuming After an Interrupt
77
97
 
78
- `agent.resume` or `agent.resume_stream` continues an interrupted loop. Both accept `messages:` for cross-process resume from persisted data.
98
+ Two resume paths:
99
+
100
+ - **In-memory** — call `generate` or `stream` again with a string on the same agent instance. The message history is preserved and the new user message is appended.
101
+ - **Cross-process** — pass persisted messages as an array to a new agent instance. Array input uses messages as-is (no system message prepend). Passing an array to an agent that already has messages raises `Riffer::ArgumentError`.
102
+
103
+ ```ruby
104
+ agent.generate('Continue') # in-memory resume
105
+ MyAgent.new.stream(persisted_messages) # cross-process resume
106
+ ```
79
107
 
80
108
  On resume, `execute_pending_tool_calls` detects tool calls from the last assistant message that lack corresponding tool result messages and executes them before entering the LLM loop. This handles the case where an interrupt fired mid-way through tool execution.
81
109
 
110
+ ### Runner (`lib/riffer/runner.rb`)
111
+
112
+ Concurrency primitive for batch execution. Subclasses implement `#map(items, context: nil, &block)` to control how items are processed. The `context` keyword carries the agent's context hash, enabling runners that need it for job serialization or routing.
113
+
114
+ Built-in runners:
115
+ - `Sequential` — processes items in the current thread via `Array#map`
116
+ - `Threaded` — processes items concurrently using a thread pool with configurable `max_concurrency`
117
+
118
+ ```ruby
119
+ runner = Riffer::Runner::Threaded.new(max_concurrency: 3)
120
+ runner.map(items, context: ctx) { |item| process(item) }
121
+ ```
122
+
123
+ ### ToolRuntime (`lib/riffer/tool_runtime.rb`)
124
+
125
+ Composes with a Runner to execute tool calls. Provides `#execute` as the public entry point and `#around_tool_call` as a hook for instrumentation. Passes the agent context through to the runner.
126
+
127
+ Built-in runtimes:
128
+ - `Inline` — uses `Runner::Sequential` (default)
129
+ - `Threaded` — uses `Runner::Threaded`
130
+
131
+ Context flow: `Agent#execute_tool_calls` → `ToolRuntime#execute(tool_calls, tools:, context:)` → `Runner#map(tool_calls, context:) { dispatch }` → `Tool#call(context:, **args)`
132
+
82
133
  ## Key Patterns
83
134
 
84
135
  - Model config accepts a `provider/model` string (e.g., `openai/gpt-4`) or a Proc/lambda that returns one
@@ -105,6 +156,17 @@ lib/
105
156
  params.rb # Parameter collection with DSL and validation
106
157
  structured_output.rb # Structured output schema wrapper
107
158
  stream_events.rb # Stream events namespace/module
159
+ skills.rb # Skills namespace/module
160
+ skills/
161
+ config.rb # DSL configuration object
162
+ adapter.rb # Adapter base class (render_catalog, activate_tool)
163
+ markdown_adapter.rb # Default Markdown skill adapter
164
+ xml_adapter.rb # XML skill adapter for Anthropic/Claude
165
+ backend.rb # Backend base class (interface)
166
+ filesystem_backend.rb # Built-in filesystem backend
167
+ frontmatter.rb # Parsed YAML frontmatter value object with .parse
168
+ context.rb # Skills context for a generation cycle
169
+ activate_tool.rb # Default skill_activate tool
108
170
  structured_output/
109
171
  result.rb # Parse/validation result object
110
172
  helpers/
data/.agents/rdoc.md CHANGED
@@ -4,18 +4,30 @@ Use RDoc prose comments for public API descriptions and RBS inline annotations f
4
4
 
5
5
  ## Parameters and Return Types
6
6
 
7
- Describe parameters in the RDoc prose comment. Use a single `#:` line for the RBS method signature (see [rbs-inline.md](rbs-inline.md) for the full type annotation syntax):
7
+ Describe parameters using RDoc labeled list syntax. Use a single `#:` line for the RBS method signature (see [rbs-inline.md](rbs-inline.md) for the full type annotation syntax):
8
8
 
9
9
  ```ruby
10
10
  # Creates a new agent.
11
11
  #
12
- # +name+ - the agent name.
13
- # +options+ - optional configuration.
12
+ # [name] the agent name.
13
+ # [options] optional configuration.
14
14
  #
15
+ #--
15
16
  #: (String, ?options: Hash[Symbol, untyped]) -> void
16
17
  def initialize(name, options: {})
17
18
  ```
18
19
 
20
+ Always add `#--` (RDoc stop directive) on the line before a standalone `#:` type annotation. Without it, RDoc treats `#:` as a label-list marker and corrupts the preceding comment into a `<pre>` block. Inline `#:` on the same line as code (e.g., `attr_reader :name #: String`) does not need this.
21
+
22
+ ## Inline Code
23
+
24
+ Use `+word+` for single-word inline code. For multi-word expressions (containing spaces, colons, or brackets), use `<tt>multi word expression</tt>`:
25
+
26
+ ```ruby
27
+ # Returns +nil+ when no instructions are configured.
28
+ # Equivalent to <tt>throw :riffer_interrupt, reason</tt>.
29
+ ```
30
+
19
31
  ## Attributes and Constants
20
32
 
21
33
  Use `#:` inline syntax (on the same line) for attribute and constant types:
@@ -37,7 +49,7 @@ Document with prose:
37
49
 
38
50
  ## Examples
39
51
 
40
- Include usage examples as indented code blocks:
52
+ Include usage examples as indented code blocks (2 extra spaces of indent):
41
53
 
42
54
  ```ruby
43
55
  # Creates a new agent.
@@ -1,3 +1,3 @@
1
1
  {
2
- ".": "0.17.0"
2
+ ".": "0.20.0"
3
3
  }
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 3.4.8
1
+ 3.4.8
data/CHANGELOG.md CHANGED
@@ -5,6 +5,35 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.20.0](https://github.com/janeapp/riffer/compare/riffer/v0.19.0...riffer/v0.20.0) (2026-03-26)
9
+
10
+
11
+ ### Features
12
+
13
+ * add fibers tool runtime using async gem ([#178](https://github.com/janeapp/riffer/issues/178)) ([67fd344](https://github.com/janeapp/riffer/commit/67fd34493126559b99a00cc3402a6adabefc14ea))
14
+
15
+
16
+ ### Bug Fixes
17
+
18
+ * correct RDoc formatting for docs.riffer.ai ([#182](https://github.com/janeapp/riffer/issues/182)) ([2f2fbc9](https://github.com/janeapp/riffer/commit/2f2fbc997281ef4a546a58e44233e325a25c41d5))
19
+
20
+ ## [0.19.0](https://github.com/janeapp/riffer/compare/riffer/v0.18.0...riffer/v0.19.0) (2026-03-25)
21
+
22
+
23
+ ### Features
24
+
25
+ * Add Azure OpenAI provider ([#167](https://github.com/janeapp/riffer/issues/167)) ([5d34fcd](https://github.com/janeapp/riffer/commit/5d34fcd4a98a6bcfa768c50fea7c25959eca5f1d))
26
+ * expose message history in eval results ([#171](https://github.com/janeapp/riffer/issues/171)) ([c8b1aec](https://github.com/janeapp/riffer/commit/c8b1aeceb40a173c70d4be445fb82bba10113b87))
27
+ * provide agent context to runners ([#181](https://github.com/janeapp/riffer/issues/181)) ([23c9282](https://github.com/janeapp/riffer/commit/23c9282d4f2076d1ff6185f99bcf855f158ccb0d))
28
+
29
+ ## [0.18.0](https://github.com/janeapp/riffer/compare/riffer/v0.17.0...riffer/v0.18.0) (2026-03-13)
30
+
31
+
32
+ ### Features
33
+
34
+ * add support for agent skills ([#151](https://github.com/janeapp/riffer/issues/151)) ([8847d54](https://github.com/janeapp/riffer/commit/8847d54dede875f207d0e0b28bb64039d3c2e69f))
35
+ * Unify generate/stream API with multi-turn support, remove resume methods ([#165](https://github.com/janeapp/riffer/issues/165)) ([58826df](https://github.com/janeapp/riffer/commit/58826df27806bb10afe1c7ad94322cc643d049f9))
36
+
8
37
  ## [0.17.0](https://github.com/janeapp/riffer/compare/riffer/v0.16.1...riffer/v0.17.0) (2026-03-06)
9
38
 
10
39
 
data/README.md CHANGED
@@ -34,7 +34,7 @@ end
34
34
 
35
35
  # Define an agent
36
36
  class EchoAgent < Riffer::Agent
37
- model 'openai/gpt-4o'
37
+ model 'openai/gpt-5-mini'
38
38
  instructions 'You are an assistant that repeats what the user says.'
39
39
  end
40
40
 
data/Rakefile CHANGED
@@ -17,8 +17,7 @@ RDoc::Task.new do |rdoc|
17
17
  rdoc.rdoc_files.include("README.md", "CHANGELOG.md", "LICENSE.txt", "docs/**/*.md", "docs_providers/**/*.md")
18
18
  rdoc.rdoc_files.include("lib/**/*.rb")
19
19
 
20
- # Use Markdown where available and ensure UTF-8
21
- rdoc.options << "--charset" << "utf-8" << "--markup" << "markdown"
20
+ rdoc.options << "--charset" << "utf-8"
22
21
  end
23
22
 
24
23
  task docs: :rdoc
data/docs/01_OVERVIEW.md CHANGED
@@ -10,7 +10,7 @@ The Agent is the central orchestrator for AI interactions. It manages messages,
10
10
 
11
11
  ```ruby
12
12
  class MyAgent < Riffer::Agent
13
- model 'openai/gpt-4o'
13
+ model 'openai/gpt-5-mini'
14
14
  instructions 'You are a helpful assistant.'
15
15
  end
16
16
  ```
@@ -43,7 +43,7 @@ Agents can return structured JSON responses that conform to a schema. The respon
43
43
 
44
44
  ```ruby
45
45
  class SentimentAgent < Riffer::Agent
46
- model 'openai/gpt-4o'
46
+ model 'openai/gpt-5-mini'
47
47
  structured_output do
48
48
  required :sentiment, String
49
49
  required :score, Float
@@ -68,7 +68,7 @@ Riffer.configure do |config|
68
68
  end
69
69
 
70
70
  class GreetingAgent < Riffer::Agent
71
- model 'openai/gpt-4o'
71
+ model 'openai/gpt-5-mini'
72
72
  instructions 'You are a friendly assistant. Greet the user warmly.'
73
73
  end
74
74
 
@@ -109,7 +109,7 @@ class TimeTool < Riffer::Tool
109
109
  end
110
110
 
111
111
  class TimeAgent < Riffer::Agent
112
- model 'openai/gpt-4o'
112
+ model 'openai/gpt-5-mini'
113
113
  instructions 'You can tell the user the current time.'
114
114
  uses_tools [TimeTool]
115
115
  end