Merge remote-tracking branch 'origin/main' into codex/project-resume-reuse

This commit is contained in:
Sycun committed 2026-10-16 11:11:04 +08:00
commit ac42b925da
30 files changed
+1025 -57

No files matched your search

@@ -13,6 +13,7 @@ type einoRunUsageSummary struct {
CompletionTokens int
TotalTokens int
CachedTokens int
CacheWriteTokens int
ReasoningTokens int
}
@@ -42,8 +43,13 @@ func (a *einoRunUsageAccumulator) AddUsage(usage *schema.TokenUsage) bool {
a.summary.ModelCalls++
a.summary.PromptTokens += usage.PromptTokens
a.summary.CompletionTokens += usage.CompletionTokens
a.summary.TotalTokens += usage.TotalTokens
total := usage.TotalTokens
if total == 0 {
total = usage.PromptTokens + usage.CompletionTokens
}
a.summary.TotalTokens += total
a.summary.CachedTokens += usage.PromptTokenDetails.CachedTokens
a.summary.CacheWriteTokens += usage.PromptTokenDetails.CacheWriteTokens
a.summary.ReasoningTokens += usage.CompletionTokensDetails.ReasoningTokens
return true
}
@@ -88,6 +94,7 @@ func (a *einoRunUsageAccumulator) EmitOnce(
"completionTokens": s.CompletionTokens,
"totalTokens": s.TotalTokens,
"cachedTokens": s.CachedTokens,
"cacheWriteTokens": s.CacheWriteTokens,
"reasoningTokens": s.ReasoningTokens,
}
if progress != nil {
@@ -104,6 +111,7 @@ func (a *einoRunUsageAccumulator) EmitOnce(
zap.Int("completionTokens", s.CompletionTokens),
zap.Int("totalTokens", s.TotalTokens),
zap.Int("cachedTokens", s.CachedTokens),
zap.Int("cacheWriteTokens", s.CacheWriteTokens),
zap.Int("reasoningTokens", s.ReasoningTokens),
)
}
@@ -129,6 +137,9 @@ func maxEinoTokenUsage(dst *schema.TokenUsage, src *schema.TokenUsage) *schema.T
if src.PromptTokenDetails.CachedTokens > dst.PromptTokenDetails.CachedTokens {
dst.PromptTokenDetails.CachedTokens = src.PromptTokenDetails.CachedTokens
}
if src.PromptTokenDetails.CacheWriteTokens > dst.PromptTokenDetails.CacheWriteTokens {
dst.PromptTokenDetails.CacheWriteTokens = src.PromptTokenDetails.CacheWriteTokens
}
if src.CompletionTokensDetails.ReasoningTokens > dst.CompletionTokensDetails.ReasoningTokens {
dst.CompletionTokensDetails.ReasoningTokens = src.CompletionTokensDetails.ReasoningTokens
}
@@ -149,5 +160,6 @@ func tokenUsageEmpty(u *schema.TokenUsage) bool {
u.CompletionTokens == 0 &&
u.TotalTokens == 0 &&
u.PromptTokenDetails.CachedTokens == 0 &&
u.PromptTokenDetails.CacheWriteTokens == 0 &&
u.CompletionTokensDetails.ReasoningTokens == 0)
}
@@ -79,3 +79,25 @@ func TestMaxEinoTokenUsageUsesLargestStreamChunkValues(t *testing.T) {
t.Fatalf("usage = %#v", got)
}
}
func TestEinoRunUsageCacheWriteDoesNotInflateTotal(t *testing.T) {
acc := newEinoRunUsageAccumulator()
var stream *schema.TokenUsage
for i := 0; i < 2; i++ {
stream = maxEinoTokenUsage(stream, &schema.TokenUsage{
PromptTokens: 100, CompletionTokens: 20,
PromptTokenDetails: schema.PromptTokenDetails{CachedTokens: 40, CacheWriteTokens: 30},
CompletionTokensDetails: schema.CompletionTokensDetails{ReasoningTokens: 10},
})
}
acc.AddUsage(stream)
got := acc.Summary()
if got.ModelCalls != 1 || got.TotalTokens != 120 || got.CacheWriteTokens != 30 || got.CachedTokens != 40 || got.ReasoningTokens != 10 {
t.Fatalf("summary = %#v", got)
}
var emitted map[string]interface{}
acc.EmitOnce("conv", "deep", "final", "claude-test", func(_, _ string, data interface{}) { emitted = data.(map[string]interface{}) }, nil)
if emitted["cacheWriteTokens"] != 30 || emitted["totalTokens"] != 120 {
t.Fatalf("event = %#v", emitted)
}
}