|
7 | 7 | "fmt" |
8 | 8 | "maps" |
9 | 9 | "reflect" |
| 10 | + "strings" |
| 11 | + "time" |
10 | 12 |
|
11 | 13 | "github.com/google/syzkaller/pkg/aflow/trajectory" |
12 | 14 | "google.golang.org/genai" |
@@ -98,7 +100,7 @@ func (a *LLMAgent) chat(ctx *Context, cfg *genai.GenerateContentConfig, tools ma |
98 | 100 | if err := ctx.startSpan(reqSpan); err != nil { |
99 | 101 | return "", nil, err |
100 | 102 | } |
101 | | - resp, err := ctx.generateContent(cfg, req) |
| 103 | + resp, err := a.generateContent(ctx, cfg, req) |
102 | 104 | if err != nil { |
103 | 105 | return "", nil, ctx.finishSpan(reqSpan, err) |
104 | 106 | } |
@@ -216,6 +218,21 @@ func (a *LLMAgent) parseResponse(resp *genai.GenerateContentResponse) ( |
216 | 218 | return |
217 | 219 | } |
218 | 220 |
|
| 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 | + |
219 | 236 | func (a *LLMAgent) verify(vctx *verifyContext) { |
220 | 237 | vctx.requireNotEmpty(a.Name, "Name", a.Name) |
221 | 238 | vctx.requireNotEmpty(a.Name, "Reply", a.Reply) |
|
0 commit comments