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.
- checksums.yaml +4 -4
- data/.agents/architecture.md +18 -11
- data/.agents/code-style.md +1 -1
- data/.agents/rbs-inline.md +2 -2
- data/.agents/testing.md +9 -5
- data/.release-please-manifest.json +1 -1
- data/AGENTS.md +17 -10
- data/CHANGELOG.md +19 -0
- data/README.md +17 -18
- data/Steepfile +7 -1
- data/docs/03_AGENTS.md +34 -3
- data/docs/04_AGENT_LIFECYCLE.md +87 -86
- data/docs/05_AGENT_LOOP.md +2 -2
- data/docs/06_TOOLS.md +9 -4
- data/docs/07_TOOL_ADVANCED.md +17 -17
- data/docs/08_MESSAGES.md +25 -32
- data/docs/09_STREAM_EVENTS.md +1 -1
- data/docs/10_CONFIGURATION.md +7 -18
- data/docs/providers/01_PROVIDERS.md +6 -0
- data/docs/providers/06_MOCK_PROVIDER.md +2 -1
- data/docs/providers/07_CUSTOM_PROVIDERS.md +4 -4
- data/docs/providers/08_GEMINI.md +2 -2
- data/docs/providers/09_OPENROUTER.md +242 -0
- data/lib/riffer/agent/config.rb +173 -0
- data/lib/riffer/agent/context.rb +125 -0
- data/lib/riffer/agent/run.rb +308 -0
- data/lib/riffer/agent/session/repair.rb +112 -0
- data/lib/riffer/agent/session.rb +268 -0
- data/lib/riffer/{structured_output → agent/structured_output}/result.rb +1 -1
- data/lib/riffer/{structured_output.rb → agent/structured_output.rb} +4 -4
- data/lib/riffer/agent.rb +234 -923
- data/lib/riffer/config.rb +14 -7
- data/lib/riffer/evals/evaluator.rb +13 -3
- data/lib/riffer/evals/judge.rb +2 -2
- data/lib/riffer/evals/run_result.rb +2 -1
- data/lib/riffer/evals/scenario_result.rb +2 -1
- data/lib/riffer/guardrails/runner.rb +3 -2
- data/lib/riffer/helpers/call_or_value.rb +16 -0
- data/lib/riffer/helpers.rb +0 -1
- data/lib/riffer/mcp/authenticated_tool.rb +4 -0
- data/lib/riffer/mcp/client.rb +1 -1
- data/lib/riffer/mcp/registration.rb +2 -3
- data/lib/riffer/mcp/registry.rb +3 -1
- data/lib/riffer/mcp/tool_factory.rb +5 -0
- data/lib/riffer/messages/assistant.rb +9 -3
- data/lib/riffer/messages/base.rb +22 -0
- data/lib/riffer/messages/converter.rb +6 -6
- data/lib/riffer/{file_part.rb → messages/file_part.rb} +5 -5
- data/lib/riffer/messages/tool.rb +1 -1
- data/lib/riffer/messages/user.rb +4 -4
- data/lib/riffer/{boolean.rb → params/boolean.rb} +3 -3
- data/lib/riffer/{param.rb → params/param.rb} +6 -6
- data/lib/riffer/params.rb +27 -21
- data/lib/riffer/providers/amazon_bedrock.rb +19 -20
- data/lib/riffer/providers/anthropic.rb +27 -28
- data/lib/riffer/providers/base.rb +10 -9
- data/lib/riffer/providers/gemini.rb +15 -12
- data/lib/riffer/providers/mock.rb +41 -13
- data/lib/riffer/providers/open_ai.rb +24 -22
- data/lib/riffer/providers/open_router.rb +318 -0
- data/lib/riffer/providers/repository.rb +1 -0
- data/lib/riffer/{token_usage.rb → providers/token_usage.rb} +4 -4
- data/lib/riffer/providers.rb +1 -0
- data/lib/riffer/runner/fibers.rb +4 -3
- data/lib/riffer/runner/sequential.rb +1 -1
- data/lib/riffer/runner/threaded.rb +1 -1
- data/lib/riffer/runner.rb +1 -1
- data/lib/riffer/skills/activate_tool.rb +4 -3
- data/lib/riffer/skills/config.rb +1 -1
- data/lib/riffer/skills/context.rb +3 -3
- data/lib/riffer/skills/filesystem_backend.rb +7 -5
- data/lib/riffer/skills/markdown_adapter.rb +1 -1
- data/lib/riffer/skills/xml_adapter.rb +1 -1
- data/lib/riffer/stream_events/interrupt.rb +1 -1
- data/lib/riffer/stream_events/token_usage_done.rb +2 -2
- data/lib/riffer/stream_events/web_search_status.rb +1 -1
- data/lib/riffer/tool.rb +3 -3
- data/lib/riffer/{tool_runtime → tools/runtime}/fibers.rb +2 -2
- data/lib/riffer/{tool_runtime → tools/runtime}/inline.rb +1 -1
- data/lib/riffer/{tool_runtime → tools/runtime}/threaded.rb +2 -2
- data/lib/riffer/{tool_runtime.rb → tools/runtime.rb} +9 -9
- data/lib/riffer/{toolable.rb → tools/toolable.rb} +12 -9
- data/lib/riffer/version.rb +1 -1
- data/lib/riffer.rb +2 -1
- data/sig/generated/riffer/agent/config.rbs +119 -0
- data/sig/generated/riffer/agent/context.rbs +91 -0
- data/sig/generated/riffer/agent/run.rbs +144 -0
- data/sig/generated/riffer/agent/session/repair.rbs +51 -0
- data/sig/generated/riffer/agent/session.rbs +145 -0
- data/sig/generated/riffer/{structured_output → agent/structured_output}/result.rbs +2 -2
- data/sig/generated/riffer/{structured_output.rbs → agent/structured_output.rbs} +6 -6
- data/sig/generated/riffer/agent.rbs +143 -342
- data/sig/generated/riffer/config.rbs +17 -5
- data/sig/generated/riffer/evals/judge.rbs +2 -2
- data/sig/generated/riffer/helpers/call_or_value.rbs +9 -0
- data/sig/generated/riffer/helpers.rbs +0 -1
- data/sig/generated/riffer/messages/assistant.rbs +7 -3
- data/sig/generated/riffer/messages/base.rbs +18 -0
- data/sig/generated/riffer/messages/converter.rbs +4 -4
- data/sig/generated/riffer/{file_part.rbs → messages/file_part.rbs} +5 -5
- data/sig/generated/riffer/messages/user.rbs +4 -4
- data/sig/generated/riffer/params/boolean.rbs +10 -0
- data/sig/generated/riffer/{param.rbs → params/param.rbs} +3 -3
- data/sig/generated/riffer/params.rbs +15 -15
- data/sig/generated/riffer/providers/amazon_bedrock.rbs +22 -22
- data/sig/generated/riffer/providers/anthropic.rbs +4 -4
- data/sig/generated/riffer/providers/base.rbs +10 -10
- data/sig/generated/riffer/providers/gemini.rbs +4 -4
- data/sig/generated/riffer/providers/mock.rbs +25 -5
- data/sig/generated/riffer/providers/open_ai.rbs +4 -4
- data/sig/generated/riffer/providers/open_router.rbs +85 -0
- data/sig/generated/riffer/{token_usage.rbs → providers/token_usage.rbs} +5 -5
- data/sig/generated/riffer/providers.rbs +1 -0
- data/sig/generated/riffer/runner/fibers.rbs +2 -2
- data/sig/generated/riffer/runner/sequential.rbs +2 -2
- data/sig/generated/riffer/runner/threaded.rbs +2 -2
- data/sig/generated/riffer/runner.rbs +2 -2
- data/sig/generated/riffer/skills/activate_tool.rbs +4 -3
- data/sig/generated/riffer/skills/config.rbs +1 -1
- data/sig/generated/riffer/skills/context.rbs +2 -2
- data/sig/generated/riffer/stream_events/token_usage_done.rbs +3 -3
- data/sig/generated/riffer/tool.rbs +5 -5
- data/sig/generated/riffer/{tool_runtime → tools/runtime}/fibers.rbs +3 -3
- data/sig/generated/riffer/{tool_runtime → tools/runtime}/inline.rbs +2 -2
- data/sig/generated/riffer/{tool_runtime → tools/runtime}/threaded.rbs +3 -3
- data/sig/generated/riffer/{tool_runtime.rbs → tools/runtime.rbs} +12 -12
- data/sig/generated/riffer/{toolable.rbs → tools/toolable.rbs} +6 -6
- data/sig/stubs/agent_ivars.rbs +7 -0
- data/sig/stubs/async.rbs +24 -0
- data/sig/stubs/aws-sdk-core/seahorse_request_context.rbs +7 -0
- data/sig/stubs/aws-sdk-core/static_token_provider.rbs +5 -0
- data/sig/stubs/extend_self.rbs +11 -0
- data/sig/stubs/lib_ivars.rbs +101 -0
- data/sig/stubs/mcp_sdk.rbs +22 -0
- data/sig/stubs/provider_ivars.rbs +36 -0
- data/sig/stubs/provider_sdk_methods.rbs +50 -0
- data/sig/stubs/zeitwerk.rbs +12 -0
- metadata +54 -33
- data/lib/riffer/core.rb +0 -28
- data/lib/riffer/helpers/validations.rb +0 -18
- data/sig/generated/riffer/boolean.rbs +0 -10
- data/sig/generated/riffer/core.rbs +0 -19
- data/sig/generated/riffer/helpers/validations.rbs +0 -12
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: be73ae37c66f2f6ad16acdd7b52c271a782172878086821a9c95dbbe238541d3
|
|
4
|
+
data.tar.gz: 29ea65859395f2e6daaa993d9e8c60cf1908781f1acf79b642588439f4e41781
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: cce21dcb1840e39b96032cf6061dcce6030e35c21c1ce8f3937138405067cd39644f4a55fd4fddfcc9623549441dccb0d76b5443e7fa890ab84ce73f6af2736d
|
|
7
|
+
data.tar.gz: 3c0e8a0fbcd42c3aceee9b4d8837188e260d444c2e22df72f1976bdfc7b05bf2669f2494d3121ca066d142baa8629bdd01c51acd294869702b5357d83943a4a6
|
data/.agents/architecture.md
CHANGED
|
@@ -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
|
-
###
|
|
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` → `
|
|
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
|
-
|
|
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
|
data/.agents/code-style.md
CHANGED
|
@@ -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 `
|
|
7
|
+
- Run `bin/lint` to check, `bin/lint --fix` to auto-fix
|
|
8
8
|
|
|
9
9
|
## Required Header
|
|
10
10
|
|
data/.agents/rbs-inline.md
CHANGED
|
@@ -116,8 +116,8 @@ DEFAULTS = {}.freeze #: Hash[Symbol, untyped]
|
|
|
116
116
|
|
|
117
117
|
After changing type annotations:
|
|
118
118
|
|
|
119
|
-
1. Run `
|
|
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 `
|
|
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
|
-
|
|
49
|
+
bin/test
|
|
50
50
|
|
|
51
|
-
# Run a single test file
|
|
52
|
-
|
|
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
|
-
#
|
|
55
|
-
|
|
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
|
```
|
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**: `
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
|
27
|
-
|
|
|
28
|
-
| `
|
|
29
|
-
| `
|
|
30
|
-
| `
|
|
31
|
-
| `
|
|
32
|
-
| `bin/
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
Check
|
|
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
|
-
|
|
93
|
-
|
|
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: `
|
|
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.
|
|
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
|
|
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::
|
|
262
|
+
tool_runtime Riffer::Tools::Runtime::Threaded
|
|
263
263
|
end
|
|
264
264
|
```
|
|
265
265
|
|
|
266
|
-
Accepts a `Riffer::
|
|
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 |
|