Skip to content

Commit 594470f

Browse files
committed
fix: increase default retries and allow OnRetry for idle timeouts
- Increase default MaxRetries from 2 to 5 for better resilience during long tool-call parameter streaming (e.g. Write tool with large content) - Call OnRetry callback for idle timeout errors too (providerErr may be nil in that case), so callers can clean up partial state on retry - Update idle timeout test to verify retry count with MaxRetries=2
1 parent 9e2b83f commit 594470f

4 files changed

Lines changed: 66 additions & 63 deletions

File tree

agent_stream_test.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -628,6 +628,7 @@ func TestStreamingAgentIdleTimeout(t *testing.T) {
628628
streamCall := AgentStreamCall{
629629
Prompt: "Say hello",
630630
StreamIdleTimeout: 100 * time.Millisecond,
631+
MaxRetries: ptrTo(2),
631632
}
632633

633634
start := time.Now()
@@ -636,8 +637,9 @@ func TestStreamingAgentIdleTimeout(t *testing.T) {
636637

637638
require.Error(t, err)
638639
require.ErrorIs(t, err, errStreamIdleTimeout)
640+
// 2 retries with 2s initial delay and 2x backoff (2+4 = 6s).
639641
require.Less(t, elapsed, 10*time.Second, "should not block for a long time")
640-
// Default retry is 2 retries, so 3 total attempts (1 initial + 2 retries).
642+
// 3 total attempts (1 initial + 2 retries).
641643
require.Equal(t, int32(3), attempts.Load(), "should retry on idle timeout")
642644
}
643645

@@ -768,3 +770,5 @@ func TestStreamingAgentIdleTimeoutNoYieldAfterStop(t *testing.T) {
768770
_, err := agent.Stream(ctx, streamCall)
769771
require.Error(t, err)
770772
}
773+
774+
func ptrTo[T any](v T) *T { return &v }

go.mod

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ go 1.26.1
55
require (
66
charm.land/x/vcr v0.1.1
77
cloud.google.com/go/auth v0.19.0
8-
github.com/ardanlabs/kronk v1.21.4
8+
github.com/ardanlabs/kronk v1.22.0
99
github.com/aws/aws-sdk-go-v2 v1.41.5
1010
github.com/aws/aws-sdk-go-v2/config v1.32.14
1111
github.com/aws/smithy-go v1.24.3
@@ -27,26 +27,26 @@ require (
2727
cloud.google.com/go v0.123.0 // indirect
2828
cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect
2929
cloud.google.com/go/compute/metadata v0.9.0 // indirect
30-
cloud.google.com/go/iam v1.5.3 // indirect
30+
cloud.google.com/go/iam v1.6.0 // indirect
3131
cloud.google.com/go/monitoring v1.24.3 // indirect
3232
cloud.google.com/go/storage v1.61.3 // indirect
3333
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 // indirect
3434
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect
3535
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0 // indirect
3636
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 // indirect
3737
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 // indirect
38-
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7 // indirect
38+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8 // indirect
3939
github.com/aws/aws-sdk-go-v2/credentials v1.19.14 // indirect
4040
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.21 // indirect
4141
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.21 // indirect
4242
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.21 // indirect
4343
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 // indirect
44-
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21 // indirect
44+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.22 // indirect
4545
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 // indirect
46-
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12 // indirect
46+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.13 // indirect
4747
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.21 // indirect
48-
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20 // indirect
49-
github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1 // indirect
48+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.21 // indirect
49+
github.com/aws/aws-sdk-go-v2/service/s3 v1.98.0 // indirect
5050
github.com/aws/aws-sdk-go-v2/service/signin v1.0.9 // indirect
5151
github.com/aws/aws-sdk-go-v2/service/sso v1.30.15 // indirect
5252
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.19 // indirect
@@ -62,28 +62,28 @@ require (
6262
github.com/envoyproxy/go-control-plane/envoy v1.37.0 // indirect
6363
github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect
6464
github.com/felixge/httpsnoop v1.0.4 // indirect
65-
github.com/go-jose/go-jose/v4 v4.1.3 // indirect
65+
github.com/go-jose/go-jose/v4 v4.1.4 // indirect
6666
github.com/go-json-experiment/json v0.0.0-20260214004413-d219187c3433 // indirect
6767
github.com/go-logr/logr v1.4.3 // indirect
6868
github.com/go-logr/stdr v1.2.2 // indirect
6969
github.com/goccy/go-yaml v1.19.2 // indirect
7070
github.com/google/go-cmp v0.7.0 // indirect
7171
github.com/google/s2a-go v0.1.9 // indirect
7272
github.com/googleapis/enterprise-certificate-proxy v0.3.14 // indirect
73-
github.com/googleapis/gax-go/v2 v2.18.0 // indirect
73+
github.com/googleapis/gax-go/v2 v2.21.0 // indirect
7474
github.com/gorilla/websocket v1.5.3 // indirect
7575
github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect
76-
github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.71 // indirect
76+
github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72 // indirect
7777
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
78-
github.com/hashicorp/go-getter v1.8.5 // indirect
79-
github.com/hashicorp/go-version v1.8.0 // indirect
80-
github.com/hybridgroup/yzma v1.11.0 // indirect
78+
github.com/hashicorp/go-getter v1.8.6 // indirect
79+
github.com/hashicorp/go-version v1.9.0 // indirect
80+
github.com/hybridgroup/yzma v1.11.1 // indirect
8181
github.com/json-iterator/go v1.1.12 // indirect
8282
github.com/jupiterrider/ffi v0.6.0 // indirect
8383
github.com/kaptinlin/go-i18n v0.3.0 // indirect
8484
github.com/kaptinlin/jsonpointer v0.4.17 // indirect
8585
github.com/kaptinlin/messageformat-go v0.4.19 // indirect
86-
github.com/klauspost/compress v1.18.4 // indirect
86+
github.com/klauspost/compress v1.18.5 // indirect
8787
github.com/mitchellh/go-homedir v1.1.0 // indirect
8888
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
8989
github.com/modern-go/reflect2 v1.0.2 // indirect
@@ -124,11 +124,11 @@ require (
124124
golang.org/x/sys v0.42.0 // indirect
125125
golang.org/x/text v0.35.0 // indirect
126126
golang.org/x/time v0.15.0 // indirect
127-
google.golang.org/api v0.271.0 // indirect
128-
google.golang.org/genproto v0.0.0-20260311181403-84a4fc48630c // indirect
129-
google.golang.org/genproto/googleapis/api v0.0.0-20260311181403-84a4fc48630c // indirect
130-
google.golang.org/genproto/googleapis/rpc v0.0.0-20260311181403-84a4fc48630c // indirect
131-
google.golang.org/grpc v1.79.3 // indirect
127+
google.golang.org/api v0.273.1 // indirect
128+
google.golang.org/genproto v0.0.0-20260401024825-9d38bb4040a9 // indirect
129+
google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 // indirect
130+
google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9 // indirect
131+
google.golang.org/grpc v1.80.0 // indirect
132132
google.golang.org/protobuf v1.36.11 // indirect
133133
gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20251110073552-01de4eb40290 // indirect
134134
gopkg.in/yaml.v3 v3.0.1 // indirect

0 commit comments

Comments
 (0)