Skip to content

Commit 234b171

Browse files
authored
feat: Add timeToFirstToken to Tracker (#241)
1 parent 46c9694 commit 234b171

File tree

2 files changed

+24
-7
lines changed

2 files changed

+24
-7
lines changed

ldai/tracker.go

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ const (
1717
generationSuccess = "$ld:ai:generation:success"
1818
generationError = "$ld:ai:generation:error"
1919
//nolint:gosec
20+
timeToFirstToken = "$ld:ai:tokens:ttf"
21+
//nolint:gosec
2022
tokenTotal = "$ld:ai:tokens:total"
2123
//nolint:gosec
2224
tokenInput = "$ld:ai:tokens:input"
@@ -43,11 +45,8 @@ func (t TokenUsage) Set() bool {
4345
type Metrics struct {
4446
// Latency is the latency of the request.
4547
Latency time.Duration
46-
}
47-
48-
// Set returns true if the latency is non-zero.
49-
func (m Metrics) Set() bool {
50-
return m.Latency != 0
48+
// TimeToFirstToken is the time to the first token of the streamed response.
49+
TimeToFirstToken time.Duration
5150
}
5251

5352
// ProviderResponse represents the response from a model provider for a specific request.
@@ -203,6 +202,11 @@ func (t *Tracker) TrackError() error {
203202
return err
204203
}
205204

205+
// TrackTimeToFirstToken tracks the time to the first token of the streamed response.
206+
func (t *Tracker) TrackTimeToFirstToken(dur time.Duration) error {
207+
return t.events.TrackMetric(timeToFirstToken, t.context, float64(dur.Milliseconds()), t.trackData)
208+
}
209+
206210
// TrackUsage tracks the token usage for a model evaluation.
207211
func (t *Tracker) TrackUsage(usage TokenUsage) error {
208212
var failed bool
@@ -270,7 +274,7 @@ func (t *Tracker) TrackRequest(task func(c *Config) (ProviderResponse, error)) (
270274
t.logWarning("error tracking success metric for request: %v", err)
271275
}
272276

273-
if usage.Metrics.Set() {
277+
if usage.Metrics.Latency != 0 {
274278
if err := t.TrackDuration(usage.Metrics.Latency); err != nil {
275279
t.logWarning("error tracking duration metric (user provided) for request: %v", err)
276280
}
@@ -280,6 +284,12 @@ func (t *Tracker) TrackRequest(task func(c *Config) (ProviderResponse, error)) (
280284
}
281285
}
282286

287+
if usage.Metrics.TimeToFirstToken != 0 {
288+
if err := t.TrackTimeToFirstToken(usage.Metrics.TimeToFirstToken); err != nil {
289+
t.logWarning("error tracking time to first token metric for request: %v", err)
290+
}
291+
}
292+
283293
if usage.Usage.Set() {
284294
// TrackUsage logs errors.
285295
_ = t.TrackUsage(usage.Usage)

ldai/tracker_test.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,8 @@ func TestTracker_TrackRequest(t *testing.T) {
108108
Total: 1,
109109
},
110110
Metrics: Metrics{
111-
Latency: 10 * time.Millisecond,
111+
Latency: 10 * time.Millisecond,
112+
TimeToFirstToken: 42 * time.Millisecond,
112113
},
113114
}
114115

@@ -144,6 +145,12 @@ func TestTracker_TrackRequest(t *testing.T) {
144145
metricValue: 1,
145146
data: makeTrackData("key", "variationKey"),
146147
},
148+
{
149+
name: "$ld:ai:tokens:ttf",
150+
context: ldcontext.New("key"),
151+
metricValue: 42.0,
152+
data: makeTrackData("key", "variationKey"),
153+
},
147154
}
148155

149156
assert.ElementsMatch(t, expectedEvents, events.events)

0 commit comments

Comments
 (0)