riffer 0.37.1 → 0.38.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bf9db0e6d260a9528768fd4c13e59af50504afde1a251fdbe056f2e0220e60e4
4
- data.tar.gz: 71064f20c5214d303080a57494b3a4d3b93f23b3f446c131bbb34c015ec7a4ae
3
+ metadata.gz: 201c994ac795b1563165552d686a38b103b83f718ceae14b102213ecb17984fd
4
+ data.tar.gz: 933ede064f5446e7634a446c9cf8ad502c99728ee87f18498fdb564303f2dce1
5
5
  SHA512:
6
- metadata.gz: c4971ac39454bc52acb06ee24542ac64764db8360f8f07252c709a4145301a590c8d336b6496a10a5a1920964cb12dcc815c05519ece50bf6b07d17dba7118e9
7
- data.tar.gz: 653fe046ac9feb510284ef89808b2ac17a83b274fe2c4b979c33d7c46ba8362bd1a3280259957b217f0fc1855c1acdfbc4979764314ed1b5290e1f84370ab6ae
6
+ metadata.gz: 064e68be4a2c9916e6a33fed5952501722434396c82eed7da754cadaef509ecce764b67297f61bc1dca5e0cef1ec4447bb99013fb6cc4ac70dc74c274ecc746a
7
+ data.tar.gz: fbeda57bbc9611d9f1be65f01560faf26e93c7d723e2e9116e6fb0d7c1f7b005488fd123c14f3917c4e73345b6554e7b10e8a7b104fe6bb5b65cf547f86de859
@@ -1,3 +1,3 @@
1
1
  {
2
- ".": "0.37.1"
2
+ ".": "0.38.0"
3
3
  }
data/CHANGELOG.md CHANGED
@@ -5,6 +5,13 @@ 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.38.0](https://github.com/janeapp/riffer/compare/riffer/v0.37.1...riffer/v0.38.0) (2026-07-21)
9
+
10
+
11
+ ### Features
12
+
13
+ * record time to first chunk on streaming chat spans ([#369](https://github.com/janeapp/riffer/issues/369)) ([133b019](https://github.com/janeapp/riffer/commit/133b0197dd358ae1cd37adbeb7b5df7446b0cbde))
14
+
8
15
  ## [0.37.1](https://github.com/janeapp/riffer/compare/riffer/v0.37.0...riffer/v0.37.1) (2026-07-13)
9
16
 
10
17
 
data/docs/16_TRACING.md CHANGED
@@ -147,6 +147,7 @@ Usage on this span is the run total, aggregated across every step. See [Token us
147
147
  | `riffer.cost` | float | When the call's model was priced |
148
148
  | `gen_ai.response.finish_reasons` | string[] | When the provider reported a finish reason |
149
149
  | `riffer.finish_reason.raw` | string | When the raw value differs from the normalized one |
150
+ | `gen_ai.response.time_to_first_chunk` | float | Streaming only — seconds from request issuance to the first stream event |
150
151
  | `gen_ai.input.messages` | string | When `capture_messages` is on (JSON; see [capture](#message-content-capture)) |
151
152
  | `gen_ai.system_instructions` | string | When `capture_messages` is on and a system prompt exists |
152
153
  | `gen_ai.output.messages` | string | When `capture_messages` is on (JSON) |
@@ -263,6 +263,8 @@ class Riffer::Providers::Base
263
263
  def record_stream_outcome(span, recorder)
264
264
  Riffer::Tracing.record_usage(span, recorder.token_usage)
265
265
  record_finish_reason(span, recorder.finish_reason, recorder.raw_finish_reason)
266
+ time_to_first_chunk = recorder.time_to_first_chunk
267
+ span.set_attribute("gen_ai.response.time_to_first_chunk", time_to_first_chunk) if time_to_first_chunk
266
268
  capture_output(span, content: recorder.content, tool_calls: recorder.tool_calls, finish_reason: recorder.finish_reason)
267
269
  end
268
270
 
@@ -5,9 +5,13 @@
5
5
  # forwarding every event downstream untouched.
6
6
  class Riffer::Tracing::StreamRecorder # :nodoc: all
7
7
  # @rbs @yielder: Enumerator::Yielder
8
+ # @rbs @clock: ^() -> Float
9
+ # @rbs @started_at: Float
8
10
 
9
11
  attr_reader :token_usage #: Riffer::Providers::TokenUsage?
10
12
 
13
+ attr_reader :time_to_first_chunk #: Float?
14
+
11
15
  attr_reader :finish_reason #: Symbol?
12
16
 
13
17
  attr_reader :raw_finish_reason #: String?
@@ -17,15 +21,18 @@ class Riffer::Tracing::StreamRecorder # :nodoc: all
17
21
  attr_reader :tool_calls #: Array[Riffer::Messages::Assistant::ToolCall]
18
22
 
19
23
  #--
20
- #: (Enumerator::Yielder) -> void
21
- def initialize(yielder)
24
+ #: (Enumerator::Yielder, ?clock: ^() -> Float) -> void
25
+ def initialize(yielder, clock: -> { Process.clock_gettime(Process::CLOCK_MONOTONIC) })
22
26
  @yielder = yielder
27
+ @clock = clock
28
+ @started_at = clock.call
23
29
  @tool_calls = [] #: Array[Riffer::Messages::Assistant::ToolCall]
24
30
  end
25
31
 
26
32
  #--
27
33
  #: (Riffer::StreamEvents::Base) -> self
28
34
  def <<(event)
35
+ @time_to_first_chunk ||= @clock.call - @started_at
29
36
  record(event)
30
37
  @yielder << event
31
38
  self
@@ -2,5 +2,5 @@
2
2
  # rbs_inline: enabled
3
3
 
4
4
  module Riffer
5
- VERSION = "0.37.1" #: String
5
+ VERSION = "0.38.0" #: String
6
6
  end
@@ -5,8 +5,14 @@
5
5
  class Riffer::Tracing::StreamRecorder
6
6
  @yielder: Enumerator::Yielder
7
7
 
8
+ @clock: ^() -> Float
9
+
10
+ @started_at: Float
11
+
8
12
  attr_reader token_usage: Riffer::Providers::TokenUsage?
9
13
 
14
+ attr_reader time_to_first_chunk: Float?
15
+
10
16
  attr_reader finish_reason: Symbol?
11
17
 
12
18
  attr_reader raw_finish_reason: String?
@@ -16,8 +22,8 @@ class Riffer::Tracing::StreamRecorder
16
22
  attr_reader tool_calls: Array[Riffer::Messages::Assistant::ToolCall]
17
23
 
18
24
  # --
19
- # : (Enumerator::Yielder) -> void
20
- def initialize: (Enumerator::Yielder) -> void
25
+ # : (Enumerator::Yielder, ?clock: ^() -> Float) -> void
26
+ def initialize: (Enumerator::Yielder, ?clock: ^() -> Float) -> void
21
27
 
22
28
  # --
23
29
  # : (Riffer::StreamEvents::Base) -> self
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.37.1
4
+ version: 0.38.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jake Bottrall
@@ -35,14 +35,14 @@ dependencies:
35
35
  requirements:
36
36
  - - "~>"
37
37
  - !ruby/object:Gem::Version
38
- version: 1.55.0
38
+ version: 1.56.0
39
39
  type: :development
40
40
  prerelease: false
41
41
  version_requirements: !ruby/object:Gem::Requirement
42
42
  requirements:
43
43
  - - "~>"
44
44
  - !ruby/object:Gem::Version
45
- version: 1.55.0
45
+ version: 1.56.0
46
46
  - !ruby/object:Gem::Dependency
47
47
  name: aws-sdk-bedrockruntime
48
48
  requirement: !ruby/object:Gem::Requirement
@@ -91,14 +91,14 @@ dependencies:
91
91
  requirements:
92
92
  - - "~>"
93
93
  - !ruby/object:Gem::Version
94
- version: 0.69.0
94
+ version: 0.71.0
95
95
  type: :development
96
96
  prerelease: false
97
97
  version_requirements: !ruby/object:Gem::Requirement
98
98
  requirements:
99
99
  - - "~>"
100
100
  - !ruby/object:Gem::Version
101
- version: 0.69.0
101
+ version: 0.71.0
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: async
104
104
  requirement: !ruby/object:Gem::Requirement