From 5f39391594d4cc872b141fa7c31a1b400b8d793e Mon Sep 17 00:00:00 2001 From: Autumn-27 <53844290+Autumn-27@users.noreply.github.com> Date: Sun, 23 Aug 2026 12:51:14 -0400 Subject: [PATCH] =?UTF-8?q?fix(test):=20capture=5Fusage=20=E9=81=B5?= =?UTF-8?q?=E5=AE=88=E8=BF=AD=E4=BB=A3=E5=99=A8=E5=8D=8F=E8=AE=AE,yield=20?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=20false=20=E5=8D=B3=E5=81=9C=E6=AD=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 消除 vet 的 "yield may be called again after returning false" 告警: 每次 yield 后判断返回值,false 则 return,不再继续调用 yield。 --- agent/capture_usage_test.go | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/agent/capture_usage_test.go b/agent/capture_usage_test.go index 426451d..c76f79c 100644 --- a/agent/capture_usage_test.go +++ b/agent/capture_usage_test.go @@ -22,9 +22,16 @@ func (p captureUsageProvider) Stream(ctx context.Context, _ llm.CompletionReques func TestCaptureRunPersistsUsageOnProviderFailure(t *testing.T) { wantErr := errors.New("provider failed after reporting usage") provider := captureUsageProvider{stream: func(_ context.Context, yield func(llm.StreamEvent, error) bool) { - yield(llm.StreamEvent{Type: llm.SEMessageStart, Usage: llm.Usage{InputTokens: 11, CacheReadTokens: 3}}, nil) - yield(llm.StreamEvent{Type: llm.SETextDelta, Text: "partial"}, nil) - yield(llm.StreamEvent{Type: llm.SEMessageDelta, Usage: llm.Usage{OutputTokens: 7, CacheWriteTokens: 2}}, nil) + // 遵守迭代器协议:yield 返回 false 后立即停止,不再调用它。 + if !yield(llm.StreamEvent{Type: llm.SEMessageStart, Usage: llm.Usage{InputTokens: 11, CacheReadTokens: 3}}, nil) { + return + } + if !yield(llm.StreamEvent{Type: llm.SETextDelta, Text: "partial"}, nil) { + return + } + if !yield(llm.StreamEvent{Type: llm.SEMessageDelta, Usage: llm.Usage{OutputTokens: 7, CacheWriteTokens: 2}}, nil) { + return + } yield(llm.StreamEvent{}, wantErr) }} @@ -41,9 +48,16 @@ func TestCaptureRunPersistsUsageOnProviderFailure(t *testing.T) { func TestCaptureRunPersistsUsageOnCancellation(t *testing.T) { started := make(chan struct{}) provider := captureUsageProvider{stream: func(ctx context.Context, yield func(llm.StreamEvent, error) bool) { - yield(llm.StreamEvent{Type: llm.SEMessageStart, Usage: llm.Usage{InputTokens: 13, CacheReadTokens: 5}}, nil) - yield(llm.StreamEvent{Type: llm.SETextDelta, Text: "partial"}, nil) - yield(llm.StreamEvent{Type: llm.SEMessageDelta, Usage: llm.Usage{OutputTokens: 9, CacheWriteTokens: 4}}, nil) + // 遵守迭代器协议:yield 返回 false 后立即停止,不再调用它。 + if !yield(llm.StreamEvent{Type: llm.SEMessageStart, Usage: llm.Usage{InputTokens: 13, CacheReadTokens: 5}}, nil) { + return + } + if !yield(llm.StreamEvent{Type: llm.SETextDelta, Text: "partial"}, nil) { + return + } + if !yield(llm.StreamEvent{Type: llm.SEMessageDelta, Usage: llm.Usage{OutputTokens: 9, CacheWriteTokens: 4}}, nil) { + return + } close(started) <-ctx.Done() yield(llm.StreamEvent{}, ctx.Err())