riffer 0.47.1 → 0.47.2

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 (78) hide show
  1. checksums.yaml +4 -4
  2. data/.claude/rules/rbs-inline.md +5 -1
  3. data/.release-please-manifest.json +1 -1
  4. data/CHANGELOG.md +8 -0
  5. data/Rakefile +1 -1
  6. data/Steepfile +1 -15
  7. data/docs/AGENTS.md +1 -1
  8. data/docs/STREAM_EVENTS.md +23 -0
  9. data/docs/providers/CUSTOM_PROVIDERS.md +2 -0
  10. data/lib/riffer/agent/config.rb +11 -11
  11. data/lib/riffer/agent/outcome.rb +2 -2
  12. data/lib/riffer/agent/response.rb +9 -9
  13. data/lib/riffer/agent/run.rb +0 -1
  14. data/lib/riffer/agent/session.rb +1 -1
  15. data/lib/riffer/agent/structured_output/result.rb +2 -2
  16. data/lib/riffer/agent/structured_output.rb +1 -1
  17. data/lib/riffer/agent.rb +11 -11
  18. data/lib/riffer/config.rb +30 -30
  19. data/lib/riffer/evals/judge.rb +2 -3
  20. data/lib/riffer/evals/result.rb +6 -6
  21. data/lib/riffer/evals/run_result.rb +1 -1
  22. data/lib/riffer/evals/scenario_result.rb +6 -6
  23. data/lib/riffer/guardrails/modification.rb +3 -3
  24. data/lib/riffer/guardrails/result.rb +3 -3
  25. data/lib/riffer/guardrails/runner.rb +4 -4
  26. data/lib/riffer/guardrails/tripwire.rb +4 -4
  27. data/lib/riffer/mcp/manifest.rb +5 -5
  28. data/lib/riffer/mcp/registration.rb +1 -1
  29. data/lib/riffer/mcp/search_tool.rb +1 -1
  30. data/lib/riffer/messages/assistant.rb +5 -5
  31. data/lib/riffer/messages/base.rb +2 -4
  32. data/lib/riffer/messages/file_part.rb +4 -7
  33. data/lib/riffer/messages/tool.rb +4 -4
  34. data/lib/riffer/messages/user.rb +1 -1
  35. data/lib/riffer/params/param.rb +8 -8
  36. data/lib/riffer/params.rb +1 -1
  37. data/lib/riffer/providers/amazon_bedrock.rb +29 -2
  38. data/lib/riffer/providers/anthropic.rb +7 -0
  39. data/lib/riffer/providers/base.rb +1 -2
  40. data/lib/riffer/providers/finish_reason.rb +2 -2
  41. data/lib/riffer/providers/mock.rb +1 -1
  42. data/lib/riffer/providers/open_ai.rb +8 -0
  43. data/lib/riffer/providers/repository.rb +0 -4
  44. data/lib/riffer/providers/token_usage.rb +5 -5
  45. data/lib/riffer/skills/adapter.rb +1 -1
  46. data/lib/riffer/skills/context.rb +4 -7
  47. data/lib/riffer/skills/filesystem_backend.rb +1 -2
  48. data/lib/riffer/skills/frontmatter.rb +4 -4
  49. data/lib/riffer/skills/xml_adapter.rb +1 -1
  50. data/lib/riffer/stream_events/base.rb +1 -1
  51. data/lib/riffer/stream_events/finish_reason_done.rb +2 -2
  52. data/lib/riffer/stream_events/guardrail_modification.rb +1 -1
  53. data/lib/riffer/stream_events/guardrail_tripwire.rb +1 -1
  54. data/lib/riffer/stream_events/interrupt.rb +2 -2
  55. data/lib/riffer/stream_events/reasoning_delta.rb +1 -1
  56. data/lib/riffer/stream_events/reasoning_done.rb +1 -1
  57. data/lib/riffer/stream_events/skill_activation.rb +1 -1
  58. data/lib/riffer/stream_events/text_delta.rb +1 -1
  59. data/lib/riffer/stream_events/text_done.rb +1 -1
  60. data/lib/riffer/stream_events/token_usage_done.rb +1 -1
  61. data/lib/riffer/stream_events/tool_call_delta.rb +3 -3
  62. data/lib/riffer/stream_events/tool_call_done.rb +4 -4
  63. data/lib/riffer/stream_events/web_search_done.rb +2 -2
  64. data/lib/riffer/stream_events/web_search_status.rb +3 -3
  65. data/lib/riffer/tools/response.rb +4 -4
  66. data/lib/riffer/tracing/stream_recorder.rb +6 -6
  67. data/lib/riffer/version.rb +1 -1
  68. data/lib/riffer.rb +7 -0
  69. data/rbs_collection.lock.yaml +320 -0
  70. data/rbs_collection.yaml +12 -0
  71. data/sig/_private/anthropic.rbs +5 -4
  72. data/sig/_private/aws-sdk-core/event_error.rbs +15 -0
  73. data/sig/generated/riffer/providers/amazon_bedrock.rbs +10 -1
  74. data/sig/generated/riffer/providers/repository.rbs +0 -2
  75. data/sig/generated/riffer.rbs +8 -0
  76. metadata +4 -3
  77. data/sig/_private/async.rbs +0 -28
  78. data/sig/_private/minitest.rbs +0 -9
@@ -4,7 +4,7 @@
4
4
  # Represents completed text generation during streaming.
5
5
  class Riffer::StreamEvents::TextDone < Riffer::StreamEvents::Base
6
6
  # The complete text content.
7
- attr_reader :content #: String
7
+ attr_reader :content #: String # @dynamic content
8
8
 
9
9
  #--
10
10
  #: (String, ?role: Symbol) -> void
@@ -4,7 +4,7 @@
4
4
  # Final token usage for the response, emitted when the LLM finishes.
5
5
  class Riffer::StreamEvents::TokenUsageDone < Riffer::StreamEvents::Base
6
6
  # The token usage data for this response.
7
- attr_reader :token_usage #: Riffer::Providers::TokenUsage
7
+ attr_reader :token_usage #: Riffer::Providers::TokenUsage # @dynamic token_usage
8
8
 
9
9
  #--
10
10
  #: (token_usage: Riffer::Providers::TokenUsage, ?role: Symbol) -> void
@@ -5,13 +5,13 @@
5
5
  # streaming.
6
6
  class Riffer::StreamEvents::ToolCallDelta < Riffer::StreamEvents::Base
7
7
  # The tool call item identifier.
8
- attr_reader :item_id #: String
8
+ attr_reader :item_id #: String # @dynamic item_id
9
9
 
10
10
  # The tool name (may only be present in first delta).
11
- attr_reader :name #: String?
11
+ attr_reader :name #: String? # @dynamic name
12
12
 
13
13
  # The incremental arguments JSON fragment.
14
- attr_reader :arguments_delta #: String
14
+ attr_reader :arguments_delta #: String # @dynamic arguments_delta
15
15
 
16
16
  #--
17
17
  #: (item_id: String, arguments_delta: String, ?name: String?, ?role: Symbol) -> void
@@ -4,16 +4,16 @@
4
4
  # Represents a completed tool call during streaming.
5
5
  class Riffer::StreamEvents::ToolCallDone < Riffer::StreamEvents::Base
6
6
  # The tool call item identifier.
7
- attr_reader :item_id #: String
7
+ attr_reader :item_id #: String # @dynamic item_id
8
8
 
9
9
  # The call identifier for response matching.
10
- attr_reader :call_id #: String
10
+ attr_reader :call_id #: String # @dynamic call_id
11
11
 
12
12
  # The tool name.
13
- attr_reader :name #: String
13
+ attr_reader :name #: String # @dynamic name
14
14
 
15
15
  # The complete arguments JSON string.
16
- attr_reader :arguments #: String
16
+ attr_reader :arguments #: String # @dynamic arguments
17
17
 
18
18
  #--
19
19
  #: (item_id: String, call_id: String, name: String, arguments: String, ?role: Symbol) -> void
@@ -4,10 +4,10 @@
4
4
  # The result of a completed server-side web search during streaming.
5
5
  class Riffer::StreamEvents::WebSearchDone < Riffer::StreamEvents::Base
6
6
  # The search query used.
7
- attr_reader :query #: String
7
+ attr_reader :query #: String # @dynamic query
8
8
 
9
9
  # The search result sources with title and url.
10
- attr_reader :sources #: Array[Hash[Symbol, String?]]
10
+ attr_reader :sources #: Array[Hash[Symbol, String?]] # @dynamic sources
11
11
 
12
12
  #--
13
13
  #: (String, ?sources: Array[Hash[Symbol, String?]], ?role: Symbol) -> void
@@ -5,13 +5,13 @@
5
5
  # progresses.
6
6
  class Riffer::StreamEvents::WebSearchStatus < Riffer::StreamEvents::Base
7
7
  # The web search status ("in_progress", "searching", "completed", "open_page").
8
- attr_reader :status #: String
8
+ attr_reader :status #: String # @dynamic status
9
9
 
10
10
  # The URL being fetched (present for "open_page" status).
11
- attr_reader :url #: String?
11
+ attr_reader :url #: String? # @dynamic url
12
12
 
13
13
  # The search query (present when available during status changes).
14
- attr_reader :query #: String?
14
+ attr_reader :query #: String? # @dynamic query
15
15
 
16
16
  #--
17
17
  #: (String, ?url: String?, ?query: String?, ?role: Symbol) -> void
@@ -20,17 +20,17 @@ class Riffer::Tools::Response
20
20
  VALID_FORMATS = %i[text json].freeze #: Array[Symbol]
21
21
 
22
22
  # The response content.
23
- attr_reader :content #: String
23
+ attr_reader :content #: String # @dynamic content
24
24
 
25
25
  # The error message, or +nil+ on success.
26
- attr_reader :error_message #: String?
26
+ attr_reader :error_message #: String? # @dynamic error_message
27
27
 
28
28
  # The error type, or +nil+ on success.
29
- attr_reader :error_type #: Symbol?
29
+ attr_reader :error_type #: Symbol? # @dynamic error_type
30
30
 
31
31
  # The exception an unhandled failure was folded from, or +nil+. Kept out of
32
32
  # every serialized form so it never reaches an LLM or a message payload.
33
- attr_reader :exception #: Exception?
33
+ attr_reader :exception #: Exception? # @dynamic exception
34
34
 
35
35
  # Creates a success response.
36
36
  #
@@ -8,17 +8,17 @@ class Riffer::Tracing::StreamRecorder # :nodoc: all
8
8
  # @rbs @clock: ^() -> Float
9
9
  # @rbs @started_at: Float
10
10
 
11
- attr_reader :token_usage #: Riffer::Providers::TokenUsage?
11
+ attr_reader :token_usage #: Riffer::Providers::TokenUsage? # @dynamic token_usage
12
12
 
13
- attr_reader :time_to_first_chunk #: Float?
13
+ attr_reader :time_to_first_chunk #: Float? # @dynamic time_to_first_chunk
14
14
 
15
- attr_reader :finish_reason #: Symbol?
15
+ attr_reader :finish_reason #: Symbol? # @dynamic finish_reason
16
16
 
17
- attr_reader :raw_finish_reason #: String?
17
+ attr_reader :raw_finish_reason #: String? # @dynamic raw_finish_reason
18
18
 
19
- attr_reader :content #: String?
19
+ attr_reader :content #: String? # @dynamic content
20
20
 
21
- attr_reader :tool_calls #: Array[Riffer::Messages::Assistant::ToolCall]
21
+ attr_reader :tool_calls #: Array[Riffer::Messages::Assistant::ToolCall] # @dynamic tool_calls
22
22
 
23
23
  #--
24
24
  #: (Enumerator::Yielder, ?clock: ^() -> Float) -> void
@@ -2,5 +2,5 @@
2
2
  # rbs_inline: enabled
3
3
 
4
4
  module Riffer
5
- VERSION = "0.47.1" #: String
5
+ VERSION = "0.47.2" #: String
6
6
  end
data/lib/riffer.rb CHANGED
@@ -41,6 +41,13 @@ module Riffer
41
41
  # Raised when a tool encounters an expected execution error.
42
42
  class ToolExecutionError < Error; end
43
43
 
44
+ # Raised when a provider's stream ends before its terminal event (Bedrock's
45
+ # messageStop, Anthropic's message_stop, OpenAI's response.completed /
46
+ # incomplete / failed), so a truncated or empty response is never returned
47
+ # as a complete message. Events already yielded were delivered; the
48
+ # request is safe to retry.
49
+ class IncompleteStreamError < Error; end
50
+
44
51
  # Base error for a file attachment that can't be resolved for the provider.
45
52
  class FileError < Error; end
46
53
 
@@ -0,0 +1,320 @@
1
+ ---
2
+ path: ".gem_rbs_collection"
3
+ gems:
4
+ - name: addressable
5
+ version: '2.8'
6
+ source:
7
+ type: git
8
+ name: ruby/gem_rbs_collection
9
+ revision: 3913b7dffb65bdffdfe5cb9095108f932e85433b
10
+ remote: https://github.com/ruby/gem_rbs_collection.git
11
+ repo_dir: gems
12
+ - name: anthropic
13
+ version: 1.71.0
14
+ source:
15
+ type: rubygems
16
+ - name: ast
17
+ version: '2.4'
18
+ source:
19
+ type: git
20
+ name: ruby/gem_rbs_collection
21
+ revision: 3913b7dffb65bdffdfe5cb9095108f932e85433b
22
+ remote: https://github.com/ruby/gem_rbs_collection.git
23
+ repo_dir: gems
24
+ - name: async
25
+ version: '2.12'
26
+ source:
27
+ type: git
28
+ name: ruby/gem_rbs_collection
29
+ revision: 3913b7dffb65bdffdfe5cb9095108f932e85433b
30
+ remote: https://github.com/ruby/gem_rbs_collection.git
31
+ repo_dir: gems
32
+ - name: aws-sdk-bedrockruntime
33
+ version: 1.85.0
34
+ source:
35
+ type: rubygems
36
+ - name: aws-sdk-core
37
+ version: 3.257.0
38
+ source:
39
+ type: rubygems
40
+ - name: base64
41
+ version: 0.3.0
42
+ source:
43
+ type: rubygems
44
+ - name: bigdecimal
45
+ version: 4.1.3
46
+ source:
47
+ type: rubygems
48
+ - name: cgi
49
+ version: '0.5'
50
+ source:
51
+ type: git
52
+ name: ruby/gem_rbs_collection
53
+ revision: 3913b7dffb65bdffdfe5cb9095108f932e85433b
54
+ remote: https://github.com/ruby/gem_rbs_collection.git
55
+ repo_dir: gems
56
+ - name: concurrent-ruby
57
+ version: '1.1'
58
+ source:
59
+ type: git
60
+ name: ruby/gem_rbs_collection
61
+ revision: 3913b7dffb65bdffdfe5cb9095108f932e85433b
62
+ remote: https://github.com/ruby/gem_rbs_collection.git
63
+ repo_dir: gems
64
+ - name: connection_pool
65
+ version: '2.4'
66
+ source:
67
+ type: git
68
+ name: ruby/gem_rbs_collection
69
+ revision: 3913b7dffb65bdffdfe5cb9095108f932e85433b
70
+ remote: https://github.com/ruby/gem_rbs_collection.git
71
+ repo_dir: gems
72
+ - name: csv
73
+ version: '3.3'
74
+ source:
75
+ type: git
76
+ name: ruby/gem_rbs_collection
77
+ revision: 3913b7dffb65bdffdfe5cb9095108f932e85433b
78
+ remote: https://github.com/ruby/gem_rbs_collection.git
79
+ repo_dir: gems
80
+ - name: dbm
81
+ version: '0'
82
+ source:
83
+ type: stdlib
84
+ - name: delegate
85
+ version: '0'
86
+ source:
87
+ type: stdlib
88
+ - name: digest
89
+ version: '0'
90
+ source:
91
+ type: stdlib
92
+ - name: erb
93
+ version: '0'
94
+ source:
95
+ type: stdlib
96
+ - name: faraday
97
+ version: '2.7'
98
+ source:
99
+ type: git
100
+ name: ruby/gem_rbs_collection
101
+ revision: 3913b7dffb65bdffdfe5cb9095108f932e85433b
102
+ remote: https://github.com/ruby/gem_rbs_collection.git
103
+ repo_dir: gems
104
+ - name: ffi
105
+ version: 1.17.4
106
+ source:
107
+ type: rubygems
108
+ - name: fileutils
109
+ version: '0'
110
+ source:
111
+ type: stdlib
112
+ - name: forwardable
113
+ version: '0'
114
+ source:
115
+ type: stdlib
116
+ - name: hashdiff
117
+ version: '1.1'
118
+ source:
119
+ type: git
120
+ name: ruby/gem_rbs_collection
121
+ revision: 3913b7dffb65bdffdfe5cb9095108f932e85433b
122
+ remote: https://github.com/ruby/gem_rbs_collection.git
123
+ repo_dir: gems
124
+ - name: io-console
125
+ version: '0'
126
+ source:
127
+ type: stdlib
128
+ - name: json
129
+ version: '0'
130
+ source:
131
+ type: stdlib
132
+ - name: language_server-protocol
133
+ version: 3.17.0.6
134
+ source:
135
+ type: rubygems
136
+ - name: listen
137
+ version: '3.9'
138
+ source:
139
+ type: git
140
+ name: ruby/gem_rbs_collection
141
+ revision: 3913b7dffb65bdffdfe5cb9095108f932e85433b
142
+ remote: https://github.com/ruby/gem_rbs_collection.git
143
+ repo_dir: gems
144
+ - name: logger
145
+ version: '1.7'
146
+ source:
147
+ type: git
148
+ name: ruby/gem_rbs_collection
149
+ revision: 3913b7dffb65bdffdfe5cb9095108f932e85433b
150
+ remote: https://github.com/ruby/gem_rbs_collection.git
151
+ repo_dir: gems
152
+ - name: minitest
153
+ version: '5.25'
154
+ source:
155
+ type: git
156
+ name: ruby/gem_rbs_collection
157
+ revision: 3913b7dffb65bdffdfe5cb9095108f932e85433b
158
+ remote: https://github.com/ruby/gem_rbs_collection.git
159
+ repo_dir: gems
160
+ - name: monitor
161
+ version: '0'
162
+ source:
163
+ type: stdlib
164
+ - name: net-http
165
+ version: '0'
166
+ source:
167
+ type: stdlib
168
+ - name: net-protocol
169
+ version: '0'
170
+ source:
171
+ type: stdlib
172
+ - name: openai
173
+ version: 0.91.0
174
+ source:
175
+ type: rubygems
176
+ - name: openssl
177
+ version: '0'
178
+ source:
179
+ type: stdlib
180
+ - name: optparse
181
+ version: '0'
182
+ source:
183
+ type: stdlib
184
+ - name: parser
185
+ version: '3.2'
186
+ source:
187
+ type: git
188
+ name: ruby/gem_rbs_collection
189
+ revision: 3913b7dffb65bdffdfe5cb9095108f932e85433b
190
+ remote: https://github.com/ruby/gem_rbs_collection.git
191
+ repo_dir: gems
192
+ - name: pp
193
+ version: '0'
194
+ source:
195
+ type: stdlib
196
+ - name: prettyprint
197
+ version: '0'
198
+ source:
199
+ type: stdlib
200
+ - name: prism
201
+ version: 1.9.0
202
+ source:
203
+ type: rubygems
204
+ - name: pstore
205
+ version: '0.2'
206
+ source:
207
+ type: git
208
+ name: ruby/gem_rbs_collection
209
+ revision: 3913b7dffb65bdffdfe5cb9095108f932e85433b
210
+ remote: https://github.com/ruby/gem_rbs_collection.git
211
+ repo_dir: gems
212
+ - name: psych
213
+ version: '0'
214
+ source:
215
+ type: stdlib
216
+ - name: rainbow
217
+ version: '3.0'
218
+ source:
219
+ type: git
220
+ name: ruby/gem_rbs_collection
221
+ revision: 3913b7dffb65bdffdfe5cb9095108f932e85433b
222
+ remote: https://github.com/ruby/gem_rbs_collection.git
223
+ repo_dir: gems
224
+ - name: rake
225
+ version: '13.0'
226
+ source:
227
+ type: git
228
+ name: ruby/gem_rbs_collection
229
+ revision: 3913b7dffb65bdffdfe5cb9095108f932e85433b
230
+ remote: https://github.com/ruby/gem_rbs_collection.git
231
+ repo_dir: gems
232
+ - name: random-formatter
233
+ version: '0'
234
+ source:
235
+ type: stdlib
236
+ - name: rbs
237
+ version: 4.2.0
238
+ source:
239
+ type: rubygems
240
+ - name: rbs-inline
241
+ version: 0.14.0
242
+ source:
243
+ type: rubygems
244
+ - name: rdoc
245
+ version: '0'
246
+ source:
247
+ type: stdlib
248
+ - name: regexp_parser
249
+ version: '2.8'
250
+ source:
251
+ type: git
252
+ name: ruby/gem_rbs_collection
253
+ revision: 3913b7dffb65bdffdfe5cb9095108f932e85433b
254
+ remote: https://github.com/ruby/gem_rbs_collection.git
255
+ repo_dir: gems
256
+ - name: securerandom
257
+ version: '0'
258
+ source:
259
+ type: stdlib
260
+ - name: singleton
261
+ version: '0'
262
+ source:
263
+ type: stdlib
264
+ - name: socket
265
+ version: '0'
266
+ source:
267
+ type: stdlib
268
+ - name: stringio
269
+ version: '0'
270
+ source:
271
+ type: stdlib
272
+ - name: strscan
273
+ version: '0'
274
+ source:
275
+ type: stdlib
276
+ - name: tempfile
277
+ version: '0'
278
+ source:
279
+ type: stdlib
280
+ - name: thor
281
+ version: '1.2'
282
+ source:
283
+ type: git
284
+ name: ruby/gem_rbs_collection
285
+ revision: 3913b7dffb65bdffdfe5cb9095108f932e85433b
286
+ remote: https://github.com/ruby/gem_rbs_collection.git
287
+ repo_dir: gems
288
+ - name: timeout
289
+ version: '0'
290
+ source:
291
+ type: stdlib
292
+ - name: tmpdir
293
+ version: '0'
294
+ source:
295
+ type: stdlib
296
+ - name: tsort
297
+ version: '0'
298
+ source:
299
+ type: stdlib
300
+ - name: uri
301
+ version: '0'
302
+ source:
303
+ type: stdlib
304
+ - name: webmock
305
+ version: '3.19'
306
+ source:
307
+ type: git
308
+ name: ruby/gem_rbs_collection
309
+ revision: 3913b7dffb65bdffdfe5cb9095108f932e85433b
310
+ remote: https://github.com/ruby/gem_rbs_collection.git
311
+ repo_dir: gems
312
+ - name: webrick
313
+ version: 1.9.2
314
+ source:
315
+ type: rubygems
316
+ - name: yaml
317
+ version: '0'
318
+ source:
319
+ type: stdlib
320
+ gemfile_lock_path: Gemfile.lock
@@ -0,0 +1,12 @@
1
+ sources:
2
+ - type: git
3
+ name: ruby/gem_rbs_collection
4
+ remote: https://github.com/ruby/gem_rbs_collection.git
5
+ revision: 3913b7dffb65bdffdfe5cb9095108f932e85433b
6
+ repo_dir: gems
7
+
8
+ path: .gem_rbs_collection
9
+
10
+ gems:
11
+ - name: yaml
12
+ - name: cgi
@@ -1,7 +1,7 @@
1
- # Arity patch for the `anthropic` gem (see openai.rbs for the rationale).
2
- # `Messages#create` is positional at runtime but typed keyword-only in the gem's
3
- # RBS; `Messages#stream` is omitted from the gem's RBS but present at runtime
4
- # (returns a MessageStream helper). Loaded only for riffer's own Steep run.
1
+ # Arity patch for the `anthropic` gem (see openai.rbs for the rationale). Both
2
+ # `Messages#create` and `Messages#stream` are positional `def x(params)` at
3
+ # runtime but typed keyword-only in the gem's RBS. Streaming returns `untyped`
4
+ # (a MessageStream helper). Loaded only for riffer's own Steep run.
5
5
  module Anthropic
6
6
  module Resources
7
7
  class Messages
@@ -11,6 +11,7 @@ module Anthropic
11
11
 
12
12
  def stream: (Hash[Symbol, untyped] params) -> untyped
13
13
  | (**untyped) -> untyped
14
+ | ...
14
15
  end
15
16
  end
16
17
  end
@@ -0,0 +1,15 @@
1
+ # aws-sdk-core ships no signature for EventError; ConverseStream delivers
2
+ # `:message-type: error` frames to the on_event block as instances of it.
3
+ module Aws
4
+ module Errors
5
+ class EventError < RuntimeError
6
+ def initialize: (Symbol event_type, String code, String message) -> void
7
+
8
+ attr_reader event_type: Symbol
9
+
10
+ attr_reader error_code: String
11
+
12
+ attr_reader error_message: String
13
+ end
14
+ end
15
+ end
@@ -91,10 +91,19 @@ class Riffer::Providers::AmazonBedrock < Riffer::Providers::Base
91
91
  # : (Hash[Symbol, untyped], Riffer::Providers::_EventSink) -> void
92
92
  def execute_stream: (Hash[Symbol, untyped], Riffer::Providers::_EventSink) -> void
93
93
 
94
+ # Re-raises an +Aws::Errors::EventError+ event with a message built from its
95
+ # error code and message. The SDK's own +#message+ is just the class name,
96
+ # so without this the failure would be unreadable.
97
+ # --
98
+ # : (untyped) -> void
99
+ def raise_stream_event_error!: (untyped) -> void
100
+
94
101
  # Re-raises a Bedrock stream-exception event as the matching
95
102
  # +Aws::BedrockRuntime::Errors+ class. ConverseStream delivers API errors on
96
103
  # the same channel as content, so without this a mid-stream failure would
97
- # silently end the stream with no content.
104
+ # silently end the stream with no content. Non-exception events that we do
105
+ # not consume (including the SDK's +:unknown_event+ struct) are ignored for
106
+ # forward compatibility.
98
107
  # --
99
108
  # : (untyped) -> void
100
109
  def raise_if_stream_exception!: (untyped) -> void
@@ -15,8 +15,6 @@ module Riffer::Providers::Repository
15
15
  #
16
16
  # Riffer::Providers::Repository.register(:jane) { MyApp::JaneProvider }
17
17
  #
18
- # Raises Riffer::ArgumentError when called without a block.
19
- #
20
18
  # --
21
19
  # : ((String | Symbol)) { () -> singleton(Riffer::Providers::Base) } -> void
22
20
  def register: (String | Symbol) { () -> singleton(Riffer::Providers::Base) } -> void
@@ -25,6 +25,14 @@ module Riffer
25
25
  class ToolExecutionError < Error
26
26
  end
27
27
 
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.
33
+ class IncompleteStreamError < Error
34
+ end
35
+
28
36
  # Base error for a file attachment that can't be resolved for the provider.
29
37
  class FileError < Error
30
38
  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.47.1
4
+ version: 0.47.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jake Bottrall
@@ -220,12 +220,13 @@ files:
220
220
  - lib/riffer/tracing/otel.rb
221
221
  - lib/riffer/tracing/stream_recorder.rb
222
222
  - lib/riffer/version.rb
223
+ - rbs_collection.lock.yaml
224
+ - rbs_collection.yaml
223
225
  - sig/_private/anthropic.rbs
224
- - sig/_private/async.rbs
226
+ - sig/_private/aws-sdk-core/event_error.rbs
225
227
  - sig/_private/aws-sdk-core/seahorse_request_context.rbs
226
228
  - sig/_private/aws-sdk-core/static_token_provider.rbs
227
229
  - sig/_private/mcp.rbs
228
- - sig/_private/minitest.rbs
229
230
  - sig/_private/openai.rbs
230
231
  - sig/_private/opentelemetry.rbs
231
232
  - sig/_private/riffer/providers/amazon_bedrock.rbs
@@ -1,28 +0,0 @@
1
- # Minimal signatures for the optional `async` gem, which ships no RBS.
2
- #
3
- # Only the surface used by Riffer::Runner::Fibers is declared; the gem is
4
- # loaded lazily via depends_on, so this stub keeps Steep aware of the
5
- # constants without adding a hard `library` dependency.
6
- module Async
7
- class Barrier
8
- def initialize: () -> void
9
-
10
- def async: () { () -> void } -> untyped
11
-
12
- def wait: () -> void
13
-
14
- def stop: () -> void
15
- end
16
-
17
- class Semaphore
18
- def initialize: (Integer, ?parent: untyped) -> void
19
-
20
- def async: () { () -> void } -> untyped
21
- end
22
- end
23
-
24
- module Kernel
25
- def Async: () { () -> void } -> untyped
26
-
27
- def Sync: () { () -> void } -> untyped
28
- end
@@ -1,9 +0,0 @@
1
- # Minimal signatures for `minitest`, a development-only framework riffer never
2
- # depends on. Only the surface `lib/riffer/testing/minitest.rb` touches is
3
- # declared; the file is required by hand from a consumer's test_helper, so this
4
- # stub keeps Steep aware of the constants without a `library` dependency.
5
- module Minitest
6
- class Test
7
- def after_teardown: () -> void
8
- end
9
- end