返回 DeepSeek-Reasonix
retry_errors.go
根目录 / internal / provider / responses / retry_errors.go
1 package responses
2
3 import (
4 "errors"
5 "net/http"
6 "net/url"
7 "strings"
8
9 "reasonix/internal/provider"
10 )
11
12 // isCommandCodeTransientResponsesError recognizes Command Code's anonymous,
13 // intermittent 400. No stable retry signal exists, so keep this external
14 // protocol quirk narrowly scoped; named schema failures remain terminal.
15 func isCommandCodeTransientResponsesError(requestURL string, err error) bool {
16 u, parseErr := url.Parse(strings.TrimSpace(requestURL))
17 if parseErr != nil || strings.ToLower(u.Hostname()) != "api.commandcode.ai" ||
18 strings.TrimRight(u.Path, "/") != "/provider/v1/responses" {
19 return false
20 }
21 var apiErr *provider.APIError
22 if !errors.As(err, &apiErr) || apiErr.Status != http.StatusBadRequest {
23 return false
24 }
25 body := strings.ToLower(apiErr.Body)
26 return strings.Contains(body, "invalid_request_error") &&
27 strings.Contains(body, "invalid request error") &&
28 strings.Contains(body, "trace_id")
29 }
30
31 func isStalePreviousResponseError(err error) bool {
32 var apiErr *provider.APIError
33 if !errors.As(err, &apiErr) || apiErr.Status != http.StatusBadRequest {
34 return false
35 }
36 body := strings.ToLower(apiErr.Body)
37 mentionsID := strings.Contains(body, "previous_response_id") || strings.Contains(body, "previous response") || strings.Contains(body, "response id")
38 return mentionsID &&
39 (strings.Contains(body, "not found") || strings.Contains(body, "invalid") || strings.Contains(body, "expired"))
40 }
41
41 lines GO