Skip to content

Commit 709b7dd

Browse files
committed
pkg/aflow: retry LLM requests on transient errors
Update google#6573
1 parent 722ac32 commit 709b7dd

File tree

1 file changed

+18
-1
lines changed

1 file changed

+18
-1
lines changed

pkg/aflow/llm_agent.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import (
77
"fmt"
88
"maps"
99
"reflect"
10+
"strings"
11+
"time"
1012

1113
"github.com/google/syzkaller/pkg/aflow/trajectory"
1214
"google.golang.org/genai"
@@ -98,7 +100,7 @@ func (a *LLMAgent) chat(ctx *Context, cfg *genai.GenerateContentConfig, tools ma
98100
if err := ctx.startSpan(reqSpan); err != nil {
99101
return "", nil, err
100102
}
101-
resp, err := ctx.generateContent(cfg, req)
103+
resp, err := a.generateContent(ctx, cfg, req)
102104
if err != nil {
103105
return "", nil, ctx.finishSpan(reqSpan, err)
104106
}
@@ -216,6 +218,21 @@ func (a *LLMAgent) parseResponse(resp *genai.GenerateContentResponse) (
216218
return
217219
}
218220

221+
func (a *LLMAgent) generateContent(ctx *Context, cfg *genai.GenerateContentConfig,
222+
req []*genai.Content) (*genai.GenerateContentResponse, error) {
223+
backoff := time.Second
224+
for try := 0; ; try++ {
225+
resp, err := ctx.generateContent(cfg, req)
226+
if err != nil && try < 100 &&
227+
strings.Contains(err.Error(), "Error 503, Message: The model is overloaded. Please try again later.") {
228+
time.Sleep(backoff)
229+
backoff = min(backoff+time.Second, 10*time.Second)
230+
continue
231+
}
232+
return resp, err
233+
}
234+
}
235+
219236
func (a *LLMAgent) verify(vctx *verifyContext) {
220237
vctx.requireNotEmpty(a.Name, "Name", a.Name)
221238
vctx.requireNotEmpty(a.Name, "Reply", a.Reply)

0 commit comments

Comments
 (0)