fix(devin): calculate total_input_tokens and total_tokens correctly

This commit is contained in:
sususu
2026-09-12 21:20:14 +08:00
committed by sususu98
parent 0aedd05d31
commit 85ddf3aeb5
2 changed files with 19 additions and 6 deletions

View File

@@ -704,9 +704,14 @@ func (e *DevinExecutor) streamDevinFrames(
completedEvent, _ = sjson.SetBytes(completedEvent, "interaction.id", interactionID)
completedEvent, _ = sjson.SetBytes(completedEvent, "interaction.model", req.Model)
if finalUsage != nil {
completedEvent, _ = sjson.SetBytes(completedEvent, "interaction.usage.total_input_tokens", finalUsage.PromptTokens)
completedEvent, _ = sjson.SetBytes(completedEvent, "interaction.usage.total_output_tokens", finalUsage.CompletionTokens)
totalInput := finalUsage.PromptTokens + finalUsage.CachedTokens
totalOutput := finalUsage.CompletionTokens
totalTokens := totalInput + totalOutput
completedEvent, _ = sjson.SetBytes(completedEvent, "interaction.usage.total_input_tokens", totalInput)
completedEvent, _ = sjson.SetBytes(completedEvent, "interaction.usage.total_output_tokens", totalOutput)
completedEvent, _ = sjson.SetBytes(completedEvent, "interaction.usage.total_cached_tokens", finalUsage.CachedTokens)
completedEvent, _ = sjson.SetBytes(completedEvent, "interaction.usage.total_tokens", totalTokens)
if detail, ok := helps.ParseInteractionsStreamUsage(completedEvent); ok {
reporter.Publish(ctx, detail)
}
@@ -895,9 +900,14 @@ func consumeDevinFramesToInteractions(body io.Reader, model, chatModelUID string
}
if finalUsage != nil {
out, _ = sjson.SetBytes(out, "usage.total_input_tokens", finalUsage.PromptTokens)
out, _ = sjson.SetBytes(out, "usage.total_output_tokens", finalUsage.CompletionTokens)
totalInput := finalUsage.PromptTokens + finalUsage.CachedTokens
totalOutput := finalUsage.CompletionTokens
totalTokens := totalInput + totalOutput
out, _ = sjson.SetBytes(out, "usage.total_input_tokens", totalInput)
out, _ = sjson.SetBytes(out, "usage.total_output_tokens", totalOutput)
out, _ = sjson.SetBytes(out, "usage.total_cached_tokens", finalUsage.CachedTokens)
out, _ = sjson.SetBytes(out, "usage.total_tokens", totalTokens)
}
respLog := &helps.DevinUpstreamResponseLog{

View File

@@ -351,8 +351,8 @@ func TestConsumeDevinFramesToInteractions(t *testing.T) {
if root.Get("status").String() != "completed" {
t.Errorf("status = %q, want completed", root.Get("status").String())
}
if root.Get("usage.total_input_tokens").Int() != 100 {
t.Errorf("input tokens = %d, want 100", root.Get("usage.total_input_tokens").Int())
if root.Get("usage.total_input_tokens").Int() != 120 {
t.Errorf("input tokens = %d, want 120", root.Get("usage.total_input_tokens").Int())
}
if root.Get("usage.total_output_tokens").Int() != 50 {
t.Errorf("output tokens = %d, want 50", root.Get("usage.total_output_tokens").Int())
@@ -360,6 +360,9 @@ func TestConsumeDevinFramesToInteractions(t *testing.T) {
if root.Get("usage.total_cached_tokens").Int() != 20 {
t.Errorf("cached tokens = %d, want 20", root.Get("usage.total_cached_tokens").Int())
}
if root.Get("usage.total_tokens").Int() != 170 {
t.Errorf("total tokens = %d, want 170", root.Get("usage.total_tokens").Int())
}
steps := root.Get("steps").Array()
if len(steps) != 3 {