fix(intercept): default judge failure retries to three

This commit is contained in:
ji ruo committed 2026-10-20 11:25:04 +08:00
1 parent e66789633a
commit ed7eda5e0c
4 files changed
+35 -16

No files matched your search

+2 -1
View File
@@ -316,6 +316,7 @@ const (
// Judge default values.
const (
defaultJudgeTimeoutSecs = 15
defaultJudgeRetryCount = 3
defaultJudgeFailAction = "ask"
defaultJudgeAskTimeoutSecs = 300
defaultJudgeAskTimeoutAction = "deny"
@@ -346,7 +347,7 @@ func (i *Interceptor) judgeConfig() JudgeConfig {
Enabled: i.db.GetBool(settingJudgeEnabled, false),
ProfileID: int64(i.getSettingInt(settingJudgeProfileID, 0)),
TimeoutSeconds: i.getSettingInt(settingJudgeTimeoutSecs, defaultJudgeTimeoutSecs),
RetryCount: min(max(i.getSettingInt(settingJudgeRetryCount, 0), 0), MaxJudgeRetryCount),
RetryCount: min(max(i.getSettingInt(settingJudgeRetryCount, defaultJudgeRetryCount), 0), MaxJudgeRetryCount),
RetryIntervalMS: min(max(i.getSettingInt(settingJudgeRetryIntervalMS, defaultJudgeRetryIntervalMS), 0), MaxJudgeRetryIntervalMS),
FailAction: i.getSettingChoice(settingJudgeFailAction, defaultJudgeFailAction, "allow", "ask", "deny"),
AskTimeoutSeconds: i.getSettingInt(settingJudgeAskTimeoutSecs, defaultJudgeAskTimeoutSecs),
+31 -13
View File
@@ -59,10 +59,11 @@ func TestJudgeRetryConfigDefaultsAndBounds(t *testing.T) {
settings map[string]string
count, interval int
}{
{"legacy", nil, 0, 1000},
{"configured", map[string]string{settingJudgeRetryCount: "3", settingJudgeRetryIntervalMS: "25"}, 3, 25},
{"default", nil, 3, 1000},
{"configured", map[string]string{settingJudgeRetryCount: "2", settingJudgeRetryIntervalMS: "25"}, 2, 25},
{"disabled", map[string]string{settingJudgeRetryCount: "0"}, 0, 1000},
{"immediate", map[string]string{settingJudgeRetryCount: "1", settingJudgeRetryIntervalMS: "0"}, 1, 0},
{"malformed", map[string]string{settingJudgeRetryCount: "bad", settingJudgeRetryIntervalMS: "bad"}, 0, 1000},
{"malformed", map[string]string{settingJudgeRetryCount: "bad", settingJudgeRetryIntervalMS: "bad"}, 3, 1000},
{"negative", map[string]string{settingJudgeRetryCount: "-1", settingJudgeRetryIntervalMS: "-1"}, 0, 0},
{"excessive", map[string]string{settingJudgeRetryCount: "999", settingJudgeRetryIntervalMS: "999999999"}, 20, 3600000},
} {
@@ -149,16 +150,33 @@ func TestJudgeRetriesInvalidVerdict(t *testing.T) {
}
}
func TestJudgeLegacyConfigDoesNotRetry(t *testing.T) {
i := retryTestInterceptor(t, map[string]string{settingJudgeEnabled: "true", settingJudgeFailAction: "deny"})
calls := 0
i.SetReviewer(func(context.Context, int64, string, ReviewInput) (Decision, error) {
calls++
return Decision{}, errors.New("failed")
})
got, _ := i.Judge(t.Context(), "Bash", json.RawMessage(`{"command":"echo ok"}`))
if calls != 1 || got.Action != "deny" || !got.ModelFallback {
t.Fatalf("calls=%d out=%+v", calls, got)
func TestJudgeDefaultRetriesAndExplicitDisable(t *testing.T) {
for _, tc := range []struct {
name string
settings map[string]string
wantCalls int
}{
{"default", nil, 4},
{"disabled", map[string]string{settingJudgeRetryCount: "0"}, 1},
} {
t.Run(tc.name, func(t *testing.T) {
settings := map[string]string{
settingJudgeEnabled: "true", settingJudgeFailAction: "deny", settingJudgeRetryIntervalMS: "0",
}
for key, value := range tc.settings {
settings[key] = value
}
i := retryTestInterceptor(t, settings)
calls := 0
i.SetReviewer(func(context.Context, int64, string, ReviewInput) (Decision, error) {
calls++
return Decision{}, errors.New("failed")
})
got, _ := i.Judge(t.Context(), "Bash", json.RawMessage(`{"command":"echo ok"}`))
if calls != tc.wantCalls || got.Action != "deny" || !got.ModelFallback {
t.Fatalf("calls=%d out=%+v", calls, got)
}
})
}
}