riffer 0.28.0 → 0.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. checksums.yaml +4 -4
  2. data/.agents/architecture.md +18 -11
  3. data/.agents/code-style.md +1 -1
  4. data/.agents/rbs-inline.md +2 -2
  5. data/.agents/testing.md +9 -5
  6. data/.release-please-manifest.json +1 -1
  7. data/AGENTS.md +17 -10
  8. data/CHANGELOG.md +19 -0
  9. data/README.md +17 -18
  10. data/Steepfile +7 -1
  11. data/docs/03_AGENTS.md +34 -3
  12. data/docs/04_AGENT_LIFECYCLE.md +87 -86
  13. data/docs/05_AGENT_LOOP.md +2 -2
  14. data/docs/06_TOOLS.md +9 -4
  15. data/docs/07_TOOL_ADVANCED.md +17 -17
  16. data/docs/08_MESSAGES.md +25 -32
  17. data/docs/09_STREAM_EVENTS.md +1 -1
  18. data/docs/10_CONFIGURATION.md +7 -18
  19. data/docs/providers/01_PROVIDERS.md +6 -0
  20. data/docs/providers/06_MOCK_PROVIDER.md +2 -1
  21. data/docs/providers/07_CUSTOM_PROVIDERS.md +4 -4
  22. data/docs/providers/08_GEMINI.md +2 -2
  23. data/docs/providers/09_OPENROUTER.md +242 -0
  24. data/lib/riffer/agent/config.rb +173 -0
  25. data/lib/riffer/agent/context.rb +125 -0
  26. data/lib/riffer/agent/run.rb +308 -0
  27. data/lib/riffer/agent/session/repair.rb +112 -0
  28. data/lib/riffer/agent/session.rb +268 -0
  29. data/lib/riffer/{structured_output → agent/structured_output}/result.rb +1 -1
  30. data/lib/riffer/{structured_output.rb → agent/structured_output.rb} +4 -4
  31. data/lib/riffer/agent.rb +234 -923
  32. data/lib/riffer/config.rb +14 -7
  33. data/lib/riffer/evals/evaluator.rb +13 -3
  34. data/lib/riffer/evals/judge.rb +2 -2
  35. data/lib/riffer/evals/run_result.rb +2 -1
  36. data/lib/riffer/evals/scenario_result.rb +2 -1
  37. data/lib/riffer/guardrails/runner.rb +3 -2
  38. data/lib/riffer/helpers/call_or_value.rb +16 -0
  39. data/lib/riffer/helpers.rb +0 -1
  40. data/lib/riffer/mcp/authenticated_tool.rb +4 -0
  41. data/lib/riffer/mcp/client.rb +1 -1
  42. data/lib/riffer/mcp/registration.rb +2 -3
  43. data/lib/riffer/mcp/registry.rb +3 -1
  44. data/lib/riffer/mcp/tool_factory.rb +5 -0
  45. data/lib/riffer/messages/assistant.rb +9 -3
  46. data/lib/riffer/messages/base.rb +22 -0
  47. data/lib/riffer/messages/converter.rb +6 -6
  48. data/lib/riffer/{file_part.rb → messages/file_part.rb} +5 -5
  49. data/lib/riffer/messages/tool.rb +1 -1
  50. data/lib/riffer/messages/user.rb +4 -4
  51. data/lib/riffer/{boolean.rb → params/boolean.rb} +3 -3
  52. data/lib/riffer/{param.rb → params/param.rb} +6 -6
  53. data/lib/riffer/params.rb +27 -21
  54. data/lib/riffer/providers/amazon_bedrock.rb +19 -20
  55. data/lib/riffer/providers/anthropic.rb +27 -28
  56. data/lib/riffer/providers/base.rb +10 -9
  57. data/lib/riffer/providers/gemini.rb +15 -12
  58. data/lib/riffer/providers/mock.rb +41 -13
  59. data/lib/riffer/providers/open_ai.rb +24 -22
  60. data/lib/riffer/providers/open_router.rb +318 -0
  61. data/lib/riffer/providers/repository.rb +1 -0
  62. data/lib/riffer/{token_usage.rb → providers/token_usage.rb} +4 -4
  63. data/lib/riffer/providers.rb +1 -0
  64. data/lib/riffer/runner/fibers.rb +4 -3
  65. data/lib/riffer/runner/sequential.rb +1 -1
  66. data/lib/riffer/runner/threaded.rb +1 -1
  67. data/lib/riffer/runner.rb +1 -1
  68. data/lib/riffer/skills/activate_tool.rb +4 -3
  69. data/lib/riffer/skills/config.rb +1 -1
  70. data/lib/riffer/skills/context.rb +3 -3
  71. data/lib/riffer/skills/filesystem_backend.rb +7 -5
  72. data/lib/riffer/skills/markdown_adapter.rb +1 -1
  73. data/lib/riffer/skills/xml_adapter.rb +1 -1
  74. data/lib/riffer/stream_events/interrupt.rb +1 -1
  75. data/lib/riffer/stream_events/token_usage_done.rb +2 -2
  76. data/lib/riffer/stream_events/web_search_status.rb +1 -1
  77. data/lib/riffer/tool.rb +3 -3
  78. data/lib/riffer/{tool_runtime → tools/runtime}/fibers.rb +2 -2
  79. data/lib/riffer/{tool_runtime → tools/runtime}/inline.rb +1 -1
  80. data/lib/riffer/{tool_runtime → tools/runtime}/threaded.rb +2 -2
  81. data/lib/riffer/{tool_runtime.rb → tools/runtime.rb} +9 -9
  82. data/lib/riffer/{toolable.rb → tools/toolable.rb} +12 -9
  83. data/lib/riffer/version.rb +1 -1
  84. data/lib/riffer.rb +2 -1
  85. data/sig/generated/riffer/agent/config.rbs +119 -0
  86. data/sig/generated/riffer/agent/context.rbs +91 -0
  87. data/sig/generated/riffer/agent/run.rbs +144 -0
  88. data/sig/generated/riffer/agent/session/repair.rbs +51 -0
  89. data/sig/generated/riffer/agent/session.rbs +145 -0
  90. data/sig/generated/riffer/{structured_output → agent/structured_output}/result.rbs +2 -2
  91. data/sig/generated/riffer/{structured_output.rbs → agent/structured_output.rbs} +6 -6
  92. data/sig/generated/riffer/agent.rbs +143 -342
  93. data/sig/generated/riffer/config.rbs +17 -5
  94. data/sig/generated/riffer/evals/judge.rbs +2 -2
  95. data/sig/generated/riffer/helpers/call_or_value.rbs +9 -0
  96. data/sig/generated/riffer/helpers.rbs +0 -1
  97. data/sig/generated/riffer/messages/assistant.rbs +7 -3
  98. data/sig/generated/riffer/messages/base.rbs +18 -0
  99. data/sig/generated/riffer/messages/converter.rbs +4 -4
  100. data/sig/generated/riffer/{file_part.rbs → messages/file_part.rbs} +5 -5
  101. data/sig/generated/riffer/messages/user.rbs +4 -4
  102. data/sig/generated/riffer/params/boolean.rbs +10 -0
  103. data/sig/generated/riffer/{param.rbs → params/param.rbs} +3 -3
  104. data/sig/generated/riffer/params.rbs +15 -15
  105. data/sig/generated/riffer/providers/amazon_bedrock.rbs +22 -22
  106. data/sig/generated/riffer/providers/anthropic.rbs +4 -4
  107. data/sig/generated/riffer/providers/base.rbs +10 -10
  108. data/sig/generated/riffer/providers/gemini.rbs +4 -4
  109. data/sig/generated/riffer/providers/mock.rbs +25 -5
  110. data/sig/generated/riffer/providers/open_ai.rbs +4 -4
  111. data/sig/generated/riffer/providers/open_router.rbs +85 -0
  112. data/sig/generated/riffer/{token_usage.rbs → providers/token_usage.rbs} +5 -5
  113. data/sig/generated/riffer/providers.rbs +1 -0
  114. data/sig/generated/riffer/runner/fibers.rbs +2 -2
  115. data/sig/generated/riffer/runner/sequential.rbs +2 -2
  116. data/sig/generated/riffer/runner/threaded.rbs +2 -2
  117. data/sig/generated/riffer/runner.rbs +2 -2
  118. data/sig/generated/riffer/skills/activate_tool.rbs +4 -3
  119. data/sig/generated/riffer/skills/config.rbs +1 -1
  120. data/sig/generated/riffer/skills/context.rbs +2 -2
  121. data/sig/generated/riffer/stream_events/token_usage_done.rbs +3 -3
  122. data/sig/generated/riffer/tool.rbs +5 -5
  123. data/sig/generated/riffer/{tool_runtime → tools/runtime}/fibers.rbs +3 -3
  124. data/sig/generated/riffer/{tool_runtime → tools/runtime}/inline.rbs +2 -2
  125. data/sig/generated/riffer/{tool_runtime → tools/runtime}/threaded.rbs +3 -3
  126. data/sig/generated/riffer/{tool_runtime.rbs → tools/runtime.rbs} +12 -12
  127. data/sig/generated/riffer/{toolable.rbs → tools/toolable.rbs} +6 -6
  128. data/sig/stubs/agent_ivars.rbs +7 -0
  129. data/sig/stubs/async.rbs +24 -0
  130. data/sig/stubs/aws-sdk-core/seahorse_request_context.rbs +7 -0
  131. data/sig/stubs/aws-sdk-core/static_token_provider.rbs +5 -0
  132. data/sig/stubs/extend_self.rbs +11 -0
  133. data/sig/stubs/lib_ivars.rbs +101 -0
  134. data/sig/stubs/mcp_sdk.rbs +22 -0
  135. data/sig/stubs/provider_ivars.rbs +36 -0
  136. data/sig/stubs/provider_sdk_methods.rbs +50 -0
  137. data/sig/stubs/zeitwerk.rbs +12 -0
  138. metadata +54 -33
  139. data/lib/riffer/core.rb +0 -28
  140. data/lib/riffer/helpers/validations.rb +0 -18
  141. data/sig/generated/riffer/boolean.rbs +0 -10
  142. data/sig/generated/riffer/core.rbs +0 -19
  143. data/sig/generated/riffer/helpers/validations.rbs +0 -12
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 65b1a78bcc2e6e26690176a167d4b8f5a28fdc83c95ac582fb980e1d52d0d89f
4
- data.tar.gz: fa3f0633c56ca64a25f4026d48f7c8366344cacb76b2bdd7f4e9ce8642045b6c
3
+ metadata.gz: be73ae37c66f2f6ad16acdd7b52c271a782172878086821a9c95dbbe238541d3
4
+ data.tar.gz: 29ea65859395f2e6daaa993d9e8c60cf1908781f1acf79b642588439f4e41781
5
5
  SHA512:
6
- metadata.gz: e643b5a130b85f63bb37f51adf0fb43ea94f242af66ba379b98da8fbaf9e7389f17d9793cd2b1ff9a1b889ccce711632b02dfcd976cf323bf3c3b1300695635d
7
- data.tar.gz: b01a4a3d4db8ca8ef72acf1e8c3e5b1ab01e5d47fdeca1a046c65daf8bde4e0160be8f10b2d94dc56c1dcd28e491cf6be44cf44fa12216fabe56956c327e9959
6
+ metadata.gz: cce21dcb1840e39b96032cf6061dcce6030e35c21c1ce8f3937138405067cd39644f4a55fd4fddfcc9623549441dccb0d76b5443e7fa890ab84ce73f6af2736d
7
+ data.tar.gz: 3c0e8a0fbcd42c3aceee9b4d8837188e260d444c2e22df72f1976bdfc7b05bf2669f2494d3121ca066d142baa8629bdd01c51acd294869702b5357d83943a4a6
@@ -6,6 +6,8 @@
6
6
 
7
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
+ Class-level DSL settings live on a per-class `Riffer::Agent::Config` object accessible via `MyAgent.config`. DSL methods read and mutate this Config in place. Instances read from `@config`, which defaults to `self.class.config` but can be replaced via `Agent.new(config: ...)`.
10
+
9
11
  ```ruby
10
12
  class EchoAgent < Riffer::Agent
11
13
  model 'openai/gpt-5-mini' # provider/model
@@ -61,11 +63,11 @@ Support for the [Agent Skills spec](https://agentskills.io/). Skills are package
61
63
  Typed message objects that extend `Riffer::Messages::Base`:
62
64
 
63
65
  - `System` - system instructions
64
- - `User` - user input (supports file attachments via `Riffer::FilePart`)
66
+ - `User` - user input (supports file attachments via `Riffer::Messages::FilePart`)
65
67
  - `Assistant` - AI responses
66
68
  - `Tool` - tool execution results
67
69
 
68
- `Riffer::FilePart` represents file attachments (images and documents) that can be included with User messages. Supports file paths, URLs, and raw base64 data.
70
+ `Riffer::Messages::FilePart` represents file attachments (images and documents) that can be included with User messages. Supports file paths, URLs, and raw base64 data.
69
71
 
70
72
  The `Converter` module handles hash-to-object conversion, including file hash-to-`FilePart` conversion.
71
73
 
@@ -121,7 +123,7 @@ runner = Riffer::Runner::Threaded.new(max_concurrency: 3)
121
123
  runner.map(items, context: ctx) { |item| process(item) }
122
124
  ```
123
125
 
124
- ### ToolRuntime (`lib/riffer/tool_runtime.rb`)
126
+ ### Tools::Runtime (`lib/riffer/tools/runtime.rb`)
125
127
 
126
128
  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.
127
129
 
@@ -130,7 +132,7 @@ Built-in runtimes:
130
132
  - `Inline` — uses `Runner::Sequential` (default)
131
133
  - `Threaded` — uses `Runner::Threaded`
132
134
 
133
- Context flow: `Agent#execute_tool_calls` → `ToolRuntime#execute(tool_calls, tools:, context:)` → `Runner#map(tool_calls, context:) { dispatch }` → `Tool#call(context:, **args)`
135
+ Context flow: `Agent#execute_tool_calls` → `Tools::Runtime#execute(tool_calls, tools:, context:)` → `Runner#map(tool_calls, context:) { dispatch }` → `Tool#call(context:, **args)`
134
136
 
135
137
  ### MCP Integration (`lib/riffer/mcp/`)
136
138
 
@@ -176,13 +178,21 @@ lib/
176
178
  riffer/
177
179
  version.rb # VERSION constant
178
180
  config.rb # Configuration class
179
- core.rb # Core functionality
180
181
  agent.rb # Agent class
182
+ agent/
183
+ config.rb # Per-class DSL configuration value object
184
+ session.rb # Conversation handle (message array + invariants)
185
+ session/
186
+ repair.rb # tool_use ↔ tool_result invariant repair
187
+ structured_output.rb # Structured output schema wrapper
188
+ structured_output/
189
+ result.rb # Parse/validation result object
181
190
  messages.rb # Messages namespace/module
182
191
  providers.rb # Providers namespace/module
183
- param.rb # Single parameter definition (shared by tools and structured output)
184
192
  params.rb # Parameter collection with DSL and validation
185
- structured_output.rb # Structured output schema wrapper
193
+ params/
194
+ param.rb # Single parameter definition (shared by tools and structured output)
195
+ boolean.rb # Boolean sentinel type
186
196
  stream_events.rb # Stream events namespace/module
187
197
  skills.rb # Skills namespace/module
188
198
  skills/
@@ -195,13 +205,9 @@ lib/
195
205
  frontmatter.rb # Parsed YAML frontmatter value object with .parse
196
206
  context.rb # Skills context for a generation cycle
197
207
  activate_tool.rb # Default skill_activate tool
198
- structured_output/
199
- result.rb # Parse/validation result object
200
208
  helpers/
201
209
  class_name_converter.rb # Class name conversion utilities
202
210
  dependencies.rb # Dependency management
203
- validations.rb # Validation helpers
204
- file_part.rb # File attachment (images and documents)
205
211
  messages/
206
212
  base.rb # Base message class
207
213
  assistant.rb # Assistant message
@@ -209,6 +215,7 @@ lib/
209
215
  system.rb # System message
210
216
  user.rb # User message
211
217
  tool.rb # Tool message
218
+ file_part.rb # File attachment (images and documents)
212
219
  providers/
213
220
  base.rb # Base provider class
214
221
  open_ai.rb # OpenAI provider
@@ -4,7 +4,7 @@
4
4
 
5
5
  - Use StandardRB for linting and formatting
6
6
  - Custom rules are defined in `.standard.yml`
7
- - Run `bundle exec rake standard` to check, `bundle exec rake standard:fix` to auto-fix
7
+ - Run `bin/lint` to check, `bin/lint --fix` to auto-fix
8
8
 
9
9
  ## Required Header
10
10
 
@@ -116,8 +116,8 @@ DEFAULTS = {}.freeze #: Hash[Symbol, untyped]
116
116
 
117
117
  After changing type annotations:
118
118
 
119
- 1. Run `bundle exec rake rbs:generate` to regenerate `sig/generated/` files
119
+ 1. Run `bin/rbs` to regenerate `sig/generated/` files
120
120
  2. Commit both the source changes and the generated `.rbs` files
121
121
  3. CI checks for drift between source annotations and committed `.rbs` files
122
122
 
123
- Use `bundle exec rake rbs:watch` during development to auto-regenerate on file changes.
123
+ Use `bin/rbs-watch` during development to auto-regenerate on file changes.
data/.agents/testing.md CHANGED
@@ -46,11 +46,15 @@ Record external API interactions in `test/fixtures/vcr_cassettes/`.
46
46
 
47
47
  ```bash
48
48
  # Run all tests
49
- bundle exec rake test
49
+ bin/test
50
50
 
51
- # Run a single test file
52
- bundle exec ruby -Ilib:test test/riffer/agent_test.rb
51
+ # Run a single test file (or multiple files)
52
+ bin/test test/riffer/agent_test.rb
53
+ bin/test test/riffer/agent_test.rb test/riffer/config_test.rb
53
54
 
54
- # Run a specific test by name
55
- bundle exec ruby -Ilib:test test/riffer/agent_test.rb --name "test_something"
55
+ # Filter by test name (regex or substring)
56
+ bin/test test/riffer/agent_test.rb --name /generates/
57
+
58
+ # Filter across the whole suite
59
+ bin/test --name /generates/
56
60
  ```
@@ -1,3 +1,3 @@
1
1
  {
2
- ".": "0.28.0"
2
+ ".": "0.29.0"
3
3
  }
data/AGENTS.md CHANGED
@@ -5,7 +5,7 @@ Ruby gem framework for building AI-powered agents with LLM provider adapters.
5
5
  ## Quick Reference
6
6
 
7
7
  - **Ruby**: 3.3.0+ (CI: 3.3, 3.4, 4.0)
8
- - **Lint + Test**: `bundle exec rake`
8
+ - **Lint + Test**: `bin/rake` (runs the default task: test + standard + steep:check)
9
9
  - **Autoloading**: Zeitwerk (file paths must match module/class names)
10
10
  - **Model format**: `provider/model` (e.g., `openai/gpt-4`)
11
11
  - **Docs**: when adding a public config option or message attribute, update the matching page in `docs/` (e.g., `docs/10_CONFIGURATION.md`, `docs/08_MESSAGES.md`). RDoc ≠ user docs.
@@ -21,12 +21,19 @@ Ruby gem framework for building AI-powered agents with LLM provider adapters.
21
21
 
22
22
  ## Commands
23
23
 
24
- | Command | Description |
25
- | ------------------------------- | ------------------------------ |
26
- | `bundle exec rake` | Run tests + lint (default) |
27
- | `bundle exec rake test` | Run tests only |
28
- | `bundle exec rake standard` | Check code style |
29
- | `bundle exec rake standard:fix` | Auto-fix style issues |
30
- | `bundle exec rake rbs:generate` | Generate RBS type signatures |
31
- | `bundle exec rake rbs:watch` | Watch and regenerate RBS files |
32
- | `bin/console` | Interactive console |
24
+ All wrappers `exec bundle exec …` under the hood.
25
+
26
+ | Command | Description |
27
+ | --------------- | -------------------------------------------- |
28
+ | `bin/rake` | Default task: test + standard + steep:check |
29
+ | `bin/test` | Run tests |
30
+ | `bin/lint` | Check code style (pass `--fix` to auto-fix) |
31
+ | `bin/typecheck` | Run Steep type checker |
32
+ | `bin/rbs` | Generate RBS type signatures |
33
+ | `bin/rbs-watch` | Watch and regenerate RBS files |
34
+ | `bin/docs` | Build RDoc HTML |
35
+ | `bin/build` | Build the gem package |
36
+ | `bin/console` | Interactive console |
37
+ | `bin/setup` | Install dependencies |
38
+
39
+ `bin/rake <task>` is the escape hatch for any rake task without a named wrapper.
data/CHANGELOG.md CHANGED
@@ -5,6 +5,25 @@ 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.29.0](https://github.com/janeapp/riffer/compare/riffer/v0.28.0...riffer/v0.29.0) (2026-05-29)
9
+
10
+
11
+ ### ⚠ BREAKING CHANGES
12
+
13
+ * move leaf types out of root Riffer namespace ([#282](https://github.com/janeapp/riffer/issues/282))
14
+ * Public API reshape on `Riffer::Agent`. Downstream consumers must migrate the following surfaces:
15
+
16
+ ### Features
17
+
18
+ * add bin/ wrappers for common dev commands ([#276](https://github.com/janeapp/riffer/issues/276)) ([6812ba2](https://github.com/janeapp/riffer/commit/6812ba254d0b9220dae5ed0bbfbc4d8fee5b14e1))
19
+ * add OpenRouter provider ([#280](https://github.com/janeapp/riffer/issues/280)) ([0d615b6](https://github.com/janeapp/riffer/commit/0d615b60ec3bb65091df16142a8e67f2afceea74))
20
+
21
+
22
+ ### Code Refactoring
23
+
24
+ * extract Riffer::Agent::Run, eagerly resolve per-agent state ([#268](https://github.com/janeapp/riffer/issues/268)) ([1d9e141](https://github.com/janeapp/riffer/commit/1d9e141e8a381eaac13f107ca29b726b4d84b3f3))
25
+ * move leaf types out of root Riffer namespace ([#282](https://github.com/janeapp/riffer/issues/282)) ([3637a53](https://github.com/janeapp/riffer/commit/3637a53ae8160e70bdaeae3d49812adfefac2c4b))
26
+
8
27
  ## [0.28.0](https://github.com/janeapp/riffer/compare/riffer/v0.27.2...riffer/v0.28.0) (2026-05-08)
9
28
 
10
29
 
data/README.md CHANGED
@@ -68,7 +68,7 @@ For comprehensive documentation, see the [docs](docs/) directory:
68
68
  Generate the full API documentation with:
69
69
 
70
70
  ```bash
71
- bundle exec rake docs
71
+ bin/docs
72
72
  ```
73
73
 
74
74
  Then open `doc/index.html` in your browser.
@@ -81,24 +81,23 @@ After checking out the repo, run:
81
81
  bin/setup
82
82
  ```
83
83
 
84
- Run the test suite:
84
+ Common workflows are wrapped in `bin/`. Each is a thin `exec bundle exec …` script — use them
85
+ instead of typing `bundle exec` yourself:
85
86
 
86
- ```bash
87
- bundle exec rake test
88
- ```
89
-
90
- Check and fix code style:
87
+ | Command | Description |
88
+ | --------------- | -------------------------------------------- |
89
+ | `bin/rake` | Default task: test + standard + steep:check |
90
+ | `bin/test` | Run tests |
91
+ | `bin/lint` | Check code style (pass `--fix` to auto-fix) |
92
+ | `bin/typecheck` | Run Steep type checker |
93
+ | `bin/rbs` | Generate RBS type signatures |
94
+ | `bin/rbs-watch` | Watch and regenerate RBS files |
95
+ | `bin/docs` | Build RDoc HTML |
96
+ | `bin/build` | Build the gem package |
97
+ | `bin/console` | Interactive console |
91
98
 
92
- ```bash
93
- bundle exec rake standard
94
- bundle exec rake standard:fix
95
- ```
96
-
97
- Run the interactive console:
98
-
99
- ```bash
100
- bin/console
101
- ```
99
+ `bin/rake <task>` is the escape hatch for any rake task without a named wrapper (e.g.
100
+ `bin/rake test:slow`, `bin/rake release`).
102
101
 
103
102
  ### Recording VCR Cassettes
104
103
 
@@ -125,7 +124,7 @@ VCR records the HTTP interactions to `test/fixtures/vcr_cassettes/` on the first
125
124
  ## Contributing
126
125
 
127
126
  1. Fork the repository and create your branch: `git checkout -b feature/foo`
128
- 2. Run tests and linters locally: `bundle exec rake`
127
+ 2. Run tests and linters locally: `bin/rake`
129
128
  3. Submit a pull request with a clear description of the change
130
129
 
131
130
  Please follow the [Code of Conduct](https://github.com/janeapp/riffer/blob/main/CODE_OF_CONDUCT.md).
data/Steepfile CHANGED
@@ -2,16 +2,22 @@ D = Steep::Diagnostic
2
2
 
3
3
  target :lib do
4
4
  signature "sig/generated"
5
+ signature "sig/stubs"
5
6
 
6
7
  check "lib"
7
8
 
8
9
  library "anthropic"
9
10
  library "aws-sdk-bedrockruntime"
10
11
  library "aws-sdk-core"
12
+ library "base64"
13
+ library "cgi"
14
+ library "json"
11
15
  library "logger"
12
16
  library "net-http"
13
17
  library "openai"
18
+ library "securerandom"
14
19
  library "uri"
20
+ library "yaml"
15
21
 
16
- configure_code_diagnostics(D::Ruby.lenient)
22
+ configure_code_diagnostics(D::Ruby.strict)
17
23
  end
data/docs/03_AGENTS.md CHANGED
@@ -84,7 +84,7 @@ end
84
84
  MyAgent.generate('Hello!', context: { name: 'Jane' })
85
85
  ```
86
86
 
87
- The lambda is re-evaluated on each `generate` or `stream` call, so instructions can change between calls based on runtime context.
87
+ The lambda is evaluated once at `Agent.new` time using the context passed to the constructor. To change instructions for a new context, construct a new agent.
88
88
 
89
89
  ### identifier
90
90
 
@@ -259,11 +259,11 @@ Configures how tool calls are executed. Defaults to sequential (inline) executio
259
259
  class MyAgent < Riffer::Agent
260
260
  model 'openai/gpt-5-mini'
261
261
  uses_tools [WeatherTool, SearchTool]
262
- tool_runtime Riffer::ToolRuntime::Threaded
262
+ tool_runtime Riffer::Tools::Runtime::Threaded
263
263
  end
264
264
  ```
265
265
 
266
- Accepts a `Riffer::ToolRuntime` subclass, a `Riffer::ToolRuntime` instance, or a `Proc`. Inherited by subclasses. When unset, falls back to `Riffer.config.tool_runtime`. See [Tools — Tool Runtime](07_TOOL_ADVANCED.md#tool-runtime-experimental) for details.
266
+ Accepts a `Riffer::Tools::Runtime` subclass, a `Riffer::Tools::Runtime` instance, or a `Proc`. When unset, defaults to `Riffer.config.tool_runtime` (captured at agent class definition time). See [Tools — Tool Runtime](07_TOOL_ADVANCED.md#tool-runtime-experimental) for details.
267
267
 
268
268
  ### guardrail
269
269
 
@@ -286,6 +286,37 @@ end
286
286
 
287
287
  See [Guardrails](12_GUARDRAILS.md) for detailed documentation.
288
288
 
289
+ ## Configuration Object
290
+
291
+ Every DSL setting above is stored on a `Riffer::Agent::Config` instance accessible via the class. Each subclass has its own:
292
+
293
+ ```ruby
294
+ class MyAgent < Riffer::Agent
295
+ model 'openai/gpt-5-mini'
296
+ max_steps 8
297
+ end
298
+
299
+ MyAgent.config # => #<Riffer::Agent::Config ...>
300
+ MyAgent.config.max_steps # => 8
301
+ ```
302
+
303
+ The DSL methods read and mutate this Config in place.
304
+
305
+ For advanced composition or testing, build a Config directly and pass it via `config:` to bypass class-level DSL entirely:
306
+
307
+ ```ruby
308
+ config = Riffer::Agent::Config.new(
309
+ model: 'openai/gpt-5-mini',
310
+ instructions: 'You are a helpful assistant.',
311
+ max_steps: 4
312
+ )
313
+
314
+ agent = Riffer::Agent.new(config: config)
315
+ agent.generate('Hello')
316
+ ```
317
+
318
+ When `config:` is supplied, the class-level configuration is ignored for that instance.
319
+
289
320
  ## Expand Your Agent
290
321
 
291
322
  | Goal | Feature | Guide |