@@ -237,7 +237,7 @@ func (e *Extractor) mapFieldToMetrics(field string, result gjson.Result, metrics
237237 metrics .Model = result .String ()
238238 case "finish_reason" :
239239 metrics .FinishReason = result .String ()
240- case "done" :
240+ case "done" , "is_complete" :
241241 metrics .IsComplete = result .Bool ()
242242 case "prompt_duration_ns" , "prompt_eval_duration" :
243243 ms := result .Int () / 1_000_000
@@ -290,7 +290,7 @@ func (e *Extractor) runCalculations(profileName string, values map[string]interf
290290 if val , ok := result .(float64 ); ok {
291291 switch field {
292292 case "tokens_per_second" :
293- metrics .TokensPerSecond = float32 (val )
293+ metrics .TokensPerSecond = util . SafeFloat32 (val )
294294 case "ttft_ms" :
295295 metrics .TTFTMs = util .SafeInt32 (int64 (val ))
296296 case "total_ms" :
@@ -305,7 +305,8 @@ func (e *Extractor) runCalculations(profileName string, values map[string]interf
305305
306306 // Calculate tokens per second if we have the data and no calculation provided
307307 if metrics .TokensPerSecond == 0 && metrics .OutputTokens > 0 && metrics .GenerationMs > 0 {
308- metrics .TokensPerSecond = float32 (metrics .OutputTokens ) / (float32 (metrics .GenerationMs ) / 1000.0 )
308+ tps := float64 (metrics .OutputTokens ) * 1000.0 / float64 (metrics .GenerationMs )
309+ metrics .TokensPerSecond = util .SafeFloat32 (tps )
309310 }
310311
311312 // Ensure total tokens is set if we have input and output
0 commit comments